[{"data":1,"prerenderedAt":-1},["ShallowReactive",2],{"similar-CJackHwang--ds2api":3,"tool-CJackHwang--ds2api":61},[4,18,26,36,44,53],{"id":5,"name":6,"github_repo":7,"description_zh":8,"stars":9,"difficulty_score":10,"last_commit_at":11,"category_tags":12,"status":17},4358,"openclaw","openclaw\u002Fopenclaw","OpenClaw 是一款专为个人打造的本地化 AI 助手，旨在让你在自己的设备上拥有完全可控的智能伙伴。它打破了传统 AI 助手局限于特定网页或应用的束缚，能够直接接入你日常使用的各类通讯渠道，包括微信、WhatsApp、Telegram、Discord、iMessage 等数十种平台。无论你在哪个聊天软件中发送消息，OpenClaw 都能即时响应，甚至支持在 macOS、iOS 和 Android 设备上进行语音交互，并提供实时的画布渲染功能供你操控。\n\n这款工具主要解决了用户对数据隐私、响应速度以及“始终在线”体验的需求。通过将 AI 部署在本地，用户无需依赖云端服务即可享受快速、私密的智能辅助，真正实现了“你的数据，你做主”。其独特的技术亮点在于强大的网关架构，将控制平面与核心助手分离，确保跨平台通信的流畅性与扩展性。\n\nOpenClaw 非常适合希望构建个性化工作流的技术爱好者、开发者，以及注重隐私保护且不愿被单一生态绑定的普通用户。只要具备基础的终端操作能力（支持 macOS、Linux 及 Windows WSL2），即可通过简单的命令行引导完成部署。如果你渴望拥有一个懂你",349277,3,"2026-04-06T06:32:30",[13,14,15,16],"Agent","开发框架","图像","数据工具","ready",{"id":19,"name":20,"github_repo":21,"description_zh":22,"stars":23,"difficulty_score":10,"last_commit_at":24,"category_tags":25,"status":17},3808,"stable-diffusion-webui","AUTOMATIC1111\u002Fstable-diffusion-webui","stable-diffusion-webui 是一个基于 Gradio 构建的网页版操作界面，旨在让用户能够轻松地在本地运行和使用强大的 Stable Diffusion 图像生成模型。它解决了原始模型依赖命令行、操作门槛高且功能分散的痛点，将复杂的 AI 绘图流程整合进一个直观易用的图形化平台。\n\n无论是希望快速上手的普通创作者、需要精细控制画面细节的设计师，还是想要深入探索模型潜力的开发者与研究人员，都能从中获益。其核心亮点在于极高的功能丰富度：不仅支持文生图、图生图、局部重绘（Inpainting）和外绘（Outpainting）等基础模式，还独创了注意力机制调整、提示词矩阵、负向提示词以及“高清修复”等高级功能。此外，它内置了 GFPGAN 和 CodeFormer 等人脸修复工具，支持多种神经网络放大算法，并允许用户通过插件系统无限扩展能力。即使是显存有限的设备，stable-diffusion-webui 也提供了相应的优化选项，让高质量的 AI 艺术创作变得触手可及。",162132,"2026-04-05T11:01:52",[14,15,13],{"id":27,"name":28,"github_repo":29,"description_zh":30,"stars":31,"difficulty_score":32,"last_commit_at":33,"category_tags":34,"status":17},1381,"everything-claude-code","affaan-m\u002Feverything-claude-code","everything-claude-code 是一套专为 AI 编程助手（如 Claude Code、Codex、Cursor 等）打造的高性能优化系统。它不仅仅是一组配置文件，而是一个经过长期实战打磨的完整框架，旨在解决 AI 代理在实际开发中面临的效率低下、记忆丢失、安全隐患及缺乏持续学习能力等核心痛点。\n\n通过引入技能模块化、直觉增强、记忆持久化机制以及内置的安全扫描功能，everything-claude-code 能显著提升 AI 在复杂任务中的表现，帮助开发者构建更稳定、更智能的生产级 AI 代理。其独特的“研究优先”开发理念和针对 Token 消耗的优化策略，使得模型响应更快、成本更低，同时有效防御潜在的攻击向量。\n\n这套工具特别适合软件开发者、AI 研究人员以及希望深度定制 AI 工作流的技术团队使用。无论您是在构建大型代码库，还是需要 AI 协助进行安全审计与自动化测试，everything-claude-code 都能提供强大的底层支持。作为一个曾荣获 Anthropic 黑客大奖的开源项目，它融合了多语言支持与丰富的实战钩子（hooks），让 AI 真正成长为懂上",152630,2,"2026-04-12T23:33:54",[14,13,35],"语言模型",{"id":37,"name":38,"github_repo":39,"description_zh":40,"stars":41,"difficulty_score":32,"last_commit_at":42,"category_tags":43,"status":17},2271,"ComfyUI","Comfy-Org\u002FComfyUI","ComfyUI 是一款功能强大且高度模块化的视觉 AI 引擎，专为设计和执行复杂的 Stable Diffusion 图像生成流程而打造。它摒弃了传统的代码编写模式，采用直观的节点式流程图界面，让用户通过连接不同的功能模块即可构建个性化的生成管线。\n\n这一设计巧妙解决了高级 AI 绘图工作流配置复杂、灵活性不足的痛点。用户无需具备编程背景，也能自由组合模型、调整参数并实时预览效果，轻松实现从基础文生图到多步骤高清修复等各类复杂任务。ComfyUI 拥有极佳的兼容性，不仅支持 Windows、macOS 和 Linux 全平台，还广泛适配 NVIDIA、AMD、Intel 及苹果 Silicon 等多种硬件架构，并率先支持 SDXL、Flux、SD3 等前沿模型。\n\n无论是希望深入探索算法潜力的研究人员和开发者，还是追求极致创作自由度的设计师与资深 AI 绘画爱好者，ComfyUI 都能提供强大的支持。其独特的模块化架构允许社区不断扩展新功能，使其成为当前最灵活、生态最丰富的开源扩散模型工具之一，帮助用户将创意高效转化为现实。",108322,"2026-04-10T11:39:34",[14,15,13],{"id":45,"name":46,"github_repo":47,"description_zh":48,"stars":49,"difficulty_score":32,"last_commit_at":50,"category_tags":51,"status":17},6121,"gemini-cli","google-gemini\u002Fgemini-cli","gemini-cli 是一款由谷歌推出的开源 AI 命令行工具，它将强大的 Gemini 大模型能力直接集成到用户的终端环境中。对于习惯在命令行工作的开发者而言，它提供了一条从输入提示词到获取模型响应的最短路径，无需切换窗口即可享受智能辅助。\n\n这款工具主要解决了开发过程中频繁上下文切换的痛点，让用户能在熟悉的终端界面内直接完成代码理解、生成、调试以及自动化运维任务。无论是查询大型代码库、根据草图生成应用，还是执行复杂的 Git 操作，gemini-cli 都能通过自然语言指令高效处理。\n\n它特别适合广大软件工程师、DevOps 人员及技术研究人员使用。其核心亮点包括支持高达 100 万 token 的超长上下文窗口，具备出色的逻辑推理能力；内置 Google 搜索、文件操作及 Shell 命令执行等实用工具；更独特的是，它支持 MCP（模型上下文协议），允许用户灵活扩展自定义集成，连接如图像生成等外部能力。此外，个人谷歌账号即可享受免费的额度支持，且项目基于 Apache 2.0 协议完全开源，是提升终端工作效率的理想助手。",100752,"2026-04-10T01:20:03",[52,13,15,14],"插件",{"id":54,"name":55,"github_repo":56,"description_zh":57,"stars":58,"difficulty_score":32,"last_commit_at":59,"category_tags":60,"status":17},4721,"markitdown","microsoft\u002Fmarkitdown","MarkItDown 是一款由微软 AutoGen 团队打造的轻量级 Python 工具，专为将各类文件高效转换为 Markdown 格式而设计。它支持 PDF、Word、Excel、PPT、图片（含 OCR）、音频（含语音转录）、HTML 乃至 YouTube 链接等多种格式的解析，能够精准提取文档中的标题、列表、表格和链接等关键结构信息。\n\n在人工智能应用日益普及的今天，大语言模型（LLM）虽擅长处理文本，却难以直接读取复杂的二进制办公文档。MarkItDown 恰好解决了这一痛点，它将非结构化或半结构化的文件转化为模型“原生理解”且 Token 效率极高的 Markdown 格式，成为连接本地文件与 AI 分析 pipeline 的理想桥梁。此外，它还提供了 MCP（模型上下文协议）服务器，可无缝集成到 Claude Desktop 等 LLM 应用中。\n\n这款工具特别适合开发者、数据科学家及 AI 研究人员使用，尤其是那些需要构建文档检索增强生成（RAG）系统、进行批量文本分析或希望让 AI 助手直接“阅读”本地文件的用户。虽然生成的内容也具备一定可读性，但其核心优势在于为机器",93400,"2026-04-06T19:52:38",[52,14],{"id":62,"github_repo":63,"name":64,"description_en":65,"description_zh":66,"ai_summary_zh":66,"readme_en":67,"readme_zh":68,"quickstart_zh":69,"use_case_zh":70,"hero_image_url":71,"owner_login":72,"owner_name":73,"owner_avatar_url":74,"owner_bio":75,"owner_company":76,"owner_location":77,"owner_email":78,"owner_twitter":79,"owner_website":80,"owner_url":81,"languages":82,"stars":106,"forks":107,"last_commit_at":108,"license":109,"difficulty_score":32,"env_os":110,"env_gpu":111,"env_ram":112,"env_deps":113,"category_tags":119,"github_topics":120,"view_count":32,"oss_zip_url":130,"oss_zip_packed_at":130,"status":17,"created_at":131,"updated_at":132,"faqs":133,"releases":134},7044,"CJackHwang\u002Fds2api","ds2api","Deepseek客户端对话转API全栈开源工具，高性能，多账号轮询，支持纯vercel、docker部署使用。Google、Claude、ChatGPT多接口格式兼容","ds2api 是一款高性能的全栈开源工具，旨在将 DeepSeek 的网页对话能力转化为标准化的 API 服务。它有效解决了开发者无法直接通过代码调用 DeepSeek、或需在不同大模型接口格式间频繁切换的痛点，让用户能像使用 OpenAI、Claude 或 Gemini 原生接口一样，轻松接入 DeepSeek 的强大能力。\n\n这款工具特别适合后端开发者、AI 应用构建者及科研人员使用。无论是希望在本地快速搭建测试环境，还是需要在 Vercel、Docker 等云平台上部署生产级服务，ds2api 都能提供灵活支持。其核心亮点在于采用 Go 语言重构后端，无需 Python 运行时即可实现毫秒级响应；支持多账号自动轮询与并发队列管理，显著提升请求稳定性与吞吐量。此外，ds2api 内置了统一的协议适配层，能够智能转换 OpenAI、Claude 及 Gemini 等多种接口格式，并完美兼容流式输出与工具调用（Tool Calling）功能。配合直观的 React 管理后台，用户可轻松监控运行状态与管理配置，是连接 DeepSeek 与各类 AI 生态应用的理想桥梁。","\u003Cp align=\"center\">\n  \u003Cimg src=\"webui\u002Fpublic\u002Fds2api-favicon.svg\" width=\"128\" height=\"128\" alt=\"DS2API icon\" \u002F>\n\u003C\u002Fp>\n\n# DS2API\n\n[![License](https:\u002F\u002Fimg.shields.io\u002Fgithub\u002Flicense\u002FCJackHwang\u002Fds2api.svg)](LICENSE)\n![Stars](https:\u002F\u002Fimg.shields.io\u002Fgithub\u002Fstars\u002FCJackHwang\u002Fds2api.svg)\n![Forks](https:\u002F\u002Fimg.shields.io\u002Fgithub\u002Fforks\u002FCJackHwang\u002Fds2api.svg)\n[![Release](https:\u002F\u002Fimg.shields.io\u002Fgithub\u002Fv\u002Frelease\u002FCJackHwang\u002Fds2api?display_name=tag)](https:\u002F\u002Fgithub.com\u002FCJackHwang\u002Fds2api\u002Freleases)\n[![Docker](https:\u002F\u002Fimg.shields.io\u002Fbadge\u002Fdocker-ready-blue.svg)](docs\u002FDEPLOY.md)\n[![Deploy on Zeabur](https:\u002F\u002Fzeabur.com\u002Fbutton.svg)](https:\u002F\u002Fzeabur.com\u002Ftemplates\u002FL4CFHP)\n[![Deploy with Vercel](https:\u002F\u002Foss.gittoolsai.com\u002Fimages\u002FCJackHwang_ds2api_readme_a4c0f8073a9c.png)](https:\u002F\u002Fvercel.com\u002Fnew\u002Fclone?repository-url=https:\u002F\u002Fgithub.com\u002FCJackHwang\u002Fds2api)\n\n语言 \u002F Language: [中文](README.MD) | [English](README.en.md)\n\n将 DeepSeek Web 对话能力转换为 OpenAI、Claude 与 Gemini 兼容 API。后端为 **Go 全量实现**，前端为 React WebUI 管理台（源码在 `webui\u002F`，部署时自动构建到 `static\u002Fadmin`）。\n\n文档入口：[文档导航](docs\u002FREADME.md) \u002F [架构说明](docs\u002FARCHITECTURE.md) \u002F [接口文档](API.md)\n\n【感谢Linux.do社区及GitHub社区各位开发者对项目的支持与贡献】\n\n> **重要免责声明**\n>\n> 本仓库仅供学习、研究、个人实验和内部验证使用，不提供任何形式的商业授权、适用性保证或结果保证。\n>\n> 作者及仓库维护者不对因使用、修改、分发、部署或依赖本项目而产生的任何直接或间接损失、账号封禁、数据丢失、法律风险或第三方索赔负责。\n>\n> 请勿将本项目用于违反服务条款、协议、法律法规或平台规则的场景。商业使用前请自行确认 `LICENSE`、相关协议以及你是否获得了作者的书面许可。\n\n## 架构概览（摘要）\n\n```mermaid\nflowchart LR\n    Client[\"🖥️ 客户端 \u002F SDK\\n(OpenAI \u002F Claude \u002F Gemini)\"]\n    Upstream[\"☁️ DeepSeek API\"]\n\n    subgraph DS2API[\"DS2API 3.x（统一 OpenAI 内核）\"]\n        Router[\"chi Router + 中间件\\n(RequestID \u002F RealIP \u002F Logger \u002F Recoverer \u002F CORS)\"]\n\n        subgraph Adapters[\"协议适配层\"]\n            OA[\"OpenAI\\n\u002Fv1\u002F*\"]\n            CA[\"Claude\\n\u002Fanthropic\u002F* + \u002Fv1\u002Fmessages\"]\n            GA[\"Gemini\\n\u002Fv1beta\u002Fmodels\u002F* + \u002Fv1\u002Fmodels\u002F*\"]\n            Admin[\"Admin API\\n\u002Fadmin\u002F*\"]\n            WebUI[\"WebUI\\n\u002Fadmin（静态托管）\"]\n        end\n\n        subgraph Runtime[\"运行时核心能力\"]\n            Bridge[\"CLIProxy 转换桥\\n(多协议 \u003C-> OpenAI)\"]\n            OAEngine[\"OpenAI ChatCompletions\\n(统一工具调用与流式语义)\"]\n            Auth[\"Auth Resolver\\n(API key \u002F bearer \u002F x-goog-api-key)\"]\n            Pool[\"Account Pool + Queue\\n(并发槽位 + 等待队列)\"]\n            DSClient[\"DeepSeek Client\\n(Session \u002F Auth \u002F HTTP)\"]\n            Pow[\"PoW 实现\\n(纯 Go 毫秒级)\"]\n            Tool[\"Tool Sieve\\n(Go\u002FNode 语义对齐)\"]\n        end\n    end\n\n    Client --> Router\n    Router --> OA & CA & GA\n    Router --> Admin\n    Router --> WebUI\n\n    OA --> OAEngine\n    CA & GA --> Bridge\n    Bridge --> OAEngine\n    OAEngine --> Auth\n    OAEngine -.账号轮询.-> Pool\n    OAEngine -.工具调用解析.-> Tool\n    OAEngine -.PoW 计算.-> Pow\n    Auth --> DSClient\n    DSClient --> Upstream\n    Upstream --> DSClient\n    OAEngine --> Bridge\n    Bridge --> Client\n```\n\n详细架构拆分与目录职责见 [docs\u002FARCHITECTURE.md](docs\u002FARCHITECTURE.md)。\n\n- **后端**：Go（`cmd\u002Fds2api\u002F`、`api\u002F`、`internal\u002F`），不依赖 Python 运行时\n- **前端**：React 管理台（`webui\u002F`），运行时托管静态构建产物\n- **部署**：本地运行、Docker、Vercel Serverless、Linux systemd\n\n### 3.X 底层架构调整（相较旧版本）\n\n- **统一路由内核**：所有协议入口统一汇聚到 `internal\u002Fserver\u002Frouter.go`，并在同一路由树中注册 OpenAI \u002F Claude \u002F Gemini \u002F Admin \u002F WebUI 路由，避免多入口行为漂移。\n- **统一执行链路**：Claude \u002F Gemini 入口先经 `internal\u002Ftranslatorcliproxy` 做协议转换，再进入 `openai.ChatCompletions` 统一处理工具调用与流式语义，最后再转换回原协议响应。\n- **适配器分层更清晰**：`internal\u002Fadapter\u002F{claude,gemini}` 负责入口\u002F出口协议封装，`internal\u002Fadapter\u002Fopenai` 负责核心执行，DeepSeek 侧调用只保留在 OpenAI 内核中。\n- **Tool Calling 双运行时对齐**：Go 侧（`internal\u002Ftoolcall`）与 Vercel Node 侧（`internal\u002Fjs\u002Fhelpers\u002Fstream-tool-sieve`）保持一致的解析\u002F防泄漏语义，覆盖 JSON \u002F XML \u002F invoke \u002F text-kv 多风格输入。\n- **配置与运行时设置解耦**：静态配置（`config`）与运行时策略（`settings`）通过 Admin API 分离管理，支持热更新和密码轮换失效旧 JWT。\n- **流式能力升级**：`\u002Fv1\u002Fresponses` 与 `\u002Fv1\u002Fchat\u002Fcompletions` 共享更一致的工具调用增量输出策略，降低不同 SDK 下的行为差异。\n- **可观测与可运维增强**：`\u002Fhealthz`、`\u002Freadyz`、`\u002Fadmin\u002Fversion`、`\u002Fadmin\u002Fdev\u002Fcaptures` 形成排障闭环，便于发布后验证。\n\n## 核心能力\n\n| 能力 | 说明 |\n| --- | --- |\n| OpenAI 兼容 | `GET \u002Fv1\u002Fmodels`、`GET \u002Fv1\u002Fmodels\u002F{id}`、`POST \u002Fv1\u002Fchat\u002Fcompletions`、`POST \u002Fv1\u002Fresponses`、`GET \u002Fv1\u002Fresponses\u002F{response_id}`、`POST \u002Fv1\u002Fembeddings` |\n| Claude 兼容 | `GET \u002Fanthropic\u002Fv1\u002Fmodels`、`POST \u002Fanthropic\u002Fv1\u002Fmessages`、`POST \u002Fanthropic\u002Fv1\u002Fmessages\u002Fcount_tokens`（及快捷路径 `\u002Fv1\u002Fmessages`、`\u002Fmessages`） |\n| Gemini 兼容 | `POST \u002Fv1beta\u002Fmodels\u002F{model}:generateContent`、`POST \u002Fv1beta\u002Fmodels\u002F{model}:streamGenerateContent`（及 `\u002Fv1\u002Fmodels\u002F{model}:*` 路径） |\n| 多账号轮询 | 自动 token 刷新、邮箱\u002F手机号双登录方式 |\n| 并发队列控制 | 每账号 in-flight 上限 + 等待队列，动态计算建议并发值 |\n| DeepSeek PoW | 纯 Go 高性能实现（DeepSeekHashV1），毫秒级响应 |\n| Tool Calling | 防泄漏处理：非代码块高置信特征识别、`delta.tool_calls` 早发、结构化增量输出 |\n| Admin API | 配置管理、运行时设置热更新、账号测试 \u002F 批量测试、会话清理、导入导出、Vercel 同步、版本检查 |\n| WebUI 管理台 | `\u002Fadmin` 单页应用（中英文双语、深色模式） |\n| 运维探针 | `GET \u002Fhealthz`（存活）、`GET \u002Freadyz`（就绪） |\n\n## 平台兼容矩阵\n\n| 级别 | 平台 | 当前状态 |\n| --- | --- | --- |\n| P0 | Codex CLI\u002FSDK（`wire_api=chat` \u002F `wire_api=responses`） | ✅ |\n| P0 | OpenAI SDK（JS\u002FPython，chat + responses） | ✅ |\n| P0 | Vercel AI SDK（openai-compatible） | ✅ |\n| P0 | Anthropic SDK（messages） | ✅ |\n| P0 | Google Gemini SDK（generateContent） | ✅ |\n| P1 | LangChain \u002F LlamaIndex \u002F OpenWebUI（OpenAI 兼容接入） | ✅ |\n\n## 模型支持\n\n### OpenAI 接口（`GET \u002Fv1\u002Fmodels`）\n\n| 模型类型 | 模型 ID | thinking | search |\n| --- | --- | --- | --- |\n| default | `deepseek-chat` | ❌ | ❌ |\n| default | `deepseek-reasoner` | ✅ | ❌ |\n| default | `deepseek-chat-search` | ❌ | ✅ |\n| default | `deepseek-reasoner-search` | ✅ | ✅ |\n| expert | `deepseek-expert-chat` | ❌ | ❌ |\n| expert | `deepseek-expert-reasoner` | ✅ | ❌ |\n| expert | `deepseek-expert-chat-search` | ❌ | ✅ |\n| expert | `deepseek-expert-reasoner-search` | ✅ | ✅ |\n| vision | `deepseek-vision-chat` | ❌ | ❌ |\n| vision | `deepseek-vision-reasoner` | ✅ | ❌ |\n| vision | `deepseek-vision-chat-search` | ❌ | ✅ |\n| vision | `deepseek-vision-reasoner-search` | ✅ | ✅ |\n\n除原生模型外，也支持常见 alias 输入（如 `gpt-4o`、`gpt-5-codex`、`o3`、`claude-sonnet-4-5`、`gemini-2.5-pro` 等），但 `\u002Fv1\u002Fmodels` 返回的是规范化后的 DeepSeek 原生模型 ID。\n\n### Claude 接口（`GET \u002Fanthropic\u002Fv1\u002Fmodels`）\n\n| 当前常用模型 | 默认映射 |\n| --- | --- |\n| `claude-sonnet-4-5` | `deepseek-chat` |\n| `claude-haiku-4-5`（兼容 `claude-3-5-haiku-latest`） | `deepseek-chat` |\n| `claude-opus-4-6` | `deepseek-reasoner` |\n\n可通过配置中的 `claude_mapping` 或 `claude_model_mapping` 覆盖映射关系。\n`\u002Fanthropic\u002Fv1\u002Fmodels` 除上述当前主别名外，还会返回 Claude 4.x snapshots，以及 3.x \u002F 2.x \u002F 1.x 历史模型 ID 与常见 alias，便于旧客户端直接兼容。\n\n#### Claude Code 接入避坑（实测）\n\n- `ANTHROPIC_BASE_URL` 推荐直接指向 DS2API 根地址（例如 `http:\u002F\u002F127.0.0.1:5001`），Claude Code 会请求 `\u002Fv1\u002Fmessages?beta=true`。\n- `ANTHROPIC_API_KEY` 需要与 `config.json` 中 `keys` 一致；建议同时保留常规 key 与 `sk-ant-*` 形态 key，兼容不同客户端校验习惯。\n- 若系统设置了代理，建议对 DS2API 地址配置 `NO_PROXY=127.0.0.1,localhost,\u003C你的主机IP>`，避免本地回环请求被代理拦截。\n- 如遇“工具调用输出成文本、未执行”问题，请升级到包含 Claude 工具调用多格式解析（JSON\u002FXML\u002FANTML\u002Finvoke）的版本。\n\n### Gemini 接口\n\nGemini 适配器将模型名通过 `model_aliases` 或内置规则映射到 DeepSeek 原生模型，支持 `generateContent` 和 `streamGenerateContent` 两种调用方式，并完整支持 Tool Calling（`functionDeclarations` → `functionCall` 输出）。\n\n## 快速开始\n\n### 部署方式优先级建议\n\n推荐按以下顺序选择部署方式：\n\n1. **下载 Release 构建包运行**：最省事，产物已编译完成，最适合大多数用户。\n2. **Docker \u002F GHCR 镜像部署**：适合需要容器化、编排或云环境部署。\n3. **Vercel 部署**：适合已有 Vercel 环境且接受其平台约束的场景。\n4. **本地源码运行 \u002F 自行编译**：适合开发、调试或需要自行修改代码的场景。\n\n### 通用第一步（所有部署方式）\n\n把 `config.json` 作为唯一配置源（推荐做法）：\n\n```bash\ncp config.example.json config.json\n# 编辑 config.json\n```\n\n后续部署建议：\n- 本地运行：直接读取 `config.json`\n- Docker \u002F Vercel：由 `config.json` 生成 `DS2API_CONFIG_JSON`（Base64）注入环境变量，也可以直接写原始 JSON\n\n### 方式一：下载 Release 构建包\n\n每次发布 Release 时，GitHub Actions 会自动构建多平台二进制包：\n\n```bash\n# 下载对应平台的压缩包后\ntar -xzf ds2api_\u003Ctag>_linux_amd64.tar.gz\ncd ds2api_\u003Ctag>_linux_amd64\ncp config.example.json config.json\n# 编辑 config.json\n.\u002Fds2api\n```\n\n### 方式二：Docker 运行\n\n```bash\n# 1. 准备环境变量和配置文件\ncp .env.example .env\ncp config.example.json config.json\n\n# 2. 编辑 .env（至少设置 DS2API_ADMIN_KEY；如需修改宿主机端口，可额外设置 DS2API_HOST_PORT）\n#    DS2API_ADMIN_KEY=请替换为强密码\n\n# 3. 启动\ndocker-compose up -d\n\n# 4. 查看日志\ndocker-compose logs -f\n```\n\n默认 `docker-compose.yml` 会把宿主机 `6011` 映射到容器内的 `5001`。如果你希望直接对外暴露 `5001`，请设置 `DS2API_HOST_PORT=5001`（或者手动调整 `ports` 配置）。\n\n更新镜像：`docker-compose up -d --build`\n\n#### Zeabur 一键部署（Dockerfile）\n\n1. 点击上方 “Deploy on Zeabur” 按钮，一键部署。\n2. 部署完成后访问 `\u002Fadmin`，使用 Zeabur 环境变量\u002F模板指引中的 `DS2API_ADMIN_KEY` 登录。\n3. 在管理台导入\u002F编辑配置（会写入并持久化到 `\u002Fdata\u002Fconfig.json`）。\n\n说明：Zeabur 使用仓库内 `Dockerfile` 直接构建时，不需要额外传入 `BUILD_VERSION`；镜像会优先读取该构建参数，未提供时自动回退到仓库根目录的 `VERSION` 文件。\n\n### 方式三：Vercel 部署\n\n1. Fork 仓库到自己的 GitHub\n2. 在 Vercel 上导入项目\n3. 配置环境变量（最少设置 `DS2API_ADMIN_KEY`；推荐同时设置 `DS2API_CONFIG_JSON`）\n4. 部署\n\n建议先在仓库目录复制模板并填写：\n\n```bash\ncp config.example.json config.json\n# 编辑 config.json\n```\n\n推荐：先本地把 `config.json` 转成 Base64，再粘贴到 `DS2API_CONFIG_JSON`，避免 JSON 格式错误：\n\n```bash\nbase64 \u003C config.json | tr -d '\\n'\n```\n\n> **流式说明**：`\u002Fv1\u002Fchat\u002Fcompletions` 在 Vercel 上默认走 `api\u002Fchat-stream.js`（Node Runtime）以保证实时 SSE。鉴权、账号选择、会话\u002FPoW 准备仍由 Go 内部 prepare 接口完成；流式响应（含 `tools`）在 Node 侧执行与 Go 对齐的输出组装与防泄漏处理。\n\n详细部署说明请参阅 [部署指南](docs\u002FDEPLOY.md)。\n\n### 方式四：本地源码运行\n\n**前置要求**：Go 1.26+，Node.js `20.19+` 或 `22.12+`（仅在需要构建 WebUI 时）\n\n```bash\n# 1. 克隆仓库\ngit clone https:\u002F\u002Fgithub.com\u002FCJackHwang\u002Fds2api.git\ncd ds2api\n\n# 2. 配置\ncp config.example.json config.json\n# 编辑 config.json，填入你的 DeepSeek 账号信息和 API key\n\n# 3. 启动\ngo run .\u002Fcmd\u002Fds2api\n```\n\n默认本地访问地址：`http:\u002F\u002F127.0.0.1:5001`\n\n服务实际绑定：`0.0.0.0:5001`，因此同一局域网设备通常也可以通过你的内网 IP 访问。\n\n> **WebUI 自动构建**：本地首次启动时，若 `static\u002Fadmin` 不存在，会自动尝试执行 `npm ci`（仅在缺少依赖时）和 `npm run build -- --outDir static\u002Fadmin --emptyOutDir`（需要本机有 Node.js）。你也可以手动构建：`.\u002Fscripts\u002Fbuild-webui.sh`\n\n## 配置说明\n\n### `config.json` 示例\n\n```json\n{\n  \"keys\": [\"your-api-key-1\", \"your-api-key-2\"],\n  \"accounts\": [\n    {\n      \"email\": \"user@example.com\",\n      \"password\": \"your-password\"\n    },\n    {\n      \"mobile\": \"12345678901\",\n      \"password\": \"your-password\"\n    }\n  ],\n  \"model_aliases\": {\n    \"gpt-4o\": \"deepseek-chat\",\n    \"gpt-5-codex\": \"deepseek-reasoner\",\n    \"o3\": \"deepseek-reasoner\"\n  },\n  \"compat\": {\n    \"wide_input_strict_output\": true,\n    \"strip_reference_markers\": true\n  },\n  \"responses\": {\n    \"store_ttl_seconds\": 900\n  },\n  \"embeddings\": {\n    \"provider\": \"deterministic\"\n  },\n  \"claude_mapping\": {\n    \"fast\": \"deepseek-chat\",\n    \"slow\": \"deepseek-reasoner\"\n  },\n  \"admin\": {\n    \"jwt_expire_hours\": 24\n  },\n  \"runtime\": {\n    \"account_max_inflight\": 2,\n    \"account_max_queue\": 0,\n    \"global_max_inflight\": 0,\n    \"token_refresh_interval_hours\": 6\n  },\n  \"auto_delete\": {\n    \"mode\": \"none\"\n  }\n}\n```\n\n- `keys`：API 访问密钥列表，客户端通过 `Authorization: Bearer \u003Ckey>` 鉴权\n- `accounts`：DeepSeek 账号列表，支持 `email` 或 `mobile` 登录\n- `token`：配置文件中即使填写也会在加载时被清空（不会从 `config.json` 读取 token）；实际 token 仅在运行时内存中维护并自动刷新\n- `model_aliases`：常见模型名（如 GPT\u002FCodex\u002FClaude）到 DeepSeek 模型的映射\n- `compat.wide_input_strict_output`：建议保持 `true`（当前实现默认宽进严出）\n- `compat.strip_reference_markers`：建议保持 `true`，用于清理可见输出中的引用\u002F标记\n- `toolcall`：旧字段，当前实现已固定为特征匹配 + 高置信早发；即使保留在配置里也会被忽略\n- `responses.store_ttl_seconds`：`\u002Fv1\u002Fresponses\u002F{id}` 的内存缓存 TTL\n- `embeddings.provider`：embedding 提供方（当前内置 `deterministic\u002Fmock\u002Fbuiltin`）\n- `claude_mapping`：字典中 `fast`\u002F`slow` 后缀映射到对应 DeepSeek 模型（兼容读取 `claude_model_mapping`）\n- `admin`：管理后台设置（JWT 过期时间、密码哈希等），可通过 Admin Settings API 热更新\n- `runtime`：运行时参数（并发限制、队列大小、托管账号 token 刷新间隔），可通过 Admin Settings API 热更新；`account_max_queue=0`\u002F`global_max_inflight=0` 表示按推荐值自动计算，`token_refresh_interval_hours=6` 为默认强制重登间隔\n- `auto_delete.mode`：请求结束后如何清理 DeepSeek 远端聊天记录，支持 `none`（默认，不删除）、`single`（仅删除当前会话）、`all`（清空全部会话）；旧配置里的 `auto_delete.sessions=true` 仍会被视为 `all`\n\n### 环境变量\n\n| 变量 | 用途 | 默认值 |\n| --- | --- | --- |\n| `PORT` | 服务端口 | `5001` |\n| `LOG_LEVEL` | 日志级别 | `INFO`（可选：`DEBUG`\u002F`WARN`\u002F`ERROR`） |\n| `DS2API_ADMIN_KEY` | Admin 登录密钥 | `admin` |\n| `DS2API_JWT_SECRET` | Admin JWT 签名密钥 | 等同 `DS2API_ADMIN_KEY` |\n| `DS2API_JWT_EXPIRE_HOURS` | Admin JWT 过期小时数 | `24` |\n| `DS2API_CONFIG_PATH` | 配置文件路径 | `config.json` |\n| `DS2API_CONFIG_JSON` | 直接注入配置（JSON 或 Base64） | — |\n| `DS2API_ENV_WRITEBACK` | 环境变量模式下自动写回配置文件并切换文件模式（`1\u002Ftrue\u002Fyes\u002Fon`） | 关闭 |\n| `DS2API_STATIC_ADMIN_DIR` | 管理台静态文件目录 | `static\u002Fadmin` |\n| `DS2API_AUTO_BUILD_WEBUI` | 启动时自动构建 WebUI | 本地开启，Vercel 关闭 |\n| `DS2API_DEV_PACKET_CAPTURE` | 本地开发抓包开关（记录最近会话请求\u002F响应体） | 本地非 Vercel 默认开启 |\n| `DS2API_DEV_PACKET_CAPTURE_LIMIT` | 本地抓包保留条数（超出自动淘汰） | `20` |\n| `DS2API_DEV_PACKET_CAPTURE_MAX_BODY_BYTES` | 单条响应体最大记录字节数 | `5242880` |\n| `DS2API_ACCOUNT_MAX_INFLIGHT` | 每账号最大并发 in-flight 请求数 | `2` |\n| `DS2API_ACCOUNT_MAX_QUEUE` | 等待队列上限 | `recommended_concurrency` |\n| `DS2API_GLOBAL_MAX_INFLIGHT` | 全局最大 in-flight 请求数 | `recommended_concurrency` |\n| `DS2API_VERCEL_INTERNAL_SECRET` | Vercel 混合流式内部鉴权密钥 | 回退用 `DS2API_ADMIN_KEY` |\n| `DS2API_VERCEL_STREAM_LEASE_TTL_SECONDS` | 流式 lease 过期秒数 | `900` |\n| `VERCEL_TOKEN` | Vercel 同步 token | — |\n| `VERCEL_PROJECT_ID` | Vercel 项目 ID | — |\n| `VERCEL_TEAM_ID` | Vercel 团队 ID | — |\n| `DS2API_VERCEL_PROTECTION_BYPASS` | Vercel 部署保护绕过密钥（内部 Node→Go 调用） | — |\n\n> 提示：当检测到 `DS2API_CONFIG_JSON` 时，管理台会显示当前模式风险与自动持久化状态（含 `DS2API_CONFIG_PATH` 路径与模式切换说明）。\n\n## 鉴权模式\n\n调用业务接口（`\u002Fv1\u002F*`、`\u002Fanthropic\u002F*`、Gemini 路由）时支持两种模式：\n\n| 模式 | 说明 |\n| --- | --- |\n| **托管账号模式** | `Bearer` 或 `x-api-key` 传入 `config.keys` 中的 key，由服务自动轮询选择账号 |\n| **直通 token 模式** | 传入 token 不在 `config.keys` 中时，直接作为 DeepSeek token 使用 |\n\n可选请求头 `X-Ds2-Target-Account`：指定使用某个托管账号（值为 email 或 mobile）。\nGemini 路由还可以使用 `x-goog-api-key`，或在没有认证头时使用 `?key=` \u002F `?api_key=` 作为调用方凭据。\n\n## 并发模型\n\n```\n每账号可用并发 = DS2API_ACCOUNT_MAX_INFLIGHT（默认 2）\n建议并发值 = 账号数量 × 每账号并发上限\n等待队列上限 = DS2API_ACCOUNT_MAX_QUEUE（默认 = 建议并发值）\n429 阈值 = in-flight + 等待队列 ≈ 账号数量 × 4\n```\n\n- 当 in-flight 槽位满时，请求进入等待队列，**不会立即 429**\n- 超出总承载上限后才返回 `429 Too Many Requests`\n- `GET \u002Fadmin\u002Fqueue\u002Fstatus` 返回实时并发状态\n\n## Tool Call 适配\n\n当请求中带 `tools` 时，DS2API 会做防泄漏处理与结构化转译：\n\n1. 只在**非代码块上下文**启用执行型 toolcall 识别（代码块示例默认不触发）\n2. 解析层以 XML\u002FMarkup 为最高优先级，同时兼容 JSON \u002F ANTML \u002F invoke \u002F text-kv，并统一归一到内部工具调用结构\n3. `responses` 流式严格使用官方 item 生命周期事件（`response.output_item.*`、`response.content_part.*`、`response.function_call_arguments.*`）\n4. `responses` 支持并执行 `tool_choice`（`auto`\u002F`none`\u002F`required`\u002F强制函数）；`required` 违规时非流式返回 `422`，流式返回 `response.failed`\n5. 客户端请求哪种协议，就按该协议返回工具调用（OpenAI\u002FClaude\u002FGemini 各自原生结构）；模型侧优先约束输出规范 XML，再由兼容层转译\n\n> 说明：当前版本在 parser 层仍以“尽量解析成功”为优先，未启用基于 allow-list 的工具名硬拒绝。\n>\n> 想评估“把工具调用封装成 XML 再输入模型”的方案，可参考：`docs\u002Ftoolcall-semantics.md`。\n\n## 本地开发抓包工具\n\n用于定位「responses 思考流\u002F工具调用」等问题。开启后会自动记录最近 N 条 DeepSeek 对话上游请求体与响应体（默认 20 条，超出自动淘汰；单条响应体默认最多记录 5 MB）。\n\n启用示例：\n\n```bash\nDS2API_DEV_PACKET_CAPTURE=true \\\nDS2API_DEV_PACKET_CAPTURE_LIMIT=20 \\\ngo run .\u002Fcmd\u002Fds2api\n```\n\n查询\u002F清空（需 Admin JWT）：\n\n- `GET \u002Fadmin\u002Fdev\u002Fcaptures`：查看抓包列表（最新在前）\n- `DELETE \u002Fadmin\u002Fdev\u002Fcaptures`：清空抓包\n- `GET \u002Fadmin\u002Fdev\u002Fraw-samples\u002Fquery?q=关键词&limit=20`：按问题关键词查询当前内存抓包，并按 `chat_session_id` 归并 `completion + continue` 链\n- `POST \u002Fadmin\u002Fdev\u002Fraw-samples\u002Fsave`：把命中的某条抓包链保存为 `tests\u002Fraw_stream_samples\u002F\u003Csample-id>\u002F` 回放样本\n\n返回字段包含：\n\n- `request_body`：发送给 DeepSeek 的完整请求体\n- `response_body`：上游返回的原始流式内容拼接文本\n- `response_truncated`：是否触发单条大小截断\n\n保存接口支持用 `query`、`chain_key` 或 `capture_id` 选中目标。例如：\n\n```json\n{\"query\":\"广州天气\",\"sample_id\":\"gz-weather-from-memory\"}\n```\n\n## 文档索引\n\n| 文档 | 说明 |\n| --- | --- |\n| [API.md](API.md) \u002F [API.en.md](API.en.md) | API 接口文档（含请求\u002F响应示例） |\n| [DEPLOY.md](docs\u002FDEPLOY.md) \u002F [DEPLOY.en.md](docs\u002FDEPLOY.en.md) | 部署指南（本地\u002FDocker\u002FVercel\u002Fsystemd） |\n| [CONTRIBUTING.md](docs\u002FCONTRIBUTING.md) \u002F [CONTRIBUTING.en.md](docs\u002FCONTRIBUTING.en.md) | 贡献指南 |\n| [TESTING.md](docs\u002FTESTING.md) | 测试集使用指南 |\n\n## 测试\n\n```bash\n# 单元测试（Go + Node）\n.\u002Ftests\u002Fscripts\u002Frun-unit-all.sh\n\n# 一键端到端全链路测试（真实账号，生成完整请求\u002F响应日志）\n.\u002Ftests\u002Fscripts\u002Frun-live.sh\n\n# 或自定义参数\ngo run .\u002Fcmd\u002Fds2api-tests \\\n  --config config.json \\\n  --admin-key admin \\\n  --out artifacts\u002Ftestsuite \\\n  --timeout 120 \\\n  --retries 2\n```\n\n```bash\n# 发布前阻断门禁\n.\u002Ftests\u002Fscripts\u002Fcheck-stage6-manual-smoke.sh\n.\u002Ftests\u002Fscripts\u002Fcheck-refactor-line-gate.sh\n.\u002Ftests\u002Fscripts\u002Frun-unit-all.sh\nnpm ci --prefix webui && npm run build --prefix webui\n```\n\n## 测试\n\n详细测试指南请参阅 [docs\u002FTESTING.md](docs\u002FTESTING.md)。\n\n### 快速测试命令\n\n```bash\n# 运行所有单元测试\ngo test .\u002F...\n\n# 运行 tool calls 相关测试（调试工具调用问题）\ngo test -v -run 'TestParseToolCalls|TestRepair' .\u002Finternal\u002Ftoolcall\u002F\n\n# 运行端到端测试\n.\u002Ftests\u002Fscripts\u002Frun-live.sh\n```\n\n## Release 自动构建（GitHub Actions）\n\n工作流文件：`.github\u002Fworkflows\u002Frelease-artifacts.yml`\n\n- **触发条件**：仅在 GitHub Release `published` 时触发（普通 push 不会触发）\n- **构建产物**：多平台二进制包（`linux\u002Famd64`、`linux\u002Farm64`、`darwin\u002Famd64`、`darwin\u002Farm64`、`windows\u002Famd64`）+ `sha256sums.txt`\n- **容器镜像发布**：仅推送到 GHCR（`ghcr.io\u002Fcjackhwang\u002Fds2api`）\n- **每个压缩包包含**：`ds2api` 可执行文件、`static\u002Fadmin`、WASM 文件（同时支持内置 fallback）、配置示例、README、LICENSE\n\n## 免责声明\n\n本项目基于逆向方式实现，仅供学习、研究、个人实验和内部验证使用，不提供任何商业授权、稳定性保证或可用性保证。\n作者及仓库维护者不对因使用、修改、分发、部署或依赖本项目而产生的任何直接或间接损失、账号封禁、数据丢失、法律风险或第三方索赔负责。\n\n请勿将本项目用于违反服务条款、协议、法律法规或平台规则的场景。商业使用前请自行确认 `LICENSE`、相关协议以及你是否获得了作者的书面许可。\n","\u003Cp align=\"center\">\n  \u003Cimg src=\"webui\u002Fpublic\u002Fds2api-favicon.svg\" width=\"128\" height=\"128\" alt=\"DS2API icon\" \u002F>\n\u003C\u002Fp>\n\n# DS2API\n\n[![License](https:\u002F\u002Fimg.shields.io\u002Fgithub\u002Flicense\u002FCJackHwang\u002Fds2api.svg)](LICENSE)\n![Stars](https:\u002F\u002Fimg.shields.io\u002Fgithub\u002Fstars\u002FCJackHwang\u002Fds2api.svg)\n![Forks](https:\u002F\u002Fimg.shields.io\u002Fgithub\u002Fforks\u002FCJackHwang\u002Fds2api.svg)\n[![Release](https:\u002F\u002Fimg.shields.io\u002Fgithub\u002Fv\u002Frelease\u002FCJackHwang\u002Fds2api?display_name=tag)](https:\u002F\u002Fgithub.com\u002FCJackHwang\u002Fds2api\u002Freleases)\n[![Docker](https:\u002F\u002Fimg.shields.io\u002Fbadge\u002Fdocker-ready-blue.svg)](docs\u002FDEPLOY.md)\n[![Deploy on Zeabur](https:\u002F\u002Fzeabur.com\u002Fbutton.svg)](https:\u002F\u002Fzeabur.com\u002Ftemplates\u002FL4CFHP)\n[![Deploy with Vercel](https:\u002F\u002Foss.gittoolsai.com\u002Fimages\u002FCJackHwang_ds2api_readme_a4c0f8073a9c.png)](https:\u002F\u002Fvercel.com\u002Fnew\u002Fclone?repository-url=https:\u002F\u002Fgithub.com\u002FCJackHwang\u002Fds2api)\n\n语言 \u002F Language: [中文](README.MD) | [English](README.en.md)\n\n将 DeepSeek Web 对话能力转换为 OpenAI、Claude 与 Gemini 兼容 API。后端为 **Go 全量实现**，前端为 React WebUI 管理台（源码在 `webui\u002F`，部署时自动构建到 `static\u002Fadmin`）。\n\n文档入口：[文档导航](docs\u002FREADME.md) \u002F [架构说明](docs\u002FARCHITECTURE.md) \u002F [接口文档](API.md)\n\n【感谢Linux.do社区及GitHub社区各位开发者对项目的支持与贡献】\n\n> **重要免责声明**\n>\n> 本仓库仅供学习、研究、个人实验和内部验证使用，不提供任何形式的商业授权、适用性保证或结果保证。\n>\n> 作者及仓库维护者不对因使用、修改、分发、部署或依赖本项目而产生的任何直接或间接损失、账号封禁、数据丢失、法律风险或第三方索赔负责。\n>\n> 请勿将本项目用于违反服务条款、协议、法律法规或平台规则的场景。商业使用前请自行确认 `LICENSE`、相关协议以及你是否获得了作者的书面许可。\n\n## 架构概览（摘要）\n\n```mermaid\nflowchart LR\n    Client[\"🖥️ 客户端 \u002F SDK\\n(OpenAI \u002F Claude \u002F Gemini)\"]\n    Upstream[\"☁️ DeepSeek API\"]\n\n    subgraph DS2API[\"DS2API 3.x（统一 OpenAI 内核）\"]\n        Router[\"chi Router + 中间件\\n(RequestID \u002F RealIP \u002F Logger \u002F Recoverer \u002F CORS)\"]\n\n        subgraph Adapters[\"协议适配层\"]\n            OA[\"OpenAI\\n\u002Fv1\u002F*\"]\n            CA[\"Claude\\n\u002Fanthropic\u002F* + \u002Fv1\u002Fmessages\"]\n            GA[\"Gemini\\n\u002Fv1beta\u002Fmodels\u002F* + \u002Fv1\u002Fmodels\u002F*\"]\n            Admin[\"Admin API\\n\u002Fadmin\u002F*\"]\n            WebUI[\"WebUI\\n\u002Fadmin（静态托管）\"]\n        end\n\n        subgraph Runtime[\"运行时核心能力\"]\n            Bridge[\"CLIProxy 转换桥\\n(多协议 \u003C-> OpenAI)\"]\n            OAEngine[\"OpenAI ChatCompletions\\n(统一工具调用与流式语义)\"]\n            Auth[\"Auth Resolver\\n(API key \u002F bearer \u002F x-goog-api-key)\"]\n            Pool[\"Account Pool + Queue\\n(并发槽位 + 等待队列)\"]\n            DSClient[\"DeepSeek Client\\n(Session \u002F Auth \u002F HTTP)\"]\n            Pow[\"PoW 实现\\n(纯 Go 毫秒级)\"]\n            Tool[\"Tool Sieve\\n(Go\u002FNode 语义对齐)\"]\n        end\n    end\n\n    Client --> Router\n    Router --> OA & CA & GA\n    Router --> Admin\n    Router --> WebUI\n\n    OA --> OAEngine\n    CA & GA --> Bridge\n    Bridge --> OAEngine\n    OAEngine --> Auth\n    OAEngine -.账号轮询.-> Pool\n    OAEngine -.工具调用解析.-> Tool\n    OAEngine -.PoW 计算.-> Pow\n    Auth --> DSClient\n    DSClient --> Upstream\n    Upstream --> DSClient\n    OAEngine --> Bridge\n    Bridge --> Client\n```\n\n详细架构拆分与目录职责见 [docs\u002FARCHITECTURE.md](docs\u002FARCHITECTURE.md)。\n\n- **后端**：Go（`cmd\u002Fds2api\u002F`、`api\u002F`、`internal\u002F`），不依赖 Python 运行时\n- **前端**：React 管理台（`webui\u002F`），运行时托管静态构建产物\n- **部署**：本地运行、Docker、Vercel Serverless、Linux systemd\n\n### 3.X 底层架构调整（相较旧版本）\n\n- **统一路由内核**：所有协议入口统一汇聚到 `internal\u002Fserver\u002Frouter.go`，并在同一路由树中注册 OpenAI \u002F Claude \u002F Gemini \u002F Admin \u002F WebUI 路由，避免多入口行为漂移。\n- **统一执行链路**：Claude \u002F Gemini 入口先经 `internal\u002Ftranslatorcliproxy` 做协议转换，再进入 `openai.ChatCompletions` 统一处理工具调用与流式语义，最后再转换回原协议响应。\n- **适配器分层更清晰**：`internal\u002Fadapter\u002F{claude,gemini}` 负责入口\u002F出口协议封装，`internal\u002Fadapter\u002Fopenai` 负责核心执行，DeepSeek 侧调用只保留在 OpenAI 内核中。\n- **Tool Calling 双运行时对齐**：Go 侧（`internal\u002Ftoolcall`）与 Vercel Node 侧（`internal\u002Fjs\u002Fhelpers\u002Fstream-tool-sieve`）保持一致的解析\u002F防泄漏语义，覆盖 JSON \u002F XML \u002F invoke \u002F text-kv 多风格输入。\n- **配置与运行时设置解耦**：静态配置（`config`）与运行时策略（`settings`）通过 Admin API 分离管理，支持热更新和密码轮换失效旧 JWT。\n- **流式能力升级**：`\u002Fv1\u002Fresponses` 与 `\u002Fv1\u002Fchat\u002Fcompletions` 共享更一致的工具调用增量输出策略，降低不同 SDK 下的行为差异。\n- **可观测与可运维增强**：`\u002Fhealthz`、`\u002Freadyz`、`\u002Fadmin\u002Fversion`、`\u002Fadmin\u002Fdev\u002Fcaptures` 形成排障闭环，便于发布后验证。\n\n## 核心能力\n\n| 能力 | 说明 |\n| --- | --- |\n| OpenAI 兼容 | `GET \u002Fv1\u002Fmodels`、`GET \u002Fv1\u002Fmodels\u002F{id}`、`POST \u002Fv1\u002Fchat\u002Fcompletions`、`POST \u002Fv1\u002Fresponses`、`GET \u002Fv1\u002Fresponses\u002F{response_id}`、`POST \u002Fv1\u002Fembeddings` |\n| Claude 兼容 | `GET \u002Fanthropic\u002Fv1\u002Fmodels`、`POST \u002Fanthropic\u002Fv1\u002Fmessages`、`POST \u002Fanthropic\u002Fv1\u002Fmessages\u002Fcount_tokens`（及快捷路径 `\u002Fv1\u002Fmessages`、`\u002Fmessages`） |\n| Gemini 兼容 | `POST \u002Fv1beta\u002Fmodels\u002F{model}:generateContent`、`POST \u002Fv1beta\u002Fmodels\u002F{model}:streamGenerateContent`（及 `\u002Fv1\u002Fmodels\u002F{model}:*` 路径） |\n| 多账号轮询 | 自动 token 刷新、邮箱\u002F手机号双登录方式 |\n| 并发队列控制 | 每账号 in-flight 上限 + 等待队列，动态计算建议并发值 |\n| DeepSeek PoW | 纯 Go 高性能实现（DeepSeekHashV1），毫秒级响应 |\n| Tool Calling | 防泄漏处理：非代码块高置信特征识别、`delta.tool_calls` 早发、结构化增量输出 |\n| Admin API | 配置管理、运行时设置热更新、账号测试 \u002F 批量测试、会话清理、导入导出、Vercel 同步、版本检查 |\n| WebUI 管理台 | `\u002Fadmin` 单页应用（中英文双语、深色模式） |\n| 运维探针 | `GET \u002Fhealthz`（存活）、`GET \u002Freadyz`（就绪） |\n\n## 平台兼容矩阵\n\n| 级别 | 平台 | 当前状态 |\n| --- | --- | --- |\n| P0 | Codex CLI\u002FSDK（`wire_api=chat` \u002F `wire_api=responses`） | ✅ |\n| P0 | OpenAI SDK（JS\u002FPython，chat + responses） | ✅ |\n| P0 | Vercel AI SDK（openai-compatible） | ✅ |\n| P0 | Anthropic SDK（messages） | ✅ |\n| P0 | Google Gemini SDK（generateContent） | ✅ |\n| P1 | LangChain \u002F LlamaIndex \u002F OpenWebUI（OpenAI 兼容接入） | ✅ |\n\n## 模型支持\n\n### OpenAI 接口（`GET \u002Fv1\u002Fmodels`）\n\n| 模型类型 | 模型 ID | thinking | search |\n| --- | --- | --- | --- |\n| default | `deepseek-chat` | ❌ | ❌ |\n| default | `deepseek-reasoner` | ✅ | ❌ |\n| default | `deepseek-chat-search` | ❌ | ✅ |\n| default | `deepseek-reasoner-search` | ✅ | ✅ |\n| expert | `deepseek-expert-chat` | ❌ | ❌ |\n| expert | `deepseek-expert-reasoner` | ✅ | ❌ |\n| expert | `deepseek-expert-chat-search` | ❌ | ✅ |\n| expert | `deepseek-expert-reasoner-search` | ✅ | ✅ |\n| vision | `deepseek-vision-chat` | ❌ | ❌ |\n| vision | `deepseek-vision-reasoner` | ✅ | ❌ |\n| vision | `deepseek-vision-chat-search` | ❌ | ✅ |\n| vision | `deepseek-vision-reasoner-search` | ✅ | ✅ |\n\n除原生模型外，也支持常见 alias 输入（如 `gpt-4o`、`gpt-5-codex`、`o3`、`claude-sonnet-4-5`、`gemini-2.5-pro` 等），但 `\u002Fv1\u002Fmodels` 返回的是规范化后的 DeepSeek 原生模型 ID。\n\n### Claude 接口（`GET \u002Fanthropic\u002Fv1\u002Fmodels`）\n\n| 当前常用模型 | 默认映射 |\n| --- | --- |\n| `claude-sonnet-4-5` | `deepseek-chat` |\n| `claude-haiku-4-5`（兼容 `claude-3-5-haiku-latest`） | `deepseek-chat` |\n| `claude-opus-4-6` | `deepseek-reasoner` |\n\n可通过配置中的 `claude_mapping` 或 `claude_model_mapping` 覆盖映射关系。\n`\u002Fanthropic\u002Fv1\u002Fmodels` 除上述当前主别名外，还会返回 Claude 4.x snapshots，以及 3.x \u002F 2.x \u002F 1.x 历史模型 ID 与常见 alias，便于旧客户端直接兼容。\n\n#### Claude Code 接入避坑（实测）\n\n- `ANTHROPIC_BASE_URL` 推荐直接指向 DS2API 根地址（例如 `http:\u002F\u002F127.0.0.1:5001`），Claude Code 会请求 `\u002Fv1\u002Fmessages?beta=true`。\n- `ANTHROPIC_API_KEY` 需要与 `config.json` 中 `keys` 一致；建议同时保留常规 key 与 `sk-ant-*` 形态 key，兼容不同客户端校验习惯。\n- 若系统设置了代理，建议对 DS2API 地址配置 `NO_PROXY=127.0.0.1,localhost,\u003C你的主机IP>`，避免本地回环请求被代理拦截。\n- 如遇“工具调用输出成文本、未执行”问题，请升级到包含 Claude 工具调用多格式解析（JSON\u002FXML\u002FANTML\u002Finvoke）的版本。\n\n### Gemini 接口\n\nGemini 适配器将模型名通过 `model_aliases` 或内置规则映射到 DeepSeek 原生模型，支持 `generateContent` 和 `streamGenerateContent` 两种调用方式，并完整支持 Tool Calling（`functionDeclarations` → `functionCall` 输出）。\n\n## 快速开始\n\n### 部署方式优先级建议\n\n推荐按以下顺序选择部署方式：\n\n1. **下载 Release 构建包运行**：最省事，产物已编译完成，最适合大多数用户。\n2. **Docker \u002F GHCR 镜像部署**：适合需要容器化、编排或云环境部署。\n3. **Vercel 部署**：适合已有 Vercel 环境且接受其平台约束的场景。\n4. **本地源码运行 \u002F 自行编译**：适合开发、调试或需要自行修改代码的场景。\n\n### 通用第一步（所有部署方式）\n\n把 `config.json` 作为唯一配置源（推荐做法）：\n\n```bash\ncp config.example.json config.json\n# 编辑 config.json\n```\n\n后续部署建议：\n- 本地运行：直接读取 `config.json`\n- Docker \u002F Vercel：由 `config.json` 生成 `DS2API_CONFIG_JSON`（Base64）注入环境变量，也可以直接写原始 JSON\n\n### 方式一：下载 Release 构建包\n\n每次发布 Release 时，GitHub Actions 会自动构建多平台二进制包：\n\n```bash\n# 下载对应平台的压缩包后\ntar -xzf ds2api_\u003Ctag>_linux_amd64.tar.gz\ncd ds2api_\u003Ctag>_linux_amd64\ncp config.example.json config.json\n# 编辑 config.json\n.\u002Fds2api\n```\n\n### 方式二：Docker 运行\n\n```bash\n# 1. 准备环境变量和配置文件\ncp .env.example .env\ncp config.example.json config.json\n\n# 2. 编辑 .env（至少设置 DS2API_ADMIN_KEY；如需修改宿主机端口，可额外设置 DS2API_HOST_PORT）\n#    DS2API_ADMIN_KEY=请替换为强密码\n\n# 3. 启动\ndocker-compose up -d\n\n# 4. 查看日志\ndocker-compose logs -f\n```\n\n默认 `docker-compose.yml` 会把宿主机 `6011` 映射到容器内的 `5001`。如果你希望直接对外暴露 `5001`，请设置 `DS2API_HOST_PORT=5001`（或者手动调整 `ports` 配置）。\n\n更新镜像：`docker-compose up -d --build`\n\n#### Zeabur 一键部署（Dockerfile）\n\n1. 点击上方 “Deploy on Zeabur” 按钮，一键部署。\n2. 部署完成后访问 `\u002Fadmin`，使用 Zeabur 环境变量\u002F模板指引中的 `DS2API_ADMIN_KEY` 登录。\n3. 在管理台导入\u002F编辑配置（会写入并持久化到 `\u002Fdata\u002Fconfig.json`）。\n\n说明：Zeabur 使用仓库内 `Dockerfile` 直接构建时，不需要额外传入 `BUILD_VERSION`；镜像会优先读取该构建参数，未提供时自动回退到仓库根目录的 `VERSION` 文件。\n\n### 方式三：Vercel 部署\n\n1. Fork 仓库到自己的 GitHub\n2. 在 Vercel 上导入项目\n3. 配置环境变量（最少设置 `DS2API_ADMIN_KEY`；推荐同时设置 `DS2API_CONFIG_JSON`）\n4. 部署\n\n建议先在仓库目录复制模板并填写：\n\n```bash\ncp config.example.json config.json\n# 编辑 config.json\n```\n\n推荐：先本地把 `config.json` 转成 Base64，再粘贴到 `DS2API_CONFIG_JSON`，避免 JSON 格式错误：\n\n```bash\nbase64 \u003C config.json | tr -d '\\n'\n```\n\n> **流式说明**：`\u002Fv1\u002Fchat\u002Fcompletions` 在 Vercel 上默认走 `api\u002Fchat-stream.js`（Node Runtime）以保证实时 SSE。鉴权、账号选择、会话\u002FPoW 准备仍由 Go 内部 prepare 接口完成；流式响应（含 `tools`）在 Node 侧执行与 Go 对齐的输出组装与防泄漏处理。\n\n详细部署说明请参阅 [部署指南](docs\u002FDEPLOY.md)。\n\n### 方式四：本地源码运行\n\n**前置要求**：Go 1.26+，Node.js `20.19+` 或 `22.12+`（仅在需要构建 WebUI 时）\n\n```bash\n# 1. 克隆仓库\ngit clone https:\u002F\u002Fgithub.com\u002FCJackHwang\u002Fds2api.git\ncd ds2api\n\n# 2. 配置\ncp config.example.json config.json\n# 编辑 config.json，填入你的 DeepSeek 账号信息和 API key\n\n# 3. 启动\ngo run .\u002Fcmd\u002Fds2api\n```\n\n默认本地访问地址：`http:\u002F\u002F127.0.0.1:5001`\n\n服务实际绑定：`0.0.0.0:5001`，因此同一局域网设备通常也可以通过你的内网 IP 访问。\n\n> **WebUI 自动构建**：本地首次启动时，若 `static\u002Fadmin` 不存在，会自动尝试执行 `npm ci`（仅在缺少依赖时）和 `npm run build -- --outDir static\u002Fadmin --emptyOutDir`（需要本机有 Node.js）。你也可以手动构建：`.\u002Fscripts\u002Fbuild-webui.sh`\n\n## 配置说明\n\n### `config.json` 示例\n\n```json\n{\n  \"keys\": [\"your-api-key-1\", \"your-api-key-2\"],\n  \"accounts\": [\n    {\n      \"email\": \"user@example.com\",\n      \"password\": \"your-password\"\n    },\n    {\n      \"mobile\": \"12345678901\",\n      \"password\": \"your-password\"\n    }\n  ],\n  \"model_aliases\": {\n    \"gpt-4o\": \"deepseek-chat\",\n    \"gpt-5-codex\": \"deepseek-reasoner\",\n    \"o3\": \"deepseek-reasoner\"\n  },\n  \"compat\": {\n    \"wide_input_strict_output\": true,\n    \"strip_reference_markers\": true\n  },\n  \"responses\": {\n    \"store_ttl_seconds\": 900\n  },\n  \"embeddings\": {\n    \"provider\": \"deterministic\"\n  },\n  \"claude_mapping\": {\n    \"fast\": \"deepseek-chat\",\n    \"slow\": \"deepseek-reasoner\"\n  },\n  \"admin\": {\n    \"jwt_expire_hours\": 24\n  },\n  \"runtime\": {\n    \"account_max_inflight\": 2,\n    \"account_max_queue\": 0,\n    \"global_max_inflight\": 0,\n    \"token_refresh_interval_hours\": 6\n  },\n  \"auto_delete\": {\n    \"mode\": \"none\"\n  }\n}\n```\n\n- `keys`：API 访问密钥列表，客户端通过 `Authorization: Bearer \u003Ckey>` 鉴权\n- `accounts`：DeepSeek 账号列表，支持 `email` 或 `mobile` 登录\n- `token`：配置文件中即使填写也会在加载时被清空（不会从 `config.json` 读取 token）；实际 token 仅在运行时内存中维护并自动刷新\n- `model_aliases`：常见模型名（如 GPT\u002FCodex\u002FClaude）到 DeepSeek 模型的映射\n- `compat.wide_input_strict_output`：建议保持 `true`（当前实现默认宽进严出）\n- `compat.strip_reference_markers`：建议保持 `true`，用于清理可见输出中的引用\u002F标记\n- `toolcall`：旧字段，当前实现已固定为特征匹配 + 高置信早发；即使保留在配置里也会被忽略\n- `responses.store_ttl_seconds`：`\u002Fv1\u002Fresponses\u002F{id}` 的内存缓存 TTL\n- `embeddings.provider`：embedding 提供方（当前内置 `deterministic\u002Fmock\u002Fbuiltin`）\n- `claude_mapping`：字典中 `fast`\u002F`slow` 后缀映射到对应 DeepSeek 模型（兼容读取 `claude_model_mapping`）\n- `admin`：管理后台设置（JWT 过期时间、密码哈希等），可通过 Admin Settings API 热更新\n- `runtime`：运行时参数（并发限制、队列大小、托管账号 token 刷新间隔），可通过 Admin Settings API 热更新；`account_max_queue=0`\u002F`global_max_inflight=0` 表示按推荐值自动计算，`token_refresh_interval_hours=6` 为默认强制重登间隔\n- `auto_delete.mode`：请求结束后如何清理 DeepSeek 进程池中的聊天记录，支持 `none`（默认，不删除）、`single`（仅删除当前会话）、`all`（清空全部会话）；旧配置里的 `auto_delete.sessions=true` 仍会被视为 `all`\n\n### 环境变量\n\n| 变量 | 用途 | 默认值 |\n| --- | --- | --- |\n| `PORT` | 服务端口 | `5001` |\n| `LOG_LEVEL` | 日志级别 | `INFO`（可选：`DEBUG`\u002F`WARN`\u002F`ERROR`） |\n| `DS2API_ADMIN_KEY` | Admin 登录密钥 | `admin` |\n| `DS2API_JWT_SECRET` | Admin JWT 签名密钥 | 等同 `DS2API_ADMIN_KEY` |\n| `DS2API_JWT_EXPIRE_HOURS` | Admin JWT 过期小时数 | `24` |\n| `DS2API_CONFIG_PATH` | 配置文件路径 | `config.json` |\n| `DS2API_CONFIG_JSON` | 直接注入配置（JSON 或 Base64） | — |\n| `DS2API_ENV_WRITEBACK` | 环境变量模式下自动写回配置文件并切换文件模式（`1\u002Ftrue\u002Fyes\u002Fon`） | 关闭 |\n| `DS2API_STATIC_ADMIN_DIR` | 管理台静态文件目录 | `static\u002Fadmin` |\n| `DS2API_AUTO_BUILD_WEBUI` | 启动时自动构建 WebUI | 本地开启，Vercel 关闭 |\n| `DS2API_DEV_PACKET_CAPTURE` | 本地开发抓包开关（记录最近会话请求\u002F响应体） | 本地非 Vercel 默认开启 |\n| `DS2API_DEV_PACKET_CAPTURE_LIMIT` | 本地抓包保留条数（超出自动淘汰） | `20` |\n| `DS2API_DEV_PACKET_CAPTURE_MAX_BODY_BYTES` | 单条响应体最大记录字节数 | `5242880` |\n| `DS2API_ACCOUNT_MAX_INFLIGHT` | 每账号最大并发 in-flight 请求数 | `2` |\n| `DS2API_ACCOUNT_MAX_QUEUE` | 等待队列上限 | `recommended_concurrency` |\n| `DS2API_GLOBAL_MAX_INFLIGHT` | 全局最大 in-flight 请求数 | `recommended_concurrency` |\n| `DS2API_VERCEL_INTERNAL_SECRET` | Vercel 混合流式内部鉴权密钥 | 回退用 `DS2API_ADMIN_KEY` |\n| `DS2API_VERCEL_STREAM_LEASE_TTL_SECONDS` | 流式 lease 过期秒数 | `900` |\n| `VERCEL_TOKEN` | Vercel 同步 token | — |\n| `VERCEL_PROJECT_ID` | Vercel 项目 ID | — |\n| `VERCEL_TEAM_ID` | Vercel 团队 ID | — |\n| `DS2API_VERCEL_PROTECTION_BYPASS` | Vercel 部署保护绕过密钥（内部 Node→Go 调用） | — |\n\n> 提示：当检测到 `DS2API_CONFIG_JSON` 时，管理台会显示当前模式风险与自动持久化状态（含 `DS2API_CONFIG_PATH` 路径与模式切换说明）。\n\n## 鉴权模式\n\n调用业务接口（`\u002Fv1\u002F*`、`\u002Fanthropic\u002F*`、Gemini 路由）时支持两种模式：\n\n| 模式 | 说明 |\n| --- | --- |\n| **托管账号模式** | `Bearer` 或 `x-api-key` 传入 `config.keys` 中的 key，由服务自动轮询选择账号 |\n| **直通 token 模式** | 传入 token 不在 `config.keys` 中时，直接作为 DeepSeek token 使用 |\n\n可选请求头 `X-Ds2-Target-Account`：指定使用某个托管账号（值为 email 或 mobile）。\nGemini 路由还可以使用 `x-goog-api-key`，或在没有认证头时使用 `?key=` \u002F `?api_key=` 作为调用方凭据。\n\n## 并发模型\n\n```\n每账号可用并发 = DS2API_ACCOUNT_MAX_INFLIGHT（默认 2）\n建议并发值 = 账号数量 × 每账号并发上限\n等待队列上限 = DS2API_ACCOUNT_MAX_QUEUE（默认 = 建议并发值）\n429 阜值 = in-flight + 等待队列 ≈ 账号数量 × 4\n```\n\n- 当 in-flight 槽位满时，请求进入等待队列，**不会立即 429**\n- 超出总承载上限后才返回 `429 Too Many Requests`\n- `GET \u002Fadmin\u002Fqueue\u002Fstatus` 返回实时并发状态\n\n## Tool Call 适配\n\n当请求中带 `tools` 时，DS2API 会做防泄漏处理与结构化转译：\n\n1. 只在**非代码块上下文**启用执行型 toolcall 识别（代码块示例默认不触发）\n2. 解析层以 XML\u002FMarkup 为最高优先级，同时兼容 JSON \u002F ANTML \u002F invoke \u002F text-kv，并统一归一到内部工具调用结构\n3. `responses` 流式严格使用官方 item 生命周期事件（`response.output_item.*`、`response.content_part.*`、`response.function_call_arguments.*`）\n4. `responses` 支持并执行 `tool_choice`（`auto`\u002F`none`\u002F`required`\u002F强制函数）；`required` 违规时非流式返回 `422`，流式返回 `response.failed`\n5. 客户ient请求哪种协议，就按该协议返回工具调用（OpenAI\u002FClaude\u002FGemini 各自原生结构）；模型侧优先约束输出规范 XML，再由兼容层转译\n\n> 说明：当前版本在 parser 层仍以“尽量解析成功”为优先，未启用基于 allow-list 的工具名硬拒绝。\n>\n> 想评估“把工具调用封装成 XML 再输入模型”的方案，可参考：`docs\u002Ftoolcall-semantics.md`。\n\n## 本地开发抓包工具\n\n用于定位「responses 思考流\u002F工具调用」等问题。开启后会自动记录最近 N 条 DeepSeek 对话上游请求体与响应体（默认 20 条，超出自动淘汰；单条响应体默认最多记录 5 MB）。\n\n启用示例：\n\n```bash\nDS2API_DEV_PACKET_CAPTURE=true \\\nDS2API_DEV_PACKET_CAPTURE_LIMIT=20 \\\ngo run .\u002Fcmd\u002Fds2api\n```\n\n查询\u002F清空（需 Admin JWT）：\n\n- `GET \u002Fadmin\u002Fdev\u002Fcaptures`：查看抓包列表（最新在前）\n- `DELETE \u002Fadmin\u002Fdev\u002Fcaptures`：清空抓包\n- `GET \u002Fadmin\u002Fdev\u002Fraw-samples\u002Fquery?q=关键词&limit=20`：按问题关键词查询当前内存抓包，并按 `chat_session_id` 归并 `completion + continue` 链\n- `POST \u002Fadmin\u002Fdev\u002Fraw-samples\u002Fsave`：把命中的某条抓包链保存为 `tests\u002Fraw_stream_samples\u002F\u003Csample-id>\u002F` 回放样本\n\n返回字段包含：\n\n- `request_body`：发送给 DeepSeek 的完整请求体\n- `response_body`：上游返回的原始流式内容拼接文本\n- `response_truncated`：是否触发单条大小截断\n\n保存接口支持用 `query`、`chain_key` 或 `capture_id` 选中目标。例如：\n\n```json\n{\"query\":\"广州天气\",\"sample_id\":\"gz-weather-from-memory\"}\n```\n\n## 文档索引\n\n| 文档 | 说明 |\n| --- | --- |\n| [API.md](API.md) \u002F [API.en.md](API.en.md) | API 接口文档（含请求\u002F响应示例） |\n| [DEPLOY.md](docs\u002FDEPLOY.md) \u002F [DEPLOY.en.md](docs\u002FDEPLOY.en.md) | 部署指南（本地\u002FDocker\u002FVercel\u002Fsystemd） |\n| [CONTRIBUTING.md](docs\u002FCONTRIBUTING.md) \u002F [CONTRIBUTING.en.md](docs\u002FCONTRIBUTING.en.md) | 贡献指南 |\n| [TESTING.md](docs\u002FTESTING.md) | 测试集使用指南 |\n\n## 测试\n\n```bash\n# 单元测试（Go + Node）\n.\u002Ftests\u002Fscripts\u002Frun-unit-all.sh\n\n# 一键端到端全链路测试（真实账号，生成完整请求\u002F响应日志）\n.\u002Ftests\u002Fscripts\u002Frun-live.sh\n\n# 或自定义参数\ngo run .\u002Fcmd\u002Fds2api-tests \\\n  --config config.json \\\n  --admin-key admin \\\n  --out artifacts\u002Ftestsuite \\\n  --timeout 120 \\\n  --retries 2\n```\n\n```bash\n# 发布前阻断门禁\n.\u002Ftests\u002Fscripts\u002Fcheck-stage6-manual-smoke.sh\n.\u002Ftests\u002Fscripts\u002Fcheck-refactor-line-gate.sh\n.\u002Ftests\u002Fscripts\u002Frun-unit-all.sh\nnpm ci --prefix webui && npm run build --prefix webui\n```\n\n## 测试\n\n详细测试指南请参阅 [docs\u002FTESTING.md](docs\u002FTESTING.md)。\n\n### 快速测试命令\n\n```bash\n# 运行所有单元测试\ngo test .\u002F...\n\n# 运行 tool calls 相关测试（调试工具调用问题）\ngo test -v -run 'TestParseToolCalls|TestRepair' .\u002Finternal\u002Ftoolcall\u002F\n\n# 运行端到端测试\n.\u002Ftests\u002Fscripts\u002Frun-live.sh\n```\n\n## Release 自动构建（GitHub Actions）\n\n工作流文件：`.github\u002Fworkflows\u002Frelease-artifacts.yml`\n\n- **触发条件**：仅在 GitHub Release `published` 时触发（普通 push 不会触发）\n- **构建产物**：多平台二进制包（`linux\u002Famd64`、`linux\u002Farm64`、`darwin\u002Famd64`、`darwin\u002Farm64`、`windows\u002Famd64`）+ `sha256sums.txt`\n- **容器镜像发布**：仅推送到 GHCR（`ghcr.io\u002Fcjackhwang\u002Fds2api`）\n- **每个压缩包包含**：`ds2api` 可执行文件、`static\u002Fadmin`、WASM 文件（同时支持内置 fallback）、配置示例、README、LICENSE\n\n## 免责声明\n\n本项目基于逆向方式实现，仅供学习、研究、个人实验和内部验证使用，不提供任何商业授权、稳定性保证或可用性保证。\n作者及仓库维护者不对因使用、修改、分发、部署或依赖本项目而产生的任何直接或间接损失、账号封禁、数据丢失、法律风险或第三方索赔负责。\n\n请勿将本项目用于违反服务条款、协议、法律法规或平台规则的场景。商业使用前请自行确认 `LICENSE`、相关协议以及你是否获得了作者的书面许可。","# DS2API 快速上手指南\n\nDS2API 是一个将 DeepSeek Web 对话能力转换为 OpenAI、Claude 与 Gemini 兼容 API 的网关工具。后端由 Go 语言全量实现，无需 Python 环境，支持多账号轮询、并发控制及 Tool Calling。\n\n## 1. 环境准备\n\n### 系统要求\n- **操作系统**：Linux \u002F macOS \u002F Windows\n- **架构**：amd64, arm64\n- **网络**：需能访问 DeepSeek 官方服务\n\n### 部署方式选择\n推荐优先使用 **预编译二进制包** 或 **Docker**，无需安装开发环境。若需二次开发，请参考“源码运行”要求。\n\n| 部署方式 | 前置依赖 | 适用场景 |\n| :--- | :--- | :--- |\n| **二进制包** | 无 | 大多数用户，最简单 |\n| **Docker** | Docker, Docker Compose | 容器化部署，生产环境 |\n| **源码运行** | Go 1.26+, Node.js 20+ (仅构建前端时需要) | 开发者调试，自定义功能 |\n\n## 2. 安装步骤\n\n### 方式一：下载预编译包（推荐）\n\n1. 前往 [Releases 页面](https:\u002F\u002Fgithub.com\u002FCJackHwang\u002Fds2api\u002Freleases) 下载对应系统的压缩包。\n2. 解压并进入目录：\n   ```bash\n   tar -xzf ds2api_\u003Ctag>_linux_amd64.tar.gz\n   cd ds2api_\u003Ctag>_linux_amd64\n   ```\n3. 初始化配置文件：\n   ```bash\n   cp config.example.json config.json\n   ```\n4. 编辑 `config.json`，填入你的 DeepSeek 账号信息（见下文配置说明）。\n5. 启动服务：\n   ```bash\n   .\u002Fds2api\n   ```\n\n### 方式二：Docker 部署\n\n1. 克隆仓库或下载 `docker-compose.yml` 和 `.env.example`：\n   ```bash\n   git clone https:\u002F\u002Fgithub.com\u002FCJackHwang\u002Fds2api.git\n   cd ds2api\n   cp .env.example .env\n   cp config.example.json config.json\n   ```\n2. 编辑 `.env` 文件，**必须**设置管理员密钥：\n   ```bash\n   DS2API_ADMIN_KEY=请替换为强密码\n   # 可选：修改映射端口，默认宿主机 6011 -> 容器 5001\n   # DS2API_HOST_PORT=5001\n   ```\n3. 编辑 `config.json` 填入账号信息。\n4. 启动容器：\n   ```bash\n   docker-compose up -d\n   ```\n5. 查看日志：\n   ```bash\n   docker-compose logs -f\n   ```\n\n### 方式三：源码运行（开发者）\n\n1. 克隆仓库：\n   ```bash\n   git clone https:\u002F\u002Fgithub.com\u002FCJackHwang\u002Fds2api.git\n   cd ds2api\n   ```\n2. 初始化配置：\n   ```bash\n   cp config.example.json config.json\n   # 编辑 config.json\n   ```\n3. 直接运行（首次启动若缺少前端静态文件，会自动调用 Node.js 构建）：\n   ```bash\n   go run .\u002Fcmd\u002Fds2api\n   ```\n\n## 3. 基本使用\n\n### 配置文件核心项 (`config.json`)\n\n编辑 `config.json`，重点关注以下字段：\n\n```json\n{\n  \"keys\": [\"sk-your-custom-api-key\"], \n  \"accounts\": [\n    {\n      \"email\": \"your_deepseek_email@example.com\",\n      \"password\": \"your_password\"\n    }\n  ],\n  \"model_aliases\": {\n    \"gpt-4o\": \"deepseek-chat\",\n    \"claude-sonnet-4-5\": \"deepseek-chat\"\n  },\n  \"admin\": {\n    \"jwt_expire_hours\": 24\n  }\n}\n```\n- `keys`: 客户端请求时使用的 API Key（自定义）。\n- `accounts`: 真实的 DeepSeek 账号列表，支持邮箱或手机号登录。\n- `model_aliases`: 将主流模型名映射到 DeepSeek 原生模型。\n\n### 验证服务\n\n服务默认启动在 `http:\u002F\u002F127.0.0.1:5001`。\n\n#### 1. 访问管理后台\n浏览器打开 `http:\u002F\u002F127.0.0.1:5001\u002Fadmin`，使用 `config.json` 中设置的 key 或环境变量 `DS2API_ADMIN_KEY` 登录，可进行账号测试、会话管理和配置热更新。\n\n#### 2. 调用 OpenAI 兼容接口\n使用 `curl` 或任意 OpenAI SDK 进行测试。\n\n**Curl 示例：**\n```bash\ncurl http:\u002F\u002F127.0.0.1:5001\u002Fv1\u002Fchat\u002Fcompletions \\\n  -H \"Content-Type: application\u002Fjson\" \\\n  -H \"Authorization: Bearer sk-your-custom-api-key\" \\\n  -d '{\n    \"model\": \"gpt-4o\",\n    \"messages\": [{\"role\": \"user\", \"content\": \"Hello DS2API!\"}]\n  }'\n```\n\n**Python SDK 示例：**\n```python\nfrom openai import OpenAI\n\nclient = OpenAI(\n    base_url=\"http:\u002F\u002F127.0.0.1:5001\u002Fv1\",\n    api_key=\"sk-your-custom-api-key\" # 对应 config.json 中的 keys\n)\n\nresponse = client.chat.completions.create(\n    model=\"gpt-4o\", # 会自动映射为 deepseek-chat\n    messages=[{\"role\": \"user\", \"content\": \"你好\"}]\n)\nprint(response.choices[0].message.content)\n```\n\n#### 3. 调用 Claude 兼容接口\n```bash\ncurl http:\u002F\u002F127.0.0.1:5001\u002Fv1\u002Fmessages \\\n  -H \"Content-Type: application\u002Fjson\" \\\n  -H \"x-api-key: sk-your-custom-api-key\" \\\n  -H \"anthropic-version: 2023-06-01\" \\\n  -d '{\n    \"model\": \"claude-sonnet-4-5\",\n    \"max_tokens\": 1024,\n    \"messages\": [{\"role\": \"user\", \"content\": \"Hello\"}]\n  }'\n```\n\n> **提示**：生产环境部署时，建议配置反向代理（如 Nginx）并启用 HTTPS。详细高级配置请参阅项目文档 `docs\u002FDEPLOY.md`。","某初创团队正在开发一款集成多模型能力的智能客服系统，后端架构基于 OpenAI 标准协议构建，但希望低成本接入 DeepSeek 的高性价比推理能力。\n\n### 没有 ds2api 时\n- **协议适配困难**：团队需花费大量时间编写中间件，手动将 DeepSeek 的非标准接口转换为内部系统识别的 OpenAI 格式，维护成本极高。\n- **账号管理混乱**：为应对单账号速率限制，开发人员不得不硬编码多个账号切换逻辑，缺乏统一的轮询机制，常因请求并发导致账号被封禁。\n- **部署环境沉重**：现有方案依赖复杂的 Python 运行时环境，在 Vercel 等 Serverless 平台部署困难，且冷启动速度慢，影响用户响应体验。\n- **多模型兼容缺失**：若未来需同时支持 Claude 或 Gemini 格式的客户端调用，需重复开发适配层，无法复用现有代码。\n\n### 使用 ds2api 后\n- **无缝协议转换**：ds2api 直接将 DeepSeek 对话能力封装为标准 OpenAI\u002FClaude\u002FGemini 接口，团队无需修改任何业务代码即可直接调用，开发效率提升显著。\n- **智能账号轮询**：内置的高性能账号池与等待队列自动处理多账号负载均衡，有效规避单点限流风险，保障服务高可用性。\n- **轻量灵活部署**：凭借纯 Go 后端特性，ds2api 可轻松通过 Docker 或一键部署至 Vercel，资源占用极低且启动迅速，完美契合云原生架构。\n- **统一接入标准**：通过 ds2api 的适配器分层，系统可同时兼容多种主流模型协议，为后续扩展更多模型源预留了标准化入口。\n\nds2api 通过标准化的协议桥接与高效的资源调度，让开发者能以最低成本将 DeepSeek 能力无缝融入现有的现代化 AI 应用架构中。","https:\u002F\u002Foss.gittoolsai.com\u002Fimages\u002FCJackHwang_ds2api_a719032a.png","CJackHwang","CJACK.","https:\u002F\u002Foss.gittoolsai.com\u002Favatars\u002FCJackHwang_63e2b7b0.jpg","Application Developer - Student.","GuangZhou Haizhu Foreign Language School","Guangzhou,China","cjackhwang@qq.com","tetr5354","blog.cjack.top","https:\u002F\u002Fgithub.com\u002FCJackHwang",[83,87,91,95,99,102],{"name":84,"color":85,"percentage":86},"Go","#00ADD8",74,{"name":88,"color":89,"percentage":90},"JavaScript","#f1e05a",24.7,{"name":92,"color":93,"percentage":94},"Shell","#89e051",0.8,{"name":96,"color":97,"percentage":98},"CSS","#663399",0.2,{"name":100,"color":101,"percentage":98},"Dockerfile","#384d54",{"name":103,"color":104,"percentage":105},"HTML","#e34c26",0.1,1040,355,"2026-04-13T00:09:51","GPL-3.0","Linux, macOS, Windows","不需要 GPU","未说明",{"notes":114,"python":115,"dependencies":116},"后端为纯 Go 实现，不依赖 Python。若需从源码构建前端管理台（WebUI），则本地需要安装指定版本的 Node.js；若直接使用 Release 二进制包或 Docker 镜像，则无需安装任何开发环境。支持多种部署方式：直接运行二进制文件、Docker、Vercel Serverless 或 Linux systemd。","不需要 Python 运行时",[117,118],"Go 1.26+","Node.js 20.19+ 或 22.12+ (仅构建 WebUI 时需要)",[14,52],[121,122,123,124,125,126,127,128,129,6],"deepseek","freeapi","go","golang","proxy","proxy-server","vercel-deployment","zeabur","react",null,"2026-03-27T02:49:30.150509","2026-04-13T16:15:23.190069",[],[135,140,145,150,155,160,165,170,175,180,185,190,195,200,205,210,215,220,225,230],{"id":136,"version":137,"summary_zh":138,"released_at":139},238897,"v3.4.0","## 更新内容\n\n全模型全渠道附件上传DeepSeek功能\nprompt构造优化\nWebUI优化\n报错优化\n\n文件识别相关接口在其他渠道的兼容性有待测试，OpenAI接口已通过测试。\n\n## 变更内容\n* 由@CJackHwang在https:\u002F\u002Fgithub.com\u002FCJackHwang\u002Fds2api\u002Fpull\u002F254中更新版本号\n* 功能（prompt）：支持思考前缀的分词器风格prompt拼接，由@CJackHwang在https:\u002F\u002Fgithub.com\u002FCJackHwang\u002Fds2api\u002Fpull\u002F255中实现\n* 全模型全渠道附件上传DeepSeek功能，由@CJackHwang在https:\u002F\u002Fgithub.com\u002FCJackHwang\u002Fds2api\u002Fpull\u002F256中实现\n\n\n**完整变更日志**：https:\u002F\u002Fgithub.com\u002FCJackHwang\u002Fds2api\u002Fcompare\u002Fv3.3.0...v3.4.0","2026-04-12T20:05:59",{"id":141,"version":142,"summary_zh":143,"released_at":144},238898,"v3.3.0","## 补丁\n\n专家模式适配（更多模型）\n客户端校验版本号升级\n\n## 注意\n\n该版本（v3.3.0）以前的旧版本已全部失效，请更新至最新以保障功能可用\n\n快速模式下上下文窗口限制1M，专家模式下上下文窗口限制40k\n（暂无计划更新多轮对话缓存机制，这会限制已经大于40k上下文的对话无法使用，加上近期DeepSeek客户端变动大，看看后续是否会放开限制）\n\n## 变更内容\n* @shuaihaoV 在 https:\u002F\u002Fgithub.com\u002FCJackHwang\u002Fds2api\u002Fpull\u002F249 中添加了默认、专家和视觉类的DeepSeek模型系列\n* 合并 pull request #249 from shuaihaoV\u002Ffeat\u002Fdeepseek-model-type-families\n\n@CJackHwang 在 https:\u002F\u002Fgithub.com\u002FCJackHwang\u002Fds2api\u002Fpull\u002F252 中再次添加了默认、专家和视觉类的DeepSeek模型系列\n\n## 新贡献者\n* @shuaihaoV 在 https:\u002F\u002Fgithub.com\u002FCJackHwang\u002Fds2api\u002Fpull\u002F249 中做出了首次贡献\n\n**完整变更日志**: https:\u002F\u002Fgithub.com\u002FCJackHwang\u002Fds2api\u002Fcompare\u002Fv3.2.0...v3.3.0","2026-04-08T10:08:31",{"id":146,"version":147,"summary_zh":148,"released_at":149},238899,"v3.2.0","# 版本更新摘要 (v3.2.0)\n\n成就：此v3.2版本与DeepSeek现阶段一致\n\n### 1. 新增功能与核心增强\n * **代理管理与路由 (Feature):** 引入了对 **SOCKS5\u002FSOCKS5H** 代理的管理功能，支持账号级别的代理路由配置，大幅提升了网络环境的适配能力。\n * **原生 PoW 解算器 (Refactor):** 重构了 Proof of Work (PoW) 模块，**将原有的 WASM 实现替换为原生 Go 实现**。这一改动显著提升了解算效率并降低了跨平台运行的复杂性。\n * **工具调用优化 (Tool Call):**\n   * 改进了 XML 工具解析的鲁棒性。\n   * 修复了工具调用参数中 HTML 字符被转义的问题。\n   * 解决了标记语言（Markup）解析中 XML 实体的双重解码 Bug。\n### 2. 接口与数据处理\n * **Token 统计优化:** * 改进了 DeepSeek SSE 流式输出中的 Token 使用量传播逻辑。\n   * 临时切换至**内部 Token 估算算法**，以解决上游字段不一致的问题，确保计费与统计的准确性。\n * **异常处理:** * 当上游输出为空时，现在会正确返回 429 错误码。\n   * 增强了 SSE Token 重放解析的安全硬化。\n   * 优化了代理失败时的回退（Fallback）行为，并对响应中的代理密码进行了**脱敏处理**。\n### 3. 代码质量与工程化\n * **Linter 升级:** 全面迁移至 golangci-lint v2，重新组织了配置文件，并新增了 CI 门禁（Gate），确保代码提交符合规范。\n * **错误处理规范化:** 规范了全局错误消息格式，并妥善处理了 Close() 调用的延迟错误。\n * **依赖更新:** 升级了前端 WebUI 的 Vite 版本及其他后端核心依赖。\n### 4. 文档与结构\n * **架构文档:** 新增了系统架构文档，并对文档索引进行了集中管理。\n * **README 优化:** 移除了各子目录下重复的项目结构介绍，使文档更加简洁清晰。\n\n--- \n\n## 变更内容\n* 由 @CJackHwang 在 https:\u002F\u002Fgithub.com\u002FCJackHwang\u002Fds2api\u002Fpull\u002F219 中开发\n* 由 @CJackHwang 在 https:\u002F\u002Fgithub.com\u002FCJackHwang\u002Fds2api\u002Fpull\u002F220 中将 .golangci.yml 迁移并重组至 v2 版本，同时更新了 linter 和排除规则\n* 由 @CJackHwang 在 https:\u002F\u002Fgithub.com\u002FCJackHwang\u002Fds2api\u002Fpull\u002F226 中处理延迟的 Close 错误、规范化错误信息，并添加 nolint 注释\n* 由 @CJackHwang 在 https:\u002F\u002Fgithub.com\u002FCJackHwang\u002Fds2api\u002Fpull\u002F225 中将缺失的 golangci-lint 视为可引导兼容\n* 由 @CJackHwang 在 https:\u002F\u002Fgithub.com\u002FCJackHwang\u002Fds2api\u002Fpull\u002F224 中修复 lint 引导行为，并强化 SSE 令牌重放解析的安全性\n* 由 @CJackHwang 在 https:\u002F\u002Fgithub.com\u002FCJackHwang\u002Fds2api\u002Fpull\u002F222 中添加 golangci-lint 引导和 CI lint 门禁；更新文档和 .gitignore 文件\n* 由 @CJackHwang 在 https:\u002F\u002Fgithub.com\u002FCJackHwang\u002Fds2api\u002Fpull\u002F221 中开发\n* fix(openai): 当上游输出为空时返回 429 错误码，由 @CJackHwang 在 https:\u002F\u002Fgithub.com\u002FCJackHwang\u002Fds2api\u002Fpull\u002F227 中实现\n* refactor: 将基于 WASM 的 PoW 解算器替换为 pow 包中的原生 Go 实现，由 @CJackHwang 在 https:\u002F\u002Fgithub.com\u002FCJackHwang\u002Fds2api\u002Fpull\u002F229 中完成\n* chore(deps-dev): 将 \u002Fwebui 目录下 npm_and_yarn 组中的 Vite 版本从 8.0.3 升级至 8.0.5，由 @dependabot[bot] 在 https:\u002F\u002Fgithub.com\u002FCJackHwang\u002Fds2api\u002Fpull\u002F231 中执行\n* 由 @CJackHwang 在 https:\u002F\u002Fgithub.com\u002FCJackHwang\u002Fds2api\u002Fpull\u002F233 中进行依赖升级\n* 由 @CJackHwang 在 https:\u002F\u002Fgithub.com\u002FCJackHwang\u002Fds2api\u002Fpull\u002F234 中将 DeepSeek SSE 令牌使用情况传播至 \u002Fv1\u002Fresponses，并移除过时的 POW 环境文档\n* refactor: 提高 XML 工具解析的鲁棒性，更新系统提示约束条件，并简化工具筛选逻辑，由 @CJackHwang 在 https:\u002F\u002Fgithub.com\u002FCJackHwang\u002Fds2api\u002Fpull\u002F232 中完成\n* docs: 添加架构文档并集中管理文档索引；更新 README 和 API 链接，由 @CJackHwang 在 https:\u002F\u002Fgithub.com\u002FCJackHwang\u002Fds2api\u002Fpull\u002F236 中完成\n* docs: 由 @CJackHwang 在 https:\u002F\u002Fgithub.com\u002FCJackHwang\u002Fds2api\u002Fpull\u002F238 中移除 README 中重复的项目结构部分\n* 修复工具调用参数中 HTML 转义的问题，并保持","2026-04-07T13:33:42",{"id":151,"version":152,"summary_zh":153,"released_at":154},238900,"v3.1.2_beta","## 变更内容\n* 由 @CJackHwang 在 https:\u002F\u002Fgithub.com\u002FCJackHwang\u002Fds2api\u002Fpull\u002F219 中完成开发\n* 由 @CJackHwang 在 https:\u002F\u002Fgithub.com\u002FCJackHwang\u002Fds2api\u002Fpull\u002F220 中将 .golangci.yml 迁移到 v2 版本，并更新了 linter 工具及排除规则，同时进行了重新组织\n* 由 @CJackHwang 在 https:\u002F\u002Fgithub.com\u002FCJackHwang\u002Fds2api\u002Fpull\u002F226 中处理延迟关闭的错误、规范化错误信息，并添加 nolint 注释\n* 由 @CJackHwang 在 https:\u002F\u002Fgithub.com\u002FCJackHwang\u002Fds2api\u002Fpull\u002F225 中将缺少 golangci-lint 视为与引导流程兼容\n* 由 @CJackHwang 在 https:\u002F\u002Fgithub.com\u002FCJackHwang\u002Fds2api\u002Fpull\u002F224 中修复了 lint 引导行为，并强化了 SSE 令牌重放解析\n* 由 @CJackHwang 在 https:\u002F\u002Fgithub.com\u002FCJackHwang\u002Fds2api\u002Fpull\u002F222 中添加了 golangci-lint 引导和 CI lint 门控；同时更新了文档和 .gitignore 文件\n* 由 @CJackHwang 在 https:\u002F\u002Fgithub.com\u002FCJackHwang\u002Fds2api\u002Fpull\u002F221 中完成开发\n\n\n**完整变更日志**: https:\u002F\u002Fgithub.com\u002FCJackHwang\u002Fds2api\u002Fcompare\u002Fv3.1.1...v3.1.2_beta","2026-04-06T09:42:39",{"id":156,"version":157,"summary_zh":158,"released_at":159},238901,"v3.1.1","修复接续流时重复问题  \n更新文档  \n优化调试工具链  \n\n## 变更内容  \n* 由 @CJackHwang 在 https:\u002F\u002Fgithub.com\u002FCJackHwang\u002Fds2api\u002Fpull\u002F217 中开发  \n* 修复：反转快照顺序，以在稳定…过程中保留捕获顺序，由 @CJackHwang 在 https:\u002F\u002Fgithub.com\u002FCJackHwang\u002Fds2api\u002Fpull\u002F218 中完成  \n\n\n**完整变更日志**：https:\u002F\u002Fgithub.com\u002FCJackHwang\u002Fds2api\u002Fcompare\u002Fv3.1.0...v3.1.1","2026-04-05T18:58:05",{"id":161,"version":162,"summary_zh":163,"released_at":164},238902,"v3.1.0","# DS2API v3.1.0 更新要点：\n\n * 增强 XML 工具调用解析：提升了 tool-name 识别率并修复了 tool sieve 中的透传问题。\n * 优化 SSE 流稳定性：自动忽略 INCOMPLETE 状态消息，自动续接长时间思考，防止流式输出意外中断。\n * 改进输出过滤：在移除 CONTENT_FILTER 标签时会保留末尾换行符，确保排版正常。\n * 异常处理：修正上游空输出的分类逻辑，现在会统一返回 429 错误。\n * 开发环境：本地 go run 现已支持自动加载 .env 和 config.json 配置文件。\n * 修复md格式吞空格的问题。\n * 更新项目配置和vite等依赖版本，更新各种配置导入校验，新增仿真测试脚本和工具链，完善修正文档。\n * 优化模型上下文理解。\n\n\n## 变更内容\n* 修复 tool sieve 中的 XML 透传问题，并在上游输出为空时返回 429 错误，由 @CJackHwang 在 https:\u002F\u002Fgithub.com\u002FCJackHwang\u002Fds2api\u002Fpull\u002F207 中完成。\n* 在去除泄露的 CONTENT_FILTER 标签时保留尾部换行符，并加强 XML 工具调用解析，由 @CJackHwang 在 https:\u002F\u002Fgithub.com\u002FCJackHwang\u002Fds2api\u002Fpull\u002F209 中完成。\n* 修复：正确分类上游空输出，并强化 XML 工具名称解析，由 @CJackHwang 在 https:\u002F\u002Fgithub.com\u002FCJackHwang\u002Fds2api\u002Fpull\u002F212 中完成。\n* 合并 pull request #209，来自 CJackHwang 的 codex 分支，用于调查命令输出丢失问题。\n\n在去除泄露的 CONTENT_FILTER 标签时保留尾部换行符，并加强 XML 工具调用解析，由 @CJackHwang 在 https:\u002F\u002Fgithub.com\u002FCJackHwang\u002Fds2api\u002Fpull\u002F211 中完成。\n* 为本地 go 运行加载 .env 和 config.json 配置文件，由 @Kazakiri220 在 https:\u002F\u002Fgithub.com\u002FCJackHwang\u002Fds2api\u002Fpull\u002F213 中完成。\n* 开发工作由 @CJackHwang 完成，见 https:\u002F\u002Fgithub.com\u002FCJackHwang\u002Fds2api\u002Fpull\u002F214。\n* 修复：在 SSE 流解析中忽略 INCOMPLETE 状态消息，以防止流中断，由 @CJackHwang 在 https:\u002F\u002Fgithub.com\u002FCJackHwang\u002Fds2api\u002Fpull\u002F215 中完成。\n\n## 新贡献者\n* @Kazakiri220 在 https:\u002F\u002Fgithub.com\u002FCJackHwang\u002Fds2api\u002Fpull\u002F213 中做出了首次贡献。\n\n**完整变更日志**：https:\u002F\u002Fgithub.com\u002FCJackHwang\u002Fds2api\u002Fcompare\u002Fv3.0.0...v3.1.0","2026-04-05T16:50:27",{"id":166,"version":167,"summary_zh":168,"released_at":169},238903,"v3.1.0_beta","优化众多已知问题，提升代码输出可用性\n\n## 变更内容\n* 修复工具筛中的 XML 直通处理，并在上游输出为空时返回 429 状态码，由 @CJackHwang 在 https:\u002F\u002Fgithub.com\u002FCJackHwang\u002Fds2api\u002Fpull\u002F207 中完成\n* 在剥离泄露的 CONTENT_FILTER 时保留尾随换行符，并加强 XML 工具调用解析，由 @CJackHwang 在 https:\u002F\u002Fgithub.com\u002FCJackHwang\u002Fds2api\u002Fpull\u002F209 中完成\n* 修复：正确分类空的上游输出，并强化 XML 工具名称解析，由 @CJackHwang 在 https:\u002F\u002Fgithub.com\u002FCJackHwang\u002Fds2api\u002Fpull\u002F212 中完成\n* 合并拉取请求 #209，来自 CJackHwang 的 cody\u002Finvestigate-command-output-loss-issue 分支\n\n在剥离泄露的 CONTENT_FILTER 时保留尾随换行符，并加强 XML 工具调用解析，由 @CJackHwang 在 https:\u002F\u002Fgithub.com\u002FCJackHwang\u002Fds2api\u002Fpull\u002F211 中完成\n\n\n**完整变更日志**：https:\u002F\u002Fgithub.com\u002FCJackHwang\u002Fds2api\u002Fcompare\u002Fv3.0.0...v3.1.0_beta","2026-04-03T18:23:35",{"id":171,"version":172,"summary_zh":173,"released_at":174},238904,"v3.0.0","# DS2API v3.x\n统一内核架构升级与核心体验重构\n\n本次大版本更新标志着 DS2API 底层架构的重大飞跃。我们重构了多协议的调度链路，将所有 API 的执行逻辑统一收束至 OpenAI 核心引擎，并对工具调用（Tool Calling）、账号池防饥饿机制及流式输出的稳定性进行了深度加固。\n⚠️ 升级须知 (Upgrade Notes)\n * 编译环境要求提升：如果您选择本地拉取源码进行编译部署，Go 语言版本要求已从 1.24+ 升级至 1.26+。使用 Docker 或 Release 预编译包的用户不受影响。\n * 配置写回与初始化：引入了环境变量写回机制。当启用 DS2API_ENV_WRITEBACK 时，系统支持将环境变量动态写回配置文件；同时新增了配置缺失时的自动引导与占位文件生成功能。\n * API 探针更变：推荐运维监控体系切换至标准的 \u002Fhealthz（存活探针）与 \u002Freadyz（就绪探针）进行状态检查。\n \n![Image_1775194304224](https:\u002F\u002Fgithub.com\u002Fuser-attachments\u002Fassets\u002F226d024f-16a0-44d5-b47e-daa907ad7f16)\n\n## 核心更新内容 (Major Updates)\n\n1. 架构级重构：统一 OpenAI 核心调度流\n彻底重构了底层协议路由。通过引入全新的 CLIProxy 转换桥，现在 Claude（\u002Fanthropic\u002F*）与 Gemini（\u002Fv1beta\u002Fmodels\u002F*）的请求会先被翻译为内部 OpenAI 结构，交由 OAEngine 集中处理工具调用解析、PoW 计算与流式防泄漏，最终再转换回原协议输出。\n * 一致性提升：消除了过去各协议适配器各自为战导致的行为漂移，确保不同 SDK 接入时流式语义与拦截逻辑绝对一致。\n * 路由收拢：所有协议入口统一汇聚于 chi Router 同一路由树中，代码层级与调用链路更加清晰。\n2. Tool Calling (工具调用) 深度加固\n全面提升了工具调用的准确度与容错边界，对 Go 侧与 Node 侧（Vercel）的解析器进行了严格语义对齐。\n * 多协议特征识别：全面兼容并强化了 Gemini functionCall 与 Claude tool_use 的拦截识别，支持动态回填缺失的 Tool Call ID。\n * 防误判与清洗优化：修复了普通文本中的 \"tool_calls\" 字样被误捕获的问题，并增强了 XML 转义残留的清理逻辑，优先保证合规 Schema 参数的准确提取。\n3. 账号池调度与并发稳定性增强\n * 账号池“防饥饿”机制：重构了并发轮询逻辑。当托管池中某一账号 Token 失效或鉴权失败时，系统不再卡死报错，而是自动轮询重试池内其他健康的可用账号。\n * 风控拦截（Content Filter）静默处理：当上游触发审查拦截时，底层引擎会自动隐藏上游的审查提示文本、安全截断输出流（避免 FINISHED 状态异常泄漏），并完整保留请求已消耗的 Token 统计。\n4. 部署与运维体验优化\n * 基础镜像升级：同步升级了 Dockerfile 与 Zeabur 部署模板的底层依赖，更新至最新的 Node 和 Go 运行基线。\n * WebUI 细节修复：修复了前端管理台中 API Key 复制按钮偶发失效的问题。\n * 排障闭环：结合 \u002Fadmin\u002Fversion 与 \u002Fadmin\u002Fdev\u002Fcaptures，提供更清晰的本地抓包与流量模拟能力（支持生成原生 JSON 请求体用于复现排查）。\n5. 支持DeepSeek最新支持的多段思考能力，支持token计数返回\n\n\n## What's Changed\n* Fix dangling agent XML cleanup and XML-escape tool-call prompt serialization by @CJackHwang in https:\u002F\u002Fgithub.com\u002FCJackHwang\u002Fds2api\u002Fpull\u002F167\n* chore: relocate sha3 WASM asset to internal directory and update build configurations by @CJackHwang in https:\u002F\u002Fgithub.com\u002FCJackHwang\u002Fds2api\u002Fpull\u002F166\n* fix(js): avoid false tool-call capture on plain tool_calls prose by @CJackHwang in https:\u002F\u002Fgithub.com\u002FCJackHwang\u002Fds2api\u002Fpull\u002F168\n* Merge pull request #168 from CJackHwang\u002Fcodex\u002Ffix-vercel-deployment-issue-with-api-calls\n\nfix(js): avoid false tool-call capture on plain tool_calls prose by @CJackHwang in https:\u002F\u002Fgithub.com\u002FCJackHwang\u002Fds2api\u002Fpull\u002F169\n* Enable env-backed config writeback and bootstrap missing config file by @CJackHwang in https:\u002F\u002Fgithub.com\u002FCJackHwang\u002Fds2api\u002Fpull\u002F171\n* 修复写回模式回退逻辑并从 CONTENT_FILTER 起截断流输出 by @CJackHwang in https:\u002F\u002Fgithub.com\u002FCJackHwang\u002Fds2api\u002Fpull\u002F176\n* Merge pull request #171 from CJackHwang\u002Fcodex\u002Ffix-issue-#170-in-ds2api\n\nEnable env-backed config writeback and bootstrap missing config file by @CJackHwang in https:\u002F\u002Fgithub.com\u002FCJackHwang\u002Fds2api\u002Fpull\u002F174\n* Fixes #177 by @TesseractLHY in https:\u002F\u002Fgithub.com\u002FCJackHwang\u002Fds2api\u002Fpull\u002F179\n* Detect Gemini `functionCall` and Claude `tool_use`, backfill tool_call IDs, and broaden tool-sieve detection by @CJackHwang in https:\u002F\u002Fgithub.com\u002FCJackHwang\u002Fds2api\u002Fpull\u002F180\n* Fix account pool starva","2026-04-03T05:15:49",{"id":176,"version":177,"summary_zh":178,"released_at":179},238905,"v3.0.0_beta","## 变更内容\n* 在 SSE 流中隐藏上游内容过滤器文本，保留令牌使用量，并由 @CJackHwang 在 https:\u002F\u002Fgithub.com\u002FCJackHwang\u002Fds2api\u002Fpull\u002F195 中加强过滤器检测。\n* 保留 SSE 长连接，在接收到 CONTENT_FILTER 状态时停止，并由 @CJackHwang 在 https:\u002F\u002Fgithub.com\u002FCJackHwang\u002Fds2api\u002Fpull\u002F194 中传递上游的令牌使用信息。\n* 通过 OpenAI 代理 Claude\u002FGemini，使用翻译桥和流式翻译器；由 @CJackHwang 在 https:\u002F\u002Fgithub.com\u002FCJackHwang\u002Fds2api\u002Fpull\u002F193 中更新依赖项。\n* 文档：升级至 v3.0.0，并由 @CJackHwang 在 https:\u002F\u002Fgithub.com\u002FCJackHwang\u002Fds2api\u002Fpull\u002F197 中记录统一适配器\u002F路由器、健康检查端点以及 Go 1.26 的要求。\n* 发布 3.0.0 版本：版本号升级及文档更新统一路由与适配器层功能，由 @CJackHwang 在 https:\u002F\u002Fgithub.com\u002FCJackHwang\u002Fds2api\u002Fpull\u002F198 中完成。\n* 文档：由 @CJackHwang 在 https:\u002F\u002Fgithub.com\u002FCJackHwang\u002Fds2api\u002Fpull\u002F199 中刷新架构概览和项目结构图。\n* 升级 Node 和 Go 基础镜像，并在 Zeabur 模板中添加运行时基线，由 @CJackHwang 在 https:\u002F\u002Fgithub.com\u002FCJackHwang\u002Fds2api\u002Fpull\u002F202 中完成。\n* 通过 OpenAI 核心代理 Claude\u002FGemini 适配器，保留模型映射关系，并由 @CJackHwang 在 https:\u002F\u002Fgithub.com\u002FCJackHwang\u002Fds2api\u002Fpull\u002F201 中更新 README 和测试用例。\n\n\n**完整变更日志**：https:\u002F\u002Fgithub.com\u002FCJackHwang\u002Fds2api\u002Fcompare\u002Fv2.5.1...v3.0.0_beta","2026-04-02T18:04:46",{"id":181,"version":182,"summary_zh":183,"released_at":184},238906,"v2.5.1","## 变更内容\n* 修复悬空代理 XML 清理及工具调用提示序列化问题，由 @CJackHwang 在 https:\u002F\u002Fgithub.com\u002FCJackHwang\u002Fds2api\u002Fpull\u002F167 中完成\n* 杂项：将 sha3 WASM 资源移至内部目录，并更新构建配置，由 @CJackHwang 在 https:\u002F\u002Fgithub.com\u002FCJackHwang\u002Fds2api\u002Fpull\u002F166 中完成\n* 修复 (js)：避免在纯 tool_calls 文本中误捕获工具调用，由 @CJackHwang 在 https:\u002F\u002Fgithub.com\u002FCJackHwang\u002Fds2api\u002Fpull\u002F168 中完成\n* 合并拉取请求 #168，来自 CJackHwang 的 codex 分支，用于修复 API 调用相关的 Vercel 部署问题\n\n修复 (js)：避免在纯 tool_calls 文本中误捕获工具调用，由 @CJackHwang 在 https:\u002F\u002Fgithub.com\u002FCJackHwang\u002Fds2api\u002Fpull\u002F169 中完成\n* 启用基于环境变量的配置回写功能，并初始化缺失的配置文件，由 @CJackHwang 在 https:\u002F\u002Fgithub.com\u002FCJackHwang\u002Fds2api\u002Fpull\u002F171 中完成\n* 修复写回模式的回退逻辑，并从 CONTENT_FILTER 开始截断流式输出，由 @CJackHwang 在 https:\u002F\u002Fgithub.com\u002FCJackHwang\u002Fds2api\u002Fpull\u002F176 中完成\n* 合并拉取请求 #171，来自 CJackHwang 的 codex 分支，用于修复 ds2api 中的问题 #170\n\n启用基于环境变量的配置回写功能，并初始化缺失的配置文件，由 @CJackHwang 在 https:\u002F\u002Fgithub.com\u002FCJackHwang\u002Fds2api\u002Fpull\u002F174 中完成\n* 修复 #177 问题，由 @TesseractLHY 在 https:\u002F\u002Fgithub.com\u002FCJackHwang\u002Fds2api\u002Fpull\u002F179 中完成\n* 检测 Gemini 的 `functionCall` 和 Claude 的 `tool_use`，补全工具调用 ID，并扩大工具筛选检测范围，由 @CJackHwang 在 https:\u002F\u002Fgithub.com\u002FCJackHwang\u002Fds2api\u002Fpull\u002F180 中完成\n* 修复当仅有一个托管账户拥有令牌时出现的账户池饥饿问题，由 @CJackHwang 在 https:\u002F\u002Fgithub.com\u002FCJackHwang\u002Fds2api\u002Fpull\u002F182 中完成\n* 认证：当确保令牌失败时，重试其他托管账户，由 @CJackHwang 在 https:\u002F\u002Fgithub.com\u002FCJackHwang\u002Fds2api\u002Fpull\u002F184 中完成\n* 修复 (webui)：使 API 密钥复制操作更加可靠，由 @CJackHwang 在 https:\u002F\u002Fgithub.com\u002FCJackHwang\u002Fds2api\u002Fpull\u002F186 中完成\n* 完善 Docker 部署教程，由 @MoeclubM 在 https:\u002F\u002Fgithub.com\u002FCJackHwang\u002Fds2api\u002Fpull\u002F188 中完成\n* 修复 loose `functionCall` 键导致的工具筛选回归问题，由 @CJackHwang 在 https:\u002F\u002Fgithub.com\u002FCJackHwang\u002Fds2api\u002Fpull\u002F190 中完成\n* 修复：加强工具筛选中 functionCall 键的检测，由 @CJackHwang 在 https:\u002F\u002Fgithub.com\u002FCJackHwang\u002Fds2api\u002Fpull\u002F192 中完成\n* 修复：在工具筛选中优先处理带引号的 functionCall 键，由 @CJackHwang 在 https:\u002F\u002Fgithub.com\u002FCJackHwang\u002Fds2api\u002Fpull\u002F191 中完成\n* 修复：在工具提示中使用符合 schema 的 exec 参数示例，由 @CJackHwang 在 https:\u002F\u002Fgithub.com\u002FCJackHwang\u002Fds2api\u002Fpull\u002F187 中完成\n* 合并拉取请求 #182，来自 CJackHwang 的 codex 分支，用于调查潜在问题\n\n修复当仅有一个托管账户拥有令牌时出现的账户池饥饿问题，由 @CJackHwang 在 https:\u002F\u002Fgithub.com\u002FCJackHwang\u002Fds2api\u002Fpull\u002F183 中完成\n\n## 新贡献者\n* @TesseractLHY 在 https:\u002F\u002Fgithub.com\u002FCJackHwang\u002Fds2api\u002Fpull\u002F179 中完成了首次贡献\n* @MoeclubM 在 https:\u002F\u002Fgithub.com\u002FCJackHwang\u002Fds2api\u002Fpull\u002F188 中完成了首次贡献\n\n**完整变更日志**：https:\u002F\u002Fgithub.com\u002FCJackHwang\u002Fds2api\u002Fcompare\u002Fv2.5.0...v2.5.1","2026-04-02T12:33:11",{"id":186,"version":187,"summary_zh":188,"released_at":189},238907,"v2.5.1_beta3","## What's Changed\r\n* Enable env-backed config writeback and bootstrap missing config file by @CJackHwang in https:\u002F\u002Fgithub.com\u002FCJackHwang\u002Fds2api\u002Fpull\u002F171\r\n* 修复写回模式回退逻辑并从 CONTENT_FILTER 起截断流输出 by @CJackHwang in https:\u002F\u002Fgithub.com\u002FCJackHwang\u002Fds2api\u002Fpull\u002F176\r\n* Merge pull request #171 from CJackHwang\u002Fcodex\u002Ffix-issue-#170-in-ds2api\r\n\r\nEnable env-backed config writeback and bootstrap missing config file by @CJackHwang in https:\u002F\u002Fgithub.com\u002FCJackHwang\u002Fds2api\u002Fpull\u002F174\r\n\r\n\r\n**Full Changelog**: https:\u002F\u002Fgithub.com\u002FCJackHwang\u002Fds2api\u002Fcompare\u002Fv2.5.1_beta2...v2.5.1_beta3","2026-03-30T17:38:22",{"id":191,"version":192,"summary_zh":193,"released_at":194},238908,"v2.5.1_beta2","修复Vercel部署无法调用工具的问题（JS runtime）\r\n\r\n## What's Changed\r\n* Merge pull request #135 from CJackHwang\u002Fcodex\u002Fadd-global-token-refresh-logic\r\n\r\nSanitize leaked tool-history markers, simplify normalization, and add managed token refresh by @CJackHwang in https:\u002F\u002Fgithub.com\u002FCJackHwang\u002Fds2api\u002Fpull\u002F138\r\n* Merge pull request #141 from CJackHwang\u002Fcodex\u002Finvestigate-json-leakage-in-vercel-deployment-rh84s1\r\n\r\nFix raw tool-call JSON leaks when feature_match mode is off by @CJackHwang in https:\u002F\u002Fgithub.com\u002FCJackHwang\u002Fds2api\u002Fpull\u002F142\r\n* Merge pull request #145 from CJackHwang\u002Fcodex\u002Fdetermine-which-pr-fixes-json-leak-issue\r\n\r\nMerge pull request #144 from CJackHwang\u002Fcodex\u002Frefactor-codebase-to-remove-redundancy\r\n\r\nRefactor tool-sieve and response streaming, remove unused helpers and UI wrappers by @CJackHwang in https:\u002F\u002Fgithub.com\u002FCJackHwang\u002Fds2api\u002Fpull\u002F146\r\n* Merge pull request #147 from CJackHwang\u002Fcodex\u002Ffix-tool-call-history-retrieval\r\n\r\nPreserve tool call\u002Fresult roundtrip and raw payloads across Claude, Gemini and OpenAI adapters by @CJackHwang in https:\u002F\u002Fgithub.com\u002FCJackHwang\u002Fds2api\u002Fpull\u002F148\r\n* Merge pull request #149 from CJackHwang\u002Fcodex\u002Ffix-tool-miscall-during-complex-json-test\r\n\r\nIgnore tool_call payloads inside fenced code blocks and chat envelopes; stream-aware code-fence tracking by @CJackHwang in https:\u002F\u002Fgithub.com\u002FCJackHwang\u002Fds2api\u002Fpull\u002F151\r\n* Merge pull request #153 from CJackHwang\u002Fcodex\u002Finvestigate-tool-execution-bugs-in-output-7ocr8f\r\n\r\nRelax tool-name allow-listing and improve tool-call detection\u002Fparsing across adapters and sieve by @CJackHwang in https:\u002F\u002Fgithub.com\u002FCJackHwang\u002Fds2api\u002Fpull\u002F156\r\n* docs: update API documentation, deployment guides, and README with new admin endpoints, compatibility notes, and build instructions by @CJackHwang in https:\u002F\u002Fgithub.com\u002FCJackHwang\u002Fds2api\u002Fpull\u002F163\r\n* Fix dangling agent XML cleanup and XML-escape tool-call prompt serialization by @CJackHwang in https:\u002F\u002Fgithub.com\u002FCJackHwang\u002Fds2api\u002Fpull\u002F167\r\n* chore: relocate sha3 WASM asset to internal directory and update build configurations by @CJackHwang in https:\u002F\u002Fgithub.com\u002FCJackHwang\u002Fds2api\u002Fpull\u002F166\r\n* fix(js): avoid false tool-call capture on plain tool_calls prose by @CJackHwang in https:\u002F\u002Fgithub.com\u002FCJackHwang\u002Fds2api\u002Fpull\u002F168\r\n* Merge pull request #168 from CJackHwang\u002Fcodex\u002Ffix-vercel-deployment-issue-with-api-calls\r\n\r\nfix(js): avoid false tool-call capture on plain tool_calls prose by @CJackHwang in https:\u002F\u002Fgithub.com\u002FCJackHwang\u002Fds2api\u002Fpull\u002F169\r\n\r\n\r\n**Full Changelog**: https:\u002F\u002Fgithub.com\u002FCJackHwang\u002Fds2api\u002Fcompare\u002Fv2.5.1_beta...v2.5.1_beta2","2026-03-30T08:58:21",{"id":196,"version":197,"summary_zh":198,"released_at":199},238909,"v2.5.1_beta","deepseek炸了，没有测试，慎用，可能更好用，也可能有更多bug\r\n\r\n**Full Changelog**: https:\u002F\u002Fgithub.com\u002FCJackHwang\u002Fds2api\u002Fcompare\u002Fv2.5.0...v2.5.1_beta","2026-03-29T18:25:38",{"id":201,"version":202,"summary_zh":203,"released_at":204},238910,"v2.5.0","## What's Changed\r\n* Sync tool-call compat fixtures and update node test to match permissive tool-call policy by @CJackHwang in https:\u002F\u002Fgithub.com\u002FCJackHwang\u002Fds2api\u002Fpull\u002F155\r\n* Relax tool-name allow-listing and improve tool-call detection\u002Fparsing across adapters and sieve by @CJackHwang in https:\u002F\u002Fgithub.com\u002FCJackHwang\u002Fds2api\u002Fpull\u002F153\r\n* Merge pull request #153 from CJackHwang\u002Fcodex\u002Finvestigate-tool-execution-bugs-in-output-7ocr8f\r\n\r\n针对已知问题深度优化，统一封装xml格式并统一全路径\r\n针对注意力机制进行请求体构造调整，完美支持openclaw，Claudecode Agent模式和roocode\r\n\r\nRelax tool-name allow-listing and improve tool-call detection\u002Fparsing across adapters and sieve by @CJackHwang in https:\u002F\u002Fgithub.com\u002FCJackHwang\u002Fds2api\u002Fpull\u002F156\r\n* Sanitize leaked tool-call wire format in assistant text by @CJackHwang in https:\u002F\u002Fgithub.com\u002FCJackHwang\u002Fds2api\u002Fpull\u002F157\r\n* Prefer XML canonical format for tool calls; prioritize XML\u002FMarkup parsing and update docs\u002Ftests by @CJackHwang in https:\u002F\u002Fgithub.com\u002FCJackHwang\u002Fds2api\u002Fpull\u002F161\r\n* docs: update API documentation, deployment guides, and README with new admin endpoints, compatibility notes, and build instructions by @CJackHwang in https:\u002F\u002Fgithub.com\u002FCJackHwang\u002Fds2api\u002Fpull\u002F163\r\n\r\n\r\n**Full Changelog**: https:\u002F\u002Fgithub.com\u002FCJackHwang\u002Fds2api\u002Fcompare\u002Fv2.4.0...v2.5.0","2026-03-29T11:53:10",{"id":206,"version":207,"summary_zh":208,"released_at":209},238911,"v2.4.1_beta","## What's Changed\r\n* Sync tool-call compat fixtures and update node test to match permissive tool-call policy by @CJackHwang in https:\u002F\u002Fgithub.com\u002FCJackHwang\u002Fds2api\u002Fpull\u002F155\r\n* Relax tool-name allow-listing and improve tool-call detection\u002Fparsing across adapters and sieve by @CJackHwang in https:\u002F\u002Fgithub.com\u002FCJackHwang\u002Fds2api\u002Fpull\u002F153\r\n* Sanitize leaked tool-call wire format in assistant text by @CJackHwang in https:\u002F\u002Fgithub.com\u002FCJackHwang\u002Fds2api\u002Fpull\u002F157\r\n\r\n\r\n**Full Changelog**: https:\u002F\u002Fgithub.com\u002FCJackHwang\u002Fds2api\u002Fcompare\u002Fv2.4.0...v2.4.1_beta","2026-03-22T14:47:36",{"id":211,"version":212,"summary_zh":213,"released_at":214},238912,"v2.4.0","## What's Changed\r\n* Vercel sync: support env-backed config drafts, hash diffing and UI indicators by @CJackHwang in https:\u002F\u002Fgithub.com\u002FCJackHwang\u002Fds2api\u002Fpull\u002F129\r\n* Preserve code fences around standalone tool JSON and add marker-output guards by @CJackHwang in https:\u002F\u002Fgithub.com\u002FCJackHwang\u002Fds2api\u002Fpull\u002F132\r\n* Merge pull request #132 from CJackHwang\u002Fcodex\u002Ftoolcallhistory-6t7271\r\n\r\nPreserve code fences around standalone tool JSON and add marker-output guards by @CJackHwang in https:\u002F\u002Fgithub.com\u002FCJackHwang\u002Fds2api\u002Fpull\u002F133\r\n* feat(webui): add config backup download and file-based import in Settings by @CJackHwang in https:\u002F\u002Fgithub.com\u002FCJackHwang\u002Fds2api\u002Fpull\u002F136\r\n* Make account `test_status` runtime-only (in-memory cache) by @CJackHwang in https:\u002F\u002Fgithub.com\u002FCJackHwang\u002Fds2api\u002Fpull\u002F137\r\n* Sanitize leaked tool-history markers, simplify normalization, and add managed token refresh by @CJackHwang in https:\u002F\u002Fgithub.com\u002FCJackHwang\u002Fds2api\u002Fpull\u002F135\r\n* [Follow-up] Preserve empty tool completion turns in OpenAI prompt normalization by @CJackHwang in https:\u002F\u002Fgithub.com\u002FCJackHwang\u002Fds2api\u002Fpull\u002F139\r\n* Merge pull request #135 from CJackHwang\u002Fcodex\u002Fadd-global-token-refresh-logic\r\n\r\nSanitize leaked tool-history markers, simplify normalization, and add managed token refresh by @CJackHwang in https:\u002F\u002Fgithub.com\u002FCJackHwang\u002Fds2api\u002Fpull\u002F138\r\n* Fix raw tool-call JSON leaks when feature_match mode is off by @CJackHwang in https:\u002F\u002Fgithub.com\u002FCJackHwang\u002Fds2api\u002Fpull\u002F141\r\n* Merge pull request #141 from CJackHwang\u002Fcodex\u002Finvestigate-json-leakage-in-vercel-deployment-rh84s1\r\n\r\nFix raw tool-call JSON leaks when feature_match mode is off by @CJackHwang in https:\u002F\u002Fgithub.com\u002FCJackHwang\u002Fds2api\u002Fpull\u002F142\r\n* Refactor tool-sieve and response streaming, remove unused helpers and UI wrappers by @CJackHwang in https:\u002F\u002Fgithub.com\u002FCJackHwang\u002Fds2api\u002Fpull\u002F144\r\n* Merge pull request #144 from CJackHwang\u002Fcodex\u002Frefactor-codebase-to-remove-redundancy\r\n\r\nRefactor tool-sieve and response streaming, remove unused helpers and UI wrappers by @CJackHwang in https:\u002F\u002Fgithub.com\u002FCJackHwang\u002Fds2api\u002Fpull\u002F145\r\n* Merge pull request #145 from CJackHwang\u002Fcodex\u002Fdetermine-which-pr-fixes-json-leak-issue\r\n\r\nMerge pull request #144 from CJackHwang\u002Fcodex\u002Frefactor-codebase-to-remove-redundancy\r\n\r\nRefactor tool-sieve and response streaming, remove unused helpers and UI wrappers by @CJackHwang in https:\u002F\u002Fgithub.com\u002FCJackHwang\u002Fds2api\u002Fpull\u002F146\r\n* Preserve tool call\u002Fresult roundtrip and raw payloads across Claude, Gemini and OpenAI adapters by @CJackHwang in https:\u002F\u002Fgithub.com\u002FCJackHwang\u002Fds2api\u002Fpull\u002F147\r\n* Merge pull request #147 from CJackHwang\u002Fcodex\u002Ffix-tool-call-history-retrieval\r\n\r\nPreserve tool call\u002Fresult roundtrip and raw payloads across Claude, Gemini and OpenAI adapters by @CJackHwang in https:\u002F\u002Fgithub.com\u002FCJackHwang\u002Fds2api\u002Fpull\u002F148\r\n* Do not promote fenced code examples to tool calls and centralize tool-keyword detection by @CJackHwang in https:\u002F\u002Fgithub.com\u002FCJackHwang\u002Fds2api\u002Fpull\u002F150\r\n* Ignore tool_call payloads inside fenced code blocks and chat envelopes; stream-aware code-fence tracking by @CJackHwang in https:\u002F\u002Fgithub.com\u002FCJackHwang\u002Fds2api\u002Fpull\u002F149\r\n* Merge pull request #149 from CJackHwang\u002Fcodex\u002Ffix-tool-miscall-during-complex-json-test\r\n\r\nIgnore tool_call payloads inside fenced code blocks and chat envelopes; stream-aware code-fence tracking by @CJackHwang in https:\u002F\u002Fgithub.com\u002FCJackHwang\u002Fds2api\u002Fpull\u002F151\r\n\r\n\r\n**Full Changelog**: https:\u002F\u002Fgithub.com\u002FCJackHwang\u002Fds2api\u002Fcompare\u002Fv2.3.7...v2.4.0","2026-03-22T09:04:46",{"id":216,"version":217,"summary_zh":218,"released_at":219},238913,"v2.3.8_beta","## What's Changed\r\n* Vercel sync: support env-backed config drafts, hash diffing and UI indicators by @CJackHwang in https:\u002F\u002Fgithub.com\u002FCJackHwang\u002Fds2api\u002Fpull\u002F129\r\n* Preserve code fences around standalone tool JSON and add marker-output guards by @CJackHwang in https:\u002F\u002Fgithub.com\u002FCJackHwang\u002Fds2api\u002Fpull\u002F132\r\n\r\n\r\n**Full Changelog**: https:\u002F\u002Fgithub.com\u002FCJackHwang\u002Fds2api\u002Fcompare\u002Fv2.3.7...v2.3.8_beta","2026-03-21T10:06:51",{"id":221,"version":222,"summary_zh":223,"released_at":224},238914,"v2.3.7","## What's Changed\r\n* Attempt token refresh for biz_code failures; report config writability and handle token write errors by @CJackHwang in https:\u002F\u002Fgithub.com\u002FCJackHwang\u002Fds2api\u002Fpull\u002F112\r\n* Align Vercel JS toolcall detection\u002Fformat behavior with Go semantics by @CJackHwang in https:\u002F\u002Fgithub.com\u002FCJackHwang\u002Fds2api\u002Fpull\u002F116\r\n* Expose version endpoint, add version package, and inject build version into artifacts\u002FDocker images by @CJackHwang in https:\u002F\u002Fgithub.com\u002FCJackHwang\u002Fds2api\u002Fpull\u002F115\r\n* Merge pull request #115 from CJackHwang\u002Fcodex\u002Ffix-version-detection-for-ds2api\r\n\r\nExpose version endpoint, add version package, and inject build version into artifacts\u002FDocker images by @CJackHwang in https:\u002F\u002Fgithub.com\u002FCJackHwang\u002Fds2api\u002Fpull\u002F117\r\n* fix: decouple runtime-from-dist image from go-builder stage by @CJackHwang in https:\u002F\u002Fgithub.com\u002FCJackHwang\u002Fds2api\u002Fpull\u002F118\r\n* Merge pull request #118 from CJackHwang\u002Fcodex\u002Fanalyze-and-fix-build-failure-for-pr-117\r\n\r\nfix: decouple runtime-from-dist image from go-builder stage by @CJackHwang in https:\u002F\u002Fgithub.com\u002FCJackHwang\u002Fds2api\u002Fpull\u002F119\r\n* fix: 修复 Docker 在缺少 BUILD_VERSION 时构建失败 by @jacob-sheng in https:\u002F\u002Fgithub.com\u002FCJackHwang\u002Fds2api\u002Fpull\u002F121\r\n* Treat account tokens as runtime-only; remove token-only account support and always refresh tokens on admin actions by @CJackHwang in https:\u002F\u002Fgithub.com\u002FCJackHwang\u002Fds2api\u002Fpull\u002F122\r\n* Merge pull request #122 from CJackHwang\u002Fcodex\u002Frefactor-configuration-to-remove-token-support\r\n\r\nTreat account tokens as runtime-only; remove token-only account support and always refresh tokens on admin actions by @CJackHwang in https:\u002F\u002Fgithub.com\u002FCJackHwang\u002Fds2api\u002Fpull\u002F123\r\n* Preserve file-backed account tokens on startup and add regression test by @CJackHwang in https:\u002F\u002Fgithub.com\u002FCJackHwang\u002Fds2api\u002Fpull\u002F124\r\n* Docs: add `auto_delete.sessions`, rename `claude_model_mapping` to `claude_mapping`, and clarify config token handling by @CJackHwang in https:\u002F\u002Fgithub.com\u002FCJackHwang\u002Fds2api\u002Fpull\u002F125\r\n* Merge pull request #125 from CJackHwang\u002Fcodex\u002Falign-documentation-with-configuration-updates\r\n\r\nDocs: add `auto_delete.sessions`, rename `claude_model_mapping` to `claude_mapping`, and clarify config token handling by @CJackHwang in https:\u002F\u002Fgithub.com\u002FCJackHwang\u002Fds2api\u002Fpull\u002F126\r\n\r\n\r\n**Full Changelog**: https:\u002F\u002Fgithub.com\u002FCJackHwang\u002Fds2api\u002Fcompare\u002Fv2.3.5...v2.3.7","2026-03-21T07:46:08",{"id":226,"version":227,"summary_zh":228,"released_at":229},238915,"v2.3.5","## What's Changed\r\n* feat: 添加会话管理功能 by @latticeon in https:\u002F\u002Fgithub.com\u002FCJackHwang\u002Fds2api\u002Fpull\u002F93\r\n* ci: ignore test files in line gate and raise frontend limit to 500 by @CJackHwang in https:\u002F\u002Fgithub.com\u002FCJackHwang\u002Fds2api\u002Fpull\u002F96\r\n* Merge pull request #96 from CJackHwang\u002Fcodex\u002Fupdate-ci-line-count-limits-cihke3\r\n\r\nci: ignore test files in line gate and raise frontend limit to 500 by @CJackHwang in https:\u002F\u002Fgithub.com\u002FCJackHwang\u002Fds2api\u002Fpull\u002F97\r\n* fix(toolcall): fix deepseek function calling bug and add json repair by @valkryhx in https:\u002F\u002Fgithub.com\u002FCJackHwang\u002Fds2api\u002Fpull\u002F92\r\n* Codex-generated pull request by @CJackHwang in https:\u002F\u002Fgithub.com\u002FCJackHwang\u002Fds2api\u002Fpull\u002F99\r\n* fix: unblock PR #101 line gate and improve PoW\u002Ftoken retry handling by @CJackHwang in https:\u002F\u002Fgithub.com\u002FCJackHwang\u002Fds2api\u002Fpull\u002F103\r\n* Merge pull request #99 from CJackHwang\u002Fcodex\u002Frefactor-toolcalls_parse.go-for-line-limits\r\n\r\nCodex-generated pull request by @CJackHwang in https:\u002F\u002Fgithub.com\u002FCJackHwang\u002Fds2api\u002Fpull\u002F102\r\n* Restore tool-call parsing and repair logic; remove accidental split files by @CJackHwang in https:\u002F\u002Fgithub.com\u002FCJackHwang\u002Fds2api\u002Fpull\u002F104\r\n* Merge pull request #104 from CJackHwang\u002Fcodex\u002Frevert-to-commit-efb484b\r\n\r\nRestore tool-call parsing and repair logic; remove accidental split files by @CJackHwang in https:\u002F\u002Fgithub.com\u002FCJackHwang\u002Fds2api\u002Fpull\u002F105\r\n* Merge pull request #105 from CJackHwang\u002Fcodex\u002Ffix-issues-found-in-review\r\n\r\nMerge pull request #104 from CJackHwang\u002Fcodex\u002Frevert-to-commit-efb484b\r\n\r\nRestore tool-call parsing and repair logic; remove accidental split files by @CJackHwang in https:\u002F\u002Fgithub.com\u002FCJackHwang\u002Fds2api\u002Fpull\u002F106\r\n* docs: prune stale files and refresh docs, add .env.example, align READMEs\u002FDEPLOY\u002FCONTRIBUTING by @CJackHwang in https:\u002F\u002Fgithub.com\u002FCJackHwang\u002Fds2api\u002Fpull\u002F107\r\n* docs: refresh deployment\u002Ftesting guides and remove stale investigation report by @CJackHwang in https:\u002F\u002Fgithub.com\u002FCJackHwang\u002Fds2api\u002Fpull\u002F108\r\n* Merge pull request #108 from CJackHwang\u002Fcodex\u002Fclean-up-unused-files-and-update-documentation-uiip50\r\n\r\ndocs: refresh deployment\u002Ftesting guides and remove stale investigation report by @CJackHwang in https:\u002F\u002Fgithub.com\u002FCJackHwang\u002Fds2api\u002Fpull\u002F109\r\n* Align Vercel JS stream tool-call delta handling with Go runtime by @CJackHwang in https:\u002F\u002Fgithub.com\u002FCJackHwang\u002Fds2api\u002Fpull\u002F110\r\n* Merge pull request #110 from CJackHwang\u002Fcodex\u002Falign-js-runtime-with-go-runtime-logic\r\n\r\nAlign Vercel JS stream tool-call delta handling with Go runtime by @CJackHwang in https:\u002F\u002Fgithub.com\u002FCJackHwang\u002Fds2api\u002Fpull\u002F111\r\n\r\n## New Contributors\r\n* @latticeon made their first contribution in https:\u002F\u002Fgithub.com\u002FCJackHwang\u002Fds2api\u002Fpull\u002F93\r\n\r\n**Full Changelog**: https:\u002F\u002Fgithub.com\u002FCJackHwang\u002Fds2api\u002Fcompare\u002Fv2.3.3...v2.3.5","2026-03-20T02:12:15",{"id":231,"version":232,"summary_zh":233,"released_at":234},238916,"v2.3.5_beta","## What's Changed\r\n* fix(toolcall): fix deepseek function calling bug and add json repair by @valkryhx in https:\u002F\u002Fgithub.com\u002FCJackHwang\u002Fds2api\u002Fpull\u002F92\r\n* Codex-generated pull request by @CJackHwang in https:\u002F\u002Fgithub.com\u002FCJackHwang\u002Fds2api\u002Fpull\u002F99\r\n* fix: unblock PR #101 line gate and improve PoW\u002Ftoken retry handling by @CJackHwang in https:\u002F\u002Fgithub.com\u002FCJackHwang\u002Fds2api\u002Fpull\u002F103\r\n* Restore tool-call parsing and repair logic; remove accidental split files by @CJackHwang in https:\u002F\u002Fgithub.com\u002FCJackHwang\u002Fds2api\u002Fpull\u002F104\r\n* Merge pull request #104 from CJackHwang\u002Fcodex\u002Frevert-to-commit-efb484b\r\n\r\nRestore tool-call parsing and repair logic; remove accidental split files by @CJackHwang in https:\u002F\u002Fgithub.com\u002FCJackHwang\u002Fds2api\u002Fpull\u002F105\r\n\r\n\r\n**Full Changelog**: https:\u002F\u002Fgithub.com\u002FCJackHwang\u002Fds2api\u002Fcompare\u002Fv2.3.4_beta...v2.3.5_beta","2026-03-19T18:43:53"]