LLM 提供方与模型
在 llm 命名空间配置提供方和命名模型组。本页覆盖 llm.providers、llm.model_chain、
llm.triage_model_chain、llm.retry、llm.budget,以及模型元数据目录
(llm.model_catalog)。
一个完整的最小示例:
llm: providers: - id: my-llm kind: openai_compatible base_url: https://api.openai.com/v1 api_key_env: AICR_LLM_API_KEY
model_chain: default: - provider: my-llm model: gpt-4o-mini role: any default_model_chain: default
retry: max_attempts: 3 backoff: kind: exponential base_ms: 1000 max_ms: 30000 jitter: true
budget: per_run_usd: 0.10 per_repo_daily_usd: 1.0llm.providers[] —— 连接定义
Section titled “llm.providers[] —— 连接定义”每个 provider 条目描述一个 LLM 端点。id 是其他 section(模型链、模型目录)
引用它时使用的名字,仅在你的配置内有效。
| 字段 | 类型 | 必填 | 说明 |
|---|---|---|---|
id |
string | ✓ | 唯一的 provider id,供 model_chain 与目录引用。 |
kind |
enum | ✓ | 提供方协议。取值:openai_compatible、azure_openai、anthropic、vertex_ai、bedrock、google_ai_studio、ollama、copilot。 |
base_url |
string (URL) | – | API 基础 URL,部分托管类型可省略。 |
api_key_env |
string | – | 存放 API key 的环境变量名。提交库的文件绝不内联 key。 |
api_key |
string | – | 明文 API key;与 api_key_env 互斥(明文优先)。发布到数据库配置源后加密落库。 |
api_version |
string | – | API 版本(azure_openai 等使用)。 |
catalog_provider |
string | – | 将自定义 provider 映射到 models.dev 的 provider id(例如 openai)。 |
catalog_id |
string | – | 显式 models.dev 查找 id(例如 openai/gpt-4o-mini),用于自定义别名。 |
平台预设(管理页面)
Section titled “平台预设(管理页面)”在 Config → Providers 新建 provider 时,选择 Platform preset 并点击
Apply preset,预填 id、kind、base_url、api_key_env 和
catalog_provider。草稿在 Save 前仍可修改;预设不会改动已有记录,也不携带凭据。
建议环境变量名见 example/.env.sample。Anthropic 变体的预设 ID 在基础 ID 后加 -anthropic。
| 平台 | 预设 id 前缀 | OpenAI 兼容 base_url |
Anthropic 兼容 base_url |
|---|---|---|---|
| Kimi For Coding(Kimi Code 订阅) | kimi-for-coding |
https://api.kimi.com/coding/v1 |
https://api.kimi.com/coding |
| Kimi 开放平台(国内) | moonshotai-cn |
https://api.moonshot.cn/v1 |
https://api.moonshot.cn/anthropic |
| Kimi 开放平台(国际) | moonshotai |
https://api.moonshot.ai/v1 |
https://api.moonshot.ai/anthropic |
| 智谱开放平台 | zhipuai |
https://open.bigmodel.cn/api/paas/v4 |
– |
| 智谱 GLM Coding Plan | zhipuai-coding-plan |
https://open.bigmodel.cn/api/coding/paas/v4 |
https://open.bigmodel.cn/api/anthropic |
| Z.AI 平台 | zai |
https://api.z.ai/api/paas/v4 |
– |
| Z.AI Coding Plan | zai-coding-plan |
https://api.z.ai/api/coding/paas/v4 |
https://api.z.ai/api/anthropic |
| 阿里云百炼(按量,北京) | alibaba-cn |
https://dashscope.aliyuncs.com/compatible-mode/v1 |
https://dashscope.aliyuncs.com/apps/anthropic |
| 阿里云百炼(按量,新加坡) | alibaba |
https://dashscope-intl.aliyuncs.com/compatible-mode/v1 |
https://dashscope-intl.aliyuncs.com/apps/anthropic |
| 阿里云 Token Plan(北京) | alibaba-token-plan-cn |
https://token-plan.cn-beijing.maas.aliyuncs.com/compatible-mode/v1 |
https://token-plan.cn-beijing.maas.aliyuncs.com/apps/anthropic |
| 阿里云 Token Plan(新加坡) | alibaba-token-plan |
https://token-plan.ap-southeast-1.maas.aliyuncs.com/compatible-mode/v1 |
https://token-plan.ap-southeast-1.maas.aliyuncs.com/apps/anthropic |
| 腾讯云 Coding Plan | tencent-coding-plan |
https://api.lkeap.cloud.tencent.com/coding/v3 |
https://api.lkeap.cloud.tencent.com/coding/anthropic |
| 腾讯云 Token Plan | tencent-token-plan |
https://api.lkeap.cloud.tencent.com/plan/v3 |
https://api.lkeap.cloud.tencent.com/plan/anthropic |
| 腾讯 TokenHub(按量) | tencent-tokenhub |
https://tokenhub.tencentmaas.com/v1 |
https://tokenhub.tencentmaas.com |
| DeepSeek | deepseek |
https://api.deepseek.com |
https://api.deepseek.com/anthropic |
注意事项:
- Apply 只改新建草稿,Save 才会发布。已填写明文 API Key 时,Apply 保留 该值并移除环境变量引用,避免凭据互斥冲突。保存 provider 后还需在模型组中 添加 provider 和模型;建议模型 ID 不会自动创建模型组。
- Anthropic 兼容根地址不带末尾的
/v1。直连客户端、Claude Code、pi 和 oh-my-pi 使用根地址;OpenCode/Kilo 的生成配置为 AI SDK 补上/v1。 两条路径最终请求/v1/messages,使用x-api-key。Claude Code 应选择kind: anthropic。Zoo 适配器明确拒绝该协议;Copilot CLI 不消费这些自定义预设。 kind决定协议,即使目录指定另一种 SDK(例如 Kimi Code)也不改变协议。 OpenCode/Kilo 会注入匹配的 SDK 和原生模型限额。pi/oh-my-pi 需要目录限额或显式覆盖。- Key 与端点必须属于同一套餐和地域。阿里云共享 DashScope 地址仍可用,生产环境 可换成控制台提供的业务空间专属地址,见官方端点说明。
- 阿里云推荐新订阅使用 Token Plan,预设不再推荐旧 Coding Plan。腾讯 Coding Plan
仅建议
tc-code-latest,GLM-5 将于 2026-10-09 下线。依据见 阿里云说明和 腾讯云说明。 - 智谱/Z.AI 余额账户使用通用 OpenAI 端点。Anthropic 余额调用要求账户从未购买 套餐且获得白名单;已订阅账户的套餐耗尽或过期后不会回退到余额。选择器只为 Coding Plan 提供 Anthropic 预设,见官方账户说明。
- 协议预设不代表个人套餐允许自动化后端审查。需核对套餐适用场景与账户权限; 服务端任务应选择允许该用途的按量 API。
catalog_provider独立于协议解析元数据;端点和可用性以平台官方文档为准。 模型存在于 models.dev 打包快照中不代表当前账户仍可调用。- 部署若用
config_sources.secret_refs限制凭据引用,需先授权环境变量名与 目标端点组合。本地测试验证配置和请求构造;平台鉴权、计费仍需真实账户验收。
推理强度(reasoning effort)
Section titled “推理强度(reasoning effort)”provider 条目还接受一组透传字段,用来控制推理模型的思考强度:
| 字段 | 取值 | 说明 |
|---|---|---|
reasoning_effort |
minimal、low、medium、high、max |
直连 LLM 调用时作为 reasoning_effort 发送;Kilo / opencode 适配器会物化为 --variant,Claude Code / Copilot CLI 映射为 --effort(minimal 档映射为 low)。 |
thinking_level |
off、minimal、low、medium、high、max |
较高的抽象档位;未设 reasoning_effort 时按映射换算成 effort。 |
thinking_budget_tokens |
int | 显式思考预算(token)。 |
thinking.enabled / thinking.budget_tokens |
bool / int | Anthropic 风格的原生 thinking 配置。 |
llm: providers: - id: my-llm kind: openai_compatible base_url: https://api.openai.com/v1 api_key_env: AICR_LLM_API_KEY reasoning_effort: high模型目录也可以按模型声明档位:model_catalog.overrides."<provider>/<model>" 下的
supported_reasoning_efforts(该模型支持的档位列表)和
default_reasoning_effort(未显式设置时的默认档)。解析优先级:provider 上的
reasoning_effort → 目录的 default_reasoning_effort → thinking_level 换算值。
llm.model_chain —— 命名模型组
Section titled “llm.model_chain —— 命名模型组”llm.model_chain 是“分组名 → 有序模型列表”的映射。每组至少有一个条目,
首条目是主模型,后续条目按列表顺序尝试;分组声明顺序不影响优先级。
llm.default_model_chain 选择全局默认组,默认值为 default。
配置了分组时,全局默认组必须存在。workspace 的 model_chain 选择整组模型。
历史写法 llm.fallback_chain / llm.triage_fallback_chain 与数组形式的
llm.model_chain 仍可加载:加载器在内存中将其转换为命名分组(default /
triage),不会改写原文件;与显式命名分组冲突的旧键会被拒绝。旧值形状非法时,
即使其他键可转换也仍然报错。新配置请使用上面的命名分组形式。
模型链条目接受 overrides 请求参数块,运行时会把它合并进解析后的模型规格:
映射类(extra_params、extra_body、extra_headers)按键合并到 provider 字段之上,
标量和数组整体替换;禁用某个参数走 drop_params——JSON null 绝不表示删除。
键仅限于请求参数(reasoning_effort、thinking_level、thinking_budget_tokens、
thinking、response_format、tool_choice、parallel_tool_calls、seed、
logit_bias、drop_params、allowed_openai_params 及上述三个映射),不能包含
provider 身份、endpoint 或凭据字段。
| 字段 | 类型 | 必填 | 说明 |
|---|---|---|---|
provider |
string | ✓ | 必须匹配某个 providers[].id。 |
model |
string | ✓ | 传给 provider 的 model id。 |
role |
enum | ✓ | light、heavy 或 any,必须显式填写。 |
主模型始终取组内第一项。压缩摘要使用当前主链组内第一个匹配
compression.summarize_model_role(默认 light)的条目,找不到时使用第一项。
同一 provider 的多个模型也按条目区分。直连调用由 gateway 执行故障切换;
Agent 评审遇到明确的余额或套餐额度耗尽时,用下一项模型重新物化 runtime。
两条路径都只在选定组内切换。
下面省略已配置的 llm.providers 和 workspace 的源绑定:
llm: model_chain: default: - { provider: my-llm, model: gpt-4o, role: heavy } - { provider: my-llm, model: gpt-4o-mini, role: light } fast: - { provider: my-llm, model: gpt-4o-mini, role: any } lifecycle: - { provider: my-llm, model: gpt-4o-mini, role: light } - { provider: my-llm, model: gpt-4o, role: any } default_model_chain: default triage_model_chain: lifecycle
workspaces: defaults: model_chain: default instances: service-a: model_chain: default triage_model_chain: lifecycle service-b: model_chain: fast triage_model_chain: fast主链选择优先级为 命中路由的 analysis.model_chain →
workspaces.instances.<id>.model_chain →
workspaces.defaults.model_chain → llm.default_model_chain。
自动生成、未显式列出的 workspace 同样继承 workspace defaults。
分层合并配置时,同名组的模型列表整体替换,其他组保留。
llm.triage_model_chain —— 生命周期分析分组
Section titled “llm.triage_model_chain —— 生命周期分析分组”triage_model_chain 填分组名,引用同一份 llm.model_chain 定义。
选择优先级为 命中路由的 analysis.triage_model_chain →
workspaces.instances.<id>.triage_model_chain →
workspaces.defaults.triage_model_chain → llm.triage_model_chain →
当前 workspace 的主链。所有层都未配置时,直接复用主链的模型和 client。
要覆盖全局 triage 选择并共用某 workspace 的主链,请显式填相同分组名。
所选组决定 issue triage 和已解决问题复核的模型列表与故障切换顺序;
llm.retry、llm.budget、llm.per_provider_overrides 和模型目录仍全局共享。
这包括 Gitea/Forgejo issue/PR triage、Gitea/GitHub PR 增量 summary 的 Resolved
标记,以及 gitea_problem_issue / github_problem_issue / gitlab_problem_issue 的关闭或标记已解决。
指纹消失、审查文件范围和提交祖先关系只生成候选;模型明确确认后才执行动作。
源码缺失、输出不完整或 LLM 失败时保持 open。
从旧数组配置迁移
Section titled “从旧数组配置迁移”把旧 llm.model_chain 数组移到 llm.model_chain.default。
把旧 llm.triage_model_chain 数组移到另一个组(例如 llm.model_chain.lifecycle),
再设置 llm.triage_model_chain: lifecycle。原 triage 是空列表时,删除该字段以继承主链。
旧数组、空组、空引用和不存在的分组引用都会使配置校验失败。
provider-only 配置仍保留原有首 provider / gpt-4o-mini 兜底;生产配置应显式声明分组。
llm.retry —— 瞬时失败处理
Section titled “llm.retry —— 瞬时失败处理”作用于因瞬时错误失败的 LLM 调用:HTTP 429/5xx、上下文溢出(沿模型链切换)、
调用方中止/超时,以及连接级失败(fetch failed、连接超时、DNS、socket 错误)。
明确的余额不足、计费周期额度、套餐额度或 spend limit 会跳过当前模型的重试,立即尝试
下一条 model_chain;有些 provider 会用 400 或 402 上报这类错误。普通 429、
RESOURCE_EXHAUSTED、throttling 或容量不足仍属于瞬时错误,不能触发立即额度切换。
其他非瞬时 provider 错误立即失败。可通过
llm.per_provider_overrides(provider id → { max_attempts, give_up_after_seconds } 的映射)按 provider 覆盖。
| 字段 | 类型 | 默认 | 说明 |
|---|---|---|---|
max_attempts |
int > 0 | – | 总尝试次数(含首次调用)。 |
respect_retry_after |
bool | – | 出现 Retry-After 头时遵循它。 |
give_up_after_seconds |
number > 0 | – | 硬性的挂钟时间上限。 |
backoff.kind |
enum | – | exponential、linear 或 constant。 |
backoff.base_ms |
number > 0 | – | 首次/基础退避延迟(毫秒)。 |
backoff.max_ms |
number > 0 | – | 单次退避延迟上限。 |
backoff.jitter |
bool | – | 是否加入随机抖动以避免惊群。 |
llm: retry: max_attempts: 3 backoff: kind: exponential base_ms: 1000 max_ms: 30000 jitter: truellm.budget —— 费用上限
Section titled “llm.budget —— 费用上限”软上限,超出时中止或告警。费用核算在模型目录启用时使用目录价格,否则退回到旧的 固定估算。
| 字段 | 类型 | 说明 |
|---|---|---|
per_run_usd |
number ≥ 0 | 单次评审运行的上限。 |
per_repo_daily_usd |
number ≥ 0 | 每个仓库滚动每日上限。 |
llm: budget: per_run_usd: 0.10 per_repo_daily_usd: 1.0llm.model_catalog —— models.dev 元数据(可选开启)
Section titled “llm.model_catalog —— models.dev 元数据(可选开启)”默认关闭。开启后,AICodeReviewer 从
models.dev 读取模型参数,这样你就不必逐 provider 手工维护
context window、输出上限、能力标志和价格。这些值会喂给 diff 压缩阈值、
llm.budget 费用核算,以及传给外部 agent CLI(Kilo、Zoo、opencode、Claude Code)
的模型配置。
llm: model_catalog: enabled: true # 可选开启;默认关闭 source_url: https://models.dev/api.json refresh_interval_hours: 24 # 源级刷新节奏(默认每日) fetch_timeout_ms: 10000 offline: false # true = 仅用内置快照,绝不联网 apply_to_model_spec: true # 用目录数据填补 ModelSpec 空缺 cache: backend: sqlite # sqlite(默认)| memory(测试/开发)| redis overrides: # 手工按模型覆盖,优先级高于目录 "my-llm/gpt-4o-mini": catalog_id: openai/gpt-4o-mini context_window: 128000 max_output_tokens: 16384 supports_tool_call: true supports_vision: true supports_cache_prompt: true cost_input_per_mtok: 0.15 cost_output_per_mtok: 0.6 display_name: "GPT-4o mini (via gateway)"目录顶层字段
Section titled “目录顶层字段”| 字段 | 类型 | 默认 | 说明 |
|---|---|---|---|
enabled |
bool | false |
总开关。 |
source_url |
string (URL) | https://models.dev/api.json |
目录源。 |
refresh_interval_hours |
int > 0 | 24 |
源级刷新节奏。仅当源级元数据缺失或早于该时长时才拉取远程 api.json;区间内未知 model id 不会反复触发拉取。 |
fetch_timeout_ms |
int > 0 | 10000 |
联网拉取超时。 |
offline |
bool | false |
绝不联网,只服务内置快照。 |
apply_to_model_spec |
bool | true |
用目录数据填补解析得到的 ModelSpec 中的空缺。 |
cache.backend |
enum | sqlite |
sqlite、memory 或 redis。 |
overrides |
map | {} |
按模型的手工覆盖。键为 "<providerId>/<modelId>"。 |
| 后端 | 存储 | 说明 |
|---|---|---|
sqlite(默认) |
复用 storage.database(带键的 model_catalog 表)。 |
仅做点查询;完整 api.json 仅在刷新时解析一次并逐行 upsert,读取时不再解析。 |
memory |
进程内。 | 面向测试与本地开发,重启即丢失。 |
redis |
复用 storage.cache.redis。 |
要求 storage.cache.kind: redis 且 storage.cache.redis.url_env 可解析。跨环境共享 Redis 时请使用唯一的 key_prefix。见 存储。 |
查找某个模型时,AICodeReviewer 按以下顺序解析:
- 带键的刷新缓存(默认 SQLite)。仅当源级刷新元数据缺失或早于
refresh_interval_hours时才拉取远程源;区间内未知 model id 不会反复拉取。 - 过期的缓存行 —— 远程拉取失败时的兜底。
- 只读内置快照 —— 最后兜底,在打包时从
github.com/anomalyco/models.dev构建,按需种入后端。
overrides —— 你的配置永远优先
Section titled “overrides —— 你的配置永远优先”model_catalog.overrides 下按模型(键为 "<providerId>/<modelId>")的覆盖
始终优先于目录数据,而 llm.providers[] 的字段优先级高于这两者。缺失字段
绝不凭空捏造:你与目录都没给的值会保持未设置。
最常用的覆盖字段:
| 字段 | 类型 | 说明 |
|---|---|---|
catalog_id |
string | 为自定义别名指定可选的 models.dev 查找 id。 |
context_window |
int > 0 | 模型上下文窗口(token 数)。 |
max_input_tokens |
int > 0 | 最大输入 token。 |
max_output_tokens |
int > 0 | 最大输出 token。 |
cost_input_per_mtok |
number ≥ 0 | 每 1M 输入 token 美元价。 |
cost_output_per_mtok |
number ≥ 0 | 每 1M 输出 token 美元价。 |
cost_cache_read_per_mtok |
number ≥ 0 | 每 1M 缓存读 token 美元价。 |
cost_cache_write_per_mtok |
number ≥ 0 | 每 1M 缓存写 token 美元价。 |
supports_tool_call |
bool | 工具/函数调用。 |
supports_vision |
bool | 图像输入。 |
supports_cache_prompt |
bool | 提示词缓存。 |
supports_reasoning |
bool | 推理模型。 |
supported_reasoning_efforts |
string[] | 该模型支持的推理强度档位(minimal…max)。 |
default_reasoning_effort |
enum | 未显式设置 reasoning_effort 时使用的默认档位。 |
supports_structured_output |
bool | 结构化/JSON 输出。 |
display_name |
string | 友好显示名。 |
family |
string | 模型家族。 |
schema 还接受更多可选字段(模态、推理强度档位、延迟等级、限流等级、知识截止时间
等)。完整列表见 packages/core/src/config.ts 中的 modelCatalogOverrideSchema。
目录如何反哺其他子系统
Section titled “目录如何反哺其他子系统”解析得到的元数据会被三个子系统消费:
- diff 压缩 —— 当省略
compressionsection 时,compression.trigger_tokens与max_input_ratio会根据模型的context_window推导默认值。窗口越大, 压缩阈值自动提高。 llm.budget核算 —— 目录价格取代旧的固定估算,费用上限反映真实的每 token 价格。- agent 配置注入 —— context window、最大输出 token、视觉标志和价格会被注入到
agent CLI 的配置中,让每个运行时知道模型的限制。这也正是agent 上下文自动压缩
依赖已知 context window 的原因——
context_compaction设置及 Kilo 要求窗口已知 (开启目录或在overrides里设置context_window),见 Agent 与沙箱。
目录与预算更新
Section titled “目录与预算更新”启用数据库配置后,目录设置、模型链和 triage 链对下一次接收的任务生效。 每个配置快照固定所配置模型的解析元数据,重启后仍保持;共享缓存刷新不会改变 旧任务的 fallback 或 summary 模型。
发布预算变更会保留本进程累计的日费用。下一次模型调用按已报告费用检查新上限; 一次响应可能使费用超过上限,后续调用才会被阻止,因此它不是远端计费硬封顶。 日费用在内存中累计,进程重启后重置。