Packages

A simple Elixir library for interacting with the Ollama API

Current section

Files

Jump to
ai_flow lib ollama.ex
Raw

lib/ollama.ex

defmodule AiFlow.Ollama do
@moduledoc """
Client for interacting with the Ollama API, providing functionality for text generation,
chat, model management, embeddings, and blob operations.
## Configuration
Configure via `config.exs` or at startup:
```elixir
config :ai_flow_ollama, AiFlow.Ollama,
hostname: "localhost",
port: 11434,
model: llama3.1
timeout: 120_000,
chat_file: "chats.json"
```
## Usage
```elixir
{:ok, _pid} = AiFlow.Ollama.start_link()
{:ok, text} = AiFlow.Ollama.query("What is Elixir?", "llama3.1")
{:ok, answer} = AiFlow.Ollama.chat("Hello!", "chat1", "user1")
{:ok, models} = AiFlow.Ollama.list_models()
```
## Common Options
- `:debug` (boolean): Enable debug logging (default: false)
- `:short` (boolean): Disable short variant response (default: true)
- `:field` (atom | string): show specificate field from response
- `:retries` (integer): Number of retries on network error (default: 0)
- `:cache_ttl` (integer): Cache time-to-live in ms (default: 30_000)
"""
use Agent
require Logger
alias AiFlow.Ollama.{Config, TextGeneration, Chat, Model, Embeddings, Blob}
@doc """
Starts the Ollama client with the given configuration.
"""
@spec start_link(keyword()) :: {:ok, pid()} | {:error, term()}
def start_link(opts \\ []) do
config = Config.load(opts)
Agent.start_link(fn -> config end, name: __MODULE__)
end
@doc """
Gets the current configuration.
"""
@spec get_config() :: Config.t()
def get_config, do: Agent.get(__MODULE__, & &1)
# Delegate functions to submodules
defdelegate query(prompt, opts \\ []), to: TextGeneration
defdelegate query!(prompt, opts \\ []), to: TextGeneration
defdelegate chat(prompt, chat_id, user_id \\ "default_user", opts \\ []), to: Chat, as: :chat
defdelegate chat!(prompt, chat_id, user_id \\ "default_user", opts \\ []), to: Chat, as: :chat!
defdelegate list_models(opts \\ []), to: Model, as: :list_models
defdelegate list_models!(opts \\ []), to: Model, as: :list_models!
defdelegate show_model(name, opts \\ []), to: Model
defdelegate show_model!(name, opts \\ []), to: Model
defdelegate create_model(name, model, system, opts \\ []), to: Model
defdelegate create_model!(name, model, system, opts \\ []), to: Model
defdelegate copy_model(source, destination, opts \\ []), to: Model
defdelegate copy_model!(source, destination, opts \\ []), to: Model
defdelegate delete_model(name, opts \\ []), to: Model
defdelegate delete_model!(name, opts \\ []), to: Model
defdelegate pull_model(name, opts \\ []), to: Model
defdelegate pull_model!(name, opts \\ []), to: Model
defdelegate push_model(name, opts \\ []), to: Model
defdelegate push_model!(name, opts \\ []), to: Model
defdelegate generate_embeddings(input, opts \\ []), to: Embeddings
defdelegate generate_embeddings!(input, opts \\ []), to: Embeddings
defdelegate generate_embeddings_legacy(prompt, opts \\ []), to: Embeddings
defdelegate generate_embeddings_legacy!(prompt, opts \\ []), to: Embeddings
defdelegate list_running_models(opts \\ []), to: Model
defdelegate list_running_models!(opts \\ []), to: Model
defdelegate load_model(model, opts \\ []), to: Model
defdelegate load_model!(model, opts \\ []), to: Model
defdelegate show_chat_history(opts \\ []), to: Chat
defdelegate show_chat_history!(opts \\ []), to: Chat
defdelegate show_all_chats, to: Chat
defdelegate show_all_chats!, to: Chat
defdelegate clear_chat_history(opts \\ []), to: Chat
defdelegate clear_chat_history!(opts \\ []), to: Chat
defdelegate debug_load_chat_data, to: Chat
defdelegate debug_show_chat_history(chat_id, user_id \\ "default_user"), to: Chat
defdelegate check_chat_file, to: Chat
defdelegate check_blob(digest, opts \\ []), to: Blob
defdelegate check_blob!(digest, opts \\ []), to: Blob
defdelegate create_blob(digest, file_path, opts \\ []), to: Blob
defdelegate create_blob!(digest, file_path, opts \\ []), to: Blob
end