@jsonstudio/rcc 0.89.1205 → 0.89.1457
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/README.md +53 -1412
- package/configsamples/config.json +426 -0
- package/configsamples/config.reference.json +58 -0
- package/configsamples/provider/crs/config.v1.json +46 -0
- package/configsamples/provider/glm/config.v1.json +81 -0
- package/configsamples/provider/glm-anthropic/config.v1.json +45 -0
- package/configsamples/provider/iflow/config.v1.json +74 -0
- package/configsamples/provider/kimi/config.v1.json +41 -0
- package/configsamples/provider/lmstudio/config.v1.json +101 -0
- package/configsamples/provider/mimo/config.v1.json +35 -0
- package/configsamples/provider/modelscope/config.v1.json +96 -0
- package/configsamples/provider/qwen/config.v1.json +38 -0
- package/configsamples/provider/tab/config.v1.json +50 -0
- package/configsamples/provider/tabglm/config.v1.json +49 -0
- package/dist/build-info.js +2 -2
- package/dist/cli/commands/code.js +12 -6
- package/dist/cli/commands/code.js.map +1 -1
- package/dist/cli/commands/config.d.ts +2 -1
- package/dist/cli/commands/config.js +77 -103
- package/dist/cli/commands/config.js.map +1 -1
- package/dist/cli/commands/examples.js +6 -6
- package/dist/cli/commands/examples.js.map +1 -1
- package/dist/cli/commands/init.d.ts +28 -0
- package/dist/cli/commands/init.js +94 -0
- package/dist/cli/commands/init.js.map +1 -0
- package/dist/cli/commands/port.js +10 -2
- package/dist/cli/commands/port.js.map +1 -1
- package/dist/cli/commands/restart.js +5 -2
- package/dist/cli/commands/restart.js.map +1 -1
- package/dist/cli/commands/start.js +25 -22
- package/dist/cli/commands/start.js.map +1 -1
- package/dist/cli/commands/status.js +1 -0
- package/dist/cli/commands/status.js.map +1 -1
- package/dist/cli/commands/stop.js +1 -0
- package/dist/cli/commands/stop.js.map +1 -1
- package/dist/cli/config/bundled-docs.d.ts +20 -0
- package/dist/cli/config/bundled-docs.js +91 -0
- package/dist/cli/config/bundled-docs.js.map +1 -0
- package/dist/cli/config/init-config.d.ts +37 -0
- package/dist/cli/config/init-config.js +212 -0
- package/dist/cli/config/init-config.js.map +1 -0
- package/dist/cli/config/init-provider-catalog.d.ts +8 -0
- package/dist/cli/config/init-provider-catalog.js +187 -0
- package/dist/cli/config/init-provider-catalog.js.map +1 -0
- package/dist/cli/register/init-command.d.ts +3 -0
- package/dist/cli/register/init-command.js +5 -0
- package/dist/cli/register/init-command.js.map +1 -0
- package/dist/cli.js +28 -3
- package/dist/cli.js.map +1 -1
- package/dist/client/gemini/gemini-protocol-client.js +2 -1
- package/dist/client/gemini/gemini-protocol-client.js.map +1 -1
- package/dist/client/gemini-cli/gemini-cli-protocol-client.js +40 -16
- package/dist/client/gemini-cli/gemini-cli-protocol-client.js.map +1 -1
- package/dist/client/openai/chat-protocol-client.js +2 -1
- package/dist/client/openai/chat-protocol-client.js.map +1 -1
- package/dist/client/responses/responses-protocol-client.js +2 -1
- package/dist/client/responses/responses-protocol-client.js.map +1 -1
- package/dist/config/risk-control-config.d.ts +94 -0
- package/dist/config/risk-control-config.js +196 -0
- package/dist/config/risk-control-config.js.map +1 -0
- package/dist/constants/index.d.ts +6 -0
- package/dist/constants/index.js +13 -0
- package/dist/constants/index.js.map +1 -1
- package/dist/docs/daemon-admin-ui.html +2113 -190
- package/dist/error-handling/quiet-error-handling-center.js +46 -8
- package/dist/error-handling/quiet-error-handling-center.js.map +1 -1
- package/dist/index.js +0 -1
- package/dist/index.js.map +1 -1
- package/dist/manager/modules/health/index.d.ts +1 -1
- package/dist/manager/modules/quota/antigravity-quota-manager.d.ts +70 -0
- package/dist/manager/modules/quota/antigravity-quota-manager.js +442 -0
- package/dist/manager/modules/quota/antigravity-quota-manager.js.map +1 -0
- package/dist/manager/modules/quota/index.d.ts +3 -127
- package/dist/manager/modules/quota/index.js +2 -1093
- package/dist/manager/modules/quota/index.js.map +1 -1
- package/dist/manager/modules/quota/provider-key-normalization.d.ts +3 -0
- package/dist/manager/modules/quota/provider-key-normalization.js +155 -0
- package/dist/manager/modules/quota/provider-key-normalization.js.map +1 -0
- package/dist/manager/modules/quota/provider-quota-daemon.cooldown.d.ts +9 -0
- package/dist/manager/modules/quota/provider-quota-daemon.cooldown.js +115 -0
- package/dist/manager/modules/quota/provider-quota-daemon.cooldown.js.map +1 -0
- package/dist/manager/modules/quota/provider-quota-daemon.d.ts +77 -0
- package/dist/manager/modules/quota/provider-quota-daemon.events.d.ts +12 -0
- package/dist/manager/modules/quota/provider-quota-daemon.events.js +239 -0
- package/dist/manager/modules/quota/provider-quota-daemon.events.js.map +1 -0
- package/dist/manager/modules/quota/provider-quota-daemon.js +404 -0
- package/dist/manager/modules/quota/provider-quota-daemon.js.map +1 -0
- package/dist/manager/modules/quota/provider-quota-daemon.model-backoff.d.ts +11 -0
- package/dist/manager/modules/quota/provider-quota-daemon.model-backoff.js +192 -0
- package/dist/manager/modules/quota/provider-quota-daemon.model-backoff.js.map +1 -0
- package/dist/manager/modules/quota/provider-quota-daemon.snapshot.d.ts +8 -0
- package/dist/manager/modules/quota/provider-quota-daemon.snapshot.js +96 -0
- package/dist/manager/modules/quota/provider-quota-daemon.snapshot.js.map +1 -0
- package/dist/manager/modules/quota/provider-quota-daemon.view.d.ts +19 -0
- package/dist/manager/modules/quota/provider-quota-daemon.view.js +37 -0
- package/dist/manager/modules/quota/provider-quota-daemon.view.js.map +1 -0
- package/dist/manager/modules/routing/index.d.ts +1 -0
- package/dist/manager/modules/routing/index.js +11 -25
- package/dist/manager/modules/routing/index.js.map +1 -1
- package/dist/manager/quota/provider-quota-center.d.ts +2 -0
- package/dist/manager/quota/provider-quota-center.js +80 -82
- package/dist/manager/quota/provider-quota-center.js.map +1 -1
- package/dist/modules/llmswitch/bridge.d.ts +16 -18
- package/dist/modules/llmswitch/bridge.js +293 -94
- package/dist/modules/llmswitch/bridge.js.map +1 -1
- package/dist/modules/llmswitch/core-loader.d.ts +4 -2
- package/dist/modules/llmswitch/core-loader.js +32 -20
- package/dist/modules/llmswitch/core-loader.js.map +1 -1
- package/dist/modules/pipeline/utils/colored-logger.js +3 -2
- package/dist/modules/pipeline/utils/colored-logger.js.map +1 -1
- package/dist/modules/pipeline/utils/debug-logger.js +1 -1
- package/dist/modules/pipeline/utils/debug-logger.js.map +1 -1
- package/dist/providers/auth/antigravity-userinfo-helper.d.ts +2 -1
- package/dist/providers/auth/antigravity-userinfo-helper.js +25 -4
- package/dist/providers/auth/antigravity-userinfo-helper.js.map +1 -1
- package/dist/providers/auth/iflow-cookie-auth.js +0 -2
- package/dist/providers/auth/iflow-cookie-auth.js.map +1 -1
- package/dist/providers/auth/oauth-lifecycle.js +2 -23
- package/dist/providers/auth/oauth-lifecycle.js.map +1 -1
- package/dist/providers/auth/tokenfile-auth.d.ts +2 -0
- package/dist/providers/auth/tokenfile-auth.js +33 -1
- package/dist/providers/auth/tokenfile-auth.js.map +1 -1
- package/dist/providers/core/config/camoufox-launcher.d.ts +5 -0
- package/dist/providers/core/config/camoufox-launcher.js +40 -4
- package/dist/providers/core/config/camoufox-launcher.js.map +1 -1
- package/dist/providers/core/config/service-profiles.js +7 -18
- package/dist/providers/core/config/service-profiles.js.map +1 -1
- package/dist/providers/core/runtime/antigravity-quota-client.js +6 -3
- package/dist/providers/core/runtime/antigravity-quota-client.js.map +1 -1
- package/dist/providers/core/runtime/base-provider.d.ts +2 -7
- package/dist/providers/core/runtime/base-provider.js +84 -165
- package/dist/providers/core/runtime/base-provider.js.map +1 -1
- package/dist/providers/core/runtime/gemini-cli-http-provider.d.ts +7 -0
- package/dist/providers/core/runtime/gemini-cli-http-provider.js +368 -97
- package/dist/providers/core/runtime/gemini-cli-http-provider.js.map +1 -1
- package/dist/providers/core/runtime/http-request-executor.d.ts +3 -0
- package/dist/providers/core/runtime/http-request-executor.js +110 -38
- package/dist/providers/core/runtime/http-request-executor.js.map +1 -1
- package/dist/providers/core/runtime/http-transport-provider.d.ts +17 -0
- package/dist/providers/core/runtime/http-transport-provider.js +165 -16
- package/dist/providers/core/runtime/http-transport-provider.js.map +1 -1
- package/dist/providers/core/runtime/provider-error-classifier.js +10 -0
- package/dist/providers/core/runtime/provider-error-classifier.js.map +1 -1
- package/dist/providers/core/runtime/provider-factory.js +7 -5
- package/dist/providers/core/runtime/provider-factory.js.map +1 -1
- package/dist/providers/core/runtime/provider-runtime-metadata.d.ts +6 -0
- package/dist/providers/core/runtime/provider-runtime-metadata.js.map +1 -1
- package/dist/providers/core/runtime/rate-limit-manager.d.ts +1 -12
- package/dist/providers/core/runtime/rate-limit-manager.js +4 -77
- package/dist/providers/core/runtime/rate-limit-manager.js.map +1 -1
- package/dist/providers/core/runtime/responses-provider.d.ts +1 -7
- package/dist/providers/core/runtime/responses-provider.js +12 -93
- package/dist/providers/core/runtime/responses-provider.js.map +1 -1
- package/dist/providers/core/strategies/oauth-auth-code-flow.js +12 -8
- package/dist/providers/core/strategies/oauth-auth-code-flow.js.map +1 -1
- package/dist/providers/core/utils/http-client.js +36 -46
- package/dist/providers/core/utils/http-client.js.map +1 -1
- package/dist/providers/core/utils/provider-error-logger.d.ts +1 -1
- package/dist/providers/core/utils/provider-error-reporter.d.ts +3 -1
- package/dist/providers/core/utils/provider-error-reporter.js +3 -0
- package/dist/providers/core/utils/provider-error-reporter.js.map +1 -1
- package/dist/providers/core/utils/snapshot-writer.js +1 -4
- package/dist/providers/core/utils/snapshot-writer.js.map +1 -1
- package/dist/providers/mock/mock-provider-runtime.js +57 -27
- package/dist/providers/mock/mock-provider-runtime.js.map +1 -1
- package/dist/scripts/camoufox/launch-auth.mjs +193 -58
- package/dist/server/handlers/handler-utils.js +8 -3
- package/dist/server/handlers/handler-utils.js.map +1 -1
- package/dist/server/handlers/responses-handler.js +1 -1
- package/dist/server/handlers/responses-handler.js.map +1 -1
- package/dist/server/runtime/http-server/daemon-admin/auth-handler.d.ts +2 -0
- package/dist/server/runtime/http-server/daemon-admin/auth-handler.js +103 -0
- package/dist/server/runtime/http-server/daemon-admin/auth-handler.js.map +1 -0
- package/dist/server/runtime/http-server/daemon-admin/auth-session.d.ts +5 -0
- package/dist/server/runtime/http-server/daemon-admin/auth-session.js +77 -0
- package/dist/server/runtime/http-server/daemon-admin/auth-session.js.map +1 -0
- package/dist/server/runtime/http-server/daemon-admin/auth-store.d.ts +18 -0
- package/dist/server/runtime/http-server/daemon-admin/auth-store.js +89 -0
- package/dist/server/runtime/http-server/daemon-admin/auth-store.js.map +1 -0
- package/dist/server/runtime/http-server/daemon-admin/credentials-handler.js +1 -2
- package/dist/server/runtime/http-server/daemon-admin/credentials-handler.js.map +1 -1
- package/dist/server/runtime/http-server/daemon-admin/providers-handler.js +226 -24
- package/dist/server/runtime/http-server/daemon-admin/providers-handler.js.map +1 -1
- package/dist/server/runtime/http-server/daemon-admin/quota-handler.js +47 -8
- package/dist/server/runtime/http-server/daemon-admin/quota-handler.js.map +1 -1
- package/dist/server/runtime/http-server/daemon-admin/restart-handler.js +1 -1
- package/dist/server/runtime/http-server/daemon-admin/restart-handler.js.map +1 -1
- package/dist/server/runtime/http-server/daemon-admin/stats-handler.js +1 -1
- package/dist/server/runtime/http-server/daemon-admin/stats-handler.js.map +1 -1
- package/dist/server/runtime/http-server/daemon-admin/status-handler.js +68 -4
- package/dist/server/runtime/http-server/daemon-admin/status-handler.js.map +1 -1
- package/dist/server/runtime/http-server/daemon-admin-routes.d.ts +3 -4
- package/dist/server/runtime/http-server/daemon-admin-routes.js +9 -14
- package/dist/server/runtime/http-server/daemon-admin-routes.js.map +1 -1
- package/dist/server/runtime/http-server/executor-metadata.js +1 -1
- package/dist/server/runtime/http-server/executor-metadata.js.map +1 -1
- package/dist/server/runtime/http-server/executor-response.js +0 -16
- package/dist/server/runtime/http-server/executor-response.js.map +1 -1
- package/dist/server/runtime/http-server/hub-shadow-compare.js +110 -34
- package/dist/server/runtime/http-server/hub-shadow-compare.js.map +1 -1
- package/dist/server/runtime/http-server/index.d.ts +5 -3
- package/dist/server/runtime/http-server/index.js +281 -136
- package/dist/server/runtime/http-server/index.js.map +1 -1
- package/dist/server/runtime/http-server/middleware.js +19 -1
- package/dist/server/runtime/http-server/middleware.js.map +1 -1
- package/dist/server/runtime/http-server/request-executor.js +59 -24
- package/dist/server/runtime/http-server/request-executor.js.map +1 -1
- package/dist/server/runtime/http-server/routes.js +12 -3
- package/dist/server/runtime/http-server/routes.js.map +1 -1
- package/dist/server/runtime/http-server/session-dir.d.ts +2 -0
- package/dist/server/runtime/http-server/session-dir.js +59 -0
- package/dist/server/runtime/http-server/session-dir.js.map +1 -0
- package/dist/server/runtime/http-server/types.d.ts +0 -4
- package/dist/server/utils/utf8-chunk-buffer.js +6 -3
- package/dist/server/utils/utf8-chunk-buffer.js.map +1 -1
- package/dist/server/utils/warmup-storm-tracker.js +1 -1
- package/dist/server/utils/warmup-storm-tracker.js.map +1 -1
- package/dist/server-factory.d.ts +6 -28
- package/dist/server-factory.js +8 -93
- package/dist/server-factory.js.map +1 -1
- package/dist/token-daemon/index.js +2 -2
- package/dist/token-daemon/index.js.map +1 -1
- package/dist/token-daemon/provider-registry.js +0 -1
- package/dist/token-daemon/provider-registry.js.map +1 -1
- package/dist/token-daemon/server-utils.js +8 -9
- package/dist/token-daemon/server-utils.js.map +1 -1
- package/dist/token-daemon/token-utils.js +1 -1
- package/dist/token-daemon/token-utils.js.map +1 -1
- package/dist/tools/semantic-replay.js +2 -2
- package/dist/tools/semantic-replay.js.map +1 -1
- package/dist/tools/stats-request-events.d.ts +1 -1
- package/dist/tools/stats-usage.js +6 -3
- package/dist/tools/stats-usage.js.map +1 -1
- package/dist/utils/llms-engine-shadow.d.ts +19 -0
- package/dist/utils/llms-engine-shadow.js +209 -0
- package/dist/utils/llms-engine-shadow.js.map +1 -0
- package/dist/utils/runtime-versions.js +2 -1
- package/dist/utils/runtime-versions.js.map +1 -1
- package/dist/utils/strip-internal-keys.d.ts +12 -0
- package/dist/utils/strip-internal-keys.js +28 -0
- package/dist/utils/strip-internal-keys.js.map +1 -0
- package/docs/ARCHITECTURE.md +402 -0
- package/docs/CHAT_PROCESS_PROTOCOL_AND_PIPELINE.md +221 -0
- package/docs/CODEX_AND_CLAUDE_CODE.md +69 -0
- package/docs/CONFIG_ARCHITECTURE.md +517 -0
- package/docs/ERROR_HANDLING_AUDIT.md +0 -0
- package/docs/GCLI2API_PARITY_GAPS.md +98 -0
- package/docs/INSTALLATION_AND_QUICKSTART.md +74 -0
- package/docs/INSTRUCTION_MARKUP.md +89 -0
- package/docs/MODULE_ENHANCEMENT_SYSTEM.md +666 -0
- package/docs/PORTS.md +36 -0
- package/docs/PROVIDERS_BUILTIN.md +111 -0
- package/docs/PROVIDER_TYPES.md +55 -0
- package/docs/SERVERTOOL_CLOCK_DESIGN.md +233 -0
- package/docs/USAGE_HANDLING_ANALYSIS.md +335 -0
- package/docs/USER_CONFIG_PARSER_CHANGES.md +175 -0
- package/docs/V3_INBOUND_OUTBOUND_DESIGN.md +86 -0
- package/docs/VIRTUAL_ROUTER_PRIORITY_AND_HEALTH.md +125 -0
- package/docs/anthropic-request-golden-samples.md +50 -0
- package/docs/antigravity-gemini-format-cleanup.md +102 -0
- package/docs/antigravity-routing-contract.md +31 -0
- package/docs/ccr-alignment-enhancetool.md +105 -0
- package/docs/chat-glm-500-analysis.md +79 -0
- package/docs/chat-request-golden-samples.md +42 -0
- package/docs/chat-semantic-expansion-plan.md +84 -0
- package/docs/cli-command-inventory.md +76 -0
- package/docs/codex-samples-replay.md +50 -0
- package/docs/daemon-admin-api-design.md +350 -0
- package/docs/daemon-admin-module-structure.md +169 -0
- package/docs/daemon-admin-ui.html +3394 -0
- package/docs/debug-system-design.md +734 -0
- package/docs/debugging/gemini-sse-root-cause.md +52 -0
- package/docs/debugging/sse_encoding_failure_analysis.md +53 -0
- package/docs/dry-run/README.md +721 -0
- package/docs/error-handling-v2.md +92 -0
- package/docs/exec-command-guard-policy.example.v1.json +42 -0
- package/docs/fixes/gemini-protocol-mapping.md +57 -0
- package/docs/fixes/oauth-portal-timing-fix.md +202 -0
- package/docs/fixes/web-search-hop3-fix.md +265 -0
- package/docs/glm-api-reference.md +390 -0
- package/docs/glm-chat-completions.md +1779 -0
- package/docs/glm-history-inline-images.md +44 -0
- package/docs/golden-ci-library.md +66 -0
- package/docs/lmstudio-dry-run-summary.md +203 -0
- package/docs/lmstudio-tool-calling.md +214 -0
- package/docs/mapping-tables/anthropic-to-openai.json +290 -0
- package/docs/mapping-tables/iflow-to-openai.json +215 -0
- package/docs/mapping-tables/openai-passthrough.json +190 -0
- package/docs/mapping-tables/openai-to-iflow.json +227 -0
- package/docs/monitoring/Design.md +61 -0
- package/docs/multi-token-auth-guide.md +66 -0
- package/docs/oauth-authentication-guide.md +168 -0
- package/docs/oauth-iflow-implementation.md +153 -0
- package/docs/pipeline-routing-report.md +209 -0
- package/docs/plans/manager-daemon/PLAN.md +86 -0
- package/docs/plans/provider-config-v2-plan.md +176 -0
- package/docs/plans/provider-runtime-manager-plan.md +209 -0
- package/docs/plans/transparent-429-failover.md +89 -0
- package/docs/plans/unified-hub-framework-v1.md +245 -0
- package/docs/provider-config-v2-ui-design.md +181 -0
- package/docs/provider-quota-design.md +129 -0
- package/docs/providers/gemini-provider.md +62 -0
- package/docs/providers/lmstudio-v2-migration-report.md +102 -0
- package/docs/providers/provider-composite-design.md +142 -0
- package/docs/providers/provider-composite-testing.md +98 -0
- package/docs/providers/provider-type-only-migration.md +111 -0
- package/docs/rccx-wasm-migration.md +74 -0
- package/docs/refactoring/architecture-comparison-diagram.md +140 -0
- package/docs/refactoring/compatibility-v2-architecture-design.md +738 -0
- package/docs/refactoring/workflow-compatibility-refactoring-design.md +361 -0
- package/docs/reports/routing-classification-report.json +24 -0
- package/docs/reports/routing-classification-report.md +18 -0
- package/docs/reports/thinking-keywords-report.json +19 -0
- package/docs/responses/README.md +156 -0
- package/docs/responses-generic-provider.md +86 -0
- package/docs/responses-passthrough-provider-design.md +202 -0
- package/docs/routing-awrr-health-weighted-round-robin.md +179 -0
- package/docs/routing-instructions.md +393 -0
- package/docs/servertool-framework.md +65 -0
- package/docs/stop-message-auto.md +225 -0
- package/docs/streaming-flow.html +30 -0
- package/docs/streaming-flow.md +182 -0
- package/docs/token-daemon-preview.html +490 -0
- package/docs/token-refresh-daemon-plan.md +269 -0
- package/docs/transformation-tables/Gemini-FinishReason/345/256/214/346/225/264/350/275/254/346/215/242/350/241/250.json +233 -0
- package/docs/transformation-tables/README.md +225 -0
- package/docs/transformation-tables/claude-code-router-anthropic-to-gemini.json +283 -0
- package/docs/transformation-tables/claude-code-router-anthropic-to-openai.json +208 -0
- package/docs/transformation-tables/claude-code-router-openai-to-anthropic.json +261 -0
- package/docs/transformation-tables/claude-code-router-openai-to-gemini.json +208 -0
- package/docs/transformation-tables/claude-code-router-openai-to-lmstudio.json +182 -0
- package/docs/transformation-tables/claude-code-router-openai-to-ollama.json +250 -0
- package/docs/transformation-tables/claude-code-router-openai-to-textgenwebui.json +295 -0
- package/docs/transformation-tables/claude-code-router-provider-conversions.json +193 -0
- package/docs/transformation-tables//345/256/214/346/225/264/347/232/204/345/267/245/345/205/267/346/211/247/350/241/214/346/265/201/347/250/213/350/275/254/346/215/242/350/241/250.json +299 -0
- package/docs/transformation-tables//345/257/271/350/257/235/345/216/206/345/217/262/347/273/264/346/212/244/345/210/206/346/236/220.md +134 -0
- package/docs/transformation-tables//345/267/245/345/205/267/350/260/203/347/224/250/346/250/241/345/274/217/345/210/206/346/236/220.md +158 -0
- package/docs/transformation-tables//347/212/266/346/200/201/347/256/241/347/220/206/351/234/200/346/261/202/345/210/206/346/236/220.md +175 -0
- package/docs/transformation-tables//351/235/231/346/200/201/350/241/250vs/345/212/250/346/200/201/345/210/206/346/236/220.md +189 -0
- package/docs/transformation-tables//351/235/231/346/200/201/350/241/250/345/207/206/347/241/256/346/200/247/350/257/204/344/274/260.md +179 -0
- package/docs/transformation-tables//351/235/236/346/265/201/345/274/217/345/234/272/346/231/257/345/210/206/346/236/220.md +189 -0
- package/docs/v2-architecture/IMPLEMENTATION-ROADMAP.md +367 -0
- package/docs/v2-architecture/OPTIMIZED-DESIGN.md +827 -0
- package/docs/v2-architecture/PRERUN-CONNECTION-DESIGN.md +716 -0
- package/docs/v2-architecture/README.md +549 -0
- package/docs/verification/modelscope-verify.md +59 -0
- package/docs/verified-configs/README.md +60 -0
- package/docs/verified-configs/v0.45.0/README.md +244 -0
- package/docs/verified-configs/v0.45.0/lmstudio-5521-gpt-oss-20b-mlx.json +135 -0
- package/docs/verified-configs/v0.45.0/merged-config.5521.json +1205 -0
- package/docs/verified-configs/v0.45.0/merged-config.qwen-5522.json +1559 -0
- package/docs/verified-configs/v0.45.0/qwen-5522-qwen3-coder-plus-final.json +221 -0
- package/docs/verified-configs/v0.45.0/qwen-5522-qwen3-coder-plus-fixed.json +242 -0
- package/docs/verified-configs/v0.45.0/qwen-5522-qwen3-coder-plus.json +242 -0
- package/docs/web-search-service-design.md +322 -0
- package/package.json +26 -15
- package/scripts/build-core.mjs +3 -1
- package/scripts/camoufox/launch-auth.mjs +193 -58
- package/scripts/ci/repo-sanity.mjs +138 -0
- package/scripts/mock-provider/run-regressions.mjs +157 -1
- package/scripts/monitor-diff.mjs +126 -0
- package/scripts/pack-mode.mjs +19 -1
- package/scripts/pack-rcc.mjs +63 -0
- package/scripts/run-bg.sh +0 -14
- package/scripts/tests/ci-jest.mjs +119 -0
- package/scripts/tools-dev/responses-debug-client/README.md +23 -0
- package/scripts/tools-dev/responses-debug-client/payloads/poem.json +13 -0
- package/scripts/tools-dev/responses-debug-client/payloads/sample-no-tools.json +98 -0
- package/scripts/tools-dev/responses-debug-client/payloads/text.json +13 -0
- package/scripts/tools-dev/responses-debug-client/payloads/tool.json +27 -0
- package/scripts/tools-dev/responses-debug-client/run.mjs +65 -0
- package/scripts/tools-dev/responses-debug-client/src/index.ts +281 -0
- package/scripts/tools-dev/run-llmswitch-chat.mjs +53 -0
- package/scripts/tools-dev/server-tools-dev/run-web-fetch.mjs +65 -0
- package/scripts/unified-hub-shadow-compare.mjs +33 -13
- package/scripts/vendor-core.mjs +13 -3
- package/scripts/verify-e2e-toolcall.mjs +115 -26
- package/dist/modules/llmswitch/pipeline-registry.d.ts +0 -57
- package/dist/modules/llmswitch/pipeline-registry.js +0 -229
- package/dist/modules/llmswitch/pipeline-registry.js.map +0 -1
- package/dist/server/RouteCodexServer.d.ts +0 -13
- package/dist/server/RouteCodexServer.js +0 -25
- package/dist/server/RouteCodexServer.js.map +0 -1
- package/dist/v2/conversion/hub/snapshot-recorder.d.ts +0 -12
- package/dist/v2/conversion/hub/snapshot-recorder.js +0 -22
- package/dist/v2/conversion/hub/snapshot-recorder.js.map +0 -1
- package/scripts/test-fc-responses.mjs +0 -66
- package/scripts/test-guidance.mjs +0 -100
- package/scripts/test-iflow-web-search.mjs +0 -141
- package/scripts/test-iflow.mjs +0 -379
- package/scripts/test-tool-exec.mjs +0 -26
|
@@ -0,0 +1,402 @@
|
|
|
1
|
+
# RouteCodex 系统架构文档
|
|
2
|
+
|
|
3
|
+
## 概述
|
|
4
|
+
|
|
5
|
+
RouteCodex 是一个多 Provider OpenAI 代理服务器,支持动态路由、负载均衡和兼容性处理。系统采用模块化设计,支持主题订阅、错误处理、调试中心等高级功能。
|
|
6
|
+
|
|
7
|
+
## 与 sharedmodule/llmswitch-core 的职责边界
|
|
8
|
+
|
|
9
|
+
| 责任层 | RouteCodex Host (本仓库) | sharedmodule/llmswitch-core |
|
|
10
|
+
| --- | --- | --- |
|
|
11
|
+
| 配置解析 | 读取用户配置文件,调用 `bootstrapVirtualRouterConfig`,将 `virtualRouterArtifacts.config` 传给 `HubPipeline` | 验证 routing/providers/classifier,展开 provider.keyAlias.model,输出 `targetRuntime` |
|
|
12
|
+
| HTTP 请求 | `/v1/chat`/`/v1/responses`/`/v1/messages` handler 将 HTTP/SSE 载荷封装为 `HubPipelineRequest` | SSE Input → Chat Process → Virtual Router → Output,生成 `providerPayload` + `target` |
|
|
13
|
+
| Provider 初始化 | 根据 `virtualRouterArtifacts.targetRuntime` 初始化 Provider 实例,绑定 auth/baseURL/compat profile | 不直接创建 Provider 客户端,仅输出 runtime 元数据 |
|
|
14
|
+
| Provider 调用 | 使用 runtimeKey 查找 Provider 实例,向上游发送请求,记录日志/快照 | 输出 `target.runtimeKey`,供 host 查表;捕获 `ProviderErrorEvent` 以管理熔断 |
|
|
15
|
+
| 错误处理 | Provider/Compatibility 抛错 → `errorHandlingCenter.handleError` → 上报 `providerErrorCenter`,并映射为 HTTP 响应 | Virtual Router 接收 `ProviderErrorEvent`、执行熔断/降级;Hub Pipeline 将错误冒泡给 host |
|
|
16
|
+
| 热更新 | 监听配置变更 → 调用 `hubPipeline.updateVirtualRouterConfig(newArtifacts.config)`,并刷新 Provider runtime | 在内部替换 Virtual Router 配置并继续输出最新的 routing/runtime 状态 |
|
|
17
|
+
|
|
18
|
+
> **落地要求**:Host 不再解析旧的“合并配置”蓝图,也不在 Provider 层做“模型选择”;所有模型替换/目标决策由 Virtual Router 执行,Host 仅负责“把 HTTP/SSE 转交给 Hub Pipeline + 根据 runtimeKey 调用 Provider”,从而保证单一职责和无兜底策略。
|
|
19
|
+
|
|
20
|
+
## 系统架构
|
|
21
|
+
|
|
22
|
+
### 核心组件
|
|
23
|
+
|
|
24
|
+
```
|
|
25
|
+
┌─────────────────────────────────────────────────────────────────┐
|
|
26
|
+
│ RouteCodex 架构 │
|
|
27
|
+
├─────────────────────────────────────────────────────────────────┤
|
|
28
|
+
│ │
|
|
29
|
+
│ ┌─────────────────┐ ┌─────────────────┐ ┌─────────────────┐ │
|
|
30
|
+
│ │ HTTP Server │ │ Config Mgr │ │ Provider Mgr │ │
|
|
31
|
+
│ │ │ │ │ │ │ │
|
|
32
|
+
│ │ • 请求处理 │ │ • 配置管理 │ │ • Provider管理 │ │
|
|
33
|
+
│ │ • 路由分发 │ │ • 验证器 │ │ • 负载均衡 │ │
|
|
34
|
+
│ │ • 响应格式化 │ │ • 热重载 │ │ • 故障转移 │ │
|
|
35
|
+
│ └─────────────────┘ └─────────────────┘ └─────────────────┘ │
|
|
36
|
+
│ │ │ │ │
|
|
37
|
+
│ └─────────────────────┼─────────────────────┘ │
|
|
38
|
+
│ │ │
|
|
39
|
+
│ ┌─────────────────┐ ┌─────────────────┐ ┌─────────────────┐ │
|
|
40
|
+
│ │ Core Logic │ │ MessageCenter │ │ DebugCenter │ │
|
|
41
|
+
│ │ │ │ │ │ │ │
|
|
42
|
+
│ │ • 请求转发 │ │ • 主题订阅 │ │ • 调试记录 │ │
|
|
43
|
+
│ │ • 响应处理 │ │ • 消息路由 │ │ • 性能监控 │ │
|
|
44
|
+
│ │ • 错误处理 │ │ • 模块通信 │ │ • 会话管理 │ │
|
|
45
|
+
│ └─────────────────┘ └─────────────────┘ └─────────────────┘ │
|
|
46
|
+
│ │ │ │ │
|
|
47
|
+
│ └─────────────────────┼─────────────────────┘ │
|
|
48
|
+
│ │ │
|
|
49
|
+
│ ┌─────────────────┐ ┌─────────────────┐ ┌─────────────────┐ │
|
|
50
|
+
│ │ Utilities │ │ ErrorHandling │ │ Patches │ │
|
|
51
|
+
│ │ │ │ │ │ │ │
|
|
52
|
+
│ │ • 日志工具 │ │ • 错误处理 │ │ • 兼容性补丁 │ │
|
|
53
|
+
│ │ • 负载均衡 │ │ • 重试机制 │ │ • 响应转换 │ │
|
|
54
|
+
│ │ • 故障转移 │ │ • 异常恢复 │ │ • 格式适配 │ │
|
|
55
|
+
│ └─────────────────┘ └─────────────────┘ └─────────────────┘ │
|
|
56
|
+
│ │
|
|
57
|
+
└─────────────────────────────────────────────────────────────────┘
|
|
58
|
+
```
|
|
59
|
+
|
|
60
|
+
### 主题订阅系统
|
|
61
|
+
|
|
62
|
+
#### MessageCenter 架构
|
|
63
|
+
|
|
64
|
+
```
|
|
65
|
+
┌─────────────────────────────────────────────────────────────────┐
|
|
66
|
+
│ MessageCenter │
|
|
67
|
+
├─────────────────────────────────────────────────────────────────┤
|
|
68
|
+
│ │
|
|
69
|
+
│ ┌─────────────────┐ ┌─────────────────┐ ┌─────────────────┐ │
|
|
70
|
+
│ │ Module Mgr │ │TopicSubscription │ │MessageProcessor │ │
|
|
71
|
+
│ │ │ │ Manager │ │ │ │
|
|
72
|
+
│ │ • 模块注册 │ │ • 主题订阅 │ │ • 消息验证 │ │
|
|
73
|
+
│ │ • 生命周期 │ │ • 通配符支持 │ │ • 消息处理 │ │
|
|
74
|
+
│ │ • 状态管理 │ │ • 订阅管理 │ │ • 路由分发 │ │
|
|
75
|
+
│ └─────────────────┘ └─────────────────┘ └─────────────────┘ │
|
|
76
|
+
│ │ │ │ │
|
|
77
|
+
│ └─────────────────────┼─────────────────────┘ │
|
|
78
|
+
│ │ │
|
|
79
|
+
│ ┌─────────────────┐ ┌─────────────────┐ ┌─────────────────┐ │
|
|
80
|
+
│ │Request Mgr │ │Statistics Mgr │ │ Broadcast Mgr │ │
|
|
81
|
+
│ │ │ │ │ │ │ │
|
|
82
|
+
│ │ • 请求管理 │ │ • 性能统计 │ │ • 消息广播 │ │
|
|
83
|
+
│ │ • 响应处理 │ │ • 监控指标 │ │ • 多播分发 │ │
|
|
84
|
+
│ │ • 超时控制 │ │ • 报告生成 │ │ • 订阅通知 │ │
|
|
85
|
+
│ └─────────────────┘ └─────────────────┘ └─────────────────┘ │
|
|
86
|
+
│ │
|
|
87
|
+
└─────────────────────────────────────────────────────────────────┘
|
|
88
|
+
```
|
|
89
|
+
|
|
90
|
+
#### 主题订阅特性
|
|
91
|
+
|
|
92
|
+
1. **主题订阅**
|
|
93
|
+
- 支持模块订阅特定主题
|
|
94
|
+
- 动态订阅/取消订阅
|
|
95
|
+
- 订阅状态管理
|
|
96
|
+
|
|
97
|
+
2. **通配符支持**
|
|
98
|
+
- 支持通配符订阅所有主题
|
|
99
|
+
- 灵活的消息路由
|
|
100
|
+
- 订阅者过滤
|
|
101
|
+
|
|
102
|
+
3. **消息路由**
|
|
103
|
+
- 基于主题的消息分发
|
|
104
|
+
- 多播消息传递
|
|
105
|
+
- 订阅者隔离
|
|
106
|
+
|
|
107
|
+
4. **统计监控**
|
|
108
|
+
- 订阅统计信息
|
|
109
|
+
- 消息传递统计
|
|
110
|
+
- 性能指标收集
|
|
111
|
+
|
|
112
|
+
### 调试中心集成
|
|
113
|
+
|
|
114
|
+
#### DebugCenter 主题订阅集成
|
|
115
|
+
|
|
116
|
+
```
|
|
117
|
+
┌─────────────────────────────────────────────────────────────────┐
|
|
118
|
+
│ DebugCenter │
|
|
119
|
+
├─────────────────────────────────────────────────────────────────┤
|
|
120
|
+
│ │
|
|
121
|
+
│ ┌─────────────────┐ ┌─────────────────┐ ┌─────────────────┐ │
|
|
122
|
+
│ │ Event Bus │ │ Session Mgr │ │ Topic Sub │ │
|
|
123
|
+
│ │ │ │ │ │ │ │
|
|
124
|
+
│ │ • 事件总线 │ │ • 会话管理 │ │ • 主题订阅 │ │
|
|
125
|
+
│ │ • 事件处理 │ │ • 状态跟踪 │ │ • 消息发布 │ │
|
|
126
|
+
│ │ • 订阅管理 │ │ • 生命周期 │ │ • 跨模块通信 │ │
|
|
127
|
+
│ └─────────────────┘ └─────────────────┘ └─────────────────┘ │
|
|
128
|
+
│ │ │ │ │
|
|
129
|
+
│ └─────────────────────┼─────────────────────┘ │
|
|
130
|
+
│ │ │
|
|
131
|
+
│ ┌─────────────────┐ ┌─────────────────┐ ┌─────────────────┐ │
|
|
132
|
+
│ │ Pipeline │ │ Message Ctr │ │ Statistics │ │
|
|
133
|
+
│ │ │ │ │ │ │ │
|
|
134
|
+
│ │ • 流水线处理 │ │ • 消息中心 │ │ • 统计信息 │ │
|
|
135
|
+
│ │ • 事件记录 │ │ • 集成通信 │ │ • 性能监控 │ │
|
|
136
|
+
│ │ • 协调调度 │ │ • 全局实例 │ │ • 报告生成 │ │
|
|
137
|
+
│ └─────────────────┘ └─────────────────┘ └─────────────────┘ │
|
|
138
|
+
│ │
|
|
139
|
+
└─────────────────────────────────────────────────────────────────┘
|
|
140
|
+
```
|
|
141
|
+
|
|
142
|
+
### 模块依赖关系
|
|
143
|
+
|
|
144
|
+
```
|
|
145
|
+
┌─────────────────────────────────────────────────────────────────┐
|
|
146
|
+
│ 模块依赖关系 │
|
|
147
|
+
├─────────────────────────────────────────────────────────────────┤
|
|
148
|
+
│ │
|
|
149
|
+
│ ┌─────────────────┐ ┌─────────────────┐ ┌─────────────────┐ │
|
|
150
|
+
│ │ RouteCodex │ │ rcc-errorhandling │ │
|
|
151
|
+
│ │ │ │ │ │ │ │
|
|
152
|
+
│ │ • 主应用 │ │ • 调试中心 │ │ • 错误处理 │ │
|
|
153
|
+
│ │ • 服务器 │ │ • 主题订阅 │ │ • 异常管理 │ │
|
|
154
|
+
│ │ • 路由管理 │ │ • 会话跟踪 │ │ • 重试机制 │ │
|
|
155
|
+
│ └─────────────────┘ └─────────────────┘ └─────────────────┘ │
|
|
156
|
+
│ │ │ │ │
|
|
157
|
+
│ └───────────────────────┼───────────────────────┘ │
|
|
158
|
+
│ │ │
|
|
159
|
+
│ ┌─────────────────────────────────────────────────────────────────┐ │
|
|
160
|
+
│ │ rcc-basemodule │ │
|
|
161
|
+
│ │ │ │
|
|
162
|
+
│ │ ┌─────────────────┐ ┌─────────────────┐ ┌─────────────────┐ │ │
|
|
163
|
+
│ │ │ MessageCenter │ │ Interfaces │ │ Utilities │ │ │
|
|
164
|
+
│ │ │ │ │ │ │ │ │
|
|
165
|
+
│ │ │ • 主题订阅 │ │ • 类型定义 │ │ • 工具函数 │ │
|
|
166
|
+
│ │ │ • 消息路由 │ │ • 接口规范 │ │ • 辅助方法 │ │
|
|
167
|
+
│ │ │ • 模块通信 │ │ • 数据结构 │ │ • 通用模块 │ │
|
|
168
|
+
│ │ └─────────────────┘ └─────────────────┘ └─────────────────┘ │ │
|
|
169
|
+
│ │ │ │
|
|
170
|
+
│ └─────────────────────────────────────────────────────────────────┘ │
|
|
171
|
+
│ │
|
|
172
|
+
└─────────────────────────────────────────────────────────────────┘
|
|
173
|
+
```
|
|
174
|
+
|
|
175
|
+
## Hub Pipeline 集成(llmswitch-core)
|
|
176
|
+
|
|
177
|
+
RouteCodex 现在完全依赖 sharedmodule/llmswitch-core 的 Hub Pipeline,实现“HTTP ↔ 标准化请求 ↔ Virtual Router ↔ Provider”全链路处理:
|
|
178
|
+
|
|
179
|
+
- **唯一入口**:服务器通过 `RouteCodexHttpServer` 调用 `sharedmodule/llmswitch-core/dist/conversion/hub/pipeline/hub-pipeline`,禁止旁路加载核心模块。
|
|
180
|
+
- **配置来源**:`routecodex-config-loader` 读取用户配置后调用 `bootstrapVirtualRouterConfig`。该工具会校验 routing/providers、展开 `provider.keyAlias.model`、生成 `targetRuntime` 映射(endpoint、headers、auth、compat profile),Hub Pipeline 构造函数直接接受该结果。
|
|
181
|
+
- **节点链路**:Hub Pipeline 在内部组成 `SSE Input → Input Node → Chat Process → Virtual Router → (Compatibility,可选) → Output/SSE`。Host 不关心节点细节,只需要把 HTTP 请求封装成标准化的 Hub 请求。
|
|
182
|
+
- **工具治理**:唯一的工具治理点位于 `chat-process-node`。Compatibility 层已完全下沉到 llmswitch-core(`sharedmodule/llmswitch-core/src/conversion/compat`),仅做 Provider 特定的最小字段修剪。
|
|
183
|
+
- **Provider 调度**:Virtual Router 负责分类、熔断、负载均衡,并把 `target.runtimeKey` 写入请求。Host 使用 `bootstrapVirtualRouterConfig` 输出的 `targetRuntime` 把 runtimeKey 映射到具体 Provider 实例(包含 OAuth/apiKey 配置、baseURL、compat profile)。
|
|
184
|
+
- **错误流**:Provider/Compatibility 报错后调用 `errorHandlingCenter.handleError`,同时通过 `providerErrorCenter.emit` 把 `ProviderErrorEvent` 交还给 Virtual Router,以便执行熔断和健康统计。
|
|
185
|
+
|
|
186
|
+
借助 Hub Pipeline,HTTP 层只需关注请求封装与 Provider runtime 生命周期,核心能力全部收敛在 sharedmodule 中,实现“入口单一、无兜底”的目标。
|
|
187
|
+
|
|
188
|
+
## 技术栈
|
|
189
|
+
|
|
190
|
+
### 核心技术
|
|
191
|
+
|
|
192
|
+
- **Node.js**: 运行时环境
|
|
193
|
+
- **TypeScript**: 类型安全的JavaScript
|
|
194
|
+
- **ESM**: 纯ES模块系统
|
|
195
|
+
- **Rollup**: 模块打包工具
|
|
196
|
+
|
|
197
|
+
### 构建工具
|
|
198
|
+
|
|
199
|
+
- **TypeScript**: 编译时类型检查
|
|
200
|
+
- **Rollup**: ESM模块打包
|
|
201
|
+
- **Jest**: 单元测试框架
|
|
202
|
+
- **ESLint**: 代码质量检查
|
|
203
|
+
|
|
204
|
+
### 发布工具
|
|
205
|
+
|
|
206
|
+
- **NPM**: 包管理器
|
|
207
|
+
- **Semantic Versioning**: 版本管理
|
|
208
|
+
- **CI/CD**: 自动化构建和发布
|
|
209
|
+
|
|
210
|
+
## 消息流程
|
|
211
|
+
|
|
212
|
+
### 主题订阅消息流程
|
|
213
|
+
|
|
214
|
+
```
|
|
215
|
+
┌─────────────────────────────────────────────────────────────────┐
|
|
216
|
+
│ 主题订阅消息流程 │
|
|
217
|
+
├─────────────────────────────────────────────────────────────────┤
|
|
218
|
+
│ │
|
|
219
|
+
│ Publisher → MessageCenter → TopicSubscription → Subscribers │
|
|
220
|
+
│ │ │ │ │ │
|
|
221
|
+
│ │ │ │ │ │
|
|
222
|
+
│ ┌─────┐ ┌──────┐ ┌──────┐ ┌──────┐ │
|
|
223
|
+
│ │Publish│ │Route │ │Topic │ │Receive│ │
|
|
224
|
+
│ │Message│ │Message│ │Match │ │Message│ │
|
|
225
|
+
│ └─────┘ └──────┘ └──────┘ └──────┘ │
|
|
226
|
+
│ │ │ │ │ │
|
|
227
|
+
│ │ │ │ │ │
|
|
228
|
+
│ ▼ ▼ ▼ ▼ │
|
|
229
|
+
│ ┌─────┐ ┌──────┐ ┌──────┐ ┌──────┐ │
|
|
230
|
+
│ │Create│ │Validate│ │Filter│ │Process│ │
|
|
231
|
+
│ │Message│ │Message│ │Subs │ │Message│ │
|
|
232
|
+
│ └─────┘ └──────┘ └──────┘ └──────┘ │
|
|
233
|
+
│ │
|
|
234
|
+
└─────────────────────────────────────────────────────────────────┘
|
|
235
|
+
```
|
|
236
|
+
|
|
237
|
+
### 错误处理流程
|
|
238
|
+
|
|
239
|
+
```
|
|
240
|
+
┌─────────────────────────────────────────────────────────────────┐
|
|
241
|
+
│ 错误处理流程 │
|
|
242
|
+
├─────────────────────────────────────────────────────────────────┤
|
|
243
|
+
│ │
|
|
244
|
+
│ Error → ErrorHandling → Recovery → Retry/Fallback → Success │
|
|
245
|
+
│ │ │ │ │ │ │
|
|
246
|
+
│ │ │ │ │ │ │
|
|
247
|
+
│ ┌───┐ ┌─────┐ ┌─────┐ ┌─────┐ ┌─────┐ ┌─────┐ │
|
|
248
|
+
│ │Cap│ │Class│ │Analyze│ │Retry│ │Fallback│ │Result│ │
|
|
249
|
+
│ │ture│ │ify │ │Error │ │Logic│ │Handler │ │Log │ │
|
|
250
|
+
│ └───┘ └─────┘ └─────┘ └─────┘ └─────┘ └─────┘ │
|
|
251
|
+
│ │ │ │ │ │ │
|
|
252
|
+
│ │ │ │ │ │ │
|
|
253
|
+
│ ▼ ▼ ▼ ▼ ▼ │
|
|
254
|
+
│ ┌───┐ ┌─────┐ ┌─────┐ ┌─────┐ ┌─────┐ ┌─────┐ │
|
|
255
|
+
│ │Log │ │Track│ │Recover│ │Attempt│ │Alternative││End │ │
|
|
256
|
+
│ │Error│ │Error│ │State │ │Count │ │Solution│ │Flow │ │
|
|
257
|
+
│ └───┘ └─────┘ └─────┘ └─────┘ └─────┘ └─────┘ │
|
|
258
|
+
│ │
|
|
259
|
+
└─────────────────────────────────────────────────────────────────┘
|
|
260
|
+
```
|
|
261
|
+
|
|
262
|
+
## 配置管理
|
|
263
|
+
|
|
264
|
+
### 系统配置
|
|
265
|
+
|
|
266
|
+
```json
|
|
267
|
+
{
|
|
268
|
+
"server": {
|
|
269
|
+
"port": 5506,
|
|
270
|
+
"host": "localhost",
|
|
271
|
+
"cors": {
|
|
272
|
+
"enabled": true,
|
|
273
|
+
"origins": ["*"]
|
|
274
|
+
}
|
|
275
|
+
},
|
|
276
|
+
"providers": {
|
|
277
|
+
"openai-provider": {
|
|
278
|
+
"type": "openai",
|
|
279
|
+
"enabled": true,
|
|
280
|
+
"baseUrl": "https://api.openai.com/v1",
|
|
281
|
+
"apiKey": "your-api-key",
|
|
282
|
+
"models": {
|
|
283
|
+
"gpt-4": {
|
|
284
|
+
"maxTokens": 8192,
|
|
285
|
+
"temperature": 0.7
|
|
286
|
+
}
|
|
287
|
+
}
|
|
288
|
+
}
|
|
289
|
+
},
|
|
290
|
+
"messageCenter": {
|
|
291
|
+
"enableTopicSubscription": true,
|
|
292
|
+
"topics": {
|
|
293
|
+
"debug-events": "Debug events topic",
|
|
294
|
+
"system-events": "System events topic"
|
|
295
|
+
},
|
|
296
|
+
"wildcardSubscription": true
|
|
297
|
+
},
|
|
298
|
+
"debugCenter": {
|
|
299
|
+
"outputDirectory": "./debug-logs",
|
|
300
|
+
"enableTopicSubscription": true,
|
|
301
|
+
"topicSubscriptionConfig": {
|
|
302
|
+
"debugTopic": "debug-events",
|
|
303
|
+
"systemTopic": "system-events",
|
|
304
|
+
"enableWildcardSubscription": true
|
|
305
|
+
}
|
|
306
|
+
}
|
|
307
|
+
}
|
|
308
|
+
```
|
|
309
|
+
|
|
310
|
+
### 主题订阅配置
|
|
311
|
+
|
|
312
|
+
```json
|
|
313
|
+
{
|
|
314
|
+
"topicSubscription": {
|
|
315
|
+
"enabled": true,
|
|
316
|
+
"topics": {
|
|
317
|
+
"debug-events": {
|
|
318
|
+
"description": "Debug events topic",
|
|
319
|
+
"subscribers": ["monitoring"]
|
|
320
|
+
},
|
|
321
|
+
"system-events": {
|
|
322
|
+
"description": "System events topic",
|
|
323
|
+
"subscribers": ["errorhandler"]
|
|
324
|
+
},
|
|
325
|
+
"user-events": {
|
|
326
|
+
"description": "User events topic",
|
|
327
|
+
"subscribers": ["analytics", "monitoring"]
|
|
328
|
+
}
|
|
329
|
+
},
|
|
330
|
+
"wildcardEnabled": true,
|
|
331
|
+
"wildcardSubscribers": []
|
|
332
|
+
}
|
|
333
|
+
}
|
|
334
|
+
```
|
|
335
|
+
|
|
336
|
+
## 部署架构
|
|
337
|
+
|
|
338
|
+
### 开发环境
|
|
339
|
+
|
|
340
|
+
```
|
|
341
|
+
┌─────────────────────────────────────────────────────────────────┐
|
|
342
|
+
│ 开发环境 │
|
|
343
|
+
├─────────────────────────────────────────────────────────────────┤
|
|
344
|
+
│ │
|
|
345
|
+
│ ┌─────────────────┐ ┌─────────────────┐ ┌─────────────────┐ │
|
|
346
|
+
│ │ Development │ │ Testing │ │ Debugging │ │
|
|
347
|
+
│ │ │ │ │ │ │ │
|
|
348
|
+
│ │ • 热重载 │ │ • 单元测试 │ │ • 调试工具 │ │
|
|
349
|
+
│ │ • 源码映射 │ │ • 集成测试 │ │ • 性能分析 │ │
|
|
350
|
+
│ │ • 开发日志 │ │ • 端到端测试 │ │ • 日志查看 │ │
|
|
351
|
+
│ └─────────────────┘ └─────────────────┘ └─────────────────┘ │
|
|
352
|
+
│ │
|
|
353
|
+
└─────────────────────────────────────────────────────────────────┘
|
|
354
|
+
```
|
|
355
|
+
|
|
356
|
+
### 生产环境
|
|
357
|
+
|
|
358
|
+
```
|
|
359
|
+
┌─────────────────────────────────────────────────────────────────┐
|
|
360
|
+
│ 生产环境 │
|
|
361
|
+
├─────────────────────────────────────────────────────────────────┤
|
|
362
|
+
│ │
|
|
363
|
+
│ ┌─────────────────┐ ┌─────────────────┐ ┌─────────────────┐ │
|
|
364
|
+
│ │ Load Balancer │ │ RouteCodex │ │ Monitoring │ │
|
|
365
|
+
│ │ │ │ │ │ │ │
|
|
366
|
+
│ │ • 负载均衡 │ │ • 多实例 │ │ • 性能监控 │ │
|
|
367
|
+
│ │ • 健康检查 │ │ • 容器化 │ │ • 日志收集 │ │
|
|
368
|
+
│ │ • 故障转移 │ │ • 自动扩展 │ │ • 告警通知 │ │
|
|
369
|
+
│ └─────────────────┘ └─────────────────┘ └─────────────────┘ │
|
|
370
|
+
│ │ │ │ │
|
|
371
|
+
│ └───────────────────────┼───────────────────────┘ │
|
|
372
|
+
│ │ │
|
|
373
|
+
│ ┌─────────────────────────────────────────────────────────────────┐ │
|
|
374
|
+
│ │ Infrastructure │ │
|
|
375
|
+
│ │ │ │
|
|
376
|
+
│ │ ┌─────────────────┐ ┌─────────────────┐ ┌─────────────────┐ │ │
|
|
377
|
+
│ │ │ Database │ │ Cache │ │ Queue │ │ │
|
|
378
|
+
│ │ │ │ │ │ │ │ │
|
|
379
|
+
│ │ │ • 数据存储 │ │ • 缓存管理 │ │ • 消息队列 │ │
|
|
380
|
+
│ │ │ • 会话存储 │ │ • 性能优化 │ │ • 异步处理 │ │
|
|
381
|
+
│ │ │ • 配置存储 │ │ • 数据同步 │ │ • 任务调度 │ │
|
|
382
|
+
│ │ └─────────────────┘ └─────────────────┘ └─────────────────┘ │ │
|
|
383
|
+
│ │ │ │
|
|
384
|
+
│ └─────────────────────────────────────────────────────────────────┘ │
|
|
385
|
+
│ │
|
|
386
|
+
└─────────────────────────────────────────────────────────────────┘
|
|
387
|
+
```
|
|
388
|
+
|
|
389
|
+
## 版本信息
|
|
390
|
+
|
|
391
|
+
- **当前版本**: 0.0.1
|
|
392
|
+
- **最后更新**: 2025-01-22
|
|
393
|
+
- **维护团队**: RouteCodex 开发团队
|
|
394
|
+
- **文档版本**: 1.0.0
|
|
395
|
+
|
|
396
|
+
## 相关文档
|
|
397
|
+
|
|
398
|
+
- [README.md](./README.md) - 项目概述和快速开始
|
|
399
|
+
- [CONTRIBUTING.md](./CONTRIBUTING.md) - 贡献指南
|
|
400
|
+
- [CHANGELOG.md](./CHANGELOG.md) - 变更日志
|
|
401
|
+
- [API 文档](./docs/api/) - API 接口文档
|
|
402
|
+
- [部署指南](./docs/deployment/) - 部署相关文档
|
|
@@ -0,0 +1,221 @@
|
|
|
1
|
+
# Chat Process 协议与流水线契约(processMode=chat)
|
|
2
|
+
|
|
3
|
+
> 目的:把“请求/响应都必须进入 chat process(且只走 chat 扩展协议)”写成可执行、可 fail-fast 的契约,并给出**命名统一**与**修改点清单**,供审阅后再落地。
|
|
4
|
+
|
|
5
|
+
## 1) 术语(统一口径)
|
|
6
|
+
|
|
7
|
+
- **Chat 扩展协议(Chat Extension Protocol)**:llmswitch-core 内部的统一载体。
|
|
8
|
+
- 请求载体:`ChatEnvelope` / `StandardizedRequest`
|
|
9
|
+
- 响应载体:`ChatCompletionLike`(必须是 *OpenAI-chat-like*:`choices[0].message` 存在)
|
|
10
|
+
- **Chat Process**:对 chat 载体执行的“必经处理段”,包括但不限于:
|
|
11
|
+
- 工具治理/收割/规范化(tool governance + response tool harvesting)
|
|
12
|
+
- 路由选择(VirtualRouter)
|
|
13
|
+
- 兼容动作(compat actions)只能通过 Hub Pipeline 阶段触发
|
|
14
|
+
- **metadata**:仅允许承载**不可映射**的运行时提示/诊断信息;任何“可映射语义(mappable semantics)”严禁滞留在 metadata。
|
|
15
|
+
|
|
16
|
+
## 2) 刚性不变量(processMode=chat)
|
|
17
|
+
|
|
18
|
+
### 2.1 请求侧
|
|
19
|
+
|
|
20
|
+
在 `processMode=chat` 下,请求必须满足:
|
|
21
|
+
|
|
22
|
+
1. **inbound 必须产出 chat 扩展协议语义**(语义映射完成后才允许进入 chat process)。
|
|
23
|
+
2. **必须进入 chat process**(除非明确 `processMode=passthrough`)。
|
|
24
|
+
3. **outbound 仅使用白名单语义重建客户端协议**(clientRemap),不允许把“可映射语义”回塞到 metadata/透传到客户端。
|
|
25
|
+
|
|
26
|
+
代码事实(当前实现骨架):
|
|
27
|
+
- 正常入口:`sharedmodule/llmswitch-core/src/conversion/hub/pipeline/hub-pipeline.ts`(`executeRequestStagePipeline` 内部)
|
|
28
|
+
- servertool followup 重入入口:`sharedmodule/llmswitch-core/src/servertool/engine.ts:468`(`__hubEntry = 'chat_process'`,进入 `executeChatProcessEntryPipeline`)
|
|
29
|
+
|
|
30
|
+
### 2.2 响应侧
|
|
31
|
+
|
|
32
|
+
在 `processMode=chat` 下,响应必须满足:
|
|
33
|
+
|
|
34
|
+
1. **provider → compat → inbound → 语义映射(chat 形态)**是必经步骤。
|
|
35
|
+
2. **进入响应侧 chat process 前,必须是 canonical chat completion**(`choices[0].message` 存在)。
|
|
36
|
+
3. **outbound 仅产出客户端协议白名单字段**;内部 metadata 只用于转换过程,不可泄露到客户端 payload。
|
|
37
|
+
|
|
38
|
+
代码事实(当前实现骨架):
|
|
39
|
+
- `sharedmodule/llmswitch-core/src/conversion/hub/response/provider-response.ts:343`(resp inbound SSE decode)
|
|
40
|
+
- `sharedmodule/llmswitch-core/src/conversion/hub/response/provider-response.ts:401`(resp inbound semantic map → `chatResponse`)
|
|
41
|
+
- `sharedmodule/llmswitch-core/src/conversion/hub/response/provider-response.ts:426`(servertool orchestration)
|
|
42
|
+
- `sharedmodule/llmswitch-core/src/conversion/hub/response/provider-response.ts:464`(resp process tool governance)
|
|
43
|
+
- canonical chat completion 强制归一(hard gate):`sharedmodule/llmswitch-core/src/conversion/hub/response/provider-response.ts`(servertool orchestration 后、resp process 前)
|
|
44
|
+
- canonical chat completion 兜底归一(best-effort bridge):`sharedmodule/llmswitch-core/src/conversion/hub/pipeline/stages/resp_process/resp_process_stage1_tool_governance/index.ts`
|
|
45
|
+
|
|
46
|
+
## 3) “强制语义映射”规则(进入 chat process 前)
|
|
47
|
+
|
|
48
|
+
### 3.1 原则
|
|
49
|
+
|
|
50
|
+
- **同一语义在不同协议出现 → 必须映射到同一 chat 字段**(而不是塞进 metadata)。
|
|
51
|
+
- **chat 本身已有字段**(如 `messages/tools/toolOutputs/parameters`)→ 直接落入这些字段。
|
|
52
|
+
- **chat 没有但属于“跨协议可复用语义”** → 进入 `ChatSemantics` 的稳定字段(优先 `semantics.session/system/tools`,其次协议命名空间 `semantics.responses/anthropic/gemini`)。
|
|
53
|
+
- **仅“暂时无法映射/无语义对齐”的残余**,才允许进入 `semantics.providerExtras`(并要求逐步清空)。
|
|
54
|
+
|
|
55
|
+
### 3.2 禁入字段(fail-fast)
|
|
56
|
+
|
|
57
|
+
进入 chat process 的最后一刻,必须 fail-fast 校验:任何**可映射语义**不得存在于 metadata。
|
|
58
|
+
|
|
59
|
+
代码事实:当前请求侧在 chat_process entry 有 strict gate:
|
|
60
|
+
- `sharedmodule/llmswitch-core/src/conversion/hub/pipeline/hub-pipeline.ts:1714`(`assertNoMappableSemanticsInMetadata`)
|
|
61
|
+
- 当前禁入键(含 snake_case 同义键):`responsesResume`, `clientToolsRaw`, `anthropicToolNameMap`, `responsesContext`, `responseFormat`, `systemInstructions`, `toolsFieldPresent`, `extraFields`
|
|
62
|
+
|
|
63
|
+
你拍板(A1):禁入采用“已知具体键枚举”,并持续把同义字段/旧字段补全进黑名单;不禁掉 legacy catch-all 容器本身。
|
|
64
|
+
|
|
65
|
+
> 落地要求:把 legacy `extraFields/*Context/*Format` 这种“同义字段/旧字段”逐条枚举到禁入表(而不是靠一个大范围禁掉容器)。
|
|
66
|
+
|
|
67
|
+
#### A1 协议扫描结果(第一版:哪些键属于“可映射语义”,因此应被纳入禁入枚举/或迁移出 metadata)
|
|
68
|
+
|
|
69
|
+
> 说明:这里把“可映射语义”按**来源协议**归类,并标出当前代码的落点(metadata vs semantics)。
|
|
70
|
+
> 目标是:最终 chat process 只读 chat 字段与 `chat.semantics`,而不是靠 metadata 透传语义。
|
|
71
|
+
|
|
72
|
+
**OpenAI Chat(openai-chat)**
|
|
73
|
+
- legacy `metadata.systemInstructions`:可映射 → `chat.semantics.system.textBlocks`(当前主路径不再依赖 metadata;若仍出现应视为 legacy 注入并被 fail-fast gate 拦截)。
|
|
74
|
+
- legacy `metadata.toolsFieldPresent`:可映射 → `chat.semantics.tools.explicitEmpty`(当前主路径不再依赖 metadata;若仍出现应视为 legacy 注入并被 fail-fast gate 拦截)。
|
|
75
|
+
- legacy `metadata.extraFields`:可映射 → `chat.semantics.providerExtras.openaiChat.extraFields`(当前主路径以 semantics 为准;若仍出现应视为 legacy 注入并被 fail-fast gate 拦截)。
|
|
76
|
+
|
|
77
|
+
**Gemini(gemini-chat)**
|
|
78
|
+
- legacy `metadata.toolsFieldPresent`:可映射 → `chat.semantics.tools.explicitEmpty`(当前主路径不再依赖 metadata;若仍出现应视为 legacy 注入并被 fail-fast gate 拦截)。
|
|
79
|
+
|
|
80
|
+
**Anthropic(anthropic-messages)**
|
|
81
|
+
- legacy `anthropicToolNameMap`:可映射 → `chat.semantics.tools.toolNameAliasMap`(当前主路径已写入 semantics,见 `.../anthropic-mapper.ts:176`;禁入枚举保留是为了阻止旧路径把它塞回 metadata)。
|
|
82
|
+
|
|
83
|
+
**Responses(openai-responses)**
|
|
84
|
+
- legacy `responsesContext` / `responseFormat`:可映射 → `chat.semantics.responses.context` / `chat.semantics.responses.responseFormat`(当前主路径已走 semantics;禁入枚举用于阻止旧路径回流到 metadata)。
|
|
85
|
+
- `responsesResume`(submit_tool_outputs resume):可映射 → `chat.semantics.responses.resume`(已落地到 inbound semantic gate,见 `.../req_inbound_stage2_semantic_map/index.ts:57`)。
|
|
86
|
+
|
|
87
|
+
### 3.3 已落地的语义映射(作为基线)
|
|
88
|
+
|
|
89
|
+
(当前代码已做,符合“可映射语义不得滞留 metadata”的方向)
|
|
90
|
+
|
|
91
|
+
- `/v1/responses` tool-loop 恢复语义:
|
|
92
|
+
- `responsesResume`(host side 临时注入)→ **必须**在 inbound semantic map 前提升为 `chat.semantics.responses.resume`
|
|
93
|
+
- 并在需要时提升为 `chat.toolOutputs`(统一工具输出面)
|
|
94
|
+
- 位置:`sharedmodule/llmswitch-core/src/conversion/hub/pipeline/stages/req_inbound/req_inbound_stage2_semantic_map/index.ts:57`
|
|
95
|
+
|
|
96
|
+
- 客户端 tools raw schema:
|
|
97
|
+
- `tools` 原始数组 → `chat.semantics.tools.clientToolsRaw`
|
|
98
|
+
- 位置:`sharedmodule/llmswitch-core/src/conversion/hub/pipeline/stages/req_inbound/req_inbound_stage2_semantic_map/index.ts:51`
|
|
99
|
+
|
|
100
|
+
- Anthropic tool alias:
|
|
101
|
+
- `payload.tools` → `chat.semantics.tools.toolNameAliasMap`
|
|
102
|
+
- 位置:`sharedmodule/llmswitch-core/src/conversion/hub/operation-table/semantic-mappers/anthropic-mapper.ts:176`
|
|
103
|
+
|
|
104
|
+
## 4) ServerTool followup 契约(你选的方案:override → canonical chat)
|
|
105
|
+
|
|
106
|
+
目标:servertool followup **不允许破坏“响应进入 chat process 必须 canonical chat completion”** 的不变量。
|
|
107
|
+
|
|
108
|
+
### 4.1 请求重入(followup request)
|
|
109
|
+
|
|
110
|
+
代码事实:目前 followup 通过设置 `__hubEntry='chat_process'` 直接从 chat_process 入口重入:
|
|
111
|
+
- `sharedmodule/llmswitch-core/src/servertool/engine.ts:468`
|
|
112
|
+
|
|
113
|
+
你拍板(B):followup 重入入口仍为 `__hubEntry='chat_process'`,并明确 hop 编号:
|
|
114
|
+
|
|
115
|
+
- **H1**:第一次请求命中(例如图像 meta / web_search 关键词等)。
|
|
116
|
+
- **H2**:模型调用工具被截获后进入工具执行:
|
|
117
|
+
- web_search:发起工具请求;
|
|
118
|
+
- vision:直接路由到第二跳进行 vision 工具调用;
|
|
119
|
+
- 这里发生一次路由与一次 reenter(进 chat process)。
|
|
120
|
+
- **H3**:第二次请求的响应回来后拦截并注入结果,再次 reenter 到 chat process 继续请求。
|
|
121
|
+
|
|
122
|
+
### 4.2 响应 override(followup response)
|
|
123
|
+
|
|
124
|
+
你拍板(C):followup 对 provider 来说就是正常请求;响应回来后与正常响应一致:
|
|
125
|
+
- 成功/失败都按正常响应返回给客户端;
|
|
126
|
+
- 429 等错误按正常策略截获重发(reenter 处)/VirtualRouter 重试;不引入“followup 特判”的异常路径。
|
|
127
|
+
|
|
128
|
+
因此,这里所谓“响应 override”不是“在 Host/Provider 绕开响应流水线”,而是强调**响应侧统一约束**:
|
|
129
|
+
- 无论该响应来自 H1/H2/H3 中的哪一跳,只要进入响应侧 chat process(response tool harvesting/governance),就必须先完成 “provider→compat→inbound→semantic_map_to_chat→(必要时 canonicalize_chat_completion)” 的统一处理;
|
|
130
|
+
- canonicalize 失败时,按正常错误流返回(fail-fast / bubble up),而不是在 Host/Provider 做 payload 语义修补或旁路输出。
|
|
131
|
+
|
|
132
|
+
代码事实(当前实现的 canonicalize 约束点):
|
|
133
|
+
- servertool orchestration 后、进入 resp process 前:hard gate(必须 canonical,否则抛错):
|
|
134
|
+
- `sharedmodule/llmswitch-core/src/conversion/hub/response/provider-response.ts`
|
|
135
|
+
- resp process 内部保留 best-effort bridge(仅作为安全网;原则上不应再依赖它):
|
|
136
|
+
- `sharedmodule/llmswitch-core/src/conversion/hub/pipeline/stages/resp_process/resp_process_stage1_tool_governance/index.ts`
|
|
137
|
+
|
|
138
|
+
## 5) StageId 命名规范(你要求的点分风格)
|
|
139
|
+
|
|
140
|
+
### 5.1 新命名(提案)
|
|
141
|
+
|
|
142
|
+
> 你要求:`chat_process.req.stage1_*`(点分)——下面给出 request/response 的对齐命名。
|
|
143
|
+
|
|
144
|
+
**请求侧(direction=request)**
|
|
145
|
+
- `chat_process.req.stage1.format_parse`
|
|
146
|
+
- `chat_process.req.stage2.semantic_map`
|
|
147
|
+
- `chat_process.req.stage3.context_capture`
|
|
148
|
+
- `chat_process.req.stage4.tool_governance`
|
|
149
|
+
- `chat_process.req.stage5.route_select`
|
|
150
|
+
- `chat_process.req.stage6.outbound.semantic_map`
|
|
151
|
+
- `chat_process.req.stage7.outbound.format_build`
|
|
152
|
+
- `chat_process.req.stage8.outbound.compat`
|
|
153
|
+
|
|
154
|
+
**响应侧(direction=response)**
|
|
155
|
+
- `chat_process.resp.stage1.sse_decode`
|
|
156
|
+
- `chat_process.resp.stage2.format_parse`
|
|
157
|
+
- `chat_process.resp.stage3.compat`
|
|
158
|
+
- `chat_process.resp.stage4.semantic_map_to_chat`
|
|
159
|
+
- `chat_process.resp.stage5.servertool_orchestration`
|
|
160
|
+
- `chat_process.resp.stage6.canonicalize_chat_completion`
|
|
161
|
+
- `chat_process.resp.stage7.tool_governance`
|
|
162
|
+
- `chat_process.resp.stage8.finalize`
|
|
163
|
+
- `chat_process.resp.stage9.client_remap`
|
|
164
|
+
- `chat_process.resp.stage10.sse_stream`
|
|
165
|
+
|
|
166
|
+
### 5.2 现有命名 → 新命名(已落地)
|
|
167
|
+
|
|
168
|
+
你补充的约束:目前只有 **chat process 相关**命名会混淆,所以只改 chat process 范围内的 stageId/keys,不扩大到全链路。
|
|
169
|
+
|
|
170
|
+
下面这些已统一改名(stageId 仅用于 stageRecorder/snapshot,不更改目录结构):
|
|
171
|
+
|
|
172
|
+
- 请求 inbound:
|
|
173
|
+
- `req_inbound_stage1_format_parse` → `chat_process.req.stage1.format_parse`
|
|
174
|
+
- `req_inbound_stage2_semantic_map` → `chat_process.req.stage2.semantic_map`
|
|
175
|
+
- `req_inbound_stage3_context_capture` → `chat_process.req.stage3.context_capture`
|
|
176
|
+
- 请求 process/outbound:
|
|
177
|
+
- `req_process_stage1_tool_governance` → `chat_process.req.stage4.tool_governance`
|
|
178
|
+
- `req_process_stage2_route_select` → `chat_process.req.stage5.route_select`
|
|
179
|
+
- `req_outbound_stage1_semantic_map` → `chat_process.req.stage6.outbound.semantic_map`
|
|
180
|
+
- `req_outbound_stage2_format_build` → `chat_process.req.stage7.outbound.format_build`
|
|
181
|
+
- `req_outbound_stage3_compat` → `chat_process.req.stage8.outbound.compat`
|
|
182
|
+
- 响应 inbound/process/outbound:
|
|
183
|
+
- `resp_inbound_stage1_sse_decode` → `chat_process.resp.stage1.sse_decode`
|
|
184
|
+
- `resp_inbound_stage2_format_parse` → `chat_process.resp.stage2.format_parse`
|
|
185
|
+
- `resp_inbound_stage_compat` → `chat_process.resp.stage3.compat`
|
|
186
|
+
- `resp_inbound_stage3_semantic_map` → `chat_process.resp.stage4.semantic_map_to_chat`
|
|
187
|
+
- `resp_process_stage0_chat_normalize` → `chat_process.resp.stage6.canonicalize_chat_completion`
|
|
188
|
+
- `resp_process_stage1_tool_governance` → `chat_process.resp.stage7.tool_governance`
|
|
189
|
+
- `resp_process_stage2_finalize` → `chat_process.resp.stage8.finalize`
|
|
190
|
+
- `resp_outbound_stage1_client_remap` → `chat_process.resp.stage9.client_remap`
|
|
191
|
+
- `resp_outbound_stage2_sse_stream` → `chat_process.resp.stage10.sse_stream`
|
|
192
|
+
|
|
193
|
+
## 6) 待你审阅确认的“修改点清单”
|
|
194
|
+
|
|
195
|
+
已拍板项(A/B/C/D/E 的决议已合入上文)之外,剩余需要你继续拍板的只有两类“落地细节”:
|
|
196
|
+
|
|
197
|
+
1. **禁入字段清单的扩展范围**:以 A1 为原则,把哪些 legacy 同义字段逐条加入黑名单(给一个首批 list 即可)。
|
|
198
|
+
2. **环境相关 metadata 的清扫实现策略**:你不想维护名单,所以我建议采用“内部注入字段统一使用 `__*` 前缀,并在 provider/client 边界统一剥离 `__*`”的约束;你确认是否接受这个前缀约束(否则只能回到枚举清扫)。
|
|
199
|
+
|
|
200
|
+
metadata 生命周期决议(E,需落地到清扫点):
|
|
201
|
+
- protocol 相关的“可映射语义”:必须进入 chat 字段/`chat.semantics`,不得出现在 outbound 后(请求/响应都一样)。
|
|
202
|
+
- 环境相关的内部注入变量:到 provider 前与 client 前都必须清理掉,不允许出现在 provider request / client response。
|
|
203
|
+
|
|
204
|
+
你拍板(E1):环境相关内部注入变量采用 `__*` 前缀约束,并在 provider/client 边界统一剥离所有 `__*`。
|
|
205
|
+
|
|
206
|
+
实现约束(落地口径):所有内部 runtime/env 注入变量统一放入 `metadata.__rt`(`__rt` 作为唯一 runtime carrier,天然满足 `__*` 前缀规则),严禁散落为 `metadata.serverToolFollowup/webSearch/clock/...` 这类顶层键。
|
|
207
|
+
|
|
208
|
+
E1 落地点(已实现):
|
|
209
|
+
- client→provider(上游请求体):各协议 `*ProtocolClient.buildRequestBody(...)` 在返回 body 前统一执行 `__*` 剥离(同时这些 client 本身也会移除 `metadata` 字段)。
|
|
210
|
+
- `src/client/openai/chat-protocol-client.ts`
|
|
211
|
+
- `src/client/responses/responses-protocol-client.ts`
|
|
212
|
+
- `src/client/gemini/gemini-protocol-client.ts`
|
|
213
|
+
- `src/client/gemini-cli/gemini-cli-protocol-client.ts`
|
|
214
|
+
- server→client(JSON 响应体):HTTP handler 在 `res.json(...)` 前统一剥离 `__*`(SSE carrier `__sse_responses` 走专用分支,不会 JSON 编码)。
|
|
215
|
+
- `src/server/handlers/handler-utils.ts`
|
|
216
|
+
|
|
217
|
+
---
|
|
218
|
+
|
|
219
|
+
关联文档(现有):
|
|
220
|
+
- `docs/chat-semantic-expansion-plan.md`(语义扩展分阶段计划,和本契约的 3.x 规则一致)
|
|
221
|
+
- `docs/V3_INBOUND_OUTBOUND_DESIGN.md`(inbound/outbound 设计背景)
|