@ai-setting/roy-agent-core 1.7.52 → 1.7.53
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/config/config-component.d.ts +346 -0
- package/dist/config/config-parser.d.ts +45 -0
- package/dist/config/env-key.d.ts +97 -0
- package/dist/config/env-source.d.ts +113 -0
- package/dist/config/file-source.d.ts +90 -0
- package/dist/config/index.d.ts +4 -0
- package/dist/config/protocol-resolver.d.ts +94 -0
- package/dist/env/agent/agent-component.d.ts +646 -0
- package/dist/env/agent/agent-config-registration.d.ts +18 -0
- package/dist/env/agent/agent-registry.d.ts +500 -0
- package/dist/env/agent/index.d.ts +9 -0
- package/dist/env/agent/summary-agent.d.ts +44 -0
- package/dist/env/agent/types.d.ts +503 -0
- package/dist/env/commands/commands-component.d.ts +97 -0
- package/dist/env/commands/commands-config-registration.d.ts +19 -0
- package/dist/env/commands/index.d.ts +7 -0
- package/dist/env/commands/parser.d.ts +18 -0
- package/dist/env/commands/types.d.ts +133 -0
- package/dist/env/component.d.ts +186 -0
- package/dist/env/constants.d.ts +112 -0
- package/dist/env/context/env-context.d.ts +420 -0
- package/dist/env/context/env-event.d.ts +144 -0
- package/dist/env/context/index.d.ts +13 -0
- package/dist/env/debug/debug-component.d.ts +160 -0
- package/dist/env/debug/formatters/index.d.ts +8 -0
- package/dist/env/debug/formatters/repl-formatter.d.ts +80 -0
- package/dist/env/debug/formatters/trace-formatter.d.ts +43 -0
- package/dist/env/debug/formatters/tree-formatter.d.ts +72 -0
- package/dist/env/debug/index.d.ts +15 -0
- package/dist/env/debug/index.js +1 -1
- package/dist/env/debug/parser/regex-parser.d.ts +49 -0
- package/dist/env/debug/parser/span-builder.d.ts +79 -0
- package/dist/env/debug/reader/log-reader.d.ts +55 -0
- package/dist/env/debug/reader/span-db-reader.d.ts +70 -0
- package/dist/env/debug/types.d.ts +145 -0
- package/dist/env/environment.d.ts +185 -0
- package/dist/env/errors.d.ts +120 -0
- package/dist/env/event-source/bounty-cli-handler.d.ts +42 -0
- package/dist/env/event-source/bounty-im-handler.d.ts +232 -0
- package/dist/env/event-source/event-source-component.d.ts +177 -0
- package/dist/env/event-source/event-source-config-registration.d.ts +18 -0
- package/dist/env/event-source/event-source-handlers.d.ts +486 -0
- package/dist/env/event-source/event-store.d.ts +110 -0
- package/dist/env/event-source/idempotency-key.d.ts +19 -0
- package/dist/env/event-source/index.d.ts +15 -0
- package/dist/env/event-source/index.js +2 -2
- package/dist/env/event-source/timer-handler.d.ts +74 -0
- package/dist/env/event-source/types.d.ts +803 -0
- package/dist/env/hook/global-hook-manager.d.ts +73 -0
- package/dist/env/hook/hook-manager.d.ts +139 -0
- package/dist/env/hook/index.d.ts +9 -0
- package/dist/env/hook/types.d.ts +107 -0
- package/dist/env/index.d.ts +24 -0
- package/dist/env/index.js +4 -4
- package/dist/env/interface.d.ts +156 -0
- package/dist/env/lark-mention-utils.d.ts +59 -0
- package/dist/env/llm/adapter-ai-sdk.d.ts +10 -0
- package/dist/env/llm/adapter-pi-ai.d.ts +39 -0
- package/dist/env/llm/adapter.d.ts +80 -0
- package/dist/env/llm/factory.d.ts +13 -0
- package/dist/env/llm/hooks.d.ts +150 -0
- package/dist/env/llm/index.d.ts +16 -0
- package/dist/env/llm/invoke.d.ts +264 -0
- package/dist/env/llm/llm-cache.d.ts +38 -0
- package/dist/env/llm/llm.d.ts +238 -0
- package/dist/env/llm/opencode-session.d.ts +79 -0
- package/dist/env/llm/provider.d.ts +40 -0
- package/dist/env/llm/tool-args-parser.d.ts +77 -0
- package/dist/env/llm/tool-schema.d.ts +54 -0
- package/dist/env/llm/transform.d.ts +57 -0
- package/dist/env/llm/types.d.ts +818 -0
- package/dist/env/log-trace/decorator.d.ts +88 -0
- package/dist/env/log-trace/index.d.ts +14 -0
- package/dist/env/log-trace/log-trace-component.d.ts +268 -0
- package/dist/env/log-trace/log-trace-config-registration.d.ts +25 -0
- package/dist/env/log-trace/logger.d.ts +83 -0
- package/dist/env/log-trace/opentelemetry/cli-propagation.d.ts +105 -0
- package/dist/env/log-trace/opentelemetry/mod.d.ts +24 -0
- package/dist/env/log-trace/opentelemetry/propagation-env.d.ts +81 -0
- package/dist/env/log-trace/opentelemetry/propagation.d.ts +79 -0
- package/dist/env/log-trace/opentelemetry/tracer-provider.d.ts +157 -0
- package/dist/env/log-trace/span-storage.d.ts +37 -0
- package/dist/env/log-trace/trace-context.d.ts +28 -0
- package/dist/env/log-trace/types.d.ts +127 -0
- package/dist/env/mcp/command-resolver.d.ts +12 -0
- package/dist/env/mcp/config.d.ts +103 -0
- package/dist/env/mcp/index.d.ts +13 -0
- package/dist/env/mcp/loader.d.ts +78 -0
- package/dist/env/mcp/mcp-component.d.ts +54 -0
- package/dist/env/mcp/mcp-config-registration.d.ts +19 -0
- package/dist/env/mcp/npm-prefix/index.d.ts +17 -0
- package/dist/env/mcp/scanner.d.ts +38 -0
- package/dist/env/mcp/tool/adapter.d.ts +32 -0
- package/dist/env/mcp/tool/index.d.ts +4 -0
- package/dist/env/mcp/types.d.ts +131 -0
- package/dist/env/memory/built-in/index.d.ts +41 -0
- package/dist/env/memory/built-in/recall-memory.d.ts +29 -0
- package/dist/env/memory/built-in/record-memory.d.ts +44 -0
- package/dist/env/memory/index.d.ts +10 -0
- package/dist/env/memory/memory-component.d.ts +114 -0
- package/dist/env/memory/memory-config-registration.d.ts +18 -0
- package/dist/env/memory/memory-config.d.ts +18 -0
- package/dist/env/memory/plugin/index.d.ts +16 -0
- package/dist/env/memory/plugin/memory-agent.d.ts +126 -0
- package/dist/env/memory/plugin/memory-manager.d.ts +71 -0
- package/dist/env/memory/plugin/memory-plugin.d.ts +103 -0
- package/dist/env/memory/plugin/recall-memory.d.ts +16 -0
- package/dist/env/memory/plugin/types.d.ts +75 -0
- package/dist/env/memory/tools/memory-agent-tools.d.ts +109 -0
- package/dist/env/memory/types.d.ts +80 -0
- package/dist/env/paths.d.ts +46 -0
- package/dist/env/plugin/bounty-cli-notification-channel.d.ts +60 -0
- package/dist/env/plugin/event-bus-notification-channel.d.ts +50 -0
- package/dist/env/plugin/index.d.ts +13 -0
- package/dist/env/plugin/lark-cli-notification-channel.d.ts +61 -0
- package/dist/env/plugin/notification-channel.d.ts +143 -0
- package/dist/env/plugin/plugin-component.d.ts +232 -0
- package/dist/env/plugin/types.d.ts +146 -0
- package/dist/env/prompt/index.d.ts +7 -0
- package/dist/env/prompt/prompt-component.d.ts +194 -0
- package/dist/env/prompt/prompt-config-registration.d.ts +18 -0
- package/dist/env/prompt/prompt-store.d.ts +26 -0
- package/dist/env/prompt/prompts-index.d.ts +146 -0
- package/dist/env/prompt/renderer.d.ts +21 -0
- package/dist/env/prompt/types.d.ts +176 -0
- package/dist/env/session/hooks.d.ts +14 -0
- package/dist/env/session/index.d.ts +19 -0
- package/dist/env/session/search-query-parser.d.ts +41 -0
- package/dist/env/session/session-component.d.ts +464 -0
- package/dist/env/session/session-config-registration.d.ts +18 -0
- package/dist/env/session/session-id.d.ts +26 -0
- package/dist/env/session/session-message-converter.d.ts +142 -0
- package/dist/env/session/session-store.d.ts +188 -0
- package/dist/env/session/storage/index.d.ts +5 -0
- package/dist/env/session/storage/memory.d.ts +119 -0
- package/dist/env/session/storage/sqlite.d.ts +108 -0
- package/dist/env/session/types.d.ts +705 -0
- package/dist/env/session-tree-stopper.d.ts +79 -0
- package/dist/env/skill/config.d.ts +13 -0
- package/dist/env/skill/index.d.ts +6 -0
- package/dist/env/skill/parser.d.ts +9 -0
- package/dist/env/skill/scanner.d.ts +25 -0
- package/dist/env/skill/skill-component.d.ts +89 -0
- package/dist/env/skill/skill-config-registration.d.ts +18 -0
- package/dist/env/skill/tool/index.d.ts +1 -0
- package/dist/env/skill/tool/skill-tool.d.ts +15 -0
- package/dist/env/skill/types.d.ts +61 -0
- package/dist/env/task/backend/index.d.ts +24 -0
- package/dist/env/task/backend/index.js +704 -0
- package/dist/env/task/backend/roy-sidecar-task-port.d.ts +148 -0
- package/dist/env/task/backend/sqlite-task-port.d.ts +28 -0
- package/dist/env/task/backend/task-store-backend.d.ts +107 -0
- package/dist/env/task/backend/types.d.ts +293 -0
- package/dist/env/task/delegate/bg-task-id-storage.d.ts +9 -0
- package/dist/env/task/delegate/delegate-tool.d.ts +681 -0
- package/dist/env/task/delegate/index.d.ts +8 -0
- package/dist/env/task/delegate/process-registry.d.ts +58 -0
- package/dist/env/task/delegate/stop-tool.d.ts +12 -0
- package/dist/env/task/delegate/subagent-resolver.d.ts +25 -0
- package/dist/env/task/events/index.d.ts +7 -0
- package/dist/env/task/events/task-event-payloads.d.ts +101 -0
- package/dist/env/task/events/task-event-types.d.ts +23 -0
- package/dist/env/task/hooks/contexts.d.ts +191 -0
- package/dist/env/task/hooks/index.d.ts +7 -0
- package/dist/env/task/hooks/task-hook-points.d.ts +42 -0
- package/dist/env/task/index.d.ts +7 -0
- package/dist/env/task/plugins/auto-task-plugin.d.ts +38 -0
- package/dist/env/task/plugins/card-chat-routing.d.ts +135 -0
- package/dist/env/task/plugins/fake-user-message-helper.d.ts +90 -0
- package/dist/env/task/plugins/index.d.ts +8 -0
- package/dist/env/task/plugins/index.js +1 -1
- package/dist/env/task/plugins/lark-card-action-handler.d.ts +166 -0
- package/dist/env/task/plugins/lark-card-patch-notifier.d.ts +651 -0
- package/dist/env/task/plugins/lark-cli-task-notify-plugin.d.ts +248 -0
- package/dist/env/task/plugins/max-iteration-reminder-plugin.d.ts +112 -0
- package/dist/env/task/plugins/per-task-group-chat-plugin.d.ts +561 -0
- package/dist/env/task/plugins/task-tag-plugin.d.ts +70 -0
- package/dist/env/task/plugins/workflow-extractor-agent.d.ts +43 -0
- package/dist/env/task/registry-hook-installer.d.ts +43 -0
- package/dist/env/task/storage/index.d.ts +5 -0
- package/dist/env/task/storage/migrations/001_add_project_path_context.d.ts +14 -0
- package/dist/env/task/storage/migrations/002_add_task_type.d.ts +14 -0
- package/dist/env/task/storage/migrations/003_add_process_description.d.ts +20 -0
- package/dist/env/task/storage/migrations/004_rename_action_to_milestone.d.ts +37 -0
- package/dist/env/task/storage/migrations/005_convert_blob_description_to_text.d.ts +51 -0
- package/dist/env/task/storage/sqlite-task-store.d.ts +241 -0
- package/dist/env/task/tag-service.d.ts +138 -0
- package/dist/env/task/task-child-context.d.ts +70 -0
- package/dist/env/task/task-component.d.ts +270 -0
- package/dist/env/task/task-config-registration.d.ts +19 -0
- package/dist/env/task/task-creation-registry.d.ts +181 -0
- package/dist/env/task/task-reuse-context.d.ts +52 -0
- package/dist/env/task/task-reuse-registry.d.ts +31 -0
- package/dist/env/task/tools/batch-archive-tool.d.ts +9 -0
- package/dist/env/task/tools/batch-delete-tool.d.ts +9 -0
- package/dist/env/task/tools/complete-tool.d.ts +12 -0
- package/dist/env/task/tools/create-tool.d.ts +6 -0
- package/dist/env/task/tools/delete-tool.d.ts +6 -0
- package/dist/env/task/tools/get-tool.d.ts +6 -0
- package/dist/env/task/tools/index.d.ts +13 -0
- package/dist/env/task/tools/list-tool.d.ts +6 -0
- package/dist/env/task/tools/operation/create-tool.d.ts +12 -0
- package/dist/env/task/tools/operation/delete-tool.d.ts +6 -0
- package/dist/env/task/tools/operation/get-tool.d.ts +6 -0
- package/dist/env/task/tools/operation/index.d.ts +8 -0
- package/dist/env/task/tools/operation/list-tool.d.ts +6 -0
- package/dist/env/task/tools/operation/operation-types.d.ts +225 -0
- package/dist/env/task/tools/operation/update-tool.d.ts +6 -0
- package/dist/env/task/tools/search-tool.d.ts +9 -0
- package/dist/env/task/tools/task-tree-tool.d.ts +65 -0
- package/dist/env/task/tools/task-types.d.ts +255 -0
- package/dist/env/task/tools/update-tool.d.ts +6 -0
- package/dist/env/task/types.d.ts +290 -0
- package/dist/env/tool/built-in/bash-effect.d.ts +36 -0
- package/dist/env/tool/built-in/bash.d.ts +16 -0
- package/dist/env/tool/built-in/echo.d.ts +7 -0
- package/dist/env/tool/built-in/edit-file.d.ts +6 -0
- package/dist/env/tool/built-in/glob.d.ts +6 -0
- package/dist/env/tool/built-in/grep.d.ts +6 -0
- package/dist/env/tool/built-in/index.d.ts +39 -0
- package/dist/env/tool/built-in/query-background-process-tool.d.ts +113 -0
- package/dist/env/tool/built-in/read-file.d.ts +5 -0
- package/dist/env/tool/built-in/understand-image.d.ts +59 -0
- package/dist/env/tool/built-in/write-file.d.ts +5 -0
- package/dist/env/tool/index.d.ts +16 -0
- package/dist/env/tool/registry.d.ts +61 -0
- package/dist/env/tool/tool-component.d.ts +242 -0
- package/dist/env/tool/tool-config-registration.d.ts +18 -0
- package/dist/env/tool/types.d.ts +274 -0
- package/dist/env/tool/validator.d.ts +14 -0
- package/dist/env/types.d.ts +184 -0
- package/dist/env/workflow/decorators/decorator-node.d.ts +76 -0
- package/dist/env/workflow/decorators/edge.d.ts +42 -0
- package/dist/env/workflow/decorators/index.d.ts +13 -0
- package/dist/env/workflow/decorators/node-as.d.ts +40 -0
- package/dist/env/workflow/decorators/workflow.d.ts +30 -0
- package/dist/env/workflow/engine/dag-manager.d.ts +176 -0
- package/dist/env/workflow/engine/engine.d.ts +375 -0
- package/dist/env/workflow/engine/event-bus.d.ts +54 -0
- package/dist/env/workflow/engine/executor.d.ts +122 -0
- package/dist/env/workflow/engine/index.d.ts +15 -0
- package/dist/env/workflow/engine/node-registry.d.ts +159 -0
- package/dist/env/workflow/engine/scheduler.d.ts +164 -0
- package/dist/env/workflow/extractor/workflow-converter.d.ts +55 -0
- package/dist/env/workflow/fixtures.d.ts +401 -0
- package/dist/env/workflow/hooks/index.d.ts +4 -0
- package/dist/env/workflow/hooks/workflow-hook-points.d.ts +161 -0
- package/dist/env/workflow/index.d.ts +30 -0
- package/dist/env/workflow/index.js +1 -1
- package/dist/env/workflow/metadata/keys.d.ts +6 -0
- package/dist/env/workflow/nodes/agent-component-adapter.d.ts +175 -0
- package/dist/env/workflow/nodes/agent-node.d.ts +206 -0
- package/dist/env/workflow/nodes/ask-user-node.d.ts +66 -0
- package/dist/env/workflow/nodes/condition-node.d.ts +39 -0
- package/dist/env/workflow/nodes/index.d.ts +8 -0
- package/dist/env/workflow/nodes/merge-node.d.ts +40 -0
- package/dist/env/workflow/nodes/python-call-node.d.ts +95 -0
- package/dist/env/workflow/nodes/skill-node.d.ts +29 -0
- package/dist/env/workflow/nodes/tool-node.d.ts +58 -0
- package/dist/env/workflow/nodes/workflow-node.d.ts +118 -0
- package/dist/env/workflow/plugins/index.d.ts +6 -0
- package/dist/env/workflow/plugins/lark-cli-workflow-notify-plugin.d.ts +107 -0
- package/dist/env/workflow/plugins/workflow-json-output-plugin.d.ts +166 -0
- package/dist/env/workflow/runtime/runtime-cancellation-scope.d.ts +121 -0
- package/dist/env/workflow/service/index.d.ts +9 -0
- package/dist/env/workflow/service/registry.d.ts +37 -0
- package/dist/env/workflow/service/workflow-service.d.ts +422 -0
- package/dist/env/workflow/storage/index.d.ts +11 -0
- package/dist/env/workflow/storage/mock-repositories.d.ts +106 -0
- package/dist/env/workflow/storage/safe-json.d.ts +62 -0
- package/dist/env/workflow/storage/sqlite.d.ts +57 -0
- package/dist/env/workflow/storage/tag-repo.d.ts +65 -0
- package/dist/env/workflow/storage/workflow-repo.d.ts +161 -0
- package/dist/env/workflow/tools/ask-user-tool.d.ts +35 -0
- package/dist/env/workflow/tools/index.d.ts +16 -0
- package/dist/env/workflow/tools/run-workflow.d.ts +130 -0
- package/dist/env/workflow/tools/submit-json-output-tool.d.ts +38 -0
- package/dist/env/workflow/tools/workflow-add-tool.d.ts +47 -0
- package/dist/env/workflow/tools/workflow-get-tool.d.ts +29 -0
- package/dist/env/workflow/tools/workflow-list-tool.d.ts +55 -0
- package/dist/env/workflow/tools/workflow-run-status-tool.d.ts +26 -0
- package/dist/env/workflow/tools/workflow-run-stop-tool.d.ts +29 -0
- package/dist/env/workflow/tools/workflow-search-tool.d.ts +33 -0
- package/dist/env/workflow/tools/workflow-tag-list-tool.d.ts +59 -0
- package/dist/env/workflow/tools/workflow-validate-tool.d.ts +60 -0
- package/dist/env/workflow/types/context.d.ts +17 -0
- package/dist/env/workflow/types/decorators-types.d.ts +182 -0
- package/dist/env/workflow/types/edge.d.ts +33 -0
- package/dist/env/workflow/types/event.d.ts +869 -0
- package/dist/env/workflow/types/index.d.ts +16 -0
- package/dist/env/workflow/types/run.d.ts +235 -0
- package/dist/env/workflow/types/workflow-error.d.ts +79 -0
- package/dist/env/workflow/types/workflow-hil.d.ts +57 -0
- package/dist/env/workflow/types/workflow-message.d.ts +193 -0
- package/dist/env/workflow/types/workflow-session.d.ts +17 -0
- package/dist/env/workflow/types/workflow.d.ts +654 -0
- package/dist/env/workflow/types_compat.d.ts +10 -0
- package/dist/env/workflow/utils/agent-session-metadata.d.ts +35 -0
- package/dist/env/workflow/utils/build-agent-node-output.d.ts +11 -0
- package/dist/env/workflow/utils/create-workflow.d.ts +35 -0
- package/dist/env/workflow/utils/dependency-prescan.d.ts +67 -0
- package/dist/env/workflow/utils/execution-state.d.ts +46 -0
- package/dist/env/workflow/utils/extract-agent-json-output.d.ts +6 -0
- package/dist/env/workflow/utils/index.d.ts +14 -0
- package/dist/env/workflow/utils/json-schema-to-zod.d.ts +23 -0
- package/dist/env/workflow/utils/node-id-utils.d.ts +20 -0
- package/dist/env/workflow/utils/node-output-contracts.d.ts +137 -0
- package/dist/env/workflow/utils/node-registry-helper.d.ts +36 -0
- package/dist/env/workflow/utils/output-schema-hint.d.ts +7 -0
- package/dist/env/workflow/utils/parse-agent-output-config.d.ts +9 -0
- package/dist/env/workflow/utils/recovery-validator.d.ts +30 -0
- package/dist/env/workflow/utils/sensitive-redact.d.ts +37 -0
- package/dist/env/workflow/utils/session-parser.d.ts +23 -0
- package/dist/env/workflow/utils/session-recovery.d.ts +122 -0
- package/dist/env/workflow/utils/template-contract-validator.d.ts +87 -0
- package/dist/env/workflow/utils/template-resolver.d.ts +285 -0
- package/dist/env/workflow/utils/validate-workflow-definition.d.ts +57 -0
- package/dist/env/workflow/utils/validation-rules.d.ts +103 -0
- package/dist/env/workflow/utils/workflow-message-metadata.d.ts +20 -0
- package/dist/env/workflow/utils/workflow-sanitize.d.ts +51 -0
- package/dist/env/workflow/workflow-component.d.ts +138 -0
- package/dist/index.d.ts +59 -0
- package/dist/index.js +5 -5
- package/dist/shared/@ai-setting/{roy-agent-core-rcfewbzr.js → roy-agent-core-4sx6sdb2.js} +1 -1
- package/dist/shared/@ai-setting/{roy-agent-core-ezgsem94.js → roy-agent-core-ph5qbqcx.js} +1 -1
- package/dist/util/process/process-tree-killer.d.ts +67 -0
- package/dist/utils/id.d.ts +11 -0
- package/dist/utils/loose-json.d.ts +30 -0
- package/dist/utils/media.d.ts +70 -0
- package/dist/utils/temp-file-manager/index.d.ts +99 -0
- package/package.json +4 -2
- /package/dist/shared/@ai-setting/{roy-agent-core-s214vmmd.js → roy-agent-core-4vpk40ss.js} +0 -0
- /package/dist/shared/@ai-setting/{roy-agent-core-pkpkctvf.js → roy-agent-core-hch2geta.js} +0 -0
- /package/dist/shared/@ai-setting/{roy-agent-core-0cfaqnz9.js → roy-agent-core-k25gv86p.js} +0 -0
|
@@ -0,0 +1,238 @@
|
|
|
1
|
+
import { BaseComponent, type ComponentConfig } from "../component";
|
|
2
|
+
import { type LLMConfig, type LLMInvokeRequest, type LLMInvokeResult, type ModelLimits } from "./types";
|
|
3
|
+
import type { ConfigComponent } from "../../config/config-component";
|
|
4
|
+
import { ContextError } from "../errors";
|
|
5
|
+
/**
|
|
6
|
+
* Resolve fallback provider config by reading `~/.roy-agent/auth.json` and
|
|
7
|
+
* `~/.roy-agent/config.jsonc` directly (Task #2888 follow-up).
|
|
8
|
+
*
|
|
9
|
+
* Why this exists:
|
|
10
|
+
* When PiAiAdapter.stream() fails (e.g. finishReason=error, MIME 400, etc.),
|
|
11
|
+
* LLMComponent.invoke() falls back to AI SDK invoke(). The fallback must
|
|
12
|
+
* NOT reuse ctx.invokeConfig blindly — for some custom providers (e.g.
|
|
13
|
+
* minimax) that combination produces the wrong URL and HTTP 404. Reading
|
|
14
|
+
* config-driven per-provider baseURL/apiKey from auth.json is the
|
|
15
|
+
* user-controlled source of truth.
|
|
16
|
+
*
|
|
17
|
+
* Returned shape is just enough for the fallback path:
|
|
18
|
+
* - baseURL: from auth.json.providers.{name}.baseURL
|
|
19
|
+
* - apiKey: from auth.json.providers.{name}.apiKey
|
|
20
|
+
* - providerType: from config.jsonc.llm.providers.{name}.provider
|
|
21
|
+
* (defaults to "openai-compatible" if missing)
|
|
22
|
+
*
|
|
23
|
+
* @throws Error when auth.json has no entry for `providerId`
|
|
24
|
+
*/
|
|
25
|
+
export interface FallbackProviderConfig {
|
|
26
|
+
baseURL: string;
|
|
27
|
+
apiKey: string;
|
|
28
|
+
providerType: string;
|
|
29
|
+
}
|
|
30
|
+
export declare function resolveFallbackProviderConfig(providerId: string): Promise<FallbackProviderConfig>;
|
|
31
|
+
/**
|
|
32
|
+
* LLMComponent 配置(通过 options.config 传递)
|
|
33
|
+
*
|
|
34
|
+
* 配置加载顺序(优先级从低到高):
|
|
35
|
+
* 1. File - 配置文件(通过 configPath 指定)
|
|
36
|
+
* 2. Env - 环境变量(通过 envPrefix 配置前缀)
|
|
37
|
+
* 3. Object - 直接传入的 config 对象(最高优先级)
|
|
38
|
+
*
|
|
39
|
+
* 环境变量转换规则:
|
|
40
|
+
* - 驼峰命名会被转换为下划线分隔的大写形式
|
|
41
|
+
* - 例如: "llm.defaultModel" + prefix "LLM" -> "LLM_LLM_DEFAULT_MODEL"
|
|
42
|
+
*/
|
|
43
|
+
export interface LLMComponentOptions {
|
|
44
|
+
/** ConfigComponent 实例(必填) */
|
|
45
|
+
configComponent: ConfigComponent;
|
|
46
|
+
/** 配置文件相对路径(可选,基于 XDG_DATA_HOME) */
|
|
47
|
+
configPath?: string;
|
|
48
|
+
/** 环境变量前缀(可选,默认 "LLM") */
|
|
49
|
+
envPrefix?: string;
|
|
50
|
+
/** 直接传入的配置对象(可选,优先级最高) */
|
|
51
|
+
config?: Partial<LLMConfig>;
|
|
52
|
+
}
|
|
53
|
+
/**
|
|
54
|
+
* LLMComponent
|
|
55
|
+
* 管理 LLM 调用,使用 AI SDK 进行实际调用
|
|
56
|
+
*
|
|
57
|
+
* 配置通过 ConfigComponent 实时获取,支持配置热更新
|
|
58
|
+
*
|
|
59
|
+
* @example
|
|
60
|
+
* // 通过 ConfigComponent 加载配置
|
|
61
|
+
* const configComponent = new ConfigComponent();
|
|
62
|
+
* configComponent.setXdgDataHome(__dirname);
|
|
63
|
+
*
|
|
64
|
+
* const llmComponent = new LLMComponent();
|
|
65
|
+
* await llmComponent.init({
|
|
66
|
+
* env, // Environment 实例(必填)
|
|
67
|
+
* options: {
|
|
68
|
+
* configComponent, // ConfigComponent 实例
|
|
69
|
+
* configPath: "config.jsonc" // 配置文件路径
|
|
70
|
+
* }
|
|
71
|
+
* });
|
|
72
|
+
*
|
|
73
|
+
* // 配置更新后,下次调用会自动获取最新配置
|
|
74
|
+
* configComponent.set("llm.temperature", 0.5);
|
|
75
|
+
*/
|
|
76
|
+
export declare class LLMComponent extends BaseComponent {
|
|
77
|
+
readonly name = "llm";
|
|
78
|
+
readonly version = "2.0.0";
|
|
79
|
+
private configComponent?;
|
|
80
|
+
/** 配置变更 watcher 清理函数 */
|
|
81
|
+
private configWatcher?;
|
|
82
|
+
/**
|
|
83
|
+
* P1-3: Cached LLM adapter instance.
|
|
84
|
+
*
|
|
85
|
+
* Instead of calling createLLMAdapter() on every invoke(), we cache the
|
|
86
|
+
* adapter here. The adapter is created lazily on first use and rebuilt
|
|
87
|
+
* only when the provider environment variable changes (via
|
|
88
|
+
* invalidateAdapterCache()).
|
|
89
|
+
*/
|
|
90
|
+
private cachedAdapter?;
|
|
91
|
+
/** The provider name that was used to create the cached adapter */
|
|
92
|
+
private cachedAdapterProvider?;
|
|
93
|
+
constructor();
|
|
94
|
+
/**
|
|
95
|
+
* 初始化组件
|
|
96
|
+
*
|
|
97
|
+
* 配置加载优先级(从高到低):
|
|
98
|
+
* 1. Object - 直接传入的 config 对象
|
|
99
|
+
* 2. Env - 环境变量(通过 envPrefix 配置前缀)
|
|
100
|
+
* 3. File - 配置文件(通过 configPath 指定)
|
|
101
|
+
*/
|
|
102
|
+
init(config: ComponentConfig): Promise<void>;
|
|
103
|
+
/**
|
|
104
|
+
* 注册配置到 ConfigComponent
|
|
105
|
+
*
|
|
106
|
+
* 配置加载顺序(优先级从低到高):
|
|
107
|
+
* 1. FileSource - 从配置文件加载(最低)
|
|
108
|
+
* 2. EnvSource - 从环境变量加载(中等)
|
|
109
|
+
* 3. MemorySource - 直接配置对象(最高)
|
|
110
|
+
*/
|
|
111
|
+
private registerConfig;
|
|
112
|
+
/**
|
|
113
|
+
* 将配置对象展平为点号路径
|
|
114
|
+
*
|
|
115
|
+
* @example
|
|
116
|
+
* flattenConfig({ providers: { openai: { apiKey: "xxx" } } })
|
|
117
|
+
* -> { "llm.providers.openai.apiKey": "xxx" }
|
|
118
|
+
*/
|
|
119
|
+
private flattenConfig;
|
|
120
|
+
/**
|
|
121
|
+
* 注册配置热更新监听
|
|
122
|
+
*/
|
|
123
|
+
private registerConfigWatcher;
|
|
124
|
+
/**
|
|
125
|
+
* 处理配置变更(支持热更新)
|
|
126
|
+
*/
|
|
127
|
+
protected onConfigChange(event: {
|
|
128
|
+
key: string;
|
|
129
|
+
oldValue?: unknown;
|
|
130
|
+
newValue?: unknown;
|
|
131
|
+
}): void;
|
|
132
|
+
/**
|
|
133
|
+
* 启动组件
|
|
134
|
+
*/
|
|
135
|
+
onStart(): Promise<void>;
|
|
136
|
+
/**
|
|
137
|
+
* 停止组件
|
|
138
|
+
*/
|
|
139
|
+
onStop(): Promise<void>;
|
|
140
|
+
/**
|
|
141
|
+
* 从配置源获取配置值
|
|
142
|
+
* 优先从 ConfigComponent 获取(支持热更新),否则返回默认值
|
|
143
|
+
*/
|
|
144
|
+
private getLLMConfig;
|
|
145
|
+
/**
|
|
146
|
+
* 解析请求,构建调用上下文(invoke 和 invokeStream 共享)
|
|
147
|
+
*/
|
|
148
|
+
private resolveRequest;
|
|
149
|
+
/**
|
|
150
|
+
* 调用 LLM
|
|
151
|
+
*
|
|
152
|
+
* 路由策略(Task 6 实现):
|
|
153
|
+
* - 读取 ROY_LLM_PROVIDER 环境变量(默认 pi-ai)
|
|
154
|
+
* - 通过 createLLMAdapter().chat() 统一接入
|
|
155
|
+
* - 若 PiAiAdapter 失败(如 model 不支持),保留 fallback 路径
|
|
156
|
+
*
|
|
157
|
+
* 流式事件通过 env.pushEnvEvent() 发布
|
|
158
|
+
*/
|
|
159
|
+
/**
|
|
160
|
+
* P1-3: Get or create the cached LLM adapter.
|
|
161
|
+
*
|
|
162
|
+
* The adapter is created once and cached. If the ROY_LLM_PROVIDER
|
|
163
|
+
* environment variable changes, call invalidateAdapterCache() to force
|
|
164
|
+
* a rebuild on the next invoke().
|
|
165
|
+
*/
|
|
166
|
+
private getAdapter;
|
|
167
|
+
/**
|
|
168
|
+
* P1-3: Invalidate the cached adapter.
|
|
169
|
+
*
|
|
170
|
+
* Call this when the LLM provider environment variable changes to force
|
|
171
|
+
* the adapter to be recreated on the next invoke().
|
|
172
|
+
*/
|
|
173
|
+
invalidateAdapterCache(): void;
|
|
174
|
+
invoke(request: LLMInvokeRequest): Promise<LLMInvokeResult>;
|
|
175
|
+
/**
|
|
176
|
+
* Task #2719: 消费 adapter.stream() 返回的事件流,把 pi-ai AssistantMessageEvent
|
|
177
|
+
* 转成 llm.text / llm.reasoning env 事件(这样 Ink interactive 可以逐字渲染),
|
|
178
|
+
* 然后调用 streamHandle.result() 拿到最终 ChatResponse。
|
|
179
|
+
*
|
|
180
|
+
* 处理的事件类型(pi-ai AssistantMessageEvent):
|
|
181
|
+
* - text_delta → llm.text (delta + 累计 content)
|
|
182
|
+
* - thinking_delta → llm.reasoning (delta + 累计 content)
|
|
183
|
+
* - 其他事件(start/text_start/text_end/thinking_start/thinking_end/toolcall_xxx/done/error)跳过
|
|
184
|
+
*
|
|
185
|
+
* AiSdkAdapter.stream() 会 yield 单个完整 output 对象(不包含 type 字段),
|
|
186
|
+
* 不属于以上任意类型,所以不会被错误识别为流式事件。
|
|
187
|
+
*/
|
|
188
|
+
private consumeStreamAndGetResult;
|
|
189
|
+
/**
|
|
190
|
+
* 公共收尾逻辑:threshold check + return LLMInvokeResult
|
|
191
|
+
*/
|
|
192
|
+
private finalizeOutput;
|
|
193
|
+
/**
|
|
194
|
+
* 获取 Provider API Key
|
|
195
|
+
*/
|
|
196
|
+
private getApiKey;
|
|
197
|
+
/**
|
|
198
|
+
* 获取 Provider
|
|
199
|
+
*/
|
|
200
|
+
getProvider(id: string): import("./types").ProviderConfig;
|
|
201
|
+
/**
|
|
202
|
+
* 列出所有 Provider
|
|
203
|
+
*/
|
|
204
|
+
listProviders(): string[];
|
|
205
|
+
/**
|
|
206
|
+
* 获取模型的限制配置
|
|
207
|
+
*
|
|
208
|
+
* @param providerId - Provider ID
|
|
209
|
+
* @param modelId - 模型 ID(可选,默认使用 provider 的 defaultModel)
|
|
210
|
+
* @returns 模型限制配置,如果没有配置则返回 undefined
|
|
211
|
+
*/
|
|
212
|
+
getModelLimits(providerId: string, modelId?: string): ModelLimits | undefined;
|
|
213
|
+
/**
|
|
214
|
+
* 获取上下文窗口阈值配置
|
|
215
|
+
*
|
|
216
|
+
* @param providerId - Provider ID
|
|
217
|
+
* @param modelId - 模型 ID
|
|
218
|
+
* @returns 包含 contextWindow 和 thresholdRatio 的对象
|
|
219
|
+
*/
|
|
220
|
+
getContextThresholdConfig(providerId: string, modelId?: string): {
|
|
221
|
+
contextWindow: number;
|
|
222
|
+
thresholdRatio: number;
|
|
223
|
+
};
|
|
224
|
+
/**
|
|
225
|
+
* 检测上下文阈值是否超过
|
|
226
|
+
*
|
|
227
|
+
* @param usage - LLM 使用量信息
|
|
228
|
+
* @param providerId - Provider ID
|
|
229
|
+
* @param modelId - 模型 ID
|
|
230
|
+
* @param sessionId - Session ID(用于错误信息)
|
|
231
|
+
* @returns 如果超过阈值,返回 ContextError;否则返回 undefined
|
|
232
|
+
*/
|
|
233
|
+
checkContextThreshold(usage: {
|
|
234
|
+
totalTokens: number;
|
|
235
|
+
promptTokens?: number;
|
|
236
|
+
completionTokens?: number;
|
|
237
|
+
} | undefined, providerId: string, modelId: string | undefined, sessionId?: string): ContextError | undefined;
|
|
238
|
+
}
|
|
@@ -0,0 +1,79 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @fileoverview OpenCode Go provider helpers.
|
|
3
|
+
*
|
|
4
|
+
* The OpenCode Go inference endpoint (`https://opencode.ai/inference/go/v1`)
|
|
5
|
+
* requires a stable `x-opencode-session` header per conversation; without it the
|
|
6
|
+
* server responds `400 MissingSessionID` and the request cannot be routed:
|
|
7
|
+
* https://opencode.ai/docs/go/#how-it-works
|
|
8
|
+
*
|
|
9
|
+
* This module is the single source of truth for:
|
|
10
|
+
* 1. detecting the OpenCode Go provider id, and
|
|
11
|
+
* 2. generating / memoizing a stable session id per conversation.
|
|
12
|
+
*
|
|
13
|
+
* Why it lives here instead of inside `invoke.ts`:
|
|
14
|
+
* roy-agent has TWO LLM transports that both hit the same endpoint —
|
|
15
|
+
* - `PiAiAdapter` (default path, `ROY_LLM_PROVIDER=pi-ai`)
|
|
16
|
+
* - `invoke()` in `invoke.ts` (AI SDK fallback, `ROY_LLM_PROVIDER=ai-sdk`)
|
|
17
|
+
* The header injection must be shared so neither path silently regresses.
|
|
18
|
+
* Historically only the AI SDK path injected it, so the default pi-ai path
|
|
19
|
+
* always failed with `MissingSessionID` and relied on the fallback.
|
|
20
|
+
*
|
|
21
|
+
* Provider id normalization:
|
|
22
|
+
* Users have registered the provider under several spellings across time
|
|
23
|
+
* (`opencode`, `opencode-go`, `opencodego`; see Task #4168 / #4170 / #4173).
|
|
24
|
+
* We normalize case and strip `-`/`_` so all of them match. The Feishu
|
|
25
|
+
* channel's chat-keyed session ids (`oc_...`) are irrelevant here: the header
|
|
26
|
+
* value is always a freshly generated `ses_...` id, so any conversation id
|
|
27
|
+
* (including `oc_...`) works as the cache key.
|
|
28
|
+
*/
|
|
29
|
+
/**
|
|
30
|
+
* Generate an OpenCode-compatible `x-opencode-session` id.
|
|
31
|
+
*
|
|
32
|
+
* Official client format (sst/opencode source analysis, Task #4165):
|
|
33
|
+
* `ses_<12 hex timestamp><14 base62 random>` = 30 chars
|
|
34
|
+
*
|
|
35
|
+
* We do not enforce the exact 30-char length (the server only validates the
|
|
36
|
+
* `ses_` prefix and a minimum length), but we keep the same shape so the output
|
|
37
|
+
* is easy to recognize alongside the official client.
|
|
38
|
+
*
|
|
39
|
+
* @param nowMs - injectable clock (for tests)
|
|
40
|
+
*/
|
|
41
|
+
export declare function generateOpencodeSessionId(nowMs?: number): string;
|
|
42
|
+
/**
|
|
43
|
+
* True when `providerId` refers to the OpenCode Go provider.
|
|
44
|
+
*
|
|
45
|
+
* Recognizes `opencode`, `opencode-go`, `opencode_go` and `opencodego`
|
|
46
|
+
* (case-insensitive). Unrelated providers (e.g. `deepseek`, `openai`) return
|
|
47
|
+
* false so we never send the header to endpoints that don't understand it.
|
|
48
|
+
*/
|
|
49
|
+
export declare function isOpencodeProvider(providerId: string | undefined | null): boolean;
|
|
50
|
+
/**
|
|
51
|
+
* True when `baseURL` points at the OpenCode Go inference endpoint.
|
|
52
|
+
*
|
|
53
|
+
* Id-based detection misses the case where a user points some other provider
|
|
54
|
+
* name at the OpenCode endpoint; endpoint detection closes that gap. Only the
|
|
55
|
+
* official host is matched so unrelated gateways are unaffected.
|
|
56
|
+
*/
|
|
57
|
+
export declare function isOpencodeEndpoint(baseURL: string | undefined | null): boolean;
|
|
58
|
+
/**
|
|
59
|
+
* Get (or create) the stable OpenCode session id for a conversation.
|
|
60
|
+
*
|
|
61
|
+
* `x-opencode-session` must be STABLE for the lifetime of a conversation
|
|
62
|
+
* (the server uses it for routing/caching, see #4168). The header is injected
|
|
63
|
+
* once per LLM turn, so we memoize the generated id per conversation key.
|
|
64
|
+
*
|
|
65
|
+
* - `conversationId` undefined → return an ephemeral id (no stable key to
|
|
66
|
+
* cache under, better than poisoning a shared entry).
|
|
67
|
+
* - The cache is a bounded FIFO so long-lived processes cannot grow it forever.
|
|
68
|
+
*/
|
|
69
|
+
export declare function getOrCreateOpencodeSessionId(conversationId: string | undefined, nowMs?: number): string;
|
|
70
|
+
/**
|
|
71
|
+
* Build the request headers for a provider.
|
|
72
|
+
*
|
|
73
|
+
* Returns `{ "x-opencode-session": "ses_..." }` for OpenCode Go providers and
|
|
74
|
+
* an empty object for everyone else. Match is by provider id OR endpoint, so it
|
|
75
|
+
* keeps working if the provider is registered under a different name.
|
|
76
|
+
*/
|
|
77
|
+
export declare function buildOpencodeHeaders(providerId: string | undefined | null, conversationId?: string, baseURL?: string): Record<string, string>;
|
|
78
|
+
/** Test-only: reset the conversation → session id cache between cases. */
|
|
79
|
+
export declare function __clearOpencodeSessionIdCache(): void;
|
|
@@ -0,0 +1,40 @@
|
|
|
1
|
+
import type { LLMConfig, LLMProvider, ProviderConfig } from "./types";
|
|
2
|
+
/**
|
|
3
|
+
* Provider 管理器
|
|
4
|
+
* 负责创建和管理 LLM Provider 实例
|
|
5
|
+
*/
|
|
6
|
+
export declare class ProviderManager {
|
|
7
|
+
private providers;
|
|
8
|
+
/**
|
|
9
|
+
* 从配置初始化所有 Provider
|
|
10
|
+
*/
|
|
11
|
+
initialize(config: LLMConfig): Promise<void>;
|
|
12
|
+
/**
|
|
13
|
+
* 获取 Provider
|
|
14
|
+
*/
|
|
15
|
+
getProvider(id: string): LLMProvider | undefined;
|
|
16
|
+
/**
|
|
17
|
+
* 列出所有 Provider
|
|
18
|
+
*/
|
|
19
|
+
listProviders(): LLMProvider[];
|
|
20
|
+
/**
|
|
21
|
+
* 解析 Provider 配置中的环境变量
|
|
22
|
+
*/
|
|
23
|
+
resolveProviderConfig(config: ProviderConfig): Promise<ProviderConfig>;
|
|
24
|
+
/**
|
|
25
|
+
* 解析环境变量
|
|
26
|
+
* 支持 ${VAR} 格式
|
|
27
|
+
*/
|
|
28
|
+
resolveEnvVar(value: string): Promise<string>;
|
|
29
|
+
/**
|
|
30
|
+
* 创建 Provider 实例
|
|
31
|
+
* 注意:实际创建需要根据 Provider 类型调用对应的 AI SDK
|
|
32
|
+
* 这里返回占位实现,真正的 Provider 创建需要 AI SDK 依赖
|
|
33
|
+
*/
|
|
34
|
+
private createProvider;
|
|
35
|
+
/**
|
|
36
|
+
* 根据类型创建实际的 Provider 实例
|
|
37
|
+
* 需要外部传入 AI SDK 的 createProvider
|
|
38
|
+
*/
|
|
39
|
+
createAIProvider(id: string, config: ProviderConfig, createFn: (apiKey: string, baseURL?: string) => unknown): LLMProvider;
|
|
40
|
+
}
|
|
@@ -0,0 +1,77 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @fileoverview Tool call arguments parser - handles double-stringified JSON.
|
|
3
|
+
*
|
|
4
|
+
* LLMs sometimes double-stringify JSON arguments (a JSON string containing
|
|
5
|
+
* another JSON string). This module provides a safe parser that recursively
|
|
6
|
+
* attempts to parse until a real object is obtained, without leaking internal
|
|
7
|
+
* mechanisms like `_raw` into the conversation history.
|
|
8
|
+
*
|
|
9
|
+
* Features:
|
|
10
|
+
* - Recursive parsing for double/multi-stringified JSON
|
|
11
|
+
* - Debug logging when recursion is detected (alerts developers to LLM anomalies)
|
|
12
|
+
* - Maximum recursion depth protection (default: 5) to prevent infinite loops
|
|
13
|
+
*/
|
|
14
|
+
/**
|
|
15
|
+
* 尝试把「文本工具调用标记」形式的参数抢救成 JSON 对象
|
|
16
|
+
*
|
|
17
|
+
* 输入形如:`<arg_key>command</arg_key><arg_value>ls -la</arg_value>`
|
|
18
|
+
* 或散落在一段乱码 JSON 里的若干组标记。
|
|
19
|
+
*
|
|
20
|
+
* @returns 抢救成功返回对象;失败返回 undefined
|
|
21
|
+
*/
|
|
22
|
+
export declare function salvageTextualToolArgs(raw: string): Record<string, unknown> | undefined;
|
|
23
|
+
/** 剥掉文本工具调用标记(用于把"值里混进 marker"的脏 JSON 尽量救回来) */
|
|
24
|
+
export declare function stripTextualToolArgsMarkers(raw: string): string;
|
|
25
|
+
/** 参数解析结果(严格模式) */
|
|
26
|
+
export interface StrictToolArgsResult {
|
|
27
|
+
ok: boolean;
|
|
28
|
+
args: Record<string, unknown>;
|
|
29
|
+
/** 失败原因(ok=false 时给人/模型看) */
|
|
30
|
+
error?: string;
|
|
31
|
+
/** 是否经过抢救(marker 剥离 / 文本标记重建) */
|
|
32
|
+
salvaged?: boolean;
|
|
33
|
+
}
|
|
34
|
+
/**
|
|
35
|
+
* 严格解析 tool 参数(Task #4231)
|
|
36
|
+
*
|
|
37
|
+
* 与 `safeParseToolArgs` 的差别:
|
|
38
|
+
* - 失败时**不返回空对象**,而是 `{ok:false, error}` —— 调用方必须把错误回给模型,
|
|
39
|
+
* 不能拿 `{}` 去执行工具(否则会执行乱码命令 / 默认参数造成误操作)。
|
|
40
|
+
* - 会先尝试抢救上游退化格式(GLM 文本工具调用标记)。
|
|
41
|
+
*/
|
|
42
|
+
export declare function parseToolArgsStrict(args: unknown): StrictToolArgsResult;
|
|
43
|
+
/**
|
|
44
|
+
* 递归清洗参数值里混入的上游文本工具调用标记(Task #4231)
|
|
45
|
+
*
|
|
46
|
+
* 只动字符串值,不改变结构;marker 被削掉后若变成空串则保留空串(不删 key,
|
|
47
|
+
* 避免工具因缺字段报"缺参数")。
|
|
48
|
+
*/
|
|
49
|
+
export declare function sanitizeArgValues(args: Record<string, unknown>): Record<string, unknown>;
|
|
50
|
+
/**
|
|
51
|
+
* Safely parse tool call arguments, handling double-stringified JSON.
|
|
52
|
+
*
|
|
53
|
+
* LLMs sometimes double-stringify JSON arguments (a JSON string containing
|
|
54
|
+
* another JSON string). This function recursively attempts to parse until
|
|
55
|
+
* a real object is obtained.
|
|
56
|
+
*
|
|
57
|
+
* @param args - The arguments value (string, object, or double-stringified string)
|
|
58
|
+
* @param depth - Current recursion depth (internal use, default 0)
|
|
59
|
+
* @returns Parsed object, or empty object if parsing fails entirely
|
|
60
|
+
*
|
|
61
|
+
* @example
|
|
62
|
+
* // Normal object - returned as-is
|
|
63
|
+
* safeParseToolArgs({ key: "value" }) // => { key: "value" }
|
|
64
|
+
*
|
|
65
|
+
* @example
|
|
66
|
+
* // Normal JSON string - parsed
|
|
67
|
+
* safeParseToolArgs('{"key": "value"}') // => { key: "value" }
|
|
68
|
+
*
|
|
69
|
+
* @example
|
|
70
|
+
* // Double-stringified JSON - recursively parsed
|
|
71
|
+
* safeParseToolArgs('"{\\"key\\": \\"value\\"}"') // => { key: "value" }
|
|
72
|
+
*
|
|
73
|
+
* @example
|
|
74
|
+
* // Invalid JSON - returns empty object (no _raw leak)
|
|
75
|
+
* safeParseToolArgs("{invalid}") // => {}
|
|
76
|
+
*/
|
|
77
|
+
export declare function safeParseToolArgs(args: unknown, depth?: number): Record<string, unknown>;
|
|
@@ -0,0 +1,54 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @fileoverview Tool parameters → JSON Schema(**消除悬空 $ref**)Task #4231
|
|
3
|
+
*
|
|
4
|
+
* ## 背景(真实线上故障,2026-10-15)
|
|
5
|
+
*
|
|
6
|
+
* 切到 `opencodego`(openai-compatible)provider 后,sub-agent 直接失败:
|
|
7
|
+
*
|
|
8
|
+
* ```
|
|
9
|
+
* Upstream request failed: [invalid_request_error]
|
|
10
|
+
* Invalid schema for function 'task_operation_create':
|
|
11
|
+
* Pointer '/definitions/zod/properties/milestone_type' does not exist
|
|
12
|
+
* ```
|
|
13
|
+
*
|
|
14
|
+
* 根因:`zod-to-json-schema` 用 `zodToJsonSchema(schema, "zod")` 会把 schema 包成
|
|
15
|
+
*
|
|
16
|
+
* ```json
|
|
17
|
+
* { "$ref": "#/definitions/zod", "definitions": { "zod": { ... } } }
|
|
18
|
+
* ```
|
|
19
|
+
*
|
|
20
|
+
* 而各处的"解包"逻辑只把 `definitions.zod` 提出来当顶层 schema,**丢掉了
|
|
21
|
+
* `definitions`**,但 `definitions.zod.properties` 里可能还有**指向 definitions 的
|
|
22
|
+
* `$ref`**(同一 Zod 实例被复用时,例如 `milestone_type` 与 `action_type` 共用
|
|
23
|
+
* 同一个 `z.enum(...)` 实例 → `action_type: {"$ref": "#/definitions/zod/properties/milestone_type"}`)。
|
|
24
|
+
*
|
|
25
|
+
* 解包后这些 `$ref` 就成了悬空指针:
|
|
26
|
+
* - 宽松的 provider(Anthropic / 部分网关)容忍 → 一直没暴露;
|
|
27
|
+
* - **strict 校验的 OpenAI 兼容网关(opencodego)直接 400**。
|
|
28
|
+
*
|
|
29
|
+
* ## 修法
|
|
30
|
+
*
|
|
31
|
+
* 统一走 `toolParametersToJsonSchema()`:
|
|
32
|
+
* 1. Zod → JSON Schema(带 name 也不怕)
|
|
33
|
+
* 2. **就地把所有 `$ref` 展开(dereference)**,支持
|
|
34
|
+
* `#/definitions/<name>`、`#/definitions/<name>/properties/<p>`、
|
|
35
|
+
* `#/$defs/...` 等指针,带环保护
|
|
36
|
+
* 3. 丢掉 `definitions` / `$defs` / `$schema`,保证顶层是
|
|
37
|
+
* `{ type: "object", properties: {...} }`
|
|
38
|
+
*
|
|
39
|
+
* 换 provider / 换 SDK 都不会再因为 schema 指针炸掉。
|
|
40
|
+
*/
|
|
41
|
+
/** 判断是否是 Zod schema(zod v3/v4 都有 _def) */
|
|
42
|
+
export declare function isZodSchema(obj: unknown): boolean;
|
|
43
|
+
/**
|
|
44
|
+
* 深度扫描:schema 里是否还有 `$ref`(测试/自检用)
|
|
45
|
+
*
|
|
46
|
+
* @returns 找到的 ref 列表(空数组 = 干净)
|
|
47
|
+
*/
|
|
48
|
+
export declare function findDanglingRefs(schema: unknown): string[];
|
|
49
|
+
/**
|
|
50
|
+
* 把 tool 的 `parameters` 规范化成可以直接发给 provider 的 JSON Schema
|
|
51
|
+
*
|
|
52
|
+
* @param parameters Zod schema 或已经是 JSON Schema 的对象
|
|
53
|
+
*/
|
|
54
|
+
export declare function toolParametersToJsonSchema(parameters: unknown): Record<string, unknown>;
|
|
@@ -0,0 +1,57 @@
|
|
|
1
|
+
import type { LLMMessage, ToolInfo, ToolResult } from "./types";
|
|
2
|
+
/**
|
|
3
|
+
* LLM 消息转换工具
|
|
4
|
+
*/
|
|
5
|
+
export declare class LLMTransform {
|
|
6
|
+
/**
|
|
7
|
+
* 标准化消息格式
|
|
8
|
+
* 根据不同 Provider 调整消息格式
|
|
9
|
+
*/
|
|
10
|
+
normalizeMessages(messages: LLMMessage[], providerType: string): LLMMessage[];
|
|
11
|
+
/**
|
|
12
|
+
* 标准化为 OpenAI 格式
|
|
13
|
+
*/
|
|
14
|
+
private normalizeForOpenAI;
|
|
15
|
+
/**
|
|
16
|
+
* 标准化为 Anthropic 格式
|
|
17
|
+
*/
|
|
18
|
+
private normalizeForAnthropic;
|
|
19
|
+
/**
|
|
20
|
+
* 从 ToolInfo 提取 JSON Schema
|
|
21
|
+
*/
|
|
22
|
+
extractToolSchema(tool: ToolInfo): {
|
|
23
|
+
name: string;
|
|
24
|
+
description?: string;
|
|
25
|
+
parameters: Record<string, unknown>;
|
|
26
|
+
};
|
|
27
|
+
/**
|
|
28
|
+
* 将 Zod Schema 转换为 JSON Schema
|
|
29
|
+
* 兼容 Zod v3 和 v4
|
|
30
|
+
*/
|
|
31
|
+
zodToJsonSchema(schema: any): Record<string, unknown>;
|
|
32
|
+
/**
|
|
33
|
+
* 提取 Zod Schema 的结构
|
|
34
|
+
* 兼容 Zod v3 和 v4
|
|
35
|
+
*
|
|
36
|
+
* Zod v3: schema._def.typeName === "ZodObject"
|
|
37
|
+
* Zod v4: schema._def.type === "object"
|
|
38
|
+
*/
|
|
39
|
+
private extractZodSchema;
|
|
40
|
+
/**
|
|
41
|
+
* 格式化工具结果
|
|
42
|
+
*/
|
|
43
|
+
formatToolResult(result: ToolResult): {
|
|
44
|
+
role: "tool";
|
|
45
|
+
tool_call_id: string;
|
|
46
|
+
content: string;
|
|
47
|
+
isError?: boolean;
|
|
48
|
+
};
|
|
49
|
+
/**
|
|
50
|
+
* 解析工具参数
|
|
51
|
+
*/
|
|
52
|
+
parseToolArguments(args: string): Record<string, unknown>;
|
|
53
|
+
/**
|
|
54
|
+
* 序列化工具参数为 JSON 字符串
|
|
55
|
+
*/
|
|
56
|
+
serializeToolArguments(args: Record<string, unknown>): string;
|
|
57
|
+
}
|