☰
openclaw配置ollama报错models.providers.ollama.api: Invalid input,把endpoint改到TaoToken
2026/10/1 14:29:47 网站建设 项目流程

1. openclaw 接入 ollama 时 models.providers.ollama.api 报 Invalid input 的真实场景

如果你正在用 openclaw 做本地 Agent 或者 Discord bot 的后端,同时想让它调用本机跑的 ollama 模型,那么你大概率会在启动 gateway 的那一刻撞上这个报错:

.openclaw\openclaw.json: - models.providers.ollama.api: Invalid input

这个报错的特点是:它不告诉你哪个字段类型错了,也不告诉你合法值有哪些,只丢一句Invalid input,然后 gateway 直接起不来,连带 Discord 上挂着的 bot 也变成离线状态。很多人第一反应是 ollama 没启动、端口不通、模型没拉下来,于是反复ollama serve、ollama list,结果发现 ollama 本身完全正常,问题根本不在 ollama 那边。

models.providers.ollama.api这个字段,本质上是 openclaw 用来判断「用哪种协议去和这个 provider 对话」的枚举值。它不是 URL,不是端口,也不是模型名,而是一个协议标识。openclaw 内部遵循 OpenAI 的对话格式,所以这个字段的合法取值是像openai-completions这样的协议名。当你把 endpoint 地址、http://localhost:11434这类 URL 直接塞进api字段时,schema 校验就会判定类型不匹配,抛出Invalid input。

这个场景里有两类人最容易踩坑。第一类是刚接触 openclaw 配置结构的新手,看到api这个词就下意识填了接口地址;第二类是之前用别的工具(比如某些直接填 base_url 的框架)迁移过来的人,习惯性地把 endpoint 写进了api。两种情况的根因一样:把「协议类型」和「服务地址」两个概念混在了一个字段里。

我试过在同一个配置文件里同时保留本地 ollama 和远端统一通道两种 provider,结果发现只要api字段写错,整个 gateway 的模型加载阶段就会中断,报错信息还只指向 ollama 这一条,很容易误导排查方向。所以定位这个问题的关键,是先理解 openclaw 的 provider 配置结构,再区分清楚「协议字段」和「endpoint 字段」各自该填什么。

这篇内容会从配置结构、字段类型、endpoint 写法三个角度拆解Invalid input的成因,给出可复制的 openclaw 配置片段,并演示把 endpoint 指向 TaoToken 统一 API 通道后,如何重启服务、验证报错消失、确认模型列表能正常拉取。适合正在用 openclaw + ollama 搭本地 Agent、又被这个校验错误卡住的开发者。

2. 拆解 openclaw 配置结构与 models.providers.ollama.api 字段类型

要彻底搞懂Invalid input,得先看清楚 openclaw 的models.providers这一层是怎么组织的。openclaw 的配置文件通常是.openclaw/openclaw.json(Windows 下是.openclaw\openclaw.json),里面models.providers是一个对象,每个 key 是一个 provider 名字,比如ollama、openai、anthropic,value 是这个 provider 的详细配置。

一个 provider 的配置里,通常包含这么几类字段:api表示协议类型,baseUrl或endpoint表示服务地址,apiKey表示鉴权密钥,models表示可用模型列表。这里最容易出错的就是api和baseUrl的分工。api是枚举,决定 openclaw 用哪套请求/响应解析逻辑;baseUrl才是真正的网络地址。

openclaw 支持的api取值,常见的有openai-completions、openai-responses、anthropic-messages等。openai-completions对应的是 OpenAI 的/v1/chat/completions风格接口,特点是流式输出和对话上下文的标准解析方式。ollama 本身提供了兼容 OpenAI 的接口,所以当 openclaw 通过openai-completions协议去请求 ollama 时,能正确解析流式返回,尤其是带reasoning: true的模型(比如 deepseek-r1 这类),需要靠标准流式返回提取思考过程,用openai-completions刚好触发正确的解析逻辑。

那为什么填 URL 会报Invalid input?因为 schema 校验在类型层面就拦住了。api字段期望的是一个字符串枚举,你填http://localhost:11434虽然也是字符串,但它不在允许的枚举集合里,校验器就会报Invalid input。注意,这个报错和「值不合法」是两回事——如果字段类型完全不对(比如填了数字或对象),报错可能更早;而填了字符串但不在枚举内,就是你现在看到的这条。

再往下看,models.providers.ollama下面往往还有一个models数组,列出这个 provider 下可用的模型名,比如deepseek-r1:7b、qwen2.5:14b。这个数组和api字段是独立的,api错了会导致整个 provider 校验失败,models里的模型自然也就加载不出来,表现出来就是「检测不到 ollama 本地模型」。

还有一个隐藏坑:openclaw 的配置校验是「全量校验」,只要有一个字段不合法,整个 gateway 启动就会失败,而不是跳过这个 provider。所以哪怕你只配了 ollama 一个 provider,api写错也会让整个服务起不来,Discord bot 跟着离线。理解这一点,你就知道为什么报错信息只提 ollama,但影响面却是全局的。

从字段类型角度总结一下:api是枚举字符串,baseUrl是 URL 字符串,apiKey是字符串,models是数组。把 URL 填进api,就是把「地址类型」塞进了「协议类型」的位置,类型语义不匹配,校验必然失败。这也是为什么修复方式很简单——把api改成openai-completions,把地址挪到baseUrl里。

3. 可复制的 openclaw 配置片段与 TaoToken endpoint 写法

搞清楚字段分工后,直接上可复制的配置。下面是一个把 ollama 本地模型和 TaoToken 统一通道都配上的openclaw.json片段。注意api字段全部用协议枚举,地址统一放baseUrl。

{ "models": { "providers": { "ollama": { "api": "openai-completions", "baseUrl": "http://localhost:11434/v1", "apiKey": "ollama", "models": [ "deepseek-r1:7b", "qwen2.5:14b" ] }, "taotoken": { "api": "openai-completions", "baseUrl": "https://taotoken.net/api", "apiKey": "sk-你的TaoTokenKey", "models": [ "claude-sonnet-4-5", "gpt-4.1", "deepseek-v3" ] } } } }

这里有几个关键点。第一,ollama的baseUrl是http://localhost:11434/v1,注意结尾的/v1,因为 ollama 的 OpenAI 兼容接口挂在/v1路径下,少了它请求会 404。第二,apiKey对本地 ollama 来说其实不校验,随便填个ollama占位即可,但字段不能缺,否则某些版本会报缺字段。第三,taotoken这个 provider 的baseUrl是https://taotoken.net/api,apiKey换成你在控制台生成的 Key,模型名按你实际要用的填。

如果你只想把原来的 ollama endpoint 改到 TaoToken,也就是不再走本地,而是走统一 API 通道,那配置可以更简洁:

{ "models": { "providers": { "ollama": { "api": "openai-completions", "baseUrl": "https://taotoken.net/api", "apiKey": "sk-你的TaoTokenKey", "models": [ "deepseek-v3", "claude-sonnet-4-5" ] } } } }

注意这里 provider 名字还叫ollama,但baseUrl已经指向 TaoToken。这种写法适合你想保留原有 provider 引用、只换后端地址的场景。不过更推荐把 provider 名字也改成taotoken,语义更清晰,避免以后自己看混。

如果你用的是 TOML 风格的配置(部分 openclaw 版本或周边工具支持),等价写法是:

[models.providers.ollama] api = "openai-completions" baseUrl = "https://taotoken.net/api" apiKey = "sk-你的TaoTokenKey" models = ["deepseek-v3", "claude-sonnet-4-5"]

不管 JSON 还是 TOML,核心三件套是固定的:api填协议枚举openai-completions,baseUrl填服务地址,apiKey填密钥。这三者缺一不可,且不能互相串位。很多人报Invalid input就是因为把baseUrl的内容写进了api,或者反过来把openai-completions写进了baseUrl。

生成 TaoToken Key 的入口在控制台的 API Keys 页面,地址是https://taotoken.net/console/api-keys。拿到 Key 后直接替换上面片段里的sk-你的TaoTokenKey。如果你还没决定用哪些模型,可以先到模型对话页面试一下可用模型,地址是https://taotoken.net/models,确认模型 ID 拼写无误再写进配置,避免因为模型名写错又触发另一类校验错误。

配置改完后,保存文件。openclaw 的 gateway 支持热更新,正常情况下保存后会自动重新加载配置。如果没触发,就手动重启服务。下一节讲怎么验证。

4. 重启服务后验证报错消失与模型列表拉取

配置改完,接下来是验证环节。这一步的目标很明确:确认models.providers.ollama.api: Invalid input消失,gateway 正常启动,模型列表能拉出来。

先重启 gateway。如果你是用ollama launch openclaw启动的,先停掉当前进程,再重新执行:

ollama launch openclaw

观察启动日志。之前报错时会看到:

.openclaw\openclaw.json: - models.providers.ollama.api: Invalid input

修复后,这一行应该不再出现。如果日志里显示 gateway 已启动、provider 加载成功,说明配置校验通过了。这时候 Discord 上之前离线的 bot 应该会重新上线。

接着验证模型列表。openclaw 一般提供模型列表接口或命令,具体取决于你的版本。常见做法是请求 gateway 的模型列表端点,或者用 openclaw 自带的 CLI 查看:

curl http://localhost:你的gateway端口/v1/models

如果返回的 JSON 里包含你配置的模型名,比如deepseek-v3、claude-sonnet-4-5,说明 provider 已经正确加载,模型列表拉取正常。如果返回空列表或者报错,先检查baseUrl是否可达、apiKey是否有效。

再做一个实际对话请求,确认协议解析没问题:

curl http://localhost:你的gateway端口/v1/chat/completions \ -H "Content-Type: application/json" \ -H "Authorization: Bearer sk-你的TaoTokenKey" \ -d '{ "model": "deepseek-v3", "messages": [{"role": "user", "content": "你好,简单介绍一下你自己"}], "stream": true }'

如果能看到流式返回的内容,说明openai-completions协议解析正常,整条链路通了。这一步特别重要,因为Invalid input只是配置层校验,配置过了不代表请求层一定通。流式返回能正常解析,才算真正验证完成。

如果你之前配了reasoning: true的模型(比如 deepseek-r1),可以专门测一下思考过程能不能被正确提取。用openai-completions协议时,标准流式返回里会带 reasoning 相关字段,openclaw 能正确解析出来。如果换成别的协议,这部分可能就丢了。

验证通过后,建议把配置文件备份一份,避免以后误改又踩同样的坑。同时记下你用的api枚举值和baseUrl写法,下次加新 provider 时直接照抄结构,只换地址和 Key。

5. 本篇常见错误排查:401、local proxy failed、reading choices 与 OAuth

配置改对之后,Invalid input基本就消失了。但实际接入过程中,还会遇到几类高频报错,这里逐个对照排查。

第一类是401 Unauthorized。这个通常出现在apiKey环节。如果你走的是 TaoToken 统一通道,检查apiKey是不是控制台生成的、有没有多余空格、有没有过期。如果你走本地 ollama,apiKey虽然不校验,但字段不能空,填个占位符即可。401 和Invalid input的区别是:前者是配置校验过了、请求被拒;后者是配置根本没通过校验。

第二类是local proxy failed或类似的连接失败。这个多半是baseUrl写错或服务没起。本地 ollama 要确认ollama serve在跑,端口 11434 可达,baseUrl结尾的/v1不能少。走 TaoToken 的话,确认baseUrl是https://taotoken.net/api,网络能正常访问。注意不要在这里填任何本地代理地址,直接填服务地址即可。

第三类是reading choices相关报错,比如解析响应时读不到choices字段。这通常是协议不匹配导致的——api字段填的协议和实际服务返回的格式对不上。比如服务返回的是 OpenAI 格式,但你api填了别的协议,解析就会失败。解决办法是把api统一成openai-completions,确保请求和响应格式一致。

第四类是 OAuth 相关报错。如果你用的是需要 OAuth 的 provider,配置里可能涉及 token 刷新逻辑。这类报错和Invalid input不是一回事,但排查思路类似:先确认字段类型对不对,再确认凭证有没有过期。OAuth 场景下,apiKey可能换成 token 字段,具体看 provider 文档。

为了帮你快速定位,这里做个对照表:

报错可能原因排查方向
models.providers.ollama.api: Invalid inputapi 字段填了 URL 或非法枚举改成 openai-completions
401 UnauthorizedapiKey 无效或缺失检查 Key 是否正确、是否过期
local proxy failedbaseUrl 错误或服务未启动确认地址、端口、/v1 路径
reading choices协议与响应格式不匹配api 统一为 openai-completions
OAuth 相关token 过期或字段类型错检查凭证字段与刷新逻辑

还有一个容易忽略的点:如果你同时用了 CC Switch、Cline MCP 或 Codex 的auth.json,这些工具的配置里也有 Base URL、Key、Model ID 三件套,写法和 openclaw 类似但字段名可能不同。比如 Codex 的auth.json里可能是base_url而不是baseUrl,Cline MCP 的配置结构又是另一套。跨工具迁移时,别直接复制粘贴,先对照字段名。三件套的核心不变:Base URL 填服务地址,Key 填密钥,Model ID 填模型名,只是字段命名和嵌套层级有差异。

排查时建议按「配置校验 → 网络连通 → 鉴权 → 协议解析」的顺序走,一层层排除。Invalid input属于第一层,解决了它再往下看,效率最高。

6. 把 endpoint 统一到 TaoToken 后的长期用法与接入入口

把 endpoint 改到 TaoToken 之后,最直接的好处是配置结构统一了。本地 ollama 和远端模型都用同一套openai-completions协议、同一个baseUrl写法,只是地址和 Key 不同。这样你在 openclaw 里加新 provider 时,直接复制结构改三件套就行,不用再纠结字段类型。

对于长期跑 Agent 或 Discord bot 的场景,统一通道还有个实际价值:模型切换成本低。你可以在配置里同时挂多个模型,按任务类型路由。比如本地 ollama 跑轻量任务,TaoToken 通道跑需要更强推理的任务,配置层面只是多一个 provider 的事。

如果你要做长期编码或 Agent 任务,可以了解一下 Coding Plan,地址是https://taotoken.net/coding-plan,适合需要稳定调用、批量任务的场景。如果只是先验证模型效果,用模型对话页面https://taotoken.net/models快速试就行。接入文档在https://taotoken.net/doc,里面有各语言的请求示例和字段说明,配置遇到不确定的字段类型时,对照文档比猜要快。

生成和管理 Key 在https://taotoken.net/console/api-keys,建议给不同用途生成不同的 Key,方便排查和轮换。API 基础地址统一是https://taotoken.net/api,所有兼容 OpenAI 格式的请求都走这个入口。

回到最初那个报错,models.providers.ollama.api: Invalid input的本质就是字段语义错位。记住api填协议枚举、baseUrl填地址、apiKey填密钥这三件套,以后遇到同类校验错误,先看字段类型,再看枚举值,基本都能定位。配置改完记得重启验证,确认模型列表能拉、流式请求能通,才算真正收工。

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询