diff --git a/API.en.md b/API.en.md index eccefc6..73d6eaa 100644 --- a/API.en.md +++ b/API.en.md @@ -98,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 | diff --git a/API.md b/API.md index a42a0fc..061529e 100644 --- a/API.md +++ b/API.md @@ -98,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 对话补全 | diff --git a/README.MD b/README.MD index 864336d..e6c6229 100644 --- a/README.MD +++ b/README.MD @@ -28,28 +28,28 @@ ```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)"] - Stream["🌊 统一流式引擎\nstream + sse"] - Sieve["🧰 Tool Sieve\nGo + Node 对齐"] + 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"] @@ -425,6 +425,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 3b2eeca..7ca9a60 100644 --- a/README.en.md +++ b/README.en.md @@ -28,28 +28,28 @@ 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)"] - Stream["🌊 Unified Streaming\nstream + sse"] - Sieve["🧰 Tool Sieve\nGo + Node parity"] + 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"] @@ -419,6 +419,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/docs/CONTRIBUTING.en.md b/docs/CONTRIBUTING.en.md index e748d2b..dd8ee2c 100644 --- a/docs/CONTRIBUTING.en.md +++ b/docs/CONTRIBUTING.en.md @@ -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 a32b8b6..5c55a99 100644 --- a/docs/CONTRIBUTING.md +++ b/docs/CONTRIBUTING.md @@ -94,6 +94,7 @@ docker-compose -f docker-compose.dev.yml up ```text ds2api/ +├── app/ # 统一 Handler 入口(供 Vercel / 本地共用) ├── cmd/ │ ├── ds2api/ # 本地/容器启动入口 │ └── ds2api-tests/ # 端到端测试集入口