@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,26 @@
|
|
|
1
|
+
export interface StreamingToolCall {
|
|
2
|
+
id?: string;
|
|
3
|
+
type: 'function';
|
|
4
|
+
function: {
|
|
5
|
+
name?: string;
|
|
6
|
+
arguments?: string;
|
|
7
|
+
};
|
|
8
|
+
}
|
|
9
|
+
export interface StreamingToolExtractorOptions {
|
|
10
|
+
idPrefix?: string;
|
|
11
|
+
}
|
|
12
|
+
export declare class StreamingTextToolExtractor {
|
|
13
|
+
private opts;
|
|
14
|
+
private buffer;
|
|
15
|
+
private idCounter;
|
|
16
|
+
private pendingPatch;
|
|
17
|
+
constructor(opts?: StreamingToolExtractorOptions);
|
|
18
|
+
reset(): void;
|
|
19
|
+
feedText(text: string): StreamingToolCall[];
|
|
20
|
+
private genId;
|
|
21
|
+
private toToolCall;
|
|
22
|
+
private tryExtractUnifiedDiffBlocks;
|
|
23
|
+
private tryExtractFunctionExecuteBlocks;
|
|
24
|
+
private splitCommand;
|
|
25
|
+
}
|
|
26
|
+
export declare function createStreamingToolExtractor(opts?: StreamingToolExtractorOptions): StreamingTextToolExtractor;
|
|
@@ -0,0 +1,145 @@
|
|
|
1
|
+
// Streaming textual tool intent extractor (对齐)
|
|
2
|
+
// Detects <function=execute> blocks and unified diff patches
|
|
3
|
+
// and converts them into OpenAI tool_calls incrementally.
|
|
4
|
+
function isObject(v) {
|
|
5
|
+
return !!v && typeof v === 'object' && !Array.isArray(v);
|
|
6
|
+
}
|
|
7
|
+
export class StreamingTextToolExtractor {
|
|
8
|
+
opts;
|
|
9
|
+
buffer = '';
|
|
10
|
+
idCounter = 0;
|
|
11
|
+
pendingPatch = { active: false, lines: [] };
|
|
12
|
+
constructor(opts = {}) {
|
|
13
|
+
this.opts = opts;
|
|
14
|
+
}
|
|
15
|
+
reset() {
|
|
16
|
+
this.buffer = '';
|
|
17
|
+
this.idCounter = 0;
|
|
18
|
+
this.pendingPatch = { active: false, lines: [] };
|
|
19
|
+
}
|
|
20
|
+
feedText(text) {
|
|
21
|
+
const out = [];
|
|
22
|
+
if (typeof text !== 'string' || !text)
|
|
23
|
+
return out;
|
|
24
|
+
this.buffer += text;
|
|
25
|
+
// 1) Unified diff apply_patch block detection (*** Begin Patch ... *** End Patch)
|
|
26
|
+
out.push(...this.tryExtractUnifiedDiffBlocks());
|
|
27
|
+
// 2) <function=execute> compact blocks detection
|
|
28
|
+
out.push(...this.tryExtractFunctionExecuteBlocks());
|
|
29
|
+
return out;
|
|
30
|
+
}
|
|
31
|
+
genId() {
|
|
32
|
+
const p = this.opts.idPrefix || 'call';
|
|
33
|
+
return `${p}_${Date.now()}_${(++this.idCounter).toString(36)}`;
|
|
34
|
+
}
|
|
35
|
+
toToolCall(name, argsObj) {
|
|
36
|
+
let argStr = '{}';
|
|
37
|
+
try {
|
|
38
|
+
argStr = JSON.stringify(argsObj ?? {});
|
|
39
|
+
}
|
|
40
|
+
catch {
|
|
41
|
+
argStr = '{}';
|
|
42
|
+
}
|
|
43
|
+
return { id: this.genId(), type: 'function', function: { name, arguments: argStr } };
|
|
44
|
+
}
|
|
45
|
+
tryExtractUnifiedDiffBlocks() {
|
|
46
|
+
const out = [];
|
|
47
|
+
// Stream-friendly: if we see Begin Patch, start accumulating until End Patch
|
|
48
|
+
const beginIdx = this.buffer.indexOf('*** Begin Patch');
|
|
49
|
+
if (beginIdx >= 0) {
|
|
50
|
+
// Start patch if not already active
|
|
51
|
+
if (!this.pendingPatch.active) {
|
|
52
|
+
this.pendingPatch.active = true;
|
|
53
|
+
this.pendingPatch.lines = [];
|
|
54
|
+
this.pendingPatch.lines.push(this.buffer.slice(beginIdx));
|
|
55
|
+
// trim buffer before begin to reduce size
|
|
56
|
+
this.buffer = this.buffer.slice(beginIdx);
|
|
57
|
+
}
|
|
58
|
+
else {
|
|
59
|
+
// append new data
|
|
60
|
+
this.pendingPatch.lines.push(this.buffer);
|
|
61
|
+
}
|
|
62
|
+
}
|
|
63
|
+
if (this.pendingPatch.active) {
|
|
64
|
+
const joined = this.pendingPatch.lines.join('');
|
|
65
|
+
const endIdx = joined.indexOf('*** End Patch');
|
|
66
|
+
if (endIdx >= 0) {
|
|
67
|
+
const patchEnd = endIdx + '*** End Patch'.length;
|
|
68
|
+
const patchText = joined.slice(0, patchEnd);
|
|
69
|
+
out.push(this.toToolCall('apply_patch', { patch: patchText }));
|
|
70
|
+
// consume used part
|
|
71
|
+
const remainder = joined.slice(patchEnd);
|
|
72
|
+
this.pendingPatch = { active: false, lines: [] };
|
|
73
|
+
this.buffer = remainder;
|
|
74
|
+
}
|
|
75
|
+
else {
|
|
76
|
+
// keep accumulating, but limit memory
|
|
77
|
+
if (joined.length > 200000) {
|
|
78
|
+
this.pendingPatch.lines = [joined.slice(-100000)];
|
|
79
|
+
}
|
|
80
|
+
}
|
|
81
|
+
}
|
|
82
|
+
return out;
|
|
83
|
+
}
|
|
84
|
+
// rcc.tool.v1 JSON detection removed
|
|
85
|
+
tryExtractFunctionExecuteBlocks() {
|
|
86
|
+
const out = [];
|
|
87
|
+
// Very lightweight parser for <function=execute> <parameter=command>...</parameter>
|
|
88
|
+
const execRe = /<function=execute>[\s\S]*?<parameter=command>([\s\S]*?)<\/parameter>[\s\S]*?<\/function=execute>/gi;
|
|
89
|
+
let m;
|
|
90
|
+
while ((m = execRe.exec(this.buffer)) !== null) {
|
|
91
|
+
const cmd = (m[1] || '').trim();
|
|
92
|
+
if (cmd) {
|
|
93
|
+
// split a shell command string into argv best-effort
|
|
94
|
+
const argv = this.splitCommand(cmd);
|
|
95
|
+
out.push(this.toToolCall('shell', { command: argv }));
|
|
96
|
+
}
|
|
97
|
+
}
|
|
98
|
+
if (out.length > 0) {
|
|
99
|
+
this.buffer = this.buffer.replace(execRe, '');
|
|
100
|
+
}
|
|
101
|
+
return out;
|
|
102
|
+
}
|
|
103
|
+
splitCommand(s) {
|
|
104
|
+
try {
|
|
105
|
+
// basic quotes-aware split
|
|
106
|
+
const out = [];
|
|
107
|
+
let cur = '';
|
|
108
|
+
let quote = null;
|
|
109
|
+
for (let i = 0; i < s.length; i++) {
|
|
110
|
+
const ch = s[i];
|
|
111
|
+
if (quote) {
|
|
112
|
+
if (ch === quote) {
|
|
113
|
+
quote = null;
|
|
114
|
+
}
|
|
115
|
+
else {
|
|
116
|
+
cur += ch;
|
|
117
|
+
}
|
|
118
|
+
}
|
|
119
|
+
else {
|
|
120
|
+
if (ch === '"' || ch === '\'') {
|
|
121
|
+
quote = ch;
|
|
122
|
+
}
|
|
123
|
+
else if (/\s/.test(ch)) {
|
|
124
|
+
if (cur) {
|
|
125
|
+
out.push(cur);
|
|
126
|
+
cur = '';
|
|
127
|
+
}
|
|
128
|
+
}
|
|
129
|
+
else {
|
|
130
|
+
cur += ch;
|
|
131
|
+
}
|
|
132
|
+
}
|
|
133
|
+
}
|
|
134
|
+
if (cur)
|
|
135
|
+
out.push(cur);
|
|
136
|
+
return out;
|
|
137
|
+
}
|
|
138
|
+
catch {
|
|
139
|
+
return [s];
|
|
140
|
+
}
|
|
141
|
+
}
|
|
142
|
+
}
|
|
143
|
+
export function createStreamingToolExtractor(opts) {
|
|
144
|
+
return new StreamingTextToolExtractor(opts);
|
|
145
|
+
}
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
export type ToolCallLite = {
|
|
2
|
+
id?: string;
|
|
3
|
+
name: string;
|
|
4
|
+
args: string;
|
|
5
|
+
};
|
|
6
|
+
export declare function extractApplyPatchCallsFromText(text: string): ToolCallLite[] | null;
|
|
7
|
+
export declare function extractExecuteBlocksFromText(text: string): ToolCallLite[] | null;
|
|
8
|
+
export declare function extractXMLToolCallsFromText(text: string): ToolCallLite[] | null;
|
|
9
|
+
export declare function normalizeAssistantTextToToolCalls(message: Record<string, any>): Record<string, any>;
|
|
@@ -0,0 +1,319 @@
|
|
|
1
|
+
// Normalize textual markup into OpenAI tool_calls shape.
|
|
2
|
+
// Gated by RCC_TEXT_MARKUP_COMPAT=1 to avoid overreach.
|
|
3
|
+
import { isImagePath } from './media.js';
|
|
4
|
+
// Strict allowlist for tool names and their argument keys to avoid picking up
|
|
5
|
+
// stray markup or free-form text as JSON keys (reduces false positives).
|
|
6
|
+
const KNOWN_TOOLS = new Set([
|
|
7
|
+
'shell',
|
|
8
|
+
'apply_patch',
|
|
9
|
+
'update_plan',
|
|
10
|
+
'view_image',
|
|
11
|
+
'list_mcp_resources',
|
|
12
|
+
'read_mcp_resource',
|
|
13
|
+
'list_mcp_resource_templates'
|
|
14
|
+
]);
|
|
15
|
+
const ALLOWED_KEYS = {
|
|
16
|
+
shell: new Set(['command', 'justification', 'timeout_ms', 'with_escalated_permissions', 'workdir']),
|
|
17
|
+
apply_patch: new Set(['patch']),
|
|
18
|
+
update_plan: new Set(['explanation', 'plan']),
|
|
19
|
+
view_image: new Set(['path']),
|
|
20
|
+
list_mcp_resources: new Set(['server', 'cursor', 'filter', 'root']),
|
|
21
|
+
read_mcp_resource: new Set(['server', 'uri', 'cursor']),
|
|
22
|
+
list_mcp_resource_templates: new Set(['server', 'cursor'])
|
|
23
|
+
};
|
|
24
|
+
function normalizeKey(raw) {
|
|
25
|
+
try {
|
|
26
|
+
const t = String(raw || '').trim();
|
|
27
|
+
if (!t)
|
|
28
|
+
return '';
|
|
29
|
+
// Pick the last alphanumeric/underscore token (e.g., '空的\n<tool_call>command' -> 'command')
|
|
30
|
+
const m = t.match(/([A-Za-z_][A-Za-z0-9_]*)$/);
|
|
31
|
+
return m ? m[1] : t;
|
|
32
|
+
}
|
|
33
|
+
catch {
|
|
34
|
+
return String(raw || '');
|
|
35
|
+
}
|
|
36
|
+
}
|
|
37
|
+
function filterArgsForTool(name, args) {
|
|
38
|
+
try {
|
|
39
|
+
const nm = String(name || '').toLowerCase();
|
|
40
|
+
const allow = ALLOWED_KEYS[nm];
|
|
41
|
+
if (!allow) {
|
|
42
|
+
// Unknown tool; be conservative: keep only simple safe keys if present
|
|
43
|
+
const safe = new Set(['command', 'patch', 'plan', 'explanation', 'path', 'server', 'uri', 'cursor', 'filter', 'root']);
|
|
44
|
+
const out = {};
|
|
45
|
+
for (const [k, v] of Object.entries(args || {})) {
|
|
46
|
+
const key = normalizeKey(k);
|
|
47
|
+
if (safe.has(key))
|
|
48
|
+
out[key] = v;
|
|
49
|
+
}
|
|
50
|
+
return out;
|
|
51
|
+
}
|
|
52
|
+
const out = {};
|
|
53
|
+
for (const [k, v] of Object.entries(args || {})) {
|
|
54
|
+
const key = normalizeKey(k);
|
|
55
|
+
if (allow.has(key))
|
|
56
|
+
out[key] = v;
|
|
57
|
+
}
|
|
58
|
+
return out;
|
|
59
|
+
}
|
|
60
|
+
catch {
|
|
61
|
+
return args;
|
|
62
|
+
}
|
|
63
|
+
}
|
|
64
|
+
function enabled() {
|
|
65
|
+
try {
|
|
66
|
+
return String(process?.env?.RCC_TEXT_MARKUP_COMPAT ?? '1').trim() !== '0';
|
|
67
|
+
}
|
|
68
|
+
catch {
|
|
69
|
+
return true;
|
|
70
|
+
}
|
|
71
|
+
}
|
|
72
|
+
// 已移除所有 rcc.tool.v1 相关处理:不再识别或剥离 rcc 封装
|
|
73
|
+
export function extractApplyPatchCallsFromText(text) {
|
|
74
|
+
try {
|
|
75
|
+
if (typeof text !== 'string' || !text)
|
|
76
|
+
return null;
|
|
77
|
+
const out = [];
|
|
78
|
+
const candidates = [];
|
|
79
|
+
const fenceRe = /```(?:patch)?\s*([\s\S]*?)\s*```/gi;
|
|
80
|
+
let fm;
|
|
81
|
+
while ((fm = fenceRe.exec(text)) !== null) {
|
|
82
|
+
const body = fm[1] || '';
|
|
83
|
+
if (/\*\*\*\s+Begin Patch[\s\S]*?\*\*\*\s+End Patch/.test(body))
|
|
84
|
+
candidates.push(body);
|
|
85
|
+
}
|
|
86
|
+
if (/\*\*\*\s+Begin Patch[\s\S]*?\*\*\*\s+End Patch/.test(text))
|
|
87
|
+
candidates.push(text);
|
|
88
|
+
const genId = () => `call_${Math.random().toString(36).slice(2, 10)}`;
|
|
89
|
+
for (const src of candidates) {
|
|
90
|
+
const pg = /\*\*\*\s+Begin Patch[\s\S]*?\*\*\*\s+End Patch/gm;
|
|
91
|
+
let pm;
|
|
92
|
+
while ((pm = pg.exec(src)) !== null) {
|
|
93
|
+
const patch = pm[0];
|
|
94
|
+
if (!patch || patch.length < 32)
|
|
95
|
+
continue;
|
|
96
|
+
let argsStr = '{}';
|
|
97
|
+
try {
|
|
98
|
+
argsStr = JSON.stringify({ patch });
|
|
99
|
+
}
|
|
100
|
+
catch {
|
|
101
|
+
argsStr = '{"patch":""}';
|
|
102
|
+
}
|
|
103
|
+
out.push({ id: genId(), name: 'apply_patch', args: argsStr });
|
|
104
|
+
}
|
|
105
|
+
}
|
|
106
|
+
return out.length ? out : null;
|
|
107
|
+
}
|
|
108
|
+
catch {
|
|
109
|
+
return null;
|
|
110
|
+
}
|
|
111
|
+
}
|
|
112
|
+
export function extractExecuteBlocksFromText(text) {
|
|
113
|
+
try {
|
|
114
|
+
if (typeof text !== 'string' || !text)
|
|
115
|
+
return null;
|
|
116
|
+
const re = /<function=execute>\s*<parameter=command>([\s\S]*?)<\/parameter>\s*<\/function>/gi;
|
|
117
|
+
const out = [];
|
|
118
|
+
let m;
|
|
119
|
+
while ((m = re.exec(text)) !== null) {
|
|
120
|
+
const commandRaw = (m[1] || '').trim();
|
|
121
|
+
if (!commandRaw)
|
|
122
|
+
continue;
|
|
123
|
+
let args = '{}';
|
|
124
|
+
try {
|
|
125
|
+
args = JSON.stringify({ command: commandRaw });
|
|
126
|
+
}
|
|
127
|
+
catch {
|
|
128
|
+
args = '{"command":""}';
|
|
129
|
+
}
|
|
130
|
+
out.push({ id: `call_${Math.random().toString(36).slice(2, 10)}`, name: 'shell', args });
|
|
131
|
+
}
|
|
132
|
+
return out.length ? out : null;
|
|
133
|
+
}
|
|
134
|
+
catch {
|
|
135
|
+
return null;
|
|
136
|
+
}
|
|
137
|
+
}
|
|
138
|
+
// Extract XML-like <tool_call> blocks used by some agents:
|
|
139
|
+
// Example:
|
|
140
|
+
// <tool_call>
|
|
141
|
+
// shell
|
|
142
|
+
// <arg_key>command</arg_key>
|
|
143
|
+
// <arg_value>["cat","codex-protocol/README.md"]</arg_value>
|
|
144
|
+
// </tool_call>
|
|
145
|
+
export function extractXMLToolCallsFromText(text) {
|
|
146
|
+
try {
|
|
147
|
+
if (typeof text !== 'string' || !text)
|
|
148
|
+
return null;
|
|
149
|
+
const out = [];
|
|
150
|
+
const blockRe = /<tool_call[\s\S]*?>([\s\S]*?)<\/tool_call>/gi;
|
|
151
|
+
let bm;
|
|
152
|
+
while ((bm = blockRe.exec(text)) !== null) {
|
|
153
|
+
const inner = (bm[1] || '').trim();
|
|
154
|
+
if (!inner)
|
|
155
|
+
continue;
|
|
156
|
+
// 1) try function/name tags
|
|
157
|
+
let name = '';
|
|
158
|
+
const fnTag = inner.match(/<\s*(?:function|name)\s*>\s*([a-zA-Z0-9_\-\.]+)\s*<\/(?:function|name)\s*>/i);
|
|
159
|
+
if (fnTag && fnTag[1]) {
|
|
160
|
+
name = String(fnTag[1]).trim();
|
|
161
|
+
}
|
|
162
|
+
else {
|
|
163
|
+
// 2) else pick the first non-empty line without tags as the name
|
|
164
|
+
const lines = inner.split(/\r?\n/).map(s => s.trim()).filter(Boolean);
|
|
165
|
+
const candidate = lines.find(l => !l.startsWith('<') && /^[a-zA-Z0-9_\-\.]+$/.test(l));
|
|
166
|
+
if (candidate)
|
|
167
|
+
name = candidate;
|
|
168
|
+
}
|
|
169
|
+
if (!name)
|
|
170
|
+
continue;
|
|
171
|
+
// Guard unknown tool names early if clearly invalid
|
|
172
|
+
const lname = String(name).toLowerCase();
|
|
173
|
+
if (!KNOWN_TOOLS.has(lname)) {
|
|
174
|
+
// still allow through, but later key filtering will drastically reduce noise
|
|
175
|
+
}
|
|
176
|
+
// Collect arg_key/arg_value pairs
|
|
177
|
+
const argRe = /<\s*arg_key\s*>\s*([^<]+?)\s*<\/(?:arg_key)\s*>\s*<\s*arg_value\s*>\s*([\s\S]*?)\s*<\/(?:arg_value)\s*>/gi;
|
|
178
|
+
let am;
|
|
179
|
+
const argsObj = {};
|
|
180
|
+
while ((am = argRe.exec(inner)) !== null) {
|
|
181
|
+
const k = normalizeKey((am[1] || '').trim());
|
|
182
|
+
let vRaw = (am[2] || '').trim();
|
|
183
|
+
if (!k)
|
|
184
|
+
continue;
|
|
185
|
+
// If value looks like JSON array/object, parse; else keep as string
|
|
186
|
+
let v = vRaw;
|
|
187
|
+
if ((vRaw.startsWith('[') && vRaw.endsWith(']')) || (vRaw.startsWith('{') && vRaw.endsWith('}'))) {
|
|
188
|
+
try {
|
|
189
|
+
v = JSON.parse(vRaw);
|
|
190
|
+
}
|
|
191
|
+
catch {
|
|
192
|
+
v = vRaw;
|
|
193
|
+
}
|
|
194
|
+
}
|
|
195
|
+
argsObj[k] = v;
|
|
196
|
+
}
|
|
197
|
+
// If no args collected but inner contains JSON object, try as whole arguments
|
|
198
|
+
const hasAnyArg = Object.keys(argsObj).length > 0;
|
|
199
|
+
if (!hasAnyArg) {
|
|
200
|
+
const jsonMatch = inner.match(/\{[\s\S]*\}|\[[\s\S]*\]/);
|
|
201
|
+
if (jsonMatch) {
|
|
202
|
+
try {
|
|
203
|
+
const val = JSON.parse(jsonMatch[0]);
|
|
204
|
+
argsObj.arguments = val;
|
|
205
|
+
}
|
|
206
|
+
catch { /* ignore */ }
|
|
207
|
+
}
|
|
208
|
+
}
|
|
209
|
+
// Drop keys not allowed for this tool to prevent noise (e.g., '空的<tool_call>command')
|
|
210
|
+
const filtered = filterArgsForTool(lname, argsObj);
|
|
211
|
+
// Guard: view_image must have a valid image path
|
|
212
|
+
try {
|
|
213
|
+
if (lname === 'view_image') {
|
|
214
|
+
const p = (filtered && typeof filtered === 'object') ? filtered.path : undefined;
|
|
215
|
+
if (!isImagePath(p)) {
|
|
216
|
+
continue;
|
|
217
|
+
}
|
|
218
|
+
}
|
|
219
|
+
}
|
|
220
|
+
catch { /* ignore guard errors */ }
|
|
221
|
+
let argsStr = '{}';
|
|
222
|
+
try {
|
|
223
|
+
argsStr = JSON.stringify(filtered);
|
|
224
|
+
}
|
|
225
|
+
catch {
|
|
226
|
+
argsStr = '{}';
|
|
227
|
+
}
|
|
228
|
+
out.push({ id: `call_${Math.random().toString(36).slice(2, 10)}`, name, args: argsStr });
|
|
229
|
+
}
|
|
230
|
+
// Fallback: loose XML variant (missing <tool_call> start), e.g.:
|
|
231
|
+
// shell\n<arg_key>command</arg_key>\n<arg_value>["ls","-la"]</arg_value>\n</tool_call>
|
|
232
|
+
try {
|
|
233
|
+
const pairRe = /<\s*arg_key\s*>\s*([^<]+?)\s*<\/\s*arg_key\s*>\s*<\s*arg_value\s*>\s*([\s\S]*?)\s*<\/\s*arg_value\s*>/gi;
|
|
234
|
+
let pm;
|
|
235
|
+
while ((pm = pairRe.exec(text)) !== null) {
|
|
236
|
+
const start = pm.index;
|
|
237
|
+
// find a likely function name on the immediately preceding non-empty line
|
|
238
|
+
let name = '';
|
|
239
|
+
try {
|
|
240
|
+
const before = text.slice(0, start);
|
|
241
|
+
const lines = before.split(/\r?\n/).map(s => s.trim()).filter(Boolean);
|
|
242
|
+
const cand = lines.length ? lines[lines.length - 1] : '';
|
|
243
|
+
if (/^[a-zA-Z0-9_\-\.]{2,}$/.test(cand))
|
|
244
|
+
name = cand;
|
|
245
|
+
}
|
|
246
|
+
catch { /* ignore */ }
|
|
247
|
+
if (!name)
|
|
248
|
+
continue;
|
|
249
|
+
const k = normalizeKey((pm[1] || '').trim());
|
|
250
|
+
let vRaw = (pm[2] || '').trim();
|
|
251
|
+
const argsObj = {};
|
|
252
|
+
if (k) {
|
|
253
|
+
let v = vRaw;
|
|
254
|
+
if ((vRaw.startsWith('[') && vRaw.endsWith(']')) || (vRaw.startsWith('{') && vRaw.endsWith('}'))) {
|
|
255
|
+
try {
|
|
256
|
+
v = JSON.parse(vRaw);
|
|
257
|
+
}
|
|
258
|
+
catch {
|
|
259
|
+
v = vRaw;
|
|
260
|
+
}
|
|
261
|
+
}
|
|
262
|
+
argsObj[k] = v;
|
|
263
|
+
}
|
|
264
|
+
const lname2 = String(name || '').toLowerCase();
|
|
265
|
+
const filtered2 = filterArgsForTool(lname2, argsObj);
|
|
266
|
+
// Guard: view_image must have a valid image path
|
|
267
|
+
try {
|
|
268
|
+
if (lname2 === 'view_image') {
|
|
269
|
+
const p = (filtered2 && typeof filtered2 === 'object') ? filtered2.path : undefined;
|
|
270
|
+
if (!isImagePath(p)) {
|
|
271
|
+
continue;
|
|
272
|
+
}
|
|
273
|
+
}
|
|
274
|
+
}
|
|
275
|
+
catch { /* ignore guard errors */ }
|
|
276
|
+
let argsStr = '{}';
|
|
277
|
+
try {
|
|
278
|
+
argsStr = JSON.stringify(filtered2);
|
|
279
|
+
}
|
|
280
|
+
catch {
|
|
281
|
+
argsStr = '{}';
|
|
282
|
+
}
|
|
283
|
+
out.push({ id: `call_${Math.random().toString(36).slice(2, 10)}`, name, args: argsStr });
|
|
284
|
+
}
|
|
285
|
+
}
|
|
286
|
+
catch { /* ignore */ }
|
|
287
|
+
return out.length ? out : null;
|
|
288
|
+
}
|
|
289
|
+
catch {
|
|
290
|
+
return null;
|
|
291
|
+
}
|
|
292
|
+
}
|
|
293
|
+
export function normalizeAssistantTextToToolCalls(message) {
|
|
294
|
+
if (!enabled())
|
|
295
|
+
return message;
|
|
296
|
+
try {
|
|
297
|
+
if (!message || typeof message !== 'object')
|
|
298
|
+
return message;
|
|
299
|
+
if (Array.isArray(message.tool_calls) && message.tool_calls.length)
|
|
300
|
+
return message;
|
|
301
|
+
const content = message.content;
|
|
302
|
+
const text = typeof content === 'string' ? content : null;
|
|
303
|
+
if (!text)
|
|
304
|
+
return message;
|
|
305
|
+
// Order: xml-like tool_call → apply_patch → execute blocks
|
|
306
|
+
const calls = (extractXMLToolCallsFromText(text) ||
|
|
307
|
+
extractApplyPatchCallsFromText(text) ||
|
|
308
|
+
extractExecuteBlocksFromText(text));
|
|
309
|
+
if (calls && calls.length) {
|
|
310
|
+
const toolCalls = calls.map((c) => ({ id: c.id, type: 'function', function: { name: c.name, arguments: c.args } }));
|
|
311
|
+
const copy = { ...message };
|
|
312
|
+
copy.tool_calls = toolCalls;
|
|
313
|
+
copy.content = '';
|
|
314
|
+
return copy;
|
|
315
|
+
}
|
|
316
|
+
}
|
|
317
|
+
catch { /* ignore */ }
|
|
318
|
+
return message;
|
|
319
|
+
}
|
|
@@ -0,0 +1,50 @@
|
|
|
1
|
+
// Minimal canonicalizer to ensure tool_calls invariants without altering semantics
|
|
2
|
+
function isObject(v) {
|
|
3
|
+
return !!v && typeof v === 'object' && !Array.isArray(v);
|
|
4
|
+
}
|
|
5
|
+
function repairArgumentsToString(args) {
|
|
6
|
+
if (typeof args === 'string')
|
|
7
|
+
return args;
|
|
8
|
+
try {
|
|
9
|
+
return JSON.stringify(args ?? {});
|
|
10
|
+
}
|
|
11
|
+
catch {
|
|
12
|
+
return String(args);
|
|
13
|
+
}
|
|
14
|
+
}
|
|
15
|
+
export function canonicalizeChatResponseTools(payload) {
|
|
16
|
+
try {
|
|
17
|
+
const out = isObject(payload) ? JSON.parse(JSON.stringify(payload)) : payload;
|
|
18
|
+
const choices = Array.isArray(out?.choices) ? out.choices : [];
|
|
19
|
+
for (const ch of choices) {
|
|
20
|
+
const msg = ch && ch.message ? ch.message : undefined;
|
|
21
|
+
const tcs = Array.isArray(msg?.tool_calls) ? msg.tool_calls : [];
|
|
22
|
+
if (!tcs || !tcs.length)
|
|
23
|
+
continue;
|
|
24
|
+
// ensure arguments is string and content is null when tool_calls present
|
|
25
|
+
try {
|
|
26
|
+
if (!ch.finish_reason)
|
|
27
|
+
ch.finish_reason = 'tool_calls';
|
|
28
|
+
}
|
|
29
|
+
catch { /* ignore */ }
|
|
30
|
+
try {
|
|
31
|
+
if (msg && typeof msg === 'object')
|
|
32
|
+
msg.content = null;
|
|
33
|
+
}
|
|
34
|
+
catch { /* ignore */ }
|
|
35
|
+
for (const tc of tcs) {
|
|
36
|
+
try {
|
|
37
|
+
const fn = tc && tc.function ? tc.function : undefined;
|
|
38
|
+
if (fn)
|
|
39
|
+
fn.arguments = repairArgumentsToString(fn.arguments);
|
|
40
|
+
}
|
|
41
|
+
catch { /* ignore */ }
|
|
42
|
+
}
|
|
43
|
+
}
|
|
44
|
+
return out;
|
|
45
|
+
}
|
|
46
|
+
catch {
|
|
47
|
+
return payload;
|
|
48
|
+
}
|
|
49
|
+
}
|
|
50
|
+
export default canonicalizeChatResponseTools;
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
import { ToolFilterHints } from '../../filters/index.js';
|
|
2
|
+
interface RequestFilterOptions {
|
|
3
|
+
entryEndpoint?: string;
|
|
4
|
+
requestId?: string;
|
|
5
|
+
model?: string;
|
|
6
|
+
profile?: string;
|
|
7
|
+
stream?: boolean;
|
|
8
|
+
toolFilterHints?: ToolFilterHints;
|
|
9
|
+
}
|
|
10
|
+
interface ResponseFilterOptions {
|
|
11
|
+
entryEndpoint?: string;
|
|
12
|
+
requestId?: string;
|
|
13
|
+
profile?: string;
|
|
14
|
+
}
|
|
15
|
+
export declare function runChatRequestToolFilters(chatRequest: any, options?: RequestFilterOptions): Promise<any>;
|
|
16
|
+
export declare function runChatResponseToolFilters(chatJson: any, options?: ResponseFilterOptions): Promise<any>;
|
|
17
|
+
export {};
|
|
@@ -0,0 +1,79 @@
|
|
|
1
|
+
import { FilterEngine } from '../../filters/index.js';
|
|
2
|
+
import { loadFieldMapConfig } from '../../filters/utils/fieldmap-loader.js';
|
|
3
|
+
export async function runChatRequestToolFilters(chatRequest, options = {}) {
|
|
4
|
+
const reqCtxBase = {
|
|
5
|
+
requestId: options.requestId ?? `req_${Date.now()}`,
|
|
6
|
+
model: typeof options.model === 'string' ? options.model : (chatRequest && typeof chatRequest === 'object' && typeof chatRequest.model === 'string' ? String(chatRequest.model) : 'unknown'),
|
|
7
|
+
endpoint: options.entryEndpoint || '/v1/chat/completions',
|
|
8
|
+
profile: options.profile || 'openai-chat',
|
|
9
|
+
stream: options.stream === true,
|
|
10
|
+
toolFilterHints: options.toolFilterHints,
|
|
11
|
+
debug: { emit: () => { } }
|
|
12
|
+
};
|
|
13
|
+
const engine = new FilterEngine();
|
|
14
|
+
try {
|
|
15
|
+
const { RequestToolListFilter } = await import('../../filters/index.js');
|
|
16
|
+
engine.registerFilter(new RequestToolListFilter());
|
|
17
|
+
}
|
|
18
|
+
catch { /* optional */ }
|
|
19
|
+
const { RequestToolCallsStringifyFilter, RequestToolChoicePolicyFilter, RequestStreamingToNonStreamingFilter } = await import('../../filters/index.js');
|
|
20
|
+
engine.registerFilter(new RequestToolCallsStringifyFilter());
|
|
21
|
+
engine.registerFilter(new RequestToolChoicePolicyFilter());
|
|
22
|
+
engine.registerFilter(new RequestStreamingToNonStreamingFilter());
|
|
23
|
+
try {
|
|
24
|
+
const cfg = await loadFieldMapConfig('openai-openai.fieldmap.json');
|
|
25
|
+
if (cfg)
|
|
26
|
+
engine.setFieldMap(cfg);
|
|
27
|
+
engine.registerTransform('stringifyJson', (v) => (typeof v === 'string') ? v : (() => { try {
|
|
28
|
+
return JSON.stringify(v ?? {});
|
|
29
|
+
}
|
|
30
|
+
catch {
|
|
31
|
+
return '{}';
|
|
32
|
+
} })());
|
|
33
|
+
}
|
|
34
|
+
catch { /* ignore */ }
|
|
35
|
+
let staged = await engine.run('request_pre', chatRequest, reqCtxBase);
|
|
36
|
+
staged = await engine.run('request_map', staged, reqCtxBase);
|
|
37
|
+
staged = await engine.run('request_post', staged, reqCtxBase);
|
|
38
|
+
return staged;
|
|
39
|
+
}
|
|
40
|
+
export async function runChatResponseToolFilters(chatJson, options = {}) {
|
|
41
|
+
const resCtxBase = {
|
|
42
|
+
requestId: options.requestId ?? `req_${Date.now()}`,
|
|
43
|
+
model: undefined,
|
|
44
|
+
endpoint: options.entryEndpoint || '/v1/chat/completions',
|
|
45
|
+
profile: options.profile || 'openai-chat',
|
|
46
|
+
debug: { emit: () => { } }
|
|
47
|
+
};
|
|
48
|
+
const engine = new FilterEngine();
|
|
49
|
+
const { ResponseToolTextCanonicalizeFilter, ResponseToolArgumentsStringifyFilter, ResponseFinishInvariantsFilter } = await import('../../filters/index.js');
|
|
50
|
+
engine.registerFilter(new ResponseToolTextCanonicalizeFilter());
|
|
51
|
+
try {
|
|
52
|
+
const { ResponseToolArgumentsToonDecodeFilter, ResponseToolArgumentsBlacklistFilter, ResponseToolArgumentsSchemaConvergeFilter } = await import('../../filters/index.js');
|
|
53
|
+
engine.registerFilter(new ResponseToolArgumentsToonDecodeFilter());
|
|
54
|
+
try {
|
|
55
|
+
engine.registerFilter(new ResponseToolArgumentsSchemaConvergeFilter());
|
|
56
|
+
}
|
|
57
|
+
catch { /* optional */ }
|
|
58
|
+
engine.registerFilter(new ResponseToolArgumentsBlacklistFilter());
|
|
59
|
+
}
|
|
60
|
+
catch { /* optional */ }
|
|
61
|
+
engine.registerFilter(new ResponseToolArgumentsStringifyFilter());
|
|
62
|
+
engine.registerFilter(new ResponseFinishInvariantsFilter());
|
|
63
|
+
try {
|
|
64
|
+
const cfg = await loadFieldMapConfig('openai-openai.fieldmap.json');
|
|
65
|
+
if (cfg)
|
|
66
|
+
engine.setFieldMap(cfg);
|
|
67
|
+
engine.registerTransform('stringifyJson', (v) => (typeof v === 'string') ? v : (() => { try {
|
|
68
|
+
return JSON.stringify(v ?? {});
|
|
69
|
+
}
|
|
70
|
+
catch {
|
|
71
|
+
return '{}';
|
|
72
|
+
} })());
|
|
73
|
+
}
|
|
74
|
+
catch { /* ignore */ }
|
|
75
|
+
let staged = await engine.run('response_pre', chatJson, resCtxBase);
|
|
76
|
+
staged = await engine.run('response_map', staged, resCtxBase);
|
|
77
|
+
staged = await engine.run('response_post', staged, resCtxBase);
|
|
78
|
+
return staged;
|
|
79
|
+
}
|
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
type Unknown = Record<string, unknown>;
|
|
2
|
+
export interface ToolGovernanceOptions {
|
|
3
|
+
injectGuidance?: boolean;
|
|
4
|
+
snapshot?: {
|
|
5
|
+
enabled?: boolean;
|
|
6
|
+
endpoint?: string;
|
|
7
|
+
requestId?: string;
|
|
8
|
+
baseDir?: string;
|
|
9
|
+
};
|
|
10
|
+
}
|
|
11
|
+
/**
|
|
12
|
+
* Process OpenAI Chat request (messages/tools) with unified 标准 governance.
|
|
13
|
+
* - Augment tools (strict schemas)
|
|
14
|
+
* - Inject/Refine system tool guidance (idempotent)
|
|
15
|
+
* - Canonicalize textual tool markup to tool_calls; set content=null when applicable
|
|
16
|
+
*/
|
|
17
|
+
export declare function processChatRequestTools(request: Unknown, opts?: ToolGovernanceOptions): Unknown;
|
|
18
|
+
export declare function processChatResponseTools(resp: Unknown): Unknown;
|
|
19
|
+
export interface GovernContext extends ToolGovernanceOptions {
|
|
20
|
+
phase: 'request' | 'response';
|
|
21
|
+
endpoint?: 'chat' | 'responses' | 'messages';
|
|
22
|
+
stream?: boolean;
|
|
23
|
+
produceRequiredAction?: boolean;
|
|
24
|
+
requestId?: string;
|
|
25
|
+
}
|
|
26
|
+
export declare function governTools(payload: Unknown, ctx: GovernContext): Unknown;
|
|
27
|
+
export {};
|