Eai.Models (eai v1.0.2)

Copy Markdown

模型注册表查询接口。

模型定义拆分至 config/models/*.exs,每个文件以 :model_<name> 为 key 注册一项。 新增本地/自托管模型只需新建一个 .exs 文件,无需修改任何中心文件。

默认模型通过 config :eai, :default_model, :atom 指定(见 config/config.exs)。

快速查表

iex> Eai.Models.all()           # 全部模型条目
iex> Eai.Models.default()       # 默认模型(:default_model 配置项)
iex> Eai.Models.get(:gpt4o)     # 按 :name atom 查找
iex> Eai.Models.names()         # 所有 name atom 列表
iex> Eai.Models.vision_models() # 标注了 vision: true 的条目
iex> Eai.Models.reload()        # 重新扫描 config/models/ 目录

本地模型示例

# config/models/my_qwen.exs
import Config
config :eai, :model_qwen,
  name: :qwen,
  model: "qwen2.5:14b",
  url: "http://localhost:11434/v1/chat/completions",
  provider: :openai_compat,
  api_key_env: nil,
  receive_timeout: 180_000

Summary

Functions

Get all registered models from config.

Extract API key from model entry (reads from environment variable).

Get default model (configured in config/config.exs :default_model).

Get first vision-capable model, or nil if none available.

Look up model by :name atom.

Look up model by :name atom. Raises if not found.

Get list of all registered model names (atoms).

Force reload model registry from config/models.exs.

Extract model fields into opts map for LLM.Direct.run/3.

Get all models that support vision (images).

Types

model_entry()

@type model_entry() :: keyword()

Functions

all()

@spec all() :: [model_entry()]

Get all registered models from config.

Loads from :persistent_term cache (set by reload/0).

Returns

List of model entries: `[name: :deepseek, model: "deepseek-v4", url: "...", provider: :openai_compat, ...]`

api_key(entry)

@spec api_key(model_entry()) :: String.t() | nil

Extract API key from model entry (reads from environment variable).

Returns nil if model needs no authentication (e.g., local Ollama). Raises if required env var is not set.

Options

  • entry — Model entry map.

Example

iex> Eai.Models.api_key(Eai.Models.get!(:deepseek))
"sk-xxxxxxxx"

default()

@spec default() :: model_entry()

Get default model (configured in config/config.exs :default_model).

Default is :deepseek.

default_vision()

@spec default_vision() :: model_entry() | nil

Get first vision-capable model, or nil if none available.

Useful for routing image analysis requests.

get(name)

@spec get(atom() | nil) :: model_entry() | nil

Look up model by :name atom.

Returns nil if not found. nil input returns default model.

Options

  • name (atom) — Model name: :deepseek, :claude_opus, etc.

Example

iex> Eai.Models.get(:claude_opus)
%{name: :claude_opus, model: "claude-opus-4-6", ...}

get!(name)

@spec get!(atom()) :: model_entry()

Look up model by :name atom. Raises if not found.

Options

  • name (atom) — Model name.

Raises

ArgumentError if model not found.

names()

@spec names() :: [atom()]

Get list of all registered model names (atoms).

Example

iex> Eai.Models.names()
[:deepseek, :claude_opus, :claude_sonnet, :gpt4o, ...]

reload()

@spec reload() :: [model_entry()]

Force reload model registry from config/models.exs.

Returns all reloaded model entries.

to_run_opts(entry)

@spec to_run_opts(model_entry()) :: map()

Extract model fields into opts map for LLM.Direct.run/3.

Internal use; called during Chat.talk processing.

Returns

Map with keys: `:model`, `:url`, `:provider`, `:api_key`, `:receive_timeout`, `:reasoning_effort`,
the 10 Step 7 sampler/超参数 fields (`:temperature`, `:top_p`, `:top_k`, `:min_p`,
`:max_tokens`, `:repetition_penalty`, `:frequency_penalty`, `:presence_penalty`,
`:stop_sequences`, `:seed`), and the Step 9 opt-in field `:anthropic_beta` (a
list of Anthropic beta header strings). Each sampler / opt-in field is included
only when the model config defines a non-nil value; nil at the model config
means "omit" at the adapter (provider default).

vision_models()

@spec vision_models() :: [model_entry()]

Get all models that support vision (images).

Returns

List of model entries where `:vision` is `true`.