自定义提供程序
三种添加 ZeroClaw 未内置的提供者的方法:
- 使用
custom插槽。 适用于现有规范插槽未涵盖的任何兼容 OpenAI 的端点。 - 使用一流的本地服务器插槽(
lmstudio、llamacpp、sglang、vllm、osaurus、litellm)。带有合理默认值的轻量封装。 - 实现
ModelProvidertrait(Rust)。适用于任何与 OpenAI 不兼容的场景。
OpenAI 兼容端点:使用 custom 槽位
如果该服务支持 OpenAI chat-completions,则这只需更改配置即可。custom 槽位需要 uri(该系列的端点枚举没有默认值);请从某个 agent 的 model_provider 中引用它。
这与 groq、mistral、xai 以及在目录中拥有各自规范槽位的其他所有供应商所使用的 OpenAiCompatibleModelProvider 运行时实现相同。区别在于你使用哪个系列槽位:custom 是用于那些没有专属供应商槽位的端点的通用兜底选项。
对于无法接受包含图像的工具结果的网关,请省略这些载荷,同时保留周围的工具文本:
[providers.models.custom.gateway]
uri = "https://gateway.example.com/v1"
model = "my-model"
tool_result_image_policy = "omit"
一等公民的本地推理服务器
ZeroClaw 为流行的本地推理栈提供了规范化的插槽配置。它们底层都兼容 OpenAI,但已预先应用了默认的 uri 值,因此你通常可以完全省略 uri。
llama.cpp:插槽 llamacpp
sh
llama-server -hf ggml-org/gpt-oss-20b-GGUF --jinja -c 133000 --host 127.0.0.1 --port 8033
可选字段适用于任何 compat-slot 系列(包括 llamacpp)。完整集合源自 schema:
api_key 🔑
此 model_provider 的密钥 API 令牌。请从 model_provider 的控制台获取(OpenAI platform、Anthropic console、OpenRouter keys 页面等)。尽可能通过操作系统密钥环存储;切勿直接将其提交到 config.toml 中。
将它放置在任何表面上:
网关仪表板
打开 /config/providers.models/custom 并设置 providers.models.custom.<alias>.api_key 字段。
zerocode
在 Config 窗格中,设置 providers.models.custom.<alias>.api_key 字段。
zeroclaw config
zeroclaw config set providers.models.custom.<alias>.api_key # 掩码输入,加密存储
环境变量
导出此覆盖配置(POSIX shell;可放入 ~/.bashrc、~/.zshrc、.env 或 Dockerfile 中)。将 <alias> 替换为实际的别名:
export ZEROCLAW_providers__models__custom__<alias>__api_key=
chat_template_kwargs
任意键值对将原样转发,作为 OpenAI 兼容提供商请求正文顶层的 chat_template_kwargs 对象。由 vLLM、SGLang 和 llama.cpp 等支持聊天模板的后端使用,用于传递模型系列模板变量,以控制其他字段未公开的行为。必须是 JSON 对象(TOML 内联表);非对象值将被忽略,并发出警告。示例(抑制 Qwen3 思考):chat_template_kwargs = { enable_thinking = false }
将它放置在任何表面上:
网关仪表板
打开 /config/providers.models/custom 并设置 providers.models.custom.<alias>.chat_template_kwargs 字段。
zerocode
在 Config 窗格中,设置 providers.models.custom.<alias>.chat_template_kwargs 字段。
zeroclaw config
zeroclaw config set providers.models.custom.<alias>.chat_template_kwargs <value>
环境变量
导出此覆盖配置(POSIX shell;可放入 ~/.bashrc、~/.zshrc、.env 或 Dockerfile 中)。将 <alias> 替换为实际的别名:
export ZEROCLAW_providers__models__custom__<alias>__chat_template_kwargs=
context_window
此模型的上下文窗口大小(最大输入 tokens)。在设置时会从提供商的 /models 端点自动填充(如果可用)。对于自定义端点或自动检测失败时,可手动覆盖。
将它放置在任何表面上:
网关仪表板
打开 /config/providers.models/custom 并设置 providers.models.custom.<alias>.context_window 字段。
zerocode
在 Config 面板中,设置 providers.models.custom.<alias>.context_window 字段。
zeroclaw config
zeroclaw config set providers.models.custom.<alias>.context_window <value>
环境变量
导出此覆盖配置(POSIX shell;可放入 ~/.bashrc、~/.zshrc、.env 或 Dockerfile 中)。将 <alias> 替换为实际的别名:
export ZEROCLAW_providers__models__custom__<alias>__context_window=
extra_headers 🔑
每个请求都会附带发送的额外 HTTP 头。小众功能:用于身份验证桥接、企业代理或需要追踪头的自定义网关。大多数用户无需使用此功能;如有需要,请直接编辑 config.toml。
将它放置在任何表面上:
网关仪表板
打开 /config/providers.models/custom 并设置 providers.models.custom.<alias>.extra_headers 字段。
zerocode
在Config窗格中,设置 providers.models.custom.<alias>.extra_headers 字段。
zeroclaw config
zeroclaw config set providers.models.custom.<alias>.extra_headers # 掩码输入,加密存储
环境变量
导出此覆盖配置(POSIX shell;可放入 ~/.bashrc、~/.zshrc、.env 或 Dockerfile 中)。将 <alias> 替换为实际的别名:
export ZEROCLAW_providers__models__custom__<alias>__extra_headers=
fallback
当此别名上的每个模型都失败后,按顺序尝试的其他提供方别名列表。每个条目都是指向 providers.models 的点分 <type>.<alias> 引用,并使用其自身的凭据、端点和模型进行解析。回退别名绝不会继承此别名的密钥。遍历采用深度优先方式:先用尽此别名的模型,然后依次深入每个回退别名(应用其自身的 fallback_models 和 fallback)。为空表示没有提供方级别的回退。
将它放置在任何表面上:
网关仪表板
打开 /config/providers.models/custom 并设置 providers.models.custom.<alias>.fallback 字段。
zerocode
在 Config 窗格中,设置 providers.models.custom.<alias>.fallback 字段。
zeroclaw config
zeroclaw config set providers.models.custom.<alias>.fallback <value>
环境变量
导出此覆盖配置(POSIX shell;可放入 ~/.bashrc、~/.zshrc、.env 或 Dockerfile 中)。将 <alias> 替换为实际的别名:
export ZEROCLAW_providers__models__custom__<alias>__fallback=
fallback_models
在转向 fallback 别名之前,按顺序尝试当前提供方上的备用模型。使用与主 model 相同的端点、密钥和请求头,仅更改模型标识符。当某个提供方提供了备用模型(例如更小或更旧的变体),且应在彻底切换提供方之前先行尝试时,请使用此选项。留空则仅尝试 model。
将它放置在任何表面上:
网关仪表板
打开 /config/providers.models/custom 并设置 providers.models.custom.<alias>.fallback_models 字段。
zerocode
在 Config 窗格中,设置 providers.models.custom.<alias>.fallback_models 字段。
zeroclaw config
zeroclaw config set providers.models.custom.<alias>.fallback_models <value>
环境变量
导出此覆盖配置(POSIX shell;可放入 ~/.bashrc、~/.zshrc、.env 或 Dockerfile 中)。将 <alias> 替换为实际的别名:
export ZEROCLAW_providers__models__custom__<alias>__fallback_models=
kind
为此配置文件实例化的 Provider 实现。当某个规范化的类型化槽位应通过兼容实现运行时使用,例如 [providers.models.openai.proxy] kind = "openai-compatible"。
将它放置在任何表面上:
网关仪表板
打开 /config/providers.models/custom 并设置 providers.models.custom.<alias>.kind 字段。
zerocode
在 Config 窗格中,设置 providers.models.custom.<alias>.kind 字段。
zeroclaw config
zeroclaw config set providers.models.custom.<alias>.kind <value>
环境变量
导出此覆盖配置(POSIX shell;可放入 ~/.bashrc、~/.zshrc、.env 或 Dockerfile 中)。将 <alias> 替换为实际的别名:
export ZEROCLAW_providers__models__custom__<alias>__kind=
live_pricing
从该提供商自己的 OpenAI 兼容 /models 列表拉取其模型的实时 token 价格(网关是其价格的事实来源),为操作员尚未在 [cost.rates] / pricing 下定价的模型补全成本跟踪费率。网关未定价的模型(或根本没有 HTTP /models 列表的提供商,例如像 kilocli 这样的子进程网关)回退到公开的 models.dev 目录。已配置的费率始终优先生效;实时价格只补充空缺。后台任务每小时刷新一次价格快照;成本记录路径读取缓存快照,且绝不会在网络上阻塞。默认 false:关闭时不进行获取,行为与不启用该特性的构建完全相同。
将它放置在任何表面上:
网关仪表板
打开 /config/providers.models/custom 并设置 providers.models.custom.<alias>.live_pricing 字段。
zerocode
在 Config 窗格中,设置 providers.models.custom.<alias>.live_pricing 字段。
zeroclaw config
zeroclaw config set providers.models.custom.<alias>.live_pricing <value>
环境变量
导出此覆盖配置(POSIX shell;可放入 ~/.bashrc、~/.zshrc、.env 或 Dockerfile 中)。将 <alias> 替换为实际的别名:
export ZEROCLAW_providers__models__custom__<alias>__live_pricing=
max_tokens
响应长度的硬性上限(以 token 计)。大多数模型已内置了合理的限制;除非你出于成本或延迟方面的考虑需要裁剪过长的输出,否则请保持不设置。
将它放置在任何表面上:
网关仪表板
打开 /config/providers.models/custom 并设置 providers.models.custom.<alias>.max_tokens 字段。
zerocode
在 Config 窗格中,设置 providers.models.custom.<alias>.max_tokens 字段。
zeroclaw config
zeroclaw config set providers.models.custom.<alias>.max_tokens <value>
环境变量
导出此覆盖配置(POSIX shell;可放入 ~/.bashrc、~/.zshrc、.env 或 Dockerfile 中)。将 <alias> 替换为实际的别名:
export ZEROCLAW_providers__models__custom__<alias>__max_tokens=
merge_system_into_user
ModelProvider 特定的兼容性处理:将系统提示合并到第一条用户消息中,而不是单独发送一个 system 角色。仅在模型拒绝(或错误处理)独立的 system 角色时才需要,例如某些较旧的 Mistral 变体。
将它放置在任何表面上:
网关仪表板
打开 /config/providers.models/custom,并设置 providers.models.custom.<alias>.merge_system_into_user 字段。
zerocode
在 Config 窗格中,设置 providers.models.custom.<alias>.merge_system_into_user 字段。
zeroclaw config
zeroclaw config set providers.models.custom.<alias>.merge_system_into_user <value>
环境变量
导出此覆盖配置(POSIX shell;可放入 ~/.bashrc、~/.zshrc、.env 或 Dockerfile 中)。将 <alias> 替换为实际的别名:
export ZEROCLAW_providers__models__custom__<alias>__merge_system_into_user=
model
随每个请求发送的模型标识符:来自 model_provider 目录的 ID 字符串(例如 gpt-4o、claude-sonnet-4-5、llama-3.3-70b)。必须与 model_provider 在此账户上实际提供的模型相匹配。
将它放置在任何表面上:
网关仪表板
打开 /config/providers.models/custom 并设置 providers.models.custom.<alias>.model 字段。
zerocode
在 Config 窗格中,设置 providers.models.custom.<alias>.model 字段。
zeroclaw config
zeroclaw config set providers.models.custom.<alias>.model <value>
环境变量
导出此覆盖配置(POSIX shell;可放入 ~/.bashrc、~/.zshrc、.env 或 Dockerfile 中)。将 <alias> 替换为实际的别名:
export ZEROCLAW_providers__models__custom__<alias>__model=
native_tools
覆盖提供方的原生工具调用默认设置。None(默认)遵循提供方的内置选择。Some(true) 强制开启原生工具调用,Some(false) 强制使用文本回退。目前仅 Groq 工厂会参考此设置,它默认使用文本回退,因为 llama 系列的 Groq 模型会以 HTTP 400 拒绝原生工具调用。设置 native_tools = true 可为支持原生工具调用的 Groq 模型重新启用该功能。
将它放置在任何表面上:
网关仪表板
打开 /config/providers.models/custom 并设置 providers.models.custom.<alias>.native_tools 字段。
zerocode
在 Config 窗格中,设置 providers.models.custom.<alias>.native_tools 字段。
zeroclaw config
zeroclaw config set providers.models.custom.<alias>.native_tools <value>
环境变量
导出此覆盖配置(POSIX shell;可放入 ~/.bashrc、~/.zshrc、.env 或 Dockerfile 中)。将 <alias> 替换为实际的别名:
export ZEROCLAW_providers__models__custom__<alias>__native_tools=
pricing
用于成本追踪的按模型定价,单位为每 100 万 token 的美元数。自由格式的键/值映射。键为用户自定义的模型标识符;当运维人员希望区分费率时,可使用可选的 .input / .output 后缀来表示定价维度。不带后缀的裸键在未指定任一维度时用作统一的按 token 费率。默认值为空:此时成本追踪会回退到“未知”费率,仅记录 token 用量。示例:pricing = { opus = 15.0, sonnet = 3.0 } 或拆分:pricing = { "opus.input" = 15.0, "opus.output" = 75.0 }
将它放置在任何表面上:
网关仪表板
打开 /config/providers.models/custom 并设置 providers.models.custom.<alias>.pricing 字段。
zerocode
在 Config 窗格中,设置 providers.models.custom.<alias>.pricing 字段。
zeroclaw config
zeroclaw config set providers.models.custom.<alias>.pricing <value>
环境变量
导出此覆盖配置(POSIX shell;可放入 ~/.bashrc、~/.zshrc、.env 或 Dockerfile 中)。将 <alias> 替换为实际的别名:
export ZEROCLAW_providers__models__custom__<alias>__pricing=
provider_extra
在 API 请求中包含的额外 JSON 参数。在请求体的顶层进行合并,从而无需修改代码即可使用特定提供商的功能(路由、转换等)。示例:provider_extra = { model_provider = { only = ["Anthropic"] } }
将它放置在任何表面上:
网关仪表板
打开 /config/providers.models/custom 并设置 providers.models.custom.<alias>.provider_extra 字段。
zerocode
在 Config 窗格中,设置 providers.models.custom.<alias>.provider_extra 字段。
zeroclaw config
zeroclaw config set providers.models.custom.<alias>.provider_extra <value>
环境变量
导出此覆盖配置(POSIX shell;可放入 ~/.bashrc、~/.zshrc、.env 或 Dockerfile 中)。将 <alias> 替换为实际的别名:
export ZEROCLAW_providers__models__custom__<alias>__provider_extra=
replay_assistant_reasoning
出站 assistant 历史消息中是否应重放已存储的 assistant 推理。Some(false) 在发送前会去除 reasoning_content 和 reasoning。None(默认)遵循提供方内置默认值(对于大多数兼容提供方为 true,对于 Groq 为 false)。
将它放置在任何表面上:
网关仪表板
打开 /config/providers.models/custom 并设置 providers.models.custom.<alias>.replay_assistant_reasoning 字段。
zerocode
在 Config 面板中,设置 providers.models.custom.<alias>.replay_assistant_reasoning 字段。
zeroclaw config
zeroclaw config set providers.models.custom.<alias>.replay_assistant_reasoning <value>
环境变量
导出此覆盖配置(POSIX shell;可放入 ~/.bashrc、~/.zshrc、.env 或 Dockerfile 中)。将 <alias> 替换为实际的别名:
export ZEROCLAW_providers__models__custom__<alias>__replay_assistant_reasoning=
requires_openai_auth
为 true 时,客户端会从 ZeroClaw 存储的 openai-codex 认证配置文件中提取凭据,而不是使用上面的 api_key 字段。使用 zeroclaw auth login --model-provider openai-codex --import ~/.codex/auth.json 导入现有的 Codex CLI 登录,或者运行 zeroclaw auth login --model-provider openai-codex。仅对 OpenAI Codex model_provider 开启;标准基于 API key 的 model_provider 请保持关闭。
将它放置在任何表面上:
网关仪表板
打开 /config/providers.models/custom 并设置 providers.models.custom.<alias>.requires_openai_auth 字段。
zerocode
在 Config 窗格中,设置 providers.models.custom.<alias>.requires_openai_auth 字段。
zeroclaw config
zeroclaw config set providers.models.custom.<alias>.requires_openai_auth <value>
环境变量
导出此覆盖配置(POSIX shell;可放入 ~/.bashrc、~/.zshrc、.env 或 Dockerfile 中)。将 <alias> 替换为实际的别名:
export ZEROCLAW_providers__models__custom__<alias>__requires_openai_auth=
temperature
传递给模型的采样温度。较低的值(0.0–0.3)会产生确定性、近乎逐字的输出,适用于代码、路由、摘要等场景。较高的值(0.7–1.2)会产生更多样化的输出,适用于开放式对话。
将它放置在任何表面上:
网关仪表板
打开 /config/providers.models/custom 并设置 providers.models.custom.<alias>.temperature 字段。
zerocode
在 Config 窗格中,设置 providers.models.custom.<alias>.temperature 字段。
zeroclaw config
zeroclaw config set providers.models.custom.<alias>.temperature <value>
环境变量
导出此覆盖配置(POSIX shell;可放入 ~/.bashrc、~/.zshrc、.env 或 Dockerfile 中)。将 <alias> 替换为实际的别名:
export ZEROCLAW_providers__models__custom__<alias>__temperature=
think
为支持思维链推理的模型(例如 Qwen3、GLM-4)启用或禁用该功能。true 开启思维链,false 关闭。None(默认)则由模型自行决定。在请求体中以 enable_thinking 转发;对应 Ollama 提供方的 think 字段。
将它放置在任何表面上:
网关仪表板
打开 /config/providers.models/custom 并设置 providers.models.custom.<alias>.think 字段。
zerocode
在 Config 窗格中,设置 providers.models.custom.<alias>.think 字段。
zeroclaw config
zeroclaw config set providers.models.custom.<alias>.think <value>
环境变量
导出此覆盖配置(POSIX shell;可放入 ~/.bashrc、~/.zshrc、.env 或 Dockerfile 中)。将 <alias> 替换为实际的别名:
export ZEROCLAW_providers__models__custom__<alias>__think=
timeout_secs
HTTP 请求超时时间(秒)。如果本地 model_providers 较慢(CPU 上运行的 Ollama、大型本地模型)或网络延迟较高,请调大此值;否则请保持未设置。
将它放置在任何表面上:
网关仪表板
打开 /config/providers.models/custom 并设置 providers.models.custom.<alias>.timeout_secs 字段。
zerocode
在 Config 窗格中,设置 providers.models.custom.<alias>.timeout_secs 字段。
zeroclaw config
zeroclaw config set providers.models.custom.<alias>.timeout_secs <value>
环境变量
导出此覆盖配置(POSIX shell;可放入 ~/.bashrc、~/.zshrc、.env 或 Dockerfile 中)。将 <alias> 替换为实际的别名:
export ZEROCLAW_providers__models__custom__<alias>__timeout_secs=
tls_ca_cert_path
指向用于与此提供方建立 TLS 连接的 PEM 编码 CA 证书的路径。必须为绝对路径;不会执行 shell 展开(例如 ~)。留空则使用系统默认的信任存储。
将它放置在任何表面上:
网关仪表板
打开 /config/providers.models/custom 并设置 providers.models.custom.<alias>.tls_ca_cert_path 字段。
zerocode
在 Config 窗格中,设置 providers.models.custom.<alias>.tls_ca_cert_path 字段。
zeroclaw config
zeroclaw config set providers.models.custom.<alias>.tls_ca_cert_path <value>
环境变量
导出此覆盖配置(POSIX shell;可放入 ~/.bashrc、~/.zshrc、.env 或 Dockerfile 中)。将 <alias> 替换为实际的别名:
export ZEROCLAW_providers__models__custom__<alias>__tls_ca_cert_path=
tool_result_image_policy
原生兼容的 chat-completions 提供商如何处理 role=tool 结果中的图像标记。image_url 保留结构化图像部分;omit 移除其负载并追加固定提示。这不会影响直接的用户图像内容或 OpenAI Responses 提供商。
将它放置在任何表面上:
网关仪表板
打开 /config/providers.models/custom,并设置 providers.models.custom.<alias>.tool_result_image_policy 字段。
zerocode
在 Config 面板中,设置 providers.models.custom.<alias>.tool_result_image_policy 字段。
zeroclaw config
zeroclaw config set providers.models.custom.<alias>.tool_result_image_policy <value>
环境变量
导出此覆盖配置(POSIX shell;可放入 ~/.bashrc、~/.zshrc、.env 或 Dockerfile 中)。将 <alias> 替换为实际的别名:
export ZEROCLAW_providers__models__custom__<alias>__tool_result_image_policy=
uri
客户端访问的端点 URI。当指向自托管网关(LiteLLM、vLLM、Ollama)、自定义代理或任何非标准 URL 时,可覆盖该系列的默认端点。保持未设置则使用该系列 ModelEndpoint 实现中的默认 URI。请将此项设置为完整的端点 URL;不存在单独的路径后缀字段。
将它放置在任何表面上:
网关仪表板
打开 /config/providers.models/custom 并设置 providers.models.custom.<alias>.uri 字段。
zerocode
在 Config 窗格中,设置 providers.models.custom.<alias>.uri 字段。
zeroclaw config
zeroclaw config set providers.models.custom.<alias>.uri <value>
环境变量
导出此覆盖配置(POSIX shell;可放入 ~/.bashrc、~/.zshrc、.env 或 Dockerfile 中)。将 <alias> 替换为实际的别名:
export ZEROCLAW_providers__models__custom__<alias>__uri=
vision
覆盖提供商的视觉(图像输入)能力。None(默认)使用提供商系列的内置默认值。某些系列(llama.cpp、通用 OpenAI 兼容端点等)默认假定支持视觉能力,因为它们可以提供多模态模型。对于此类系列所服务的纯文本模型(例如 llama.cpp 后端的文本 LLM),请设置 vision = false,以便图像消息被路由到已配置的 [multimodal] vision_model_provider,而不是发送给会拒绝它们的模型。Some(true) 则强制启用视觉能力。
将它放置在任何表面上:
网关仪表板
打开 /config/providers.models/custom 并设置 providers.models.custom.<alias>.vision 字段。
zerocode
在 Config 窗格中,设置 providers.models.custom.<alias>.vision 字段。
zeroclaw config
zeroclaw config set providers.models.custom.<alias>.vision <value>
环境变量
导出此覆盖配置(POSIX shell;可放入 ~/.bashrc、~/.zshrc、.env 或 Dockerfile 中)。将 <alias> 替换为实际的别名:
export ZEROCLAW_providers__models__custom__<alias>__vision=
wire_api
将它放置在任何表面上:
网关仪表板
打开 /config/providers.models/custom 并设置 providers.models.custom.<alias>.wire_api 字段。
zerocode
在 Config 窗格中,设置 providers.models.custom.<alias>.wire_api 字段。
zeroclaw config
zeroclaw config set providers.models.custom.<alias>.wire_api <value>
环境变量
导出此覆盖配置(POSIX shell;可放入 ~/.bashrc、~/.zshrc、.env 或 Dockerfile 中)。将 <alias> 替换为实际的别名:
export ZEROCLAW_providers__models__custom__<alias>__wire_api=
控制思考模式因模型系列而异。think = false 会设置请求中顶层的 enable_thinking 字段。某些模型(例如 Qwen3)会改为通过 chat_template_kwargs 从 Jinja 模板中读取此标志:
其他模型系列使用不同的模板变量名称,请检查您的模型的聊天模板,并在 chat_template_kwargs 下设置相应的键。
SGLang:插槽 sglang
sh
python -m sglang.launch_server --model meta-llama/Llama-3.1-8B-Instruct --port 30000
vLLM:插槽 vllm
sh
vllm serve meta-llama/Llama-3.1-8B-Instruct
LM Studio、Osaurus、LiteLLM
插槽 lmstudio、osaurus、litellm 遵循相同的模式,参见目录。
线路协议:wire_api = "responses"
新的 OpenAI 提供商插槽(写入配置文件 时路径为 providers.models.openai.<alias>,可由 zeroclaw quickstart 或网关/配置界面创建)默认使用 wire_api = "responses",原因是 OpenAI 近期推出的 GPT 模型以 POST /v1/responses 作为主要传输接口。其他自带端点的插槽(custom、llamacpp 以及兼容 OpenAI 的第三方厂商)仍默认使用 chat-completions 传输接口;若某个端点仅支持 OpenAI responses 传输接口(例如部分自托管的 vLLM / TGI 部署),则需要在对应的别名条目中显式添加 wire_api = "responses" 以启用该接口。
当设置为 "responses" 时,provider 会构建为 OpenAiResponsesModelProvider(通过 responses 协议进行完整的流式工具调用),而不是 chat-completions provider。设置 "chat_completions" 可强制使用旧版传输协议。为实现向后兼容,有两种情况会在运行时继续使用 chat-completions,因此升级时任何现有设置都不会更改传输协议:
- 一个持久化的
providers.models.openai.<alias>条目若省略wire_api,反序列化后将视为未设置,并保持使用 chat-completions。 - 裸露的
model_provider = "openai"引用(或指向不存在别名的点式引用)没有可读取的配置项;它由系列回退构建而成,并保持使用 chat-completions。responses 默认值仅在插槽实际写入配置时才适用。
wire_api 在自带端点系列中生效,这些系列的 wire 可由操作员配置:openai、llamacpp 和 custom(以及通用的 openai 兼容路径)。品牌厂商插槽(groq、mistral、deepseek 等)具有固定的 wire 协议并忽略该字段,但有一个例外:opencode 会遵循 wire_api = "responses",因为 OpenCode Zen 同时提供两种 wire。在没有 uri 覆盖的情况下,OpenCode responses 路由指向 https://opencode.ai/zen/v1/responses:
[providers.models.opencode.default]
model = "big-pickle"
wire_api = "responses"
该设置同时管理主代理路径和委托目标,因此当委托的目标别名声明了 wire_api = "responses" 时,将通过 responses 协议访问端点。
验证
无论采用哪种方法:
sh
zeroclaw config list # 加载配置;任何验证失败都会输出到 stderr
zeroclaw models refresh --model-provider <type>.<alias> # list models the endpoint advertises
zeroclaw agent -a <alias> -m "hello" # 针对 `[agents.<alias>]` 处的 agent 进行冒烟测试
实现新的 ModelProvider trait
如果该端点不兼容 OpenAI,且不属于任何本地服务器槽位,则需要编写代码。
该 trait 位于 crates/zeroclaw-api/src/model_provider.rs:
#![allow(unused)]
fn main() {
#[async_trait]
pub trait ModelProvider: Send + Sync {
fn name(&self) -> &str;
fn supports_streaming(&self) -> bool { true }
fn supports_streaming_tool_events(&self) -> bool { false }
async fn chat(
&self,
messages: Vec<Message>,
tools: Vec<ToolSchema>,
options: ChatOptions,
) -> Pin<Box<dyn Stream<Item = Result<StreamEvent>> + Send>>;
}
}
实现模式:
-
在
crates/zeroclaw-config/src/schema.rs中定义类型化配置:#![allow(unused)] fn main() { pub struct MyProviderModelProviderConfig { #[serde(flatten)] pub base: ModelProviderConfig, pub endpoint: MyProviderEndpoint, // 系列特定字段 } pub enum MyProviderEndpoint { Default } impl ModelEndpoint for MyProviderEndpoint { fn uri(&self) -> &'static str { match self { Self::Default => "https://my-provider.example.com/v1" } } } } -
在
crates/zeroclaw-config/src/providers.rs中将该槽位添加到for_each_model_provider_slot!。每个辅助函数都会自动识别新槽位。 -
在
crates/zeroclaw-providers/src/myprovider.rs中添加运行时实现。将Vec<Message>转换为传输格式,流式传输响应,并发出StreamEvent值。 -
在
crates/zeroclaw-providers/src/lib.rs::create_provider_with_url_and_options中接入工厂分支。 -
如果该 provider 引入了较重的依赖,请在
Cargo.toml中添加一个 feature flag。
请参阅 anthropic.rs,了解具有完全自定义 wire 格式的提供程序示例。请参阅 compatible.rs,了解 SSE 流式传输的 OpenAI 兼容模式。
故障排除
身份验证错误
- 验证 API 密钥与端点是否匹配(许多厂商使用密钥前缀:
sk-、gsk_、sk-ant-)。 - 检查
uri是否包含协议方案(http:///https://),如果端点需要,还应包含/v1路径。 - 终端节点位于 VPN 或代理之后?请从 ZeroClaw 主机确认路由配置。
未找到模型
- 列出该端点所支持的功能:
sh
curl -sS "$URI/models" -H `Authorization: Bearer $API_KEY` | jq
连接问题
curl -I $URI,它有响应吗?- 防火墙、代理、出站规则?VPS 提供商有时会屏蔽出站高位端口。
- 如果是托管服务,则为供应商状态页面。
网关拒绝 temperature
某些网关(例如代理 claude-opus-4-7 的 LiteLLM proxy)在请求中只要存在 temperature 字段就会返回错误。ZeroClaw 遵循 Option 约定:如果你在配置中未设置 temperature,该字段将被完全省略于请求体之外,由后端自行选择默认值。仅在端点接受该字段时才显式设置 temperature。