Files
2026-04-27 15:44:15 +00:00

190 lines
70 KiB
HTML
Raw Permalink Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
<!doctype html><html lang=zh-cn dir=ltr class=scroll-smooth data-default-appearance=light data-auto-appearance=true><head><meta charset=utf-8><meta name=viewport content="width=device-width,initial-scale=1"><meta name=theme-color content="#ffffff"><title>DS2API说明文档 &#183; 华禹 个人博客</title><meta name=title content="DS2API说明文档 &#183; 华禹 个人博客"><script type=text/javascript src=http://blog.hys.my/js/appearance.min.8a082f81b27f3cb2ee528df0b0bdc39787034cf2cc34d4669fbc9977c929023c.js integrity="sha256-iggvgbJ/PLLuUo3wsL3Dl4cDTPLMNNRmn7yZd8kpAjw="></script><link type=text/css rel=stylesheet href=http://blog.hys.my/css/main.bundle.min.100caa677b4bc416cdd884107b203b4869f9b413a19aa57d12069fb826f1abe9.css integrity="sha256-EAyqZ3tLxBbN2IQQeyA7SGn5tBOhmqV9EgafuCbxq+k="><script defer type=text/javascript id=script-bundle src=http://blog.hys.my/js/main.bundle.min.ad7c1061b54aa5c79b6614847630c72567108bdf84dbf18d025ed692b0074cfe.js integrity="sha256-rXwQYbVKpcebZhSEdjDHJWcQi9+E2/GNAl7WkrAHTP4=" data-copy data-copied></script><meta name=description content="
MinIO 是目前最成熟的 S3 兼容私有化对象存储方案。它用 Go 语言编写,单个二进制文件部署,没有外部依赖,性能在同类产品中领先。MinIO 完整实现了 S3 API(包括 Select、Encryption、Versioning、Object Lock 等),绝大多数 S3 SDK 和工具可以零修改对接。
"><link rel=canonical href=http://blog.hys.my/posts/hjk/><link rel=apple-touch-icon sizes=180x180 href=/apple-touch-icon.png><link rel=icon type=image/png sizes=32x32 href=/favicon-32x32.png><link rel=icon type=image/png sizes=16x16 href=/favicon-16x16.png><link rel=manifest href=/site.webmanifest><meta property="og:url" content="http://blog.hys.my/posts/hjk/"><meta property="og:site_name" content="华禹 个人博客"><meta property="og:title" content="DS2API说明文档"><meta property="og:description" content="MinIO 是目前最成熟的 S3 兼容私有化对象存储方案。它用 Go 语言编写,单个二进制文件部署,没有外部依赖,性能在同类产品中领先。MinIO 完整实现了 S3 API(包括 Select、Encryption、Versioning、Object Lock 等),绝大多数 S3 SDK 和工具可以零修改对接。"><meta property="og:locale" content="zh_cn"><meta property="og:type" content="article"><meta property="article:section" content="posts"><meta property="article:published_time" content="2026-04-18T10:00:00+08:00"><meta property="article:modified_time" content="2026-04-18T10:00:00+08:00"><meta property="article:tag" content="MinIO"><meta property="article:tag" content="对象存储"><meta property="article:tag" content="S3"><meta property="article:tag" content="部署指南"><meta property="article:tag" content="私有化存储"><meta name=twitter:card content="summary"><meta name=twitter:title content="DS2API说明文档"><meta name=twitter:description content="MinIO 是目前最成熟的 S3 兼容私有化对象存储方案。它用 Go 语言编写,单个二进制文件部署,没有外部依赖,性能在同类产品中领先。MinIO 完整实现了 S3 API(包括 Select、Encryption、Versioning、Object Lock 等),绝大多数 S3 SDK 和工具可以零修改对接。"><script type=application/ld+json>{"@context":"https://schema.org","@type":"Article","articleSection":"最近文章","name":"DS2API说明文档","headline":"DS2API说明文档","abstract":"MinIO 是目前最成熟的 S3 兼容私有化对象存储方案。它用 Go 语言编写,单个二进制文件部署,没有外部依赖,性能在同类产品中领先。MinIO 完整实现了 S3 API(包括 Select、Encryption、Versioning、Object Lock 等),绝大多数 S3 SDK 和工具可以零修改对接。","inLanguage":"zh-cn","url":"http:\/\/blog.hys.my\/posts\/hjk\/","author":{"@type":"Person","name":"华禹"},"copyrightYear":"2026","dateCreated":"2026-04-18T10:00:00\u002b08:00","datePublished":"2026-04-18T10:00:00\u002b08:00","dateModified":"2026-04-18T10:00:00\u002b08:00","keywords":["MinIO","对象存储","S3","部署指南","私有化存储"],"mainEntityOfPage":"true","wordCount":"6819"}</script><script type=application/ld+json>{"@context":"https://schema.org","@type":"BreadcrumbList","itemListElement":[{"@type":"ListItem","item":"http://blog.hys.my/","name":"Home","position":1},{"@type":"ListItem","item":"http://blog.hys.my/posts/","name":"最近文章","position":2},{"@type":"ListItem","item":"http://blog.hys.my/categories/%E6%8A%80%E6%9C%AF%E6%96%87%E6%A1%A3/","name":"技术文档","position":3},{"@type":"ListItem","name":"Ds2 Api说明文档","position":4}]}</script><meta name=author content="华禹"><link href=mailto:hello@your_domain.com rel=me><link href=https://link-to-some-website.com/ rel=me><link href=https://www.amazon.com/hz/wishlist/ls/wishlist-id rel=me><link href=https://www.apple.com rel=me><link href=https://xing.com/profile/username rel=me></head><body class="m-auto flex h-screen max-w-7xl flex-col bg-neutral px-6 text-lg leading-7 text-neutral-900 dark:bg-neutral-800 dark:text-neutral sm:px-14 md:px-24 lg:px-32"><div id=the-top class="absolute flex self-center"><a class="-translate-y-8 rounded-b-lg bg-primary-200 px-3 py-1 text-sm focus:translate-y-0 dark:bg-neutral-600" href=#main-content><span class="pe-2 font-bold text-primary-600 dark:text-primary-400">&darr;</span></a></div><header class="py-6 font-semibold text-neutral-900 dark:text-neutral sm:py-10 print:hidden"><nav class="flex items-start justify-between sm:items-center"><div class="z-40 flex flex-row items-center"><a class="decoration-primary-500 hover:underline hover:decoration-2 hover:underline-offset-2" rel=me href=/>华禹 个人博客</a></div><label id=menu-button for=menu-controller class="block sm:hidden"><input type=checkbox id=menu-controller class=hidden><div class="cursor-pointer hover:text-primary-600 dark:hover:text-primary-400"><span class="icon relative inline-block px-1 align-text-bottom"><svg viewBox="0 0 448 512"><path fill="currentColor" d="M0 96C0 78.33 14.33 64 32 64H416c17.7.0 32 14.33 32 32 0 17.7-14.3 32-32 32H32C14.33 128 0 113.7.0 96zM0 256c0-17.7 14.33-32 32-32H416c17.7.0 32 14.3 32 32s-14.3 32-32 32H32c-17.67.0-32-14.3-32-32zM416 448H32c-17.67.0-32-14.3-32-32s14.33-32 32-32H416c17.7.0 32 14.3 32 32s-14.3 32-32 32z"/></svg></span></div><div id=menu-wrapper class="invisible fixed inset-0 z-30 m-auto h-full w-full cursor-default overflow-auto bg-neutral-100/50 opacity-0 backdrop-blur-sm transition-opacity dark:bg-neutral-900/50"><ul class="mx-auto flex w-full max-w-7xl list-none flex-col overflow-visible px-6 py-6 text-end sm:px-14 sm:py-10 sm:pt-10 md:px-24 lg:px-32"><li class=mb-1><span class="cursor-pointer hover:text-primary-600 dark:hover:text-primary-400"><span class="icon relative inline-block px-1 align-text-bottom"><svg viewBox="0 0 320 512"><path fill="currentColor" d="M310.6 361.4c12.5 12.5 12.5 32.75.0 45.25C304.4 412.9 296.2 416 288 416s-16.38-3.125-22.62-9.375L160 301.3 54.63 406.6C48.38 412.9 40.19 416 32 416S15.63 412.9 9.375 406.6c-12.5-12.5-12.5-32.75.0-45.25l105.4-105.4L9.375 150.6c-12.5-12.5-12.5-32.75.0-45.25s32.75-12.5 45.25.0L160 210.8l105.4-105.4c12.5-12.5 32.75-12.5 45.25.0s12.5 32.75.0 45.25l-105.4 105.4L310.6 361.4z"/></svg></span></span></li><li class="group mb-1"><a href=/ title=Home onclick=close_menu()><span class="decoration-primary-500 group-hover:underline group-hover:decoration-2 group-hover:underline-offset-2">首页</span></a></li><li class="group mb-1"><a href=/posts/ title=最近文章 onclick=close_menu()><span class="decoration-primary-500 group-hover:underline group-hover:decoration-2 group-hover:underline-offset-2">学习</span></a></li><li class="group mb-1"><a href title onclick=close_menu()><span class="decoration-primary-500 group-hover:underline group-hover:decoration-2 group-hover:underline-offset-2">我的</span></a></li><li class="group mb-1"><a href title onclick=close_menu()><span class="decoration-primary-500 group-hover:underline group-hover:decoration-2 group-hover:underline-offset-2">简历</span></a></li><li class="group mb-1"><a href title onclick=close_menu()><span class="decoration-primary-500 group-hover:underline group-hover:decoration-2 group-hover:underline-offset-2">关于</span></a></li><li class="group mb-1"><button id=search-button-m0 title>
<span class="group-dark:hover:text-primary-400 transition-colors group-hover:text-primary-600"><span class="icon relative inline-block px-1 align-text-bottom"><svg aria-hidden="true" focusable="false" data-prefix="fas" data-icon="search" class="svg-inline--fa fa-search fa-w-16" role="img" viewBox="0 0 512 512"><path fill="currentColor" d="M505 442.7 405.3 343c-4.5-4.5-10.6-7-17-7H372c27.6-35.3 44-79.7 44-128C416 93.1 322.9.0 208 0S0 93.1.0 208s93.1 208 208 208c48.3.0 92.7-16.4 128-44v16.3c0 6.4 2.5 12.5 7 17l99.7 99.7c9.4 9.4 24.6 9.4 33.9.0l28.3-28.3c9.4-9.4 9.4-24.6.1-34zM208 336c-70.7.0-128-57.2-128-128 0-70.7 57.2-128 128-128 70.7.0 128 57.2 128 128 0 70.7-57.2 128-128 128z"/></svg></span></span></button></li></ul></div></label><ul class="hidden list-none flex-row text-end sm:flex"><li class="group mb-1 sm:mb-0 sm:me-7 sm:last:me-0"><a href=/ title=Home><span class="decoration-primary-500 group-hover:underline group-hover:decoration-2 group-hover:underline-offset-2">首页</span></a></li><li class="group mb-1 sm:mb-0 sm:me-7 sm:last:me-0"><a href=/posts/ title=最近文章><span class="decoration-primary-500 group-hover:underline group-hover:decoration-2 group-hover:underline-offset-2">学习</span></a></li><li class="group mb-1 sm:mb-0 sm:me-7 sm:last:me-0"><a href title><span class="decoration-primary-500 group-hover:underline group-hover:decoration-2 group-hover:underline-offset-2">我的</span></a></li><li class="group mb-1 sm:mb-0 sm:me-7 sm:last:me-0"><a href title><span class="decoration-primary-500 group-hover:underline group-hover:decoration-2 group-hover:underline-offset-2">简历</span></a></li><li class="group mb-1 sm:mb-0 sm:me-7 sm:last:me-0"><a href title><span class="decoration-primary-500 group-hover:underline group-hover:decoration-2 group-hover:underline-offset-2">关于</span></a></li><li class="group mb-1 sm:mb-0 sm:me-7 sm:last:me-0"><button id=search-button-m1 title>
<span class="group-dark:hover:text-primary-400 transition-colors group-hover:text-primary-600"><span class="icon relative inline-block px-1 align-text-bottom"><svg aria-hidden="true" focusable="false" data-prefix="fas" data-icon="search" class="svg-inline--fa fa-search fa-w-16" role="img" viewBox="0 0 512 512"><path fill="currentColor" d="M505 442.7 405.3 343c-4.5-4.5-10.6-7-17-7H372c27.6-35.3 44-79.7 44-128C416 93.1 322.9.0 208 0S0 93.1.0 208s93.1 208 208 208c48.3.0 92.7-16.4 128-44v16.3c0 6.4 2.5 12.5 7 17l99.7 99.7c9.4 9.4 24.6 9.4 33.9.0l28.3-28.3c9.4-9.4 9.4-24.6.1-34zM208 336c-70.7.0-128-57.2-128-128 0-70.7 57.2-128 128-128 70.7.0 128 57.2 128 128 0 70.7-57.2 128-128 128z"/></svg></span></span></button></li></ul></nav></header><div class="relative flex grow flex-col"><main id=main-content class=grow><article><header class=max-w-prose><h1 class="mb-8 mt-0 text-4xl font-extrabold text-neutral-900 dark:text-neutral">DS2API说明文档</h1><div class="mb-10 text-base text-neutral-500 dark:text-neutral-400 print:hidden"><div class="flex flex-row flex-wrap items-center"><time datetime="2026-04-18 10:00:00 +0800 +0800"></time><span class="px-2 text-primary-500">&#183;</span><span title></span></div><div class="my-1 flex flex-wrap text-xs leading-relaxed text-neutral-500 dark:text-neutral-400"><a href=http://blog.hys.my/categories/%E6%8A%80%E6%9C%AF%E6%96%87%E6%A1%A3/ class="mx-1 my-1 rounded-md border border-neutral-200 px-1 py-[1px] hover:border-primary-300 hover:text-primary-700 dark:border-neutral-600 dark:hover:border-primary-600 dark:hover:text-primary-400">技术文档</a>
<a href=http://blog.hys.my/categories/%E5%AD%98%E5%82%A8%E6%96%B9%E6%A1%88/ class="mx-1 my-1 rounded-md border border-neutral-200 px-1 py-[1px] hover:border-primary-300 hover:text-primary-700 dark:border-neutral-600 dark:hover:border-primary-600 dark:hover:text-primary-400">存储方案</a>
<a href=http://blog.hys.my/tags/minio/ class="mx-1 my-1 rounded-md border border-neutral-200 px-1 py-[1px] hover:border-primary-300 hover:text-primary-700 dark:border-neutral-600 dark:hover:border-primary-600 dark:hover:text-primary-400">MinIO</a>
<a href=http://blog.hys.my/tags/%E5%AF%B9%E8%B1%A1%E5%AD%98%E5%82%A8/ class="mx-1 my-1 rounded-md border border-neutral-200 px-1 py-[1px] hover:border-primary-300 hover:text-primary-700 dark:border-neutral-600 dark:hover:border-primary-600 dark:hover:text-primary-400">对象存储</a>
<a href=http://blog.hys.my/tags/s3/ class="mx-1 my-1 rounded-md border border-neutral-200 px-1 py-[1px] hover:border-primary-300 hover:text-primary-700 dark:border-neutral-600 dark:hover:border-primary-600 dark:hover:text-primary-400">S3</a>
<a href=http://blog.hys.my/tags/%E9%83%A8%E7%BD%B2%E6%8C%87%E5%8D%97/ class="mx-1 my-1 rounded-md border border-neutral-200 px-1 py-[1px] hover:border-primary-300 hover:text-primary-700 dark:border-neutral-600 dark:hover:border-primary-600 dark:hover:text-primary-400">部署指南</a>
<a href=http://blog.hys.my/tags/%E7%A7%81%E6%9C%89%E5%8C%96%E5%AD%98%E5%82%A8/ class="mx-1 my-1 rounded-md border border-neutral-200 px-1 py-[1px] hover:border-primary-300 hover:text-primary-700 dark:border-neutral-600 dark:hover:border-primary-600 dark:hover:text-primary-400">私有化存储</a></div></div></header><section class="prose mt-0 flex max-w-full flex-col dark:prose-invert lg:flex-row"><div class="min-h-0 min-w-0 max-w-prose grow"><blockquote><p><strong>重要免责声明</strong></p><p>本仓库仅供学习、研究、个人实验和内部验证使用,不提供任何形式的商业授权、适用性保证或结果保证。</p><p>作者及仓库维护者不对因使用、修改、分发、部署或依赖本项目而产生的任何直接或间接损失、账号封禁、数据丢失、法律风险或第三方索赔负责。</p><p>请勿将本项目用于违反服务条款、协议、法律法规或平台规则的场景。商业使用前请自行确认 <code>LICENSE</code>、相关协议以及你是否获得了作者的书面许可。</p></blockquote><h2 id=架构概览摘要 class="relative group">架构概览(摘要) <span class="absolute top-0 w-6 transition-opacity opacity-0 -start-6 not-prose group-hover:opacity-100"><a class="group-hover:text-primary-300 dark:group-hover:text-neutral-700" style=text-decoration-line:none!important href=#%e6%9e%b6%e6%9e%84%e6%a6%82%e8%a7%88%e6%91%98%e8%a6%81 aria-label>#</a></span></h2><pre tabindex=0><code class=language-mermaid data-lang=mermaid>flowchart LR
Client[&#34;🖥️ 客户端 / SDK\n(OpenAI / Claude / Gemini)&#34;]
Upstream[&#34;☁️ DeepSeek API&#34;]
subgraph DS2API[&#34;DS2API 3.x(统一 OpenAI 内核)&#34;]
Router[&#34;chi Router + 中间件\n(RequestID / RealIP / Logger / Recoverer / CORS)&#34;]
subgraph Adapters[&#34;协议适配层&#34;]
OA[&#34;OpenAI\n/v1/*&#34;]
CA[&#34;Claude\n/anthropic/* + /v1/messages&#34;]
GA[&#34;Gemini\n/v1beta/models/* + /v1/models/*&#34;]
Admin[&#34;Admin API\n/admin/*&#34;]
WebUI[&#34;WebUI\n/admin(静态托管)&#34;]
end
subgraph Runtime[&#34;运行时核心能力&#34;]
Bridge[&#34;CLIProxy 转换桥\n(多协议 &lt;-&gt; OpenAI)&#34;]
OAEngine[&#34;OpenAI ChatCompletions\n(统一工具调用与流式语义)&#34;]
Auth[&#34;Auth Resolver\n(API key / bearer / x-goog-api-key)&#34;]
Pool[&#34;Account Pool + Queue\n(并发槽位 + 等待队列)&#34;]
DSClient[&#34;DeepSeek Client\n(Session / Auth / HTTP)&#34;]
Pow[&#34;PoW 实现\n(纯 Go 毫秒级)&#34;]
Tool[&#34;Tool Sieve\n(Go/Node 语义对齐)&#34;]
end
end
Client --&gt; Router
Router --&gt; OA &amp; CA &amp; GA
Router --&gt; Admin
Router --&gt; WebUI
OA --&gt; OAEngine
CA &amp; GA --&gt; Bridge
Bridge --&gt; OAEngine
OAEngine --&gt; Auth
OAEngine -.账号轮询.-&gt; Pool
OAEngine -.工具调用解析.-&gt; Tool
OAEngine -.PoW 计算.-&gt; Pow
Auth --&gt; DSClient
DSClient --&gt; Upstream
Upstream --&gt; DSClient
OAEngine --&gt; Bridge
Bridge --&gt; Client
</code></pre><p>详细架构拆分与目录职责见
<a href=docs/ARCHITECTURE.md>docs/ARCHITECTURE.md</a>。</p><ul><li><strong>后端</strong>:Go(<code>cmd/ds2api/</code>、<code>api/</code>、<code>internal/</code>),不依赖 Python 运行时</li><li><strong>前端</strong>:React 管理台(<code>webui/</code>),运行时托管静态构建产物</li><li><strong>部署</strong>:本地运行、Docker、Vercel Serverless、Linux systemd</li></ul><h2 id=核心能力 class="relative group">核心能力 <span class="absolute top-0 w-6 transition-opacity opacity-0 -start-6 not-prose group-hover:opacity-100"><a class="group-hover:text-primary-300 dark:group-hover:text-neutral-700" style=text-decoration-line:none!important href=#%e6%a0%b8%e5%bf%83%e8%83%bd%e5%8a%9b aria-label>#</a></span></h2><table><thead><tr><th>能力</th><th>说明</th></tr></thead><tbody><tr><td>OpenAI 兼容</td><td><code>GET /v1/models</code>、<code>GET /v1/models/{id}</code>、<code>POST /v1/chat/completions</code>、<code>POST /v1/responses</code>、<code>GET /v1/responses/{response_id}</code>、<code>POST /v1/embeddings</code>、<code>POST /v1/files</code></td></tr><tr><td>Claude 兼容</td><td><code>GET /anthropic/v1/models</code>、<code>POST /anthropic/v1/messages</code>、<code>POST /anthropic/v1/messages/count_tokens</code>(及快捷路径 <code>/v1/messages</code>、<code>/messages</code>)</td></tr><tr><td>Gemini 兼容</td><td><code>POST /v1beta/models/{model}:generateContent</code>、<code>POST /v1beta/models/{model}:streamGenerateContent</code>(及 <code>/v1/models/{model}:*</code> 路径)</td></tr><tr><td>多账号轮询</td><td>自动 token 刷新、邮箱/手机号双登录方式</td></tr><tr><td>并发队列控制</td><td>每账号 in-flight 上限 + 等待队列,动态计算建议并发值</td></tr><tr><td>DeepSeek PoW</td><td>纯 Go 高性能实现(DeepSeekHashV1),毫秒级响应</td></tr><tr><td>Tool Calling</td><td>防泄漏处理:非代码块高置信特征识别、<code>delta.tool_calls</code> 早发、结构化增量输出</td></tr><tr><td>Admin API</td><td>配置管理、运行时设置热更新、代理管理、账号测试 / 批量测试、会话清理、导入导出、Vercel 同步、版本检查</td></tr><tr><td>WebUI 管理台</td><td><code>/admin</code> 单页应用(中英文双语、深色模式)</td></tr><tr><td>运维探针</td><td><code>GET /healthz</code>(存活)、<code>GET /readyz</code>(就绪)</td></tr></tbody></table><h2 id=平台兼容矩阵 class="relative group">平台兼容矩阵 <span class="absolute top-0 w-6 transition-opacity opacity-0 -start-6 not-prose group-hover:opacity-100"><a class="group-hover:text-primary-300 dark:group-hover:text-neutral-700" style=text-decoration-line:none!important href=#%e5%b9%b3%e5%8f%b0%e5%85%bc%e5%ae%b9%e7%9f%a9%e9%98%b5 aria-label>#</a></span></h2><table><thead><tr><th>级别</th><th>平台</th><th>当前状态</th></tr></thead><tbody><tr><td>P0</td><td>Codex CLI/SDK(<code>wire_api=chat</code> / <code>wire_api=responses</code>)</td><td>✅</td></tr><tr><td>P0</td><td>OpenAI SDK(JS/Python,chat + responses)</td><td>✅</td></tr><tr><td>P0</td><td>Vercel AI SDK(openai-compatible)</td><td>✅</td></tr><tr><td>P0</td><td>Anthropic SDK(messages)</td><td>✅</td></tr><tr><td>P0</td><td>Google Gemini SDK(generateContent)</td><td>✅</td></tr><tr><td>P1</td><td>LangChain / LlamaIndex / OpenWebUI(OpenAI 兼容接入)</td><td>✅</td></tr></tbody></table><h2 id=模型支持 class="relative group">模型支持 <span class="absolute top-0 w-6 transition-opacity opacity-0 -start-6 not-prose group-hover:opacity-100"><a class="group-hover:text-primary-300 dark:group-hover:text-neutral-700" style=text-decoration-line:none!important href=#%e6%a8%a1%e5%9e%8b%e6%94%af%e6%8c%81 aria-label>#</a></span></h2><h3 id=openai-接口get-v1models class="relative group">OpenAI 接口(<code>GET /v1/models</code>) <span class="absolute top-0 w-6 transition-opacity opacity-0 -start-6 not-prose group-hover:opacity-100"><a class="group-hover:text-primary-300 dark:group-hover:text-neutral-700" style=text-decoration-line:none!important href=#openai-%e6%8e%a5%e5%8f%a3get-v1models aria-label>#</a></span></h3><table><thead><tr><th>模型类型</th><th>模型 ID</th><th>thinking</th><th>search</th></tr></thead><tbody><tr><td>default</td><td><code>deepseek-chat</code></td><td>❌</td><td>❌</td></tr><tr><td>default</td><td><code>deepseek-reasoner</code></td><td>✅</td><td>❌</td></tr><tr><td>default</td><td><code>deepseek-chat-search</code></td><td>❌</td><td>✅</td></tr><tr><td>default</td><td><code>deepseek-reasoner-search</code></td><td>✅</td><td>✅</td></tr><tr><td>expert</td><td><code>deepseek-expert-chat</code></td><td>❌</td><td>❌</td></tr><tr><td>expert</td><td><code>deepseek-expert-reasoner</code></td><td>✅</td><td>❌</td></tr><tr><td>expert</td><td><code>deepseek-expert-chat-search</code></td><td>❌</td><td>✅</td></tr><tr><td>expert</td><td><code>deepseek-expert-reasoner-search</code></td><td>✅</td><td>✅</td></tr><tr><td>vision</td><td><code>deepseek-vision-chat</code></td><td>❌</td><td>❌</td></tr><tr><td>vision</td><td><code>deepseek-vision-reasoner</code></td><td>✅</td><td>❌</td></tr><tr><td>vision</td><td><code>deepseek-vision-chat-search</code></td><td>❌</td><td>✅</td></tr><tr><td>vision</td><td><code>deepseek-vision-reasoner-search</code></td><td>✅</td><td>✅</td></tr></tbody></table><p>除原生模型外,也支持常见 alias 输入(如 <code>gpt-5</code>、<code>gpt-5-mini</code>、<code>gpt-5-codex</code>、<code>gpt-4.1</code>、<code>o3</code>、<code>claude-opus-4-6</code>、<code>claude-sonnet-4-5</code>、<code>gemini-2.5-pro</code>、<code>gemini-2.5-flash</code> 等),但 <code>/v1/models</code> 返回的是规范化后的 DeepSeek 原生模型 ID。</p><h3 id=claude-接口get-anthropicv1models class="relative group">Claude 接口(<code>GET /anthropic/v1/models</code>) <span class="absolute top-0 w-6 transition-opacity opacity-0 -start-6 not-prose group-hover:opacity-100"><a class="group-hover:text-primary-300 dark:group-hover:text-neutral-700" style=text-decoration-line:none!important href=#claude-%e6%8e%a5%e5%8f%a3get-anthropicv1models aria-label>#</a></span></h3><table><thead><tr><th>当前常用模型</th><th>默认映射</th></tr></thead><tbody><tr><td><code>claude-sonnet-4-5</code></td><td><code>deepseek-chat</code></td></tr><tr><td><code>claude-haiku-4-5</code>(兼容 <code>claude-3-5-haiku-latest</code>)</td><td><code>deepseek-chat</code></td></tr><tr><td><code>claude-opus-4-6</code></td><td><code>deepseek-reasoner</code></td></tr></tbody></table><p>可通过配置中的 <code>claude_mapping</code> 或 <code>claude_model_mapping</code> 覆盖映射关系。<code>/anthropic/v1/models</code> 除上述当前主别名外,还会返回 Claude 4.x snapshots,以及 3.x / 2.x / 1.x 历史模型 ID 与常见 alias,便于旧客户端直接兼容。</p><h4 id=claude-code-接入避坑实测 class="relative group">Claude Code 接入避坑(实测) <span class="absolute top-0 w-6 transition-opacity opacity-0 -start-6 not-prose group-hover:opacity-100"><a class="group-hover:text-primary-300 dark:group-hover:text-neutral-700" style=text-decoration-line:none!important href=#claude-code-%e6%8e%a5%e5%85%a5%e9%81%bf%e5%9d%91%e5%ae%9e%e6%b5%8b aria-label>#</a></span></h4><ul><li><code>ANTHROPIC_BASE_URL</code> 推荐直接指向 DS2API 根地址(例如 <code>http://127.0.0.1:5001</code>),Claude Code 会请求 <code>/v1/messages?beta=true</code>。</li><li><code>ANTHROPIC_API_KEY</code> 需要与 <code>config.json</code> 中 <code>keys</code> 一致;建议同时保留常规 key 与 <code>sk-ant-*</code> 形态 key,兼容不同客户端校验习惯。</li><li>若系统设置了代理,建议对 DS2API 地址配置 <code>NO_PROXY=127.0.0.1,localhost,&lt;你的主机IP></code>,避免本地回环请求被代理拦截。</li><li>如遇“工具调用输出成文本、未执行”问题,请优先检查模型输出是否为受支持的 XML/Markup 工具块(例如 <code>&lt;tool_call></code> / <code>&lt;function_call></code> / <code>&lt;invoke></code> / <code>tool_use</code>),而不是纯 JSON <code>tool_calls</code> 片段。</li></ul><h3 id=gemini-接口 class="relative group">Gemini 接口 <span class="absolute top-0 w-6 transition-opacity opacity-0 -start-6 not-prose group-hover:opacity-100"><a class="group-hover:text-primary-300 dark:group-hover:text-neutral-700" style=text-decoration-line:none!important href=#gemini-%e6%8e%a5%e5%8f%a3 aria-label>#</a></span></h3><p>Gemini 适配器将模型名通过 <code>model_aliases</code> 或内置规则映射到 DeepSeek 原生模型,支持 <code>generateContent</code> 和 <code>streamGenerateContent</code> 两种调用方式,并完整支持 Tool Calling(<code>functionDeclarations</code> → <code>functionCall</code> 输出)。</p><h2 id=快速开始 class="relative group">快速开始 <span class="absolute top-0 w-6 transition-opacity opacity-0 -start-6 not-prose group-hover:opacity-100"><a class="group-hover:text-primary-300 dark:group-hover:text-neutral-700" style=text-decoration-line:none!important href=#%e5%bf%ab%e9%80%9f%e5%bc%80%e5%a7%8b aria-label>#</a></span></h2><h3 id=部署方式优先级建议 class="relative group">部署方式优先级建议 <span class="absolute top-0 w-6 transition-opacity opacity-0 -start-6 not-prose group-hover:opacity-100"><a class="group-hover:text-primary-300 dark:group-hover:text-neutral-700" style=text-decoration-line:none!important href=#%e9%83%a8%e7%bd%b2%e6%96%b9%e5%bc%8f%e4%bc%98%e5%85%88%e7%ba%a7%e5%bb%ba%e8%ae%ae aria-label>#</a></span></h3><p>推荐按以下顺序选择部署方式:</p><ol><li><strong>下载 Release 构建包运行</strong>:最省事,产物已编译完成,最适合大多数用户。</li><li><strong>Docker / GHCR 镜像部署</strong>:适合需要容器化、编排或云环境部署。</li><li><strong>Vercel 部署</strong>:适合已有 Vercel 环境且接受其平台约束的场景。</li><li><strong>本地源码运行 / 自行编译</strong>:适合开发、调试或需要自行修改代码的场景。</li></ol><h3 id=通用第一步所有部署方式 class="relative group">通用第一步(所有部署方式) <span class="absolute top-0 w-6 transition-opacity opacity-0 -start-6 not-prose group-hover:opacity-100"><a class="group-hover:text-primary-300 dark:group-hover:text-neutral-700" style=text-decoration-line:none!important href=#%e9%80%9a%e7%94%a8%e7%ac%ac%e4%b8%80%e6%ad%a5%e6%89%80%e6%9c%89%e9%83%a8%e7%bd%b2%e6%96%b9%e5%bc%8f aria-label>#</a></span></h3><p>把 <code>config.json</code> 作为唯一配置源(推荐做法):</p><div class=highlight><pre tabindex=0 class=chroma><code class=language-bash data-lang=bash><span class=line><span class=cl>cp config.example.json config.json
</span></span><span class=line><span class=cl><span class=c1># 编辑 config.json</span>
</span></span></code></pre></div><p>后续部署建议:</p><ul><li>本地运行:直接读取 <code>config.json</code></li><li>Docker / Vercel:由 <code>config.json</code> 生成 <code>DS2API_CONFIG_JSON</code>(Base64)注入环境变量,也可以直接写原始 JSON</li></ul><h3 id=方式一下载-release-构建包 class="relative group">方式一:下载 Release 构建包 <span class="absolute top-0 w-6 transition-opacity opacity-0 -start-6 not-prose group-hover:opacity-100"><a class="group-hover:text-primary-300 dark:group-hover:text-neutral-700" style=text-decoration-line:none!important href=#%e6%96%b9%e5%bc%8f%e4%b8%80%e4%b8%8b%e8%bd%bd-release-%e6%9e%84%e5%bb%ba%e5%8c%85 aria-label>#</a></span></h3><p>每次发布 Release 时,GitHub Actions 会自动构建多平台二进制包:</p><div class=highlight><pre tabindex=0 class=chroma><code class=language-bash data-lang=bash><span class=line><span class=cl><span class=c1># 下载对应平台的压缩包后</span>
</span></span><span class=line><span class=cl>tar -xzf ds2api_&lt;tag&gt;_linux_amd64.tar.gz
</span></span><span class=line><span class=cl><span class=nb>cd</span> ds2api_&lt;tag&gt;_linux_amd64
</span></span><span class=line><span class=cl>cp config.example.json config.json
</span></span><span class=line><span class=cl><span class=c1># 编辑 config.json</span>
</span></span><span class=line><span class=cl>./ds2api
</span></span></code></pre></div><h3 id=方式二docker-运行 class="relative group">方式二:Docker 运行 <span class="absolute top-0 w-6 transition-opacity opacity-0 -start-6 not-prose group-hover:opacity-100"><a class="group-hover:text-primary-300 dark:group-hover:text-neutral-700" style=text-decoration-line:none!important href=#%e6%96%b9%e5%bc%8f%e4%ba%8cdocker-%e8%bf%90%e8%a1%8c aria-label>#</a></span></h3><div class=highlight><pre tabindex=0 class=chroma><code class=language-bash data-lang=bash><span class=line><span class=cl><span class=c1># 1. 准备环境变量和配置文件</span>
</span></span><span class=line><span class=cl>cp .env.example .env
</span></span><span class=line><span class=cl>cp config.example.json config.json
</span></span><span class=line><span class=cl>
</span></span><span class=line><span class=cl><span class=c1># 2. 编辑 .env(至少设置 DS2API_ADMIN_KEY;如需修改宿主机端口,可额外设置 DS2API_HOST_PORT)</span>
</span></span><span class=line><span class=cl><span class=c1># DS2API_ADMIN_KEY=请替换为强密码</span>
</span></span><span class=line><span class=cl>
</span></span><span class=line><span class=cl><span class=c1># 3. 启动</span>
</span></span><span class=line><span class=cl>docker-compose up -d
</span></span><span class=line><span class=cl>
</span></span><span class=line><span class=cl><span class=c1># 4. 查看日志</span>
</span></span><span class=line><span class=cl>docker-compose logs -f
</span></span></code></pre></div><p>默认 <code>docker-compose.yml</code> 会把宿主机 <code>6011</code> 映射到容器内的 <code>5001</code>。如果你希望直接对外暴露 <code>5001</code>,请设置 <code>DS2API_HOST_PORT=5001</code>(或者手动调整 <code>ports</code> 配置)。</p><p>更新镜像:<code>docker-compose up -d --build</code></p><h4 id=zeabur-一键部署dockerfile class="relative group">Zeabur 一键部署(Dockerfile) <span class="absolute top-0 w-6 transition-opacity opacity-0 -start-6 not-prose group-hover:opacity-100"><a class="group-hover:text-primary-300 dark:group-hover:text-neutral-700" style=text-decoration-line:none!important href=#zeabur-%e4%b8%80%e9%94%ae%e9%83%a8%e7%bd%b2dockerfile aria-label>#</a></span></h4><ol><li>点击上方 “Deploy on Zeabur” 按钮,一键部署。</li><li>部署完成后访问 <code>/admin</code>,使用 Zeabur 环境变量/模板指引中的 <code>DS2API_ADMIN_KEY</code> 登录。</li><li>在管理台导入/编辑配置(会写入并持久化到 <code>/data/config.json</code>)。</li></ol><p>说明:Zeabur 使用仓库内 <code>Dockerfile</code> 直接构建时,不需要额外传入 <code>BUILD_VERSION</code>;镜像会优先读取该构建参数,未提供时自动回退到仓库根目录的 <code>VERSION</code> 文件。</p><h3 id=方式三vercel-部署 class="relative group">方式三:Vercel 部署 <span class="absolute top-0 w-6 transition-opacity opacity-0 -start-6 not-prose group-hover:opacity-100"><a class="group-hover:text-primary-300 dark:group-hover:text-neutral-700" style=text-decoration-line:none!important href=#%e6%96%b9%e5%bc%8f%e4%b8%89vercel-%e9%83%a8%e7%bd%b2 aria-label>#</a></span></h3><ol><li>Fork 仓库到自己的 GitHub</li><li>在 Vercel 上导入项目</li><li>配置环境变量(最少设置 <code>DS2API_ADMIN_KEY</code>;推荐同时设置 <code>DS2API_CONFIG_JSON</code>)</li><li>部署</li></ol><p>建议先在仓库目录复制模板并填写:</p><div class=highlight><pre tabindex=0 class=chroma><code class=language-bash data-lang=bash><span class=line><span class=cl>cp config.example.json config.json
</span></span><span class=line><span class=cl><span class=c1># 编辑 config.json</span>
</span></span></code></pre></div><p>推荐:先本地把 <code>config.json</code> 转成 Base64,再粘贴到 <code>DS2API_CONFIG_JSON</code>,避免 JSON 格式错误:</p><div class=highlight><pre tabindex=0 class=chroma><code class=language-bash data-lang=bash><span class=line><span class=cl>base64 &lt; config.json <span class=p>|</span> tr -d <span class=s1>&#39;\n&#39;</span>
</span></span></code></pre></div><blockquote><p><strong>流式说明</strong>:<code>/v1/chat/completions</code> 在 Vercel 上默认走 <code>api/chat-stream.js</code>(Node Runtime)以保证实时 SSE。鉴权、账号选择、会话/PoW 准备仍由 Go 内部 prepare 接口完成;流式响应(含 <code>tools</code>)在 Node 侧执行与 Go 对齐的输出组装与防泄漏处理。</p></blockquote><p>详细部署说明请参阅
<a href=docs/DEPLOY.md>部署指南</a>。</p><h3 id=方式四本地源码运行 class="relative group">方式四:本地源码运行 <span class="absolute top-0 w-6 transition-opacity opacity-0 -start-6 not-prose group-hover:opacity-100"><a class="group-hover:text-primary-300 dark:group-hover:text-neutral-700" style=text-decoration-line:none!important href=#%e6%96%b9%e5%bc%8f%e5%9b%9b%e6%9c%ac%e5%9c%b0%e6%ba%90%e7%a0%81%e8%bf%90%e8%a1%8c aria-label>#</a></span></h3><p><strong>前置要求</strong>:Go 1.26+,Node.js <code>20.19+</code> 或 <code>22.12+</code>(仅在需要构建 WebUI 时)</p><div class=highlight><pre tabindex=0 class=chroma><code class=language-bash data-lang=bash><span class=line><span class=cl><span class=c1># 1. 克隆仓库</span>
</span></span><span class=line><span class=cl>git clone https://github.com/CJackHwang/ds2api.git
</span></span><span class=line><span class=cl><span class=nb>cd</span> ds2api
</span></span><span class=line><span class=cl>
</span></span><span class=line><span class=cl><span class=c1># 2. 配置</span>
</span></span><span class=line><span class=cl>cp config.example.json config.json
</span></span><span class=line><span class=cl><span class=c1># 编辑 config.json,填入你的 DeepSeek 账号信息和 API key</span>
</span></span><span class=line><span class=cl>
</span></span><span class=line><span class=cl><span class=c1># 3. 启动</span>
</span></span><span class=line><span class=cl>go run ./cmd/ds2api
</span></span></code></pre></div><p>默认本地访问地址:<code>http://127.0.0.1:5001</code></p><p>服务实际绑定:<code>0.0.0.0:5001</code>,因此同一局域网设备通常也可以通过你的内网 IP 访问。</p><blockquote><p><strong>WebUI 自动构建</strong>:本地首次启动时,若 <code>static/admin</code> 不存在,会自动尝试执行 <code>npm ci</code>(仅在缺少依赖时)和 <code>npm run build -- --outDir static/admin --emptyOutDir</code>(需要本机有 Node.js)。你也可以手动构建:<code>./scripts/build-webui.sh</code></p></blockquote><h2 id=配置说明 class="relative group">配置说明 <span class="absolute top-0 w-6 transition-opacity opacity-0 -start-6 not-prose group-hover:opacity-100"><a class="group-hover:text-primary-300 dark:group-hover:text-neutral-700" style=text-decoration-line:none!important href=#%e9%85%8d%e7%bd%ae%e8%af%b4%e6%98%8e aria-label>#</a></span></h2><h3 id=configjson-示例 class="relative group"><code>config.json</code> 示例 <span class="absolute top-0 w-6 transition-opacity opacity-0 -start-6 not-prose group-hover:opacity-100"><a class="group-hover:text-primary-300 dark:group-hover:text-neutral-700" style=text-decoration-line:none!important href=#configjson-%e7%a4%ba%e4%be%8b aria-label>#</a></span></h3><div class=highlight><pre tabindex=0 class=chroma><code class=language-json data-lang=json><span class=line><span class=cl><span class=p>{</span>
</span></span><span class=line><span class=cl> <span class=nt>&#34;keys&#34;</span><span class=p>:</span> <span class=p>[</span><span class=s2>&#34;your-api-key-1&#34;</span><span class=p>,</span> <span class=s2>&#34;your-api-key-2&#34;</span><span class=p>],</span>
</span></span><span class=line><span class=cl> <span class=nt>&#34;accounts&#34;</span><span class=p>:</span> <span class=p>[</span>
</span></span><span class=line><span class=cl> <span class=p>{</span>
</span></span><span class=line><span class=cl> <span class=nt>&#34;email&#34;</span><span class=p>:</span> <span class=s2>&#34;user@example.com&#34;</span><span class=p>,</span>
</span></span><span class=line><span class=cl> <span class=nt>&#34;password&#34;</span><span class=p>:</span> <span class=s2>&#34;your-password&#34;</span>
</span></span><span class=line><span class=cl> <span class=p>},</span>
</span></span><span class=line><span class=cl> <span class=p>{</span>
</span></span><span class=line><span class=cl> <span class=nt>&#34;mobile&#34;</span><span class=p>:</span> <span class=s2>&#34;12345678901&#34;</span><span class=p>,</span>
</span></span><span class=line><span class=cl> <span class=nt>&#34;password&#34;</span><span class=p>:</span> <span class=s2>&#34;your-password&#34;</span>
</span></span><span class=line><span class=cl> <span class=p>}</span>
</span></span><span class=line><span class=cl> <span class=p>],</span>
</span></span><span class=line><span class=cl> <span class=nt>&#34;model_aliases&#34;</span><span class=p>:</span> <span class=p>{</span>
</span></span><span class=line><span class=cl> <span class=nt>&#34;gpt-4o&#34;</span><span class=p>:</span> <span class=s2>&#34;deepseek-chat&#34;</span><span class=p>,</span>
</span></span><span class=line><span class=cl> <span class=nt>&#34;gpt-5&#34;</span><span class=p>:</span> <span class=s2>&#34;deepseek-chat&#34;</span><span class=p>,</span>
</span></span><span class=line><span class=cl> <span class=nt>&#34;gpt-5-mini&#34;</span><span class=p>:</span> <span class=s2>&#34;deepseek-chat&#34;</span><span class=p>,</span>
</span></span><span class=line><span class=cl> <span class=nt>&#34;gpt-5-codex&#34;</span><span class=p>:</span> <span class=s2>&#34;deepseek-reasoner&#34;</span><span class=p>,</span>
</span></span><span class=line><span class=cl> <span class=nt>&#34;o3&#34;</span><span class=p>:</span> <span class=s2>&#34;deepseek-reasoner&#34;</span><span class=p>,</span>
</span></span><span class=line><span class=cl> <span class=nt>&#34;claude-opus-4-6&#34;</span><span class=p>:</span> <span class=s2>&#34;deepseek-reasoner&#34;</span><span class=p>,</span>
</span></span><span class=line><span class=cl> <span class=nt>&#34;gemini-2.5-flash&#34;</span><span class=p>:</span> <span class=s2>&#34;deepseek-chat&#34;</span>
</span></span><span class=line><span class=cl> <span class=p>},</span>
</span></span><span class=line><span class=cl> <span class=nt>&#34;compat&#34;</span><span class=p>:</span> <span class=p>{</span>
</span></span><span class=line><span class=cl> <span class=nt>&#34;wide_input_strict_output&#34;</span><span class=p>:</span> <span class=kc>true</span><span class=p>,</span>
</span></span><span class=line><span class=cl> <span class=nt>&#34;strip_reference_markers&#34;</span><span class=p>:</span> <span class=kc>true</span>
</span></span><span class=line><span class=cl> <span class=p>},</span>
</span></span><span class=line><span class=cl> <span class=nt>&#34;responses&#34;</span><span class=p>:</span> <span class=p>{</span>
</span></span><span class=line><span class=cl> <span class=nt>&#34;store_ttl_seconds&#34;</span><span class=p>:</span> <span class=mi>900</span>
</span></span><span class=line><span class=cl> <span class=p>},</span>
</span></span><span class=line><span class=cl> <span class=nt>&#34;embeddings&#34;</span><span class=p>:</span> <span class=p>{</span>
</span></span><span class=line><span class=cl> <span class=nt>&#34;provider&#34;</span><span class=p>:</span> <span class=s2>&#34;deterministic&#34;</span>
</span></span><span class=line><span class=cl> <span class=p>},</span>
</span></span><span class=line><span class=cl> <span class=nt>&#34;claude_mapping&#34;</span><span class=p>:</span> <span class=p>{</span>
</span></span><span class=line><span class=cl> <span class=nt>&#34;fast&#34;</span><span class=p>:</span> <span class=s2>&#34;deepseek-chat&#34;</span><span class=p>,</span>
</span></span><span class=line><span class=cl> <span class=nt>&#34;slow&#34;</span><span class=p>:</span> <span class=s2>&#34;deepseek-reasoner&#34;</span>
</span></span><span class=line><span class=cl> <span class=p>},</span>
</span></span><span class=line><span class=cl> <span class=nt>&#34;admin&#34;</span><span class=p>:</span> <span class=p>{</span>
</span></span><span class=line><span class=cl> <span class=nt>&#34;jwt_expire_hours&#34;</span><span class=p>:</span> <span class=mi>24</span>
</span></span><span class=line><span class=cl> <span class=p>},</span>
</span></span><span class=line><span class=cl> <span class=nt>&#34;runtime&#34;</span><span class=p>:</span> <span class=p>{</span>
</span></span><span class=line><span class=cl> <span class=nt>&#34;account_max_inflight&#34;</span><span class=p>:</span> <span class=mi>2</span><span class=p>,</span>
</span></span><span class=line><span class=cl> <span class=nt>&#34;account_max_queue&#34;</span><span class=p>:</span> <span class=mi>0</span><span class=p>,</span>
</span></span><span class=line><span class=cl> <span class=nt>&#34;global_max_inflight&#34;</span><span class=p>:</span> <span class=mi>0</span><span class=p>,</span>
</span></span><span class=line><span class=cl> <span class=nt>&#34;token_refresh_interval_hours&#34;</span><span class=p>:</span> <span class=mi>6</span>
</span></span><span class=line><span class=cl> <span class=p>},</span>
</span></span><span class=line><span class=cl> <span class=nt>&#34;auto_delete&#34;</span><span class=p>:</span> <span class=p>{</span>
</span></span><span class=line><span class=cl> <span class=nt>&#34;mode&#34;</span><span class=p>:</span> <span class=s2>&#34;none&#34;</span>
</span></span><span class=line><span class=cl> <span class=p>}</span>
</span></span><span class=line><span class=cl><span class=p>}</span>
</span></span></code></pre></div><ul><li><code>keys</code>:API 访问密钥列表,客户端通过 <code>Authorization: Bearer &lt;key></code> 鉴权</li><li><code>accounts</code>:DeepSeek 账号列表,支持 <code>email</code> 或 <code>mobile</code> 登录</li><li><code>token</code>:配置文件中即使填写也会在加载时被清空(不会从 <code>config.json</code> 读取 token);实际 token 仅在运行时内存中维护并自动刷新</li><li><code>model_aliases</code>:常见模型名(如 GPT/Codex/Claude)到 DeepSeek 模型的映射</li><li><code>compat.wide_input_strict_output</code>:建议保持 <code>true</code>(当前实现默认宽进严出)</li><li><code>compat.strip_reference_markers</code>:建议保持 <code>true</code>,用于清理可见输出中的引用/标记</li><li><code>toolcall</code>:旧字段,当前实现已固定为特征匹配 + 高置信早发;即使保留在配置里也会被忽略</li><li><code>responses.store_ttl_seconds</code>:<code>/v1/responses/{id}</code> 的内存缓存 TTL</li><li><code>embeddings.provider</code>:embedding 提供方(当前内置 <code>deterministic/mock/builtin</code>)</li><li><code>claude_mapping</code>:字典中 <code>fast</code>/<code>slow</code> 后缀映射到对应 DeepSeek 模型(兼容读取 <code>claude_model_mapping</code>)</li><li><code>admin</code>:管理后台设置(JWT 过期时间、密码哈希等),可通过 Admin Settings API 热更新</li><li><code>runtime</code>:运行时参数(并发限制、队列大小、托管账号 token 刷新间隔),可通过 Admin Settings API 热更新;<code>account_max_queue=0</code>/<code>global_max_inflight=0</code> 表示按推荐值自动计算,<code>token_refresh_interval_hours=6</code> 为默认强制重登间隔</li><li><code>auto_delete.mode</code>:请求结束后如何清理 DeepSeek 远端聊天记录,支持 <code>none</code>(默认,不删除)、<code>single</code>(仅删除当前会话)、<code>all</code>(清空全部会话);旧配置里的 <code>auto_delete.sessions=true</code> 仍会被视为 <code>all</code></li></ul><h3 id=环境变量 class="relative group">环境变量 <span class="absolute top-0 w-6 transition-opacity opacity-0 -start-6 not-prose group-hover:opacity-100"><a class="group-hover:text-primary-300 dark:group-hover:text-neutral-700" style=text-decoration-line:none!important href=#%e7%8e%af%e5%a2%83%e5%8f%98%e9%87%8f aria-label>#</a></span></h3><table><thead><tr><th>变量</th><th>用途</th><th>默认值</th></tr></thead><tbody><tr><td><code>PORT</code></td><td>服务端口</td><td><code>5001</code></td></tr><tr><td><code>LOG_LEVEL</code></td><td>日志级别</td><td><code>INFO</code>(可选:<code>DEBUG</code>/<code>WARN</code>/<code>ERROR</code>)</td></tr><tr><td><code>DS2API_ADMIN_KEY</code></td><td>Admin 登录密钥</td><td><code>admin</code></td></tr><tr><td><code>DS2API_JWT_SECRET</code></td><td>Admin JWT 签名密钥</td><td>等同 <code>DS2API_ADMIN_KEY</code></td></tr><tr><td><code>DS2API_JWT_EXPIRE_HOURS</code></td><td>Admin JWT 过期小时数</td><td><code>24</code></td></tr><tr><td><code>DS2API_CONFIG_PATH</code></td><td>配置文件路径</td><td><code>config.json</code></td></tr><tr><td><code>DS2API_CONFIG_JSON</code></td><td>直接注入配置(JSON 或 Base64)</td><td>—</td></tr><tr><td><code>DS2API_ENV_WRITEBACK</code></td><td>环境变量模式下自动写回配置文件并切换文件模式(<code>1/true/yes/on</code>)</td><td>关闭</td></tr><tr><td><code>DS2API_STATIC_ADMIN_DIR</code></td><td>管理台静态文件目录</td><td><code>static/admin</code></td></tr><tr><td><code>DS2API_AUTO_BUILD_WEBUI</code></td><td>启动时自动构建 WebUI</td><td>本地开启,Vercel 关闭</td></tr><tr><td><code>DS2API_DEV_PACKET_CAPTURE</code></td><td>本地开发抓包开关(记录最近会话请求/响应体)</td><td>本地非 Vercel 默认开启</td></tr><tr><td><code>DS2API_DEV_PACKET_CAPTURE_LIMIT</code></td><td>本地抓包保留条数(超出自动淘汰)</td><td><code>20</code></td></tr><tr><td><code>DS2API_DEV_PACKET_CAPTURE_MAX_BODY_BYTES</code></td><td>单条响应体最大记录字节数</td><td><code>5242880</code></td></tr><tr><td><code>DS2API_ACCOUNT_MAX_INFLIGHT</code></td><td>每账号最大并发 in-flight 请求数</td><td><code>2</code></td></tr><tr><td><code>DS2API_ACCOUNT_MAX_QUEUE</code></td><td>等待队列上限</td><td><code>recommended_concurrency</code></td></tr><tr><td><code>DS2API_GLOBAL_MAX_INFLIGHT</code></td><td>全局最大 in-flight 请求数</td><td><code>recommended_concurrency</code></td></tr><tr><td><code>DS2API_VERCEL_INTERNAL_SECRET</code></td><td>Vercel 混合流式内部鉴权密钥</td><td>回退用 <code>DS2API_ADMIN_KEY</code></td></tr><tr><td><code>DS2API_VERCEL_STREAM_LEASE_TTL_SECONDS</code></td><td>流式 lease 过期秒数</td><td><code>900</code></td></tr><tr><td><code>VERCEL_TOKEN</code></td><td>Vercel 同步 token</td><td>—</td></tr><tr><td><code>VERCEL_PROJECT_ID</code></td><td>Vercel 项目 ID</td><td>—</td></tr><tr><td><code>VERCEL_TEAM_ID</code></td><td>Vercel 团队 ID</td><td>—</td></tr><tr><td><code>DS2API_VERCEL_PROTECTION_BYPASS</code></td><td>Vercel 部署保护绕过密钥(内部 Node→Go 调用)</td><td>—</td></tr></tbody></table><blockquote><p>提示:当检测到 <code>DS2API_CONFIG_JSON</code> 时,管理台会显示当前模式风险与自动持久化状态(含 <code>DS2API_CONFIG_PATH</code> 路径与模式切换说明)。</p></blockquote><h2 id=鉴权模式 class="relative group">鉴权模式 <span class="absolute top-0 w-6 transition-opacity opacity-0 -start-6 not-prose group-hover:opacity-100"><a class="group-hover:text-primary-300 dark:group-hover:text-neutral-700" style=text-decoration-line:none!important href=#%e9%89%b4%e6%9d%83%e6%a8%a1%e5%bc%8f aria-label>#</a></span></h2><p>调用业务接口(<code>/v1/*</code>、<code>/anthropic/*</code>、Gemini 路由)时支持两种模式:</p><table><thead><tr><th>模式</th><th>说明</th></tr></thead><tbody><tr><td><strong>托管账号模式</strong></td><td><code>Bearer</code> 或 <code>x-api-key</code> 传入 <code>config.keys</code> 中的 key,由服务自动轮询选择账号</td></tr><tr><td><strong>直通 token 模式</strong></td><td>传入 token 不在 <code>config.keys</code> 中时,直接作为 DeepSeek token 使用</td></tr></tbody></table><p>可选请求头 <code>X-Ds2-Target-Account</code>:指定使用某个托管账号(值为 email 或 mobile)。
Gemini 路由还可以使用 <code>x-goog-api-key</code>,或在没有认证头时使用 <code>?key=</code> / <code>?api_key=</code> 作为调用方凭据。</p><h2 id=并发模型 class="relative group">并发模型 <span class="absolute top-0 w-6 transition-opacity opacity-0 -start-6 not-prose group-hover:opacity-100"><a class="group-hover:text-primary-300 dark:group-hover:text-neutral-700" style=text-decoration-line:none!important href=#%e5%b9%b6%e5%8f%91%e6%a8%a1%e5%9e%8b aria-label>#</a></span></h2><pre tabindex=0><code>每账号可用并发 = DS2API_ACCOUNT_MAX_INFLIGHT(默认 2)
建议并发值 = 账号数量 × 每账号并发上限
等待队列上限 = DS2API_ACCOUNT_MAX_QUEUE(默认 = 建议并发值)
429 阈值 = in-flight + 等待队列 ≈ 账号数量 × 4
</code></pre><ul><li>当 in-flight 槽位满时,请求进入等待队列,<strong>不会立即 429</strong></li><li>超出总承载上限后才返回 <code>429 Too Many Requests</code></li><li><code>GET /admin/queue/status</code> 返回实时并发状态</li></ul><h2 id=tool-call-适配 class="relative group">Tool Call 适配 <span class="absolute top-0 w-6 transition-opacity opacity-0 -start-6 not-prose group-hover:opacity-100"><a class="group-hover:text-primary-300 dark:group-hover:text-neutral-700" style=text-decoration-line:none!important href=#tool-call-%e9%80%82%e9%85%8d aria-label>#</a></span></h2><p>当请求中带 <code>tools</code> 时,DS2API 会做防泄漏处理与结构化转译:</p><ol><li>只在<strong>非代码块上下文</strong>启用执行型 toolcall 识别(代码块示例默认不触发)</li><li>解析层当前以 XML/Markup 家族为准(<code>&lt;tool_call></code> / <code>&lt;function_call></code> / <code>&lt;invoke></code> / <code>tool_use</code> / antml 变体);纯 JSON <code>tool_calls</code> 片段默认不作为可执行调用解析</li><li><code>responses</code> 流式严格使用官方 item 生命周期事件(<code>response.output_item.*</code>、<code>response.content_part.*</code>、<code>response.function_call_arguments.*</code>)</li><li><code>responses</code> 支持并执行 <code>tool_choice</code>(<code>auto</code>/<code>none</code>/<code>required</code>/强制函数);<code>required</code> 违规时非流式返回 <code>422</code>,流式返回 <code>response.failed</code></li><li>客户端请求哪种协议,就按该协议返回工具调用(OpenAI/Claude/Gemini 各自原生结构);模型侧优先约束输出规范 XML,再由兼容层转译</li></ol><blockquote><p>说明:当前版本在 parser 层仍以“尽量解析成功”为优先,未启用基于 allow-list 的工具名硬拒绝。</p><p>想评估“把工具调用封装成 XML 再输入模型”的方案,可参考:<code>docs/toolcall-semantics.md</code>。</p></blockquote><h2 id=本地开发抓包工具 class="relative group">本地开发抓包工具 <span class="absolute top-0 w-6 transition-opacity opacity-0 -start-6 not-prose group-hover:opacity-100"><a class="group-hover:text-primary-300 dark:group-hover:text-neutral-700" style=text-decoration-line:none!important href=#%e6%9c%ac%e5%9c%b0%e5%bc%80%e5%8f%91%e6%8a%93%e5%8c%85%e5%b7%a5%e5%85%b7 aria-label>#</a></span></h2><p>用于定位「responses 思考流/工具调用」等问题。开启后会自动记录最近 N 条 DeepSeek 对话上游请求体与响应体(默认 20 条,超出自动淘汰;单条响应体默认最多记录 5 MB)。</p><p>启用示例:</p><div class=highlight><pre tabindex=0 class=chroma><code class=language-bash data-lang=bash><span class=line><span class=cl><span class=nv>DS2API_DEV_PACKET_CAPTURE</span><span class=o>=</span><span class=nb>true</span> <span class=se>\
</span></span></span><span class=line><span class=cl><span class=nv>DS2API_DEV_PACKET_CAPTURE_LIMIT</span><span class=o>=</span><span class=m>20</span> <span class=se>\
</span></span></span><span class=line><span class=cl>go run ./cmd/ds2api
</span></span></code></pre></div><p>查询/清空(需 Admin JWT):</p><ul><li><code>GET /admin/dev/captures</code>:查看抓包列表(最新在前)</li><li><code>DELETE /admin/dev/captures</code>:清空抓包</li><li><code>GET /admin/dev/raw-samples/query?q=关键词&amp;limit=20</code>:按问题关键词查询当前内存抓包,并按 <code>chat_session_id</code> 归并 <code>completion + continue</code> 链</li><li><code>POST /admin/dev/raw-samples/save</code>:把命中的某条抓包链保存为 <code>tests/raw_stream_samples/&lt;sample-id>/</code> 回放样本</li></ul><p>返回字段包含:</p><ul><li><code>request_body</code>:发送给 DeepSeek 的完整请求体</li><li><code>response_body</code>:上游返回的原始流式内容拼接文本</li><li><code>response_truncated</code>:是否触发单条大小截断</li></ul><p>保存接口支持用 <code>query</code>、<code>chain_key</code> 或 <code>capture_id</code> 选中目标。例如:</p><div class=highlight><pre tabindex=0 class=chroma><code class=language-json data-lang=json><span class=line><span class=cl><span class=p>{</span><span class=nt>&#34;query&#34;</span><span class=p>:</span><span class=s2>&#34;广州天气&#34;</span><span class=p>,</span><span class=nt>&#34;sample_id&#34;</span><span class=p>:</span><span class=s2>&#34;gz-weather-from-memory&#34;</span><span class=p>}</span>
</span></span></code></pre></div><h2 id=文档索引 class="relative group">文档索引 <span class="absolute top-0 w-6 transition-opacity opacity-0 -start-6 not-prose group-hover:opacity-100"><a class="group-hover:text-primary-300 dark:group-hover:text-neutral-700" style=text-decoration-line:none!important href=#%e6%96%87%e6%a1%a3%e7%b4%a2%e5%bc%95 aria-label>#</a></span></h2><table><thead><tr><th>文档</th><th>说明</th></tr></thead><tbody><tr><td><a href=API.md>API.md</a> /
<a href=API.en.md>API.en.md</a></td><td>API 接口文档(含请求/响应示例)</td></tr><tr><td><a href=docs/DEPLOY.md>DEPLOY.md</a> /
<a href=docs/DEPLOY.en.md>DEPLOY.en.md</a></td><td>部署指南(本地/Docker/Vercel/systemd)</td></tr><tr><td><a href=docs/CONTRIBUTING.md>CONTRIBUTING.md</a> /
<a href=docs/CONTRIBUTING.en.md>CONTRIBUTING.en.md</a></td><td>贡献指南</td></tr><tr><td><a href=docs/TESTING.md>TESTING.md</a></td><td>测试集使用指南</td></tr></tbody></table><h2 id=测试 class="relative group">测试 <span class="absolute top-0 w-6 transition-opacity opacity-0 -start-6 not-prose group-hover:opacity-100"><a class="group-hover:text-primary-300 dark:group-hover:text-neutral-700" style=text-decoration-line:none!important href=#%e6%b5%8b%e8%af%95 aria-label>#</a></span></h2><div class=highlight><pre tabindex=0 class=chroma><code class=language-bash data-lang=bash><span class=line><span class=cl><span class=c1># 单元测试(Go + Node)</span>
</span></span><span class=line><span class=cl>./tests/scripts/run-unit-all.sh
</span></span><span class=line><span class=cl>
</span></span><span class=line><span class=cl><span class=c1># 一键端到端全链路测试(真实账号,生成完整请求/响应日志)</span>
</span></span><span class=line><span class=cl>./tests/scripts/run-live.sh
</span></span><span class=line><span class=cl>
</span></span><span class=line><span class=cl><span class=c1># 或自定义参数</span>
</span></span><span class=line><span class=cl>go run ./cmd/ds2api-tests <span class=se>\
</span></span></span><span class=line><span class=cl> --config config.json <span class=se>\
</span></span></span><span class=line><span class=cl> --admin-key admin <span class=se>\
</span></span></span><span class=line><span class=cl> --out artifacts/testsuite <span class=se>\
</span></span></span><span class=line><span class=cl> --timeout <span class=m>120</span> <span class=se>\
</span></span></span><span class=line><span class=cl> --retries <span class=m>2</span>
</span></span></code></pre></div><div class=highlight><pre tabindex=0 class=chroma><code class=language-bash data-lang=bash><span class=line><span class=cl><span class=c1># 发布前阻断门禁</span>
</span></span><span class=line><span class=cl>./tests/scripts/check-stage6-manual-smoke.sh
</span></span><span class=line><span class=cl>./tests/scripts/check-refactor-line-gate.sh
</span></span><span class=line><span class=cl>./tests/scripts/run-unit-all.sh
</span></span><span class=line><span class=cl>npm ci --prefix webui <span class=o>&amp;&amp;</span> npm run build --prefix webui
</span></span></code></pre></div><h2 id=测试-1 class="relative group">测试 <span class="absolute top-0 w-6 transition-opacity opacity-0 -start-6 not-prose group-hover:opacity-100"><a class="group-hover:text-primary-300 dark:group-hover:text-neutral-700" style=text-decoration-line:none!important href=#%e6%b5%8b%e8%af%95-1 aria-label>#</a></span></h2><p>详细测试指南请参阅
<a href=docs/TESTING.md>docs/TESTING.md</a>。</p><h3 id=快速测试命令 class="relative group">快速测试命令 <span class="absolute top-0 w-6 transition-opacity opacity-0 -start-6 not-prose group-hover:opacity-100"><a class="group-hover:text-primary-300 dark:group-hover:text-neutral-700" style=text-decoration-line:none!important href=#%e5%bf%ab%e9%80%9f%e6%b5%8b%e8%af%95%e5%91%bd%e4%bb%a4 aria-label>#</a></span></h3><div class=highlight><pre tabindex=0 class=chroma><code class=language-bash data-lang=bash><span class=line><span class=cl><span class=c1># 运行所有单元测试</span>
</span></span><span class=line><span class=cl>go <span class=nb>test</span> ./...
</span></span><span class=line><span class=cl>
</span></span><span class=line><span class=cl><span class=c1># 运行 tool calls 相关测试(调试工具调用问题)</span>
</span></span><span class=line><span class=cl>go <span class=nb>test</span> -v -run <span class=s1>&#39;TestParseToolCalls|TestRepair&#39;</span> ./internal/toolcall/
</span></span><span class=line><span class=cl>
</span></span><span class=line><span class=cl><span class=c1># 运行端到端测试</span>
</span></span><span class=line><span class=cl>./tests/scripts/run-live.sh
</span></span></code></pre></div><h2 id=release-自动构建github-actions class="relative group">Release 自动构建(GitHub Actions) <span class="absolute top-0 w-6 transition-opacity opacity-0 -start-6 not-prose group-hover:opacity-100"><a class="group-hover:text-primary-300 dark:group-hover:text-neutral-700" style=text-decoration-line:none!important href=#release-%e8%87%aa%e5%8a%a8%e6%9e%84%e5%bb%bagithub-actions aria-label>#</a></span></h2><p>工作流文件:<code>.github/workflows/release-artifacts.yml</code></p><ul><li><strong>触发条件</strong>:仅在 GitHub Release <code>published</code> 时触发(普通 push 不会触发)</li><li><strong>构建产物</strong>:多平台二进制包(<code>linux/amd64</code>、<code>linux/arm64</code>、<code>darwin/amd64</code>、<code>darwin/arm64</code>、<code>windows/amd64</code>)+ <code>sha256sums.txt</code></li><li><strong>容器镜像发布</strong>:仅推送到 GHCR(<code>ghcr.io/cjackhwang/ds2api</code>)</li><li><strong>每个压缩包包含</strong>:<code>ds2api</code> 可执行文件、<code>static/admin</code>、WASM 文件(同时支持内置 fallback)、配置示例、README、LICENSE</li></ul><h2 id=免责声明 class="relative group">免责声明 <span class="absolute top-0 w-6 transition-opacity opacity-0 -start-6 not-prose group-hover:opacity-100"><a class="group-hover:text-primary-300 dark:group-hover:text-neutral-700" style=text-decoration-line:none!important href=#%e5%85%8d%e8%b4%a3%e5%a3%b0%e6%98%8e aria-label>#</a></span></h2><p>本项目基于逆向方式实现,仅供学习、研究、个人实验和内部验证使用,不提供任何商业授权、稳定性保证或可用性保证。作者及仓库维护者不对因使用、修改、分发、部署或依赖本项目而产生的任何直接或间接损失、账号封禁、数据丢失、法律风险或第三方索赔负责。</p><p>请勿将本项目用于违反服务条款、协议、法律法规或平台规则的场景。商业使用前请自行确认 <code>LICENSE</code>、相关协议以及你是否获得了作者的书面许可。</p></div></section><footer class="max-w-prose pt-8 print:hidden"><div class=flex><picture class="!mb-0 !mt-0 me-4 w-24 h-auto rounded-full"><img width=480 height=480 class="!mb-0 !mt-0 me-4 w-24 h-auto rounded-full" alt=华禹 loading=lazy decoding=async src=http://blog.hys.my/img/author.png></picture><div class=place-self-center><div class="text-[0.6rem] uppercase leading-3 text-neutral-500 dark:text-neutral-400"></div><div class="font-semibold leading-6 text-neutral-800 dark:text-neutral-300">华禹</div><div class="text-sm text-neutral-700 dark:text-neutral-400">北京理工大学医学技术学院研究生<br>AI食品营养量化初创公司联合创始人</div><div class="text-2xl sm:text-lg"><div class="flex flex-wrap text-neutral-400 dark:text-neutral-500"><a class="px-1 transition-transform hover:scale-125 hover:text-primary-700 dark:hover:text-primary-400" style=will-change:transform href=mailto:hello@your_domain.com target=_blank aria-label=Email rel="me noopener noreferrer"><span class="icon relative inline-block px-1 align-text-bottom"><svg viewBox="0 0 512 512"><path fill="currentColor" d="M207.8 20.73c-93.45 18.32-168.7 93.66-187 187.1-27.64 140.9 68.65 266.2 199.1 285.1 19.01 2.888 36.17-12.26 36.17-31.49l1e-4-.6631c0-15.74-11.44-28.88-26.84-31.24-84.35-12.98-149.2-86.13-149.2-174.2.0-102.9 88.61-185.5 193.4-175.4 91.54 8.869 158.6 91.25 158.6 183.2v16.16c0 22.09-17.94 40.05-40 40.05s-40.01-17.96-40.01-40.05v-120.1c0-8.847-7.161-16.02-16.01-16.02l-31.98.0036c-7.299.0-13.2 4.992-15.12 11.68-24.85-12.15-54.24-16.38-86.06-5.106-38.75 13.73-68.12 48.91-73.72 89.64-9.483 69.01 43.81 128 110.9 128 26.44.0 50.43-9.544 69.59-24.88 24 31.3 65.23 48.69 109.4 37.49C465.2 369.3 496 324.1 495.1 277.2V256.3c0-149.2-133.9-265.632-287.3-235.57zM239.1 304.3c-26.47.0-48-21.56-48-48.05s21.53-48.05 48-48.05 48 21.56 48 48.05-20.6 48.05-48 48.05z"/></svg>
</span></a><a class="px-1 transition-transform hover:scale-125 hover:text-primary-700 dark:hover:text-primary-400" style=will-change:transform href=https://link-to-some-website.com/ target=_blank aria-label=Link rel="me noopener noreferrer"><span class="icon relative inline-block px-1 align-text-bottom"><svg viewBox="0 0 640 512"><path fill="currentColor" d="M172.5 131.1c55.6-55.59 148-55.59 203.6.0 50 50 57.4 129.7 16.3 187.2L391.3 319.9C381 334.2 361 337.6 346.7 327.3c-14.4-10.3-17.8-30.3-7.5-44.6L340.3 281.1C363.2 249 359.6 205.1 331.7 177.2c-31.4-31.4-82.5-31.4-114 0L105.5 289.5c-31.51 30.6-31.51 82.5.0 114C133.3 431.4 177.3 435 209.3 412.1L210.9 410.1C225.3 400.7 245.3 404 255.5 418.4 265.8 432.8 262.5 452.8 248.1 463.1L246.5 464.2c-58.4 41.1-136.3 34.5-186.29-15.4-56.469-56.5-56.469-148.1.0-204.5L172.5 131.1zM467.5 380c-56.5 56.5-148 56.5-204.5.0-50-50-56.5-128.8-15.4-186.3L248.7 192.1C258.1 177.8 278.1 174.4 293.3 184.7 307.7 194.1 311.1 214.1 300.8 229.3L299.7 230.9C276.8 262.1 280.4 306.9 308.3 334.8c31.4 31.4 82.5 31.4 114 0L534.5 222.5c31.5-31.5 31.5-83.4.0-114C506.7 80.63 462.7 76.99 430.7 99.9L429.1 101C414.7 111.3 394.7 107.1 384.5 93.58 374.2 79.2 377.5 59.21 391.9 48.94L393.5 47.82C451 6.731 529.8 13.25 579.8 63.24c56.5 56.46 56.5 148.06.0 204.46L467.5 380z"/></svg>
</span></a><a class="px-1 transition-transform hover:scale-125 hover:text-primary-700 dark:hover:text-primary-400" style=will-change:transform href=https://www.amazon.com/hz/wishlist/ls/wishlist-id target=_blank aria-label=Amazon rel="me noopener noreferrer"><span class="icon relative inline-block px-1 align-text-bottom"><svg viewBox="0 0 448 512"><path fill="currentColor" d="M257.2 162.7c-48.7 1.8-169.5 15.5-169.5 117.5.0 109.5 138.3 114 183.5 43.2 6.5 10.2 35.4 37.5 45.3 46.8l56.8-56S341 288.9 341 261.4V114.3C341 89 316.5 32 228.7 32 140.7 32 94 87 94 136.3l73.5 6.8c16.3-49.5 54.2-49.5 54.2-49.5 40.7-.1 35.5 29.8 35.5 69.1zm0 86.8c0 80-84.2 68-84.2 17.2.0-47.2 50.5-56.7 84.2-57.8v40.6zm136 163.5c-7.7 10-70 67-174.5 67S34.2 408.5 9.7 379c-6.8-7.7 1-11.3 5.5-8.3C88.5 415.2 203 488.5 387.7 401c7.5-3.7 13.3 2 5.5 12zm39.8 2.2c-6.5 15.8-16 26.8-21.2 31-5.5 4.5-9.5 2.7-6.5-3.8s19.3-46.5 12.7-55c-6.5-8.3-37-4.3-48-3.2-10.8 1-13 2-14-.3-2.3-5.7 21.7-15.5 37.5-17.5 15.7-1.8 41-.8 46 5.7 3.7 5.1.0 27.1-6.5 43.1z"/></svg>
</span></a><a class="px-1 transition-transform hover:scale-125 hover:text-primary-700 dark:hover:text-primary-400" style=will-change:transform href=https://www.apple.com target=_blank aria-label=Apple rel="me noopener noreferrer"><span class="icon relative inline-block px-1 align-text-bottom"><svg viewBox="0 0 384 512"><path fill="currentColor" d="M318.7 268.7c-.2-36.7 16.4-64.4 50-84.8-18.8-26.9-47.2-41.7-84.7-44.6-35.5-2.8-74.3 20.7-88.5 20.7-15 0-49.4-19.7-76.4-19.7C63.3 141.2 4 184.8 4 273.5q0 39.3 14.4 81.2c12.8 36.7 59 126.7 107.2 125.2 25.2-.6 43-17.9 75.8-17.9 31.8.0 48.3 17.9 76.4 17.9 48.6-.7 90.4-82.5 102.6-119.3-65.2-30.7-61.7-90-61.7-91.9zm-56.6-164.2c27.3-32.4 24.8-61.9 24-72.5-24.1 1.4-52 16.4-67.9 34.9-17.5 19.8-27.8 44.3-25.6 71.9 26.1 2 49.9-11.4 69.5-34.3z"/></svg>
</span></a><a class="px-1 transition-transform hover:scale-125 hover:text-primary-700 dark:hover:text-primary-400" style=will-change:transform href=https://xing.com/profile/username target=_blank aria-label=Xing rel="me noopener noreferrer"><span class="icon relative inline-block px-1 align-text-bottom"><svg viewBox="0 0 384 512"><path fill="currentColor" d="M162.7 210c-1.8 3.3-25.2 44.4-70.1 123.5-4.9 8.3-10.8 12.5-17.7 12.5H9.8c-7.7.0-12.1-7.5-8.5-14.4l69-121.3c.2.0.2-.1.0-.3l-43.9-75.6c-4.3-7.8.3-14.1 8.5-14.1H1e2c7.3.0 13.3 4.1 18 12.2l44.7 77.5zM382.6 46.1l-144 253v.3L330.2 466c3.9 7.1.2 14.1-8.5 14.1h-65.2c-7.6.0-13.6-4-18-12.2l-92.4-168.5c3.3-5.8 51.5-90.8 144.8-255.2 4.6-8.1 10.4-12.2 17.5-12.2h65.7c8 0 12.3 6.7 8.5 14.1z"/></svg></span></a></div></div></div></div><div class=pt-8><hr class="border-dotted border-neutral-300 dark:border-neutral-600"><div class="flex justify-between pt-3"><span><a class="group flex" href=http://blog.hys.my/posts/minio/><span class="me-2 text-neutral-700 transition-transform group-hover:-translate-x-[2px] group-hover:text-primary-600 dark:text-neutral dark:group-hover:text-primary-400"><span class="ltr:inline rtl:hidden">&larr;</span><span class="ltr:hidden rtl:inline">&rarr;</span></span>
<span class="flex flex-col"><span class="mt-[0.1rem] leading-6 group-hover:underline group-hover:decoration-primary-500">MinIO对象存储部署:S3兼容的私有化存储方案</span>
<span class="mt-[0.1rem] text-xs text-neutral-500 dark:text-neutral-400"><time datetime="2026-04-18 10:00:00 +0800 +0800"></time>
</span></span></a></span><span><a class="group flex text-right" href=http://blog.hys.my/posts/ds2api/><span class="flex flex-col"><span class="mt-[0.1rem] leading-6 group-hover:underline group-hover:decoration-primary-500">DS2API说明文档</span>
<span class="mt-[0.1rem] text-xs text-neutral-500 dark:text-neutral-400"><time datetime="2026-04-18 10:00:00 +0800 +0800"></time>
</span></span><span class="ms-2 text-neutral-700 transition-transform group-hover:-translate-x-[-2px] group-hover:text-primary-600 dark:text-neutral dark:group-hover:text-primary-400"><span class="ltr:inline rtl:hidden">&rarr;</span><span class="ltr:hidden rtl:inline">&larr;</span></span></a></span></div></div></footer></article></main><div class="pointer-events-none absolute bottom-0 end-0 top-[100vh] w-12" id=to-top hidden=true><a href=#the-top class="pointer-events-auto sticky top-[calc(100vh-5.5rem)] flex h-12 w-12 items-center justify-center rounded-full bg-neutral/50 text-xl text-neutral-700 backdrop-blur hover:text-primary-600 dark:bg-neutral-800/50 dark:text-neutral dark:hover:text-primary-400" aria-label title>&uarr;</a></div><footer class="py-10 print:hidden"><div class="flex items-center justify-between"><div><p class="text-sm text-neutral-500 dark:text-neutral-400">&copy;
2026
华禹</p><p class="text-xs text-neutral-500 dark:text-neutral-400"></p></div><div class="flex flex-row items-center"></div></div></footer><div id=search-wrapper class="invisible fixed inset-0 z-50 flex h-screen w-screen cursor-default flex-col bg-neutral-500/50 p-4 backdrop-blur-sm dark:bg-neutral-900/50 sm:p-6 md:p-[10vh] lg:p-[12vh]" data-url=http://blog.hys.my/><div id=search-modal class="top-20 mx-auto flex min-h-0 w-full max-w-3xl flex-col rounded-md border border-neutral-200 bg-neutral shadow-lg dark:border-neutral-700 dark:bg-neutral-800"><header class="relative z-10 flex flex-none items-center justify-between px-2"><form class="flex min-w-0 flex-auto items-center"><div class="flex h-8 w-8 items-center justify-center text-neutral-400"><span class="icon relative inline-block px-1 align-text-bottom"><svg aria-hidden="true" focusable="false" data-prefix="fas" data-icon="search" class="svg-inline--fa fa-search fa-w-16" role="img" viewBox="0 0 512 512"><path fill="currentColor" d="M505 442.7 405.3 343c-4.5-4.5-10.6-7-17-7H372c27.6-35.3 44-79.7 44-128C416 93.1 322.9.0 208 0S0 93.1.0 208s93.1 208 208 208c48.3.0 92.7-16.4 128-44v16.3c0 6.4 2.5 12.5 7 17l99.7 99.7c9.4 9.4 24.6 9.4 33.9.0l28.3-28.3c9.4-9.4 9.4-24.6.1-34zM208 336c-70.7.0-128-57.2-128-128 0-70.7 57.2-128 128-128 70.7.0 128 57.2 128 128 0 70.7-57.2 128-128 128z"/></svg></span></div><input type=search id=search-query class="mx-1 flex h-12 flex-auto appearance-none bg-transparent focus:outline-dotted focus:outline-2 focus:outline-transparent" placeholder tabindex=0></form><button id=close-search-button class="flex h-8 w-8 items-center justify-center text-neutral-700 hover:text-primary-600 dark:text-neutral dark:hover:text-primary-400" title>
<span class="icon relative inline-block px-1 align-text-bottom"><svg viewBox="0 0 320 512"><path fill="currentColor" d="M310.6 361.4c12.5 12.5 12.5 32.75.0 45.25C304.4 412.9 296.2 416 288 416s-16.38-3.125-22.62-9.375L160 301.3 54.63 406.6C48.38 412.9 40.19 416 32 416S15.63 412.9 9.375 406.6c-12.5-12.5-12.5-32.75.0-45.25l105.4-105.4L9.375 150.6c-12.5-12.5-12.5-32.75.0-45.25s32.75-12.5 45.25.0L160 210.8l105.4-105.4c12.5-12.5 32.75-12.5 45.25.0s12.5 32.75.0 45.25l-105.4 105.4L310.6 361.4z"/></svg></span></button></header><section class="flex-auto overflow-auto px-2"><ul id=search-results></ul></section></div></div></div></body></html>