现象
Claude Code 使用 CC Switch 连接 DeepSeek 模型时,直接连接可以正常使用 web_search,但通过 opencode 中转就会报错。
报错信息
1
2
3
API Error: 400 Error from provider (DeepSeek):
Invalid schema for function 'web_search':
schema must be a JSON Schema of 'type: "object"', got 'type: null'.
两种链路的区别
直连的链路是:
1
Claude Code → DeepSeek
通过 opencode 中转的链路是:
1
Claude Code → CC Switch → opencode.ai/zen/go → DeepSeek
根因
web_search 工具的 parameters schema 中,allowed_domains/blocked_domains 等字段的 type 被 opencode 错误地转成了 null。DeepSeek 对 JSON Schema 校验严格,要求每个字段必须有明确的 type 声明,因此直接拒绝请求。
模型(DeepSeek)和 CC Switch 都没有问题,问题出在 opencode 服务端。
解决方案
根因在 opencode 服务端,根本解决需要等 opencode 修复。但联网搜索的需求可以先用其他方式满足。
web_search 不可用时,Claude Code 会自动降级使用 WebFetch。不过默认的 WebFetch 可能只请求 GitHub 等特定站点,不是全网搜索引擎。
更好的替代方案是让 Claude Code 通过 WebFetch 拉取 DuckDuckGo 的搜索结果。为什么不直接用 Google?Google 搜索结果页依赖 JS 渲染,WebFetch 抓取到的只是空壳页面。DuckDuckGo 是纯 HTML 搜索引擎(底层使用 Bing),没有 JS 渲染问题,WebFetch 可以直接抓取。
在你的项目仓库 CLAUDE.md 中加入以下规则即可:
1
2
**Web search prefers DuckDuckGo HTML** — Use DuckDuckGo HTML endpoint
`https://html.duckduckgo.com/html/?q=<query>` via WebFetch for web searches.
之后让 Claude Code 搜索内容时,它会优先使用 DuckDuckGo。搜索结果质量和 web_search 差别不大——web_search 底层大部分也是使用 Bing。