{"repo": "1cyberlangke1/claudify-deepseek", "files": {"README.md": {"4cfe1aa4fe7a68911a53b2457961acdd48dfca48": {"t": 1785768260.6058526, "n": 3576, "h": "e182547afe09a884", "c": "# claudify-deepseek\n\n![claudify-deepseek logo](./logo.png)\n\nDeepSeek 风格 API → Claude (Anthropic) 风格 API 的代理,将只提供 OpenAI 兼容 `/chat/completions` 接口的 DeepSeek 提供商转换为标准的 Claude Messages API。\n\n## 问题\n\n某些 DeepSeek 兼容提供商 (比如 OpenCode)只提供 OpenAI 格式的 API(`POST /chat/completions`),而 Claude Code 等工具只认 Anthropic 格式(`POST /v1/messages`)。直接代理会触发:\n\n```\nError 400: The reasoning_content in the thinking mode must be passed back to the API\n```\n\n本项目解决了格式转换和 `reasoning_content` 回传问题。\n\n## 使用\n\n```bash\ngit clone \ncd claudify-deepseek\nnpm install\ncp .env.example .env\nnpm start\n```\n\nWindows 用户也可以用静默脚本(无终端窗口):\n\n- `start.bat` — 后台启动(自动检测是否已在运行)\n- `stop.bat` — 停止代理\n\n然后配置 Claude Code:\n\n```bash\nexport ANTHROPIC_BASE_URL=http://localhost:3000\nexport ANTHROPIC_API_KEY=<你的 upstream API key>\n```\n\nmodel 名直接透传,Claude Code 发什么 upstream 就收什么。如果你的上游是 DeepSeek 系,可以指定:\n\n```bash\n# Claude Code 发这个模型名,代理原样转发给 upstream\nexport ANTHROPIC_MODEL=deepseek-v4-flash-free\n```\n\n`ANTHROPIC_API_KEY` 会通过 `Authorization: Bearer` 头自动透传给 upstream,无需额外配置。\n\n## 配置\n\n| 变量 | 默认值 | 说明 |\n| --- | --- | --- |\n| `UPSTREAM_BASE_URL` | `https://opencode.ai/zen/v1` | 上游 DeepSeek 提供商地址 |\n| `PORT` | `4000` | 监听端口 |\n| `LOG_LEVEL` | `info` | 日志级别:`debug`, `info`, `warn`, `error` |\n| `LOG_DIR` | `logs` | 日志文件目录 |\n| `LOG_FILE_MAX_SIZE` | `10485760` | 单日志上限(bytes) |\n| `LOG_FILE_MAX_FILES` | `5` | 保留轮转文件数 |\n| `LOG_FILE_ENABLED` | `true` | 是否写文件日志 |\n| `EXA_API_KEY` | — | Exa 搜索 API key(可选,免费 tier 无需 key) |\n| `WEB_SEARCH_ENABLED` | `true` | 联网搜索开关 |\n| `VISION_ENABLED` | `false` | VLM 识图开关 |\n| `VISION_API_KEY` | — | VLM API key |\n| `VISION_BASE_URL` | — | VLM 端点 |\n| `VISION_MODEL` | — | VLM 模型名 |\n| `VISION_PROMPT_FILE` | `src/VISION_PROMPT.md` | 提示词文件路径(相对/绝对) |\n| `VISION_TIMEOUT_MS` | `60000` | VLM 请求超时(毫秒) |\n| `VISION_CACHE_TTL` | `604800` | 图片描述缓存过期时间(秒,默认 7 天) |\n| `VISION_CACHE_MEM_MAX` | `200` | 热缓存最大条目数 |\n| `VISION_CACHE_DIR` | `./data/vision-cache` | 磁盘缓存目录 |\n| `CACHE_MONITOR` | `false` | 缓存暴跌监控(记录 body diff 到文件) |\n\nAPI key 从下游请求的 `x-api-key` 或 `Authorization: Bearer` 头自动透传;model 直接从下游请求体透传。\n\n## Web 搜索\n\n支持 Claude Code 内置的 `web_search_20250305` 工具,使用 **Exa** 搜索提供实时搜索结果。\n\n- 无需额外配置,免费 tier 即开即用\n- 设置 `EXA_API_KEY` 可解除免费 rate limit\n- 搜索在代理侧执行,上游 DeepSeek 无需支持搜索\n\n## 图片识别\n\n支持 Claude Code 中 Read 工具返回的图片——拦截最后一个 `tool_result` 中的 `image` 块,通过 VLM API 生成文字描述替换后转发给上游。\n\n- 默认关闭(`VISION_ENABLED=false`)\n- 设置 `VISION_ENABLED=true` + 填写 VLM 配置即可启用\n- VLM 可选:[商汤 SenseNova](https://platform.sensenova.cn/)(限时免费)、NVIDIA NIM、Groq、Google Gemini 等任意 OpenAI 兼容 API\n- 图片在代理侧描述后以 `[Image] <描述>` 文本形式发给上游,上游无需支持多模态\n- 超时控制:`VISION_TIMEOUT_MS` 环境变量(默认 15000ms)\n\n## 缓存说明\n\nDeepSeek 的前缀缓存对 `messages[]` 中出现的 `role: \"system\"` 敏感。Claude Code 插件(如 caveman)可能通过 Hook 注入 `{\"role\":\"system\"}` 消息,打断缓存桶对齐,导致缓存率从 99%+ 降至 \\~25%。\n\n代理会自动将 `messages[]` 中首个之后的 `role: \"system\"` 转为 `role: \"user\"`,避免缓存断裂。\n\n## 转换说明\n\n行为对齐 [DeepSeek 官方 Anthropic 兼容表](https://api-docs.deepseek.com/guides/anthropic_api):\n\n- `thinking` block → `reasoning_content`(双向转换)\n- `output_config.effort` / `reasoning_effort` → `low/medium/high` 映射为 `high`,`xhigh` 映射为 `max`\n- `tool_use` / `tool_result` ↔ function calls\n- `web_search_20250305`(Anthropic 内置工具)→ 代理侧搜索,不转发上游\n- 标 \"Ignored\" 的字段静默丢弃(如 `thinking.budget_tokens`)\n- 标 \"Not Supported\" 的字段(图片/文档等)返回 400\n\n## 协议\n\nMIT © 2026 1cyberlangke1\n\n## 参考与致谢\n\n本项目的图片识别实现参考了以下开源项目:\n\n- [RainSunMe/cc-vision-hook](https://github.com/RainSunMe/cc-vision-hook) — Claude Code Hook 视觉工具包,提供了递归图片提取和 VLM 描述的实现思路\n- [ErlichLiu/deepseek-vision](https://github.com/ErlichLiu/deepseek-vision) — DeepSeek 多模态代理,提供了 VLM 中间件的架构参考\n\n---\n\n更新于 2026-07-21"}}}}