@jsonstudio/llms 0.4.2
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +265 -0
- package/dist/api/index.d.ts +10 -0
- package/dist/api/index.js +11 -0
- package/dist/api/llmswitch-config.d.ts +15 -0
- package/dist/api/llmswitch-config.js +415 -0
- package/dist/api/llmswitch-types.d.ts +412 -0
- package/dist/api/llmswitch-types.js +60 -0
- package/dist/bridge/routecodex-adapter.d.ts +74 -0
- package/dist/bridge/routecodex-adapter.js +226 -0
- package/dist/config/index.d.ts +3 -0
- package/dist/config/index.js +5 -0
- package/dist/config-unified/enhanced-path-resolver.d.ts +5 -0
- package/dist/config-unified/enhanced-path-resolver.js +38 -0
- package/dist/config-unified/unified-config.d.ts +26 -0
- package/dist/config-unified/unified-config.js +187 -0
- package/dist/conversion/codec-registry.d.ts +10 -0
- package/dist/conversion/codec-registry.js +25 -0
- package/dist/conversion/codecs/anthropic-openai-codec.d.ts +23 -0
- package/dist/conversion/codecs/anthropic-openai-codec.js +546 -0
- package/dist/conversion/codecs/gemini-openai-codec.d.ts +16 -0
- package/dist/conversion/codecs/gemini-openai-codec.js +437 -0
- package/dist/conversion/codecs/openai-openai-codec.d.ts +12 -0
- package/dist/conversion/codecs/openai-openai-codec.js +125 -0
- package/dist/conversion/codecs/responses-openai-codec.d.ts +12 -0
- package/dist/conversion/codecs/responses-openai-codec.js +154 -0
- package/dist/conversion/config/config-manager.d.ts +212 -0
- package/dist/conversion/config/config-manager.js +310 -0
- package/dist/conversion/conversion-v3/adapters/index.d.ts +2 -0
- package/dist/conversion/conversion-v3/adapters/index.js +1 -0
- package/dist/conversion/conversion-v3/adapters/v3-to-standard-adapter.d.ts +38 -0
- package/dist/conversion/conversion-v3/adapters/v3-to-standard-adapter.js +55 -0
- package/dist/conversion/conversion-v3/compatibility/compatibility-profiles.d.ts +22 -0
- package/dist/conversion/conversion-v3/compatibility/compatibility-profiles.js +84 -0
- package/dist/conversion/conversion-v3/compatibility/compatibility-stages.d.ts +4 -0
- package/dist/conversion/conversion-v3/compatibility/compatibility-stages.js +285 -0
- package/dist/conversion/conversion-v3/compatibility/index.d.ts +3 -0
- package/dist/conversion/conversion-v3/compatibility/index.js +2 -0
- package/dist/conversion/conversion-v3/config/default-configs.d.ts +48 -0
- package/dist/conversion/conversion-v3/config/default-configs.js +1083 -0
- package/dist/conversion/conversion-v3/config/index.d.ts +5 -0
- package/dist/conversion/conversion-v3/config/index.js +5 -0
- package/dist/conversion/conversion-v3/config/pipeline-config-manager.d.ts +49 -0
- package/dist/conversion/conversion-v3/config/pipeline-config-manager.js +65 -0
- package/dist/conversion/conversion-v3/index.d.ts +11 -0
- package/dist/conversion/conversion-v3/index.js +17 -0
- package/dist/conversion/conversion-v3/nodes/index.d.ts +56 -0
- package/dist/conversion/conversion-v3/nodes/index.js +149 -0
- package/dist/conversion/conversion-v3/nodes/input/anthropic-input-node.d.ts +25 -0
- package/dist/conversion/conversion-v3/nodes/input/anthropic-input-node.js +56 -0
- package/dist/conversion/conversion-v3/nodes/input/base-input-node.d.ts +75 -0
- package/dist/conversion/conversion-v3/nodes/input/base-input-node.js +237 -0
- package/dist/conversion/conversion-v3/nodes/input/chat-input-node.d.ts +25 -0
- package/dist/conversion/conversion-v3/nodes/input/chat-input-node.js +56 -0
- package/dist/conversion/conversion-v3/nodes/input/chat-shape-helpers.d.ts +4 -0
- package/dist/conversion/conversion-v3/nodes/input/chat-shape-helpers.js +197 -0
- package/dist/conversion/conversion-v3/nodes/input/gemini-input-node.d.ts +16 -0
- package/dist/conversion/conversion-v3/nodes/input/gemini-input-node.js +125 -0
- package/dist/conversion/conversion-v3/nodes/input/index.d.ts +8 -0
- package/dist/conversion/conversion-v3/nodes/input/index.js +8 -0
- package/dist/conversion/conversion-v3/nodes/input/input-decision.d.ts +46 -0
- package/dist/conversion/conversion-v3/nodes/input/input-decision.js +125 -0
- package/dist/conversion/conversion-v3/nodes/input/responses-input-node.d.ts +20 -0
- package/dist/conversion/conversion-v3/nodes/input/responses-input-node.js +51 -0
- package/dist/conversion/conversion-v3/nodes/output/anthropic-output-node.d.ts +71 -0
- package/dist/conversion/conversion-v3/nodes/output/anthropic-output-node.js +320 -0
- package/dist/conversion/conversion-v3/nodes/output/base-output-node.d.ts +116 -0
- package/dist/conversion/conversion-v3/nodes/output/base-output-node.js +512 -0
- package/dist/conversion/conversion-v3/nodes/output/index.d.ts +7 -0
- package/dist/conversion/conversion-v3/nodes/output/index.js +7 -0
- package/dist/conversion/conversion-v3/nodes/output/openai-output-node.d.ts +71 -0
- package/dist/conversion/conversion-v3/nodes/output/openai-output-node.js +293 -0
- package/dist/conversion/conversion-v3/nodes/output/output-decision.d.ts +68 -0
- package/dist/conversion/conversion-v3/nodes/output/output-decision.js +161 -0
- package/dist/conversion/conversion-v3/nodes/output/responses-output-node.d.ts +64 -0
- package/dist/conversion/conversion-v3/nodes/output/responses-output-node.js +323 -0
- package/dist/conversion/conversion-v3/nodes/process/base-process-node.d.ts +72 -0
- package/dist/conversion/conversion-v3/nodes/process/base-process-node.js +246 -0
- package/dist/conversion/conversion-v3/nodes/process/chat-process-node.d.ts +135 -0
- package/dist/conversion/conversion-v3/nodes/process/chat-process-node.js +854 -0
- package/dist/conversion/conversion-v3/nodes/process/compatibility-process-node.d.ts +29 -0
- package/dist/conversion/conversion-v3/nodes/process/compatibility-process-node.js +181 -0
- package/dist/conversion/conversion-v3/nodes/process/index.d.ts +10 -0
- package/dist/conversion/conversion-v3/nodes/process/index.js +10 -0
- package/dist/conversion/conversion-v3/nodes/process/passthrough-process-node.d.ts +59 -0
- package/dist/conversion/conversion-v3/nodes/process/passthrough-process-node.js +243 -0
- package/dist/conversion/conversion-v3/nodes/process/response-process-node.d.ts +17 -0
- package/dist/conversion/conversion-v3/nodes/process/response-process-node.js +213 -0
- package/dist/conversion/conversion-v3/nodes/process/tool-process-node.d.ts +26 -0
- package/dist/conversion/conversion-v3/nodes/process/tool-process-node.js +299 -0
- package/dist/conversion/conversion-v3/nodes/process/virtual-router-process-node.d.ts +40 -0
- package/dist/conversion/conversion-v3/nodes/process/virtual-router-process-node.js +430 -0
- package/dist/conversion/conversion-v3/nodes/response/anthropic-response-input-node.d.ts +12 -0
- package/dist/conversion/conversion-v3/nodes/response/anthropic-response-input-node.js +129 -0
- package/dist/conversion/conversion-v3/nodes/response/chat-to-responses-response-node.d.ts +15 -0
- package/dist/conversion/conversion-v3/nodes/response/chat-to-responses-response-node.js +57 -0
- package/dist/conversion/conversion-v3/nodes/response/index.d.ts +4 -0
- package/dist/conversion/conversion-v3/nodes/response/index.js +4 -0
- package/dist/conversion/conversion-v3/nodes/response/openai-response-input-node.d.ts +15 -0
- package/dist/conversion/conversion-v3/nodes/response/openai-response-input-node.js +87 -0
- package/dist/conversion/conversion-v3/nodes/response/response-utils.d.ts +1 -0
- package/dist/conversion/conversion-v3/nodes/response/response-utils.js +1 -0
- package/dist/conversion/conversion-v3/nodes/response/responses-response-input-node.d.ts +12 -0
- package/dist/conversion/conversion-v3/nodes/response/responses-response-input-node.js +67 -0
- package/dist/conversion/conversion-v3/nodes/sse/index.d.ts +3 -0
- package/dist/conversion/conversion-v3/nodes/sse/index.js +3 -0
- package/dist/conversion/conversion-v3/nodes/sse/sse-input-node.d.ts +27 -0
- package/dist/conversion/conversion-v3/nodes/sse/sse-input-node.js +165 -0
- package/dist/conversion/conversion-v3/nodes/sse/sse-output-node.d.ts +19 -0
- package/dist/conversion/conversion-v3/nodes/sse/sse-output-node.js +267 -0
- package/dist/conversion/conversion-v3/nodes/sse/sse-passthrough-node.d.ts +18 -0
- package/dist/conversion/conversion-v3/nodes/sse/sse-passthrough-node.js +48 -0
- package/dist/conversion/conversion-v3/pipelines/index.d.ts +6 -0
- package/dist/conversion/conversion-v3/pipelines/index.js +6 -0
- package/dist/conversion/conversion-v3/pipelines/super-pipeline.d.ts +112 -0
- package/dist/conversion/conversion-v3/pipelines/super-pipeline.js +566 -0
- package/dist/conversion/conversion-v3/response/provider-response-converter.d.ts +28 -0
- package/dist/conversion/conversion-v3/response/provider-response-converter.js +249 -0
- package/dist/conversion/conversion-v3/sse/index.d.ts +140 -0
- package/dist/conversion/conversion-v3/sse/index.js +115 -0
- package/dist/conversion/conversion-v3/sse/json-to-sse/anthropic-json-to-sse-converter.d.ts +11 -0
- package/dist/conversion/conversion-v3/sse/json-to-sse/anthropic-json-to-sse-converter.js +79 -0
- package/dist/conversion/conversion-v3/sse/json-to-sse/chat-json-to-sse-converter.d.ts +79 -0
- package/dist/conversion/conversion-v3/sse/json-to-sse/chat-json-to-sse-converter.js +296 -0
- package/dist/conversion/conversion-v3/sse/json-to-sse/event-generators/chat.d.ts +55 -0
- package/dist/conversion/conversion-v3/sse/json-to-sse/event-generators/chat.js +233 -0
- package/dist/conversion/conversion-v3/sse/json-to-sse/event-generators/responses.d.ts +99 -0
- package/dist/conversion/conversion-v3/sse/json-to-sse/event-generators/responses.js +599 -0
- package/dist/conversion/conversion-v3/sse/json-to-sse/index.d.ts +6 -0
- package/dist/conversion/conversion-v3/sse/json-to-sse/index.js +7 -0
- package/dist/conversion/conversion-v3/sse/json-to-sse/responses-json-to-sse-converter.d.ts +79 -0
- package/dist/conversion/conversion-v3/sse/json-to-sse/responses-json-to-sse-converter.js +322 -0
- package/dist/conversion/conversion-v3/sse/json-to-sse/sequencers/chat-sequencer.d.ts +37 -0
- package/dist/conversion/conversion-v3/sse/json-to-sse/sequencers/chat-sequencer.js +218 -0
- package/dist/conversion/conversion-v3/sse/json-to-sse/sequencers/responses-sequencer.d.ts +40 -0
- package/dist/conversion/conversion-v3/sse/json-to-sse/sequencers/responses-sequencer.js +263 -0
- package/dist/conversion/conversion-v3/sse/registry/sse-codec-registry.d.ts +32 -0
- package/dist/conversion/conversion-v3/sse/registry/sse-codec-registry.js +106 -0
- package/dist/conversion/conversion-v3/sse/shared/chat-serializer.d.ts +4 -0
- package/dist/conversion/conversion-v3/sse/shared/chat-serializer.js +40 -0
- package/dist/conversion/conversion-v3/sse/shared/constants.d.ts +272 -0
- package/dist/conversion/conversion-v3/sse/shared/constants.js +321 -0
- package/dist/conversion/conversion-v3/sse/shared/serializers/base-serializer.d.ts +158 -0
- package/dist/conversion/conversion-v3/sse/shared/serializers/base-serializer.js +210 -0
- package/dist/conversion/conversion-v3/sse/shared/serializers/chat-event-serializer.d.ts +82 -0
- package/dist/conversion/conversion-v3/sse/shared/serializers/chat-event-serializer.js +275 -0
- package/dist/conversion/conversion-v3/sse/shared/serializers/index.d.ts +39 -0
- package/dist/conversion/conversion-v3/sse/shared/serializers/index.js +54 -0
- package/dist/conversion/conversion-v3/sse/shared/serializers/responses-event-serializer.d.ts +123 -0
- package/dist/conversion/conversion-v3/sse/shared/serializers/responses-event-serializer.js +356 -0
- package/dist/conversion/conversion-v3/sse/shared/serializers/types.d.ts +51 -0
- package/dist/conversion/conversion-v3/sse/shared/serializers/types.js +4 -0
- package/dist/conversion/conversion-v3/sse/shared/utils.d.ts +254 -0
- package/dist/conversion/conversion-v3/sse/shared/utils.js +543 -0
- package/dist/conversion/conversion-v3/sse/shared/writer.d.ts +111 -0
- package/dist/conversion/conversion-v3/sse/shared/writer.js +268 -0
- package/dist/conversion/conversion-v3/sse/sse-to-json/anthropic-sse-to-json-converter.d.ts +13 -0
- package/dist/conversion/conversion-v3/sse/sse-to-json/anthropic-sse-to-json-converter.js +139 -0
- package/dist/conversion/conversion-v3/sse/sse-to-json/builders/response-builder.d.ts +165 -0
- package/dist/conversion/conversion-v3/sse/sse-to-json/builders/response-builder.js +776 -0
- package/dist/conversion/conversion-v3/sse/sse-to-json/chat-sse-to-json-converter.d.ts +106 -0
- package/dist/conversion/conversion-v3/sse/sse-to-json/chat-sse-to-json-converter.js +540 -0
- package/dist/conversion/conversion-v3/sse/sse-to-json/index.d.ts +6 -0
- package/dist/conversion/conversion-v3/sse/sse-to-json/index.js +7 -0
- package/dist/conversion/conversion-v3/sse/sse-to-json/parsers/sse-parser.d.ts +73 -0
- package/dist/conversion/conversion-v3/sse/sse-to-json/parsers/sse-parser.js +332 -0
- package/dist/conversion/conversion-v3/sse/sse-to-json/responses-sse-to-json-converter.d.ts +59 -0
- package/dist/conversion/conversion-v3/sse/sse-to-json/responses-sse-to-json-converter.js +270 -0
- package/dist/conversion/conversion-v3/sse/types/anthropic-types.d.ts +87 -0
- package/dist/conversion/conversion-v3/sse/types/anthropic-types.js +5 -0
- package/dist/conversion/conversion-v3/sse/types/chat-types.d.ts +308 -0
- package/dist/conversion/conversion-v3/sse/types/chat-types.js +32 -0
- package/dist/conversion/conversion-v3/sse/types/conversion-context.d.ts +211 -0
- package/dist/conversion/conversion-v3/sse/types/conversion-context.js +20 -0
- package/dist/conversion/conversion-v3/sse/types/core-interfaces.d.ts +90 -0
- package/dist/conversion/conversion-v3/sse/types/core-interfaces.js +5 -0
- package/dist/conversion/conversion-v3/sse/types/index.d.ts +14 -0
- package/dist/conversion/conversion-v3/sse/types/index.js +7 -0
- package/dist/conversion/conversion-v3/sse/types/responses-types.d.ts +328 -0
- package/dist/conversion/conversion-v3/sse/types/responses-types.js +38 -0
- package/dist/conversion/conversion-v3/sse/types/sse-events.d.ts +180 -0
- package/dist/conversion/conversion-v3/sse/types/sse-events.js +150 -0
- package/dist/conversion/conversion-v3/sse/types/stream-state.d.ts +204 -0
- package/dist/conversion/conversion-v3/sse/types/stream-state.js +44 -0
- package/dist/conversion/conversion-v3/sse/types/utility-types.d.ts +230 -0
- package/dist/conversion/conversion-v3/sse/types/utility-types.js +49 -0
- package/dist/conversion/conversion-v3/standards/context-adapter.d.ts +146 -0
- package/dist/conversion/conversion-v3/standards/context-adapter.js +438 -0
- package/dist/conversion/conversion-v3/standards/errors.d.ts +38 -0
- package/dist/conversion/conversion-v3/standards/errors.js +27 -0
- package/dist/conversion/conversion-v3/standards/index.d.ts +15 -0
- package/dist/conversion/conversion-v3/standards/index.js +11 -0
- package/dist/conversion/conversion-v3/standards/node-capabilities.d.ts +123 -0
- package/dist/conversion/conversion-v3/standards/node-capabilities.js +330 -0
- package/dist/conversion/conversion-v3/standards/pipeline-context.d.ts +237 -0
- package/dist/conversion/conversion-v3/standards/pipeline-context.js +84 -0
- package/dist/conversion/conversion-v3/standards/pipeline-node.d.ts +196 -0
- package/dist/conversion/conversion-v3/standards/pipeline-node.js +316 -0
- package/dist/conversion/conversion-v3/standards/snapshot-handles.d.ts +24 -0
- package/dist/conversion/conversion-v3/standards/snapshot-handles.js +49 -0
- package/dist/conversion/conversion-v3/types/config-types.d.ts +242 -0
- package/dist/conversion/conversion-v3/types/config-types.js +13 -0
- package/dist/conversion/conversion-v3/types/index.d.ts +8 -0
- package/dist/conversion/conversion-v3/types/index.js +11 -0
- package/dist/conversion/conversion-v3/types/node-types.d.ts +211 -0
- package/dist/conversion/conversion-v3/types/node-types.js +20 -0
- package/dist/conversion/conversion-v3/types/pipeline-types.d.ts +246 -0
- package/dist/conversion/conversion-v3/types/pipeline-types.js +26 -0
- package/dist/conversion/conversion-v3/types/request-types.d.ts +293 -0
- package/dist/conversion/conversion-v3/types/request-types.js +26 -0
- package/dist/conversion/conversion-v3/utils/provider-payload-sanitizer.d.ts +10 -0
- package/dist/conversion/conversion-v3/utils/provider-payload-sanitizer.js +103 -0
- package/dist/conversion/conversion-v3/validations/index.d.ts +8 -0
- package/dist/conversion/conversion-v3/validations/index.js +7 -0
- package/dist/conversion/conversion-v3/validations/node-graph-validator.d.ts +116 -0
- package/dist/conversion/conversion-v3/validations/node-graph-validator.js +505 -0
- package/dist/conversion/conversion-v3/validations/tool-governance-enforcer.d.ts +139 -0
- package/dist/conversion/conversion-v3/validations/tool-governance-enforcer.js +338 -0
- package/dist/conversion/hub/config/types.d.ts +26 -0
- package/dist/conversion/hub/config/types.js +1 -0
- package/dist/conversion/hub/core/detour-registry.d.ts +9 -0
- package/dist/conversion/hub/core/detour-registry.js +23 -0
- package/dist/conversion/hub/core/hub-context.d.ts +21 -0
- package/dist/conversion/hub/core/hub-context.js +1 -0
- package/dist/conversion/hub/core/index.d.ts +3 -0
- package/dist/conversion/hub/core/index.js +3 -0
- package/dist/conversion/hub/core/stage-driver.d.ts +30 -0
- package/dist/conversion/hub/core/stage-driver.js +31 -0
- package/dist/conversion/hub/format-adapters/anthropic-format-adapter.d.ts +16 -0
- package/dist/conversion/hub/format-adapters/anthropic-format-adapter.js +23 -0
- package/dist/conversion/hub/format-adapters/chat-format-adapter.d.ts +17 -0
- package/dist/conversion/hub/format-adapters/chat-format-adapter.js +23 -0
- package/dist/conversion/hub/format-adapters/gemini-format-adapter.d.ts +16 -0
- package/dist/conversion/hub/format-adapters/gemini-format-adapter.js +23 -0
- package/dist/conversion/hub/format-adapters/index.d.ts +21 -0
- package/dist/conversion/hub/format-adapters/index.js +4 -0
- package/dist/conversion/hub/format-adapters/responses-format-adapter.d.ts +17 -0
- package/dist/conversion/hub/format-adapters/responses-format-adapter.js +23 -0
- package/dist/conversion/hub/hub-feature.d.ts +1 -0
- package/dist/conversion/hub/hub-feature.js +25 -0
- package/dist/conversion/hub/node-support.d.ts +19 -0
- package/dist/conversion/hub/node-support.js +115 -0
- package/dist/conversion/hub/pipeline/hub-pipeline.d.ts +68 -0
- package/dist/conversion/hub/pipeline/hub-pipeline.js +421 -0
- package/dist/conversion/hub/pipelines/inbound.d.ts +22 -0
- package/dist/conversion/hub/pipelines/inbound.js +64 -0
- package/dist/conversion/hub/pipelines/outbound.d.ts +22 -0
- package/dist/conversion/hub/pipelines/outbound.js +57 -0
- package/dist/conversion/hub/process/chat-process.d.ts +13 -0
- package/dist/conversion/hub/process/chat-process.js +50 -0
- package/dist/conversion/hub/registry.d.ts +28 -0
- package/dist/conversion/hub/registry.js +98 -0
- package/dist/conversion/hub/response/chat-response-utils.d.ts +6 -0
- package/dist/conversion/hub/response/chat-response-utils.js +89 -0
- package/dist/conversion/hub/response/provider-response.d.ts +20 -0
- package/dist/conversion/hub/response/provider-response.js +196 -0
- package/dist/conversion/hub/response/response-mappers.d.ts +19 -0
- package/dist/conversion/hub/response/response-mappers.js +23 -0
- package/dist/conversion/hub/response/response-runtime.d.ts +3 -0
- package/dist/conversion/hub/response/response-runtime.js +206 -0
- package/dist/conversion/hub/semantic-mappers/anthropic-mapper.d.ts +7 -0
- package/dist/conversion/hub/semantic-mappers/anthropic-mapper.js +308 -0
- package/dist/conversion/hub/semantic-mappers/chat-mapper.d.ts +7 -0
- package/dist/conversion/hub/semantic-mappers/chat-mapper.js +304 -0
- package/dist/conversion/hub/semantic-mappers/gemini-mapper.d.ts +7 -0
- package/dist/conversion/hub/semantic-mappers/gemini-mapper.js +477 -0
- package/dist/conversion/hub/semantic-mappers/index.d.ts +4 -0
- package/dist/conversion/hub/semantic-mappers/index.js +4 -0
- package/dist/conversion/hub/semantic-mappers/responses-mapper.d.ts +21 -0
- package/dist/conversion/hub/semantic-mappers/responses-mapper.js +379 -0
- package/dist/conversion/hub/snapshot-recorder.d.ts +12 -0
- package/dist/conversion/hub/snapshot-recorder.js +69 -0
- package/dist/conversion/hub/standardized-bridge.d.ts +12 -0
- package/dist/conversion/hub/standardized-bridge.js +248 -0
- package/dist/conversion/hub/types/chat-envelope.d.ts +67 -0
- package/dist/conversion/hub/types/chat-envelope.js +1 -0
- package/dist/conversion/hub/types/chat-schema.d.ts +112 -0
- package/dist/conversion/hub/types/chat-schema.js +1 -0
- package/dist/conversion/hub/types/errors.d.ts +5 -0
- package/dist/conversion/hub/types/errors.js +13 -0
- package/dist/conversion/hub/types/format-envelope.d.ts +7 -0
- package/dist/conversion/hub/types/format-envelope.js +1 -0
- package/dist/conversion/hub/types/index.d.ts +6 -0
- package/dist/conversion/hub/types/index.js +6 -0
- package/dist/conversion/hub/types/json.d.ts +9 -0
- package/dist/conversion/hub/types/json.js +9 -0
- package/dist/conversion/hub/types/node.d.ts +31 -0
- package/dist/conversion/hub/types/node.js +1 -0
- package/dist/conversion/hub/types/standardized.d.ts +94 -0
- package/dist/conversion/hub/types/standardized.js +1 -0
- package/dist/conversion/index.d.ts +28 -0
- package/dist/conversion/index.js +28 -0
- package/dist/conversion/responses/responses-openai-bridge.d.ts +95 -0
- package/dist/conversion/responses/responses-openai-bridge.js +1330 -0
- package/dist/conversion/schema-validator.d.ts +7 -0
- package/dist/conversion/schema-validator.js +67 -0
- package/dist/conversion/shared/args-mapping.d.ts +18 -0
- package/dist/conversion/shared/args-mapping.js +213 -0
- package/dist/conversion/shared/chat-request-filters.d.ts +9 -0
- package/dist/conversion/shared/chat-request-filters.js +74 -0
- package/dist/conversion/shared/jsonish.d.ts +3 -0
- package/dist/conversion/shared/jsonish.js +177 -0
- package/dist/conversion/shared/mcp-injection.d.ts +2 -0
- package/dist/conversion/shared/mcp-injection.js +89 -0
- package/dist/conversion/shared/media.d.ts +1 -0
- package/dist/conversion/shared/media.js +9 -0
- package/dist/conversion/shared/openai-finalizer.d.ts +9 -0
- package/dist/conversion/shared/openai-finalizer.js +104 -0
- package/dist/conversion/shared/openai-message-normalize.d.ts +1 -0
- package/dist/conversion/shared/openai-message-normalize.js +442 -0
- package/dist/conversion/shared/payload-budget.d.ts +13 -0
- package/dist/conversion/shared/payload-budget.js +248 -0
- package/dist/conversion/shared/reasoning-mapping.d.ts +5 -0
- package/dist/conversion/shared/reasoning-mapping.js +8 -0
- package/dist/conversion/shared/responses-conversation-store.d.ts +41 -0
- package/dist/conversion/shared/responses-conversation-store.js +285 -0
- package/dist/conversion/shared/responses-id-utils.d.ts +7 -0
- package/dist/conversion/shared/responses-id-utils.js +29 -0
- package/dist/conversion/shared/responses-instructions.d.ts +1 -0
- package/dist/conversion/shared/responses-instructions.js +113 -0
- package/dist/conversion/shared/responses-metadata.d.ts +1 -0
- package/dist/conversion/shared/responses-metadata.js +1 -0
- package/dist/conversion/shared/responses-request-adapter.d.ts +66 -0
- package/dist/conversion/shared/responses-request-adapter.js +461 -0
- package/dist/conversion/shared/snapshot-hooks.d.ts +12 -0
- package/dist/conversion/shared/snapshot-hooks.js +7 -0
- package/dist/conversion/shared/streaming-text-extractor.d.ts +26 -0
- package/dist/conversion/shared/streaming-text-extractor.js +145 -0
- package/dist/conversion/shared/text-markup-normalizer.d.ts +9 -0
- package/dist/conversion/shared/text-markup-normalizer.js +319 -0
- package/dist/conversion/shared/tool-canonicalizer.d.ts +2 -0
- package/dist/conversion/shared/tool-canonicalizer.js +50 -0
- package/dist/conversion/shared/tool-filter-pipeline.d.ts +17 -0
- package/dist/conversion/shared/tool-filter-pipeline.js +79 -0
- package/dist/conversion/shared/tool-governor.d.ts +27 -0
- package/dist/conversion/shared/tool-governor.js +269 -0
- package/dist/conversion/shared/tool-harvester.d.ts +31 -0
- package/dist/conversion/shared/tool-harvester.js +321 -0
- package/dist/conversion/shared/tool-mapping.d.ts +10 -0
- package/dist/conversion/shared/tool-mapping.js +10 -0
- package/dist/conversion/shared/tooling.d.ts +26 -0
- package/dist/conversion/shared/tooling.js +143 -0
- package/dist/conversion/types.d.ts +33 -0
- package/dist/conversion/types.js +1 -0
- package/dist/core/index.d.ts +6 -0
- package/dist/core/index.js +9 -0
- package/dist/core/llmswitch-engine-v2.d.ts +132 -0
- package/dist/core/llmswitch-engine-v2.js +649 -0
- package/dist/core/llmswitch-factory-v2.d.ts +123 -0
- package/dist/core/llmswitch-factory-v2.js +521 -0
- package/dist/endpoints/base-endpoint-handler.d.ts +128 -0
- package/dist/endpoints/base-endpoint-handler.js +545 -0
- package/dist/endpoints/chat-endpoint-handler.d.ts +115 -0
- package/dist/endpoints/chat-endpoint-handler.js +218 -0
- package/dist/endpoints/endpoint-router.d.ts +127 -0
- package/dist/endpoints/endpoint-router.js +438 -0
- package/dist/endpoints/index.d.ts +13 -0
- package/dist/endpoints/index.js +11 -0
- package/dist/endpoints/messages-endpoint-handler.d.ts +171 -0
- package/dist/endpoints/messages-endpoint-handler.js +238 -0
- package/dist/endpoints/responses-endpoint-handler.d.ts +147 -0
- package/dist/endpoints/responses-endpoint-handler.js +233 -0
- package/dist/filters/builtin/add-fields-filter.d.ts +8 -0
- package/dist/filters/builtin/add-fields-filter.js +16 -0
- package/dist/filters/builtin/blacklist-filter.d.ts +8 -0
- package/dist/filters/builtin/blacklist-filter.js +19 -0
- package/dist/filters/builtin/whitelist-filter.d.ts +8 -0
- package/dist/filters/builtin/whitelist-filter.js +19 -0
- package/dist/filters/engine.d.ts +16 -0
- package/dist/filters/engine.js +167 -0
- package/dist/filters/index.d.ts +19 -0
- package/dist/filters/index.js +24 -0
- package/dist/filters/special/request-streaming-to-nonstreaming.d.ts +12 -0
- package/dist/filters/special/request-streaming-to-nonstreaming.js +27 -0
- package/dist/filters/special/request-tool-choice-policy.d.ts +11 -0
- package/dist/filters/special/request-tool-choice-policy.js +27 -0
- package/dist/filters/special/request-tool-list-filter.d.ts +11 -0
- package/dist/filters/special/request-tool-list-filter.js +167 -0
- package/dist/filters/special/request-toolcalls-stringify.d.ts +10 -0
- package/dist/filters/special/request-toolcalls-stringify.js +44 -0
- package/dist/filters/special/request-tools-normalize.d.ts +12 -0
- package/dist/filters/special/request-tools-normalize.js +140 -0
- package/dist/filters/special/response-finish-invariants.d.ts +11 -0
- package/dist/filters/special/response-finish-invariants.js +30 -0
- package/dist/filters/special/response-openai-to-responses-bridge.d.ts +13 -0
- package/dist/filters/special/response-openai-to-responses-bridge.js +24 -0
- package/dist/filters/special/response-tool-arguments-blacklist.d.ts +12 -0
- package/dist/filters/special/response-tool-arguments-blacklist.js +63 -0
- package/dist/filters/special/response-tool-arguments-schema-converge.d.ts +13 -0
- package/dist/filters/special/response-tool-arguments-schema-converge.js +63 -0
- package/dist/filters/special/response-tool-arguments-stringify.d.ts +9 -0
- package/dist/filters/special/response-tool-arguments-stringify.js +134 -0
- package/dist/filters/special/response-tool-arguments-toon-decode.d.ts +10 -0
- package/dist/filters/special/response-tool-arguments-toon-decode.js +94 -0
- package/dist/filters/special/response-tool-arguments-whitelist.d.ts +11 -0
- package/dist/filters/special/response-tool-arguments-whitelist.js +56 -0
- package/dist/filters/special/response-tool-text-canonicalize.d.ts +10 -0
- package/dist/filters/special/response-tool-text-canonicalize.js +20 -0
- package/dist/filters/special/tool-filter-hooks.d.ts +19 -0
- package/dist/filters/special/tool-filter-hooks.js +341 -0
- package/dist/filters/special/tool-post-constraints.d.ts +31 -0
- package/dist/filters/special/tool-post-constraints.js +120 -0
- package/dist/filters/types.d.ts +68 -0
- package/dist/filters/types.js +3 -0
- package/dist/filters/utils/fieldmap-loader.d.ts +2 -0
- package/dist/filters/utils/fieldmap-loader.js +16 -0
- package/dist/filters/utils/snapshot-writer.d.ts +10 -0
- package/dist/filters/utils/snapshot-writer.js +47 -0
- package/dist/guidance/index.d.ts +3 -0
- package/dist/guidance/index.js +228 -0
- package/dist/hooks/hooks-integration.d.ts +161 -0
- package/dist/hooks/hooks-integration.js +519 -0
- package/dist/hooks/index.d.ts +10 -0
- package/dist/hooks/index.js +13 -0
- package/dist/html-to-markdown.d.ts +5 -0
- package/dist/html-to-markdown.js +66 -0
- package/dist/http/sse-response.d.ts +22 -0
- package/dist/http/sse-response.js +103 -0
- package/dist/index.d.ts +10 -0
- package/dist/index.js +10 -0
- package/dist/router/virtual-router/bootstrap.d.ts +6 -0
- package/dist/router/virtual-router/bootstrap.js +620 -0
- package/dist/router/virtual-router/classifier.d.ts +10 -0
- package/dist/router/virtual-router/classifier.js +99 -0
- package/dist/router/virtual-router/engine.d.ts +35 -0
- package/dist/router/virtual-router/engine.js +260 -0
- package/dist/router/virtual-router/error-center.d.ts +10 -0
- package/dist/router/virtual-router/error-center.js +39 -0
- package/dist/router/virtual-router/features.d.ts +3 -0
- package/dist/router/virtual-router/features.js +162 -0
- package/dist/router/virtual-router/health-manager.d.ts +18 -0
- package/dist/router/virtual-router/health-manager.js +98 -0
- package/dist/router/virtual-router/load-balancer.d.ts +18 -0
- package/dist/router/virtual-router/load-balancer.js +67 -0
- package/dist/router/virtual-router/provider-registry.d.ts +11 -0
- package/dist/router/virtual-router/provider-registry.js +74 -0
- package/dist/router/virtual-router/types.d.ts +206 -0
- package/dist/router/virtual-router/types.js +31 -0
- package/dist/sse/index.d.ts +140 -0
- package/dist/sse/index.js +115 -0
- package/dist/sse/json-to-sse/anthropic-json-to-sse-converter.d.ts +11 -0
- package/dist/sse/json-to-sse/anthropic-json-to-sse-converter.js +79 -0
- package/dist/sse/json-to-sse/chat-json-to-sse-converter.d.ts +79 -0
- package/dist/sse/json-to-sse/chat-json-to-sse-converter.js +296 -0
- package/dist/sse/json-to-sse/event-generators/chat.d.ts +55 -0
- package/dist/sse/json-to-sse/event-generators/chat.js +233 -0
- package/dist/sse/json-to-sse/event-generators/responses.d.ts +99 -0
- package/dist/sse/json-to-sse/event-generators/responses.js +599 -0
- package/dist/sse/json-to-sse/index.d.ts +6 -0
- package/dist/sse/json-to-sse/index.js +7 -0
- package/dist/sse/json-to-sse/responses-json-to-sse-converter.d.ts +79 -0
- package/dist/sse/json-to-sse/responses-json-to-sse-converter.js +322 -0
- package/dist/sse/json-to-sse/sequencers/chat-sequencer.d.ts +37 -0
- package/dist/sse/json-to-sse/sequencers/chat-sequencer.js +218 -0
- package/dist/sse/json-to-sse/sequencers/responses-sequencer.d.ts +40 -0
- package/dist/sse/json-to-sse/sequencers/responses-sequencer.js +263 -0
- package/dist/sse/registry/sse-codec-registry.d.ts +32 -0
- package/dist/sse/registry/sse-codec-registry.js +106 -0
- package/dist/sse/shared/chat-serializer.d.ts +4 -0
- package/dist/sse/shared/chat-serializer.js +40 -0
- package/dist/sse/shared/constants.d.ts +272 -0
- package/dist/sse/shared/constants.js +321 -0
- package/dist/sse/shared/serializers/base-serializer.d.ts +158 -0
- package/dist/sse/shared/serializers/base-serializer.js +210 -0
- package/dist/sse/shared/serializers/chat-event-serializer.d.ts +82 -0
- package/dist/sse/shared/serializers/chat-event-serializer.js +275 -0
- package/dist/sse/shared/serializers/index.d.ts +39 -0
- package/dist/sse/shared/serializers/index.js +54 -0
- package/dist/sse/shared/serializers/responses-event-serializer.d.ts +123 -0
- package/dist/sse/shared/serializers/responses-event-serializer.js +356 -0
- package/dist/sse/shared/serializers/types.d.ts +51 -0
- package/dist/sse/shared/serializers/types.js +4 -0
- package/dist/sse/shared/utils.d.ts +254 -0
- package/dist/sse/shared/utils.js +543 -0
- package/dist/sse/shared/writer.d.ts +111 -0
- package/dist/sse/shared/writer.js +268 -0
- package/dist/sse/sse-to-json/anthropic-sse-to-json-converter.d.ts +13 -0
- package/dist/sse/sse-to-json/anthropic-sse-to-json-converter.js +139 -0
- package/dist/sse/sse-to-json/builders/response-builder.d.ts +165 -0
- package/dist/sse/sse-to-json/builders/response-builder.js +776 -0
- package/dist/sse/sse-to-json/chat-sse-to-json-converter.d.ts +106 -0
- package/dist/sse/sse-to-json/chat-sse-to-json-converter.js +540 -0
- package/dist/sse/sse-to-json/index.d.ts +6 -0
- package/dist/sse/sse-to-json/index.js +7 -0
- package/dist/sse/sse-to-json/parsers/sse-parser.d.ts +73 -0
- package/dist/sse/sse-to-json/parsers/sse-parser.js +340 -0
- package/dist/sse/sse-to-json/responses-sse-to-json-converter.d.ts +59 -0
- package/dist/sse/sse-to-json/responses-sse-to-json-converter.js +270 -0
- package/dist/sse/types/anthropic-types.d.ts +87 -0
- package/dist/sse/types/anthropic-types.js +5 -0
- package/dist/sse/types/chat-types.d.ts +308 -0
- package/dist/sse/types/chat-types.js +32 -0
- package/dist/sse/types/conversion-context.d.ts +211 -0
- package/dist/sse/types/conversion-context.js +20 -0
- package/dist/sse/types/core-interfaces.d.ts +90 -0
- package/dist/sse/types/core-interfaces.js +5 -0
- package/dist/sse/types/index.d.ts +14 -0
- package/dist/sse/types/index.js +7 -0
- package/dist/sse/types/responses-types.d.ts +328 -0
- package/dist/sse/types/responses-types.js +38 -0
- package/dist/sse/types/sse-events.d.ts +180 -0
- package/dist/sse/types/sse-events.js +150 -0
- package/dist/sse/types/stream-state.d.ts +204 -0
- package/dist/sse/types/stream-state.js +44 -0
- package/dist/sse/types/utility-types.d.ts +230 -0
- package/dist/sse/types/utility-types.js +49 -0
- package/dist/tools/proxy/anthropic-tool-proxy.d.ts +19 -0
- package/dist/tools/proxy/anthropic-tool-proxy.js +57 -0
- package/dist/tools/proxy/executors/web-fetch.d.ts +6 -0
- package/dist/tools/proxy/executors/web-fetch.js +39 -0
- package/dist/tools/proxy/registry.d.ts +8 -0
- package/dist/tools/proxy/registry.js +14 -0
- package/dist/tools/proxy/types.d.ts +29 -0
- package/dist/tools/proxy/types.js +1 -0
- package/dist/tools/tool-registry.d.ts +8 -0
- package/dist/tools/tool-registry.js +154 -0
- package/dist/tools/web-fetch-html.d.ts +15 -0
- package/dist/tools/web-fetch-html.js +83 -0
- package/dist/utils/conversion-adapter.d.ts +65 -0
- package/dist/utils/conversion-adapter.js +183 -0
- package/dist/utils/error-factory.d.ts +88 -0
- package/dist/utils/error-factory.js +138 -0
- package/dist/utils/error-utils.d.ts +334 -0
- package/dist/utils/error-utils.js +782 -0
- package/dist/utils/index.d.ts +8 -0
- package/dist/utils/index.js +13 -0
- package/dist/utils/performance-utils.d.ts +205 -0
- package/dist/utils/performance-utils.js +440 -0
- package/dist/utils/profile-mapper.d.ts +32 -0
- package/dist/utils/profile-mapper.js +269 -0
- package/dist/utils/request-processor.d.ts +52 -0
- package/dist/utils/request-processor.js +210 -0
- package/dist/utils/request-utils.d.ts +117 -0
- package/dist/utils/request-utils.js +333 -0
- package/dist/utils/response-utils.d.ts +127 -0
- package/dist/utils/response-utils.js +516 -0
- package/dist/utils/token-counter.d.ts +89 -0
- package/dist/utils/token-counter.js +541 -0
- package/package.json +65 -0
|
@@ -0,0 +1,140 @@
|
|
|
1
|
+
function isObject(v) {
|
|
2
|
+
return !!v && typeof v === 'object' && !Array.isArray(v);
|
|
3
|
+
}
|
|
4
|
+
/**
|
|
5
|
+
* Normalize OpenAI tools definitions at the final request stage.
|
|
6
|
+
* - Switches shell parameters schema to TOON ({ toon: string }) when enabled and not heredoc.
|
|
7
|
+
* - Otherwise enforces { command: string | string[], workdir?: string } shape.
|
|
8
|
+
* - Best-effort; never throws.
|
|
9
|
+
*/
|
|
10
|
+
export class RequestOpenAIToolsNormalizeFilter {
|
|
11
|
+
name = 'request_openai_tools_normalize';
|
|
12
|
+
stage = 'request_finalize';
|
|
13
|
+
async apply(input) {
|
|
14
|
+
try {
|
|
15
|
+
const out = JSON.parse(JSON.stringify(input || {}));
|
|
16
|
+
const messages = Array.isArray(out.messages) ? out.messages : [];
|
|
17
|
+
const lastUser = [...messages].reverse().find((m) => m && m.role === 'user');
|
|
18
|
+
let lastText = '';
|
|
19
|
+
if (typeof lastUser?.content === 'string') {
|
|
20
|
+
lastText = lastUser.content;
|
|
21
|
+
}
|
|
22
|
+
else if (Array.isArray(lastUser?.content)) {
|
|
23
|
+
for (const p of lastUser.content) {
|
|
24
|
+
if (p && typeof p.text === 'string' && p.text.trim()) {
|
|
25
|
+
lastText = p.text;
|
|
26
|
+
break;
|
|
27
|
+
}
|
|
28
|
+
}
|
|
29
|
+
}
|
|
30
|
+
const looksHeredoc = /<<[-']?\w+/.test(lastText);
|
|
31
|
+
const toonEnv = String(process?.env?.RCC_TOON_ENABLE || process?.env?.ROUTECODEX_TOON_ENABLE || '').toLowerCase();
|
|
32
|
+
const toonEnabled = toonEnv ? !(toonEnv === '0' || toonEnv === 'false' || toonEnv === 'off') : true; // default ON
|
|
33
|
+
const tools = Array.isArray(out.tools) ? out.tools : [];
|
|
34
|
+
if (!tools.length) {
|
|
35
|
+
// No tools present: drop tool_choice to avoid provider-side validation errors
|
|
36
|
+
try {
|
|
37
|
+
if ('tool_choice' in out)
|
|
38
|
+
delete out.tool_choice;
|
|
39
|
+
}
|
|
40
|
+
catch { /* ignore */ }
|
|
41
|
+
return { ok: true, data: out };
|
|
42
|
+
}
|
|
43
|
+
let normalizedList = [];
|
|
44
|
+
try {
|
|
45
|
+
const mod = await import('../../conversion/shared/args-mapping.js');
|
|
46
|
+
const normalizeTools = mod?.normalizeTools;
|
|
47
|
+
if (typeof normalizeTools === 'function')
|
|
48
|
+
normalizedList = normalizeTools(tools);
|
|
49
|
+
}
|
|
50
|
+
catch { /* passthrough on failure */ }
|
|
51
|
+
const finalTools = [];
|
|
52
|
+
const max = Math.max(tools.length, normalizedList.length);
|
|
53
|
+
for (let i = 0; i < max; i++) {
|
|
54
|
+
const src = tools[i];
|
|
55
|
+
const dst = normalizedList[i];
|
|
56
|
+
if (dst && isObject(dst) && isObject(dst.function) && typeof dst.function.name === 'string') {
|
|
57
|
+
const fn = dst.function;
|
|
58
|
+
// Ensure type and minimal function shape
|
|
59
|
+
if (typeof dst.type !== 'string' || !String(dst.type).trim()) {
|
|
60
|
+
dst.type = 'function';
|
|
61
|
+
}
|
|
62
|
+
// Ensure parameters object shape exists
|
|
63
|
+
if (!isObject(fn.parameters)) {
|
|
64
|
+
dst.function = { ...fn, parameters: { type: 'object', properties: {}, additionalProperties: true } };
|
|
65
|
+
}
|
|
66
|
+
// Ensure description string exists
|
|
67
|
+
if (typeof fn.description !== 'string') {
|
|
68
|
+
dst.function = { ...dst.function, description: '' };
|
|
69
|
+
}
|
|
70
|
+
// Drop non-standard strict flag to pass strict providers that reject unknown tool fields
|
|
71
|
+
try {
|
|
72
|
+
if ('strict' in dst.function)
|
|
73
|
+
delete dst.function.strict;
|
|
74
|
+
}
|
|
75
|
+
catch { /* ignore */ }
|
|
76
|
+
// Switch schema for 'shell' at unified shaping point
|
|
77
|
+
try {
|
|
78
|
+
const name = String(dst.function.name || '').toLowerCase();
|
|
79
|
+
if (name === 'shell') {
|
|
80
|
+
const wantToon = toonEnabled && !looksHeredoc;
|
|
81
|
+
if (wantToon) {
|
|
82
|
+
dst.function.parameters = {
|
|
83
|
+
type: 'object',
|
|
84
|
+
properties: {
|
|
85
|
+
toon: { type: 'string', description: 'TOON-encoded arguments (multi-line key: value). Example: command: bash -lc "echo ok"\\nworkdir: .' }
|
|
86
|
+
},
|
|
87
|
+
required: ['toon'],
|
|
88
|
+
additionalProperties: false
|
|
89
|
+
};
|
|
90
|
+
dst.function.description = 'Use TOON: put arguments into arguments.toon as multi-line key: value (e.g., command / workdir).';
|
|
91
|
+
}
|
|
92
|
+
else {
|
|
93
|
+
dst.function.parameters = {
|
|
94
|
+
type: 'object',
|
|
95
|
+
properties: {
|
|
96
|
+
command: { oneOf: [{ type: 'string' }, { type: 'array', items: { type: 'string' } }] },
|
|
97
|
+
workdir: { type: 'string' }
|
|
98
|
+
},
|
|
99
|
+
required: ['command'],
|
|
100
|
+
additionalProperties: false
|
|
101
|
+
};
|
|
102
|
+
}
|
|
103
|
+
}
|
|
104
|
+
}
|
|
105
|
+
catch { /* ignore */ }
|
|
106
|
+
finalTools.push(dst);
|
|
107
|
+
}
|
|
108
|
+
else if (src && isObject(src)) {
|
|
109
|
+
// Fallback: minimally enforce required fields on raw src entries
|
|
110
|
+
const item = JSON.parse(JSON.stringify(src));
|
|
111
|
+
if (typeof item.type !== 'string' || !String(item.type).trim())
|
|
112
|
+
item.type = 'function';
|
|
113
|
+
if (!isObject(item.function))
|
|
114
|
+
item.function = {};
|
|
115
|
+
if (typeof item.function.name !== 'string')
|
|
116
|
+
item.function.name = String(item.name || 'tool');
|
|
117
|
+
if (!isObject(item.function.parameters))
|
|
118
|
+
item.function.parameters = { type: 'object', properties: {}, additionalProperties: true };
|
|
119
|
+
try {
|
|
120
|
+
if ('strict' in item.function)
|
|
121
|
+
delete item.function.strict;
|
|
122
|
+
}
|
|
123
|
+
catch { }
|
|
124
|
+
finalTools.push(item);
|
|
125
|
+
}
|
|
126
|
+
}
|
|
127
|
+
out.tools = finalTools;
|
|
128
|
+
// If tools ended up empty, drop tool_choice to avoid upstream validation issues
|
|
129
|
+
try {
|
|
130
|
+
if (Array.isArray(out.tools) && out.tools.length === 0 && 'tool_choice' in out)
|
|
131
|
+
delete out.tool_choice;
|
|
132
|
+
}
|
|
133
|
+
catch { /* ignore */ }
|
|
134
|
+
return { ok: true, data: out };
|
|
135
|
+
}
|
|
136
|
+
catch {
|
|
137
|
+
return { ok: true, data: input };
|
|
138
|
+
}
|
|
139
|
+
}
|
|
140
|
+
}
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
import type { Filter, FilterContext, FilterResult, JsonObject } from '../types.js';
|
|
2
|
+
/**
|
|
3
|
+
* Ensure finish_reason and content invariants on response side:
|
|
4
|
+
* - If tool_calls present, finish_reason defaults to 'tool_calls'
|
|
5
|
+
* - If tool_calls present, message.content=null (Chat path)
|
|
6
|
+
*/
|
|
7
|
+
export declare class ResponseFinishInvariantsFilter implements Filter<JsonObject> {
|
|
8
|
+
readonly name = "response_finish_invariants";
|
|
9
|
+
readonly stage: FilterContext['stage'];
|
|
10
|
+
apply(input: JsonObject): FilterResult<JsonObject>;
|
|
11
|
+
}
|
|
@@ -0,0 +1,30 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Ensure finish_reason and content invariants on response side:
|
|
3
|
+
* - If tool_calls present, finish_reason defaults to 'tool_calls'
|
|
4
|
+
* - If tool_calls present, message.content=null (Chat path)
|
|
5
|
+
*/
|
|
6
|
+
export class ResponseFinishInvariantsFilter {
|
|
7
|
+
name = 'response_finish_invariants';
|
|
8
|
+
stage = 'response_post';
|
|
9
|
+
apply(input) {
|
|
10
|
+
try {
|
|
11
|
+
const out = JSON.parse(JSON.stringify(input || {}));
|
|
12
|
+
const choices = Array.isArray(out.choices) ? out.choices : [];
|
|
13
|
+
for (const ch of choices) {
|
|
14
|
+
const msg = ch && ch.message ? ch.message : undefined;
|
|
15
|
+
const tcs = msg && Array.isArray(msg.tool_calls) ? msg.tool_calls : [];
|
|
16
|
+
if (tcs.length > 0) {
|
|
17
|
+
if (ch.finish_reason == null)
|
|
18
|
+
ch.finish_reason = 'tool_calls';
|
|
19
|
+
if (msg && typeof msg === 'object')
|
|
20
|
+
msg.content = null;
|
|
21
|
+
}
|
|
22
|
+
}
|
|
23
|
+
out.choices = choices;
|
|
24
|
+
return { ok: true, data: out };
|
|
25
|
+
}
|
|
26
|
+
catch {
|
|
27
|
+
return { ok: true, data: input };
|
|
28
|
+
}
|
|
29
|
+
}
|
|
30
|
+
}
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
import type { Filter, FilterContext, JsonObject, FilterResult } from '../types.js';
|
|
2
|
+
/**
|
|
3
|
+
* ResponseOpenAIToResponsesBridgeFilter
|
|
4
|
+
* - 将 OpenAI Chat 形状的响应桥接为 OpenAI Responses 形状
|
|
5
|
+
* - 与 Anthropic 并行:使用 filter 进行形状/协议转换(而非 endpoint 分支)
|
|
6
|
+
* - 阶段:response_post(在基础规范化之后执行)
|
|
7
|
+
*/
|
|
8
|
+
export declare class ResponseOpenAIToResponsesBridgeFilter implements Filter<JsonObject> {
|
|
9
|
+
readonly name = "response_openai_to_responses_bridge";
|
|
10
|
+
readonly stage: FilterContext['stage'];
|
|
11
|
+
apply(input: JsonObject, ctx: FilterContext): Promise<FilterResult<JsonObject>>;
|
|
12
|
+
}
|
|
13
|
+
export default ResponseOpenAIToResponsesBridgeFilter;
|
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
import { buildResponsesPayloadFromChat } from '../../conversion/responses/responses-openai-bridge.js';
|
|
2
|
+
/**
|
|
3
|
+
* ResponseOpenAIToResponsesBridgeFilter
|
|
4
|
+
* - 将 OpenAI Chat 形状的响应桥接为 OpenAI Responses 形状
|
|
5
|
+
* - 与 Anthropic 并行:使用 filter 进行形状/协议转换(而非 endpoint 分支)
|
|
6
|
+
* - 阶段:response_post(在基础规范化之后执行)
|
|
7
|
+
*/
|
|
8
|
+
export class ResponseOpenAIToResponsesBridgeFilter {
|
|
9
|
+
name = 'response_openai_to_responses_bridge';
|
|
10
|
+
stage = 'response_post';
|
|
11
|
+
async apply(input, ctx) {
|
|
12
|
+
try {
|
|
13
|
+
const requestId = ctx.requestId || `resp_${Date.now()}`;
|
|
14
|
+
const context = { requestId, endpoint: '/v1/responses', metadata: {} };
|
|
15
|
+
const bridged = buildResponsesPayloadFromChat(input, context);
|
|
16
|
+
return { ok: true, data: bridged };
|
|
17
|
+
}
|
|
18
|
+
catch {
|
|
19
|
+
// 桥接失败则保持原样(Fail Fast 由上层处理)
|
|
20
|
+
return { ok: true, data: input };
|
|
21
|
+
}
|
|
22
|
+
}
|
|
23
|
+
}
|
|
24
|
+
export default ResponseOpenAIToResponsesBridgeFilter;
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
import type { Filter, FilterContext, FilterResult, JsonObject } from '../types.js';
|
|
2
|
+
/**
|
|
3
|
+
* ResponseToolArgumentsBlacklistFilter
|
|
4
|
+
* - Remove keys listed in ROUTECODEX_TOOLARGS_BLACKLIST from tool_calls[].function.arguments (after decode).
|
|
5
|
+
* - Default: empty blacklist (no-op). Enables incremental hardening without risking valid params.
|
|
6
|
+
* Stage: response_pre
|
|
7
|
+
*/
|
|
8
|
+
export declare class ResponseToolArgumentsBlacklistFilter implements Filter<JsonObject> {
|
|
9
|
+
readonly name = "response_tool_arguments_blacklist";
|
|
10
|
+
readonly stage: FilterContext['stage'];
|
|
11
|
+
apply(input: JsonObject): FilterResult<JsonObject>;
|
|
12
|
+
}
|
|
@@ -0,0 +1,63 @@
|
|
|
1
|
+
function isObject(v) { return !!v && typeof v === 'object' && !Array.isArray(v); }
|
|
2
|
+
function parseJson(str) { try {
|
|
3
|
+
return JSON.parse(str);
|
|
4
|
+
}
|
|
5
|
+
catch {
|
|
6
|
+
return null;
|
|
7
|
+
} }
|
|
8
|
+
function getBlacklist() {
|
|
9
|
+
const env = String(process?.env?.ROUTECODEX_TOOLARGS_BLACKLIST || '').trim();
|
|
10
|
+
if (!env)
|
|
11
|
+
return [];
|
|
12
|
+
return env.split(',').map(s => s.trim()).filter(Boolean);
|
|
13
|
+
}
|
|
14
|
+
/**
|
|
15
|
+
* ResponseToolArgumentsBlacklistFilter
|
|
16
|
+
* - Remove keys listed in ROUTECODEX_TOOLARGS_BLACKLIST from tool_calls[].function.arguments (after decode).
|
|
17
|
+
* - Default: empty blacklist (no-op). Enables incremental hardening without risking valid params.
|
|
18
|
+
* Stage: response_pre
|
|
19
|
+
*/
|
|
20
|
+
export class ResponseToolArgumentsBlacklistFilter {
|
|
21
|
+
name = 'response_tool_arguments_blacklist';
|
|
22
|
+
stage = 'response_pre';
|
|
23
|
+
apply(input) {
|
|
24
|
+
const blacklist = getBlacklist();
|
|
25
|
+
if (blacklist.length === 0)
|
|
26
|
+
return { ok: true, data: input };
|
|
27
|
+
try {
|
|
28
|
+
const out = JSON.parse(JSON.stringify(input || {}));
|
|
29
|
+
const choices = Array.isArray(out.choices) ? out.choices : [];
|
|
30
|
+
for (const ch of choices) {
|
|
31
|
+
const msg = ch && ch.message ? ch.message : undefined;
|
|
32
|
+
const tcs = msg && Array.isArray(msg.tool_calls) ? msg.tool_calls : [];
|
|
33
|
+
for (const tc of tcs) {
|
|
34
|
+
const fn = tc && tc.function ? tc.function : undefined;
|
|
35
|
+
const argStr = fn && typeof fn.arguments === 'string' ? fn.arguments : undefined;
|
|
36
|
+
if (!argStr)
|
|
37
|
+
continue;
|
|
38
|
+
const parsed = parseJson(argStr);
|
|
39
|
+
if (!isObject(parsed))
|
|
40
|
+
continue;
|
|
41
|
+
let changed = false;
|
|
42
|
+
for (const k of blacklist) {
|
|
43
|
+
if (k in parsed) {
|
|
44
|
+
delete parsed[k];
|
|
45
|
+
changed = true;
|
|
46
|
+
}
|
|
47
|
+
}
|
|
48
|
+
if (changed) {
|
|
49
|
+
try {
|
|
50
|
+
fn.arguments = JSON.stringify(parsed);
|
|
51
|
+
}
|
|
52
|
+
catch { /* keep original */ }
|
|
53
|
+
}
|
|
54
|
+
}
|
|
55
|
+
}
|
|
56
|
+
out.choices = choices;
|
|
57
|
+
return { ok: true, data: out };
|
|
58
|
+
}
|
|
59
|
+
catch {
|
|
60
|
+
return { ok: true, data: input };
|
|
61
|
+
}
|
|
62
|
+
}
|
|
63
|
+
}
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
import type { Filter, FilterContext, FilterResult, JsonObject } from '../types.js';
|
|
2
|
+
/**
|
|
3
|
+
* ResponseToolArgumentsSchemaConvergeFilter
|
|
4
|
+
* - If tool schemas are available on context (context.toolSchemas[name] = JSONSchema),
|
|
5
|
+
* keep only keys defined in schema.properties for each tool call arguments.
|
|
6
|
+
* - Does not validate or coerce types; only converges keys to schema surface.
|
|
7
|
+
* - Stage: response_pre
|
|
8
|
+
*/
|
|
9
|
+
export declare class ResponseToolArgumentsSchemaConvergeFilter implements Filter<JsonObject> {
|
|
10
|
+
readonly name = "response_tool_arguments_schema_converge";
|
|
11
|
+
readonly stage: FilterContext['stage'];
|
|
12
|
+
apply(input: JsonObject, context?: FilterContext): FilterResult<JsonObject>;
|
|
13
|
+
}
|
|
@@ -0,0 +1,63 @@
|
|
|
1
|
+
function isObject(v) {
|
|
2
|
+
return !!v && typeof v === 'object' && !Array.isArray(v);
|
|
3
|
+
}
|
|
4
|
+
function parseJson(str) {
|
|
5
|
+
try {
|
|
6
|
+
return JSON.parse(str);
|
|
7
|
+
}
|
|
8
|
+
catch {
|
|
9
|
+
return null;
|
|
10
|
+
}
|
|
11
|
+
}
|
|
12
|
+
/**
|
|
13
|
+
* ResponseToolArgumentsSchemaConvergeFilter
|
|
14
|
+
* - If tool schemas are available on context (context.toolSchemas[name] = JSONSchema),
|
|
15
|
+
* keep only keys defined in schema.properties for each tool call arguments.
|
|
16
|
+
* - Does not validate or coerce types; only converges keys to schema surface.
|
|
17
|
+
* - Stage: response_pre
|
|
18
|
+
*/
|
|
19
|
+
export class ResponseToolArgumentsSchemaConvergeFilter {
|
|
20
|
+
name = 'response_tool_arguments_schema_converge';
|
|
21
|
+
stage = 'response_pre';
|
|
22
|
+
apply(input, context) {
|
|
23
|
+
try {
|
|
24
|
+
const schemaMap = context?.toolSchemas;
|
|
25
|
+
if (!schemaMap || typeof schemaMap !== 'object')
|
|
26
|
+
return { ok: true, data: input };
|
|
27
|
+
const out = JSON.parse(JSON.stringify(input || {}));
|
|
28
|
+
const choices = Array.isArray(out.choices) ? out.choices : [];
|
|
29
|
+
for (const ch of choices) {
|
|
30
|
+
const msg = ch && ch.message ? ch.message : undefined;
|
|
31
|
+
const tcs = msg && Array.isArray(msg.tool_calls) ? msg.tool_calls : [];
|
|
32
|
+
for (const tc of tcs) {
|
|
33
|
+
const fn = tc && tc.function ? tc.function : undefined;
|
|
34
|
+
const name = fn && typeof fn.name === 'string' ? String(fn.name) : '';
|
|
35
|
+
if (!name)
|
|
36
|
+
continue;
|
|
37
|
+
const schema = schemaMap[name];
|
|
38
|
+
const props = schema && schema.properties && isObject(schema.properties) ? schema.properties : undefined;
|
|
39
|
+
if (!props || !isObject(fn))
|
|
40
|
+
continue;
|
|
41
|
+
const argStr = typeof fn.arguments === 'string' ? fn.arguments : undefined;
|
|
42
|
+
const parsed = argStr ? parseJson(argStr) : (isObject(fn.arguments) ? fn.arguments : null);
|
|
43
|
+
if (!isObject(parsed))
|
|
44
|
+
continue;
|
|
45
|
+
const whitelisted = {};
|
|
46
|
+
for (const k of Object.keys(props)) {
|
|
47
|
+
if (k in parsed)
|
|
48
|
+
whitelisted[k] = parsed[k];
|
|
49
|
+
}
|
|
50
|
+
try {
|
|
51
|
+
fn.arguments = JSON.stringify(whitelisted);
|
|
52
|
+
}
|
|
53
|
+
catch { /* keep original */ }
|
|
54
|
+
}
|
|
55
|
+
}
|
|
56
|
+
out.choices = choices;
|
|
57
|
+
return { ok: true, data: out };
|
|
58
|
+
}
|
|
59
|
+
catch {
|
|
60
|
+
return { ok: true, data: input };
|
|
61
|
+
}
|
|
62
|
+
}
|
|
63
|
+
}
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
import type { Filter, FilterContext, FilterResult, JsonObject } from '../types.js';
|
|
2
|
+
/**
|
|
3
|
+
* Ensure choices[*].message.tool_calls[].function.arguments is a JSON string.
|
|
4
|
+
*/
|
|
5
|
+
export declare class ResponseToolArgumentsStringifyFilter implements Filter<JsonObject> {
|
|
6
|
+
readonly name = "response_tool_arguments_stringify";
|
|
7
|
+
readonly stage: FilterContext['stage'];
|
|
8
|
+
apply(input: JsonObject): FilterResult<JsonObject>;
|
|
9
|
+
}
|
|
@@ -0,0 +1,134 @@
|
|
|
1
|
+
function isObject(v) {
|
|
2
|
+
return !!v && typeof v === 'object' && !Array.isArray(v);
|
|
3
|
+
}
|
|
4
|
+
function repairFindMeta(s) {
|
|
5
|
+
// Minimal, idempotent repairs for common find expressions within a shell:
|
|
6
|
+
// - ensure -exec terminator is escaped exactly once: ; => \\;
|
|
7
|
+
// - collapse multiple backslashes before ; to a single backslash
|
|
8
|
+
// - escape unescaped parentheses used in predicates: ( ) -> \\( \\)
|
|
9
|
+
try {
|
|
10
|
+
const hasFind = /(^|\s)find\s/.test(s);
|
|
11
|
+
if (!hasFind)
|
|
12
|
+
return s;
|
|
13
|
+
let out = s;
|
|
14
|
+
// Only escape semicolon not already escaped (negative lookbehind)
|
|
15
|
+
out = out.replace(/-exec([^;]*?)(?<!\\);/g, (_m, g1) => `-exec${g1} \\;`);
|
|
16
|
+
// Collapse multiple backslashes immediately before ; into a single backslash
|
|
17
|
+
out = out.replace(/-exec([^;]*?)\\+;/g, (_m, g1) => `-exec${g1} \\;`);
|
|
18
|
+
// Escape parentheses only when not already escaped
|
|
19
|
+
out = out.replace(/(?<!\\)\(/g, '\\(').replace(/(?<!\\)\)/g, '\\)');
|
|
20
|
+
return out;
|
|
21
|
+
}
|
|
22
|
+
catch {
|
|
23
|
+
return s;
|
|
24
|
+
}
|
|
25
|
+
}
|
|
26
|
+
function packShellCommand(cmd) {
|
|
27
|
+
// Normalize into ["bash","-lc","<single string>"] to support pipes, parens, -exec, etc.
|
|
28
|
+
const normalizeArray = (argv) => {
|
|
29
|
+
if (argv.length >= 2 && argv[0].toLowerCase() === 'bash' && argv[1] === '-lc') {
|
|
30
|
+
if (argv.length === 3)
|
|
31
|
+
return ['bash', '-lc', repairFindMeta(String(argv[2]))];
|
|
32
|
+
const tail = argv.slice(2).join(' ');
|
|
33
|
+
return ['bash', '-lc', repairFindMeta(tail)];
|
|
34
|
+
}
|
|
35
|
+
const joined = argv.join(' ');
|
|
36
|
+
return ['bash', '-lc', repairFindMeta(joined)];
|
|
37
|
+
};
|
|
38
|
+
try {
|
|
39
|
+
if (Array.isArray(cmd)) {
|
|
40
|
+
return normalizeArray(cmd.map((x) => String(x)));
|
|
41
|
+
}
|
|
42
|
+
if (typeof cmd === 'string') {
|
|
43
|
+
// If the string looks like a JSON array, attempt to parse before normalizing.
|
|
44
|
+
const trimmed = cmd.trim();
|
|
45
|
+
if (trimmed.startsWith('[') && trimmed.endsWith(']')) {
|
|
46
|
+
try {
|
|
47
|
+
const parsed = JSON.parse(trimmed);
|
|
48
|
+
if (Array.isArray(parsed)) {
|
|
49
|
+
return normalizeArray(parsed.map((x) => String(x)));
|
|
50
|
+
}
|
|
51
|
+
}
|
|
52
|
+
catch {
|
|
53
|
+
// fall back to treating as plain string
|
|
54
|
+
}
|
|
55
|
+
}
|
|
56
|
+
return ['bash', '-lc', repairFindMeta(cmd)];
|
|
57
|
+
}
|
|
58
|
+
}
|
|
59
|
+
catch {
|
|
60
|
+
// fall through
|
|
61
|
+
}
|
|
62
|
+
return cmd;
|
|
63
|
+
}
|
|
64
|
+
/**
|
|
65
|
+
* Ensure choices[*].message.tool_calls[].function.arguments is a JSON string.
|
|
66
|
+
*/
|
|
67
|
+
export class ResponseToolArgumentsStringifyFilter {
|
|
68
|
+
name = 'response_tool_arguments_stringify';
|
|
69
|
+
stage = 'response_post';
|
|
70
|
+
apply(input) {
|
|
71
|
+
try {
|
|
72
|
+
const out = JSON.parse(JSON.stringify(input || {}));
|
|
73
|
+
const choices = Array.isArray(out.choices) ? out.choices : [];
|
|
74
|
+
for (const ch of choices) {
|
|
75
|
+
const msg = ch && ch.message ? ch.message : undefined;
|
|
76
|
+
const tcs = msg && Array.isArray(msg.tool_calls) ? msg.tool_calls : [];
|
|
77
|
+
for (const tc of tcs) {
|
|
78
|
+
try {
|
|
79
|
+
const fn = tc && tc.function ? tc.function : undefined;
|
|
80
|
+
if (fn && typeof fn === 'object') {
|
|
81
|
+
const name = typeof fn.name === 'string' ? String(fn.name).trim().toLowerCase() : '';
|
|
82
|
+
const argIn = fn.arguments;
|
|
83
|
+
let parsed = undefined;
|
|
84
|
+
if (typeof argIn === 'string') {
|
|
85
|
+
try {
|
|
86
|
+
parsed = JSON.parse(argIn);
|
|
87
|
+
}
|
|
88
|
+
catch {
|
|
89
|
+
parsed = undefined;
|
|
90
|
+
}
|
|
91
|
+
}
|
|
92
|
+
else if (isObject(argIn)) {
|
|
93
|
+
parsed = argIn;
|
|
94
|
+
}
|
|
95
|
+
if (name === 'shell' && isObject(parsed)) {
|
|
96
|
+
const cmd = parsed.command;
|
|
97
|
+
parsed.command = packShellCommand(cmd);
|
|
98
|
+
try {
|
|
99
|
+
fn.arguments = JSON.stringify(parsed ?? {});
|
|
100
|
+
}
|
|
101
|
+
catch {
|
|
102
|
+
fn.arguments = '{}';
|
|
103
|
+
}
|
|
104
|
+
}
|
|
105
|
+
else {
|
|
106
|
+
if (typeof argIn !== 'string') {
|
|
107
|
+
try {
|
|
108
|
+
fn.arguments = JSON.stringify(argIn ?? {});
|
|
109
|
+
}
|
|
110
|
+
catch {
|
|
111
|
+
fn.arguments = '{}';
|
|
112
|
+
}
|
|
113
|
+
}
|
|
114
|
+
}
|
|
115
|
+
// Ensure invariants per tool_call
|
|
116
|
+
if (!tc.id || typeof tc.id !== 'string') {
|
|
117
|
+
const basis = `${name || 'tool'}_${Math.random().toString(36).slice(2, 10)}`;
|
|
118
|
+
tc.id = `call_${basis}`;
|
|
119
|
+
}
|
|
120
|
+
if (!tc.type)
|
|
121
|
+
tc.type = 'function';
|
|
122
|
+
}
|
|
123
|
+
}
|
|
124
|
+
catch { /* ignore */ }
|
|
125
|
+
}
|
|
126
|
+
}
|
|
127
|
+
out.choices = choices;
|
|
128
|
+
return { ok: true, data: out };
|
|
129
|
+
}
|
|
130
|
+
catch {
|
|
131
|
+
return { ok: true, data: input };
|
|
132
|
+
}
|
|
133
|
+
}
|
|
134
|
+
}
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
import type { Filter, FilterContext, FilterResult, JsonObject } from '../types.js';
|
|
2
|
+
/**
|
|
3
|
+
* Decode arguments.toon to standard JSON ({command, workdir?}) and map tool name 'shell_toon' → 'shell'.
|
|
4
|
+
* Stage: response_pre (before arguments stringify and invariants).
|
|
5
|
+
*/
|
|
6
|
+
export declare class ResponseToolArgumentsToonDecodeFilter implements Filter<JsonObject> {
|
|
7
|
+
readonly name = "response_tool_arguments_toon_decode";
|
|
8
|
+
readonly stage: FilterContext['stage'];
|
|
9
|
+
apply(input: JsonObject): FilterResult<JsonObject>;
|
|
10
|
+
}
|
|
@@ -0,0 +1,94 @@
|
|
|
1
|
+
function envEnabled() {
|
|
2
|
+
// Default ON. Allow disabling via env RCC_TOON_ENABLE/ROUTECODEX_TOON_ENABLE = 0|false|off
|
|
3
|
+
const v = String(process?.env?.RCC_TOON_ENABLE || process?.env?.ROUTECODEX_TOON_ENABLE || '').toLowerCase();
|
|
4
|
+
if (!v)
|
|
5
|
+
return true;
|
|
6
|
+
return !(v === '0' || v === 'false' || v === 'off');
|
|
7
|
+
}
|
|
8
|
+
function isObject(v) { return !!v && typeof v === 'object' && !Array.isArray(v); }
|
|
9
|
+
function decodeToonPairs(toon) {
|
|
10
|
+
try {
|
|
11
|
+
const out = {};
|
|
12
|
+
const lines = String(toon).split(/\r?\n/);
|
|
13
|
+
for (const raw of lines) {
|
|
14
|
+
const line = raw.trim();
|
|
15
|
+
if (!line)
|
|
16
|
+
continue;
|
|
17
|
+
const m = line.match(/^([A-Za-z0-9_\-]+)\s*:\s*(.*)$/);
|
|
18
|
+
if (!m)
|
|
19
|
+
return null; // fail fast for non key: value
|
|
20
|
+
const key = m[1];
|
|
21
|
+
const val = m[2];
|
|
22
|
+
out[key] = val;
|
|
23
|
+
}
|
|
24
|
+
return out;
|
|
25
|
+
}
|
|
26
|
+
catch {
|
|
27
|
+
return null;
|
|
28
|
+
}
|
|
29
|
+
}
|
|
30
|
+
/**
|
|
31
|
+
* Decode arguments.toon to standard JSON ({command, workdir?}) and map tool name 'shell_toon' → 'shell'.
|
|
32
|
+
* Stage: response_pre (before arguments stringify and invariants).
|
|
33
|
+
*/
|
|
34
|
+
export class ResponseToolArgumentsToonDecodeFilter {
|
|
35
|
+
name = 'response_tool_arguments_toon_decode';
|
|
36
|
+
stage = 'response_pre';
|
|
37
|
+
apply(input) {
|
|
38
|
+
if (!envEnabled())
|
|
39
|
+
return { ok: true, data: input };
|
|
40
|
+
try {
|
|
41
|
+
const out = JSON.parse(JSON.stringify(input || {}));
|
|
42
|
+
const choices = Array.isArray(out.choices) ? out.choices : [];
|
|
43
|
+
for (const ch of choices) {
|
|
44
|
+
const msg = ch && ch.message ? ch.message : undefined;
|
|
45
|
+
const tcs = msg && Array.isArray(msg.tool_calls) ? msg.tool_calls : [];
|
|
46
|
+
for (const tc of tcs) {
|
|
47
|
+
try {
|
|
48
|
+
const fn = tc && tc.function ? tc.function : undefined;
|
|
49
|
+
if (!fn || typeof fn !== 'object')
|
|
50
|
+
continue;
|
|
51
|
+
const argStr = fn.arguments;
|
|
52
|
+
if (typeof argStr !== 'string')
|
|
53
|
+
continue;
|
|
54
|
+
let parsed;
|
|
55
|
+
try {
|
|
56
|
+
parsed = JSON.parse(argStr);
|
|
57
|
+
}
|
|
58
|
+
catch {
|
|
59
|
+
continue;
|
|
60
|
+
}
|
|
61
|
+
if (!isObject(parsed))
|
|
62
|
+
continue;
|
|
63
|
+
const toon = parsed.toon;
|
|
64
|
+
if (typeof toon !== 'string' || !toon.trim())
|
|
65
|
+
continue;
|
|
66
|
+
const kv = decodeToonPairs(toon);
|
|
67
|
+
if (!kv)
|
|
68
|
+
continue; // keep original if decode fails
|
|
69
|
+
const command = kv['command'];
|
|
70
|
+
const workdir = kv['workdir'];
|
|
71
|
+
if (typeof command === 'string' && command.trim()) {
|
|
72
|
+
const merged = { command };
|
|
73
|
+
if (typeof workdir === 'string' && workdir.trim())
|
|
74
|
+
merged.workdir = workdir;
|
|
75
|
+
try {
|
|
76
|
+
fn.arguments = JSON.stringify(merged);
|
|
77
|
+
}
|
|
78
|
+
catch { /* keep original */ }
|
|
79
|
+
if (typeof fn.name === 'string' && fn.name === 'shell_toon') {
|
|
80
|
+
fn.name = 'shell';
|
|
81
|
+
}
|
|
82
|
+
}
|
|
83
|
+
}
|
|
84
|
+
catch { /* one tool_call decode failure → ignore */ }
|
|
85
|
+
}
|
|
86
|
+
}
|
|
87
|
+
out.choices = choices;
|
|
88
|
+
return { ok: true, data: out };
|
|
89
|
+
}
|
|
90
|
+
catch {
|
|
91
|
+
return { ok: true, data: input };
|
|
92
|
+
}
|
|
93
|
+
}
|
|
94
|
+
}
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
import type { Filter, FilterContext, FilterResult, JsonObject } from '../types.js';
|
|
2
|
+
/**
|
|
3
|
+
* Whitelist tool function arguments keys after decode to match schema (e.g., keep only 'command'/'workdir').
|
|
4
|
+
* Stage: response_pre. Runs after TOON decode and before stringify.
|
|
5
|
+
*/
|
|
6
|
+
export declare class ResponseToolArgumentsWhitelistFilter implements Filter<JsonObject> {
|
|
7
|
+
readonly name = "response_tool_arguments_whitelist";
|
|
8
|
+
readonly stage: FilterContext['stage'];
|
|
9
|
+
private getWhitelist;
|
|
10
|
+
apply(input: JsonObject, context?: FilterContext): FilterResult<JsonObject>;
|
|
11
|
+
}
|