@copilotkit/aimock 1.45.1 → 1.47.0
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/.claude-plugin/marketplace.json +1 -1
- package/.claude-plugin/plugin.json +1 -1
- package/CHANGELOG.md +25 -1
- package/README.md +11 -2
- package/dist/agui-mock.cjs +25 -25
- package/dist/agui-mock.cjs.map +1 -1
- package/dist/agui-mock.d.cts.map +1 -1
- package/dist/agui-mock.d.ts.map +1 -1
- package/dist/agui-mock.js +25 -25
- package/dist/agui-mock.js.map +1 -1
- package/dist/agui-types.d.cts.map +1 -1
- package/dist/aimock-cli.cjs +15 -1
- package/dist/aimock-cli.cjs.map +1 -1
- package/dist/aimock-cli.d.cts.map +1 -1
- package/dist/aimock-cli.d.ts.map +1 -1
- package/dist/aimock-cli.js +16 -2
- package/dist/aimock-cli.js.map +1 -1
- package/dist/api-key-auth.cjs +10 -9
- package/dist/api-key-auth.cjs.map +1 -1
- package/dist/api-key-auth.d.cts.map +1 -1
- package/dist/api-key-auth.d.ts.map +1 -1
- package/dist/api-key-auth.js +11 -10
- package/dist/api-key-auth.js.map +1 -1
- package/dist/aws-event-stream.cjs +20 -23
- package/dist/aws-event-stream.cjs.map +1 -1
- package/dist/aws-event-stream.d.cts +0 -1
- package/dist/aws-event-stream.d.ts +0 -1
- package/dist/aws-event-stream.js +20 -24
- package/dist/aws-event-stream.js.map +1 -1
- package/dist/batches.cjs +2 -4
- package/dist/batches.cjs.map +1 -1
- package/dist/batches.d.cts.map +1 -1
- package/dist/batches.d.ts.map +1 -1
- package/dist/batches.js +2 -4
- package/dist/batches.js.map +1 -1
- package/dist/bedrock-converse.cjs +139 -161
- package/dist/bedrock-converse.cjs.map +1 -1
- package/dist/bedrock-converse.d.cts.map +1 -1
- package/dist/bedrock-converse.d.ts.map +1 -1
- package/dist/bedrock-converse.js +137 -159
- package/dist/bedrock-converse.js.map +1 -1
- package/dist/bedrock.cjs +175 -216
- package/dist/bedrock.cjs.map +1 -1
- package/dist/bedrock.d.cts.map +1 -1
- package/dist/bedrock.d.ts.map +1 -1
- package/dist/bedrock.js +172 -213
- package/dist/bedrock.js.map +1 -1
- package/dist/byteplus-video.cjs +11 -10
- package/dist/byteplus-video.cjs.map +1 -1
- package/dist/byteplus-video.d.cts.map +1 -1
- package/dist/byteplus-video.d.ts.map +1 -1
- package/dist/byteplus-video.js +5 -4
- package/dist/byteplus-video.js.map +1 -1
- package/dist/chaos.cjs +5 -4
- package/dist/chaos.cjs.map +1 -1
- package/dist/chaos.d.cts.map +1 -1
- package/dist/chaos.d.ts.map +1 -1
- package/dist/chaos.js +5 -4
- package/dist/chaos.js.map +1 -1
- package/dist/cli.cjs +15 -0
- package/dist/cli.cjs.map +1 -1
- package/dist/cli.js +15 -0
- package/dist/cli.js.map +1 -1
- package/dist/cohere.cjs +107 -180
- package/dist/cohere.cjs.map +1 -1
- package/dist/cohere.d.cts.map +1 -1
- package/dist/cohere.d.ts.map +1 -1
- package/dist/cohere.js +106 -179
- package/dist/cohere.js.map +1 -1
- package/dist/config-loader.cjs +29 -1
- package/dist/config-loader.cjs.map +1 -1
- package/dist/config-loader.d.cts +7 -1
- package/dist/config-loader.d.cts.map +1 -1
- package/dist/config-loader.d.ts +7 -1
- package/dist/config-loader.d.ts.map +1 -1
- package/dist/config-loader.js +29 -2
- package/dist/config-loader.js.map +1 -1
- package/dist/count-tokens.cjs +146 -0
- package/dist/count-tokens.cjs.map +1 -0
- package/dist/count-tokens.js +146 -0
- package/dist/count-tokens.js.map +1 -0
- package/dist/elevenlabs-audio.cjs +36 -34
- package/dist/elevenlabs-audio.cjs.map +1 -1
- package/dist/elevenlabs-audio.d.cts.map +1 -1
- package/dist/elevenlabs-audio.d.ts.map +1 -1
- package/dist/elevenlabs-audio.js +33 -31
- package/dist/elevenlabs-audio.js.map +1 -1
- package/dist/elevenlabs-voice.cjs +38 -37
- package/dist/elevenlabs-voice.cjs.map +1 -1
- package/dist/elevenlabs-voice.d.cts.map +1 -1
- package/dist/elevenlabs-voice.d.ts.map +1 -1
- package/dist/elevenlabs-voice.js +33 -32
- package/dist/elevenlabs-voice.js.map +1 -1
- package/dist/embedding-request.cjs +16 -0
- package/dist/embedding-request.cjs.map +1 -0
- package/dist/embedding-request.js +14 -0
- package/dist/embedding-request.js.map +1 -0
- package/dist/embeddings.cjs +30 -20
- package/dist/embeddings.cjs.map +1 -1
- package/dist/embeddings.d.cts.map +1 -1
- package/dist/embeddings.d.ts.map +1 -1
- package/dist/embeddings.js +30 -20
- package/dist/embeddings.js.map +1 -1
- package/dist/fal-audio.cjs +45 -43
- package/dist/fal-audio.cjs.map +1 -1
- package/dist/fal-audio.d.cts.map +1 -1
- package/dist/fal-audio.d.ts.map +1 -1
- package/dist/fal-audio.js +42 -40
- package/dist/fal-audio.js.map +1 -1
- package/dist/fal.cjs +17 -15
- package/dist/fal.cjs.map +1 -1
- package/dist/fal.js +16 -14
- package/dist/fal.js.map +1 -1
- package/dist/files.cjs +2 -4
- package/dist/files.cjs.map +1 -1
- package/dist/files.d.cts.map +1 -1
- package/dist/files.d.ts.map +1 -1
- package/dist/files.js +2 -4
- package/dist/files.js.map +1 -1
- package/dist/fine-tuning.cjs +2 -4
- package/dist/fine-tuning.cjs.map +1 -1
- package/dist/fine-tuning.d.cts.map +1 -1
- package/dist/fine-tuning.d.ts.map +1 -1
- package/dist/fine-tuning.js +2 -4
- package/dist/fine-tuning.js.map +1 -1
- package/dist/fixture-loader.cjs +140 -44
- package/dist/fixture-loader.cjs.map +1 -1
- package/dist/fixture-loader.d.cts.map +1 -1
- package/dist/fixture-loader.d.ts.map +1 -1
- package/dist/fixture-loader.js +141 -46
- package/dist/fixture-loader.js.map +1 -1
- package/dist/gemini-embeddings.cjs +26 -24
- package/dist/gemini-embeddings.cjs.map +1 -1
- package/dist/gemini-embeddings.js +26 -24
- package/dist/gemini-embeddings.js.map +1 -1
- package/dist/gemini-interactions.cjs +113 -156
- package/dist/gemini-interactions.cjs.map +1 -1
- package/dist/gemini-interactions.d.cts +0 -1
- package/dist/gemini-interactions.d.cts.map +1 -1
- package/dist/gemini-interactions.d.ts +0 -1
- package/dist/gemini-interactions.d.ts.map +1 -1
- package/dist/gemini-interactions.js +113 -156
- package/dist/gemini-interactions.js.map +1 -1
- package/dist/gemini.cjs +295 -218
- package/dist/gemini.cjs.map +1 -1
- package/dist/gemini.d.cts.map +1 -1
- package/dist/gemini.d.ts.map +1 -1
- package/dist/gemini.js +295 -219
- package/dist/gemini.js.map +1 -1
- package/dist/grok-video.cjs +14 -12
- package/dist/grok-video.cjs.map +1 -1
- package/dist/grok-video.d.cts.map +1 -1
- package/dist/grok-video.d.ts.map +1 -1
- package/dist/grok-video.js +8 -6
- package/dist/grok-video.js.map +1 -1
- package/dist/helpers.cjs +411 -75
- package/dist/helpers.cjs.map +1 -1
- package/dist/helpers.d.cts +51 -1
- package/dist/helpers.d.cts.map +1 -1
- package/dist/helpers.d.ts +51 -1
- package/dist/helpers.d.ts.map +1 -1
- package/dist/helpers.js +402 -74
- package/dist/helpers.js.map +1 -1
- package/dist/images.cjs +30 -28
- package/dist/images.cjs.map +1 -1
- package/dist/images.d.cts.map +1 -1
- package/dist/images.d.ts.map +1 -1
- package/dist/images.js +27 -25
- package/dist/images.js.map +1 -1
- package/dist/index.cjs +4 -2
- package/dist/index.d.cts +4 -4
- package/dist/index.d.ts +4 -4
- package/dist/index.js +4 -4
- package/dist/journal.cjs +3 -1
- package/dist/journal.cjs.map +1 -1
- package/dist/journal.d.cts.map +1 -1
- package/dist/journal.d.ts.map +1 -1
- package/dist/journal.js +2 -1
- package/dist/journal.js.map +1 -1
- package/dist/llmock.cjs +3 -0
- package/dist/llmock.cjs.map +1 -1
- package/dist/llmock.d.cts.map +1 -1
- package/dist/llmock.d.ts.map +1 -1
- package/dist/llmock.js +3 -0
- package/dist/llmock.js.map +1 -1
- package/dist/mcp-fakes.d.cts.map +1 -1
- package/dist/mcp-handler.cjs +7 -3
- package/dist/mcp-handler.cjs.map +1 -1
- package/dist/mcp-handler.js +7 -3
- package/dist/mcp-handler.js.map +1 -1
- package/dist/mcp-recorder.cjs +2 -1
- package/dist/mcp-recorder.cjs.map +1 -1
- package/dist/mcp-recorder.js +3 -2
- package/dist/mcp-recorder.js.map +1 -1
- package/dist/messages.cjs +235 -202
- package/dist/messages.cjs.map +1 -1
- package/dist/messages.d.cts.map +1 -1
- package/dist/messages.d.ts.map +1 -1
- package/dist/messages.js +234 -202
- package/dist/messages.js.map +1 -1
- package/dist/metrics.cjs +5 -2
- package/dist/metrics.cjs.map +1 -1
- package/dist/metrics.d.cts.map +1 -1
- package/dist/metrics.d.ts.map +1 -1
- package/dist/metrics.js +6 -3
- package/dist/metrics.js.map +1 -1
- package/dist/misbehavior.cjs +62 -3
- package/dist/misbehavior.cjs.map +1 -1
- package/dist/misbehavior.d.cts.map +1 -1
- package/dist/misbehavior.d.ts.map +1 -1
- package/dist/misbehavior.js +63 -4
- package/dist/misbehavior.js.map +1 -1
- package/dist/model-utils.cjs +1 -0
- package/dist/model-utils.cjs.map +1 -1
- package/dist/model-utils.js +1 -1
- package/dist/model-utils.js.map +1 -1
- package/dist/moderation.cjs +15 -12
- package/dist/moderation.cjs.map +1 -1
- package/dist/moderation.js +14 -11
- package/dist/moderation.js.map +1 -1
- package/dist/ndjson-writer.cjs +21 -23
- package/dist/ndjson-writer.cjs.map +1 -1
- package/dist/ndjson-writer.d.cts +0 -1
- package/dist/ndjson-writer.d.cts.map +1 -1
- package/dist/ndjson-writer.d.ts +0 -1
- package/dist/ndjson-writer.d.ts.map +1 -1
- package/dist/ndjson-writer.js +21 -24
- package/dist/ndjson-writer.js.map +1 -1
- package/dist/ollama.cjs +276 -210
- package/dist/ollama.cjs.map +1 -1
- package/dist/ollama.d.cts.map +1 -1
- package/dist/ollama.d.ts.map +1 -1
- package/dist/ollama.js +273 -207
- package/dist/ollama.js.map +1 -1
- package/dist/openapi.cjs +323 -3
- package/dist/openapi.cjs.map +1 -1
- package/dist/openapi.d.cts.map +1 -1
- package/dist/openapi.d.ts.map +1 -1
- package/dist/openapi.js +324 -4
- package/dist/openapi.js.map +1 -1
- package/dist/openrouter-chat.cjs +11 -155
- package/dist/openrouter-chat.cjs.map +1 -1
- package/dist/openrouter-chat.js +11 -155
- package/dist/openrouter-chat.js.map +1 -1
- package/dist/openrouter-video.cjs +51 -74
- package/dist/openrouter-video.cjs.map +1 -1
- package/dist/openrouter-video.d.cts.map +1 -1
- package/dist/openrouter-video.d.ts.map +1 -1
- package/dist/openrouter-video.js +37 -60
- package/dist/openrouter-video.js.map +1 -1
- package/dist/raw-validation.cjs +177 -0
- package/dist/raw-validation.cjs.map +1 -0
- package/dist/raw-validation.js +176 -0
- package/dist/raw-validation.js.map +1 -0
- package/dist/recorder.cjs +176 -95
- package/dist/recorder.cjs.map +1 -1
- package/dist/recorder.d.cts.map +1 -1
- package/dist/recorder.d.ts.map +1 -1
- package/dist/recorder.js +176 -95
- package/dist/recorder.js.map +1 -1
- package/dist/rerank.cjs +13 -11
- package/dist/rerank.cjs.map +1 -1
- package/dist/rerank.js +12 -10
- package/dist/rerank.js.map +1 -1
- package/dist/response/catalog/anthropic-page.cjs +39 -0
- package/dist/response/catalog/anthropic-page.cjs.map +1 -0
- package/dist/response/catalog/anthropic-page.js +38 -0
- package/dist/response/catalog/anthropic-page.js.map +1 -0
- package/dist/response/catalog/collect.cjs +61 -0
- package/dist/response/catalog/collect.cjs.map +1 -0
- package/dist/response/catalog/collect.js +59 -0
- package/dist/response/catalog/collect.js.map +1 -0
- package/dist/response/catalog/gemini-page.cjs +25 -0
- package/dist/response/catalog/gemini-page.cjs.map +1 -0
- package/dist/response/catalog/gemini-page.js +24 -0
- package/dist/response/catalog/gemini-page.js.map +1 -0
- package/dist/response/catalog/render.cjs +182 -0
- package/dist/response/catalog/render.cjs.map +1 -0
- package/dist/response/catalog/render.js +171 -0
- package/dist/response/catalog/render.js.map +1 -0
- package/dist/response/deliver.cjs +144 -0
- package/dist/response/deliver.cjs.map +1 -0
- package/dist/response/deliver.js +143 -0
- package/dist/response/deliver.js.map +1 -0
- package/dist/response/errors.cjs +225 -0
- package/dist/response/errors.cjs.map +1 -0
- package/dist/response/errors.js +224 -0
- package/dist/response/errors.js.map +1 -0
- package/dist/response/finish.cjs +39 -0
- package/dist/response/finish.cjs.map +1 -0
- package/dist/response/finish.js +35 -0
- package/dist/response/finish.js.map +1 -0
- package/dist/response/frame-loop.cjs +102 -0
- package/dist/response/frame-loop.cjs.map +1 -0
- package/dist/response/frame-loop.js +100 -0
- package/dist/response/frame-loop.js.map +1 -0
- package/dist/response/lifecycle.cjs +223 -0
- package/dist/response/lifecycle.cjs.map +1 -0
- package/dist/response/lifecycle.js +211 -0
- package/dist/response/lifecycle.js.map +1 -0
- package/dist/response/policy.cjs +126 -0
- package/dist/response/policy.cjs.map +1 -0
- package/dist/response/policy.js +120 -0
- package/dist/response/policy.js.map +1 -0
- package/dist/response/profiles.cjs +69 -0
- package/dist/response/profiles.cjs.map +1 -0
- package/dist/response/profiles.js +65 -0
- package/dist/response/profiles.js.map +1 -0
- package/dist/response/proxy.cjs +71 -0
- package/dist/response/proxy.cjs.map +1 -0
- package/dist/response/proxy.js +70 -0
- package/dist/response/proxy.js.map +1 -0
- package/dist/response/raw.cjs +228 -0
- package/dist/response/raw.cjs.map +1 -0
- package/dist/response/raw.js +227 -0
- package/dist/response/raw.js.map +1 -0
- package/dist/response/timing.cjs +157 -0
- package/dist/response/timing.cjs.map +1 -0
- package/dist/response/timing.js +150 -0
- package/dist/response/timing.js.map +1 -0
- package/dist/response/usage/codecs/anthropic.cjs +52 -0
- package/dist/response/usage/codecs/anthropic.cjs.map +1 -0
- package/dist/response/usage/codecs/anthropic.js +50 -0
- package/dist/response/usage/codecs/anthropic.js.map +1 -0
- package/dist/response/usage/codecs/cohere.cjs +36 -0
- package/dist/response/usage/codecs/cohere.cjs.map +1 -0
- package/dist/response/usage/codecs/cohere.js +35 -0
- package/dist/response/usage/codecs/cohere.js.map +1 -0
- package/dist/response/usage/codecs/converse.cjs +16 -0
- package/dist/response/usage/codecs/converse.cjs.map +1 -0
- package/dist/response/usage/codecs/converse.js +15 -0
- package/dist/response/usage/codecs/converse.js.map +1 -0
- package/dist/response/usage/codecs/gemini.cjs +31 -0
- package/dist/response/usage/codecs/gemini.cjs.map +1 -0
- package/dist/response/usage/codecs/gemini.js +31 -0
- package/dist/response/usage/codecs/gemini.js.map +1 -0
- package/dist/response/usage/codecs/interactions.cjs +22 -0
- package/dist/response/usage/codecs/interactions.cjs.map +1 -0
- package/dist/response/usage/codecs/interactions.js +21 -0
- package/dist/response/usage/codecs/interactions.js.map +1 -0
- package/dist/response/usage/codecs/ollama.cjs +17 -0
- package/dist/response/usage/codecs/ollama.cjs.map +1 -0
- package/dist/response/usage/codecs/ollama.js +17 -0
- package/dist/response/usage/codecs/ollama.js.map +1 -0
- package/dist/response/usage/codecs/openai.cjs +52 -0
- package/dist/response/usage/codecs/openai.cjs.map +1 -0
- package/dist/response/usage/codecs/openai.js +50 -0
- package/dist/response/usage/codecs/openai.js.map +1 -0
- package/dist/response/usage/codecs/openrouter.cjs +68 -0
- package/dist/response/usage/codecs/openrouter.cjs.map +1 -0
- package/dist/response/usage/codecs/openrouter.js +67 -0
- package/dist/response/usage/codecs/openrouter.js.map +1 -0
- package/dist/response/usage/codecs/realtime.cjs +19 -0
- package/dist/response/usage/codecs/realtime.cjs.map +1 -0
- package/dist/response/usage/codecs/realtime.js +18 -0
- package/dist/response/usage/codecs/realtime.js.map +1 -0
- package/dist/response/usage/codecs/responses.cjs +21 -0
- package/dist/response/usage/codecs/responses.cjs.map +1 -0
- package/dist/response/usage/codecs/responses.js +20 -0
- package/dist/response/usage/codecs/responses.js.map +1 -0
- package/dist/response/usage/estimate.cjs +23 -0
- package/dist/response/usage/estimate.cjs.map +1 -0
- package/dist/response/usage/estimate.js +21 -0
- package/dist/response/usage/estimate.js.map +1 -0
- package/dist/response/usage/fields.cjs +72 -0
- package/dist/response/usage/fields.cjs.map +1 -0
- package/dist/response/usage/fields.js +70 -0
- package/dist/response/usage/fields.js.map +1 -0
- package/dist/response/usage/recording.cjs +52 -0
- package/dist/response/usage/recording.cjs.map +1 -0
- package/dist/response/usage/recording.js +52 -0
- package/dist/response/usage/recording.js.map +1 -0
- package/dist/responses.cjs +304 -196
- package/dist/responses.cjs.map +1 -1
- package/dist/responses.d.cts.map +1 -1
- package/dist/responses.d.ts.map +1 -1
- package/dist/responses.js +303 -195
- package/dist/responses.js.map +1 -1
- package/dist/route-registry.cjs +45 -0
- package/dist/route-registry.cjs.map +1 -1
- package/dist/route-registry.d.cts.map +1 -1
- package/dist/route-registry.d.ts.map +1 -1
- package/dist/route-registry.js +41 -1
- package/dist/route-registry.js.map +1 -1
- package/dist/router.cjs +24 -4
- package/dist/router.cjs.map +1 -1
- package/dist/router.d.cts +7 -1
- package/dist/router.d.cts.map +1 -1
- package/dist/router.d.ts +7 -1
- package/dist/router.d.ts.map +1 -1
- package/dist/router.js +24 -5
- package/dist/router.js.map +1 -1
- package/dist/search.cjs +13 -11
- package/dist/search.cjs.map +1 -1
- package/dist/search.js +12 -10
- package/dist/search.js.map +1 -1
- package/dist/server.cjs +293 -248
- package/dist/server.cjs.map +1 -1
- package/dist/server.d.cts.map +1 -1
- package/dist/server.d.ts.map +1 -1
- package/dist/server.js +294 -249
- package/dist/server.js.map +1 -1
- package/dist/speech.cjs +20 -18
- package/dist/speech.cjs.map +1 -1
- package/dist/speech.d.cts.map +1 -1
- package/dist/speech.d.ts.map +1 -1
- package/dist/speech.js +19 -17
- package/dist/speech.js.map +1 -1
- package/dist/sse-writer.cjs +56 -30
- package/dist/sse-writer.cjs.map +1 -1
- package/dist/sse-writer.d.cts +0 -1
- package/dist/sse-writer.d.cts.map +1 -1
- package/dist/sse-writer.d.ts +0 -1
- package/dist/sse-writer.d.ts.map +1 -1
- package/dist/sse-writer.js +55 -31
- package/dist/sse-writer.js.map +1 -1
- package/dist/stream-collapse.cjs +118 -11
- package/dist/stream-collapse.cjs.map +1 -1
- package/dist/stream-collapse.d.cts +10 -9
- package/dist/stream-collapse.d.cts.map +1 -1
- package/dist/stream-collapse.d.ts +10 -9
- package/dist/stream-collapse.d.ts.map +1 -1
- package/dist/stream-collapse.js +118 -11
- package/dist/stream-collapse.js.map +1 -1
- package/dist/transcription.cjs +31 -43
- package/dist/transcription.cjs.map +1 -1
- package/dist/transcription.d.cts.map +1 -1
- package/dist/transcription.d.ts.map +1 -1
- package/dist/transcription.js +31 -43
- package/dist/transcription.js.map +1 -1
- package/dist/types.cjs.map +1 -1
- package/dist/types.d.cts +231 -9
- package/dist/types.d.cts.map +1 -1
- package/dist/types.d.ts +231 -9
- package/dist/types.d.ts.map +1 -1
- package/dist/types.js.map +1 -1
- package/dist/vector-mock.cjs +3 -8
- package/dist/vector-mock.cjs.map +1 -1
- package/dist/vector-mock.d.cts.map +1 -1
- package/dist/vector-mock.d.ts.map +1 -1
- package/dist/vector-mock.js +3 -8
- package/dist/vector-mock.js.map +1 -1
- package/dist/vector-stores.cjs +2 -4
- package/dist/vector-stores.cjs.map +1 -1
- package/dist/vector-stores.d.cts.map +1 -1
- package/dist/vector-stores.d.ts.map +1 -1
- package/dist/vector-stores.js +2 -4
- package/dist/vector-stores.js.map +1 -1
- package/dist/veo-video.cjs +16 -14
- package/dist/veo-video.cjs.map +1 -1
- package/dist/veo-video.js +10 -8
- package/dist/veo-video.js.map +1 -1
- package/dist/video.cjs +21 -19
- package/dist/video.cjs.map +1 -1
- package/dist/video.d.cts.map +1 -1
- package/dist/video.d.ts.map +1 -1
- package/dist/video.js +20 -18
- package/dist/video.js.map +1 -1
- package/dist/ws-framing.cjs +12 -6
- package/dist/ws-framing.cjs.map +1 -1
- package/dist/ws-framing.d.cts +2 -0
- package/dist/ws-framing.d.cts.map +1 -1
- package/dist/ws-framing.d.ts +2 -0
- package/dist/ws-framing.d.ts.map +1 -1
- package/dist/ws-framing.js +12 -6
- package/dist/ws-framing.js.map +1 -1
- package/dist/ws-gemini-live.cjs +131 -96
- package/dist/ws-gemini-live.cjs.map +1 -1
- package/dist/ws-gemini-live.d.cts +0 -1
- package/dist/ws-gemini-live.d.cts.map +1 -1
- package/dist/ws-gemini-live.d.ts +0 -1
- package/dist/ws-gemini-live.d.ts.map +1 -1
- package/dist/ws-gemini-live.js +130 -95
- package/dist/ws-gemini-live.js.map +1 -1
- package/dist/ws-live.cjs +6 -5
- package/dist/ws-live.cjs.map +1 -1
- package/dist/ws-live.js +5 -4
- package/dist/ws-live.js.map +1 -1
- package/dist/ws-realtime.cjs +108 -124
- package/dist/ws-realtime.cjs.map +1 -1
- package/dist/ws-realtime.d.cts.map +1 -1
- package/dist/ws-realtime.d.ts.map +1 -1
- package/dist/ws-realtime.js +105 -121
- package/dist/ws-realtime.js.map +1 -1
- package/dist/ws-responses.cjs +80 -59
- package/dist/ws-responses.cjs.map +1 -1
- package/dist/ws-responses.d.cts.map +1 -1
- package/dist/ws-responses.d.ts.map +1 -1
- package/dist/ws-responses.js +79 -58
- package/dist/ws-responses.js.map +1 -1
- package/package.json +4 -1
- package/skills/write-fixtures/SKILL.md +57 -16
package/dist/bedrock-converse.js
CHANGED
|
@@ -1,19 +1,23 @@
|
|
|
1
|
-
import {
|
|
1
|
+
import { renderError } from "./response/errors.js";
|
|
2
|
+
import { resolveRequestDecisions, strictOverrideField } from "./response/policy.js";
|
|
3
|
+
import { InvalidToolArgumentsError, estimatePromptTokens, estimateTokens, extractOverrides, flattenHeaders, generateToolUseId, getContext, getTestId, isCombinedFixtureResponse, isErrorResponse, isJsonObject, isRawResponse, isTextResponse, isToolCallResponse, requireEmittedFunctionToolCalls, resolveFixtureBlockOutcome, resolveReasoningForModel, resolveResponse, servedToolArgs, strictNoMatchLogLine, strictNoMatchMessage, toolArgsForWire } from "./helpers.js";
|
|
2
4
|
import { writeErrorResponse } from "./sse-writer.js";
|
|
3
5
|
import { applyChaosAsync } from "./chaos.js";
|
|
4
6
|
import { planMisbehavior, recordMisbehaviorOutcome } from "./misbehavior.js";
|
|
5
7
|
import { matchFixtureDiagnostic, recordMatchOptions } from "./router.js";
|
|
6
8
|
import { proxyAndRecord } from "./recorder.js";
|
|
7
|
-
import {
|
|
8
|
-
import {
|
|
9
|
+
import { misbehaviorPayloadLength, servedPayloadLength } from "./response/timing.js";
|
|
10
|
+
import { deliverJson, deliverStream } from "./response/deliver.js";
|
|
11
|
+
import { proxyInterruption, withHangUpDetection } from "./response/proxy.js";
|
|
12
|
+
import { eventStreamCodec } from "./aws-event-stream.js";
|
|
13
|
+
import { serveRawResponse } from "./response/raw.js";
|
|
14
|
+
import { mapAnthropicFinish } from "./response/finish.js";
|
|
15
|
+
import { render } from "./response/usage/codecs/converse.js";
|
|
9
16
|
|
|
10
17
|
//#region src/bedrock-converse.ts
|
|
11
18
|
function converseStopReason(overrideFinishReason, defaultReason) {
|
|
12
19
|
if (!overrideFinishReason) return defaultReason;
|
|
13
|
-
|
|
14
|
-
if (overrideFinishReason === "tool_calls") return "tool_use";
|
|
15
|
-
if (overrideFinishReason === "length") return "max_tokens";
|
|
16
|
-
return overrideFinishReason;
|
|
20
|
+
return mapAnthropicFinish(overrideFinishReason);
|
|
17
21
|
}
|
|
18
22
|
/**
|
|
19
23
|
* Build Converse-format usage from fixture overrides.
|
|
@@ -24,18 +28,7 @@ function converseStopReason(overrideFinishReason, defaultReason) {
|
|
|
24
28
|
* usage should supply explicit `usage` overrides in their fixture.
|
|
25
29
|
*/
|
|
26
30
|
function converseUsage(overrides) {
|
|
27
|
-
|
|
28
|
-
inputTokens: 0,
|
|
29
|
-
outputTokens: 0,
|
|
30
|
-
totalTokens: 0
|
|
31
|
-
};
|
|
32
|
-
const inputTokens = overrides.usage.input_tokens ?? overrides.usage.prompt_tokens ?? 0;
|
|
33
|
-
const outputTokens = overrides.usage.output_tokens ?? overrides.usage.completion_tokens ?? 0;
|
|
34
|
-
return {
|
|
35
|
-
inputTokens,
|
|
36
|
-
outputTokens,
|
|
37
|
-
totalTokens: inputTokens + outputTokens
|
|
38
|
-
};
|
|
31
|
+
return render(overrides);
|
|
39
32
|
}
|
|
40
33
|
function parseConverseToolArgumentsForStream(toolCall, logger) {
|
|
41
34
|
return servedToolArgs(toolCall, "string", logger).text;
|
|
@@ -519,7 +512,7 @@ function prepareConverseMisbehavior(plan, request, stream, defaults, headers) {
|
|
|
519
512
|
} : block;
|
|
520
513
|
});
|
|
521
514
|
}
|
|
522
|
-
const reasoning = plan.reasoning ?? resolveReasoningForModel("reasoning" in response ? response.reasoning : void 0, request.model,
|
|
515
|
+
const reasoning = plan.reasoning ?? resolveReasoningForModel("reasoning" in response ? response.reasoning : void 0, request.model, resolveRequestDecisions(defaults.strict, headers).reasoningSuppression, defaults.logger) ?? "";
|
|
523
516
|
const servedToolCalls = blocks.flatMap((block) => block.type === "toolCall" ? [{
|
|
524
517
|
name: block.name,
|
|
525
518
|
arguments: block.arguments,
|
|
@@ -538,11 +531,10 @@ function prepareConverseMisbehavior(plan, request, stream, defaults, headers) {
|
|
|
538
531
|
blocks,
|
|
539
532
|
reasoning,
|
|
540
533
|
stopReason,
|
|
541
|
-
usage: {
|
|
542
|
-
inputTokens,
|
|
543
|
-
outputTokens
|
|
544
|
-
|
|
545
|
-
}
|
|
534
|
+
usage: render(void 0, {
|
|
535
|
+
input: inputTokens,
|
|
536
|
+
output: outputTokens
|
|
537
|
+
})
|
|
546
538
|
};
|
|
547
539
|
}
|
|
548
540
|
function buildConverseMisbehaviorResponse(prepared) {
|
|
@@ -651,10 +643,10 @@ async function handleConverse(req, res, raw, modelId, fixtures, journal, default
|
|
|
651
643
|
fixture: null
|
|
652
644
|
}
|
|
653
645
|
});
|
|
654
|
-
writeErrorResponse(res, 400,
|
|
646
|
+
writeErrorResponse(res, 400, renderError("bedrock", "validation", {
|
|
655
647
|
message: `Malformed JSON: ${detail}`,
|
|
656
648
|
type: "invalid_request_error"
|
|
657
|
-
}
|
|
649
|
+
}).body);
|
|
658
650
|
return;
|
|
659
651
|
}
|
|
660
652
|
if (!isJsonObject(converseReq)) {
|
|
@@ -668,10 +660,10 @@ async function handleConverse(req, res, raw, modelId, fixtures, journal, default
|
|
|
668
660
|
fixture: null
|
|
669
661
|
}
|
|
670
662
|
});
|
|
671
|
-
writeErrorResponse(res, 400,
|
|
663
|
+
writeErrorResponse(res, 400, renderError("bedrock", "validation", {
|
|
672
664
|
message: "Request body must be a JSON object",
|
|
673
665
|
type: "invalid_request_error"
|
|
674
|
-
}
|
|
666
|
+
}).body);
|
|
675
667
|
return;
|
|
676
668
|
}
|
|
677
669
|
const messageError = !Array.isArray(converseReq.messages) ? "Invalid request: messages array is required" : validateConverseMessages(converseReq) ?? validateConverseSystem(converseReq) ?? validateConverseTools(converseReq);
|
|
@@ -686,17 +678,20 @@ async function handleConverse(req, res, raw, modelId, fixtures, journal, default
|
|
|
686
678
|
fixture: null
|
|
687
679
|
}
|
|
688
680
|
});
|
|
689
|
-
writeErrorResponse(res, 400,
|
|
681
|
+
writeErrorResponse(res, 400, renderError("bedrock", "validation", {
|
|
690
682
|
message: messageError,
|
|
691
683
|
type: "invalid_request_error"
|
|
692
|
-
}
|
|
684
|
+
}).body);
|
|
693
685
|
return;
|
|
694
686
|
}
|
|
695
687
|
const completionReq = converseToCompletionRequest(converseReq, modelId, logger);
|
|
696
688
|
completionReq._endpointType = "chat";
|
|
697
689
|
completionReq._context = getContext(req);
|
|
698
690
|
const testId = getTestId(req);
|
|
699
|
-
const { fixture, skippedBySequenceOrTurn } = matchFixtureDiagnostic(fixtures, completionReq, journal.getFixtureMatchCountsForTest(testId), defaults.requestTransform,
|
|
691
|
+
const { fixture, skippedBySequenceOrTurn } = matchFixtureDiagnostic(fixtures, completionReq, journal.getFixtureMatchCountsForTest(testId), defaults.requestTransform, {
|
|
692
|
+
...recordMatchOptions(!!defaults.record, defaults.logger),
|
|
693
|
+
wire: "bedrock-converse"
|
|
694
|
+
});
|
|
700
695
|
if (fixture) logger.debug(`Fixture matched: ${JSON.stringify(fixture.match).slice(0, 120)}`);
|
|
701
696
|
else logger.debug(`No fixture matched for request`);
|
|
702
697
|
if (fixture) journal.incrementFixtureMatchCount(fixture, fixtures, testId);
|
|
@@ -707,7 +702,7 @@ async function handleConverse(req, res, raw, modelId, fixtures, journal, default
|
|
|
707
702
|
body: completionReq
|
|
708
703
|
}, fixture ? "fixture" : "proxy", defaults.registry, defaults.logger)) return;
|
|
709
704
|
if (!fixture) {
|
|
710
|
-
if (
|
|
705
|
+
if (resolveRequestDecisions(defaults.strict, req.headers).fixtureMiss) {
|
|
711
706
|
const strictStatus = 503;
|
|
712
707
|
const strictMessage = strictNoMatchMessage(skippedBySequenceOrTurn);
|
|
713
708
|
logger.error(strictNoMatchLogLine(req.method ?? "POST", urlPath, skippedBySequenceOrTurn));
|
|
@@ -722,14 +717,14 @@ async function handleConverse(req, res, raw, modelId, fixtures, journal, default
|
|
|
722
717
|
...strictOverrideField(defaults.strict, req.headers)
|
|
723
718
|
}
|
|
724
719
|
});
|
|
725
|
-
writeErrorResponse(res, strictStatus,
|
|
720
|
+
writeErrorResponse(res, strictStatus, renderError("bedrock", "strict-miss", {
|
|
726
721
|
message: strictMessage,
|
|
727
722
|
type: "invalid_request_error"
|
|
728
|
-
}
|
|
723
|
+
}).body);
|
|
729
724
|
return;
|
|
730
725
|
}
|
|
731
726
|
if (defaults.record) {
|
|
732
|
-
const outcome = await proxyAndRecord(req, res, completionReq, "bedrock", urlPath, fixtures, defaults, raw);
|
|
727
|
+
const { outcome, clientHungUp } = await withHangUpDetection(req, res, () => proxyAndRecord(req, res, completionReq, "bedrock", urlPath, fixtures, defaults, raw));
|
|
733
728
|
if (outcome === "handled_by_hook") return;
|
|
734
729
|
if (outcome !== "not_configured") {
|
|
735
730
|
journal.add({
|
|
@@ -740,7 +735,8 @@ async function handleConverse(req, res, raw, modelId, fixtures, journal, default
|
|
|
740
735
|
response: {
|
|
741
736
|
status: res.statusCode ?? 200,
|
|
742
737
|
fixture: null,
|
|
743
|
-
source: "proxy"
|
|
738
|
+
source: "proxy",
|
|
739
|
+
...proxyInterruption(res, clientHungUp)
|
|
744
740
|
}
|
|
745
741
|
});
|
|
746
742
|
return;
|
|
@@ -757,10 +753,10 @@ async function handleConverse(req, res, raw, modelId, fixtures, journal, default
|
|
|
757
753
|
...strictOverrideField(defaults.strict, req.headers)
|
|
758
754
|
}
|
|
759
755
|
});
|
|
760
|
-
writeErrorResponse(res, 404,
|
|
756
|
+
writeErrorResponse(res, 404, renderError("bedrock", "fixture-miss", {
|
|
761
757
|
message: "No fixture matched",
|
|
762
758
|
type: "invalid_request_error"
|
|
763
|
-
}
|
|
759
|
+
}).body);
|
|
764
760
|
return;
|
|
765
761
|
}
|
|
766
762
|
const response = await resolveResponse(fixture, completionReq);
|
|
@@ -800,18 +796,26 @@ async function handleConverse(req, res, raw, modelId, fixtures, journal, default
|
|
|
800
796
|
});
|
|
801
797
|
const type = misbehavior.status === 400 ? "ValidationException" : "InternalServerException";
|
|
802
798
|
res.setHeader("x-amzn-errortype", type);
|
|
803
|
-
writeErrorResponse(res, misbehavior.status,
|
|
804
|
-
|
|
799
|
+
writeErrorResponse(res, misbehavior.status, renderError("bedrock-converse", "misbehavior", {
|
|
800
|
+
type,
|
|
805
801
|
message: misbehavior.message,
|
|
806
802
|
code: misbehavior.code
|
|
807
|
-
}));
|
|
803
|
+
}).body);
|
|
808
804
|
return;
|
|
809
805
|
}
|
|
806
|
+
const jsonOpts = (payloadLength, duplicateId = false) => ({
|
|
807
|
+
surface: "other",
|
|
808
|
+
payloadLength,
|
|
809
|
+
chunkSize: Math.max(1, fixture.chunkSize ?? defaults.chunkSize),
|
|
810
|
+
recordedTimings: fixture.recordedTimings,
|
|
811
|
+
duplicateId,
|
|
812
|
+
replaySpeed: fixture.replaySpeed ?? defaults.replaySpeed
|
|
813
|
+
});
|
|
810
814
|
if (misbehavior.kind === "applied") {
|
|
811
815
|
const prepared = prepareConverseMisbehavior(misbehavior, completionReq, false, defaults, req.headers);
|
|
812
816
|
misbehavior = prepared.plan;
|
|
813
817
|
const body = buildConverseMisbehaviorResponse(prepared);
|
|
814
|
-
addResponseEntry({
|
|
818
|
+
await deliverJson(res, addResponseEntry({
|
|
815
819
|
method: req.method ?? "POST",
|
|
816
820
|
path: urlPath,
|
|
817
821
|
headers: flattenHeaders(req.headers),
|
|
@@ -820,9 +824,24 @@ async function handleConverse(req, res, raw, modelId, fixtures, journal, default
|
|
|
820
824
|
status: 200,
|
|
821
825
|
fixture
|
|
822
826
|
}
|
|
827
|
+
}), fixture, () => body, jsonOpts(misbehaviorPayloadLength(prepared.plan, prepared.plan.reasoning === void 0 ? prepared.reasoning : void 0), !!prepared.plan.duplicateId));
|
|
828
|
+
return;
|
|
829
|
+
}
|
|
830
|
+
if (isRawResponse(response)) {
|
|
831
|
+
await serveRawResponse({
|
|
832
|
+
wire: "bedrock-converse",
|
|
833
|
+
stream: false,
|
|
834
|
+
req,
|
|
835
|
+
res,
|
|
836
|
+
fixture,
|
|
837
|
+
response,
|
|
838
|
+
body: completionReq,
|
|
839
|
+
journal,
|
|
840
|
+
defaults,
|
|
841
|
+
testId,
|
|
842
|
+
misbehaviorSummary: misbehavior.summary,
|
|
843
|
+
errorWire: "bedrock-converse"
|
|
823
844
|
});
|
|
824
|
-
res.writeHead(200, { "Content-Type": "application/json" });
|
|
825
|
-
res.end(JSON.stringify(body));
|
|
826
845
|
return;
|
|
827
846
|
}
|
|
828
847
|
if (isErrorResponse(response)) {
|
|
@@ -837,21 +856,17 @@ async function handleConverse(req, res, raw, modelId, fixtures, journal, default
|
|
|
837
856
|
fixture
|
|
838
857
|
}
|
|
839
858
|
});
|
|
840
|
-
|
|
841
|
-
|
|
842
|
-
|
|
843
|
-
|
|
844
|
-
message: response.error.message
|
|
845
|
-
}
|
|
846
|
-
};
|
|
847
|
-
writeErrorResponse(res, status, JSON.stringify(errBody), { retryAfter: response.retryAfter });
|
|
859
|
+
writeErrorResponse(res, status, renderError("bedrock", "fixture", {
|
|
860
|
+
message: response.error.message,
|
|
861
|
+
type: response.error.type ?? "invalid_request_error"
|
|
862
|
+
}).body, { retryAfter: response.retryAfter });
|
|
848
863
|
return;
|
|
849
864
|
}
|
|
850
865
|
if (isCombinedFixtureResponse(response)) {
|
|
851
866
|
if (response.webSearches?.length) logger.warn("webSearches in fixture response are not supported for Bedrock Converse API — ignoring");
|
|
852
867
|
const overrides = extractOverrides(response);
|
|
853
|
-
const effReasoning = resolveReasoningForModel(response.reasoning, completionReq.model,
|
|
854
|
-
addResponseEntry({
|
|
868
|
+
const effReasoning = resolveReasoningForModel(response.reasoning, completionReq.model, resolveRequestDecisions(defaults.strict, req.headers).reasoningSuppression, logger);
|
|
869
|
+
const journalEntry = addResponseEntry({
|
|
855
870
|
method: req.method ?? "POST",
|
|
856
871
|
path: urlPath,
|
|
857
872
|
headers: flattenHeaders(req.headers),
|
|
@@ -862,16 +877,14 @@ async function handleConverse(req, res, raw, modelId, fixtures, journal, default
|
|
|
862
877
|
}
|
|
863
878
|
});
|
|
864
879
|
const functionToolCalls = requireEmittedFunctionToolCalls(response, "Bedrock Converse");
|
|
865
|
-
|
|
866
|
-
res.writeHead(200, { "Content-Type": "application/json" });
|
|
867
|
-
res.end(JSON.stringify(body));
|
|
880
|
+
await deliverJson(res, journalEntry, fixture, () => buildConverseContentWithToolCallsResponse(response.content ?? "", functionToolCalls, logger, effReasoning, overrides, response.blocks), jsonOpts(servedPayloadLength(response, effReasoning)));
|
|
868
881
|
return;
|
|
869
882
|
}
|
|
870
883
|
if (isTextResponse(response)) {
|
|
871
884
|
if (response.webSearches?.length) logger.warn("webSearches in fixture response are not supported for Bedrock Converse API — ignoring");
|
|
872
885
|
const overrides = extractOverrides(response);
|
|
873
|
-
const effReasoning = resolveReasoningForModel(response.reasoning, completionReq.model,
|
|
874
|
-
addResponseEntry({
|
|
886
|
+
const effReasoning = resolveReasoningForModel(response.reasoning, completionReq.model, resolveRequestDecisions(defaults.strict, req.headers).reasoningSuppression, logger);
|
|
887
|
+
await deliverJson(res, addResponseEntry({
|
|
875
888
|
method: req.method ?? "POST",
|
|
876
889
|
path: urlPath,
|
|
877
890
|
headers: flattenHeaders(req.headers),
|
|
@@ -880,17 +893,14 @@ async function handleConverse(req, res, raw, modelId, fixtures, journal, default
|
|
|
880
893
|
status: 200,
|
|
881
894
|
fixture
|
|
882
895
|
}
|
|
883
|
-
});
|
|
884
|
-
const body = buildConverseTextResponse(response.content, effReasoning, overrides);
|
|
885
|
-
res.writeHead(200, { "Content-Type": "application/json" });
|
|
886
|
-
res.end(JSON.stringify(body));
|
|
896
|
+
}), fixture, () => buildConverseTextResponse(response.content, effReasoning, overrides), jsonOpts(servedPayloadLength(response, effReasoning)));
|
|
887
897
|
return;
|
|
888
898
|
}
|
|
889
899
|
if (isToolCallResponse(response)) {
|
|
890
900
|
if (response.webSearches?.length) logger.warn("webSearches in fixture response are not supported for Bedrock Converse API — ignoring");
|
|
891
901
|
const overrides = extractOverrides(response);
|
|
892
|
-
const effReasoning = resolveReasoningForModel(response.reasoning, completionReq.model,
|
|
893
|
-
addResponseEntry({
|
|
902
|
+
const effReasoning = resolveReasoningForModel(response.reasoning, completionReq.model, resolveRequestDecisions(defaults.strict, req.headers).reasoningSuppression, logger);
|
|
903
|
+
const journalEntry = addResponseEntry({
|
|
894
904
|
method: req.method ?? "POST",
|
|
895
905
|
path: urlPath,
|
|
896
906
|
headers: flattenHeaders(req.headers),
|
|
@@ -900,9 +910,8 @@ async function handleConverse(req, res, raw, modelId, fixtures, journal, default
|
|
|
900
910
|
fixture
|
|
901
911
|
}
|
|
902
912
|
});
|
|
903
|
-
const
|
|
904
|
-
res
|
|
905
|
-
res.end(JSON.stringify(body));
|
|
913
|
+
const functionToolCalls = requireEmittedFunctionToolCalls(response, "Bedrock Converse");
|
|
914
|
+
await deliverJson(res, journalEntry, fixture, () => buildConverseToolCallResponse(functionToolCalls, logger, effReasoning, overrides), jsonOpts(servedPayloadLength(response, effReasoning)));
|
|
906
915
|
return;
|
|
907
916
|
}
|
|
908
917
|
addResponseEntry({
|
|
@@ -915,10 +924,10 @@ async function handleConverse(req, res, raw, modelId, fixtures, journal, default
|
|
|
915
924
|
fixture
|
|
916
925
|
}
|
|
917
926
|
});
|
|
918
|
-
writeErrorResponse(res, 500,
|
|
927
|
+
writeErrorResponse(res, 500, renderError("bedrock", "unknown-response", {
|
|
919
928
|
message: "Fixture response did not match any known type",
|
|
920
929
|
type: "server_error"
|
|
921
|
-
}
|
|
930
|
+
}).body);
|
|
922
931
|
}
|
|
923
932
|
async function handleConverseStream(req, res, raw, modelId, fixtures, journal, defaults, setCorsHeaders) {
|
|
924
933
|
const { logger } = defaults;
|
|
@@ -939,10 +948,10 @@ async function handleConverseStream(req, res, raw, modelId, fixtures, journal, d
|
|
|
939
948
|
fixture: null
|
|
940
949
|
}
|
|
941
950
|
});
|
|
942
|
-
writeErrorResponse(res, 400,
|
|
951
|
+
writeErrorResponse(res, 400, renderError("bedrock", "validation", {
|
|
943
952
|
message: `Malformed JSON: ${detail}`,
|
|
944
953
|
type: "invalid_request_error"
|
|
945
|
-
}
|
|
954
|
+
}).body);
|
|
946
955
|
return;
|
|
947
956
|
}
|
|
948
957
|
if (!isJsonObject(converseReq)) {
|
|
@@ -956,10 +965,10 @@ async function handleConverseStream(req, res, raw, modelId, fixtures, journal, d
|
|
|
956
965
|
fixture: null
|
|
957
966
|
}
|
|
958
967
|
});
|
|
959
|
-
writeErrorResponse(res, 400,
|
|
968
|
+
writeErrorResponse(res, 400, renderError("bedrock", "validation", {
|
|
960
969
|
message: "Request body must be a JSON object",
|
|
961
970
|
type: "invalid_request_error"
|
|
962
|
-
}
|
|
971
|
+
}).body);
|
|
963
972
|
return;
|
|
964
973
|
}
|
|
965
974
|
const messageError = !Array.isArray(converseReq.messages) ? "Invalid request: messages array is required" : validateConverseMessages(converseReq) ?? validateConverseSystem(converseReq) ?? validateConverseTools(converseReq);
|
|
@@ -974,10 +983,10 @@ async function handleConverseStream(req, res, raw, modelId, fixtures, journal, d
|
|
|
974
983
|
fixture: null
|
|
975
984
|
}
|
|
976
985
|
});
|
|
977
|
-
writeErrorResponse(res, 400,
|
|
986
|
+
writeErrorResponse(res, 400, renderError("bedrock", "validation", {
|
|
978
987
|
message: messageError,
|
|
979
988
|
type: "invalid_request_error"
|
|
980
|
-
}
|
|
989
|
+
}).body);
|
|
981
990
|
return;
|
|
982
991
|
}
|
|
983
992
|
const completionReq = converseToCompletionRequest(converseReq, modelId, logger);
|
|
@@ -985,7 +994,10 @@ async function handleConverseStream(req, res, raw, modelId, fixtures, journal, d
|
|
|
985
994
|
completionReq._endpointType = "chat";
|
|
986
995
|
completionReq._context = getContext(req);
|
|
987
996
|
const testId = getTestId(req);
|
|
988
|
-
const { fixture, skippedBySequenceOrTurn } = matchFixtureDiagnostic(fixtures, completionReq, journal.getFixtureMatchCountsForTest(testId), defaults.requestTransform,
|
|
997
|
+
const { fixture, skippedBySequenceOrTurn } = matchFixtureDiagnostic(fixtures, completionReq, journal.getFixtureMatchCountsForTest(testId), defaults.requestTransform, {
|
|
998
|
+
...recordMatchOptions(!!defaults.record, defaults.logger),
|
|
999
|
+
wire: "bedrock-converse"
|
|
1000
|
+
});
|
|
989
1001
|
if (fixture) logger.debug(`Fixture matched: ${JSON.stringify(fixture.match).slice(0, 120)}`);
|
|
990
1002
|
else logger.debug(`No fixture matched for request`);
|
|
991
1003
|
if (fixture) journal.incrementFixtureMatchCount(fixture, fixtures, testId);
|
|
@@ -996,7 +1008,7 @@ async function handleConverseStream(req, res, raw, modelId, fixtures, journal, d
|
|
|
996
1008
|
body: completionReq
|
|
997
1009
|
}, fixture ? "fixture" : "proxy", defaults.registry, defaults.logger)) return;
|
|
998
1010
|
if (!fixture) {
|
|
999
|
-
if (
|
|
1011
|
+
if (resolveRequestDecisions(defaults.strict, req.headers).fixtureMiss) {
|
|
1000
1012
|
const strictStatus = 503;
|
|
1001
1013
|
const strictMessage = strictNoMatchMessage(skippedBySequenceOrTurn);
|
|
1002
1014
|
logger.error(strictNoMatchLogLine(req.method ?? "POST", urlPath, skippedBySequenceOrTurn));
|
|
@@ -1011,14 +1023,14 @@ async function handleConverseStream(req, res, raw, modelId, fixtures, journal, d
|
|
|
1011
1023
|
...strictOverrideField(defaults.strict, req.headers)
|
|
1012
1024
|
}
|
|
1013
1025
|
});
|
|
1014
|
-
writeErrorResponse(res, strictStatus,
|
|
1026
|
+
writeErrorResponse(res, strictStatus, renderError("bedrock", "strict-miss", {
|
|
1015
1027
|
message: strictMessage,
|
|
1016
1028
|
type: "invalid_request_error"
|
|
1017
|
-
}
|
|
1029
|
+
}).body);
|
|
1018
1030
|
return;
|
|
1019
1031
|
}
|
|
1020
1032
|
if (defaults.record) {
|
|
1021
|
-
const outcome = await proxyAndRecord(req, res, completionReq, "bedrock", urlPath, fixtures, defaults, raw);
|
|
1033
|
+
const { outcome, clientHungUp } = await withHangUpDetection(req, res, () => proxyAndRecord(req, res, completionReq, "bedrock", urlPath, fixtures, defaults, raw));
|
|
1022
1034
|
if (outcome === "handled_by_hook") return;
|
|
1023
1035
|
if (outcome !== "not_configured") {
|
|
1024
1036
|
journal.add({
|
|
@@ -1029,7 +1041,8 @@ async function handleConverseStream(req, res, raw, modelId, fixtures, journal, d
|
|
|
1029
1041
|
response: {
|
|
1030
1042
|
status: res.statusCode ?? 200,
|
|
1031
1043
|
fixture: null,
|
|
1032
|
-
source: "proxy"
|
|
1044
|
+
source: "proxy",
|
|
1045
|
+
...proxyInterruption(res, clientHungUp)
|
|
1033
1046
|
}
|
|
1034
1047
|
});
|
|
1035
1048
|
return;
|
|
@@ -1046,10 +1059,10 @@ async function handleConverseStream(req, res, raw, modelId, fixtures, journal, d
|
|
|
1046
1059
|
...strictOverrideField(defaults.strict, req.headers)
|
|
1047
1060
|
}
|
|
1048
1061
|
});
|
|
1049
|
-
writeErrorResponse(res, 404,
|
|
1062
|
+
writeErrorResponse(res, 404, renderError("bedrock", "fixture-miss", {
|
|
1050
1063
|
message: "No fixture matched",
|
|
1051
1064
|
type: "invalid_request_error"
|
|
1052
|
-
}
|
|
1065
|
+
}).body);
|
|
1053
1066
|
return;
|
|
1054
1067
|
}
|
|
1055
1068
|
const response = await resolveResponse(fixture, completionReq);
|
|
@@ -1089,20 +1102,25 @@ async function handleConverseStream(req, res, raw, modelId, fixtures, journal, d
|
|
|
1089
1102
|
});
|
|
1090
1103
|
const type = misbehavior.status === 400 ? "ValidationException" : "InternalServerException";
|
|
1091
1104
|
res.setHeader("x-amzn-errortype", type);
|
|
1092
|
-
writeErrorResponse(res, misbehavior.status,
|
|
1093
|
-
|
|
1105
|
+
writeErrorResponse(res, misbehavior.status, renderError("bedrock-converse", "misbehavior", {
|
|
1106
|
+
type,
|
|
1094
1107
|
message: misbehavior.message,
|
|
1095
1108
|
code: misbehavior.code
|
|
1096
|
-
}));
|
|
1109
|
+
}).body);
|
|
1097
1110
|
return;
|
|
1098
1111
|
}
|
|
1099
|
-
const latency = fixture.latency ?? defaults.latency;
|
|
1100
1112
|
const chunkSize = Math.max(1, fixture.chunkSize ?? defaults.chunkSize);
|
|
1113
|
+
const streamTiming = {
|
|
1114
|
+
latency: fixture.latency ?? defaults.latency,
|
|
1115
|
+
streamingProfile: fixture.streamingProfile,
|
|
1116
|
+
recordedTimings: fixture.recordedTimings,
|
|
1117
|
+
replaySpeed: fixture.replaySpeed ?? defaults.replaySpeed
|
|
1118
|
+
};
|
|
1101
1119
|
if (misbehavior.kind === "applied") {
|
|
1102
1120
|
const prepared = prepareConverseMisbehavior(misbehavior, completionReq, true, defaults, req.headers);
|
|
1103
1121
|
misbehavior = prepared.plan;
|
|
1104
1122
|
const events = buildConverseMisbehaviorEvents(prepared, chunkSize);
|
|
1105
|
-
|
|
1123
|
+
await deliverStream(res, addResponseEntry({
|
|
1106
1124
|
method: req.method ?? "POST",
|
|
1107
1125
|
path: urlPath,
|
|
1108
1126
|
headers: flattenHeaders(req.headers),
|
|
@@ -1111,21 +1129,24 @@ async function handleConverseStream(req, res, raw, modelId, fixtures, journal, d
|
|
|
1111
1129
|
status: 200,
|
|
1112
1130
|
fixture
|
|
1113
1131
|
}
|
|
1132
|
+
}), fixture, eventStreamCodec(), events, streamTiming);
|
|
1133
|
+
return;
|
|
1134
|
+
}
|
|
1135
|
+
if (isRawResponse(response)) {
|
|
1136
|
+
await serveRawResponse({
|
|
1137
|
+
wire: "bedrock-converse",
|
|
1138
|
+
stream: true,
|
|
1139
|
+
req,
|
|
1140
|
+
res,
|
|
1141
|
+
fixture,
|
|
1142
|
+
response,
|
|
1143
|
+
body: completionReq,
|
|
1144
|
+
journal,
|
|
1145
|
+
defaults,
|
|
1146
|
+
testId,
|
|
1147
|
+
misbehaviorSummary: misbehavior.summary,
|
|
1148
|
+
errorWire: "bedrock-converse"
|
|
1114
1149
|
});
|
|
1115
|
-
const interruption = createInterruptionSignal(fixture);
|
|
1116
|
-
if (!await writeEventStream(res, events, {
|
|
1117
|
-
latency,
|
|
1118
|
-
streamingProfile: fixture.streamingProfile,
|
|
1119
|
-
recordedTimings: fixture.recordedTimings,
|
|
1120
|
-
replaySpeed: fixture.replaySpeed ?? defaults.replaySpeed,
|
|
1121
|
-
signal: interruption?.signal,
|
|
1122
|
-
onChunkSent: interruption?.tick
|
|
1123
|
-
})) {
|
|
1124
|
-
if (!res.writableEnded) res.destroy();
|
|
1125
|
-
entry.response.interrupted = true;
|
|
1126
|
-
entry.response.interruptReason = interruption?.reason();
|
|
1127
|
-
}
|
|
1128
|
-
interruption?.cleanup();
|
|
1129
1150
|
return;
|
|
1130
1151
|
}
|
|
1131
1152
|
if (isErrorResponse(response)) {
|
|
@@ -1140,20 +1161,16 @@ async function handleConverseStream(req, res, raw, modelId, fixtures, journal, d
|
|
|
1140
1161
|
fixture
|
|
1141
1162
|
}
|
|
1142
1163
|
});
|
|
1143
|
-
|
|
1144
|
-
|
|
1145
|
-
|
|
1146
|
-
|
|
1147
|
-
message: response.error.message
|
|
1148
|
-
}
|
|
1149
|
-
};
|
|
1150
|
-
writeErrorResponse(res, status, JSON.stringify(errBody), { retryAfter: response.retryAfter });
|
|
1164
|
+
writeErrorResponse(res, status, renderError("bedrock", "fixture", {
|
|
1165
|
+
message: response.error.message,
|
|
1166
|
+
type: response.error.type ?? "invalid_request_error"
|
|
1167
|
+
}).body, { retryAfter: response.retryAfter });
|
|
1151
1168
|
return;
|
|
1152
1169
|
}
|
|
1153
1170
|
if (isCombinedFixtureResponse(response)) {
|
|
1154
1171
|
if (response.webSearches?.length) logger.warn("webSearches in fixture response are not supported for Bedrock Converse API — ignoring");
|
|
1155
1172
|
const overrides = extractOverrides(response);
|
|
1156
|
-
const effReasoning = resolveReasoningForModel(response.reasoning, completionReq.model,
|
|
1173
|
+
const effReasoning = resolveReasoningForModel(response.reasoning, completionReq.model, resolveRequestDecisions(defaults.strict, req.headers).reasoningSuppression, logger);
|
|
1157
1174
|
const journalEntry = addResponseEntry({
|
|
1158
1175
|
method: req.method ?? "POST",
|
|
1159
1176
|
path: urlPath,
|
|
@@ -1166,26 +1183,13 @@ async function handleConverseStream(req, res, raw, modelId, fixtures, journal, d
|
|
|
1166
1183
|
});
|
|
1167
1184
|
const functionToolCalls = requireEmittedFunctionToolCalls(response, "Bedrock Converse");
|
|
1168
1185
|
const events = buildBedrockStreamContentWithToolCallsEvents(response.content ?? "", functionToolCalls, chunkSize, logger, effReasoning, overrides, response.blocks);
|
|
1169
|
-
|
|
1170
|
-
if (!await writeEventStream(res, events, {
|
|
1171
|
-
latency,
|
|
1172
|
-
streamingProfile: fixture.streamingProfile,
|
|
1173
|
-
recordedTimings: fixture.recordedTimings,
|
|
1174
|
-
replaySpeed: fixture.replaySpeed ?? defaults.replaySpeed,
|
|
1175
|
-
signal: interruption?.signal,
|
|
1176
|
-
onChunkSent: interruption?.tick
|
|
1177
|
-
})) {
|
|
1178
|
-
if (!res.writableEnded) res.destroy();
|
|
1179
|
-
journalEntry.response.interrupted = true;
|
|
1180
|
-
journalEntry.response.interruptReason = interruption?.reason();
|
|
1181
|
-
}
|
|
1182
|
-
interruption?.cleanup();
|
|
1186
|
+
await deliverStream(res, journalEntry, fixture, eventStreamCodec(), events, streamTiming);
|
|
1183
1187
|
return;
|
|
1184
1188
|
}
|
|
1185
1189
|
if (isTextResponse(response)) {
|
|
1186
1190
|
if (response.webSearches?.length) logger.warn("webSearches in fixture response are not supported for Bedrock Converse API — ignoring");
|
|
1187
1191
|
const overrides = extractOverrides(response);
|
|
1188
|
-
const effReasoning = resolveReasoningForModel(response.reasoning, completionReq.model,
|
|
1192
|
+
const effReasoning = resolveReasoningForModel(response.reasoning, completionReq.model, resolveRequestDecisions(defaults.strict, req.headers).reasoningSuppression, logger);
|
|
1189
1193
|
const journalEntry = addResponseEntry({
|
|
1190
1194
|
method: req.method ?? "POST",
|
|
1191
1195
|
path: urlPath,
|
|
@@ -1197,26 +1201,13 @@ async function handleConverseStream(req, res, raw, modelId, fixtures, journal, d
|
|
|
1197
1201
|
}
|
|
1198
1202
|
});
|
|
1199
1203
|
const events = buildBedrockStreamTextEvents(response.content, chunkSize, effReasoning, overrides);
|
|
1200
|
-
|
|
1201
|
-
if (!await writeEventStream(res, events, {
|
|
1202
|
-
latency,
|
|
1203
|
-
streamingProfile: fixture.streamingProfile,
|
|
1204
|
-
recordedTimings: fixture.recordedTimings,
|
|
1205
|
-
replaySpeed: fixture.replaySpeed ?? defaults.replaySpeed,
|
|
1206
|
-
signal: interruption?.signal,
|
|
1207
|
-
onChunkSent: interruption?.tick
|
|
1208
|
-
})) {
|
|
1209
|
-
if (!res.writableEnded) res.destroy();
|
|
1210
|
-
journalEntry.response.interrupted = true;
|
|
1211
|
-
journalEntry.response.interruptReason = interruption?.reason();
|
|
1212
|
-
}
|
|
1213
|
-
interruption?.cleanup();
|
|
1204
|
+
await deliverStream(res, journalEntry, fixture, eventStreamCodec(), events, streamTiming);
|
|
1214
1205
|
return;
|
|
1215
1206
|
}
|
|
1216
1207
|
if (isToolCallResponse(response)) {
|
|
1217
1208
|
if (response.webSearches?.length) logger.warn("webSearches in fixture response are not supported for Bedrock Converse API — ignoring");
|
|
1218
1209
|
const overrides = extractOverrides(response);
|
|
1219
|
-
const effReasoning = resolveReasoningForModel(response.reasoning, completionReq.model,
|
|
1210
|
+
const effReasoning = resolveReasoningForModel(response.reasoning, completionReq.model, resolveRequestDecisions(defaults.strict, req.headers).reasoningSuppression, logger);
|
|
1220
1211
|
const journalEntry = addResponseEntry({
|
|
1221
1212
|
method: req.method ?? "POST",
|
|
1222
1213
|
path: urlPath,
|
|
@@ -1228,20 +1219,7 @@ async function handleConverseStream(req, res, raw, modelId, fixtures, journal, d
|
|
|
1228
1219
|
}
|
|
1229
1220
|
});
|
|
1230
1221
|
const events = buildBedrockStreamToolCallEvents(requireEmittedFunctionToolCalls(response, "Bedrock Converse"), chunkSize, logger, effReasoning, overrides);
|
|
1231
|
-
|
|
1232
|
-
if (!await writeEventStream(res, events, {
|
|
1233
|
-
latency,
|
|
1234
|
-
streamingProfile: fixture.streamingProfile,
|
|
1235
|
-
recordedTimings: fixture.recordedTimings,
|
|
1236
|
-
replaySpeed: fixture.replaySpeed ?? defaults.replaySpeed,
|
|
1237
|
-
signal: interruption?.signal,
|
|
1238
|
-
onChunkSent: interruption?.tick
|
|
1239
|
-
})) {
|
|
1240
|
-
if (!res.writableEnded) res.destroy();
|
|
1241
|
-
journalEntry.response.interrupted = true;
|
|
1242
|
-
journalEntry.response.interruptReason = interruption?.reason();
|
|
1243
|
-
}
|
|
1244
|
-
interruption?.cleanup();
|
|
1222
|
+
await deliverStream(res, journalEntry, fixture, eventStreamCodec(), events, streamTiming);
|
|
1245
1223
|
return;
|
|
1246
1224
|
}
|
|
1247
1225
|
addResponseEntry({
|
|
@@ -1254,10 +1232,10 @@ async function handleConverseStream(req, res, raw, modelId, fixtures, journal, d
|
|
|
1254
1232
|
fixture
|
|
1255
1233
|
}
|
|
1256
1234
|
});
|
|
1257
|
-
writeErrorResponse(res, 500,
|
|
1235
|
+
writeErrorResponse(res, 500, renderError("bedrock", "unknown-response", {
|
|
1258
1236
|
message: "Fixture response did not match any known type",
|
|
1259
1237
|
type: "server_error"
|
|
1260
|
-
}
|
|
1238
|
+
}).body);
|
|
1261
1239
|
}
|
|
1262
1240
|
|
|
1263
1241
|
//#endregion
|