From 2a05c96f5f4eea352b5f914a694fe91ab5ad9b53 Mon Sep 17 00:00:00 2001 From: "CJACK." Date: Fri, 3 Apr 2026 01:13:13 +0800 Subject: [PATCH] docs: refresh architecture diagram and structure sections --- API.en.md | 21 ++++++++++---- API.md | 21 ++++++++++---- README.MD | 62 ++++++++++++++++++++++++++--------------- README.en.md | 62 ++++++++++++++++++++++++++--------------- VERSION | 2 +- docs/CONTRIBUTING.en.md | 3 +- docs/CONTRIBUTING.md | 3 +- docs/DEPLOY.en.md | 4 +-- docs/DEPLOY.md | 4 +-- 9 files changed, 117 insertions(+), 65 deletions(-) diff --git a/API.en.md b/API.en.md index 967c258..73d6eaa 100644 --- a/API.en.md +++ b/API.en.md @@ -31,6 +31,13 @@ This document describes the actual behavior of the current Go codebase. | Health probes | `GET /healthz`, `GET /readyz` | | CORS | Enabled (`Access-Control-Allow-Origin: *`, allows `Content-Type`, `Authorization`, `X-API-Key`, `X-Ds2-Target-Account`, `X-Vercel-Protection-Bypass`) | +### 3.0 Adapter-Layer Notes + +- OpenAI / Claude / Gemini protocols are now mounted on one shared `chi` router tree assembled in `internal/server/router.go`. +- Adapter responsibilities are streamlined to: **request normalization → DeepSeek invocation → protocol-shaped rendering**, reducing legacy split-logic paths. +- Tool-calling semantics are aligned between Go and Node runtime: structured parsing first (JSON/XML/invoke/markup), plus stream-time anti-leak filtering. +- `Admin API` separates static config from runtime policy: `/admin/config*` for configuration state, `/admin/settings*` for runtime behavior. + --- ## Configuration Best Practice @@ -91,7 +98,9 @@ Gemini-compatible clients can also send `x-goog-api-key`, `?key=`, or `?api_key= | Method | Path | Auth | Description | | --- | --- | --- | --- | | GET | `/healthz` | None | Liveness probe | +| HEAD | `/healthz` | None | Liveness probe (no body) | | GET | `/readyz` | None | Readiness probe | +| HEAD | `/readyz` | None | Readiness probe (no body) | | GET | `/v1/models` | None | OpenAI model list | | GET | `/v1/models/{id}` | None | OpenAI single-model query (alias accepted) | | POST | `/v1/chat/completions` | Business | OpenAI chat completions | @@ -931,15 +940,15 @@ Checks the current build version and the latest GitHub Release: ```json { "success": true, - "current_version": "2.3.5", - "current_tag": "v2.3.5", + "current_version": "3.0.0", + "current_tag": "v3.0.0", "source": "file:VERSION", "checked_at": "2026-03-29T00:00:00Z", - "latest_tag": "v2.3.6", - "latest_version": "2.3.6", - "release_url": "https://github.com/CJackHwang/ds2api/releases/tag/v2.3.6", + "latest_tag": "v3.0.0", + "latest_version": "3.0.0", + "release_url": "https://github.com/CJackHwang/ds2api/releases/tag/v3.0.0", "published_at": "2026-03-28T12:00:00Z", - "has_update": true + "has_update": false } ``` diff --git a/API.md b/API.md index aac0e3b..061529e 100644 --- a/API.md +++ b/API.md @@ -31,6 +31,13 @@ | 健康检查 | `GET /healthz`、`GET /readyz` | | CORS | 已启用(`Access-Control-Allow-Origin: *`,允许 `Content-Type`, `Authorization`, `X-API-Key`, `X-Ds2-Target-Account`, `X-Vercel-Protection-Bypass`) | +### 3.0 接口适配层说明 + +- OpenAI / Claude / Gemini 三套协议已统一挂在同一 `chi` 路由树上,由 `internal/server/router.go` 负责装配。 +- 适配器层职责收敛为:**请求归一化 → DeepSeek 调用 → 协议形态渲染**,减少历史版本中“同能力多处实现”的分叉。 +- Tool Calling 的解析策略在 Go 与 Node Runtime 间保持一致:优先结构化解析(JSON/XML/invoke/markup),并在流式场景执行防泄漏筛分。 +- `Admin API` 将配置与运行时策略分开:`/admin/config*` 管静态配置,`/admin/settings*` 管运行时行为。 + --- ## 配置最佳实践 @@ -91,7 +98,9 @@ Gemini 兼容客户端还可以使用 `x-goog-api-key`、`?key=` 或 `?api_key=` | 方法 | 路径 | 鉴权 | 说明 | | --- | --- | --- | --- | | GET | `/healthz` | 无 | 存活探针 | +| HEAD | `/healthz` | 无 | 存活探针(无响应体) | | GET | `/readyz` | 无 | 就绪探针 | +| HEAD | `/readyz` | 无 | 就绪探针(无响应体) | | GET | `/v1/models` | 无 | OpenAI 模型列表 | | GET | `/v1/models/{id}` | 无 | OpenAI 单模型查询(支持 alias 入参) | | POST | `/v1/chat/completions` | 业务 | OpenAI 对话补全 | @@ -937,15 +946,15 @@ data: {"type":"message_stop"} ```json { "success": true, - "current_version": "2.3.5", - "current_tag": "v2.3.5", + "current_version": "3.0.0", + "current_tag": "v3.0.0", "source": "file:VERSION", "checked_at": "2026-03-29T00:00:00Z", - "latest_tag": "v2.3.6", - "latest_version": "2.3.6", - "release_url": "https://github.com/CJackHwang/ds2api/releases/tag/v2.3.6", + "latest_tag": "v3.0.0", + "latest_version": "3.0.0", + "release_url": "https://github.com/CJackHwang/ds2api/releases/tag/v3.0.0", "published_at": "2026-03-28T12:00:00Z", - "has_update": true + "has_update": false } ``` diff --git a/README.MD b/README.MD index 1c20ee6..e9002fd 100644 --- a/README.MD +++ b/README.MD @@ -28,43 +28,58 @@ ```mermaid flowchart LR - Client["🖥️ 客户端\n(OpenAI / Claude / Gemini 兼容)"] + Client["🖥️ 客户端 / SDK\n(OpenAI / Claude / Gemini)"] - subgraph DS2API["DS2API 服务"] - direction TB - CORS["CORS 中间件"] - Auth["🔐 鉴权中间件"] + subgraph DS2API["DS2API 3.0(统一 Go 路由内核)"] + Router["chi Router + 中间件\n(RequestID / Recoverer / CORS / Timeout)"] - subgraph Adapters["适配器层"] - OA["OpenAI 适配器\n/v1/*"] - CA["Claude 适配器\n/anthropic/*"] - GA["Gemini 适配器\n/v1beta/models/*"] + subgraph Adapters["协议适配层"] + OA["OpenAI\n/v1/*"] + CA["Claude\n/anthropic/* + /v1/messages"] + GA["Gemini\n/v1beta/models/* + /v1/models/*"] end - subgraph Support["支撑模块"] - Pool["📦 账号池 / 并发队列"] - PoW["⚙️ PoW WASM\n(wazero)"] + subgraph Runtime["运行时与核心能力"] + Auth["Auth Resolver\n(API key / bearer / x-goog-api-key)"] + Pool["Account Pool + Queue\n(并发与轮询)"] + DS["DeepSeek Client\n(Session / Auth / HTTP)"] + Pow["PoW WASM (wazero)"] + Tool["Tool Sieve\n(Go/Node 语义对齐)"] + Format["Response Render\n(OpenAI/Claude/Gemini)"] end - Admin["🛠️ Admin API\n/admin/*"] - WebUI["🌐 WebUI\n(/admin)"] + Admin["Admin API\n/admin/*"] + WebUI["WebUI Static\n/admin"] end - DS["☁️ DeepSeek API"] + Upstream["☁️ DeepSeek Upstream"] - Client -- "请求" --> CORS --> Auth - Auth --> OA & CA & GA - OA & CA & GA -- "调用" --> DS - Auth --> Admin - OA & CA & GA -. "轮询选账号" .-> Pool - OA & CA & GA -. "计算 PoW" .-> PoW - DS -- "响应" --> Client + Client --> Router + Router --> OA & CA & GA + Router --> Admin + Router --> WebUI + OA --> Auth --> Pool --> DS + CA --> Auth + GA --> Auth + DS --> Pow + DS --> Tool --> Format + DS --> Upstream + Upstream --> DS ``` - **后端**:Go(`cmd/ds2api/`、`api/`、`internal/`),不依赖 Python 运行时 - **前端**:React 管理台(`webui/`),运行时托管静态构建产物 - **部署**:本地运行、Docker、Vercel Serverless、Linux systemd +### 3.0 底层架构调整(相较旧版本) + +- **统一路由内核**:所有协议入口统一汇聚到 `internal/server/router.go`,并在同一路由树中注册 OpenAI / Claude / Gemini / Admin / WebUI 路由,避免多入口行为漂移。 +- **适配器分层更清晰**:`internal/adapter/{openai,claude,gemini}` 只负责协议形态、错误格式和流式事件语义,DeepSeek 侧调用统一收敛到共享调用层。 +- **Tool Calling 双运行时对齐**:Go 侧(`internal/util`)与 Vercel Node 侧(`internal/js/helpers/stream-tool-sieve`)保持一致的解析/防泄漏语义,覆盖 JSON / XML / invoke / text-kv 多风格输入。 +- **配置与运行时设置解耦**:静态配置(`config`)与运行时策略(`settings`)通过 Admin API 分离管理,支持热更新和密码轮换失效旧 JWT。 +- **流式能力升级**:`/v1/responses` 与 `/v1/chat/completions` 共享更一致的工具调用增量输出策略,降低不同 SDK 下的行为差异。 +- **可观测与可运维增强**:`/healthz`、`/readyz`、`/admin/version`、`/admin/dev/captures` 形成排障闭环,便于发布后验证。 + ## 核心能力 | 能力 | 说明 | @@ -144,7 +159,7 @@ cp config.example.json config.json ### 方式一:本地运行 -**前置要求**:Go 1.24+,Node.js 20+(仅在需要构建 WebUI 时) +**前置要求**:Go 1.26+,Node.js 20+(仅在需要构建 WebUI 时) ```bash # 1. 克隆仓库 @@ -412,6 +427,7 @@ go run ./cmd/ds2api ```text ds2api/ +├── app/ # 统一 Handler 入口(供 Vercel / 本地共用) ├── cmd/ │ ├── ds2api/ # 本地 / 容器启动入口 │ └── ds2api-tests/ # 端到端测试集入口 diff --git a/README.en.md b/README.en.md index 34bc615..f5378d6 100644 --- a/README.en.md +++ b/README.en.md @@ -28,43 +28,58 @@ DS2API converts DeepSeek Web chat capability into OpenAI-compatible, Claude-comp ```mermaid flowchart LR - Client["🖥️ Clients\n(OpenAI / Claude / Gemini compat)"] + Client["🖥️ Clients / SDKs\n(OpenAI / Claude / Gemini)"] - subgraph DS2API["DS2API Service"] - direction TB - CORS["CORS Middleware"] - Auth["🔐 Auth Middleware"] + subgraph DS2API["DS2API 3.0 (Unified Go Routing Core)"] + Router["chi Router + Middleware\n(RequestID / Recoverer / CORS / Timeout)"] - subgraph Adapters["Adapter Layer"] - OA["OpenAI Adapter\n/v1/*"] - CA["Claude Adapter\n/anthropic/*"] - GA["Gemini Adapter\n/v1beta/models/*"] + subgraph Adapters["Protocol Adapters"] + OA["OpenAI\n/v1/*"] + CA["Claude\n/anthropic/* + /v1/messages"] + GA["Gemini\n/v1beta/models/* + /v1/models/*"] end - subgraph Support["Support Modules"] - Pool["📦 Account Pool / Queue"] - PoW["⚙️ PoW WASM\n(wazero)"] + subgraph Runtime["Runtime + Core Capabilities"] + Auth["Auth Resolver\n(API key / bearer / x-goog-api-key)"] + Pool["Account Pool + Queue\n(concurrency and rotation)"] + DS["DeepSeek Client\n(session / auth / HTTP)"] + Pow["PoW WASM (wazero)"] + Tool["Tool Sieve\n(Go/Node semantic parity)"] + Format["Response Render\n(OpenAI/Claude/Gemini)"] end - Admin["🛠️ Admin API\n/admin/*"] - WebUI["🌐 WebUI\n(/admin)"] + Admin["Admin API\n/admin/*"] + WebUI["WebUI Static\n/admin"] end - DS["☁️ DeepSeek API"] + Upstream["☁️ DeepSeek Upstream"] - Client -- "Request" --> CORS --> Auth - Auth --> OA & CA & GA - OA & CA & GA -- "Call" --> DS - Auth --> Admin - OA & CA & GA -. "Rotate accounts" .-> Pool - OA & CA & GA -. "Compute PoW" .-> PoW - DS -- "Response" --> Client + Client --> Router + Router --> OA & CA & GA + Router --> Admin + Router --> WebUI + OA --> Auth --> Pool --> DS + CA --> Auth + GA --> Auth + DS --> Pow + DS --> Tool --> Format + DS --> Upstream + Upstream --> DS ``` - **Backend**: Go (`cmd/ds2api/`, `api/`, `internal/`), no Python runtime - **Frontend**: React admin panel (`webui/`), served as static build at runtime - **Deployment**: local run, Docker, Vercel serverless, Linux systemd +### 3.0 Architecture Changes (vs older releases) + +- **Unified routing core**: all protocol entries are now centralized through `internal/server/router.go`, with OpenAI / Claude / Gemini / Admin / WebUI routes registered in one tree to avoid multi-entry drift. +- **Cleaner adapter boundaries**: `internal/adapter/{openai,claude,gemini}` focuses on protocol shapes, error contracts, and streaming semantics, while upstream DeepSeek invocation stays shared. +- **Tool-calling parity across runtimes**: Go (`internal/util`) and Vercel Node (`internal/js/helpers/stream-tool-sieve`) follow aligned parsing/anti-leak semantics across JSON / XML / invoke / text-kv inputs. +- **Config/runtime separation**: static config (`config`) and runtime policy (`settings`) are managed independently via Admin APIs, enabling hot updates and password rotation with JWT invalidation. +- **Streaming behavior upgrade**: `/v1/responses` and `/v1/chat/completions` now share a more consistent incremental tool-call emission strategy across SDK ecosystems. +- **Improved operability**: `/healthz`, `/readyz`, `/admin/version`, and `/admin/dev/captures` form a tighter post-deploy diagnostics loop. + ## Key Capabilities | Capability | Details | @@ -144,7 +159,7 @@ Recommended per deployment mode: ### Option 1: Local Run -**Prerequisites**: Go 1.24+, Node.js 20+ (only if building WebUI locally) +**Prerequisites**: Go 1.26+, Node.js 20+ (only if building WebUI locally) ```bash # 1. Clone @@ -406,6 +421,7 @@ Response fields include: ```text ds2api/ +├── app/ # Unified handler entry (shared by Vercel/local) ├── cmd/ │ ├── ds2api/ # Local / container entrypoint │ └── ds2api-tests/ # End-to-end testsuite entrypoint diff --git a/VERSION b/VERSION index 4fd0fe3..4a36342 100644 --- a/VERSION +++ b/VERSION @@ -1 +1 @@ -2.5.1 \ No newline at end of file +3.0.0 diff --git a/docs/CONTRIBUTING.en.md b/docs/CONTRIBUTING.en.md index 6f8257b..a229969 100644 --- a/docs/CONTRIBUTING.en.md +++ b/docs/CONTRIBUTING.en.md @@ -8,7 +8,7 @@ Thanks for your interest in contributing to DS2API! ### Prerequisites -- Go 1.24+ +- Go 1.26+ - Node.js 20+ (for WebUI development) - npm (bundled with Node.js) @@ -94,6 +94,7 @@ Manually build WebUI to `static/admin/`: ```text ds2api/ +├── app/ # Unified handler entry (shared by Vercel/local) ├── cmd/ │ ├── ds2api/ # Local/container entrypoint │ └── ds2api-tests/ # End-to-end testsuite entrypoint diff --git a/docs/CONTRIBUTING.md b/docs/CONTRIBUTING.md index f956fad..d5b73c3 100644 --- a/docs/CONTRIBUTING.md +++ b/docs/CONTRIBUTING.md @@ -8,7 +8,7 @@ ### 前置要求 -- Go 1.24+ +- Go 1.26+ - Node.js 20+(WebUI 开发时) - npm(随 Node.js 提供) @@ -94,6 +94,7 @@ docker-compose -f docker-compose.dev.yml up ```text ds2api/ +├── app/ # 统一 Handler 入口(供 Vercel / 本地共用) ├── cmd/ │ ├── ds2api/ # 本地/容器启动入口 │ └── ds2api-tests/ # 端到端测试集入口 diff --git a/docs/DEPLOY.en.md b/docs/DEPLOY.en.md index 855af36..2ac7b7b 100644 --- a/docs/DEPLOY.en.md +++ b/docs/DEPLOY.en.md @@ -24,7 +24,7 @@ This guide covers all deployment methods for the current Go-based codebase. | Dependency | Minimum Version | Notes | | --- | --- | --- | -| Go | 1.24+ | Build backend | +| Go | 1.26+ | Build backend | | Node.js | 20+ | Only needed to build WebUI locally | | npm | Bundled with Node.js | Install WebUI dependencies | @@ -401,7 +401,7 @@ cp config.example.json config.json docker pull ghcr.io/cjackhwang/ds2api:latest # specific version (example) -docker pull ghcr.io/cjackhwang/ds2api:v2.1.2 +docker pull ghcr.io/cjackhwang/ds2api:v3.0.0 ``` --- diff --git a/docs/DEPLOY.md b/docs/DEPLOY.md index 3082da7..4df1194 100644 --- a/docs/DEPLOY.md +++ b/docs/DEPLOY.md @@ -24,7 +24,7 @@ | 依赖 | 最低版本 | 说明 | | --- | --- | --- | -| Go | 1.24+ | 编译后端 | +| Go | 1.26+ | 编译后端 | | Node.js | 20+ | 仅在需要本地构建 WebUI 时 | | npm | 随 Node.js 提供 | 安装 WebUI 依赖 | @@ -401,7 +401,7 @@ cp config.example.json config.json docker pull ghcr.io/cjackhwang/ds2api:latest # 指定版本(示例) -docker pull ghcr.io/cjackhwang/ds2api:v2.1.2 +docker pull ghcr.io/cjackhwang/ds2api:v3.0.0 ``` ---