@jsonstudio/rcc 0.89.1803 → 0.89.1959
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/configsamples/config.json +19 -0
- package/configsamples/provider/deepseek/config.v1.json +59 -0
- package/dist/build-info.js +2 -2
- package/dist/cli/commands/claude.d.ts +4 -0
- package/dist/cli/commands/claude.js +56 -0
- package/dist/cli/commands/claude.js.map +1 -0
- package/dist/cli/commands/clock-admin.d.ts +20 -0
- package/dist/cli/commands/clock-admin.js +234 -0
- package/dist/cli/commands/clock-admin.js.map +1 -0
- package/dist/cli/commands/code.d.ts +0 -42
- package/dist/cli/commands/code.js +4 -414
- package/dist/cli/commands/code.js.map +1 -1
- package/dist/cli/commands/codex.d.ts +4 -0
- package/dist/cli/commands/codex.js +43 -0
- package/dist/cli/commands/codex.js.map +1 -0
- package/dist/cli/commands/examples.js +13 -16
- package/dist/cli/commands/examples.js.map +1 -1
- package/dist/cli/commands/init/basic.d.ts +40 -0
- package/dist/cli/commands/init/basic.js +482 -0
- package/dist/cli/commands/init/basic.js.map +1 -0
- package/dist/cli/commands/init/camoufox.d.ts +7 -0
- package/dist/cli/commands/init/camoufox.js +59 -0
- package/dist/cli/commands/init/camoufox.js.map +1 -0
- package/dist/cli/commands/init/interactive.d.ts +18 -0
- package/dist/cli/commands/init/interactive.js +223 -0
- package/dist/cli/commands/init/interactive.js.map +1 -0
- package/dist/cli/commands/init/shared.d.ts +66 -0
- package/dist/cli/commands/init/shared.js +9 -0
- package/dist/cli/commands/init/shared.js.map +1 -0
- package/dist/cli/commands/init/workflows.d.ts +29 -0
- package/dist/cli/commands/init/workflows.js +341 -0
- package/dist/cli/commands/init/workflows.js.map +1 -0
- package/dist/cli/commands/init.d.ts +2 -26
- package/dist/cli/commands/init.js +220 -53
- package/dist/cli/commands/init.js.map +1 -1
- package/dist/cli/commands/launcher-kernel.d.ts +78 -0
- package/dist/cli/commands/launcher-kernel.js +1194 -0
- package/dist/cli/commands/launcher-kernel.js.map +1 -0
- package/dist/cli/commands/start.js +27 -1
- package/dist/cli/commands/start.js.map +1 -1
- package/dist/cli/commands/status.d.ts +2 -0
- package/dist/cli/commands/status.js +24 -1
- package/dist/cli/commands/status.js.map +1 -1
- package/dist/cli/commands/stop.d.ts +1 -0
- package/dist/cli/commands/stop.js +201 -4
- package/dist/cli/commands/stop.js.map +1 -1
- package/dist/cli/commands/tmux-inject.d.ts +20 -0
- package/dist/cli/commands/tmux-inject.js +212 -0
- package/dist/cli/commands/tmux-inject.js.map +1 -0
- package/dist/cli/config/init-provider-catalog.js +34 -0
- package/dist/cli/config/init-provider-catalog.js.map +1 -1
- package/dist/cli/register/claude-command.d.ts +3 -0
- package/dist/cli/register/claude-command.js +5 -0
- package/dist/cli/register/claude-command.js.map +1 -0
- package/dist/cli/register/clock-admin-command.d.ts +3 -0
- package/dist/cli/register/clock-admin-command.js +5 -0
- package/dist/cli/register/clock-admin-command.js.map +1 -0
- package/dist/cli/register/codex-command.d.ts +3 -0
- package/dist/cli/register/codex-command.js +5 -0
- package/dist/cli/register/codex-command.js.map +1 -0
- package/dist/cli/register/status-config-commands.d.ts +2 -0
- package/dist/cli/register/status-config-commands.js.map +1 -1
- package/dist/cli/register/tmux-inject-command.d.ts +3 -0
- package/dist/cli/register/tmux-inject-command.js +5 -0
- package/dist/cli/register/tmux-inject-command.js.map +1 -0
- package/dist/cli/server/port-utils.d.ts +3 -2
- package/dist/cli/server/port-utils.js +171 -32
- package/dist/cli/server/port-utils.js.map +1 -1
- package/dist/cli.js +45 -6
- package/dist/cli.js.map +1 -1
- package/dist/client/gemini/gemini-protocol-client.js +56 -5
- package/dist/client/gemini/gemini-protocol-client.js.map +1 -1
- package/dist/commands/token-daemon.js +59 -7
- package/dist/commands/token-daemon.js.map +1 -1
- package/dist/commands/validate.js +87 -15
- package/dist/commands/validate.js.map +1 -1
- package/dist/config/routecodex-config-loader.js +31 -2
- package/dist/config/routecodex-config-loader.js.map +1 -1
- package/dist/docs/daemon-admin-ui.html +948 -74
- package/dist/index.d.ts +1 -0
- package/dist/index.js +325 -37
- package/dist/index.js.map +1 -1
- package/dist/manager/quota/provider-quota-center.js +8 -14
- package/dist/manager/quota/provider-quota-center.js.map +1 -1
- package/dist/modules/llmswitch/bridge.d.ts +39 -0
- package/dist/modules/llmswitch/bridge.js +169 -0
- package/dist/modules/llmswitch/bridge.js.map +1 -1
- package/dist/modules/pipeline/utils/colored-logger.js +1 -1
- package/dist/modules/pipeline/utils/colored-logger.js.map +1 -1
- package/dist/providers/auth/deepseek-account-auth.d.ts +39 -0
- package/dist/providers/auth/deepseek-account-auth.js +329 -0
- package/dist/providers/auth/deepseek-account-auth.js.map +1 -0
- package/dist/providers/auth/deepseek-account-token-acquirer.d.ts +15 -0
- package/dist/providers/auth/deepseek-account-token-acquirer.js +644 -0
- package/dist/providers/auth/deepseek-account-token-acquirer.js.map +1 -0
- package/dist/providers/auth/oauth-lifecycle.js +26 -4
- package/dist/providers/auth/oauth-lifecycle.js.map +1 -1
- package/dist/providers/auth/oauth-repair-cooldown.d.ts +5 -0
- package/dist/providers/auth/oauth-repair-cooldown.js +39 -0
- package/dist/providers/auth/oauth-repair-cooldown.js.map +1 -1
- package/dist/providers/auth/token-scanner/index.d.ts +6 -0
- package/dist/providers/auth/token-scanner/index.js +53 -0
- package/dist/providers/auth/token-scanner/index.js.map +1 -1
- package/dist/providers/core/api/provider-config.d.ts +17 -2
- package/dist/providers/core/api/provider-types.d.ts +6 -0
- package/dist/providers/core/api/provider-types.js.map +1 -1
- package/dist/providers/core/config/camoufox-launcher.d.ts +7 -0
- package/dist/providers/core/config/camoufox-launcher.js +68 -21
- package/dist/providers/core/config/camoufox-launcher.js.map +1 -1
- package/dist/providers/core/config/service-profiles.js +19 -0
- package/dist/providers/core/config/service-profiles.js.map +1 -1
- package/dist/providers/core/contracts/deepseek-provider-contract.d.ts +34 -0
- package/dist/providers/core/contracts/deepseek-provider-contract.js +100 -0
- package/dist/providers/core/contracts/deepseek-provider-contract.js.map +1 -0
- package/dist/providers/core/runtime/anthropic-http-provider.d.ts +0 -5
- package/dist/providers/core/runtime/anthropic-http-provider.js +0 -26
- package/dist/providers/core/runtime/anthropic-http-provider.js.map +1 -1
- package/dist/providers/core/runtime/deepseek-http-provider.d.ts +35 -0
- package/dist/providers/core/runtime/deepseek-http-provider.js +373 -0
- package/dist/providers/core/runtime/deepseek-http-provider.js.map +1 -0
- package/dist/providers/core/runtime/deepseek-session-pow.d.ts +55 -0
- package/dist/providers/core/runtime/deepseek-session-pow.js +422 -0
- package/dist/providers/core/runtime/deepseek-session-pow.js.map +1 -0
- package/dist/providers/core/runtime/gemini-cli-http-provider.d.ts +0 -3
- package/dist/providers/core/runtime/gemini-cli-http-provider.js +0 -72
- package/dist/providers/core/runtime/gemini-cli-http-provider.js.map +1 -1
- package/dist/providers/core/runtime/gemini-http-provider.d.ts +1 -7
- package/dist/providers/core/runtime/gemini-http-provider.js +3 -110
- package/dist/providers/core/runtime/gemini-http-provider.js.map +1 -1
- package/dist/providers/core/runtime/http-request-executor.d.ts +1 -0
- package/dist/providers/core/runtime/http-request-executor.js +4 -0
- package/dist/providers/core/runtime/http-request-executor.js.map +1 -1
- package/dist/providers/core/runtime/http-transport-provider.d.ts +10 -4
- package/dist/providers/core/runtime/http-transport-provider.js +308 -82
- package/dist/providers/core/runtime/http-transport-provider.js.map +1 -1
- package/dist/providers/core/runtime/iflow-http-provider.d.ts +0 -4
- package/dist/providers/core/runtime/iflow-http-provider.js +0 -28
- package/dist/providers/core/runtime/iflow-http-provider.js.map +1 -1
- package/dist/providers/core/runtime/provider-factory.d.ts +5 -0
- package/dist/providers/core/runtime/provider-factory.js +59 -6
- package/dist/providers/core/runtime/provider-factory.js.map +1 -1
- package/dist/providers/core/runtime/responses-provider.d.ts +0 -2
- package/dist/providers/core/runtime/responses-provider.js +0 -11
- package/dist/providers/core/runtime/responses-provider.js.map +1 -1
- package/dist/providers/core/strategies/oauth-device-flow.js +16 -1
- package/dist/providers/core/strategies/oauth-device-flow.js.map +1 -1
- package/dist/providers/core/utils/provider-type-utils.js +2 -1
- package/dist/providers/core/utils/provider-type-utils.js.map +1 -1
- package/dist/providers/profile/families/anthropic-profile.d.ts +2 -0
- package/dist/providers/profile/families/anthropic-profile.js +32 -0
- package/dist/providers/profile/families/anthropic-profile.js.map +1 -0
- package/dist/providers/profile/families/antigravity-profile.d.ts +2 -0
- package/dist/providers/profile/families/antigravity-profile.js +109 -0
- package/dist/providers/profile/families/antigravity-profile.js.map +1 -0
- package/dist/providers/profile/families/glm-profile.d.ts +2 -0
- package/dist/providers/profile/families/glm-profile.js +48 -0
- package/dist/providers/profile/families/glm-profile.js.map +1 -0
- package/dist/providers/profile/families/iflow-profile.d.ts +2 -0
- package/dist/providers/profile/families/iflow-profile.js +232 -0
- package/dist/providers/profile/families/iflow-profile.js.map +1 -0
- package/dist/providers/profile/families/qwen-profile.d.ts +2 -0
- package/dist/providers/profile/families/qwen-profile.js +14 -0
- package/dist/providers/profile/families/qwen-profile.js.map +1 -0
- package/dist/providers/profile/families/responses-profile.d.ts +2 -0
- package/dist/providers/profile/families/responses-profile.js +28 -0
- package/dist/providers/profile/families/responses-profile.js.map +1 -0
- package/dist/providers/profile/profile-contracts.d.ts +74 -0
- package/dist/providers/profile/profile-contracts.js +2 -0
- package/dist/providers/profile/profile-contracts.js.map +1 -0
- package/dist/providers/profile/profile-registry.d.ts +3 -0
- package/dist/providers/profile/profile-registry.js +40 -0
- package/dist/providers/profile/profile-registry.js.map +1 -0
- package/dist/providers/profile/provider-directory.d.ts +2 -0
- package/dist/providers/profile/provider-directory.js +55 -0
- package/dist/providers/profile/provider-directory.js.map +1 -0
- package/dist/providers/profile/provider-profile-loader.js +43 -3
- package/dist/providers/profile/provider-profile-loader.js.map +1 -1
- package/dist/providers/profile/provider-profile.d.ts +8 -0
- package/dist/scripts/deepseek/pow-solver.mjs +146 -0
- package/dist/scripts/deepseek/sha3_wasm_bg.7b9ca65ddd.wasm +0 -0
- package/dist/server/handlers/config-admin-handler.js +27 -0
- package/dist/server/handlers/config-admin-handler.js.map +1 -1
- package/dist/server/runtime/http-server/clock-client-registry.d.ts +113 -0
- package/dist/server/runtime/http-server/clock-client-registry.js +592 -0
- package/dist/server/runtime/http-server/clock-client-registry.js.map +1 -0
- package/dist/server/runtime/http-server/clock-client-routes.d.ts +2 -0
- package/dist/server/runtime/http-server/clock-client-routes.js +481 -0
- package/dist/server/runtime/http-server/clock-client-routes.js.map +1 -0
- package/dist/server/runtime/http-server/clock-daemon-inject-config.d.ts +1 -0
- package/dist/server/runtime/http-server/clock-daemon-inject-config.js +11 -0
- package/dist/server/runtime/http-server/clock-daemon-inject-config.js.map +1 -0
- package/dist/server/runtime/http-server/daemon-admin/auth-handler.js +3 -3
- package/dist/server/runtime/http-server/daemon-admin/auth-handler.js.map +1 -1
- package/dist/server/runtime/http-server/daemon-admin/auth-session.d.ts +1 -0
- package/dist/server/runtime/http-server/daemon-admin/auth-session.js +18 -2
- package/dist/server/runtime/http-server/daemon-admin/auth-session.js.map +1 -1
- package/dist/server/runtime/http-server/daemon-admin/control-handler.js +2 -15
- package/dist/server/runtime/http-server/daemon-admin/control-handler.js.map +1 -1
- package/dist/server/runtime/http-server/daemon-admin/credentials-handler.js +65 -7
- package/dist/server/runtime/http-server/daemon-admin/credentials-handler.js.map +1 -1
- package/dist/server/runtime/http-server/executor-metadata.js +37 -1
- package/dist/server/runtime/http-server/executor-metadata.js.map +1 -1
- package/dist/server/runtime/http-server/executor-provider.js +55 -0
- package/dist/server/runtime/http-server/executor-provider.js.map +1 -1
- package/dist/server/runtime/http-server/executor-response.js +49 -1
- package/dist/server/runtime/http-server/executor-response.js.map +1 -1
- package/dist/server/runtime/http-server/index.d.ts +10 -0
- package/dist/server/runtime/http-server/index.js +534 -9
- package/dist/server/runtime/http-server/index.js.map +1 -1
- package/dist/server/runtime/http-server/managed-process-probe.d.ts +6 -0
- package/dist/server/runtime/http-server/managed-process-probe.js +294 -0
- package/dist/server/runtime/http-server/managed-process-probe.js.map +1 -0
- package/dist/server/runtime/http-server/middleware.js +16 -1
- package/dist/server/runtime/http-server/middleware.js.map +1 -1
- package/dist/server/runtime/http-server/provider-utils.js +6 -2
- package/dist/server/runtime/http-server/provider-utils.js.map +1 -1
- package/dist/server/runtime/http-server/request-executor.d.ts +1 -0
- package/dist/server/runtime/http-server/request-executor.js +360 -35
- package/dist/server/runtime/http-server/request-executor.js.map +1 -1
- package/dist/server/runtime/http-server/routes.js +95 -3
- package/dist/server/runtime/http-server/routes.js.map +1 -1
- package/dist/server/runtime/http-server/stats-manager.d.ts +10 -0
- package/dist/server/runtime/http-server/stats-manager.js +119 -16
- package/dist/server/runtime/http-server/stats-manager.js.map +1 -1
- package/dist/server/runtime/http-server/tmux-session-probe.d.ts +3 -0
- package/dist/server/runtime/http-server/tmux-session-probe.js +101 -0
- package/dist/server/runtime/http-server/tmux-session-probe.js.map +1 -0
- package/dist/server/utils/stage-logger.js +21 -5
- package/dist/server/utils/stage-logger.js.map +1 -1
- package/dist/token-daemon/index.js +59 -10
- package/dist/token-daemon/index.js.map +1 -1
- package/dist/token-daemon/server-utils.d.ts +1 -0
- package/dist/token-daemon/server-utils.js +4 -1
- package/dist/token-daemon/server-utils.js.map +1 -1
- package/dist/token-daemon/token-daemon.js +38 -4
- package/dist/token-daemon/token-daemon.js.map +1 -1
- package/dist/token-daemon/token-types.d.ts +1 -1
- package/dist/token-daemon/token-types.js +2 -1
- package/dist/token-daemon/token-types.js.map +1 -1
- package/dist/token-daemon/token-utils.js +5 -2
- package/dist/token-daemon/token-utils.js.map +1 -1
- package/dist/utils/clock-client-token.d.ts +3 -0
- package/dist/utils/clock-client-token.js +54 -0
- package/dist/utils/clock-client-token.js.map +1 -0
- package/dist/utils/managed-server-pids.d.ts +25 -0
- package/dist/utils/managed-server-pids.js +176 -0
- package/dist/utils/managed-server-pids.js.map +1 -0
- package/dist/utils/process-lifecycle-logger.d.ts +8 -0
- package/dist/utils/process-lifecycle-logger.js +151 -0
- package/dist/utils/process-lifecycle-logger.js.map +1 -0
- package/dist/utils/runtime-exit-forensics.d.ts +30 -0
- package/dist/utils/runtime-exit-forensics.js +101 -0
- package/dist/utils/runtime-exit-forensics.js.map +1 -0
- package/dist/utils/shutdown-caller-context.d.ts +22 -0
- package/dist/utils/shutdown-caller-context.js +25 -0
- package/dist/utils/shutdown-caller-context.js.map +1 -0
- package/docs/PROVIDERS_BUILTIN.md +8 -0
- package/docs/PROVIDER_TYPES.md +3 -1
- package/docs/SERVERTOOL_PRE_COMMAND_HOOKS.md +85 -0
- package/docs/clock-client-daemon-design.md +343 -0
- package/docs/daemon-admin-ui.html +948 -74
- package/docs/providers/deepseek-web-provider-design.md +192 -0
- package/docs/routing-instructions.md +4 -1
- package/docs/stop-message-auto.md +4 -3
- package/docs/v2-architecture/PROVIDER-V2-CHANGESET-RELEASE-CHECKLIST.md +80 -0
- package/docs/v2-architecture/PROVIDER-V2-LAYERING-ADR-DRAFT.md +225 -0
- package/docs/v2-architecture/PROVIDER-V2-MIGRATION-MATRIX-DRAFT.md +88 -0
- package/docs/v2-architecture/PROVIDER-V2-PHASED-MIGRATION-ROLLBACK-DRAFT.md +164 -0
- package/docs/v2-architecture/PROVIDER-V2-PROFILE-API-REGISTRY-DRAFT.md +201 -0
- package/docs/v2-architecture/PROVIDER-V2-PROFILE-GEMINI-DRAFT.md +56 -0
- package/docs/v2-architecture/PROVIDER-V2-REFACTOR-OVERVIEW-DRAFT.md +102 -0
- package/docs/v2-architecture/PROVIDER-V2-VERIFICATION-MATRIX-DRAFT.md +163 -0
- package/package.json +10 -9
- package/scripts/copy-compat-assets.mjs +18 -0
- package/scripts/copy-modules-config.mjs +1 -0
- package/scripts/deepseek/pow-solver.mjs +146 -0
- package/scripts/deepseek/sha3_wasm_bg.7b9ca65ddd.wasm +0 -0
- package/scripts/ensure-cli-executable.mjs +64 -0
- package/scripts/install-global.sh +5 -2
- package/scripts/install.sh +1 -1
- package/scripts/monitor/daemon-kill-watch.mjs +184 -0
- package/scripts/monitor/port-kill-watch.sh +74 -0
- package/scripts/quick-install.sh +1 -1
|
@@ -0,0 +1,192 @@
|
|
|
1
|
+
# DeepSeek Web 原生标准 Provider 设计(对标 antigravity)
|
|
2
|
+
|
|
3
|
+
本文定义 DeepSeek Web 在 RouteCodex 中的标准接入方案:
|
|
4
|
+
- 目标是 **内建标准 provider**(不是 sidecar / 反向代理进程依赖)
|
|
5
|
+
- 保持单执行路径:`HTTP server -> llmswitch-core Hub Pipeline -> Provider V2 -> upstream`
|
|
6
|
+
- 严格分层:Provider 做 transport;工具语义在 llmswitch-core compat
|
|
7
|
+
|
|
8
|
+
---
|
|
9
|
+
|
|
10
|
+
## 1. 设计目标
|
|
11
|
+
|
|
12
|
+
1. 将 DeepSeek Web 登录/会话/PoW/completion 纳入 Provider V2。
|
|
13
|
+
2. 保证工具调用在标准响应面可消费:优先结构化 `tool_calls`,文本意图可选 fallback。
|
|
14
|
+
3. 错误与健康状态统一进入 `providerErrorCenter` / `errorHandlingCenter`。
|
|
15
|
+
4. 保证后续可观测、可回放、可灰度(same-shape + control replay)。
|
|
16
|
+
|
|
17
|
+
## 2. 非目标
|
|
18
|
+
|
|
19
|
+
1. 不把 `deepseek2api` 作为 routecodex 上游依赖。
|
|
20
|
+
2. 不在 Provider 层做工具路由、语义修复、参数猜测。
|
|
21
|
+
3. 不在 Host/Provider 里复制 compat 的 fallback 逻辑。
|
|
22
|
+
|
|
23
|
+
## 3. 分层与职责边界
|
|
24
|
+
|
|
25
|
+
### 3.1 RouteCodex Provider(传输层)
|
|
26
|
+
|
|
27
|
+
建议模块:
|
|
28
|
+
- `src/providers/core/runtime/deepseek-http-provider.ts`
|
|
29
|
+
- `src/providers/auth/deepseek-account-auth.ts`
|
|
30
|
+
- `src/providers/core/runtime/deepseek-session-pow.ts`
|
|
31
|
+
|
|
32
|
+
职责:
|
|
33
|
+
- auth(tokenFile 读取/热更新、header 注入)
|
|
34
|
+
- session(会话创建/复用)
|
|
35
|
+
- PoW(challenge 获取、求解、超时控制)
|
|
36
|
+
- HTTP 发送(stream/non-stream)、重试矩阵、上游错误映射
|
|
37
|
+
- 失败统一 `emitProviderError(...)`,不静默 fallback
|
|
38
|
+
|
|
39
|
+
禁止:
|
|
40
|
+
- 工具调用提取/补全
|
|
41
|
+
- route/tool_choice 决策
|
|
42
|
+
- payload 语义清洗(messages/tool args 语义)
|
|
43
|
+
|
|
44
|
+
### 3.2 llmswitch-core Compat(语义适配层)
|
|
45
|
+
|
|
46
|
+
建议模块:
|
|
47
|
+
- `sharedmodule/llmswitch-core/src/conversion/compat/profiles/chat-deepseek-web.json`
|
|
48
|
+
- `sharedmodule/llmswitch-core/src/conversion/compat/actions/deepseek-web-request.ts`
|
|
49
|
+
- `sharedmodule/llmswitch-core/src/conversion/compat/actions/deepseek-web-response.ts`
|
|
50
|
+
|
|
51
|
+
职责:
|
|
52
|
+
- 请求侧:OpenAI/Responses 形状 -> DeepSeek Web 合同字段
|
|
53
|
+
- 响应侧:DeepSeek Web 形状 -> 标准 assistant / SSE / tool_calls
|
|
54
|
+
- tool_call_id 标准化(无 id 时生成稳定 id)
|
|
55
|
+
- 文本工具意图 fallback(受配置开关/strict 约束)
|
|
56
|
+
|
|
57
|
+
禁止:
|
|
58
|
+
- HTTP 请求发送
|
|
59
|
+
- 认证与 token 管理
|
|
60
|
+
- provider transport 重试策略
|
|
61
|
+
|
|
62
|
+
## 4. 配置草案(示意)
|
|
63
|
+
|
|
64
|
+
```jsonc
|
|
65
|
+
{
|
|
66
|
+
"virtualrouter": {
|
|
67
|
+
"providers": {
|
|
68
|
+
"deepseek-web": {
|
|
69
|
+
"id": "deepseek-web",
|
|
70
|
+
"enabled": true,
|
|
71
|
+
"type": "openai",
|
|
72
|
+
"providerModule": "deepseek-http-provider",
|
|
73
|
+
"compatibilityProfile": "chat:deepseek-web",
|
|
74
|
+
"baseURL": "https://chat.deepseek.com",
|
|
75
|
+
"auth": {
|
|
76
|
+
"type": "deepseek-account",
|
|
77
|
+
"entries": [
|
|
78
|
+
{
|
|
79
|
+
"alias": "1",
|
|
80
|
+
"type": "deepseek-account",
|
|
81
|
+
"tokenFile": "~/.routecodex/auth/deepseek-account-1.json"
|
|
82
|
+
}
|
|
83
|
+
]
|
|
84
|
+
},
|
|
85
|
+
"deepseek": {
|
|
86
|
+
"strictToolRequired": true,
|
|
87
|
+
"textToolFallback": true,
|
|
88
|
+
"powTimeoutMs": 15000,
|
|
89
|
+
"sessionReuseTtlMs": 1800000
|
|
90
|
+
}
|
|
91
|
+
}
|
|
92
|
+
}
|
|
93
|
+
}
|
|
94
|
+
}
|
|
95
|
+
```
|
|
96
|
+
|
|
97
|
+
说明:
|
|
98
|
+
- `type` 继续使用标准 `openai`,家族差异通过 `providerModule` + `compatibilityProfile` 表达。
|
|
99
|
+
- 凭据通过 `tokenFile` 引用(`deepseek-account-*.json`),支持多账号轮转,不把明文回写到配置。
|
|
100
|
+
|
|
101
|
+
## 5. 工具调用状态机(Compat 单一实现)
|
|
102
|
+
|
|
103
|
+
### 5.1 状态定义
|
|
104
|
+
|
|
105
|
+
1. `native_tool_calls`
|
|
106
|
+
- 上游已返回结构化工具调用
|
|
107
|
+
- compat 做字段映射、id 补齐、参数 JSON 合法性校验
|
|
108
|
+
2. `text_tool_calls`
|
|
109
|
+
- 上游仅返回文本工具意图
|
|
110
|
+
- compat 解析并生成标准 `tool_calls`
|
|
111
|
+
3. `no_tool_calls`
|
|
112
|
+
- 无法识别工具调用
|
|
113
|
+
|
|
114
|
+
### 5.2 严格策略
|
|
115
|
+
|
|
116
|
+
- 若 `tool_choice=required` 且最终状态为 `no_tool_calls`:
|
|
117
|
+
- compat 抛显式错误(fail-fast)
|
|
118
|
+
- provider 不兜底为普通文本成功
|
|
119
|
+
|
|
120
|
+
### 5.3 单一真相源
|
|
121
|
+
|
|
122
|
+
- fallback 解析器仅在 `deepseek-web-response.ts` 维护。
|
|
123
|
+
- Host / Provider 不复制解析规则,避免双实现漂移。
|
|
124
|
+
|
|
125
|
+
## 6. 错误分类与重试策略(Provider)
|
|
126
|
+
|
|
127
|
+
### 6.1 不重试(直接 fail-fast)
|
|
128
|
+
|
|
129
|
+
- 认证失败(401/403)
|
|
130
|
+
- 合同失败(4xx,如必填字段/格式错误)
|
|
131
|
+
- compat 显式错误(如 strict tool required)
|
|
132
|
+
|
|
133
|
+
### 6.2 可重试(有限次)
|
|
134
|
+
|
|
135
|
+
- 网络抖动 / 超时
|
|
136
|
+
- 5xx 上游故障
|
|
137
|
+
- PoW 挑战服务短暂失败(带总超时)
|
|
138
|
+
|
|
139
|
+
### 6.3 统一上报字段
|
|
140
|
+
|
|
141
|
+
每次错误事件应包含:
|
|
142
|
+
- `requestId`
|
|
143
|
+
- `providerId` / `providerKey` / `providerProtocol`
|
|
144
|
+
- `model` / `route`
|
|
145
|
+
- `statusCode` / `upstreamCode`
|
|
146
|
+
- `processingTime`
|
|
147
|
+
|
|
148
|
+
## 7. 可观测与回放
|
|
149
|
+
|
|
150
|
+
### 7.1 请求级追踪
|
|
151
|
+
|
|
152
|
+
- `requestId` 全链路透传
|
|
153
|
+
- 记录 provider runtime key 与 session key(不暴露敏感值)
|
|
154
|
+
- tool 归一化日志:`source=native|fallback`、`parse_ok`、`schema_ok`
|
|
155
|
+
|
|
156
|
+
### 7.2 回放要求
|
|
157
|
+
|
|
158
|
+
每次兼容行为修改后必须提供:
|
|
159
|
+
1. 目标 provider same-shape replay(1 例)
|
|
160
|
+
2. 非目标 provider control replay(1 例)
|
|
161
|
+
|
|
162
|
+
## 8. 里程碑
|
|
163
|
+
|
|
164
|
+
### M1(设计冻结)
|
|
165
|
+
|
|
166
|
+
- 冻结配置字段、错误码、观测字段、strict/fallback 开关定义
|
|
167
|
+
- 产物:本文档 + `routecodex-132` 及子任务
|
|
168
|
+
- M1 合同落盘(当前仓):
|
|
169
|
+
- `src/providers/core/contracts/deepseek-provider-contract.ts`
|
|
170
|
+
- `src/providers/core/api/provider-config.ts`
|
|
171
|
+
- `src/providers/core/api/provider-types.ts`
|
|
172
|
+
- `src/providers/profile/provider-profile-loader.ts`
|
|
173
|
+
|
|
174
|
+
### M2(Provider Skeleton)
|
|
175
|
+
|
|
176
|
+
- 落地 provider/auth/session/pow runtime
|
|
177
|
+
- 打通 non-stream / stream
|
|
178
|
+
- 接入 provider error 上报
|
|
179
|
+
|
|
180
|
+
### M3(Compat + Tool Calling)
|
|
181
|
+
|
|
182
|
+
- 落地 `chat:deepseek-web` profile 与 request/response actions
|
|
183
|
+
- 完成工具调用三态与 strict 策略
|
|
184
|
+
- 增加回归脚本并完成 replay 证据
|
|
185
|
+
|
|
186
|
+
## 9. 验证命令(按双仓顺序)
|
|
187
|
+
|
|
188
|
+
1. `sharedmodule/llmswitch-core`: `npm run build`
|
|
189
|
+
2. `routecodex`: `npm run build:dev`
|
|
190
|
+
3. `routecodex`: `npm run install:global`
|
|
191
|
+
4. provider 定向脚本:`scripts/provider-deepseek-*`(M2/M3 新增)
|
|
192
|
+
5. replay:same-shape + control provider
|
|
@@ -164,7 +164,7 @@ RouteCodex 支持通过用户消息中的特殊指令 `<**...**>` 来动态控
|
|
|
164
164
|
**语法:**
|
|
165
165
|
|
|
166
166
|
- 启用 / 更新自动续写:
|
|
167
|
-
- `<**stopMessage:"继续"**>` → 默认最多自动续写
|
|
167
|
+
- `<**stopMessage:"继续"**>` → 默认最多自动续写 10 次;
|
|
168
168
|
- `<**stopMessage:"继续",3**>` → 最多自动续写 3 次;
|
|
169
169
|
- `<**stopMessage:<file://stopMessage/message1.md>**>` → 读取 `~/.routecodex/stopMessage/message1.md` 作为 stopMessage 文案(设置时读取并缓存到内存);
|
|
170
170
|
- 清理 stopMessage 状态:
|
|
@@ -177,6 +177,9 @@ RouteCodex 支持通过用户消息中的特殊指令 `<**...**>` 来动态控
|
|
|
177
177
|
- `stopMessageText`:自动补发的用户消息内容;
|
|
178
178
|
- `stopMessageMaxRepeats`:允许自动续写的最大次数(>=1);
|
|
179
179
|
- `stopMessageUsed`:已执行次数(从 0 开始计数);
|
|
180
|
+
- stopMessage 阶段策略的 BD 状态判定:默认优先尝试真实命令查询(`bd --no-db list/ready --json`),命令失败时回退到历史消息启发式;
|
|
181
|
+
- 可用 `ROUTECODEX_STOPMESSAGE_BD_MODE=auto|runtime|heuristic` 控制(默认 `auto`);
|
|
182
|
+
- 可用 `ROUTECODEX_STOPMESSAGE_BD_TIMEOUT_MS`、`ROUTECODEX_STOPMESSAGE_BD_CACHE_TTL_MS`、`ROUTECODEX_STOPMESSAGE_BD_WORKDIR` 调整运行参数;
|
|
180
183
|
- 当满足以下条件时,servertool 会自动发起后续请求:
|
|
181
184
|
- 当前响应的 `choices[0].finish_reason === "stop"`;
|
|
182
185
|
- 当前轮没有工具调用(`tool_calls` 为空);
|
|
@@ -17,8 +17,8 @@
|
|
|
17
17
|
|
|
18
18
|
- 启用 / 更新:`<**stopMessage:"继续",3**>`
|
|
19
19
|
- `"继续"`:自动补发的用户消息内容,内部如需引号,用 `\"` 转义。
|
|
20
|
-
- `3`:本会话最多自动续写 3 轮;省略时默认 `
|
|
21
|
-
- 仅设置文案(默认
|
|
20
|
+
- `3`:本会话最多自动续写 3 轮;省略时默认 `10`。
|
|
21
|
+
- 仅设置文案(默认 10 次):`<**stopMessage:"继续"**>` → `maxRepeats = 10`。
|
|
22
22
|
- 清理:`<**stopMessage:clear**>` → 清空本会话 stopMessage 状态。
|
|
23
23
|
|
|
24
24
|
> 注意:这些标签仅用于路由与 servertool,不应出现在发给 provider 的文本中。
|
|
@@ -32,12 +32,13 @@
|
|
|
32
32
|
- `stopMessageUsed: number` — 已执行的自动续写次数,初始为 `0`。
|
|
33
33
|
- `stopMessageUpdatedAt?: number` — 最近一次解析 `<**stopMessage:"..."**>` 指令的时间戳。
|
|
34
34
|
- `stopMessageLastUsedAt?: number` — 最近一次 servertool 自动补发 stopMessage 的时间戳。
|
|
35
|
+
- BD 状态判断默认走真实命令(`bd --no-db list/ready --json`),失败时回退到消息启发式;可通过 `ROUTECODEX_STOPMESSAGE_BD_MODE=auto|runtime|heuristic` 配置。
|
|
35
36
|
|
|
36
37
|
行为:
|
|
37
38
|
|
|
38
39
|
- 解析到 `stopMessage:"...",N`:
|
|
39
40
|
- `stopMessageText = text`
|
|
40
|
-
- `stopMessageMaxRepeats = N ||
|
|
41
|
+
- `stopMessageMaxRepeats = N || 10`
|
|
41
42
|
- `stopMessageUsed = 0`
|
|
42
43
|
- `stopMessageUpdatedAt = Date.now()`,`stopMessageLastUsedAt = undefined`
|
|
43
44
|
- 解析到 `stopMessage:clear`:
|
|
@@ -0,0 +1,80 @@
|
|
|
1
|
+
# Provider V2 变更集发布检查清单
|
|
2
|
+
|
|
3
|
+
- Date: 2026-02-09
|
|
4
|
+
- Source branch: `main`
|
|
5
|
+
- Scope: 最近 4 个提交(架构草案 + iflow provider 对齐 + validate 进程清理)
|
|
6
|
+
|
|
7
|
+
## 1) Changeset 映射
|
|
8
|
+
|
|
9
|
+
| Commit | 主题 | Wave/任务对应 | 风险级别 | 备注 |
|
|
10
|
+
|---|---|---|---|---|
|
|
11
|
+
| `167400e0b` | Provider V2 架构草案全集(113.1~113.5) | 113 规划阶段 | Low | 文档与 `.beads/issues.jsonl` |
|
|
12
|
+
| `8ea3ab778` | 文档约束增强(M10/M13/M16 + 验证门槛) | 113.5 审阅收敛 | Low | 文档与 `.beads/issues.jsonl` |
|
|
13
|
+
| `ecf3dbe70` | iFlow CLI 头/签名对齐 | Wave-1(iflow)预实现 | High | 运行时代码变更 + 单测 |
|
|
14
|
+
| `3857b25e6` | validate 启动/清理避免孤儿进程 | 运维/CLI 稳定性 | Medium | 运行时代码变更 |
|
|
15
|
+
|
|
16
|
+
## 2) 推荐 cherry-pick 顺序
|
|
17
|
+
|
|
18
|
+
## A. 生产热修(仅功能)
|
|
19
|
+
|
|
20
|
+
适用于先上修复,不带规划文档:
|
|
21
|
+
|
|
22
|
+
1. `ecf3dbe70`
|
|
23
|
+
2. `3857b25e6`
|
|
24
|
+
|
|
25
|
+
## B. 完整同步(功能 + 规划)
|
|
26
|
+
|
|
27
|
+
适用于将规划与执行基线一并对齐:
|
|
28
|
+
|
|
29
|
+
1. `167400e0b`
|
|
30
|
+
2. `8ea3ab778`
|
|
31
|
+
3. `ecf3dbe70`
|
|
32
|
+
4. `3857b25e6`
|
|
33
|
+
|
|
34
|
+
> 说明:两个 docs 提交都改了 `.beads/issues.jsonl`,建议按上述顺序连续 pick,避免 BD 冲突。
|
|
35
|
+
|
|
36
|
+
## 3) Mandatory Gate(功能提交必须)
|
|
37
|
+
|
|
38
|
+
对包含 `ecf3dbe70` / `3857b25e6` 的发布,至少执行:
|
|
39
|
+
|
|
40
|
+
1. 目标测试
|
|
41
|
+
- `npm run jest:run -- --runTestsByPath tests/providers/core/runtime/http-transport-provider.headers.test.ts`
|
|
42
|
+
- `npm run test:cli`
|
|
43
|
+
2. 类型与构建
|
|
44
|
+
- `npx tsc --noEmit`
|
|
45
|
+
- `npm run build:dev`
|
|
46
|
+
- `npm run install:global`
|
|
47
|
+
|
|
48
|
+
## 4) Replay Gate(Wave-1 iflow)
|
|
49
|
+
|
|
50
|
+
## Same-shape(iflow)
|
|
51
|
+
|
|
52
|
+
```bash
|
|
53
|
+
npm run replay:codex-sample -- \
|
|
54
|
+
--sample <iflow-sample-client-request.json> \
|
|
55
|
+
--label wave-1-iflow-same-shape
|
|
56
|
+
```
|
|
57
|
+
|
|
58
|
+
## Control(非受影响 provider)
|
|
59
|
+
|
|
60
|
+
```bash
|
|
61
|
+
npm run replay:codex-sample -- \
|
|
62
|
+
--sample <control-sample-client-request.json> \
|
|
63
|
+
--label wave-1-iflow-control
|
|
64
|
+
```
|
|
65
|
+
|
|
66
|
+
## 5) 风险与回滚点
|
|
67
|
+
|
|
68
|
+
- `ecf3dbe70`(High)
|
|
69
|
+
- 关注:`x-iflow-signature` 计算一致性、`session-id/conversation-id` 映射。
|
|
70
|
+
- 回滚:直接回退该 commit;不影响其它文档提交。
|
|
71
|
+
- `3857b25e6`(Medium)
|
|
72
|
+
- 关注:validate 自启 server 后停止逻辑、异常分支 cleanup。
|
|
73
|
+
- 回滚:直接回退该 commit;不影响 provider 主链路。
|
|
74
|
+
|
|
75
|
+
## 6) 发布后观察建议
|
|
76
|
+
|
|
77
|
+
- 观察 iflow 400/435 比例是否下降。
|
|
78
|
+
- 观察 validate 后是否仍残留 `routecodex`/`rcc start` 进程。
|
|
79
|
+
- 若异常,按单 commit 回滚并保留 same-shape/control 证据。
|
|
80
|
+
|
|
@@ -0,0 +1,225 @@
|
|
|
1
|
+
# Provider V2 分层重构 ADR(Draft)
|
|
2
|
+
|
|
3
|
+
- Status: Draft
|
|
4
|
+
- Date: 2026-02-09
|
|
5
|
+
- Owner: routecodex-113.1
|
|
6
|
+
- Scope: 仅架构与迁移草案,不包含运行时代码改动
|
|
7
|
+
|
|
8
|
+
## 1. 背景与问题
|
|
9
|
+
|
|
10
|
+
当前 Provider V2 已实现“协议优先 + 家族表达”的主线,但仍存在以下问题:
|
|
11
|
+
|
|
12
|
+
1. 通用传输层(`HttpTransportProvider`)混入了多品牌特判,Kernel 职责边界被侵蚀。
|
|
13
|
+
2. Protocol 与 Family 差异部分耦合,导致新增供应商时改动面偏大。
|
|
14
|
+
3. 兼容行为分散在 profile/header/body/metadata 多点,回归面难以预测。
|
|
15
|
+
|
|
16
|
+
基于当前代码可观察到的典型信号(作为迁移切入点):
|
|
17
|
+
|
|
18
|
+
- Kernel 中存在 iFlow/Antigravity/Codex UA 分支逻辑与签名行为。
|
|
19
|
+
- `service-profiles.ts` 既承载基础配置,也承载品牌特定 header 与行为暗约束。
|
|
20
|
+
- Factory 在协议映射、module 选择、brand 归一间承担了超出“构造器”范畴的语义。
|
|
21
|
+
|
|
22
|
+
## 2. 决策(Proposed Decision)
|
|
23
|
+
|
|
24
|
+
采用三层分离并固定执行次序:
|
|
25
|
+
|
|
26
|
+
`Kernel -> Protocol -> Family Profile`
|
|
27
|
+
|
|
28
|
+
并将 Protocol 固定为四大线:
|
|
29
|
+
|
|
30
|
+
1. OpenAI Chat
|
|
31
|
+
2. OpenAI Responses
|
|
32
|
+
3. Anthropic Messages
|
|
33
|
+
4. Gemini(Gemini CLI 作为同协议变体长期保留)
|
|
34
|
+
|
|
35
|
+
同时固定配置驱动解析规则:
|
|
36
|
+
|
|
37
|
+
- 配置显式字段 `providerProtocol` + `providerId` + `compatibilityProfile` 共同决定:
|
|
38
|
+
- 加载哪个 Protocol Adapter
|
|
39
|
+
- 选择哪个 Family 特殊分支(Profile)
|
|
40
|
+
- 启用哪个 Compat Profile
|
|
41
|
+
- `providerId` / `providerFamily` 的单一事实来源为“配置文件 + provider 目录映射”。
|
|
42
|
+
- runtime metadata 仅承载已解析结果,不再进行二次覆盖决策。
|
|
43
|
+
|
|
44
|
+
## 3. 分层职责定义
|
|
45
|
+
|
|
46
|
+
### 3.1 Kernel(基础坑位)
|
|
47
|
+
|
|
48
|
+
Kernel 只保留“与业务语义无关”的纯通用能力:
|
|
49
|
+
|
|
50
|
+
- 认证装配(apikey/oauth/tokenfile/cookie)
|
|
51
|
+
- HTTP 执行(重试、超时、连接层错误标准化)
|
|
52
|
+
- 观测与审计(snapshot、provider error 上报)
|
|
53
|
+
- 运行时 metadata 传递与最小标准化
|
|
54
|
+
- Hook 调度框架(仅调度,不承载品牌策略)
|
|
55
|
+
|
|
56
|
+
Kernel 禁止:
|
|
57
|
+
|
|
58
|
+
- 品牌识别分支(例如 `iflow` / `qwen` / `glm`)
|
|
59
|
+
- 特定上游签名算法、header 语义修复
|
|
60
|
+
- 模型级行为修复与策略 fallback
|
|
61
|
+
|
|
62
|
+
### 3.2 Protocol(四大协议层)
|
|
63
|
+
|
|
64
|
+
Protocol 层只负责 wire contract:
|
|
65
|
+
|
|
66
|
+
- 路径与方法约束(例如 `/chat/completions`、`/responses`、`/v1/messages`)
|
|
67
|
+
- 请求体基础 shape(消息字段、stream 字段、tools 字段)
|
|
68
|
+
- 响应体解析与流式边界
|
|
69
|
+
- 与 Hub Pipeline 的协议接口一致性
|
|
70
|
+
|
|
71
|
+
Protocol 禁止:
|
|
72
|
+
|
|
73
|
+
- 品牌业务规则
|
|
74
|
+
- OAuth/风控策略特判
|
|
75
|
+
|
|
76
|
+
### 3.3 Family Profile(供应商品牌层)
|
|
77
|
+
|
|
78
|
+
Family Profile 承载“同协议下不同品牌”的差异策略:
|
|
79
|
+
|
|
80
|
+
- header policy(默认头、优先级、互斥/清理)
|
|
81
|
+
- auth policy(oauthProviderId 解析、token 形态扩展)
|
|
82
|
+
- request policy(字段注入、字段裁剪、模型映射)
|
|
83
|
+
- response policy(错误 envelope 归一、供应商业务码映射)
|
|
84
|
+
- optional signing policy(例如 iFlow 的签名规则)
|
|
85
|
+
|
|
86
|
+
Profile 必须是声明式 + 小型策略函数,不允许变成第二个 transport kernel。
|
|
87
|
+
|
|
88
|
+
## 4. 建议抽象(接口草案)
|
|
89
|
+
|
|
90
|
+
> 下面是抽象方向草案,用于统一未来实现,不代表本次已改代码。
|
|
91
|
+
|
|
92
|
+
### 4.1 Kernel SPI
|
|
93
|
+
|
|
94
|
+
```ts
|
|
95
|
+
interface ProviderKernel {
|
|
96
|
+
send(input: KernelRequest): Promise<KernelResponse>;
|
|
97
|
+
buildContext(runtime: ProviderRuntimeProfile): ProviderContext;
|
|
98
|
+
reportError(error: unknown, context: ProviderContext): ProviderErrorAugmented;
|
|
99
|
+
}
|
|
100
|
+
```
|
|
101
|
+
|
|
102
|
+
### 4.2 Protocol Adapter
|
|
103
|
+
|
|
104
|
+
```ts
|
|
105
|
+
interface ProtocolAdapter {
|
|
106
|
+
protocol: 'openai-chat' | 'openai-responses' | 'anthropic-messages' | 'gemini';
|
|
107
|
+
resolveEndpoint(input: ProtocolInput): string;
|
|
108
|
+
buildBody(input: ProtocolInput): Record<string, unknown>;
|
|
109
|
+
parseResponse(raw: unknown, context: ProviderContext): Record<string, unknown>;
|
|
110
|
+
}
|
|
111
|
+
```
|
|
112
|
+
|
|
113
|
+
### 4.3 Family Profile
|
|
114
|
+
|
|
115
|
+
```ts
|
|
116
|
+
interface ProviderFamilyProfile {
|
|
117
|
+
family: string;
|
|
118
|
+
applyRequestPolicy(input: RequestPolicyInput): RequestPolicyOutput;
|
|
119
|
+
applyHeaderPolicy(input: HeaderPolicyInput): HeaderPolicyOutput;
|
|
120
|
+
applyResponsePolicy(input: ResponsePolicyInput): ResponsePolicyOutput;
|
|
121
|
+
classifyUpstreamError?(error: unknown, context: ProviderContext): ProviderErrorAugmented;
|
|
122
|
+
}
|
|
123
|
+
```
|
|
124
|
+
|
|
125
|
+
### 4.4 组合执行顺序
|
|
126
|
+
|
|
127
|
+
1. Kernel 构建上下文
|
|
128
|
+
2. Protocol 生成基础 endpoint/body
|
|
129
|
+
3. Family Profile 应用增量策略
|
|
130
|
+
4. Kernel 发送请求并标准化错误
|
|
131
|
+
5. Protocol 解析响应
|
|
132
|
+
6. Family Profile 后处理(可选)
|
|
133
|
+
|
|
134
|
+
### 4.5 配置驱动解析顺序(已定稿)
|
|
135
|
+
|
|
136
|
+
1. 从配置读取 `providerProtocol`,绑定唯一 Protocol Adapter。
|
|
137
|
+
2. 从配置读取 `providerId`(并通过 provider 目录映射到 `providerFamily`),绑定 Family Profile。
|
|
138
|
+
3. 从配置读取 `compatibilityProfile`,绑定 Compat Profile。
|
|
139
|
+
4. 若缺字段或映射不存在,直接 fail-fast(禁止运行时猜测或静默降级)。
|
|
140
|
+
|
|
141
|
+
## 5. 目录与模块建议(目标态)
|
|
142
|
+
|
|
143
|
+
```text
|
|
144
|
+
src/providers/core/
|
|
145
|
+
kernel/
|
|
146
|
+
provider-kernel.ts
|
|
147
|
+
http-executor.ts
|
|
148
|
+
auth-runtime.ts
|
|
149
|
+
error-normalizer.ts
|
|
150
|
+
protocols/
|
|
151
|
+
openai-chat/
|
|
152
|
+
openai-responses/
|
|
153
|
+
anthropic-messages/
|
|
154
|
+
gemini/
|
|
155
|
+
profiles/
|
|
156
|
+
families/
|
|
157
|
+
iflow/
|
|
158
|
+
qwen/
|
|
159
|
+
glm/
|
|
160
|
+
antigravity/
|
|
161
|
+
openai/
|
|
162
|
+
anthropic/
|
|
163
|
+
gemini/
|
|
164
|
+
registry.ts
|
|
165
|
+
runtime/
|
|
166
|
+
provider-composer.ts
|
|
167
|
+
provider-factory.ts
|
|
168
|
+
```
|
|
169
|
+
|
|
170
|
+
## 6. 当前代码到目标层的迁移原则
|
|
171
|
+
|
|
172
|
+
1. 先抽“边界”再迁“逻辑”:先把入口与调用点稳定,再移动策略实现。
|
|
173
|
+
2. 保持 fail-fast:任何未知 family/profile 不自动兜底修复。
|
|
174
|
+
3. 单一事实来源:同一策略只能在一层实现一次。
|
|
175
|
+
4. 一次一个 family 的最小切片迁移,配套 replay 证据。
|
|
176
|
+
|
|
177
|
+
## 7. 分阶段计划(与 BD 子任务对应)
|
|
178
|
+
|
|
179
|
+
### Phase A(routecodex-113.1)
|
|
180
|
+
|
|
181
|
+
- 冻结分层定义、接口草案、风险边界(本 ADR)
|
|
182
|
+
|
|
183
|
+
### Phase B(routecodex-113.2)
|
|
184
|
+
|
|
185
|
+
- 完成“现有特判 -> Kernel/Protocol/Profile”迁移矩阵
|
|
186
|
+
|
|
187
|
+
### Phase C(routecodex-113.3)
|
|
188
|
+
|
|
189
|
+
- 确定 Profile API 与 Registry 解析顺序
|
|
190
|
+
|
|
191
|
+
### Phase D(routecodex-113.4)
|
|
192
|
+
|
|
193
|
+
- 输出迁移批次和回滚机制(按 family 批次)
|
|
194
|
+
|
|
195
|
+
### Phase E(routecodex-113.5)
|
|
196
|
+
|
|
197
|
+
- 固化验证矩阵:same-shape replay + control replay + build/install gate
|
|
198
|
+
|
|
199
|
+
## 8. 关键风险与控制
|
|
200
|
+
|
|
201
|
+
1. **风险:Profile 膨胀为新内核**
|
|
202
|
+
- 控制:Profile API 仅允许策略函数,禁止直接发 HTTP。
|
|
203
|
+
2. **风险:Protocol 与 Profile 双重改写冲突**
|
|
204
|
+
- 控制:定义字段所有权,冲突即 fail-fast。
|
|
205
|
+
3. **风险:迁移期行为漂移**
|
|
206
|
+
- 控制:每个切片必须提供 before/after replay 对照。
|
|
207
|
+
|
|
208
|
+
## 9. 非目标(本轮明确不做)
|
|
209
|
+
|
|
210
|
+
- 不在本 ADR 阶段做运行时代码迁移。
|
|
211
|
+
- 不改 Hub Pipeline 的工具与路由职责边界。
|
|
212
|
+
- 不引入新协议类型(先稳定四协议)。
|
|
213
|
+
|
|
214
|
+
## 10. 已确认决策(2026-02-09)
|
|
215
|
+
|
|
216
|
+
1. Gemini CLI 长期作为 Gemini 协议变体。
|
|
217
|
+
2. `providerId` / `providerFamily` 单一事实来源来自配置文件与 provider 目录映射。
|
|
218
|
+
3. 配置显式字段 `providerProtocol + providerId + compatibilityProfile` 决定 protocol/profile/compat 加载。
|
|
219
|
+
|
|
220
|
+
## 11. 待后续细化(routecodex-113.2/113.3)
|
|
221
|
+
|
|
222
|
+
1. provider 目录映射表的最终落地位置与维护方式。
|
|
223
|
+
2. compatibilityProfile 在 host/provider/core 的边界校验策略(仅透传 vs 预校验)。
|
|
224
|
+
3. Profile API 的最小能力集(首批是否仅 header/auth/request)。
|
|
225
|
+
|
|
@@ -0,0 +1,88 @@
|
|
|
1
|
+
# Provider V2 特判迁移矩阵(Draft)
|
|
2
|
+
|
|
3
|
+
- Status: Draft
|
|
4
|
+
- Date: 2026-02-09
|
|
5
|
+
- Owner: routecodex-113.2
|
|
6
|
+
- Strategy: 先实现,不连线;最后按批次逐个连线
|
|
7
|
+
|
|
8
|
+
## 1. 迁移方法(按你确认的策略)
|
|
9
|
+
|
|
10
|
+
本矩阵遵循固定执行法:
|
|
11
|
+
|
|
12
|
+
1. 先把 Kernel / Protocol / Profile 的新实现落地为“未接线模块”(dark implementation)。
|
|
13
|
+
2. 在不改变现网执行路径前提下,补齐单测、样本回放、same-shape 对比。
|
|
14
|
+
3. 最后按 provider family 逐个接线,单批次可回滚。
|
|
15
|
+
|
|
16
|
+
## 2. 当前特判清单与归属矩阵
|
|
17
|
+
|
|
18
|
+
| ID | 当前位置(文件:行) | 当前行为 | 目标层 | 迁移动作 | 风险级别 | 连线阶段 |
|
|
19
|
+
|---|---|---|---|---|---|---|
|
|
20
|
+
| M01 | `src/providers/core/runtime/http-transport-provider.ts:780` | `iflowWebSearch` 特判 endpoint `/chat/retrieve` | Family Profile(iflow) | 从 Kernel 抽离为 `iflow.requestPolicy.resolveEndpoint()` | 高 | Wave-1(iflow) |
|
|
21
|
+
| M02 | `src/providers/core/runtime/http-transport-provider.ts:804` | `iflowWebSearch` 特判 body 直透 `request.data` | Family Profile(iflow) | 抽离为 `iflow.requestPolicy.buildBody()` | 高 | Wave-1(iflow) |
|
|
22
|
+
| M03 | `src/providers/core/runtime/iflow-http-provider.ts:40` | iFlow 子类重复实现 webSearch endpoint/body 特判 | Family Profile(iflow) | 去重,保留单一事实实现(profile) | 高 | Wave-1(iflow) |
|
|
23
|
+
| M04 | `src/providers/core/runtime/http-transport-provider.ts:992` | iFlow UA 优先级反转(service UA > inbound UA) | Family Profile(iflow) | 抽离为 `iflow.headerPolicy.resolveUserAgentPriority()` | 高 | Wave-1(iflow) |
|
|
24
|
+
| M05 | `src/providers/core/runtime/http-transport-provider.ts:1212` | iFlow `session-id/conversation-id` 规范化 + 签名头 | Family Profile(iflow) | 抽离为 `iflow.signingPolicy.applyHeaders()` | 高 | Wave-1(iflow) |
|
|
25
|
+
| M06 | `src/providers/core/runtime/http-request-executor.ts:499` | iFlow HTTP200 + status=439 token expired 特判抛错 | Family Profile(iflow) | 抽离为 `iflow.responsePolicy.classifyBusinessEnvelope()` | 高 | Wave-1(iflow) |
|
|
26
|
+
| M07 | `src/providers/core/runtime/http-request-executor.ts:531` | iFlow business envelope `error_code/msg` -> HTTP_400 | Family Profile(iflow) | 抽离为 `iflow.errorPolicy.toProviderError()` | 高 | Wave-1(iflow) |
|
|
27
|
+
| M08 | `src/providers/core/runtime/http-transport-provider.ts:888` | Gemini-family 注入 `X-Goog-Api-Client` / `Client-Metadata` | Family Profile(gemini, qwen) | 下沉到对应 profile header policy | 中 | Wave-2(gemini/qwen) |
|
|
28
|
+
| M09 | `src/providers/core/runtime/http-transport-provider.ts:1048` | Antigravity 删除 `session_id/conversation_id` | Family Profile(antigravity) | 抽离为 `antigravity.headerPolicy.cleanup()` | 中 | Wave-2(antigravity) |
|
|
29
|
+
| M10 | `src/providers/core/runtime/http-request-executor.ts:403` | Antigravity 多 base fallback 条件(429/400/context-error) | Family Profile(antigravity)+ Kernel retry SPI | 先抽 Kernel Retry SPI(实现重试),profile 仅提供 retry 条件策略(不实现重试流程) | 高 | Wave-2(antigravity) |
|
|
30
|
+
| M11 | `src/providers/core/runtime/gemini-http-provider.ts:70` | OpenAI 消息转 Gemini `contents/systemInstruction` | Protocol(gemini) | 保留在 Gemini Protocol Adapter,统一入口 | 中 | Wave-3(protocol) |
|
|
31
|
+
| M12 | `src/providers/core/runtime/gemini-http-provider.ts:176` | Antigravity 签名类错误包装为 response | Family Profile(antigravity) | 抽离为 profile response policy | 中 | Wave-2(antigravity) |
|
|
32
|
+
| M13 | `src/providers/core/runtime/provider-factory.ts:388` | `gemini-cli-oauth` 决定实例化 GeminiCLI provider | Protocol + Profile 选择器 | factory 仅装配(不解析/不实例化 profile);选择逻辑迁到 registry resolver(只解析不实例化) | 中 | Wave-3(factory clean) |
|
|
33
|
+
| M14 | `src/providers/core/runtime/base-provider.ts:582` | gemini-cli/antigravity 429 bucket 粒度按 model | Family Profile(antigravity/gemini-cli) | 抽离为 rate-limit profile policy | 中 | Wave-2 |
|
|
34
|
+
| M15 | `src/providers/core/config/service-profiles.ts:123` | glm/qwen/iflow/gemini-cli 默认 header/base/model 混在基础 profile | Profile 目录(family defaults) | 拆成 protocol-base + family-default overlay | 中 | Wave-3 |
|
|
35
|
+
| M16 | `src/providers/core/utils/provider-type-utils.ts:14` | LEGACY family->type 映射与协议映射耦合 | Registry(provider 目录映射) | 单独迁入 provider-directory map;归一完成即冻结,runtime 禁止二次推断 | 中 | Wave-3 |
|
|
36
|
+
| M17 | `src/providers/core/config/provider-oauth-configs.ts:26` | OAuth 配置按 providerId 硬编码(qwen/iflow/gemini-cli/antigravity) | Family Profile(auth policy) | 抽为 profile-auth config,kernel 仅执行 flow | 中 | Wave-2 |
|
|
37
|
+
| M18 | `src/providers/core/runtime/http-transport-provider.ts:1290` | `isIflow/isAntigravity` 运行时识别散落在 transport | Registry + Profile resolver | 由配置 `providerId` + provider目录映射统一识别 | 高 | Wave-1/2 |
|
|
38
|
+
|
|
39
|
+
## 3. 哪些应该留在 Kernel(不迁)
|
|
40
|
+
|
|
41
|
+
以下能力保留在 Kernel,禁止品牌化:
|
|
42
|
+
|
|
43
|
+
- 认证 provider 生命周期装配(auth provider 初始化与 headers 合并)。
|
|
44
|
+
- HTTP 重试/超时/请求快照写入。
|
|
45
|
+
- Provider error 上报与标准字段补齐。
|
|
46
|
+
- runtime metadata 的只读透传。
|
|
47
|
+
|
|
48
|
+
## 4. 高风险项与依赖
|
|
49
|
+
|
|
50
|
+
### 高风险项
|
|
51
|
+
|
|
52
|
+
1. iFlow 业务错误 envelope(M06/M07)
|
|
53
|
+
- 风险:迁移不完整会导致 200 响应落到后续阶段才报 malformed。
|
|
54
|
+
2. iFlow 签名头(M05)
|
|
55
|
+
- 风险:签名 payload 任何字段顺序变化都会直接 400。
|
|
56
|
+
3. Antigravity fallback(M10)
|
|
57
|
+
- 风险:错误重试策略漂移会放大失败率。
|
|
58
|
+
4. iflowWebSearch 双实现(M01/M02/M03)
|
|
59
|
+
- 风险:双源逻辑导致行为不一致,必须先去重再连线。
|
|
60
|
+
|
|
61
|
+
### 前置依赖
|
|
62
|
+
|
|
63
|
+
- 需要先完成 `routecodex-113.3` 的 Profile API 与 Registry 解析顺序。
|
|
64
|
+
- 需要在 `routecodex-113.5` 固化 same-shape/control replay 模板后再做批量连线。
|
|
65
|
+
|
|
66
|
+
## 5. “先实现不连线”落地清单
|
|
67
|
+
|
|
68
|
+
### 实现阶段(不接线)
|
|
69
|
+
|
|
70
|
+
1. 新建 `profiles/families/iflow/*`,实现 endpoint/body/header/signature/error policy。
|
|
71
|
+
2. 新建 `profiles/families/antigravity/*`,实现 fallback/header/error policy。
|
|
72
|
+
3. 新建 `protocols/gemini/*` 适配器,承接消息 shape 转换。
|
|
73
|
+
4. 新建 `profiles/registry.ts` 与 provider-directory 映射解析器。
|
|
74
|
+
|
|
75
|
+
> 以上阶段只做“可调用实现 + 单测 + 回放对比”,不替换现有执行路径。
|
|
76
|
+
|
|
77
|
+
### 连线阶段(逐批次)
|
|
78
|
+
|
|
79
|
+
1. Wave-1 仅接 iFlow(M01~M07, M18-iflow)。
|
|
80
|
+
2. Wave-2 接 antigravity/gemini-cli(M09/M10/M12/M14/M17)。
|
|
81
|
+
3. Wave-3 做 factory/service-profile/provider-type-utils 清理(M11/M13/M15/M16)。
|
|
82
|
+
|
|
83
|
+
## 6. 验收证据(113.2 完成定义)
|
|
84
|
+
|
|
85
|
+
- 必须提供每个 Mxx 的“旧位点 + 新归属 + 迁移批次 + 风险”映射。
|
|
86
|
+
- 必须明确哪些保留在 Kernel,防止过度下沉。
|
|
87
|
+
- 必须给出分批连线顺序与回滚单位。
|
|
88
|
+
|