190 lines
70 KiB
HTML
190 lines
70 KiB
HTML
<!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说明文档 · 华禹 个人博客</title><meta name=title content="DS2API说明文档 · 华禹 个人博客"><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">↓</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">·</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["🖥️ 客户端 / SDK\n(OpenAI / Claude / Gemini)"]
|
||
Upstream["☁️ DeepSeek API"]
|
||
|
||
subgraph DS2API["DS2API 3.x(统一 OpenAI 内核)"]
|
||
Router["chi Router + 中间件\n(RequestID / RealIP / Logger / Recoverer / CORS)"]
|
||
|
||
subgraph Adapters["协议适配层"]
|
||
OA["OpenAI\n/v1/*"]
|
||
CA["Claude\n/anthropic/* + /v1/messages"]
|
||
GA["Gemini\n/v1beta/models/* + /v1/models/*"]
|
||
Admin["Admin API\n/admin/*"]
|
||
WebUI["WebUI\n/admin(静态托管)"]
|
||
end
|
||
|
||
subgraph Runtime["运行时核心能力"]
|
||
Bridge["CLIProxy 转换桥\n(多协议 <-> OpenAI)"]
|
||
OAEngine["OpenAI ChatCompletions\n(统一工具调用与流式语义)"]
|
||
Auth["Auth Resolver\n(API key / bearer / x-goog-api-key)"]
|
||
Pool["Account Pool + Queue\n(并发槽位 + 等待队列)"]
|
||
DSClient["DeepSeek Client\n(Session / Auth / HTTP)"]
|
||
Pow["PoW 实现\n(纯 Go 毫秒级)"]
|
||
Tool["Tool Sieve\n(Go/Node 语义对齐)"]
|
||
end
|
||
end
|
||
|
||
Client --> Router
|
||
Router --> OA & CA & GA
|
||
Router --> Admin
|
||
Router --> WebUI
|
||
|
||
OA --> OAEngine
|
||
CA & GA --> Bridge
|
||
Bridge --> OAEngine
|
||
OAEngine --> Auth
|
||
OAEngine -.账号轮询.-> Pool
|
||
OAEngine -.工具调用解析.-> Tool
|
||
OAEngine -.PoW 计算.-> Pow
|
||
Auth --> DSClient
|
||
DSClient --> Upstream
|
||
Upstream --> DSClient
|
||
OAEngine --> Bridge
|
||
Bridge --> 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,<你的主机IP></code>,避免本地回环请求被代理拦截。</li><li>如遇“工具调用输出成文本、未执行”问题,请优先检查模型输出是否为受支持的 XML/Markup 工具块(例如 <code><tool_call></code> / <code><function_call></code> / <code><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_<tag>_linux_amd64.tar.gz
|
||
</span></span><span class=line><span class=cl><span class=nb>cd</span> ds2api_<tag>_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 < config.json <span class=p>|</span> tr -d <span class=s1>'\n'</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>"keys"</span><span class=p>:</span> <span class=p>[</span><span class=s2>"your-api-key-1"</span><span class=p>,</span> <span class=s2>"your-api-key-2"</span><span class=p>],</span>
|
||
</span></span><span class=line><span class=cl> <span class=nt>"accounts"</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>"email"</span><span class=p>:</span> <span class=s2>"user@example.com"</span><span class=p>,</span>
|
||
</span></span><span class=line><span class=cl> <span class=nt>"password"</span><span class=p>:</span> <span class=s2>"your-password"</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>"mobile"</span><span class=p>:</span> <span class=s2>"12345678901"</span><span class=p>,</span>
|
||
</span></span><span class=line><span class=cl> <span class=nt>"password"</span><span class=p>:</span> <span class=s2>"your-password"</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>"model_aliases"</span><span class=p>:</span> <span class=p>{</span>
|
||
</span></span><span class=line><span class=cl> <span class=nt>"gpt-4o"</span><span class=p>:</span> <span class=s2>"deepseek-chat"</span><span class=p>,</span>
|
||
</span></span><span class=line><span class=cl> <span class=nt>"gpt-5"</span><span class=p>:</span> <span class=s2>"deepseek-chat"</span><span class=p>,</span>
|
||
</span></span><span class=line><span class=cl> <span class=nt>"gpt-5-mini"</span><span class=p>:</span> <span class=s2>"deepseek-chat"</span><span class=p>,</span>
|
||
</span></span><span class=line><span class=cl> <span class=nt>"gpt-5-codex"</span><span class=p>:</span> <span class=s2>"deepseek-reasoner"</span><span class=p>,</span>
|
||
</span></span><span class=line><span class=cl> <span class=nt>"o3"</span><span class=p>:</span> <span class=s2>"deepseek-reasoner"</span><span class=p>,</span>
|
||
</span></span><span class=line><span class=cl> <span class=nt>"claude-opus-4-6"</span><span class=p>:</span> <span class=s2>"deepseek-reasoner"</span><span class=p>,</span>
|
||
</span></span><span class=line><span class=cl> <span class=nt>"gemini-2.5-flash"</span><span class=p>:</span> <span class=s2>"deepseek-chat"</span>
|
||
</span></span><span class=line><span class=cl> <span class=p>},</span>
|
||
</span></span><span class=line><span class=cl> <span class=nt>"compat"</span><span class=p>:</span> <span class=p>{</span>
|
||
</span></span><span class=line><span class=cl> <span class=nt>"wide_input_strict_output"</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>"strip_reference_markers"</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>"responses"</span><span class=p>:</span> <span class=p>{</span>
|
||
</span></span><span class=line><span class=cl> <span class=nt>"store_ttl_seconds"</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>"embeddings"</span><span class=p>:</span> <span class=p>{</span>
|
||
</span></span><span class=line><span class=cl> <span class=nt>"provider"</span><span class=p>:</span> <span class=s2>"deterministic"</span>
|
||
</span></span><span class=line><span class=cl> <span class=p>},</span>
|
||
</span></span><span class=line><span class=cl> <span class=nt>"claude_mapping"</span><span class=p>:</span> <span class=p>{</span>
|
||
</span></span><span class=line><span class=cl> <span class=nt>"fast"</span><span class=p>:</span> <span class=s2>"deepseek-chat"</span><span class=p>,</span>
|
||
</span></span><span class=line><span class=cl> <span class=nt>"slow"</span><span class=p>:</span> <span class=s2>"deepseek-reasoner"</span>
|
||
</span></span><span class=line><span class=cl> <span class=p>},</span>
|
||
</span></span><span class=line><span class=cl> <span class=nt>"admin"</span><span class=p>:</span> <span class=p>{</span>
|
||
</span></span><span class=line><span class=cl> <span class=nt>"jwt_expire_hours"</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>"runtime"</span><span class=p>:</span> <span class=p>{</span>
|
||
</span></span><span class=line><span class=cl> <span class=nt>"account_max_inflight"</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>"account_max_queue"</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>"global_max_inflight"</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>"token_refresh_interval_hours"</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>"auto_delete"</span><span class=p>:</span> <span class=p>{</span>
|
||
</span></span><span class=line><span class=cl> <span class=nt>"mode"</span><span class=p>:</span> <span class=s2>"none"</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 <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><tool_call></code> / <code><function_call></code> / <code><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=关键词&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/<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>"query"</span><span class=p>:</span><span class=s2>"广州天气"</span><span class=p>,</span><span class=nt>"sample_id"</span><span class=p>:</span><span class=s2>"gz-weather-from-memory"</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>&&</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>'TestParseToolCalls|TestRepair'</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">←</span><span class="ltr:hidden rtl:inline">→</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">→</span><span class="ltr:hidden rtl:inline">←</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>↑</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">©
|
||
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> |