lib/instructor/adapters/ollama.ex

defmodule Instructor.Adapters.Ollama do
  @moduledoc """
  Ollama adapter for Instructor.

  ## Configuration

  ```elixir
  config :instructor, adapter: Instructor.Adapters.Ollama, ollama: [
    api_url: "http://localhost:11434" # (Optional) defaults to localhost:11434
  ]
  ```

  or at runtime:

  ```elixir
  Instructor.chat_completion(..., [
    adapter: Instructor.Adapters.Ollama,
    api_url: "http://localhost:11434" # (Optional) defaults to localhost:11434
  ])
  ```

  To get an Ollama API key, see [Ollama](https://ollama.com/api).
  """

  @behaviour Instructor.Adapter
  alias Instructor.Adapters

  @supported_modes [:json, :tools]

  @impl true
  def chat_completion(params, config \\ nil) do
    default_config = [api_url: "http://localhost:11434", api_key: "ollama"]
    config = Keyword.merge(default_config, config || [])
    mode = params[:mode]

    if mode not in @supported_modes do
      raise "Unsupported mode: #{mode}"
    end

    Adapters.OpenAI.chat_completion(params, config)
  end

  @impl true
  defdelegate reask_messages(raw_response, params, config), to: Adapters.OpenAI
end