@copilotkit/aimock 1.45.0 → 1.46.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 +24 -0
- package/README.md +7 -1
- 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.ts.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/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 +61 -80
- 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 +58 -77
- package/dist/bedrock-converse.js.map +1 -1
- package/dist/bedrock.cjs +65 -97
- 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 +62 -94
- 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 +49 -74
- 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 +47 -72
- 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 +37 -42
- 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 +37 -42
- 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 +50 -35
- 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 +49 -34
- package/dist/gemini-interactions.js.map +1 -1
- package/dist/gemini.cjs +57 -67
- 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 +56 -67
- 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 +11 -68
- package/dist/helpers.cjs.map +1 -1
- package/dist/helpers.d.cts.map +1 -1
- package/dist/helpers.d.ts.map +1 -1
- package/dist/helpers.js +12 -67
- 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.d.cts +2 -2
- package/dist/index.d.ts +2 -2
- 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 +14 -4
- package/dist/mcp-handler.cjs.map +1 -1
- package/dist/mcp-handler.js +14 -4
- 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 +111 -96
- 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 +109 -95
- 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/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/ollama.cjs +128 -68
- 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 +124 -64
- 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 +76 -71
- 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 +63 -58
- package/dist/openrouter-video.js.map +1 -1
- 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/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/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/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 +45 -58
- 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 +44 -57
- 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 +4 -0
- package/dist/router.cjs.map +1 -1
- package/dist/router.d.cts.map +1 -1
- package/dist/router.d.ts.map +1 -1
- package/dist/router.js +3 -0
- 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 +222 -146
- 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 +223 -147
- 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 +7 -0
- package/dist/sse-writer.cjs.map +1 -1
- package/dist/sse-writer.d.cts.map +1 -1
- package/dist/sse-writer.d.ts.map +1 -1
- package/dist/sse-writer.js +7 -1
- 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 +12 -10
- 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 +11 -9
- package/dist/transcription.js.map +1 -1
- package/dist/types.cjs.map +1 -1
- package/dist/types.d.cts +62 -3
- package/dist/types.d.cts.map +1 -1
- package/dist/types.d.ts +62 -3
- 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-gemini-live.cjs +11 -3
- 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 +10 -2
- 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 +28 -54
- 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 +25 -51
- package/dist/ws-realtime.js.map +1 -1
- package/dist/ws-responses.cjs +8 -6
- package/dist/ws-responses.cjs.map +1 -1
- package/dist/ws-responses.js +7 -5
- package/dist/ws-responses.js.map +1 -1
- package/package.json +4 -1
- package/skills/write-fixtures/SKILL.md +25 -16
|
@@ -0,0 +1,52 @@
|
|
|
1
|
+
const require_fields = require('./fields.cjs');
|
|
2
|
+
const require_anthropic = require('./codecs/anthropic.cjs');
|
|
3
|
+
|
|
4
|
+
//#region src/response/usage/recording.ts
|
|
5
|
+
/** Content-type precedence matches the content dispatcher, including its SSE fallback. */
|
|
6
|
+
function selectedFamily(context) {
|
|
7
|
+
if (context.family !== "stream-dispatch") return context.family;
|
|
8
|
+
const ct = context.contentType?.toLowerCase() ?? "";
|
|
9
|
+
if (ct.includes("application/vnd.amazon.eventstream")) return "bedrock-invoke";
|
|
10
|
+
if (ct.includes("application/x-ndjson")) return "ollama";
|
|
11
|
+
if (!ct.includes("text/event-stream")) return void 0;
|
|
12
|
+
switch (context.provider) {
|
|
13
|
+
case "anthropic":
|
|
14
|
+
case "bedrock": return "anthropic";
|
|
15
|
+
case "gemini":
|
|
16
|
+
case "vertexai": return "gemini";
|
|
17
|
+
case "gemini-interactions": return "interactions";
|
|
18
|
+
case "cohere": return "cohere";
|
|
19
|
+
default: return "openai";
|
|
20
|
+
}
|
|
21
|
+
}
|
|
22
|
+
function mode(context, stage) {
|
|
23
|
+
if (stage === "final") return "sanitize";
|
|
24
|
+
switch (selectedFamily(context)) {
|
|
25
|
+
case "openai": return stage === "nonstream" ? "sanitize" : "last-nonempty";
|
|
26
|
+
case "transcription": return stage === "nonstream" ? "transcription-object" : "last-nonempty";
|
|
27
|
+
case "anthropic":
|
|
28
|
+
case "bedrock-invoke": return "anthropic-merge";
|
|
29
|
+
default: return "omit";
|
|
30
|
+
}
|
|
31
|
+
}
|
|
32
|
+
function captureUsage(context) {
|
|
33
|
+
const { observation, previous, stage } = context;
|
|
34
|
+
const raw = stage === "final" ? observation : observation?.usage;
|
|
35
|
+
switch (mode(context, stage)) {
|
|
36
|
+
case "sanitize": return require_fields.sanitizeUsage(raw);
|
|
37
|
+
case "last-nonempty": return raw && typeof raw === "object" && !Array.isArray(raw) && Object.keys(raw).length > 0 ? raw : previous;
|
|
38
|
+
case "transcription-object": return raw && typeof raw === "object" ? raw : void 0;
|
|
39
|
+
case "anthropic-merge": {
|
|
40
|
+
if (stage !== "stream") return require_anthropic.capture(previous, raw);
|
|
41
|
+
const event = observation;
|
|
42
|
+
if (event?.type === "message_start") return require_anthropic.capture(previous, event.message?.usage, "start");
|
|
43
|
+
if (event?.type === "message_delta") return require_anthropic.capture(previous, raw, "delta");
|
|
44
|
+
return previous;
|
|
45
|
+
}
|
|
46
|
+
case "omit": return;
|
|
47
|
+
}
|
|
48
|
+
}
|
|
49
|
+
|
|
50
|
+
//#endregion
|
|
51
|
+
exports.captureUsage = captureUsage;
|
|
52
|
+
//# sourceMappingURL=recording.cjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"recording.cjs","names":["sanitizeUsage","captureAnthropicUsage"],"sources":["../../../src/response/usage/recording.ts"],"sourcesContent":["import type { RecordProviderKey, ResponseOverrides } from \"../../types.js\";\nimport { capture as captureAnthropicUsage } from \"./codecs/anthropic.js\";\nimport { sanitizeUsage } from \"./fields.js\";\n\ntype BodyFamily =\n | \"openai\"\n | \"anthropic\"\n | \"gemini\"\n | \"ollama\"\n | \"cohere\"\n | \"bedrock-invoke\"\n | \"bedrock-converse\"\n | \"interactions\"\n | \"transcription\"\n | \"stream-dispatch\"\n | \"final\";\ninterface CaptureContext {\n provider?: RecordProviderKey;\n contentType?: string;\n /** Recognition remains with content readers; operation does not override their family. */\n operation?: string;\n family: BodyFamily;\n previous?: Record<string, unknown>;\n observation: unknown;\n}\ntype CaptureMode =\n | \"last-nonempty\"\n | \"transcription-object\"\n | \"sanitize\"\n | \"anthropic-merge\"\n | \"omit\";\n\n/** Content-type precedence matches the content dispatcher, including its SSE fallback. */\nfunction selectedFamily(context: CaptureContext): BodyFamily | undefined {\n if (context.family !== \"stream-dispatch\") return context.family;\n const ct = context.contentType?.toLowerCase() ?? \"\";\n if (ct.includes(\"application/vnd.amazon.eventstream\")) return \"bedrock-invoke\";\n if (ct.includes(\"application/x-ndjson\")) return \"ollama\";\n if (!ct.includes(\"text/event-stream\")) return undefined;\n switch (context.provider) {\n case \"anthropic\":\n case \"bedrock\":\n return \"anthropic\";\n case \"gemini\":\n case \"vertexai\":\n return \"gemini\";\n case \"gemini-interactions\":\n return \"interactions\";\n case \"cohere\":\n return \"cohere\";\n default:\n return \"openai\";\n }\n}\n\nfunction mode(\n context: CaptureContext,\n stage: \"stream\" | \"nonstream\" | \"collapsed\" | \"final\",\n): CaptureMode {\n if (stage === \"final\") return \"sanitize\";\n switch (selectedFamily(context)) {\n case \"openai\":\n return stage === \"nonstream\" ? \"sanitize\" : \"last-nonempty\";\n case \"transcription\":\n return stage === \"nonstream\" ? \"transcription-object\" : \"last-nonempty\";\n case \"anthropic\":\n case \"bedrock-invoke\":\n return \"anthropic-merge\";\n // These families intentionally do not acquire usage during extraction.\n case \"gemini\":\n case \"ollama\":\n case \"cohere\":\n case \"bedrock-converse\":\n case \"interactions\":\n default:\n return \"omit\";\n }\n}\n\n/** @internal Capture preserves the recognized wire's existing recording contract. */\nexport function captureUsage(\n context: CaptureContext & { family: \"transcription\"; stage: \"nonstream\" },\n): Record<string, unknown> | undefined;\nexport function captureUsage(\n context: CaptureContext & { stage: \"final\" | \"nonstream\" },\n): ResponseOverrides[\"usage\"] | undefined;\nexport function captureUsage(\n context: CaptureContext & { stage: \"stream\" | \"collapsed\" },\n): Record<string, unknown> | undefined;\nexport function captureUsage(\n context: CaptureContext & { stage: \"stream\" | \"nonstream\" | \"collapsed\" | \"final\" },\n): Record<string, unknown> | undefined {\n const { observation, previous, stage } = context;\n // Final fixture sanitation receives raw usage; other stages receive the\n // recognized envelope/event, leaving body recognition with the content reader.\n const raw = stage === \"final\" ? observation : (observation as { usage?: unknown } | null)?.usage;\n switch (mode(context, stage)) {\n case \"sanitize\":\n return sanitizeUsage(raw);\n case \"last-nonempty\":\n return raw && typeof raw === \"object\" && !Array.isArray(raw) && Object.keys(raw).length > 0\n ? (raw as Record<string, unknown>)\n : previous;\n case \"transcription-object\":\n // Nonstream transcription historically retains arrays and empty objects;\n // its discriminator contract is separate from chat fixture sanitation.\n return raw && typeof raw === \"object\" ? (raw as Record<string, unknown>) : undefined;\n case \"anthropic-merge\": {\n if (stage !== \"stream\") return captureAnthropicUsage(previous, raw);\n const event = observation as { type?: unknown; message?: { usage?: unknown } } | null;\n if (event?.type === \"message_start\")\n return captureAnthropicUsage(previous, event.message?.usage, \"start\");\n if (event?.type === \"message_delta\") return captureAnthropicUsage(previous, raw, \"delta\");\n return previous;\n }\n case \"omit\":\n return undefined;\n }\n}\n"],"mappings":";;;;;AAiCA,SAAS,eAAe,SAAiD;AACvE,KAAI,QAAQ,WAAW,kBAAmB,QAAO,QAAQ;CACzD,MAAM,KAAK,QAAQ,aAAa,aAAa,IAAI;AACjD,KAAI,GAAG,SAAS,qCAAqC,CAAE,QAAO;AAC9D,KAAI,GAAG,SAAS,uBAAuB,CAAE,QAAO;AAChD,KAAI,CAAC,GAAG,SAAS,oBAAoB,CAAE,QAAO;AAC9C,SAAQ,QAAQ,UAAhB;EACE,KAAK;EACL,KAAK,UACH,QAAO;EACT,KAAK;EACL,KAAK,WACH,QAAO;EACT,KAAK,sBACH,QAAO;EACT,KAAK,SACH,QAAO;EACT,QACE,QAAO;;;AAIb,SAAS,KACP,SACA,OACa;AACb,KAAI,UAAU,QAAS,QAAO;AAC9B,SAAQ,eAAe,QAAQ,EAA/B;EACE,KAAK,SACH,QAAO,UAAU,cAAc,aAAa;EAC9C,KAAK,gBACH,QAAO,UAAU,cAAc,yBAAyB;EAC1D,KAAK;EACL,KAAK,iBACH,QAAO;EAOT,QACE,QAAO;;;AAcb,SAAgB,aACd,SACqC;CACrC,MAAM,EAAE,aAAa,UAAU,UAAU;CAGzC,MAAM,MAAM,UAAU,UAAU,cAAe,aAA4C;AAC3F,SAAQ,KAAK,SAAS,MAAM,EAA5B;EACE,KAAK,WACH,QAAOA,6BAAc,IAAI;EAC3B,KAAK,gBACH,QAAO,OAAO,OAAO,QAAQ,YAAY,CAAC,MAAM,QAAQ,IAAI,IAAI,OAAO,KAAK,IAAI,CAAC,SAAS,IACrF,MACD;EACN,KAAK,uBAGH,QAAO,OAAO,OAAO,QAAQ,WAAY,MAAkC;EAC7E,KAAK,mBAAmB;AACtB,OAAI,UAAU,SAAU,QAAOC,0BAAsB,UAAU,IAAI;GACnE,MAAM,QAAQ;AACd,OAAI,OAAO,SAAS,gBAClB,QAAOA,0BAAsB,UAAU,MAAM,SAAS,OAAO,QAAQ;AACvE,OAAI,OAAO,SAAS,gBAAiB,QAAOA,0BAAsB,UAAU,KAAK,QAAQ;AACzF,UAAO;;EAET,KAAK,OACH"}
|
|
@@ -0,0 +1,52 @@
|
|
|
1
|
+
import { sanitizeUsage } from "./fields.js";
|
|
2
|
+
import { capture } from "./codecs/anthropic.js";
|
|
3
|
+
|
|
4
|
+
//#region src/response/usage/recording.ts
|
|
5
|
+
/** Content-type precedence matches the content dispatcher, including its SSE fallback. */
|
|
6
|
+
function selectedFamily(context) {
|
|
7
|
+
if (context.family !== "stream-dispatch") return context.family;
|
|
8
|
+
const ct = context.contentType?.toLowerCase() ?? "";
|
|
9
|
+
if (ct.includes("application/vnd.amazon.eventstream")) return "bedrock-invoke";
|
|
10
|
+
if (ct.includes("application/x-ndjson")) return "ollama";
|
|
11
|
+
if (!ct.includes("text/event-stream")) return void 0;
|
|
12
|
+
switch (context.provider) {
|
|
13
|
+
case "anthropic":
|
|
14
|
+
case "bedrock": return "anthropic";
|
|
15
|
+
case "gemini":
|
|
16
|
+
case "vertexai": return "gemini";
|
|
17
|
+
case "gemini-interactions": return "interactions";
|
|
18
|
+
case "cohere": return "cohere";
|
|
19
|
+
default: return "openai";
|
|
20
|
+
}
|
|
21
|
+
}
|
|
22
|
+
function mode(context, stage) {
|
|
23
|
+
if (stage === "final") return "sanitize";
|
|
24
|
+
switch (selectedFamily(context)) {
|
|
25
|
+
case "openai": return stage === "nonstream" ? "sanitize" : "last-nonempty";
|
|
26
|
+
case "transcription": return stage === "nonstream" ? "transcription-object" : "last-nonempty";
|
|
27
|
+
case "anthropic":
|
|
28
|
+
case "bedrock-invoke": return "anthropic-merge";
|
|
29
|
+
default: return "omit";
|
|
30
|
+
}
|
|
31
|
+
}
|
|
32
|
+
function captureUsage(context) {
|
|
33
|
+
const { observation, previous, stage } = context;
|
|
34
|
+
const raw = stage === "final" ? observation : observation?.usage;
|
|
35
|
+
switch (mode(context, stage)) {
|
|
36
|
+
case "sanitize": return sanitizeUsage(raw);
|
|
37
|
+
case "last-nonempty": return raw && typeof raw === "object" && !Array.isArray(raw) && Object.keys(raw).length > 0 ? raw : previous;
|
|
38
|
+
case "transcription-object": return raw && typeof raw === "object" ? raw : void 0;
|
|
39
|
+
case "anthropic-merge": {
|
|
40
|
+
if (stage !== "stream") return capture(previous, raw);
|
|
41
|
+
const event = observation;
|
|
42
|
+
if (event?.type === "message_start") return capture(previous, event.message?.usage, "start");
|
|
43
|
+
if (event?.type === "message_delta") return capture(previous, raw, "delta");
|
|
44
|
+
return previous;
|
|
45
|
+
}
|
|
46
|
+
case "omit": return;
|
|
47
|
+
}
|
|
48
|
+
}
|
|
49
|
+
|
|
50
|
+
//#endregion
|
|
51
|
+
export { captureUsage };
|
|
52
|
+
//# sourceMappingURL=recording.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"recording.js","names":["captureAnthropicUsage"],"sources":["../../../src/response/usage/recording.ts"],"sourcesContent":["import type { RecordProviderKey, ResponseOverrides } from \"../../types.js\";\nimport { capture as captureAnthropicUsage } from \"./codecs/anthropic.js\";\nimport { sanitizeUsage } from \"./fields.js\";\n\ntype BodyFamily =\n | \"openai\"\n | \"anthropic\"\n | \"gemini\"\n | \"ollama\"\n | \"cohere\"\n | \"bedrock-invoke\"\n | \"bedrock-converse\"\n | \"interactions\"\n | \"transcription\"\n | \"stream-dispatch\"\n | \"final\";\ninterface CaptureContext {\n provider?: RecordProviderKey;\n contentType?: string;\n /** Recognition remains with content readers; operation does not override their family. */\n operation?: string;\n family: BodyFamily;\n previous?: Record<string, unknown>;\n observation: unknown;\n}\ntype CaptureMode =\n | \"last-nonempty\"\n | \"transcription-object\"\n | \"sanitize\"\n | \"anthropic-merge\"\n | \"omit\";\n\n/** Content-type precedence matches the content dispatcher, including its SSE fallback. */\nfunction selectedFamily(context: CaptureContext): BodyFamily | undefined {\n if (context.family !== \"stream-dispatch\") return context.family;\n const ct = context.contentType?.toLowerCase() ?? \"\";\n if (ct.includes(\"application/vnd.amazon.eventstream\")) return \"bedrock-invoke\";\n if (ct.includes(\"application/x-ndjson\")) return \"ollama\";\n if (!ct.includes(\"text/event-stream\")) return undefined;\n switch (context.provider) {\n case \"anthropic\":\n case \"bedrock\":\n return \"anthropic\";\n case \"gemini\":\n case \"vertexai\":\n return \"gemini\";\n case \"gemini-interactions\":\n return \"interactions\";\n case \"cohere\":\n return \"cohere\";\n default:\n return \"openai\";\n }\n}\n\nfunction mode(\n context: CaptureContext,\n stage: \"stream\" | \"nonstream\" | \"collapsed\" | \"final\",\n): CaptureMode {\n if (stage === \"final\") return \"sanitize\";\n switch (selectedFamily(context)) {\n case \"openai\":\n return stage === \"nonstream\" ? \"sanitize\" : \"last-nonempty\";\n case \"transcription\":\n return stage === \"nonstream\" ? \"transcription-object\" : \"last-nonempty\";\n case \"anthropic\":\n case \"bedrock-invoke\":\n return \"anthropic-merge\";\n // These families intentionally do not acquire usage during extraction.\n case \"gemini\":\n case \"ollama\":\n case \"cohere\":\n case \"bedrock-converse\":\n case \"interactions\":\n default:\n return \"omit\";\n }\n}\n\n/** @internal Capture preserves the recognized wire's existing recording contract. */\nexport function captureUsage(\n context: CaptureContext & { family: \"transcription\"; stage: \"nonstream\" },\n): Record<string, unknown> | undefined;\nexport function captureUsage(\n context: CaptureContext & { stage: \"final\" | \"nonstream\" },\n): ResponseOverrides[\"usage\"] | undefined;\nexport function captureUsage(\n context: CaptureContext & { stage: \"stream\" | \"collapsed\" },\n): Record<string, unknown> | undefined;\nexport function captureUsage(\n context: CaptureContext & { stage: \"stream\" | \"nonstream\" | \"collapsed\" | \"final\" },\n): Record<string, unknown> | undefined {\n const { observation, previous, stage } = context;\n // Final fixture sanitation receives raw usage; other stages receive the\n // recognized envelope/event, leaving body recognition with the content reader.\n const raw = stage === \"final\" ? observation : (observation as { usage?: unknown } | null)?.usage;\n switch (mode(context, stage)) {\n case \"sanitize\":\n return sanitizeUsage(raw);\n case \"last-nonempty\":\n return raw && typeof raw === \"object\" && !Array.isArray(raw) && Object.keys(raw).length > 0\n ? (raw as Record<string, unknown>)\n : previous;\n case \"transcription-object\":\n // Nonstream transcription historically retains arrays and empty objects;\n // its discriminator contract is separate from chat fixture sanitation.\n return raw && typeof raw === \"object\" ? (raw as Record<string, unknown>) : undefined;\n case \"anthropic-merge\": {\n if (stage !== \"stream\") return captureAnthropicUsage(previous, raw);\n const event = observation as { type?: unknown; message?: { usage?: unknown } } | null;\n if (event?.type === \"message_start\")\n return captureAnthropicUsage(previous, event.message?.usage, \"start\");\n if (event?.type === \"message_delta\") return captureAnthropicUsage(previous, raw, \"delta\");\n return previous;\n }\n case \"omit\":\n return undefined;\n }\n}\n"],"mappings":";;;;;AAiCA,SAAS,eAAe,SAAiD;AACvE,KAAI,QAAQ,WAAW,kBAAmB,QAAO,QAAQ;CACzD,MAAM,KAAK,QAAQ,aAAa,aAAa,IAAI;AACjD,KAAI,GAAG,SAAS,qCAAqC,CAAE,QAAO;AAC9D,KAAI,GAAG,SAAS,uBAAuB,CAAE,QAAO;AAChD,KAAI,CAAC,GAAG,SAAS,oBAAoB,CAAE,QAAO;AAC9C,SAAQ,QAAQ,UAAhB;EACE,KAAK;EACL,KAAK,UACH,QAAO;EACT,KAAK;EACL,KAAK,WACH,QAAO;EACT,KAAK,sBACH,QAAO;EACT,KAAK,SACH,QAAO;EACT,QACE,QAAO;;;AAIb,SAAS,KACP,SACA,OACa;AACb,KAAI,UAAU,QAAS,QAAO;AAC9B,SAAQ,eAAe,QAAQ,EAA/B;EACE,KAAK,SACH,QAAO,UAAU,cAAc,aAAa;EAC9C,KAAK,gBACH,QAAO,UAAU,cAAc,yBAAyB;EAC1D,KAAK;EACL,KAAK,iBACH,QAAO;EAOT,QACE,QAAO;;;AAcb,SAAgB,aACd,SACqC;CACrC,MAAM,EAAE,aAAa,UAAU,UAAU;CAGzC,MAAM,MAAM,UAAU,UAAU,cAAe,aAA4C;AAC3F,SAAQ,KAAK,SAAS,MAAM,EAA5B;EACE,KAAK,WACH,QAAO,cAAc,IAAI;EAC3B,KAAK,gBACH,QAAO,OAAO,OAAO,QAAQ,YAAY,CAAC,MAAM,QAAQ,IAAI,IAAI,OAAO,KAAK,IAAI,CAAC,SAAS,IACrF,MACD;EACN,KAAK,uBAGH,QAAO,OAAO,OAAO,QAAQ,WAAY,MAAkC;EAC7E,KAAK,mBAAmB;AACtB,OAAI,UAAU,SAAU,QAAOA,QAAsB,UAAU,IAAI;GACnE,MAAM,QAAQ;AACd,OAAI,OAAO,SAAS,gBAClB,QAAOA,QAAsB,UAAU,MAAM,SAAS,OAAO,QAAQ;AACvE,OAAI,OAAO,SAAS,gBAAiB,QAAOA,QAAsB,UAAU,KAAK,QAAQ;AACzF,UAAO;;EAET,KAAK,OACH"}
|
package/dist/responses.cjs
CHANGED
|
@@ -1,5 +1,7 @@
|
|
|
1
1
|
const require_runtime = require('./_virtual/_rolldown/runtime.cjs');
|
|
2
|
+
const require_errors = require('./response/errors.cjs');
|
|
2
3
|
const require_model_utils = require('./model-utils.cjs');
|
|
4
|
+
const require_policy = require('./response/policy.cjs');
|
|
3
5
|
const require_helpers = require('./helpers.cjs');
|
|
4
6
|
const require_sse_writer = require('./sse-writer.cjs');
|
|
5
7
|
const require_chaos = require('./chaos.cjs');
|
|
@@ -7,6 +9,8 @@ const require_misbehavior = require('./misbehavior.cjs');
|
|
|
7
9
|
const require_router = require('./router.cjs');
|
|
8
10
|
const require_recorder = require('./recorder.cjs');
|
|
9
11
|
const require_interruption = require('./interruption.cjs');
|
|
12
|
+
const require_responses = require('./response/usage/codecs/responses.cjs');
|
|
13
|
+
const require_finish = require('./response/finish.cjs');
|
|
10
14
|
let node_crypto = require("node:crypto");
|
|
11
15
|
|
|
12
16
|
//#region src/responses.ts
|
|
@@ -311,25 +315,7 @@ function validateResponsesTools(tools) {
|
|
|
311
315
|
}
|
|
312
316
|
function responsesStatus(finishReason, defaultStatus) {
|
|
313
317
|
if (!finishReason) return defaultStatus;
|
|
314
|
-
|
|
315
|
-
if (finishReason === "tool_calls") return "completed";
|
|
316
|
-
if (finishReason === "length") return "incomplete";
|
|
317
|
-
if (finishReason === "content_filter") return "failed";
|
|
318
|
-
return finishReason;
|
|
319
|
-
}
|
|
320
|
-
function responsesUsage(overrides) {
|
|
321
|
-
if (!overrides?.usage) return {
|
|
322
|
-
input_tokens: 0,
|
|
323
|
-
output_tokens: 0,
|
|
324
|
-
total_tokens: 0
|
|
325
|
-
};
|
|
326
|
-
const input = overrides.usage.input_tokens ?? overrides.usage.prompt_tokens ?? 0;
|
|
327
|
-
const output = overrides.usage.output_tokens ?? overrides.usage.completion_tokens ?? 0;
|
|
328
|
-
return {
|
|
329
|
-
input_tokens: input,
|
|
330
|
-
output_tokens: output,
|
|
331
|
-
total_tokens: overrides.usage.total_tokens ?? input + output
|
|
332
|
-
};
|
|
318
|
+
return require_finish.mapResponsesFinish(finishReason);
|
|
333
319
|
}
|
|
334
320
|
function responseId() {
|
|
335
321
|
return require_helpers.generateId("resp");
|
|
@@ -339,7 +325,7 @@ function itemId() {
|
|
|
339
325
|
}
|
|
340
326
|
function buildTextStreamEvents(content, model, chunkSize, reasoning, webSearches, overrides, emitEncryptedReasoning = false, synthesizeSummarylessReasoning = false) {
|
|
341
327
|
const { respId, created, events, prefixOutputItems, nextOutputIndex } = buildResponsePreamble(model, chunkSize, reasoning, webSearches, overrides, emitEncryptedReasoning, synthesizeSummarylessReasoning);
|
|
342
|
-
const { events: msgEvents, msgItem } = buildMessageOutputEvents(content, chunkSize, nextOutputIndex);
|
|
328
|
+
const { events: msgEvents, msgItem } = buildMessageOutputEvents(content, chunkSize, nextOutputIndex, overrides?.phase);
|
|
343
329
|
events.push(...msgEvents);
|
|
344
330
|
events.push({
|
|
345
331
|
type: "response.completed",
|
|
@@ -350,7 +336,7 @@ function buildTextStreamEvents(content, model, chunkSize, reasoning, webSearches
|
|
|
350
336
|
model: overrides?.model ?? model,
|
|
351
337
|
status: responsesStatus(overrides?.finishReason, "completed"),
|
|
352
338
|
output: [...prefixOutputItems, msgItem],
|
|
353
|
-
usage:
|
|
339
|
+
usage: require_responses.render(overrides)
|
|
354
340
|
}
|
|
355
341
|
});
|
|
356
342
|
return events;
|
|
@@ -464,7 +450,7 @@ function toolCallStreamEvents(toolCalls, model, chunkSize, reasoning, webSearche
|
|
|
464
450
|
model: overrides?.model ?? model,
|
|
465
451
|
status: responsesStatus(overrides?.finishReason, "completed"),
|
|
466
452
|
output: [...prefixOutputItems, ...fcOutputItems],
|
|
467
|
-
usage:
|
|
453
|
+
usage: require_responses.render(overrides)
|
|
468
454
|
}
|
|
469
455
|
});
|
|
470
456
|
return events;
|
|
@@ -735,7 +721,7 @@ function buildResponsePreamble(model, chunkSize, reasoning, webSearches, overrid
|
|
|
735
721
|
nextOutputIndex
|
|
736
722
|
};
|
|
737
723
|
}
|
|
738
|
-
function buildMessageOutputEvents(content, chunkSize, outputIndex) {
|
|
724
|
+
function buildMessageOutputEvents(content, chunkSize, outputIndex, phase) {
|
|
739
725
|
const msgId = itemId();
|
|
740
726
|
const events = [];
|
|
741
727
|
events.push({
|
|
@@ -746,6 +732,7 @@ function buildMessageOutputEvents(content, chunkSize, outputIndex) {
|
|
|
746
732
|
id: msgId,
|
|
747
733
|
status: "in_progress",
|
|
748
734
|
role: "assistant",
|
|
735
|
+
...phase !== void 0 ? { phase } : {},
|
|
749
736
|
content: []
|
|
750
737
|
}
|
|
751
738
|
});
|
|
@@ -790,6 +777,7 @@ function buildMessageOutputEvents(content, chunkSize, outputIndex) {
|
|
|
790
777
|
id: msgId,
|
|
791
778
|
status: "completed",
|
|
792
779
|
role: "assistant",
|
|
780
|
+
...phase !== void 0 ? { phase } : {},
|
|
793
781
|
content: [{
|
|
794
782
|
type: "output_text",
|
|
795
783
|
text: content,
|
|
@@ -908,7 +896,7 @@ function buildCustomToolCallOutputEvents(call, chunkSize, outputIndex) {
|
|
|
908
896
|
function buildToolCallOutputEvents(call, chunkSize, outputIndex) {
|
|
909
897
|
return isCustomEmittable(call) ? buildCustomToolCallOutputEvents(call, chunkSize, outputIndex) : buildFunctionCallOutputEvents(call, chunkSize, outputIndex);
|
|
910
898
|
}
|
|
911
|
-
function buildOutputPrefix(content, model, reasoning, webSearches, emitEncryptedReasoning = false, synthesizeSummarylessReasoning = false) {
|
|
899
|
+
function buildOutputPrefix(content, model, reasoning, webSearches, emitEncryptedReasoning = false, synthesizeSummarylessReasoning = false, phase) {
|
|
912
900
|
const output = [];
|
|
913
901
|
if (reasoning || shouldSynthesizeBlobOnlyReasoning(reasoning, model, synthesizeSummarylessReasoning)) output.push(buildReasoningOutputItem(require_helpers.generateId("rs"), {
|
|
914
902
|
summaryText: reasoning,
|
|
@@ -928,6 +916,7 @@ function buildOutputPrefix(content, model, reasoning, webSearches, emitEncrypted
|
|
|
928
916
|
id: itemId(),
|
|
929
917
|
status: "completed",
|
|
930
918
|
role: "assistant",
|
|
919
|
+
...phase !== void 0 ? { phase } : {},
|
|
931
920
|
content: [{
|
|
932
921
|
type: "output_text",
|
|
933
922
|
text: content,
|
|
@@ -944,11 +933,11 @@ function buildResponseEnvelope(model, output, overrides) {
|
|
|
944
933
|
model: overrides?.model ?? model,
|
|
945
934
|
status: responsesStatus(overrides?.finishReason, "completed"),
|
|
946
935
|
output,
|
|
947
|
-
usage:
|
|
936
|
+
usage: require_responses.render(overrides)
|
|
948
937
|
};
|
|
949
938
|
}
|
|
950
939
|
function buildTextResponse(content, model, reasoning, webSearches, overrides, emitEncryptedReasoning = false, synthesizeSummarylessReasoning = false) {
|
|
951
|
-
return buildResponseEnvelope(model, buildOutputPrefix(content, model, reasoning, webSearches, emitEncryptedReasoning, synthesizeSummarylessReasoning), overrides);
|
|
940
|
+
return buildResponseEnvelope(model, buildOutputPrefix(content, model, reasoning, webSearches, emitEncryptedReasoning, synthesizeSummarylessReasoning, overrides?.phase), overrides);
|
|
952
941
|
}
|
|
953
942
|
function buildToolCallResponse(toolCalls, model, reasoning, webSearches, overrides, emitEncryptedReasoning = false, synthesizeSummarylessReasoning = false) {
|
|
954
943
|
require_helpers.assertResponsesToolCalls(toolCalls);
|
|
@@ -985,7 +974,7 @@ function contentWithToolCallsStreamEvents(content, toolCalls, model, chunkSize,
|
|
|
985
974
|
let outputIndex = nextOutputIndex;
|
|
986
975
|
for (const block of ordered) {
|
|
987
976
|
if (block.type === "text") {
|
|
988
|
-
const { events: msgEvents, msgItem } = buildMessageOutputEvents(block.text, chunkSize, outputIndex);
|
|
977
|
+
const { events: msgEvents, msgItem } = buildMessageOutputEvents(block.text, chunkSize, outputIndex, overrides?.phase);
|
|
989
978
|
events.push(...msgEvents);
|
|
990
979
|
orderedOutputItems.push(msgItem);
|
|
991
980
|
} else {
|
|
@@ -997,7 +986,7 @@ function contentWithToolCallsStreamEvents(content, toolCalls, model, chunkSize,
|
|
|
997
986
|
}
|
|
998
987
|
} else {
|
|
999
988
|
require_helpers.assertResponsesToolCalls(toolCalls);
|
|
1000
|
-
const { events: msgEvents, msgItem } = buildMessageOutputEvents(content, chunkSize, nextOutputIndex);
|
|
989
|
+
const { events: msgEvents, msgItem } = buildMessageOutputEvents(content, chunkSize, nextOutputIndex, overrides?.phase);
|
|
1001
990
|
events.push(...msgEvents);
|
|
1002
991
|
orderedOutputItems.push(msgItem);
|
|
1003
992
|
for (let idx = 0; idx < toolCalls.length; idx++) {
|
|
@@ -1015,7 +1004,7 @@ function contentWithToolCallsStreamEvents(content, toolCalls, model, chunkSize,
|
|
|
1015
1004
|
model: overrides?.model ?? model,
|
|
1016
1005
|
status: responsesStatus(overrides?.finishReason, "completed"),
|
|
1017
1006
|
output: [...prefixOutputItems, ...orderedOutputItems],
|
|
1018
|
-
usage:
|
|
1007
|
+
usage: require_responses.render(overrides)
|
|
1019
1008
|
}
|
|
1020
1009
|
});
|
|
1021
1010
|
return events;
|
|
@@ -1025,12 +1014,13 @@ function buildToolCallOutputItem(tc) {
|
|
|
1025
1014
|
if (isCustomEmittable(tc)) return customToolCallItem(tc, customToolCallItemId(), tc.id || require_helpers.generateToolCallId(), requireFixtureToolInput(tc.input), "completed");
|
|
1026
1015
|
return functionCallItem(tc, require_helpers.generateId("fc"), tc.id || require_helpers.generateToolCallId(), requireFixtureToolArguments(tc.arguments), "completed");
|
|
1027
1016
|
}
|
|
1028
|
-
function buildMessageOutputItem(content) {
|
|
1017
|
+
function buildMessageOutputItem(content, phase) {
|
|
1029
1018
|
return {
|
|
1030
1019
|
type: "message",
|
|
1031
1020
|
id: itemId(),
|
|
1032
1021
|
status: "completed",
|
|
1033
1022
|
role: "assistant",
|
|
1023
|
+
...phase !== void 0 ? { phase } : {},
|
|
1034
1024
|
content: [{
|
|
1035
1025
|
type: "output_text",
|
|
1036
1026
|
text: content,
|
|
@@ -1054,12 +1044,12 @@ function buildContentWithToolCallsResponse(content, toolCalls, model, reasoning,
|
|
|
1054
1044
|
query
|
|
1055
1045
|
}
|
|
1056
1046
|
});
|
|
1057
|
-
for (const block of ordered) if (block.type === "text") output.push(buildMessageOutputItem(block.text));
|
|
1047
|
+
for (const block of ordered) if (block.type === "text") output.push(buildMessageOutputItem(block.text, overrides?.phase));
|
|
1058
1048
|
else output.push(buildToolCallOutputItem(block));
|
|
1059
1049
|
return buildResponseEnvelope(model, output, overrides);
|
|
1060
1050
|
}
|
|
1061
1051
|
require_helpers.assertResponsesToolCalls(toolCalls);
|
|
1062
|
-
const output = buildOutputPrefix(content, model, reasoning, webSearches, emitEncryptedReasoning, synthesizeSummarylessReasoning);
|
|
1052
|
+
const output = buildOutputPrefix(content, model, reasoning, webSearches, emitEncryptedReasoning, synthesizeSummarylessReasoning, overrides?.phase);
|
|
1063
1053
|
for (const tc of toolCalls) output.push(buildToolCallOutputItem(tc));
|
|
1064
1054
|
return buildResponseEnvelope(model, output, overrides);
|
|
1065
1055
|
}
|
|
@@ -1105,11 +1095,11 @@ async function handleResponses(req, res, raw, fixtures, journal, defaults, setCo
|
|
|
1105
1095
|
fixture: null
|
|
1106
1096
|
}
|
|
1107
1097
|
});
|
|
1108
|
-
require_sse_writer.writeErrorResponse(res, 400,
|
|
1098
|
+
require_sse_writer.writeErrorResponse(res, 400, require_errors.renderError("openai", "validation", {
|
|
1109
1099
|
message: `Malformed JSON: ${detail}`,
|
|
1110
1100
|
type: "invalid_request_error",
|
|
1111
1101
|
code: "invalid_json"
|
|
1112
|
-
}
|
|
1102
|
+
}).body);
|
|
1113
1103
|
return;
|
|
1114
1104
|
}
|
|
1115
1105
|
if (!require_helpers.isJsonObject(responsesReq)) {
|
|
@@ -1123,10 +1113,10 @@ async function handleResponses(req, res, raw, fixtures, journal, defaults, setCo
|
|
|
1123
1113
|
fixture: null
|
|
1124
1114
|
}
|
|
1125
1115
|
});
|
|
1126
|
-
require_sse_writer.writeErrorResponse(res, 400,
|
|
1116
|
+
require_sse_writer.writeErrorResponse(res, 400, require_errors.renderError("openai", "validation", {
|
|
1127
1117
|
message: "Request body must be a JSON object",
|
|
1128
1118
|
type: "invalid_request_error"
|
|
1129
|
-
}
|
|
1119
|
+
}).body);
|
|
1130
1120
|
return;
|
|
1131
1121
|
}
|
|
1132
1122
|
let inputError;
|
|
@@ -1153,10 +1143,10 @@ async function handleResponses(req, res, raw, fixtures, journal, defaults, setCo
|
|
|
1153
1143
|
fixture: null
|
|
1154
1144
|
}
|
|
1155
1145
|
});
|
|
1156
|
-
require_sse_writer.writeErrorResponse(res, 400,
|
|
1146
|
+
require_sse_writer.writeErrorResponse(res, 400, require_errors.renderError("openai", "validation", {
|
|
1157
1147
|
message: validationError,
|
|
1158
1148
|
type: "invalid_request_error"
|
|
1159
|
-
}
|
|
1149
|
+
}).body);
|
|
1160
1150
|
return;
|
|
1161
1151
|
}
|
|
1162
1152
|
const extendedTools = defaults.responsesTools === "extended";
|
|
@@ -1181,7 +1171,7 @@ async function handleResponses(req, res, raw, fixtures, journal, defaults, setCo
|
|
|
1181
1171
|
body: completionReq
|
|
1182
1172
|
}, fixture ? "fixture" : "proxy", defaults.registry, defaults.logger)) return;
|
|
1183
1173
|
if (!fixture) {
|
|
1184
|
-
if (
|
|
1174
|
+
if (require_policy.resolveRequestDecisions(defaults.strict, req.headers).fixtureMiss) {
|
|
1185
1175
|
const strictStatus = 503;
|
|
1186
1176
|
const strictMessage = require_helpers.strictNoMatchMessage(skippedBySequenceOrTurn);
|
|
1187
1177
|
defaults.logger.error(require_helpers.strictNoMatchLogLine(req.method ?? "POST", req.url ?? "/v1/responses", skippedBySequenceOrTurn));
|
|
@@ -1193,14 +1183,14 @@ async function handleResponses(req, res, raw, fixtures, journal, defaults, setCo
|
|
|
1193
1183
|
response: {
|
|
1194
1184
|
status: strictStatus,
|
|
1195
1185
|
fixture: null,
|
|
1196
|
-
...
|
|
1186
|
+
...require_policy.strictOverrideField(defaults.strict, req.headers)
|
|
1197
1187
|
}
|
|
1198
1188
|
});
|
|
1199
|
-
require_sse_writer.writeErrorResponse(res, strictStatus,
|
|
1189
|
+
require_sse_writer.writeErrorResponse(res, strictStatus, require_errors.renderError("openai", "strict-miss", {
|
|
1200
1190
|
message: strictMessage,
|
|
1201
1191
|
type: "invalid_request_error",
|
|
1202
1192
|
code: "no_fixture_match"
|
|
1203
|
-
}
|
|
1193
|
+
}).body);
|
|
1204
1194
|
return;
|
|
1205
1195
|
}
|
|
1206
1196
|
if (defaults.record) {
|
|
@@ -1229,14 +1219,14 @@ async function handleResponses(req, res, raw, fixtures, journal, defaults, setCo
|
|
|
1229
1219
|
response: {
|
|
1230
1220
|
status: 404,
|
|
1231
1221
|
fixture: null,
|
|
1232
|
-
...
|
|
1222
|
+
...require_policy.strictOverrideField(defaults.strict, req.headers)
|
|
1233
1223
|
}
|
|
1234
1224
|
});
|
|
1235
|
-
require_sse_writer.writeErrorResponse(res, 404,
|
|
1225
|
+
require_sse_writer.writeErrorResponse(res, 404, require_errors.renderError("openai", "fixture-miss", {
|
|
1236
1226
|
message: "No fixture matched",
|
|
1237
1227
|
type: "invalid_request_error",
|
|
1238
1228
|
code: "no_fixture_match"
|
|
1239
|
-
}
|
|
1229
|
+
}).body);
|
|
1240
1230
|
return;
|
|
1241
1231
|
}
|
|
1242
1232
|
const resolvedResponse = await require_helpers.resolveResponse(fixture, completionReq);
|
|
@@ -1269,11 +1259,11 @@ async function handleResponses(req, res, raw, fixtures, journal, defaults, setCo
|
|
|
1269
1259
|
testId
|
|
1270
1260
|
});
|
|
1271
1261
|
if (!misbehavior.summary?.evaluations.some((evaluation) => evaluation.outcome === "error")) defaults.logger.error(misbehavior.message);
|
|
1272
|
-
require_sse_writer.writeErrorResponse(res, misbehavior.status,
|
|
1262
|
+
require_sse_writer.writeErrorResponse(res, misbehavior.status, require_errors.renderError("openai", "misbehavior", {
|
|
1273
1263
|
message: misbehavior.message,
|
|
1274
1264
|
type: "invalid_request_error",
|
|
1275
1265
|
code: misbehavior.code
|
|
1276
|
-
}
|
|
1266
|
+
}).body);
|
|
1277
1267
|
return;
|
|
1278
1268
|
}
|
|
1279
1269
|
const latency = fixture.latency ?? defaults.latency;
|
|
@@ -1350,7 +1340,7 @@ async function handleResponses(req, res, raw, fixtures, journal, defaults, setCo
|
|
|
1350
1340
|
}
|
|
1351
1341
|
if (require_helpers.isCombinedFixtureResponse(response)) {
|
|
1352
1342
|
const overrides = require_helpers.extractOverrides(response);
|
|
1353
|
-
const effectiveStrict =
|
|
1343
|
+
const effectiveStrict = require_policy.resolveRequestDecisions(defaults.strict, req.headers).reasoningSuppression;
|
|
1354
1344
|
const effReasoning = require_helpers.resolveReasoningForModel(response.reasoning, completionReq.model, effectiveStrict, defaults.logger);
|
|
1355
1345
|
const journalEntry = journal.add({
|
|
1356
1346
|
method: req.method ?? "POST",
|
|
@@ -1396,7 +1386,7 @@ async function handleResponses(req, res, raw, fixtures, journal, defaults, setCo
|
|
|
1396
1386
|
}
|
|
1397
1387
|
if (require_helpers.isTextResponse(response)) {
|
|
1398
1388
|
const overrides = require_helpers.extractOverrides(response);
|
|
1399
|
-
const effectiveStrict =
|
|
1389
|
+
const effectiveStrict = require_policy.resolveRequestDecisions(defaults.strict, req.headers).reasoningSuppression;
|
|
1400
1390
|
const effReasoning = require_helpers.resolveReasoningForModel(response.reasoning, completionReq.model, effectiveStrict, defaults.logger);
|
|
1401
1391
|
const journalEntry = journal.add({
|
|
1402
1392
|
method: req.method ?? "POST",
|
|
@@ -1439,7 +1429,7 @@ async function handleResponses(req, res, raw, fixtures, journal, defaults, setCo
|
|
|
1439
1429
|
}
|
|
1440
1430
|
if (require_helpers.isToolCallResponse(response)) {
|
|
1441
1431
|
const overrides = require_helpers.extractOverrides(response);
|
|
1442
|
-
const effectiveStrict =
|
|
1432
|
+
const effectiveStrict = require_policy.resolveRequestDecisions(defaults.strict, req.headers).reasoningSuppression;
|
|
1443
1433
|
const effReasoning = require_helpers.resolveReasoningForModel(response.reasoning, completionReq.model, effectiveStrict, defaults.logger);
|
|
1444
1434
|
const journalEntry = journal.add({
|
|
1445
1435
|
method: req.method ?? "POST",
|
|
@@ -1496,10 +1486,10 @@ async function handleResponses(req, res, raw, fixtures, journal, defaults, setCo
|
|
|
1496
1486
|
defaults,
|
|
1497
1487
|
testId
|
|
1498
1488
|
});
|
|
1499
|
-
require_sse_writer.writeErrorResponse(res, 500,
|
|
1489
|
+
require_sse_writer.writeErrorResponse(res, 500, require_errors.renderError("openai", "unknown-response", {
|
|
1500
1490
|
message: "Fixture response did not match any known type",
|
|
1501
1491
|
type: "server_error"
|
|
1502
|
-
}
|
|
1492
|
+
}).body);
|
|
1503
1493
|
}
|
|
1504
1494
|
/** Prepare call IDs once, retaining the engine's effective blocks and exact served-call metadata. */
|
|
1505
1495
|
function prepareResponsesMisbehavior(plan) {
|
|
@@ -1527,6 +1517,7 @@ function buildResponsesMisbehavior(plan, request, chunkSize, emitEncryptedReason
|
|
|
1527
1517
|
type: "message",
|
|
1528
1518
|
role: "assistant",
|
|
1529
1519
|
status: "completed",
|
|
1520
|
+
...overrides.phase !== void 0 ? { phase: overrides.phase } : {},
|
|
1530
1521
|
content: [part]
|
|
1531
1522
|
};
|
|
1532
1523
|
const position = {
|
|
@@ -1578,7 +1569,7 @@ function buildResponsesMisbehavior(plan, request, chunkSize, emitEncryptedReason
|
|
|
1578
1569
|
let callIndex = 0;
|
|
1579
1570
|
for (const block of blocks) {
|
|
1580
1571
|
if (block.type === "text") {
|
|
1581
|
-
const message = buildMessageOutputEvents(block.text, chunkSize, outputIndex);
|
|
1572
|
+
const message = buildMessageOutputEvents(block.text, chunkSize, outputIndex, overrides.phase);
|
|
1582
1573
|
events.push(...message.events);
|
|
1583
1574
|
output.push(message.msgItem);
|
|
1584
1575
|
} else {
|
|
@@ -1607,11 +1598,7 @@ function buildResponsesMisbehavior(plan, request, chunkSize, emitEncryptedReason
|
|
|
1607
1598
|
status: incomplete ? "incomplete" : responsesStatus(overrides?.finishReason, "completed"),
|
|
1608
1599
|
...incomplete ? { incomplete_details: { reason: plan.stop === "content_filter" ? "content_filter" : "max_output_tokens" } } : {},
|
|
1609
1600
|
output,
|
|
1610
|
-
usage: {
|
|
1611
|
-
input_tokens: usage.prompt_tokens,
|
|
1612
|
-
output_tokens: usage.completion_tokens,
|
|
1613
|
-
total_tokens: usage.total_tokens
|
|
1614
|
-
}
|
|
1601
|
+
usage: require_responses.render({ usage })
|
|
1615
1602
|
};
|
|
1616
1603
|
events.push({
|
|
1617
1604
|
type: incomplete ? "response.incomplete" : "response.completed",
|