{-# LANGUAGE DuplicateRecordFields #-}

{- |
Module      : Data.Ollama
Copyright   : (c) 2025 Tushar Adhatrao
License     : MIT
Maintainer  : Tushar Adhatrao <tusharadhatrao@gmail.com>
Stability   : experimental
Portability : portable

== Ollama Haskell

This module provides a high-level Haskell interface to the [Ollama](https://ollama.com) API 
    for interacting with local LLMs. It includes support for:

- Text generation (sync/streaming)
- Conversational chat (with tools and images)
- Embeddings
- Model management (pull, push, delete, list, show)
- Structured outputs
- Custom configuration and model options

Inspired by @ollama-python@, this library is built to offer idiomatic Haskell bindings 
over Ollama’s HTTP API.

== 🔧 Usage

Import this module as a top-level interface:

@
import Ollama
@

All functions return @Either OllamaError a@ or can be used in a Monad stack using 
their @\*M@ variants.

== 🔑 Main APIs

=== ✍️ Generate Text

- 'generate', 'generateM' – Generate text from a model
- 'defaultGenerateOps' – Default generation parameters
- 'GenerateOps', 'GenerateResponse' – Request and response types

=== 💬 Chat with LLMs

- 'chat', 'chatM' – Send chat messages to a model
- 'ChatOps', 'ChatResponse', 'Role', 'Message' – Chat input/output types
- Supports tools via 'InputTool', 'FunctionDef', 'OutputFunction', etc.

=== 🧠 Embeddings

- 'embedding', 'embeddingM' – Generate vector embeddings
- 'EmbeddingOps', 'EmbeddingResp' – Request/response types

=== 📦 Model Management

- 'copyModel', 'createModel', 'deleteModel'
- 'list' – List all installed models
- 'ps', 'psM' – Show running models
- 'showModel', 'showModelM' – Show model info
- 'pull', 'push' – Pull/push models (with progress support)

=== ⚙️ Configuration

- 'defaultOllamaConfig' – Modify host, retries, streaming, etc.
- 'withOnModelStart', 'withOnModelFinish', 'withOnModelError' – Hook support

=== 🧰 Utilities

- 'defaultModelOptions', 'encodeImage', 'withOllamaRequest'
- 'loadGenModel', 'unloadGenModel' – Load/unload generation models
- 'getVersion' – Ollama server version

== 🧾 Types

All request/response payloads and enums are exposed, including:

- 'ModelOptions', 'OllamaConfig', 'OllamaError', 'Format'
- 'Models', 'ModelInfo', 'ModelDetails', 'ShowModelResponse'
- 'RunningModels', 'RunningModel', 'Version'
-}
module Ollama
  ( -- * Main APIs

    -- ** Generate Texts
    generate
  , generateM
  , defaultGenerateOps
  , GenerateOps (..)
  , GenerateResponse (..)

    -- ** Chat with LLMs
  , chat
  , chatM
  , Role (..)
  , defaultChatOps
  , ChatResponse (..)
  , ChatOps (..)
  , InputTool (..)
  , FunctionDef (..)
  , FunctionParameters (..)
  , ToolCall (..)
  , OutputFunction (..)

    -- ** Embeddings
  , embedding
  , embeddingOps
  , embeddingM
  , embeddingOpsM
  , EmbeddingOps (..)
  , EmbeddingResp (..)

    -- ** Copy Models
  , copyModel
  , copyModelM

    -- ** Create Models
  , createModel
  , createModelM

    -- ** Delete Models
  , deleteModel
  , deleteModelM

    -- ** List Models
  , list

    -- ** List currently running models
  , ps
  , psM

    -- ** Push and Pull
  , push
  , pushM
  , pull
  , pullM
  , pullOps
  , pullOpsM

    -- ** Show Model Info
  , showModel
  , showModelOps
  , showModelM
  , showModelOpsM

    -- * Ollama config
  , defaultOllamaConfig
  , withOnModelStart
  , withOnModelFinish
  , withOnModelError

    -- * Utils
  , defaultModelOptions
  , ModelOptions (..)
  , encodeImage
  , withOllamaRequest
  , getVersion
  , loadGenModel
  , unloadGenModel
  , loadGenModelM
  , unloadGenModelM

    -- * Types
  , ShowModelResponse (..)
  , Models (..)
  , ModelInfo (..)
  , ModelDetails (..)
  , ShowModelInfo (..)
  , RunningModels (..)
  , RunningModel (..)
  , Message (..)
  , Format (..)
  , OllamaError (..)
  , OllamaConfig (..)
  , Version (..)
  )
where

import Data.Ollama.Chat
import Data.Ollama.Common.Config
import Data.Ollama.Common.Types
import Data.Ollama.Common.Utils
import Data.Ollama.Copy
import Data.Ollama.Create
import Data.Ollama.Delete
import Data.Ollama.Embeddings
import Data.Ollama.Generate
import Data.Ollama.List
import Data.Ollama.Load
import Data.Ollama.Ps
import Data.Ollama.Pull
import Data.Ollama.Push
import Data.Ollama.Show