@xopcai/xopc 0.0.389 → 0.0.391
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/dist/browser-ext/manifest.json +1 -1
- package/dist/extensions/telegram/xopc.extension.json +1 -1
- package/dist/gateway/static/root/assets/{activity-store-dvik6t7Z.js → activity-store-DWQCDi8M.js} +1 -1
- package/dist/gateway/static/root/assets/{agent-avatar-dicebear-bWMd5TDC.js → agent-avatar-dicebear-CzS0TUv9.js} +1 -1
- package/dist/gateway/static/root/assets/agent-defaults-settings-panel-DE910MyU.js +1 -0
- package/dist/gateway/static/root/assets/{agent-plugin-dialog-UunIxc1q.js → agent-plugin-dialog-0SlvsYl7.js} +1 -1
- package/dist/gateway/static/root/assets/agents-BZh28Qn1.js +77 -0
- package/dist/gateway/static/root/assets/{agents-admin-api-BlNGyXpm.js → agents-admin-api-Bb3Kvz3X.js} +1 -1
- package/dist/gateway/static/root/assets/app-management-settings-panel-9A7JN5V5.js +1 -0
- package/dist/gateway/static/root/assets/{appearance-settings-CUAdx44v.js → appearance-settings-BPdLEo6L.js} +1 -1
- package/dist/gateway/static/root/assets/{apps-page-D5zDB6gp.js → apps-page-Cz7LypV9.js} +1 -1
- package/dist/gateway/static/root/assets/{archive-plugin-Du6dJNcl.js → archive-plugin-DFnHPNie.js} +1 -1
- package/dist/gateway/static/root/assets/{automations-page-BO8Ig5Z4.js → automations-page-CnBLPVNh.js} +1 -1
- package/dist/gateway/static/root/assets/automations-workspace-BBjS-sk-.js +6 -0
- package/dist/gateway/static/root/assets/{binary-plugins-D7VJjwnr.js → binary-plugins-BQC0Tzoi.js} +1 -1
- package/dist/gateway/static/root/assets/{block-editor-CaJlWTAn.js → block-editor-DSh5019z.js} +4 -4
- package/dist/gateway/static/root/assets/{browser-automation-inputs-iyMBJmQX.js → browser-automation-inputs-C5tIrIRL.js} +1 -1
- package/dist/gateway/static/root/assets/browser-automations-page-CFCMNfJN.js +3 -0
- package/dist/gateway/static/root/assets/browser-settings-page-C__tyPwu.js +3 -0
- package/dist/gateway/static/root/assets/{capabilities-CEH1AnXc.js → capabilities-D6RJG4QY.js} +1 -1
- package/dist/gateway/static/root/assets/{capabilities-MCKRMZDK.js → capabilities-DGEmBQnF.js} +1 -1
- package/dist/gateway/static/root/assets/capabilities-page-B5AZa7ir.js +2 -0
- package/dist/gateway/static/root/assets/capabilities-settings-panel-Dskz2_bh.js +8 -0
- package/dist/gateway/static/root/assets/{capability-header-actions-BIA0Lwt5.js → capability-header-actions-xzjWZVbg.js} +1 -1
- package/dist/gateway/static/root/assets/channels-DRse_dD3.js +1 -0
- package/dist/gateway/static/root/assets/chat-terminal-dock-CQF0M4kE.js +36 -0
- package/dist/gateway/static/root/assets/{computer-settings-page-DvY3zgyY.js → computer-settings-page-ZfzCTS0N.js} +1 -1
- package/dist/gateway/static/root/assets/{connector-service-page-St2-Fj3y.js → connector-service-page-CwAeWVLK.js} +1 -1
- package/dist/gateway/static/root/assets/connectors-page-CanakKaj.js +1 -0
- package/dist/gateway/static/root/assets/{date-picker-C0-D80ny.js → date-picker-hmJlEAQZ.js} +1 -1
- package/dist/gateway/static/root/assets/{dependency-picker-CNd7mwMU.js → dependency-picker-Us_Juz6I.js} +1 -1
- package/dist/gateway/static/root/assets/{desktop-pet-C-2wDANn.js → desktop-pet-CvOTI4uw.js} +1 -1
- package/dist/gateway/static/root/assets/{desktop-pet-settings-DyhxLrdJ.js → desktop-pet-settings-DYg-Gb8t.js} +1 -1
- package/dist/gateway/static/root/assets/device-pairing-wizard-B1FbZ8C1.js +1 -0
- package/dist/gateway/static/root/assets/{directory-picker-path-field-CNivVIPT.js → directory-picker-path-field-DZN9EDvM.js} +1 -1
- package/dist/gateway/static/root/assets/{extension-debug-page-CGYO3JPw.js → extension-debug-page-YIibp6Kk.js} +1 -1
- package/dist/gateway/static/root/assets/{extension-page-Dc51ALAg.js → extension-page-DkcGyb28.js} +1 -1
- package/dist/gateway/static/root/assets/{extension-provider-BXPILdlw.js → extension-provider-B1PQGTtY.js} +1 -1
- package/dist/gateway/static/root/assets/extension-settings-page-C_rJiSKo.js +1 -0
- package/dist/gateway/static/root/assets/{gateway-config-swr-Bc2MytsF.js → gateway-config-swr-Dv_A5FMu.js} +1 -1
- package/dist/gateway/static/root/assets/{gateway-realtime-BFK-vlME.js → gateway-realtime-DghCGfY_.js} +1 -1
- package/dist/gateway/static/root/assets/gateway-realtime-store-CMJVSnvi.js +1 -0
- package/dist/gateway/static/root/assets/gateway-settings-CjCWPHNJ.js +1 -0
- package/dist/gateway/static/root/assets/{gateway-startup-retry-BDPMttPx.js → gateway-startup-retry-CkTVSESs.js} +1 -1
- package/dist/gateway/static/root/assets/{highlighted-body-KQOG7T2V-DAlRGMge.js → highlighted-body-KQOG7T2V-DV2wNqBn.js} +1 -1
- package/dist/gateway/static/root/assets/home-page-fAYsd7kG.js +2 -0
- package/dist/gateway/static/root/assets/image-generation-api-B98iXt6A.js +1 -0
- package/dist/gateway/static/root/assets/imports-page-DoBCBN8G.js +1 -0
- package/dist/gateway/static/root/assets/index-DFgXwLsv.js +260 -0
- package/dist/gateway/static/root/assets/index-a6ZvhclR.css +1 -0
- package/dist/gateway/static/root/assets/{keyboard-shortcuts-settings-BYYC9Qmw.js → keyboard-shortcuts-settings-DXVu4lqV.js} +1 -1
- package/dist/gateway/static/root/assets/local-app-workbench-page-B3fz6uRi.js +1 -0
- package/dist/gateway/static/root/assets/{local-apps-page-BU8pUsVM.js → local-apps-page-BC6xhmUh.js} +1 -1
- package/dist/gateway/static/root/assets/{local-session-drafts-kFc_MAA9.js → local-session-drafts-DFnZQu9A.js} +1 -1
- package/dist/gateway/static/root/assets/{locale-store-Dr43FCty.js → locale-store-BpK9AiDq.js} +1 -1
- package/dist/gateway/static/root/assets/logs-page-CSqSFDRU.js +2 -0
- package/dist/gateway/static/root/assets/management-settings-gq5L0THs.js +1 -0
- package/dist/gateway/static/root/assets/{markdown-view-CdKlPjJM.js → markdown-view-IsYTotu6.js} +18 -18
- package/dist/gateway/static/root/assets/{media-plugins-DE9zt88i.js → media-plugins-oSChWbcP.js} +1 -1
- package/dist/gateway/static/root/assets/mermaid-MCJ5UELQ-C_QKwqDN.js +1 -0
- package/dist/gateway/static/root/assets/messages-CKTo_sIF.js +3 -0
- package/dist/gateway/static/root/assets/models-hub-cache-TjpL7hZ5.js +1 -0
- package/dist/gateway/static/root/assets/note-detail-panel-CdpNXre-.js +5 -0
- package/dist/gateway/static/root/assets/{notes-api-BHouNL6-.js → notes-api-CBb944yw.js} +1 -1
- package/dist/gateway/static/root/assets/notes-page-EGvGw8MN.js +8 -0
- package/dist/gateway/static/root/assets/{page-context-capture-button-TQr8NnSc.js → page-context-capture-button-CoWb7BYP.js} +1 -1
- package/dist/gateway/static/root/assets/personal-page-DYzbNTyN.js +1 -0
- package/dist/gateway/static/root/assets/{product-open-page-BEl6syFp.js → product-open-page-CTyy7H7-.js} +1 -1
- package/dist/gateway/static/root/assets/{product-preview-content-BxSHnbqz.js → product-preview-content-D4xqTaEy.js} +1 -1
- package/dist/gateway/static/root/assets/project-detail-page-DIVCw0QQ.js +1 -0
- package/dist/gateway/static/root/assets/projects-page-B4L9VnBN.js +1 -0
- package/dist/gateway/static/root/assets/{registry-api-BD5IgDOA.js → registry-api-Dsa2LvRt.js} +1 -1
- package/dist/gateway/static/root/assets/remote-access-hub-B8PvgLVz.js +1 -0
- package/dist/gateway/static/root/assets/{runtime-tools-api-CjTRoQWT.js → runtime-tools-api-C2Uw89eY.js} +1 -1
- package/dist/gateway/static/root/assets/runtime-tools-settings-panel-Bqnp3tyt.js +1 -0
- package/dist/gateway/static/root/assets/scenes-page-D50g4GM2.js +2 -0
- package/dist/gateway/static/root/assets/{schema-form-ByG-R6N2.js → schema-form-h_RCNfiO.js} +1 -1
- package/dist/gateway/static/root/assets/{send-session-input-UAVStisp.js → send-session-input-DypbVTT7.js} +1 -1
- package/dist/gateway/static/root/assets/{session-api-DvgEiNRS.js → session-api-ga-SUOq_.js} +1 -1
- package/dist/gateway/static/root/assets/{session-manager-BOb1tC_Z.js → session-manager-C_OiKblh.js} +8 -8
- package/dist/gateway/static/root/assets/sessions-page-BsqDIbIr.js +1 -0
- package/dist/gateway/static/root/assets/settings-advanced-gate-D3zJAW4p.js +1 -0
- package/dist/gateway/static/root/assets/{settings-page-C1e9m23j.js → settings-page-DPCgrICd.js} +1 -1
- package/dist/gateway/static/root/assets/setup-status-panel-jjSYJpDd.js +1 -0
- package/dist/gateway/static/root/assets/{share-link-dialog-kE_6v5Dp.js → share-link-dialog-BGicglAS.js} +1 -1
- package/dist/gateway/static/root/assets/{share-preview-page-BT-_yR1h.js → share-preview-page-BORe9rLB.js} +1 -1
- package/dist/gateway/static/root/assets/{shares-api-Dg_SqHQE.js → shares-api-Dbx3z6-1.js} +1 -1
- package/dist/gateway/static/root/assets/shares-settings-C13FgfWk.js +1 -0
- package/dist/gateway/static/root/assets/{skill-api-BslUYMnX.js → skill-api-Cq6O1DZK.js} +1 -1
- package/dist/gateway/static/root/assets/{skill-reload-api-BQ2rTOP1.js → skill-reload-api-Cq7QDjMA.js} +1 -1
- package/dist/gateway/static/root/assets/skills-page-BM1ShEjx.js +2 -0
- package/dist/gateway/static/root/assets/{system-settings-panel-GpbPfWwo.js → system-settings-panel-BNCGFO1e.js} +1 -1
- package/dist/gateway/static/root/assets/task-detail-page-4VG82wcF.js +2 -0
- package/dist/gateway/static/root/assets/{task-expandable-content-DJrrEBB4.js → task-expandable-content-DAZGz5YC.js} +1 -1
- package/dist/gateway/static/root/assets/{theme-store-BKpYnggg.js → theme-store-Db7hDESt.js} +1 -1
- package/dist/gateway/static/root/assets/{tracing-settings-page-D71w7dwV.js → tracing-settings-page-C6p2Mu92.js} +1 -1
- package/dist/gateway/static/root/assets/{tunnel-api-BV46CvS8.js → tunnel-api-Dw15EJp0.js} +1 -1
- package/dist/gateway/static/root/assets/usage-page-DDrIqgGe.js +1 -0
- package/dist/gateway/static/root/assets/{use-autosave-CzyqRffr.js → use-autosave-DDjIdW4U.js} +1 -1
- package/dist/gateway/static/root/assets/{use-composer-attachments-Dviq-1f6.js → use-composer-attachments-DNl7O3Vb.js} +1 -1
- package/dist/gateway/static/root/assets/{use-file-preview-expanded-D5Kk7Hon.js → use-file-preview-expanded-DMHehhwG.js} +2 -2
- package/dist/gateway/static/root/assets/user-model-page-CaS9dOIr.js +2 -0
- package/dist/gateway/static/root/assets/{voice-api-key-field-DWtbmacd.js → voice-api-key-field-ByAxHE4P.js} +1 -1
- package/dist/gateway/static/root/assets/{voice-config-api-DnIjZm_9.js → voice-config-api-Dl39b27p.js} +1 -1
- package/dist/gateway/static/root/assets/voice-transcribe-api-CVaU83Jc.js +1 -0
- package/dist/gateway/static/root/assets/{work-discovery-overlay-ChEG71hz.js → work-discovery-overlay-BvVvPA1T.js} +1 -1
- package/dist/gateway/static/root/assets/workflow-run-setup-panel-BcFm9QcC.js +3 -0
- package/dist/gateway/static/root/assets/workflows-page-DMec_XZB.js +6 -0
- package/dist/gateway/static/root/assets/{workspace-api-CZDvu7uA.js → workspace-api-BpfKsrtP.js} +2 -2
- package/dist/gateway/static/root/assets/{xopc-cloud-account-card-CbUgg1SK.js → xopc-cloud-account-card-CU5lzzE9.js} +1 -1
- package/dist/gateway/static/root/index.html +28 -35
- package/dist/package.js +1 -1
- package/dist/packages/gateway-contract/src/discussions.js +3 -2
- package/dist/packages/gateway-contract/src/index.js +4 -0
- package/dist/packages/gateway-contract/src/provider-setup.js +6 -0
- package/dist/packages/gateway-contract/src/recording-outcome.js +6 -0
- package/dist/packages/image-providers/src/catalog.js +10 -0
- package/dist/packages/image-providers/src/execute.js +5 -1
- package/dist/packages/image-providers/src/validation.js +19 -1
- package/dist/src/agent/agent-manager.d.ts +1 -0
- package/dist/src/agent/agent-manager.js +4 -1
- package/dist/src/agent/background-review/run-background-review.d.ts +0 -1
- package/dist/src/agent/background-review/run-background-review.js +10 -2
- package/dist/src/agent/context/execution-scope.js +1 -1
- package/dist/src/agent/embedded/execution-tool-policy.d.ts +2 -0
- package/dist/src/agent/embedded/execution-tool-policy.js +8 -3
- package/dist/src/agent/embedded/run-for-session.js +26 -3
- package/dist/src/agent/embedded/run-turn.js +14 -1
- package/dist/src/agent/embedded/session-runner.js +1 -1
- package/dist/src/agent/embedded/xopc-stream-bridge.js +3 -0
- package/dist/src/agent/image/generation/runtime.js +12 -14
- package/dist/src/agent/image/understanding/runtime.js +5 -0
- package/dist/src/agent/inbound/inbound-loop.d.ts +1 -15
- package/dist/src/agent/inbound/inbound-loop.js +5 -0
- package/dist/src/agent/mcp/connection-errors.d.ts +3 -0
- package/dist/src/agent/mcp/connection-errors.js +32 -0
- package/dist/src/agent/mcp/connection-setup.d.ts +2 -0
- package/dist/src/agent/mcp/connection-setup.js +38 -18
- package/dist/src/agent/memory/compaction.js +5 -1
- package/dist/src/agent/memory/idle-compaction-scheduler.js +3 -1
- package/dist/src/agent/models/manager.d.ts +1 -0
- package/dist/src/agent/models/manager.js +4 -2
- package/dist/src/agent/orchestration/agent-orchestrator.d.ts +1 -6
- package/dist/src/agent/orchestration/agent-orchestrator.js +5 -0
- package/dist/src/agent/service/process-direct-one-shot.js +5 -0
- package/dist/src/agent/service/process-direct-streaming.d.ts +1 -0
- package/dist/src/agent/service/process-direct-streaming.js +17 -1
- package/dist/src/agent/tools/factory.js +14 -12
- package/dist/src/agent/tools/image-generate-tool.js +5 -1
- package/dist/src/agent/tools/personal-read-tool.js +4 -0
- package/dist/src/agent/tools/task-collaboration-tool.js +1 -1
- package/dist/src/agent-config/resolver.js +5 -0
- package/dist/src/agent-config/schema.d.ts +26 -6
- package/dist/src/agent-config/schema.js +2 -0
- package/dist/src/ai-assist/text-assist.js +5 -16
- package/dist/src/automations/service/action-executor.js +3 -1
- package/dist/src/cli/commands/doctor/checks/database-schema.js +1 -1
- package/dist/src/config/agent-model-intents.js +4 -1
- package/dist/src/config/schema.d.ts +11 -5
- package/dist/src/config/schema.js +11 -3
- package/dist/src/discussions/analyzer.d.ts +2 -0
- package/dist/src/discussions/analyzer.js +38 -9
- package/dist/src/discussions/audio-clip.d.ts +3 -0
- package/dist/src/discussions/audio-clip.js +72 -0
- package/dist/src/discussions/live-worker.js +3 -1
- package/dist/src/discussions/long-review.d.ts +17 -0
- package/dist/src/discussions/long-review.js +278 -0
- package/dist/src/discussions/media-timeline.d.ts +21 -0
- package/dist/src/discussions/media-timeline.js +134 -0
- package/dist/src/discussions/organizer-worker.d.ts +4 -1
- package/dist/src/discussions/organizer-worker.js +17 -12
- package/dist/src/discussions/organizer.js +2 -0
- package/dist/src/discussions/processing.d.ts +43 -0
- package/dist/src/discussions/processing.js +125 -0
- package/dist/src/discussions/recording.js +202 -42
- package/dist/src/discussions/recordingJobs.js +2 -0
- package/dist/src/discussions/repository.js +4 -2
- package/dist/src/discussions/review.d.ts +8 -0
- package/dist/src/discussions/review.js +183 -0
- package/dist/src/discussions/sealer.d.ts +7 -1
- package/dist/src/discussions/sealer.js +163 -87
- package/dist/src/discussions/service.d.ts +7 -1
- package/dist/src/discussions/service.js +51 -15
- package/dist/src/discussions/types.d.ts +2 -1
- package/dist/src/gateway/agent-builtin-tools.d.ts +1 -1
- package/dist/src/gateway/global-defaults-admin.d.ts +3 -1
- package/dist/src/gateway/global-defaults-admin.js +14 -2
- package/dist/src/gateway/hono/lib/config-payload.d.ts +11 -2
- package/dist/src/gateway/hono/lib/config-payload.js +2 -0
- package/dist/src/gateway/hono/lib/voice-settings-revisions.d.ts +5 -0
- package/dist/src/gateway/hono/lib/voice-settings-revisions.js +24 -0
- package/dist/src/gateway/hono/routes/commands-skills.js +15 -0
- package/dist/src/gateway/hono/routes/config-patch/misc.js +8 -1
- package/dist/src/gateway/hono/routes/config.js +12 -0
- package/dist/src/gateway/hono/routes/discussions.js +63 -1
- package/dist/src/gateway/hono/routes/global-defaults.js +8 -1
- package/dist/src/gateway/hono/routes/models.js +12 -4
- package/dist/src/gateway/hono/routes/provider-setup.d.ts +3 -0
- package/dist/src/gateway/hono/routes/provider-setup.js +106 -0
- package/dist/src/gateway/hono/routes/status.js +2 -0
- package/dist/src/gateway/hono/routes/voice.js +23 -10
- package/dist/src/gateway/provider-model-setup.d.ts +4 -0
- package/dist/src/gateway/provider-model-setup.js +56 -0
- package/dist/src/gateway/service/config-coordinator.d.ts +2 -2
- package/dist/src/gateway/service.js +2 -0
- package/dist/src/media-shared/http/provider-http.d.ts +0 -6
- package/dist/src/media-shared/http/provider-http.js +5 -4
- package/dist/src/media-understanding/runner.d.ts +0 -28
- package/dist/src/media-understanding/runner.js +4 -0
- package/dist/src/platform/client.d.ts +1 -1
- package/dist/src/platform/contracts.d.ts +1 -1
- package/dist/src/providers/env-keys.js +3 -0
- package/dist/src/providers/extension-stream-bridge.js +3 -0
- package/dist/src/providers/index.js +15 -0
- package/dist/src/providers/model-call.d.ts +5 -2
- package/dist/src/providers/model-call.js +13 -2
- package/dist/src/providers/model-reference-auditor.js +1 -0
- package/dist/src/providers/model-response.js +1 -1
- package/dist/src/providers/model-usage.d.ts +15 -0
- package/dist/src/providers/model-usage.js +50 -0
- package/dist/src/providers/presentation.js +8 -0
- package/dist/src/providers/setup/engine.d.ts +37 -0
- package/dist/src/providers/setup/engine.js +177 -0
- package/dist/src/providers/setup/profiles.d.ts +4 -0
- package/dist/src/providers/setup/profiles.js +78 -0
- package/dist/src/providers/setup/voice.d.ts +23 -0
- package/dist/src/providers/setup/voice.js +234 -0
- package/dist/src/scenes/agentExecutor.d.ts +1 -0
- package/dist/src/scenes/agentExecutor.js +5 -0
- package/dist/src/storage/sqlite/migrations/253_discussion_processing_recovery.sql +20 -0
- package/dist/src/storage/sqlite/migrations/254_discussion_annotations.sql +17 -0
- package/dist/src/storage/sqlite/migrations/255_discussion_chapter_progress.sql +10 -0
- package/dist/src/storage/sqlite/migrations/256_task_main_update_retries.sql +21 -0
- package/dist/src/storage/sqlite/migrations/runner.d.ts +1 -1
- package/dist/src/storage/sqlite/migrations/runner.js +3 -3
- package/dist/src/storage/sqlite/schema.js +1 -1
- package/dist/src/tasks/task-collaboration-repository.d.ts +2 -0
- package/dist/src/tasks/task-collaboration-repository.js +7 -1
- package/dist/src/tasks/task-main-update-delivery.js +11 -4
- package/dist/src/tasks/task-main-update-input.js +2 -1
- package/dist/src/tasks/task-main-update-retry.d.ts +5 -0
- package/dist/src/tasks/task-main-update-retry.js +15 -0
- package/dist/src/usage/recorder.js +2 -1
- package/dist/src/usage/scenario-registry.js +128 -123
- package/dist/src/voice/dashscope/streaming-stt-session.js +3 -0
- package/dist/src/voice/dashscope/streaming-tts-stream.js +3 -0
- package/dist/src/voice/dictation.d.ts +12 -0
- package/dist/src/voice/dictation.js +22 -0
- package/dist/src/voice/metadata/builtin.js +54 -0
- package/dist/src/voice/platform-streams.js +3 -0
- package/dist/src/voice/realtime/omniEngine.js +3 -0
- package/dist/src/voice/realtime/omniRoute.js +3 -2
- package/dist/src/voice/realtime/runtime.js +4 -2
- package/dist/src/voice/stt/factory.js +9 -3
- package/dist/src/voice/stt/providers/bailian-plan-transcription.d.ts +2 -0
- package/dist/src/voice/stt/providers/bailian-plan-transcription.js +32 -0
- package/dist/src/voice/stt/providers/index.d.ts +1 -0
- package/dist/src/voice/stt/providers/index.js +2 -1
- package/dist/src/voice/token-plan.d.ts +8 -0
- package/dist/src/voice/token-plan.js +11 -0
- package/dist/src/voice/tts/factory.js +4 -1
- package/dist/src/voice/tts/providers/bailian-plan-speech.d.ts +2 -0
- package/dist/src/voice/tts/providers/bailian-plan-speech.js +84 -0
- package/dist/src/voice/tts/providers/index.d.ts +1 -0
- package/dist/src/voice/tts/providers/index.js +2 -1
- package/dist/src/voice/tts/speak-core.js +10 -1
- package/package.json +2 -2
- package/dist/gateway/static/root/assets/agent-defaults-settings-panel-Ds0Ue2FB.js +0 -1
- package/dist/gateway/static/root/assets/agents-BLRM4o-U.js +0 -77
- package/dist/gateway/static/root/assets/app-management-settings-panel-Dmy828Pe.js +0 -1
- package/dist/gateway/static/root/assets/automations-workspace-UcCneEs3.js +0 -6
- package/dist/gateway/static/root/assets/bot-DjLkhyZL.js +0 -1
- package/dist/gateway/static/root/assets/browser-automations-page-BjvQnYfO.js +0 -3
- package/dist/gateway/static/root/assets/browser-settings-page-D5ZghI28.js +0 -3
- package/dist/gateway/static/root/assets/capabilities-page-MC8qIrXo.js +0 -2
- package/dist/gateway/static/root/assets/capabilities-settings-panel-Blz3hEzp.js +0 -8
- package/dist/gateway/static/root/assets/channels-DSg_iCVC.js +0 -1
- package/dist/gateway/static/root/assets/chat-terminal-dock-C97SJEwd.js +0 -36
- package/dist/gateway/static/root/assets/circle-pause-CN9jYH2s.js +0 -1
- package/dist/gateway/static/root/assets/clock-3-DnrAnuyZ.js +0 -1
- package/dist/gateway/static/root/assets/connectors-page-DXk-GAsd.js +0 -1
- package/dist/gateway/static/root/assets/device-pairing-wizard-BeSuq__I.js +0 -1
- package/dist/gateway/static/root/assets/extension-settings-page-jYu6qpY2.js +0 -1
- package/dist/gateway/static/root/assets/fallback-models-CoyzvDo7.js +0 -1
- package/dist/gateway/static/root/assets/gateway-realtime-store-C3vH-Iup.js +0 -1
- package/dist/gateway/static/root/assets/gateway-settings-JlT1dlSj.js +0 -1
- package/dist/gateway/static/root/assets/git-branch-Dh9uxTot.js +0 -1
- package/dist/gateway/static/root/assets/home-page-DOVl8s-1.js +0 -2
- package/dist/gateway/static/root/assets/image-generation-api-BZBiYDmV.js +0 -1
- package/dist/gateway/static/root/assets/imports-page-DgdBTp_0.js +0 -1
- package/dist/gateway/static/root/assets/index-CmC8JkSM.js +0 -260
- package/dist/gateway/static/root/assets/index-Dgzc0oBu.css +0 -1
- package/dist/gateway/static/root/assets/local-app-workbench-page-BKZfn-MS.js +0 -1
- package/dist/gateway/static/root/assets/logs-page-BSepiACn.js +0 -2
- package/dist/gateway/static/root/assets/management-settings-dE_ykPNY.js +0 -1
- package/dist/gateway/static/root/assets/mermaid-MCJ5UELQ-65SE6j-_.js +0 -1
- package/dist/gateway/static/root/assets/message-square-fVE7Ghj1.js +0 -1
- package/dist/gateway/static/root/assets/messages-DlTNQI92.js +0 -3
- package/dist/gateway/static/root/assets/models-hub-cache-C7FAsEe_.js +0 -1
- package/dist/gateway/static/root/assets/note-detail-panel-D9oqhdyk.js +0 -5
- package/dist/gateway/static/root/assets/notes-page-Bd4_7ph8.js +0 -8
- package/dist/gateway/static/root/assets/pause-DuPxgSxk.js +0 -1
- package/dist/gateway/static/root/assets/personal-page-BvWzq4Wp.js +0 -1
- package/dist/gateway/static/root/assets/play-kxZvpBg8.js +0 -1
- package/dist/gateway/static/root/assets/project-detail-page-D-qkIXVT.js +0 -1
- package/dist/gateway/static/root/assets/projects-page-BQtw1Dfn.js +0 -1
- package/dist/gateway/static/root/assets/remote-access-hub-CYFNz0Jc.js +0 -1
- package/dist/gateway/static/root/assets/runtime-tools-settings-panel-Qq_NyYx_.js +0 -1
- package/dist/gateway/static/root/assets/scenes-page-hGr-ppYk.js +0 -2
- package/dist/gateway/static/root/assets/sessions-page-CpX1Rluw.js +0 -1
- package/dist/gateway/static/root/assets/settings-advanced-gate-D2s_MlxR.js +0 -1
- package/dist/gateway/static/root/assets/settings-loading-skeleton-BTqvr_Fw.js +0 -1
- package/dist/gateway/static/root/assets/setup-status-panel-BiHRYDHq.js +0 -1
- package/dist/gateway/static/root/assets/shares-settings-DfcAu08T.js +0 -1
- package/dist/gateway/static/root/assets/skills-page-CvKc5nBN.js +0 -2
- package/dist/gateway/static/root/assets/sparkles-DHlfQFAF.js +0 -1
- package/dist/gateway/static/root/assets/task-detail-page-5B5ZVAu0.js +0 -2
- package/dist/gateway/static/root/assets/usage-page-rMuwNpJi.js +0 -1
- package/dist/gateway/static/root/assets/user-model-page-Dhqw3v_u.js +0 -2
- package/dist/gateway/static/root/assets/workflow-run-setup-panel-pdiRKLxP.js +0 -3
- package/dist/gateway/static/root/assets/workflows-page-D9LMxINt.js +0 -6
|
@@ -3,6 +3,7 @@ import { isSTTAvailable } from "../../../voice/stt/availability.js";
|
|
|
3
3
|
import { mergeSttConfigFromAppConfig } from "../../../voice/stt/config.js";
|
|
4
4
|
import "../../../voice/stt/index.js";
|
|
5
5
|
import { getGatewayAgentEffectiveConfig } from "../../agents-admin.js";
|
|
6
|
+
import { resolveDictationRoute } from "../../../voice/dictation.js";
|
|
6
7
|
import { createHash } from "node:crypto";
|
|
7
8
|
//#region src/gateway/hono/routes/status.ts
|
|
8
9
|
init_providers();
|
|
@@ -82,6 +83,7 @@ function buildStatusPayload(service) {
|
|
|
82
83
|
sttAvailable: sttConfig ? isSTTAvailable(sttConfig) : false,
|
|
83
84
|
sttEnabled: sttConfig?.enabled === true,
|
|
84
85
|
sttProvider: sttConfig?.provider ?? null,
|
|
86
|
+
dictation: config ? resolveDictationRoute(config) : { mode: "unavailable" },
|
|
85
87
|
refineAvailable: isRefineAvailable(config)
|
|
86
88
|
}
|
|
87
89
|
};
|
|
@@ -1,3 +1,4 @@
|
|
|
1
|
+
import { init_model_usage, withModelUsageOrigin } from "../../../providers/model-usage.js";
|
|
1
2
|
import { voiceSelectionSchema } from "../../../../packages/realtime-protocol/src/voice-catalog.js";
|
|
2
3
|
import { VOICE_TIMING_METRICS, createVoiceSessionRequestSchema, init_voice } from "../../../../packages/realtime-protocol/src/voice.js";
|
|
3
4
|
import { getDefaultModelSync, init_providers, resolveModel } from "../../../providers/index.js";
|
|
@@ -5,6 +6,7 @@ import { completeWithResolvedCredentials } from "../../../providers/model-call.j
|
|
|
5
6
|
import { isPersonalConversation } from "../../../personal-agent/repository.js";
|
|
6
7
|
import { PlatformVoiceError } from "../../../voice/platform-streams.js";
|
|
7
8
|
import { resolveSttProviderConfigSlice } from "../../../voice/stt/config-slice.js";
|
|
9
|
+
import { resolveSTTProviderChain } from "../../../voice/stt/factory.js";
|
|
8
10
|
import { STTTranscriptionError, transcribe } from "../../../voice/stt/transcribe-core.js";
|
|
9
11
|
import { isSTTAvailable } from "../../../voice/stt/availability.js";
|
|
10
12
|
import { mergeSttConfigFromAppConfig } from "../../../voice/stt/config.js";
|
|
@@ -21,10 +23,11 @@ import { resolveOmniRoute } from "../../../voice/realtime/omniRoute.js";
|
|
|
21
23
|
import { VoiceSessionCreationError, resolveStreamingStt, resolveStreamingTts } from "../../../voice/realtime/runtime.js";
|
|
22
24
|
import { getGatewayPrincipal } from "../../security/gateway-principal.js";
|
|
23
25
|
import { createGatewayRouteLogger } from "../lib/route-logger.js";
|
|
24
|
-
import { selectPlatformVoice, voiceSettingsCatalog } from "../../../voice/platform-settings.js";
|
|
25
26
|
import { listTtsProvidersForApi } from "../../../voice/tts/list-providers.js";
|
|
27
|
+
import { selectPlatformVoice, voiceSettingsCatalog } from "../../../voice/platform-settings.js";
|
|
26
28
|
import { z } from "zod";
|
|
27
29
|
//#region src/gateway/hono/routes/voice.ts
|
|
30
|
+
init_model_usage();
|
|
28
31
|
init_voice();
|
|
29
32
|
init_providers();
|
|
30
33
|
const log = createGatewayRouteLogger("Voice");
|
|
@@ -104,7 +107,10 @@ async function refineTranscript(raw, config, signal) {
|
|
|
104
107
|
maxTokens: Math.min(raw.length * 3, 4096),
|
|
105
108
|
temperature: .2,
|
|
106
109
|
signal: mergedSignal
|
|
107
|
-
}, void 0, {
|
|
110
|
+
}, void 0, {
|
|
111
|
+
operation: "voice.select",
|
|
112
|
+
trigger: "user"
|
|
113
|
+
});
|
|
108
114
|
let out = "";
|
|
109
115
|
if (Array.isArray(result.content)) {
|
|
110
116
|
for (const c of result.content) if (c && typeof c === "object" && c.type === "text") out += String(c.text || "");
|
|
@@ -246,12 +252,13 @@ function registerVoiceRoutes(authenticated, deps) {
|
|
|
246
252
|
let result;
|
|
247
253
|
let reader;
|
|
248
254
|
try {
|
|
249
|
-
|
|
255
|
+
const text = config.voice?.language === "en" ? "Hello, I am your assistant. You can talk to me naturally." : "你好,我是你的助手。现在可以和我自然对话了。";
|
|
256
|
+
result = await withModelUsageOrigin("interactive", () => speakStream(text, previewConfig, {
|
|
250
257
|
signal,
|
|
251
258
|
appConfig: config,
|
|
252
259
|
allowFallback: false,
|
|
253
260
|
parseDirectives: false
|
|
254
|
-
});
|
|
261
|
+
}));
|
|
255
262
|
if (result.outputFormat !== "pcm") throw new Error("Realtime preview requires PCM audio");
|
|
256
263
|
reader = result.audioStream.getReader();
|
|
257
264
|
const chunks = [];
|
|
@@ -551,12 +558,12 @@ function registerVoiceRoutes(authenticated, deps) {
|
|
|
551
558
|
error: { message: `TTS provider \"${provider}\" is not configured.` }
|
|
552
559
|
}, 503);
|
|
553
560
|
try {
|
|
554
|
-
const result = await speak(text, ttsConfig, {
|
|
561
|
+
const result = await withModelUsageOrigin("interactive", () => speak(text, ttsConfig, {
|
|
555
562
|
appConfig: config,
|
|
556
563
|
parseDirectives: false,
|
|
557
564
|
signal: c.req.raw.signal,
|
|
558
565
|
tts: voice ? { voice } : void 0
|
|
559
|
-
});
|
|
566
|
+
}));
|
|
560
567
|
if (!result.audio.length) throw new Error(`TTS provider \"${result.provider}\" returned empty audio`);
|
|
561
568
|
return new Response(new Uint8Array(result.audio), { headers: {
|
|
562
569
|
"Content-Type": speechMimeType(result.format),
|
|
@@ -630,14 +637,14 @@ function registerVoiceRoutes(authenticated, deps) {
|
|
|
630
637
|
}, 503);
|
|
631
638
|
try {
|
|
632
639
|
const startedAt = Date.now();
|
|
633
|
-
const result = await speak(text, ttsConfig, {
|
|
640
|
+
const result = await withModelUsageOrigin("interactive", () => speak(text, ttsConfig, {
|
|
634
641
|
appConfig: config,
|
|
635
642
|
parseDirectives: false,
|
|
636
643
|
tts: {
|
|
637
644
|
...typeof body.model === "string" && body.model.trim() ? { model: body.model.trim() } : {},
|
|
638
645
|
...typeof body.voice === "string" && body.voice.trim() ? { voice: body.voice.trim() } : {}
|
|
639
646
|
}
|
|
640
|
-
});
|
|
647
|
+
}));
|
|
641
648
|
if (!result.audio.length) throw new Error(`TTS provider "${result.provider}" returned empty audio`);
|
|
642
649
|
const mimeType = result.format === "opus" || result.format === "ogg" ? "audio/ogg" : result.format === "mp3" || result.format === "mpeg" ? "audio/mpeg" : result.format === "wav" ? "audio/wav" : `audio/${result.format}`;
|
|
643
650
|
return c.json({
|
|
@@ -678,18 +685,22 @@ function registerVoiceRoutes(authenticated, deps) {
|
|
|
678
685
|
}, 400);
|
|
679
686
|
const config = service.currentConfig;
|
|
680
687
|
const sttConfig = mergeSttConfigFromAppConfig(config.tools?.media?.audio, config.tools?.media);
|
|
688
|
+
if (input.expectedProvider && input.expectedProvider !== resolveSTTProviderChain(sttConfig)[0]?.id) return c.json({
|
|
689
|
+
ok: false,
|
|
690
|
+
error: { message: "Speech recognition provider changed during recording. Restore the previous model or start a new recording." }
|
|
691
|
+
}, 409);
|
|
681
692
|
if (!isSTTAvailable(sttConfig)) return c.json({
|
|
682
693
|
ok: false,
|
|
683
694
|
error: { message: "STT is not configured. Enable STT in gateway config (tools.media.audio)." }
|
|
684
695
|
}, 503);
|
|
685
696
|
const startedAt = Date.now();
|
|
686
697
|
try {
|
|
687
|
-
const result = await transcribe(input.audioBuffer, sttConfig, {
|
|
698
|
+
const result = await withModelUsageOrigin("interactive", () => transcribe(input.audioBuffer, sttConfig, {
|
|
688
699
|
language: input.language,
|
|
689
700
|
mime: input.mimeType,
|
|
690
701
|
fileName: input.fileName,
|
|
691
702
|
signal: c.req.raw.signal
|
|
692
|
-
});
|
|
703
|
+
}));
|
|
693
704
|
const detectedLanguage = result.language ?? input.language;
|
|
694
705
|
const refinementAvailable = (config.voice?.input?.refinement?.mode ?? "off") !== "off";
|
|
695
706
|
return c.json({
|
|
@@ -769,12 +780,14 @@ function registerVoiceRoutes(authenticated, deps) {
|
|
|
769
780
|
error: { message: "Missing required file field: audio" }
|
|
770
781
|
}, 400);
|
|
771
782
|
const languageValue = form.get("language");
|
|
783
|
+
const expectedProvider = form.get("expectedProvider");
|
|
772
784
|
const language = typeof languageValue === "string" && languageValue.trim() ? languageValue.trim() : void 0;
|
|
773
785
|
const fileName = "name" in audio && typeof audio.name === "string" && audio.name.trim() ? audio.name.trim() : `audio-${Date.now()}`;
|
|
774
786
|
return runTranscription(c, {
|
|
775
787
|
audioBuffer: Buffer.from(await audio.arrayBuffer()),
|
|
776
788
|
mimeType: audio.type || "audio/webm",
|
|
777
789
|
fileName,
|
|
790
|
+
...typeof expectedProvider === "string" && expectedProvider ? { expectedProvider } : {},
|
|
778
791
|
...language ? { language } : {}
|
|
779
792
|
});
|
|
780
793
|
});
|
|
@@ -0,0 +1,4 @@
|
|
|
1
|
+
import type { SetupSnapshot } from '../providers/setup/engine.js';
|
|
2
|
+
import type { Config } from '../config/schema.js';
|
|
3
|
+
export declare function loadProviderSetupSnapshot(provider: string, config?: Config): Promise<SetupSnapshot>;
|
|
4
|
+
export declare function readProviderSetupSnapshot(provider: string, configured: boolean, config?: Config): SetupSnapshot;
|
|
@@ -0,0 +1,56 @@
|
|
|
1
|
+
import { getProviderSetupProfile, init_profiles, isInteractiveOnlyProvider } from "../providers/setup/profiles.js";
|
|
2
|
+
import { getModelCatalogStore, init_model_catalog_store } from "../providers/model-catalog-store.js";
|
|
3
|
+
import { getAllModels, getAllProviders, getModelsByProvider, getProviderDisplayName, init_providers, isProviderConfigured, isProviderConfiguredSync, providerSupportsOAuth } from "../providers/index.js";
|
|
4
|
+
import { getImageGenerationProvider } from "../agent/image/generation/provider-registry.js";
|
|
5
|
+
import { listSttProvidersForApi } from "../voice/stt/list-providers.js";
|
|
6
|
+
import { listGlobalDefaults } from "./global-defaults-admin.js";
|
|
7
|
+
import { getRecommendedModelsForProvider } from "../providers/presentation.js";
|
|
8
|
+
import { listTtsProvidersForApi } from "../voice/tts/list-providers.js";
|
|
9
|
+
import { readSetupVoiceState } from "../providers/setup/voice.js";
|
|
10
|
+
//#region src/gateway/provider-model-setup.ts
|
|
11
|
+
init_providers();
|
|
12
|
+
init_model_catalog_store();
|
|
13
|
+
init_profiles();
|
|
14
|
+
async function loadProviderSetupSnapshot(provider, config) {
|
|
15
|
+
const languageProvider = getAllProviders().includes(provider);
|
|
16
|
+
const mediaProvider = getImageGenerationProvider(provider) || listSttProvidersForApi(config).providers.some((entry) => entry.id === provider) || listTtsProvidersForApi(config).providers.some((entry) => entry.id === provider);
|
|
17
|
+
if (!languageProvider && !mediaProvider) throw new Error(`Unknown model provider: ${provider}`);
|
|
18
|
+
return readProviderSetupSnapshot(provider, languageProvider && await isProviderConfigured(provider), config);
|
|
19
|
+
}
|
|
20
|
+
function readProviderSetupSnapshot(provider, configured, config) {
|
|
21
|
+
const languageProvider = getAllProviders().includes(provider);
|
|
22
|
+
const models = (languageProvider ? getModelsByProvider(provider) : []).filter((model) => !("computerUse" in model && model.computerUse));
|
|
23
|
+
const recommended = new Set((languageProvider ? getRecommendedModelsForProvider(provider) : []).map((model) => model.ref));
|
|
24
|
+
const source = getModelCatalogStore().getSource(provider);
|
|
25
|
+
const image = getImageGenerationProvider(provider);
|
|
26
|
+
const images = image?.models.filter((id) => provider !== "xopc-cloud" || source?.models.some((model) => model.id === id && model.availability === "available")) ?? [];
|
|
27
|
+
const configuredProviders = new Set(getAllProviders().filter(isProviderConfiguredSync));
|
|
28
|
+
const backgroundRestrictedModels = new Set(getAllModels().filter((model) => isInteractiveOnlyProvider(model.provider, model.baseUrl)).map((model) => `${model.provider}/${model.id}`));
|
|
29
|
+
for (const model of models) if (/^https?:\/\/(localhost|127\.0\.0\.1|\[::1\])(?=[:/]|$)/.test(model.baseUrl)) configuredProviders.add(provider);
|
|
30
|
+
const voice = config ? readSetupVoiceState(provider, config) : void 0;
|
|
31
|
+
const imageConfigured = image?.isConfigured({ cfg: config }) ?? false;
|
|
32
|
+
const nativeVoiceConfigured = Boolean(!["qwen-token-plan-cn", "xopc-cloud"].includes(provider) && voice && Object.values(voice.choices).some((choices) => choices.length));
|
|
33
|
+
return {
|
|
34
|
+
...config ? { voice } : {},
|
|
35
|
+
configured: configured || configuredProviders.has(provider) || imageConfigured || nativeVoiceConfigured,
|
|
36
|
+
configuredProviders,
|
|
37
|
+
backgroundRestrictedModels,
|
|
38
|
+
defaults: listGlobalDefaults().defaults,
|
|
39
|
+
profile: getProviderSetupProfile(provider, getProviderDisplayName(provider), providerSupportsOAuth(provider), models[0]?.baseUrl),
|
|
40
|
+
models: (!configured && !configuredProviders.has(provider) && (nativeVoiceConfigured || imageConfigured) ? [] : models).map((model) => ({
|
|
41
|
+
ref: `${provider}/${model.id}`,
|
|
42
|
+
name: model.name,
|
|
43
|
+
vision: model.input.includes("image"),
|
|
44
|
+
reasoning: model.reasoning,
|
|
45
|
+
baseUrl: model.baseUrl,
|
|
46
|
+
api: model.api,
|
|
47
|
+
recommended: recommended.has(`${provider}/${model.id}`)
|
|
48
|
+
})),
|
|
49
|
+
images: (nativeVoiceConfigured && !imageConfigured && !configured ? [] : images).map((id) => ({
|
|
50
|
+
ref: `${provider}/${id}`,
|
|
51
|
+
name: id
|
|
52
|
+
}))
|
|
53
|
+
};
|
|
54
|
+
}
|
|
55
|
+
//#endregion
|
|
56
|
+
export { loadProviderSetupSnapshot, readProviderSetupSnapshot };
|
|
@@ -612,12 +612,12 @@ export declare class GatewayConfigCoordinator {
|
|
|
612
612
|
model: string;
|
|
613
613
|
};
|
|
614
614
|
tts?: {
|
|
615
|
-
provider: "
|
|
615
|
+
provider: "xopc-cloud" | "alibaba";
|
|
616
616
|
model?: string;
|
|
617
617
|
voice?: string;
|
|
618
618
|
};
|
|
619
619
|
omni?: {
|
|
620
|
-
provider: "
|
|
620
|
+
provider: "qwen-token-plan-cn" | "xopc-cloud" | "alibaba";
|
|
621
621
|
model: string;
|
|
622
622
|
voice: string;
|
|
623
623
|
instructions: string;
|
|
@@ -156,6 +156,7 @@ import { GatewayReadiness } from "./startup-readiness.js";
|
|
|
156
156
|
import { createGatewayStartupTrace } from "./startup-trace.js";
|
|
157
157
|
import { GatewaySceneHost } from "./scenes/host.js";
|
|
158
158
|
import { TaskCollaborationDelivery } from "../tasks/task-collaboration-delivery.js";
|
|
159
|
+
import { TaskMainUpdateExhaustedError } from "../tasks/task-main-update-retry.js";
|
|
159
160
|
import { TaskMainUpdateDelivery } from "../tasks/task-main-update-delivery.js";
|
|
160
161
|
import { allowsPersonalTaskNotification, personalReplyNotification, personalRunDelegated } from "../personal-agent/notifications.js";
|
|
161
162
|
import { TaskMainUpdateDecisionService } from "../tasks/task-main-update-decision-service.js";
|
|
@@ -879,6 +880,7 @@ var GatewayService = class {
|
|
|
879
880
|
if (this.voiceRealtime.hasConversation(input.conversationId)) {
|
|
880
881
|
const attempt = selectTaskMainUpdateAttempt(input.conversationId, input.clientMessageId, findSessionInput);
|
|
881
882
|
if (attempt.kind === "completed") return Promise.resolve(true);
|
|
883
|
+
if (attempt.kind === "exhausted") throw new TaskMainUpdateExhaustedError();
|
|
882
884
|
if (attempt.kind !== "new" || !attempt.clientMessageId) return Promise.resolve(false);
|
|
883
885
|
return this.voiceRealtime.offerTaskUpdate({
|
|
884
886
|
...input,
|
|
@@ -1,9 +1,3 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Shared provider HTTP client (voice, STT/TTS, image-generation extensions).
|
|
3
|
-
*
|
|
4
|
-
* Wraps `globalThis.fetch` with SSRF guard (`assertSafeUrl`), timeout + signal
|
|
5
|
-
* merge, and standardized errors via `assertOkOrThrowProviderError`.
|
|
6
|
-
*/
|
|
7
1
|
import { type SsrfGuardOptions } from './ssrf-guard.js';
|
|
8
2
|
export interface ProviderHttpRequestConfig extends SsrfGuardOptions {
|
|
9
3
|
/** Hard timeout in milliseconds. Required: callers must always specify. */
|
|
@@ -1,3 +1,4 @@
|
|
|
1
|
+
import { assertProviderUsage, init_model_usage } from "../../providers/model-usage.js";
|
|
1
2
|
import { assertOkOrThrowProviderError } from "./provider-http-errors.js";
|
|
2
3
|
import { assertSafeUrl } from "./ssrf-guard.js";
|
|
3
4
|
import { setTimeout as setTimeout$1 } from "node:timers/promises";
|
|
@@ -8,6 +9,7 @@ import { setTimeout as setTimeout$1 } from "node:timers/promises";
|
|
|
8
9
|
* Wraps `globalThis.fetch` with SSRF guard (`assertSafeUrl`), timeout + signal
|
|
9
10
|
* merge, and standardized errors via `assertOkOrThrowProviderError`.
|
|
10
11
|
*/
|
|
12
|
+
init_model_usage();
|
|
11
13
|
function mergeHeadersRecord(input) {
|
|
12
14
|
const out = {};
|
|
13
15
|
if (!input) return out;
|
|
@@ -25,16 +27,15 @@ function mergeHeadersRecord(input) {
|
|
|
25
27
|
* to assertOk / parse / stream). Throws SsrfBlockedError on guard failure.
|
|
26
28
|
*/
|
|
27
29
|
async function fetchWithTimeoutGuarded(url, options) {
|
|
30
|
+
assertProviderUsage("endpoint", String(url));
|
|
28
31
|
await assertSafeUrl(url, options);
|
|
29
32
|
const controller = new AbortController();
|
|
30
33
|
const timeoutHandle = setTimeout(() => controller.abort(), options.timeoutMs);
|
|
31
|
-
const
|
|
32
|
-
if (callerSignal) if (callerSignal.aborted) controller.abort(callerSignal.reason);
|
|
33
|
-
else callerSignal.addEventListener("abort", () => controller.abort(callerSignal.reason), { once: true });
|
|
34
|
+
const signal = options.signal ? AbortSignal.any([options.signal, controller.signal]) : controller.signal;
|
|
34
35
|
try {
|
|
35
36
|
return await fetch(url, {
|
|
36
37
|
...options.init,
|
|
37
|
-
signal
|
|
38
|
+
signal
|
|
38
39
|
});
|
|
39
40
|
} finally {
|
|
40
41
|
clearTimeout(timeoutHandle);
|
|
@@ -1,31 +1,3 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* MediaUnderstanding capability runner.
|
|
3
|
-
*
|
|
4
|
-
* Orchestrates per-attachment fallback across providers for one capability
|
|
5
|
-
* (audio / image / video). For each attachment:
|
|
6
|
-
* 1. Build the candidate provider list from the registry, ordered by
|
|
7
|
-
* autoPriority (lower = first), with caller-supplied `providerOrder`
|
|
8
|
-
* overriding when set.
|
|
9
|
-
* 2. Try providers in order. A provider is SKIPPED when it does not declare
|
|
10
|
-
* the requested capability OR does not implement the corresponding method.
|
|
11
|
-
* 3. The first provider whose capability call resolves successfully wins;
|
|
12
|
-
* its output is recorded as `chosen`. Failures are recorded as attempts
|
|
13
|
-
* and the next provider is tried.
|
|
14
|
-
* 4. When ALL providers for an attachment fail, the attachment task is
|
|
15
|
-
* `failed`; when no provider was even eligible (capability not registered),
|
|
16
|
-
* it's `disabled`.
|
|
17
|
-
*
|
|
18
|
-
* DECISION (per docs/voice-rearchitecture.md §5):
|
|
19
|
-
* - This is a thin runner only. xopc v2.0 ships ONLY audio; image/video
|
|
20
|
-
* branches exist as type-level fall-throughs (the runner happily handles
|
|
21
|
-
* them once a provider registers describeImage / describeVideo, but no
|
|
22
|
-
* image-specific helpers — like multi-image batching — live here yet).
|
|
23
|
-
* - We deliberately do NOT port openclaw's `MediaAttachmentCache` (which
|
|
24
|
-
* handles temp-file extraction, SSRF re-validation on remote URLs, etc.).
|
|
25
|
-
* For xopc v2.0 the caller is expected to pre-load the buffer; remote URL
|
|
26
|
-
* fetching is the caller's responsibility (typically the channel adapter
|
|
27
|
-
* does this before invoking the runner).
|
|
28
|
-
*/
|
|
29
1
|
import type { AudioTranscriptionRequest, CapabilityAttachmentInput, ImageDescriptionRequest, MediaCapability, MediaUnderstandingProvider, MediaUnderstandingResult, VideoDescriptionRequest } from './types.js';
|
|
30
2
|
export type { CapabilityAttachmentInput } from './types.js';
|
|
31
3
|
export interface RunCapabilityOptions {
|
|
@@ -1,7 +1,9 @@
|
|
|
1
1
|
import { createLogger } from "../utils/logger/index.js";
|
|
2
2
|
import { init_logger } from "../utils/logger.js";
|
|
3
|
+
import { assertProviderUsage, init_model_usage, isProviderUsageScopeError } from "../providers/model-usage.js";
|
|
3
4
|
import { listProvidersForCapability } from "./registry.js";
|
|
4
5
|
//#region src/media-understanding/runner.ts
|
|
6
|
+
init_model_usage();
|
|
5
7
|
init_logger();
|
|
6
8
|
const log = createLogger("MediaUnderstandingRunner");
|
|
7
9
|
const KIND_BY_CAPABILITY = {
|
|
@@ -90,6 +92,7 @@ async function runCapability(options) {
|
|
|
90
92
|
}
|
|
91
93
|
const startedAt = Date.now();
|
|
92
94
|
try {
|
|
95
|
+
assertProviderUsage(provider.id, request.baseUrl);
|
|
93
96
|
const callResult = await method(request);
|
|
94
97
|
const text = callResult.text?.trim() ?? "";
|
|
95
98
|
if (!text) {
|
|
@@ -123,6 +126,7 @@ async function runCapability(options) {
|
|
|
123
126
|
});
|
|
124
127
|
break;
|
|
125
128
|
} catch (error) {
|
|
129
|
+
if (isProviderUsageScopeError(error)) throw error;
|
|
126
130
|
if (options.signal?.aborted) throw error;
|
|
127
131
|
const reason = error instanceof Error ? error.message : String(error);
|
|
128
132
|
log.warn({
|
|
@@ -33,9 +33,9 @@ export declare const RuntimeCommandSchema: z.ZodObject<{
|
|
|
33
33
|
intents: z.ZodArray<z.ZodEnum<{
|
|
34
34
|
review: "review";
|
|
35
35
|
coding: "coding";
|
|
36
|
+
vision: "vision";
|
|
36
37
|
fast: "fast";
|
|
37
38
|
reasoning: "reasoning";
|
|
38
|
-
vision: "vision";
|
|
39
39
|
understanding: "understanding";
|
|
40
40
|
}>>;
|
|
41
41
|
allow: z.ZodArray<z.ZodString>;
|
|
@@ -119,9 +119,9 @@ export declare const AgentManifestSchema: z.ZodObject<{
|
|
|
119
119
|
intents: z.ZodArray<z.ZodEnum<{
|
|
120
120
|
review: "review";
|
|
121
121
|
coding: "coding";
|
|
122
|
+
vision: "vision";
|
|
122
123
|
fast: "fast";
|
|
123
124
|
reasoning: "reasoning";
|
|
124
|
-
vision: "vision";
|
|
125
125
|
understanding: "understanding";
|
|
126
126
|
}>>;
|
|
127
127
|
allow: z.ZodArray<z.ZodString>;
|
|
@@ -16,6 +16,9 @@ var init_env_keys = __esmMin((() => {
|
|
|
16
16
|
openai: ["OPENAI_API_KEY"],
|
|
17
17
|
anthropic: ["ANTHROPIC_OAUTH_TOKEN", "ANTHROPIC_API_KEY"],
|
|
18
18
|
deepseek: ["DEEPSEEK_API_KEY"],
|
|
19
|
+
"qwen-token-plan-cn": ["QWEN_TOKEN_PLAN_CN_API_KEY"],
|
|
20
|
+
"qwen-token-plan": ["QWEN_TOKEN_PLAN_API_KEY"],
|
|
21
|
+
"qwen-token-plan-individual": ["QWEN_TOKEN_PLAN_API_KEY"],
|
|
19
22
|
google: ["GEMINI_API_KEY", "GOOGLE_API_KEY"],
|
|
20
23
|
"google-vertex": [
|
|
21
24
|
"GOOGLE_CLOUD_API_KEY",
|
|
@@ -1,11 +1,13 @@
|
|
|
1
1
|
import { createLogger } from "../utils/logger/index.js";
|
|
2
2
|
import { init_logger } from "../utils/logger.js";
|
|
3
|
+
import { assertProviderUsage, init_model_usage } from "./model-usage.js";
|
|
3
4
|
import "./constants.js";
|
|
4
5
|
import { getProviderRegistry, init_plugin_registry } from "./plugin-registry.js";
|
|
5
6
|
import { init_providers } from "./index.js";
|
|
6
7
|
import { stripPromptCacheBoundary } from "../agent/prompt/cache-boundary.js";
|
|
7
8
|
import { createAssistantMessageEventStream, getCurrentSystemPrompt, getCurrentTools, streamSimple } from "@earendil-works/pi-ai/compat";
|
|
8
9
|
//#region src/providers/extension-stream-bridge.ts
|
|
10
|
+
init_model_usage();
|
|
9
11
|
init_plugin_registry();
|
|
10
12
|
init_providers();
|
|
11
13
|
init_logger();
|
|
@@ -70,6 +72,7 @@ function collectExtraStreamOptions(options) {
|
|
|
70
72
|
/** Wraps {@link streamSimple} so extension-registered models use the plugin `createStream()` path. */
|
|
71
73
|
function createExtensionAwareStreamFn() {
|
|
72
74
|
return ((model, context, options) => {
|
|
75
|
+
assertProviderUsage(model.provider, model.baseUrl);
|
|
73
76
|
if (model.baseUrl !== "extension://provider-plugin") return streamSimple(model, context, options);
|
|
74
77
|
const plugin = getProviderRegistry().get(model.provider);
|
|
75
78
|
if (!plugin) return streamSimple(model, context, options);
|
|
@@ -468,6 +468,21 @@ var init_providers = __esmMin((() => {
|
|
|
468
468
|
category: "specialty",
|
|
469
469
|
supportsApiKey: true
|
|
470
470
|
},
|
|
471
|
+
"qwen-token-plan-cn": {
|
|
472
|
+
name: "Alibaba Bailian Subscription (China)",
|
|
473
|
+
category: "domestic",
|
|
474
|
+
supportsApiKey: true
|
|
475
|
+
},
|
|
476
|
+
"qwen-token-plan": {
|
|
477
|
+
name: "Qwen Token Plan (International)",
|
|
478
|
+
category: "domestic",
|
|
479
|
+
supportsApiKey: true
|
|
480
|
+
},
|
|
481
|
+
"qwen-token-plan-individual": {
|
|
482
|
+
name: "Qwen Token Plan Individual (International)",
|
|
483
|
+
category: "domestic",
|
|
484
|
+
supportsApiKey: true
|
|
485
|
+
},
|
|
471
486
|
"dashscope": {
|
|
472
487
|
name: "DashScope (Alibaba)",
|
|
473
488
|
category: "domestic",
|
|
@@ -7,10 +7,13 @@ export declare function resolveModelCallOptions(model: Model<Api>, options?: Sim
|
|
|
7
7
|
/**
|
|
8
8
|
* Complete a one-shot request with xopc credential resolution and extension-provider routing.
|
|
9
9
|
*/
|
|
10
|
-
|
|
10
|
+
declare function completeWithResolvedCredentialsInner(model: Model<Api>, context: Context, options: SimpleStreamOptions, credentialOptions: CredentialResolverOptions | undefined, usageContext: AiUsageContext): Promise<AssistantMessage>;
|
|
11
11
|
/**
|
|
12
12
|
* Start a model stream with xopc credential resolution and extension-provider routing.
|
|
13
13
|
* Callers that need live visible output should consume the returned stream before calling
|
|
14
14
|
* its `result()` method.
|
|
15
15
|
*/
|
|
16
|
-
|
|
16
|
+
declare function createResolvedModelStreamInner(model: Model<Api>, context: Context, options: SimpleStreamOptions, credentialOptions: CredentialResolverOptions | undefined, usageContext: AiUsageContext): Promise<import("@earendil-works/pi-ai/compat").AssistantMessageEventStream>;
|
|
17
|
+
export declare function completeWithResolvedCredentials(...args: Parameters<typeof completeWithResolvedCredentialsInner>): Promise<AssistantMessage>;
|
|
18
|
+
export declare function createResolvedModelStream(...args: Parameters<typeof createResolvedModelStreamInner>): Promise<import("@earendil-works/pi-ai/compat").AssistantMessageEventStream>;
|
|
19
|
+
export {};
|
|
@@ -1,3 +1,4 @@
|
|
|
1
|
+
import { assertProviderUsage, init_model_usage, modelUsageOriginForCall, withModelUsageOrigin } from "./model-usage.js";
|
|
1
2
|
import { init_constants } from "./constants.js";
|
|
2
3
|
import { getApiKey, init_providers } from "./index.js";
|
|
3
4
|
import { createExtensionAwareStreamFn } from "./extension-stream-bridge.js";
|
|
@@ -6,6 +7,7 @@ import { finishAiUsageFromMessage, observeAiUsageStream, startAiUsageCall } from
|
|
|
6
7
|
import { assertCloudCreditBudgetActive, cloudCreditBudgetHeaders, reportCloudCreditError } from "./xopc-cloud-credit-budget.js";
|
|
7
8
|
import { completeSimple, normalizeContext } from "@earendil-works/pi-ai/compat";
|
|
8
9
|
//#region src/providers/model-call.ts
|
|
10
|
+
init_model_usage();
|
|
9
11
|
init_constants();
|
|
10
12
|
init_providers();
|
|
11
13
|
function isLocalModelBaseUrl(baseUrl) {
|
|
@@ -28,6 +30,7 @@ async function resolveModelCallApiKey(model, credentialOptions) {
|
|
|
28
30
|
}
|
|
29
31
|
async function resolveModelCallOptions(model, options = {}, credentialOptions) {
|
|
30
32
|
assertCloudCreditBudgetActive();
|
|
33
|
+
assertProviderUsage(model.provider, model.baseUrl);
|
|
31
34
|
if (model.provider === "xopc-cloud") options = withCloudUsageResponse(options);
|
|
32
35
|
const apiKey = options.apiKey ?? await resolveModelCallApiKey(model, credentialOptions);
|
|
33
36
|
if (!apiKey) throw new Error(`No API key for provider: ${model.provider}`);
|
|
@@ -45,7 +48,8 @@ async function resolveModelCallOptions(model, options = {}, credentialOptions) {
|
|
|
45
48
|
/**
|
|
46
49
|
* Complete a one-shot request with xopc credential resolution and extension-provider routing.
|
|
47
50
|
*/
|
|
48
|
-
async function
|
|
51
|
+
async function completeWithResolvedCredentialsInner(model, context, options, credentialOptions, usageContext) {
|
|
52
|
+
if (usageContext.trigger === "scheduled" || usageContext.trigger === "system") withModelUsageOrigin("background", () => assertProviderUsage(model.provider, model.baseUrl));
|
|
49
53
|
const resolvedOptions = await resolveModelCallOptions(model, options, credentialOptions);
|
|
50
54
|
const usageCall = startAiUsageCall(model, usageContext, {
|
|
51
55
|
context,
|
|
@@ -79,7 +83,8 @@ async function completeWithResolvedCredentials(model, context, options, credenti
|
|
|
79
83
|
* Callers that need live visible output should consume the returned stream before calling
|
|
80
84
|
* its `result()` method.
|
|
81
85
|
*/
|
|
82
|
-
async function
|
|
86
|
+
async function createResolvedModelStreamInner(model, context, options, credentialOptions, usageContext) {
|
|
87
|
+
if (usageContext.trigger === "scheduled" || usageContext.trigger === "system") withModelUsageOrigin("background", () => assertProviderUsage(model.provider, model.baseUrl));
|
|
83
88
|
const resolvedOptions = await resolveModelCallOptions(model, options, credentialOptions);
|
|
84
89
|
const usageCall = startAiUsageCall(model, usageContext, {
|
|
85
90
|
context,
|
|
@@ -103,5 +108,11 @@ async function createResolvedModelStream(model, context, options, credentialOpti
|
|
|
103
108
|
throw error;
|
|
104
109
|
}
|
|
105
110
|
}
|
|
111
|
+
function completeWithResolvedCredentials(...args) {
|
|
112
|
+
return withModelUsageOrigin(modelUsageOriginForCall(args[4]), () => completeWithResolvedCredentialsInner(...args));
|
|
113
|
+
}
|
|
114
|
+
function createResolvedModelStream(...args) {
|
|
115
|
+
return withModelUsageOrigin(modelUsageOriginForCall(args[4]), () => createResolvedModelStreamInner(...args));
|
|
116
|
+
}
|
|
106
117
|
//#endregion
|
|
107
118
|
export { completeWithResolvedCredentials, createResolvedModelStream, isLocalModelBaseUrl, resolveModelCallApiKey, resolveModelCallOptions };
|
|
@@ -33,6 +33,7 @@ function collectModelPolicy(out, value, location) {
|
|
|
33
33
|
addRef(out, chat.primary, `${location}.chat.primary`);
|
|
34
34
|
if (Array.isArray(chat.fallbacks)) chat.fallbacks.forEach((ref, index) => addRef(out, ref, `${location}.chat.fallbacks[${index}]`));
|
|
35
35
|
}
|
|
36
|
+
collectToolModel(out, policy.background, `${location}.background`);
|
|
36
37
|
const intents = asRecord(policy.intents);
|
|
37
38
|
for (const [intent, routeValue] of Object.entries(intents ?? {})) {
|
|
38
39
|
const route = asRecord(routeValue);
|
|
@@ -46,7 +46,7 @@ function extractAssistantText(content) {
|
|
|
46
46
|
/** True when retrying a model request may recover from a transport or upstream 5xx failure. */
|
|
47
47
|
function isTransientProviderErrorMessage(message) {
|
|
48
48
|
const lower = message.toLowerCase();
|
|
49
|
-
if (/insufficient_quota|usage_limit_reached|usage_not_included|credit_budget_exhausted/.test(lower)) return false;
|
|
49
|
+
if (/provider_usage_scope_denied|insufficient_quota|usage_limit_reached|usage_not_included|credit_budget_exhausted/.test(lower)) return false;
|
|
50
50
|
return TRANSIENT_PROVIDER_ERROR_SUBSTRINGS.some((value) => lower.includes(value)) || lower.trim() === "terminated" || /(?:^|\D)(?:408|409|429|500|502|503|504|529)(?:\D|$)/.test(lower);
|
|
51
51
|
}
|
|
52
52
|
function stripCodeFences(raw) {
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
import type { TurnOrigin } from '@xopcai/endpoint-tools-protocol';
|
|
2
|
+
import type { AiUsageContext } from '../usage/types.js';
|
|
3
|
+
export type ModelUsageOrigin = 'interactive' | 'background' | 'unknown';
|
|
4
|
+
export declare const getModelUsageOrigin: () => ModelUsageOrigin;
|
|
5
|
+
export declare function modelUsageOriginForCall(context: AiUsageContext): ModelUsageOrigin;
|
|
6
|
+
/** A nested task cannot upgrade its parent's background/unknown scope. */
|
|
7
|
+
export declare function withModelUsageOrigin<T>(origin: ModelUsageOrigin, run: () => T): T;
|
|
8
|
+
export declare function modelUsageOriginFromTurn(origin?: TurnOrigin): ModelUsageOrigin;
|
|
9
|
+
export declare class ProviderUsageScopeError extends Error {
|
|
10
|
+
readonly code = "provider_usage_scope_denied";
|
|
11
|
+
constructor(provider: string, origin: ModelUsageOrigin);
|
|
12
|
+
}
|
|
13
|
+
/** Transport wrappers may preserve only the error message or code. */
|
|
14
|
+
export declare function isProviderUsageScopeError(error: unknown): boolean;
|
|
15
|
+
export declare function assertProviderUsage(provider: string, baseUrl?: string): void;
|
|
@@ -0,0 +1,50 @@
|
|
|
1
|
+
import { __esmMin } from "../../_virtual/_rolldown/runtime.js";
|
|
2
|
+
import { init_profiles, isInteractiveOnlyProvider } from "./setup/profiles.js";
|
|
3
|
+
import { init_scenario_registry, resolveAiUsageScenario } from "../usage/scenario-registry.js";
|
|
4
|
+
import { AsyncLocalStorage } from "node:async_hooks";
|
|
5
|
+
//#region src/providers/model-usage.ts
|
|
6
|
+
function modelUsageOriginForCall(context) {
|
|
7
|
+
const trigger = context.trigger ?? resolveAiUsageScenario(context.operation).trigger;
|
|
8
|
+
return trigger === "user" ? "interactive" : trigger === "system" || trigger === "scheduled" ? "background" : getModelUsageOrigin();
|
|
9
|
+
}
|
|
10
|
+
/** A nested task cannot upgrade its parent's background/unknown scope. */
|
|
11
|
+
function withModelUsageOrigin(origin, run) {
|
|
12
|
+
const parent = scopes.getStore();
|
|
13
|
+
const effective = parent === "background" || origin === "background" ? "background" : parent === "unknown" ? "unknown" : origin;
|
|
14
|
+
return scopes.run(effective, run);
|
|
15
|
+
}
|
|
16
|
+
function modelUsageOriginFromTurn(origin) {
|
|
17
|
+
if (!origin) return "unknown";
|
|
18
|
+
if (origin.type !== "system" || origin.source === "cli") return "interactive";
|
|
19
|
+
if ([
|
|
20
|
+
"workflow",
|
|
21
|
+
"internal",
|
|
22
|
+
"task_update"
|
|
23
|
+
].includes(origin.source)) return scopes.getStore() ?? "background";
|
|
24
|
+
return "background";
|
|
25
|
+
}
|
|
26
|
+
/** Transport wrappers may preserve only the error message or code. */
|
|
27
|
+
function isProviderUsageScopeError(error) {
|
|
28
|
+
return error instanceof ProviderUsageScopeError || Boolean(error && typeof error === "object" && "code" in error && error.code === "provider_usage_scope_denied") || (error instanceof Error ? error.message : typeof error === "string" ? error : "").includes("provider_usage_scope_denied");
|
|
29
|
+
}
|
|
30
|
+
function assertProviderUsage(provider, baseUrl) {
|
|
31
|
+
const origin = getModelUsageOrigin();
|
|
32
|
+
if (origin !== "interactive" && isInteractiveOnlyProvider(provider, baseUrl)) throw new ProviderUsageScopeError(provider, origin);
|
|
33
|
+
}
|
|
34
|
+
var scopes, getModelUsageOrigin, ProviderUsageScopeError;
|
|
35
|
+
var init_model_usage = __esmMin((() => {
|
|
36
|
+
init_profiles();
|
|
37
|
+
init_scenario_registry();
|
|
38
|
+
scopes = new AsyncLocalStorage();
|
|
39
|
+
getModelUsageOrigin = () => scopes.getStore() ?? "unknown";
|
|
40
|
+
ProviderUsageScopeError = class extends Error {
|
|
41
|
+
code = "provider_usage_scope_denied";
|
|
42
|
+
constructor(provider, origin) {
|
|
43
|
+
super(`provider_usage_scope_denied: ${provider} requires an interactive user turn; ${origin} calls need a background-capable model.`);
|
|
44
|
+
this.name = "ProviderUsageScopeError";
|
|
45
|
+
}
|
|
46
|
+
};
|
|
47
|
+
}));
|
|
48
|
+
//#endregion
|
|
49
|
+
init_model_usage();
|
|
50
|
+
export { ProviderUsageScopeError, assertProviderUsage, getModelUsageOrigin, init_model_usage, isProviderUsageScopeError, modelUsageOriginForCall, modelUsageOriginFromTurn, withModelUsageOrigin };
|
|
@@ -8,6 +8,7 @@ init_plugin_registry();
|
|
|
8
8
|
init_model_policy();
|
|
9
9
|
const FEATURED_PROVIDER_ORDER = [
|
|
10
10
|
"xopc-cloud",
|
|
11
|
+
"qwen-token-plan-cn",
|
|
11
12
|
"deepseek",
|
|
12
13
|
"openai",
|
|
13
14
|
"anthropic",
|
|
@@ -38,6 +39,7 @@ const FEATURED_PROVIDER_ORDER = [
|
|
|
38
39
|
];
|
|
39
40
|
const PROVIDER_HINTS = {
|
|
40
41
|
"xopc-cloud": "Official XOPC model service with models discovered from your account.",
|
|
42
|
+
"qwen-token-plan-cn": "Alibaba Bailian subscription: one key for chat, vision and image generation.",
|
|
41
43
|
openai: "Frontier OpenAI models from the official API.",
|
|
42
44
|
anthropic: "Claude models for coding, long context, and reasoning.",
|
|
43
45
|
xai: "Grok models from xAI.",
|
|
@@ -76,6 +78,12 @@ const PROVIDER_HINTS = {
|
|
|
76
78
|
};
|
|
77
79
|
const RECOMMENDED_MODEL_PATTERNS = {
|
|
78
80
|
"xopc-cloud": [/^auto$/],
|
|
81
|
+
"qwen-token-plan-cn": [
|
|
82
|
+
/^qwen3\.8-flash$/i,
|
|
83
|
+
/^qwen3\.8-max$/i,
|
|
84
|
+
/^qwen3\.7-plus$/i,
|
|
85
|
+
/^qwen3\.6-flash$/i
|
|
86
|
+
],
|
|
79
87
|
openai: [
|
|
80
88
|
/^gpt-6-sol$/i,
|
|
81
89
|
/^gpt-6-luna$/i,
|