@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,111 @@
|
|
|
1
|
+
# 内置 Provider 配置说明(virtualrouter.providers)
|
|
2
|
+
|
|
3
|
+
> 本文只描述“用户配置层”的 provider 写法(`~/.routecodex/config.json`)。运行时会被 llmswitch-core 规范化为 Provider V2 Profile 并交给 Provider V2 传输层执行。
|
|
4
|
+
|
|
5
|
+
## 通用字段
|
|
6
|
+
|
|
7
|
+
`virtualrouter.providers.<providerId>` 常用字段:
|
|
8
|
+
|
|
9
|
+
- `id`: provider 标识(建议与 key 一致)
|
|
10
|
+
- `enabled`: 是否启用(默认建议 `true`)
|
|
11
|
+
- `type`: provider 协议类型(见 `docs/PROVIDER_TYPES.md`)
|
|
12
|
+
- `baseURL` / `baseUrl` / `endpoint`: 上游 API Base URL(任一字段均可)
|
|
13
|
+
- `auth`: 认证配置(apiKey / oauth / cookie)
|
|
14
|
+
- `compatibilityProfile`: 兼容配置(如 `chat:qwen`、`chat:iflow`、`chat:glm`)
|
|
15
|
+
- `headers`: 额外请求头
|
|
16
|
+
- `process`: `chat`(默认)或 `passthrough`
|
|
17
|
+
- `models`: 模型列表(键为 modelId;值可写 `supportsStreaming`、`maxTokens`、`maxContext` 等)
|
|
18
|
+
|
|
19
|
+
## 认证字段(auth)
|
|
20
|
+
|
|
21
|
+
常见三类:
|
|
22
|
+
|
|
23
|
+
### 1) API Key
|
|
24
|
+
|
|
25
|
+
```jsonc
|
|
26
|
+
"auth": { "type": "apikey", "apiKey": "YOUR_API_KEY_HERE" }
|
|
27
|
+
```
|
|
28
|
+
|
|
29
|
+
### 2) OAuth(tokenFile)
|
|
30
|
+
|
|
31
|
+
```jsonc
|
|
32
|
+
"auth": { "type": "qwen-oauth", "tokenFile": "~/.routecodex/auth/qwen-oauth.json" }
|
|
33
|
+
```
|
|
34
|
+
|
|
35
|
+
### 3) Cookie(cookieFile)
|
|
36
|
+
|
|
37
|
+
```jsonc
|
|
38
|
+
"auth": { "type": "iflow-cookie", "cookieFile": "~/.routecodex/auth/iflow-work.cookie" }
|
|
39
|
+
```
|
|
40
|
+
|
|
41
|
+
## 各内置 Provider 的参考样本
|
|
42
|
+
|
|
43
|
+
仓库内已经提供了可直接复制的脱敏样本(port 只是示例,可自行改)。下面按 provider 逐个说明“你需要改什么/注意什么”。
|
|
44
|
+
|
|
45
|
+
### TAB(Responses)
|
|
46
|
+
|
|
47
|
+
- 样本:`configsamples/provider/tab/config.v1.json`
|
|
48
|
+
- 关键点:`type: "responses"`;建议保留 `responses.process: "chat"` + `responses.streaming`
|
|
49
|
+
- 你需要:填写 `auth.apiKey`
|
|
50
|
+
|
|
51
|
+
### CRS(Responses)
|
|
52
|
+
|
|
53
|
+
- 样本:`configsamples/provider/crs/config.v1.json`
|
|
54
|
+
- 关键点:同 TAB;模型列表通常更全
|
|
55
|
+
- 你需要:填写 `auth.apiKey`
|
|
56
|
+
|
|
57
|
+
### TABGLM(Responses)
|
|
58
|
+
|
|
59
|
+
- 样本:`configsamples/provider/tabglm/config.v1.json`
|
|
60
|
+
- 关键点:本质仍是 Responses;只是 providerId 不同(用于区分路由池/配额/快照)
|
|
61
|
+
- 你需要:填写 `auth.apiKey`
|
|
62
|
+
|
|
63
|
+
### GLM(OpenAI-compatible)
|
|
64
|
+
|
|
65
|
+
- 样本:`configsamples/provider/glm/config.v1.json`
|
|
66
|
+
- 关键点:`compatibilityProfile: "chat:glm"`;并示例了 `webSearch.engines` + `routing.web_search`
|
|
67
|
+
- 你需要:填写 `auth.apiKey`,并按需调整模型(`glm-4.7`、`glm-4.6v` 等)
|
|
68
|
+
|
|
69
|
+
### GLM(Anthropic Messages wire)
|
|
70
|
+
|
|
71
|
+
- 样本:`configsamples/provider/glm-anthropic/config.v1.json`
|
|
72
|
+
- 关键点:`type: "anthropic"`(走 `/v1/messages` 协议);适用于某些上游只提供 anthropic 入口的场景
|
|
73
|
+
- 你需要:填写 `auth.apiKey`
|
|
74
|
+
|
|
75
|
+
### Qwen(OAuth)
|
|
76
|
+
|
|
77
|
+
- 样本:`configsamples/provider/qwen/config.v1.json`
|
|
78
|
+
- 关键点:`auth.type: "qwen-oauth"` + `auth.tokenFile` 指向你的 token 文件;`compatibilityProfile: "chat:qwen"`
|
|
79
|
+
- 你需要:先完成一次 OAuth 登录生成 tokenFile(或按你自己的路径修改 tokenFile)
|
|
80
|
+
|
|
81
|
+
### iFlow(OAuth)
|
|
82
|
+
|
|
83
|
+
- 样本:`configsamples/provider/iflow/config.v1.json`
|
|
84
|
+
- 关键点:`auth.type: "iflow-oauth"` + `auth.tokenFile`;`compatibilityProfile: "chat:iflow"`
|
|
85
|
+
- 你需要:先完成一次 OAuth 登录生成 tokenFile
|
|
86
|
+
|
|
87
|
+
### Kimi(API Key)
|
|
88
|
+
|
|
89
|
+
- 样本:`configsamples/provider/kimi/config.v1.json`
|
|
90
|
+
- 关键点:OpenAI-compatible wire;通常建议保留 `headers.User-Agent`
|
|
91
|
+
- 你需要:填写 `auth.apiKey`
|
|
92
|
+
|
|
93
|
+
### ModelScope(API Key)
|
|
94
|
+
|
|
95
|
+
- 样本:`configsamples/provider/modelscope/config.v1.json`
|
|
96
|
+
- 关键点:OpenAI-compatible wire;模型名常为带 namespace 的长字符串
|
|
97
|
+
- 你需要:填写 `auth.apiKey`
|
|
98
|
+
|
|
99
|
+
### LM Studio(本地)
|
|
100
|
+
|
|
101
|
+
- 样本:`configsamples/provider/lmstudio/config.v1.json`
|
|
102
|
+
- 关键点:`baseURL: "http://127.0.0.1:1234/v1"`;模型名通常来自本地加载的模型列表
|
|
103
|
+
- 你需要:确保 LM Studio 已启动并暴露 OpenAI endpoint;按需调整 `routing.default` 指向你本地可用的模型
|
|
104
|
+
|
|
105
|
+
### MiMo(API Key)
|
|
106
|
+
|
|
107
|
+
- 样本:`configsamples/provider/mimo/config.v1.json`
|
|
108
|
+
- 关键点:OpenAI-compatible wire(样本里是 `openai-standard`,等价地也可用 `openai`)
|
|
109
|
+
- 你需要:填写 `auth.apiKey`
|
|
110
|
+
|
|
111
|
+
建议用 `rcc init` 先生成骨架,再按上面对应 provider 的注意事项做精修(模型列表、routing 池子、auth 文件路径等)。
|
|
@@ -0,0 +1,55 @@
|
|
|
1
|
+
# Provider 类型(type)说明
|
|
2
|
+
|
|
3
|
+
`virtualrouter.providers.<id>.type` 主要决定:
|
|
4
|
+
- 上游“线协议 / wire”(Chat / Responses / Messages / Gemini 等)
|
|
5
|
+
- Provider V2 选择的传输实现(openai/responses/anthropic/gemini…)
|
|
6
|
+
|
|
7
|
+
> 品牌/家族(glm、qwen、iflow、lmstudio…)建议通过 `id`、`compatibilityProfile`、`auth.type` 等表达,而不是把品牌写成协议类型。
|
|
8
|
+
|
|
9
|
+
## 推荐使用的 type
|
|
10
|
+
|
|
11
|
+
- `openai`:OpenAI Chat wire(`/v1/chat/completions`)以及 OpenAI-compatible Chat endpoint
|
|
12
|
+
- `responses`:OpenAI Responses wire(`/v1/responses`)
|
|
13
|
+
- `anthropic`:Anthropic Messages wire(`/v1/messages`)
|
|
14
|
+
- `gemini`:Gemini Chat wire
|
|
15
|
+
- `gemini-cli`:Gemini CLI wire(Cloud Code Assist;仅在需要时使用)
|
|
16
|
+
- `mock`:Mock Provider(测试/回归用)
|
|
17
|
+
|
|
18
|
+
## 常见组合(示例)
|
|
19
|
+
|
|
20
|
+
### 标准 OpenAI Chat(API Key)
|
|
21
|
+
|
|
22
|
+
```jsonc
|
|
23
|
+
{
|
|
24
|
+
"id": "openai",
|
|
25
|
+
"type": "openai",
|
|
26
|
+
"baseURL": "https://api.openai.com/v1",
|
|
27
|
+
"auth": { "type": "apikey", "apiKey": "YOUR_API_KEY_HERE" }
|
|
28
|
+
}
|
|
29
|
+
```
|
|
30
|
+
|
|
31
|
+
### OpenAI-compatible(例如 GLM/Qwen/Kimi 等)
|
|
32
|
+
|
|
33
|
+
仍然建议 `type: "openai"`,并通过 `compatibilityProfile` 做最小字段适配:
|
|
34
|
+
|
|
35
|
+
```jsonc
|
|
36
|
+
{
|
|
37
|
+
"id": "qwen",
|
|
38
|
+
"type": "openai",
|
|
39
|
+
"baseURL": "https://portal.qwen.ai/v1",
|
|
40
|
+
"compatibilityProfile": "chat:qwen",
|
|
41
|
+
"auth": { "type": "qwen-oauth", "tokenFile": "~/.routecodex/auth/qwen-oauth.json" }
|
|
42
|
+
}
|
|
43
|
+
```
|
|
44
|
+
|
|
45
|
+
### OpenAI Responses
|
|
46
|
+
|
|
47
|
+
```jsonc
|
|
48
|
+
{
|
|
49
|
+
"id": "tab",
|
|
50
|
+
"type": "responses",
|
|
51
|
+
"baseURL": "https://api.tabcode.cc/openai",
|
|
52
|
+
"auth": { "type": "apikey", "apiKey": "YOUR_API_KEY_HERE" }
|
|
53
|
+
}
|
|
54
|
+
```
|
|
55
|
+
|
|
@@ -0,0 +1,233 @@
|
|
|
1
|
+
# ServerTool: `clock`(定时提醒)详细设计(Draft)
|
|
2
|
+
|
|
3
|
+
> 目标:在不引入“旁路”执行路径的前提下,为每个 session 提供可持久化的定时提醒能力,并在后续请求中把提醒注入到模型上下文里。
|
|
4
|
+
> 本文是**详细设计**,不包含实现。
|
|
5
|
+
|
|
6
|
+
## 0. 背景与约束
|
|
7
|
+
|
|
8
|
+
- 单执行路径:所有模型调用仍必须走 `HTTP server → llmswitch-core Hub Pipeline → Provider V2 → upstream`。
|
|
9
|
+
- llmswitch-core 拥有工具语义与路由:Host/Provider 不得自行修复 tool calls、重写参数或决定路由,只能注入依赖与 IO。
|
|
10
|
+
- Provider 层只做 transport(auth/http/retry/compat),不得理解 payload 语义。
|
|
11
|
+
- 时钟任务必须 **serverId + sessionId** 作用域隔离,避免跨 server 串读(stopMessage 的坑不能再踩)。
|
|
12
|
+
- “过期删除”与“过期也算触发”必须统一:保留期(retention)设为 **20 分钟**(`retentionMs = 20 * 60 * 1000`)。
|
|
13
|
+
|
|
14
|
+
## 1. 需求澄清(本设计采纳的语义)
|
|
15
|
+
|
|
16
|
+
### 1.1 工具注入
|
|
17
|
+
|
|
18
|
+
- 配置开启后:**每次请求都注入 `clock` tool schema** 到工具列表(全局开关)。
|
|
19
|
+
- 仅当请求能够解析出 `sessionId` 时,`clock` 的调度结果才会落到 session 作用域;缺失 `sessionId` 时拒绝调度(返回工具错误)。
|
|
20
|
+
|
|
21
|
+
### 1.2 调度与触发窗口
|
|
22
|
+
|
|
23
|
+
- 模型通过调用 `clock` 工具创建任务,形成 `{dueAt, task}` 列表,写入 daemon(持久化)。
|
|
24
|
+
- 每次请求到来时(对该请求的 session)检查任务是否“到达触发阈值”:
|
|
25
|
+
- 触发窗口定义为:`now >= dueAt - 60s` 即视为到达(“差一分钟到也算,过期也算”)。
|
|
26
|
+
- 过期任务并不立即删除;仅当 `now > dueAt + retentionMs` 才删除。
|
|
27
|
+
|
|
28
|
+
### 1.3 投递与离线问题
|
|
29
|
+
|
|
30
|
+
**重要现实约束:没有客户端请求就无法把提醒推送给客户端**(系统当前没有反向推送通道)。
|
|
31
|
+
|
|
32
|
+
- 本设计的默认投递语义:提醒以 `"[scheduled task:\"...\"]"` 的形式**注入到下一次该 session 的请求**中。
|
|
33
|
+
- “finish_reason=stop 且时间没到就 hold 等待”会把 HTTP 变成长连接并引发代理/超时/资源占用等风险;但在当前需求中**明确要求 hold 且不限制时间**:
|
|
34
|
+
- 当响应 `finish_reason=stop` 且存在未到达触发窗口的最近任务 `nextDueAtMs`,server 可以保持连接,直到 `now >= nextDueAtMs - 60s` 再继续执行注入/续轮。
|
|
35
|
+
- 若客户端在 hold 期间断开:server 无法把“同一条响应”推送回客户端;此时任务保持在 daemon 持久化中,**在下一次同 session 的请求到来时**(只要未超过 20 分钟 retention)依然会被判定为 due 并注入提醒。
|
|
36
|
+
- 若需要“用户完全离线仍能收到提醒”,必须补齐客户端侧机制(例如:客户端定期发起心跳/拉取请求,或新增事件订阅/长轮询 endpoint)。单纯 server 侧 fake 请求给模型不会自动出现在既有客户端 UI 上。
|
|
37
|
+
|
|
38
|
+
### 1.4 与 `stopMessage` 的优先级与交互(必须)
|
|
39
|
+
|
|
40
|
+
本项目内存在一个更高优先级的 stop 续轮机制:`stopMessage`(用于在模型 `finish_reason=stop` 时继续推进工作流)。
|
|
41
|
+
|
|
42
|
+
本设计明确规定优先级与行为:
|
|
43
|
+
|
|
44
|
+
1. **`stopMessage` 优先级更高**:当一次响应 `finish_reason=stop` 时,如果当前 session 命中可用的 `stopMessage`(尚未超次数、且本次需要触发),则先走 `stopMessage` 的续轮发送逻辑,并在触发后按既定规则**清零/计数并持久化刷新**。
|
|
45
|
+
2. **只有当 `stopMessage` 未触发(或不存在)时,才允许 `clock hold`**:即 `clock` 的 hold 仅作为 stop 状态下的“定时续轮兜底”,不能抢占 `stopMessage` 的推进能力。
|
|
46
|
+
3. **触发 `stopMessage` 后不再 hold `clock`**:因为续轮已被 `stopMessage` 推进,`clock` 的提醒应按“下一次请求注入/或在后续 stop 决策时再评估”的方式处理,避免两个机制互相拉扯造成不可控长连接。
|
|
47
|
+
|
|
48
|
+
## 2. `clock` 工具协议(对模型可见)
|
|
49
|
+
|
|
50
|
+
### 2.1 工具名与动作
|
|
51
|
+
|
|
52
|
+
采用单工具名 + action,避免模型在多个工具名间迷路:
|
|
53
|
+
|
|
54
|
+
- 工具名:`clock`
|
|
55
|
+
- action:
|
|
56
|
+
- `schedule`:创建/覆盖任务
|
|
57
|
+
- `list`:列出本 session 未过期任务
|
|
58
|
+
- `cancel`:取消指定任务
|
|
59
|
+
- `clear`:清空本 session 所有任务
|
|
60
|
+
|
|
61
|
+
另外提供一个**用户指令**(非模型工具调用)用于直接清理当前会话定时:
|
|
62
|
+
|
|
63
|
+
- `<**clock:clear**>`:清空当前 `sessionId` 的全部 `clock` 任务(立即写盘)。
|
|
64
|
+
|
|
65
|
+
### 2.2 Schema(建议)
|
|
66
|
+
|
|
67
|
+
```json
|
|
68
|
+
{
|
|
69
|
+
"type": "object",
|
|
70
|
+
"properties": {
|
|
71
|
+
"action": { "type": "string", "enum": ["schedule", "list", "cancel", "clear"] },
|
|
72
|
+
"items": {
|
|
73
|
+
"type": "array",
|
|
74
|
+
"items": {
|
|
75
|
+
"type": "object",
|
|
76
|
+
"properties": {
|
|
77
|
+
"dueAt": {
|
|
78
|
+
"type": "string",
|
|
79
|
+
"description": "ISO8601 时间(含时区)。例如 2026-01-21T20:30:00-08:00"
|
|
80
|
+
},
|
|
81
|
+
"task": {
|
|
82
|
+
"type": "string",
|
|
83
|
+
"description": "提醒文本(建议包含要调用的工具/动作)。"
|
|
84
|
+
},
|
|
85
|
+
"tool": {
|
|
86
|
+
"type": "string",
|
|
87
|
+
"description": "可选:建议要调用的工具名(仅用于提示,不做强制执行)。"
|
|
88
|
+
},
|
|
89
|
+
"arguments": {
|
|
90
|
+
"type": "object",
|
|
91
|
+
"description": "可选:建议工具参数(仅用于提示)。",
|
|
92
|
+
"additionalProperties": true
|
|
93
|
+
}
|
|
94
|
+
},
|
|
95
|
+
"required": ["dueAt", "task"]
|
|
96
|
+
}
|
|
97
|
+
},
|
|
98
|
+
"taskId": { "type": "string", "description": "cancel 时使用" }
|
|
99
|
+
},
|
|
100
|
+
"required": ["action"]
|
|
101
|
+
}
|
|
102
|
+
```
|
|
103
|
+
|
|
104
|
+
### 2.3 工具返回(建议)
|
|
105
|
+
|
|
106
|
+
`clock` 工具返回必须可机器解析,便于模型后续自查:
|
|
107
|
+
|
|
108
|
+
- `schedule`:返回 `{ ok, scheduled: [{ taskId, dueAt, task }] }`
|
|
109
|
+
- `list`:返回 `{ ok, items: [{ taskId, dueAt, task, deliveredAt? }] }`
|
|
110
|
+
- `cancel`:返回 `{ ok, removed: taskId }`
|
|
111
|
+
- `clear`:返回 `{ ok, removedCount }`
|
|
112
|
+
|
|
113
|
+
## 3. 状态模型(daemon 内部存储)
|
|
114
|
+
|
|
115
|
+
### 3.1 Task 结构
|
|
116
|
+
|
|
117
|
+
```ts
|
|
118
|
+
type ClockTask = {
|
|
119
|
+
taskId: string; // uuid
|
|
120
|
+
serverId: string; // 当前 server 实例稳定标识(用于路径隔离)
|
|
121
|
+
sessionId: string;
|
|
122
|
+
dueAtMs: number; // 毫秒时间戳
|
|
123
|
+
createdAtMs: number;
|
|
124
|
+
updatedAtMs: number;
|
|
125
|
+
task: string;
|
|
126
|
+
tool?: string;
|
|
127
|
+
arguments?: Record<string, unknown>;
|
|
128
|
+
deliveredAtMs?: number; // 成功“注入到某次请求并 commit”后写入
|
|
129
|
+
deliveryCount: number; // 注入/投递计数(至少 1 次)
|
|
130
|
+
};
|
|
131
|
+
```
|
|
132
|
+
|
|
133
|
+
### 3.2 Session 存储结构
|
|
134
|
+
|
|
135
|
+
```ts
|
|
136
|
+
type ClockSessionState = {
|
|
137
|
+
version: 1;
|
|
138
|
+
serverId: string;
|
|
139
|
+
sessionId: string;
|
|
140
|
+
tasks: ClockTask[];
|
|
141
|
+
updatedAtMs: number;
|
|
142
|
+
};
|
|
143
|
+
```
|
|
144
|
+
|
|
145
|
+
## 4. 持久化与隔离策略(必须)
|
|
146
|
+
|
|
147
|
+
### 4.1 存储位置
|
|
148
|
+
|
|
149
|
+
- 统一放在 server-scoped session dir 下,避免跨 server 串读:
|
|
150
|
+
- 根目录:`~/.routecodex/sessions/<serverId>/`
|
|
151
|
+
- Clock 子目录建议:
|
|
152
|
+
- `~/.routecodex/sessions/<serverId>/clock/<sessionId>.json`
|
|
153
|
+
|
|
154
|
+
### 4.2 加载/写入策略
|
|
155
|
+
|
|
156
|
+
- **设置(schedule/cancel/clear)时立即解析并持久化**:
|
|
157
|
+
- 解析 `dueAt`(ISO8601)失败:立即返回工具错误,模型立刻知道设置失败。
|
|
158
|
+
- 写盘失败:返回工具错误(fail fast)。
|
|
159
|
+
- **内存缓存可选**(session 级 LRU),但任何写操作必须同步刷新持久化(write-through),避免你在 stopMessage 上遇到的“内存更新但盘没刷”的错觉。
|
|
160
|
+
|
|
161
|
+
## 5. 请求注入与投递一致性(reservation/commit)
|
|
162
|
+
|
|
163
|
+
### 5.1 注入点
|
|
164
|
+
|
|
165
|
+
在 Hub Pipeline 的 canonicalization 完成后、路由/上游调用前执行注入(属于 llmswitch-core 的职责)。
|
|
166
|
+
|
|
167
|
+
注入格式(最小实现):
|
|
168
|
+
|
|
169
|
+
- 在请求末尾追加一段系统文本(或 user 文本,二选一,建议 system):
|
|
170
|
+
- `"[scheduled task:\"<task>\" tool=<tool?> args=<json?> dueAt=<iso>]"`(字符串格式固定,方便可观测)
|
|
171
|
+
|
|
172
|
+
### 5.2 触发判定
|
|
173
|
+
|
|
174
|
+
对每个任务:
|
|
175
|
+
|
|
176
|
+
- `isDue = nowMs >= (dueAtMs - 60_000)`
|
|
177
|
+
- `isExpired = nowMs > (dueAtMs + retentionMs)`
|
|
178
|
+
- `shouldInject = isDue && !isExpired && deliveredAtMs == null`
|
|
179
|
+
|
|
180
|
+
其中 `retentionMs = 20 * 60_000`:任务过期后 20 分钟内仍可触发注入;超过 20 分钟才清理。
|
|
181
|
+
|
|
182
|
+
### 5.3 Reservation/Commit 语义(防丢/防重)
|
|
183
|
+
|
|
184
|
+
为避免“注入了提醒但上游失败/客户端断开导致任务被提前标记已投递”,采用两阶段:
|
|
185
|
+
|
|
186
|
+
1. Reservation(仅内存):
|
|
187
|
+
- 计算本次请求会注入哪些 `taskId`,形成 `reservationId`(例如 `${requestId}:clock`)。
|
|
188
|
+
- 将 `(reservationId → [taskId...])` 挂在本次 request context 上(非持久化)。
|
|
189
|
+
2. Commit(持久化写盘):
|
|
190
|
+
- 当本次响应进入 `response.dispatch`(至少已经开始向客户端发送)时 commit:
|
|
191
|
+
- 对每个被注入的任务:`deliveredAtMs = nowMs; deliveryCount += 1`
|
|
192
|
+
- 若上游报错/未进入 dispatch:rollback(不修改 deliveredAt/deliveryCount)。
|
|
193
|
+
|
|
194
|
+
> 说明:严格意义上“客户端一定收到”很难保证(客户端可能在 dispatch 后立刻断开)。
|
|
195
|
+
> 本设计把“进入 dispatch”作为 commit 边界,与 stopMessage 的行为保持一致即可;如需更严格可引入“客户端 ack”协议,但会改变客户端/协议层。
|
|
196
|
+
|
|
197
|
+
## 6. Daemon 行为(定时清理 + 启动扫描)
|
|
198
|
+
|
|
199
|
+
### 6.1 启动扫描
|
|
200
|
+
|
|
201
|
+
daemon 启动时扫描 `~/.routecodex/sessions/<serverId>/clock/`:
|
|
202
|
+
|
|
203
|
+
- 对每个 task:
|
|
204
|
+
- 若 `nowMs > dueAtMs + retentionMs`:删除
|
|
205
|
+
- 否则保留(即便已到期但未投递,也必须保留,等待下一次注入机会)
|
|
206
|
+
|
|
207
|
+
### 6.2 Tick 清理
|
|
208
|
+
|
|
209
|
+
- 周期:例如每 60s 扫描一次(可配置)。
|
|
210
|
+
- 清理规则同启动扫描。
|
|
211
|
+
|
|
212
|
+
## 7. 可观测性(日志/审计)
|
|
213
|
+
|
|
214
|
+
建议新增统一日志(debug/info 两档):
|
|
215
|
+
|
|
216
|
+
- schedule/list/cancel/clear:打印 `sessionId`、任务数、最早 dueAt、写盘结果。
|
|
217
|
+
- 注入阶段:打印 `requestId`、`sessionId`、注入任务数与 taskId 列表(注意脱敏 task 文本,避免泄漏)。
|
|
218
|
+
- commit:打印 `requestId`、commit 任务数、deliveryCount 更新。
|
|
219
|
+
|
|
220
|
+
## 8. 失败与边界情况
|
|
221
|
+
|
|
222
|
+
- 缺失 `sessionId`:
|
|
223
|
+
- `schedule/cancel/clear`:返回工具错误(不落盘)
|
|
224
|
+
- 注入:跳过(无 session 无法关联任务)
|
|
225
|
+
- `dueAt` 解析失败:工具错误(fail fast)
|
|
226
|
+
- 写盘失败:工具错误(fail fast)
|
|
227
|
+
- 同一 session 大量任务:上限策略可后续再加;本设计先不设硬上限(但要有 O(n) 扫描的性能告警/日志)
|
|
228
|
+
|
|
229
|
+
## 9. 与“fake 请求/hold”相关的实验结论(必须先对齐现实)
|
|
230
|
+
|
|
231
|
+
- 单纯由 server 主动发起一条“fake /v1/responses 请求”,其响应只会返回给**发起该 HTTP 请求的客户端连接**。
|
|
232
|
+
- 如果你的真实客户端没有同时发起请求/没有订阅推送通道,它不会“自动看到”这条 fake 请求的结果。
|
|
233
|
+
- 因此,“用户离线仍能收到提醒”需要客户端配合(心跳/轮询/订阅)或引入新的推送通道;否则只能做到“下一次用户回来发请求时注入提醒”。
|