@copilotkit/aimock 1.43.0 → 1.45.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 +46 -0
- package/README.md +14 -2
- package/dist/agui-handler.d.ts.map +1 -1
- package/dist/aimock-cli.cjs +31 -5
- 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 +31 -5
- package/dist/aimock-cli.js.map +1 -1
- package/dist/bedrock-converse.cjs +344 -43
- 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 +345 -44
- package/dist/bedrock-converse.js.map +1 -1
- package/dist/bedrock.cjs +195 -42
- 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 +196 -43
- package/dist/bedrock.js.map +1 -1
- package/dist/chaos.cjs +9 -5
- 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 +10 -7
- package/dist/chaos.js.map +1 -1
- package/dist/cli.cjs +238 -9
- package/dist/cli.cjs.map +1 -1
- package/dist/cli.js +242 -13
- package/dist/cli.js.map +1 -1
- package/dist/cohere.cjs +159 -72
- 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 +160 -73
- package/dist/cohere.js.map +1 -1
- package/dist/config-loader.cjs +63 -5
- package/dist/config-loader.cjs.map +1 -1
- package/dist/config-loader.d.cts +37 -4
- package/dist/config-loader.d.cts.map +1 -1
- package/dist/config-loader.d.ts +37 -4
- package/dist/config-loader.d.ts.map +1 -1
- package/dist/config-loader.js +63 -5
- package/dist/config-loader.js.map +1 -1
- package/dist/constants.cjs +8 -0
- package/dist/constants.cjs.map +1 -1
- package/dist/constants.d.cts +6 -2
- package/dist/constants.d.ts +6 -2
- package/dist/constants.js +8 -1
- package/dist/constants.js.map +1 -1
- package/dist/echo-text.cjs +65 -0
- package/dist/echo-text.cjs.map +1 -0
- package/dist/echo-text.d.cts +22 -0
- package/dist/echo-text.d.cts.map +1 -0
- package/dist/echo-text.d.ts +22 -0
- package/dist/echo-text.d.ts.map +1 -0
- package/dist/echo-text.js +65 -0
- package/dist/echo-text.js.map +1 -0
- package/dist/embeddings.cjs +18 -1
- package/dist/embeddings.cjs.map +1 -1
- package/dist/embeddings.d.cts +1 -1
- package/dist/embeddings.d.cts.map +1 -1
- package/dist/embeddings.d.ts +1 -1
- package/dist/embeddings.d.ts.map +1 -1
- package/dist/embeddings.js +18 -1
- package/dist/embeddings.js.map +1 -1
- package/dist/fakes-plugin.cjs +131 -0
- package/dist/fakes-plugin.cjs.map +1 -0
- package/dist/fakes-plugin.d.cts +23 -0
- package/dist/fakes-plugin.d.cts.map +1 -0
- package/dist/fakes-plugin.d.ts +23 -0
- package/dist/fakes-plugin.d.ts.map +1 -0
- package/dist/fakes-plugin.js +127 -0
- package/dist/fakes-plugin.js.map +1 -0
- package/dist/files.cjs +9 -11
- 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 +10 -13
- package/dist/files.js.map +1 -1
- package/dist/fine-tuning.cjs +1 -19
- 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 -20
- package/dist/fine-tuning.js.map +1 -1
- package/dist/fixture-loader-services.cjs +116 -0
- package/dist/fixture-loader-services.cjs.map +1 -0
- package/dist/fixture-loader-services.d.cts +48 -0
- package/dist/fixture-loader-services.d.cts.map +1 -0
- package/dist/fixture-loader-services.d.ts +48 -0
- package/dist/fixture-loader-services.d.ts.map +1 -0
- package/dist/fixture-loader-services.js +114 -0
- package/dist/fixture-loader-services.js.map +1 -0
- package/dist/fixture-loader.cjs +552 -29
- package/dist/fixture-loader.cjs.map +1 -1
- package/dist/fixture-loader.d.cts +140 -2
- package/dist/fixture-loader.d.cts.map +1 -1
- package/dist/fixture-loader.d.ts +140 -2
- package/dist/fixture-loader.d.ts.map +1 -1
- package/dist/fixture-loader.js +542 -31
- package/dist/fixture-loader.js.map +1 -1
- package/dist/gemini-embeddings.cjs +42 -2
- package/dist/gemini-embeddings.cjs.map +1 -1
- package/dist/gemini-embeddings.js +43 -3
- package/dist/gemini-embeddings.js.map +1 -1
- package/dist/gemini-interactions.cjs +288 -52
- package/dist/gemini-interactions.cjs.map +1 -1
- package/dist/gemini-interactions.d.cts.map +1 -1
- package/dist/gemini-interactions.d.ts.map +1 -1
- package/dist/gemini-interactions.js +289 -53
- package/dist/gemini-interactions.js.map +1 -1
- package/dist/gemini.cjs +234 -38
- 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 +235 -39
- package/dist/gemini.js.map +1 -1
- package/dist/helpers.cjs +1157 -12
- package/dist/helpers.cjs.map +1 -1
- package/dist/helpers.d.cts +85 -4
- package/dist/helpers.d.cts.map +1 -1
- package/dist/helpers.d.ts +85 -4
- package/dist/helpers.d.ts.map +1 -1
- package/dist/helpers.js +1113 -14
- package/dist/helpers.js.map +1 -1
- package/dist/images.cjs +3 -2
- package/dist/images.cjs.map +1 -1
- package/dist/images.js +3 -2
- package/dist/images.js.map +1 -1
- package/dist/index.cjs +39 -1
- package/dist/index.d.cts +11 -4
- package/dist/index.d.ts +11 -4
- package/dist/index.js +11 -4
- package/dist/jest.cjs +43 -14
- package/dist/jest.cjs.map +1 -1
- package/dist/jest.d.cts +47 -5
- package/dist/jest.d.cts.map +1 -1
- package/dist/jest.d.ts +47 -5
- package/dist/jest.d.ts.map +1 -1
- package/dist/jest.js +45 -16
- package/dist/jest.js.map +1 -1
- package/dist/journal.cjs +155 -13
- package/dist/journal.cjs.map +1 -1
- package/dist/journal.d.cts +54 -4
- package/dist/journal.d.cts.map +1 -1
- package/dist/journal.d.ts +54 -4
- package/dist/journal.d.ts.map +1 -1
- package/dist/journal.js +155 -13
- package/dist/journal.js.map +1 -1
- package/dist/live-sanitize.cjs +4 -32
- package/dist/live-sanitize.cjs.map +1 -1
- package/dist/live-sanitize.js +4 -32
- package/dist/live-sanitize.js.map +1 -1
- package/dist/llmock.cjs +204 -39
- package/dist/llmock.cjs.map +1 -1
- package/dist/llmock.d.cts +51 -1
- package/dist/llmock.d.cts.map +1 -1
- package/dist/llmock.d.ts +51 -1
- package/dist/llmock.d.ts.map +1 -1
- package/dist/llmock.js +206 -41
- package/dist/llmock.js.map +1 -1
- package/dist/mcp-fakes-mount.cjs +217 -0
- package/dist/mcp-fakes-mount.cjs.map +1 -0
- package/dist/mcp-fakes-mount.js +211 -0
- package/dist/mcp-fakes-mount.js.map +1 -0
- package/dist/mcp-fakes-report.cjs +111 -0
- package/dist/mcp-fakes-report.cjs.map +1 -0
- package/dist/mcp-fakes-report.d.cts +40 -0
- package/dist/mcp-fakes-report.d.cts.map +1 -0
- package/dist/mcp-fakes-report.d.ts +40 -0
- package/dist/mcp-fakes-report.d.ts.map +1 -0
- package/dist/mcp-fakes-report.js +107 -0
- package/dist/mcp-fakes-report.js.map +1 -0
- package/dist/mcp-fakes.cjs +1942 -0
- package/dist/mcp-fakes.cjs.map +1 -0
- package/dist/mcp-fakes.d.cts +504 -0
- package/dist/mcp-fakes.d.cts.map +1 -0
- package/dist/mcp-fakes.d.ts +504 -0
- package/dist/mcp-fakes.d.ts.map +1 -0
- package/dist/mcp-fakes.js +1937 -0
- package/dist/mcp-fakes.js.map +1 -0
- package/dist/mcp-handler.cjs +534 -27
- package/dist/mcp-handler.cjs.map +1 -1
- package/dist/mcp-handler.d.cts +49 -0
- package/dist/mcp-handler.d.cts.map +1 -0
- package/dist/mcp-handler.d.ts +49 -0
- package/dist/mcp-handler.d.ts.map +1 -0
- package/dist/mcp-handler.js +530 -28
- package/dist/mcp-handler.js.map +1 -1
- package/dist/mcp-mock.cjs +326 -47
- package/dist/mcp-mock.cjs.map +1 -1
- package/dist/mcp-mock.d.cts +97 -1
- package/dist/mcp-mock.d.cts.map +1 -1
- package/dist/mcp-mock.d.ts +97 -1
- package/dist/mcp-mock.d.ts.map +1 -1
- package/dist/mcp-mock.js +327 -48
- package/dist/mcp-mock.js.map +1 -1
- package/dist/mcp-recorder.cjs +1224 -0
- package/dist/mcp-recorder.cjs.map +1 -0
- package/dist/mcp-recorder.d.cts +108 -0
- package/dist/mcp-recorder.d.cts.map +1 -0
- package/dist/mcp-recorder.d.ts +108 -0
- package/dist/mcp-recorder.d.ts.map +1 -0
- package/dist/mcp-recorder.js +1215 -0
- package/dist/mcp-recorder.js.map +1 -0
- package/dist/mcp-stub.cjs +5 -1
- package/dist/mcp-stub.d.cts +3 -1
- package/dist/mcp-stub.d.ts +3 -1
- package/dist/mcp-stub.js +3 -1
- package/dist/mcp-types.d.cts +6 -0
- package/dist/mcp-types.d.ts +6 -0
- package/dist/message-text.cjs +192 -0
- package/dist/message-text.cjs.map +1 -0
- package/dist/message-text.d.cts +31 -0
- package/dist/message-text.d.cts.map +1 -0
- package/dist/message-text.d.ts +31 -0
- package/dist/message-text.d.ts.map +1 -0
- package/dist/message-text.js +184 -0
- package/dist/message-text.js.map +1 -0
- package/dist/messages.cjs +400 -56
- 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 +401 -58
- package/dist/messages.js.map +1 -1
- package/dist/metrics.cjs +46 -66
- package/dist/metrics.cjs.map +1 -1
- package/dist/metrics.d.cts +14 -6
- package/dist/metrics.d.cts.map +1 -1
- package/dist/metrics.d.ts +14 -6
- package/dist/metrics.d.ts.map +1 -1
- package/dist/metrics.js +32 -40
- package/dist/metrics.js.map +1 -1
- package/dist/misbehavior.cjs +1523 -0
- package/dist/misbehavior.cjs.map +1 -0
- package/dist/misbehavior.d.cts +43 -0
- package/dist/misbehavior.d.cts.map +1 -0
- package/dist/misbehavior.d.ts +43 -0
- package/dist/misbehavior.d.ts.map +1 -0
- package/dist/misbehavior.js +1511 -0
- package/dist/misbehavior.js.map +1 -0
- package/dist/ollama.cjs +315 -113
- 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 +316 -114
- package/dist/ollama.js.map +1 -1
- package/dist/openapi.cjs +3405 -0
- package/dist/openapi.cjs.map +1 -0
- package/dist/openapi.d.cts +30 -0
- package/dist/openapi.d.cts.map +1 -0
- package/dist/openapi.d.ts +30 -0
- package/dist/openapi.d.ts.map +1 -0
- package/dist/openapi.js +3404 -0
- package/dist/openapi.js.map +1 -0
- package/dist/openrouter-video.cjs +4 -4
- 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 +4 -4
- package/dist/openrouter-video.js.map +1 -1
- package/dist/record-sanitize.cjs +231 -0
- package/dist/record-sanitize.cjs.map +1 -0
- package/dist/record-sanitize.js +224 -0
- package/dist/record-sanitize.js.map +1 -0
- package/dist/recorder.cjs +115 -6
- package/dist/recorder.cjs.map +1 -1
- package/dist/recorder.d.cts +2 -1
- package/dist/recorder.d.cts.map +1 -1
- package/dist/recorder.d.ts +2 -1
- package/dist/recorder.d.ts.map +1 -1
- package/dist/recorder.js +116 -8
- package/dist/recorder.js.map +1 -1
- package/dist/responses.cjs +701 -166
- package/dist/responses.cjs.map +1 -1
- package/dist/responses.d.cts +5 -13
- package/dist/responses.d.cts.map +1 -1
- package/dist/responses.d.ts +5 -13
- package/dist/responses.d.ts.map +1 -1
- package/dist/responses.js +699 -169
- package/dist/responses.js.map +1 -1
- package/dist/route-registry.cjs +951 -0
- package/dist/route-registry.cjs.map +1 -0
- package/dist/route-registry.d.cts +33 -0
- package/dist/route-registry.d.cts.map +1 -0
- package/dist/route-registry.d.ts +33 -0
- package/dist/route-registry.d.ts.map +1 -0
- package/dist/route-registry.js +866 -0
- package/dist/route-registry.js.map +1 -0
- package/dist/router.cjs +24 -2
- 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 +25 -4
- package/dist/router.js.map +1 -1
- package/dist/server.cjs +1159 -264
- package/dist/server.cjs.map +1 -1
- package/dist/server.d.cts +4 -1
- package/dist/server.d.cts.map +1 -1
- package/dist/server.d.ts +4 -1
- package/dist/server.d.ts.map +1 -1
- package/dist/server.js +1067 -172
- package/dist/server.js.map +1 -1
- package/dist/speech.cjs +4 -2
- package/dist/speech.cjs.map +1 -1
- package/dist/speech.js +4 -2
- package/dist/speech.js.map +1 -1
- package/dist/stream-collapse.cjs +236 -34
- package/dist/stream-collapse.cjs.map +1 -1
- package/dist/stream-collapse.d.cts +39 -4
- package/dist/stream-collapse.d.cts.map +1 -1
- package/dist/stream-collapse.d.ts +39 -4
- package/dist/stream-collapse.d.ts.map +1 -1
- package/dist/stream-collapse.js +235 -35
- package/dist/stream-collapse.js.map +1 -1
- package/dist/suite.cjs +1 -1
- package/dist/suite.js +1 -1
- package/dist/transcription.cjs +2 -2
- 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 +2 -2
- package/dist/transcription.js.map +1 -1
- package/dist/types.cjs +18 -0
- package/dist/types.cjs.map +1 -0
- package/dist/types.d.cts +516 -5
- package/dist/types.d.cts.map +1 -1
- package/dist/types.d.ts +516 -5
- package/dist/types.d.ts.map +1 -1
- package/dist/types.js +17 -0
- package/dist/types.js.map +1 -0
- package/dist/validate-cli.cjs +123 -33
- package/dist/validate-cli.cjs.map +1 -1
- package/dist/validate-cli.js +125 -35
- package/dist/validate-cli.js.map +1 -1
- package/dist/vector-stores.cjs +1180 -0
- package/dist/vector-stores.cjs.map +1 -0
- package/dist/vector-stores.d.cts +106 -0
- package/dist/vector-stores.d.cts.map +1 -0
- package/dist/vector-stores.d.ts +106 -0
- package/dist/vector-stores.d.ts.map +1 -0
- package/dist/vector-stores.js +1164 -0
- package/dist/vector-stores.js.map +1 -0
- package/dist/vector-types.d.cts.map +1 -1
- package/dist/version.cjs +45 -0
- package/dist/version.cjs.map +1 -0
- package/dist/version.js +44 -0
- package/dist/version.js.map +1 -0
- package/dist/video.cjs +19 -0
- 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 +19 -0
- package/dist/video.js.map +1 -1
- package/dist/vitest.cjs +77 -16
- package/dist/vitest.cjs.map +1 -1
- package/dist/vitest.d.cts +38 -5
- package/dist/vitest.d.cts.map +1 -1
- package/dist/vitest.d.ts +38 -5
- package/dist/vitest.d.ts.map +1 -1
- package/dist/vitest.js +78 -17
- package/dist/vitest.js.map +1 -1
- package/dist/watcher.cjs +6 -2
- package/dist/watcher.cjs.map +1 -1
- package/dist/watcher.js +6 -2
- package/dist/watcher.js.map +1 -1
- package/dist/ws-gemini-live.cjs +210 -101
- package/dist/ws-gemini-live.cjs.map +1 -1
- package/dist/ws-gemini-live.d.cts +9 -3
- package/dist/ws-gemini-live.d.cts.map +1 -1
- package/dist/ws-gemini-live.d.ts +9 -3
- package/dist/ws-gemini-live.d.ts.map +1 -1
- package/dist/ws-gemini-live.js +211 -102
- package/dist/ws-gemini-live.js.map +1 -1
- package/dist/ws-realtime.cjs +175 -62
- package/dist/ws-realtime.cjs.map +1 -1
- package/dist/ws-realtime.d.cts +8 -3
- package/dist/ws-realtime.d.cts.map +1 -1
- package/dist/ws-realtime.d.ts +8 -3
- package/dist/ws-realtime.d.ts.map +1 -1
- package/dist/ws-realtime.js +176 -63
- package/dist/ws-realtime.js.map +1 -1
- package/dist/ws-responses.cjs +121 -16
- package/dist/ws-responses.cjs.map +1 -1
- package/dist/ws-responses.d.cts +8 -12
- package/dist/ws-responses.d.cts.map +1 -1
- package/dist/ws-responses.d.ts +8 -12
- package/dist/ws-responses.d.ts.map +1 -1
- package/dist/ws-responses.js +123 -18
- package/dist/ws-responses.js.map +1 -1
- package/package.json +13 -2
- package/skills/write-fixtures/SKILL.md +179 -21
package/dist/bedrock-converse.js
CHANGED
|
@@ -1,6 +1,7 @@
|
|
|
1
|
-
import { extractOverrides, flattenHeaders, generateToolUseId, getContext, getTestId,
|
|
1
|
+
import { InvalidToolArgumentsError, estimatePromptTokens, estimateTokens, extractOverrides, flattenHeaders, generateToolUseId, getContext, getTestId, isCombinedFixtureResponse, isErrorResponse, isJsonObject, isTextResponse, isToolCallResponse, requireEmittedFunctionToolCalls, resolveFixtureBlockOutcome, resolveReasoningForModel, resolveResponse, resolveStrictMode, servedToolArgs, strictNoMatchLogLine, strictNoMatchMessage, strictOverrideField, toolArgsForWire } from "./helpers.js";
|
|
2
2
|
import { writeErrorResponse } from "./sse-writer.js";
|
|
3
3
|
import { applyChaosAsync } from "./chaos.js";
|
|
4
|
+
import { planMisbehavior, recordMisbehaviorOutcome } from "./misbehavior.js";
|
|
4
5
|
import { matchFixtureDiagnostic, recordMatchOptions } from "./router.js";
|
|
5
6
|
import { proxyAndRecord } from "./recorder.js";
|
|
6
7
|
import { createInterruptionSignal } from "./interruption.js";
|
|
@@ -37,13 +38,7 @@ function converseUsage(overrides) {
|
|
|
37
38
|
};
|
|
38
39
|
}
|
|
39
40
|
function parseConverseToolArgumentsForStream(toolCall, logger) {
|
|
40
|
-
|
|
41
|
-
const parsed = JSON.parse(toolCall.arguments || "{}");
|
|
42
|
-
return JSON.stringify(parsed);
|
|
43
|
-
} catch {
|
|
44
|
-
logger.warn(`Malformed JSON in fixture tool call arguments for "${toolCall.name}": ${toolCall.arguments}`);
|
|
45
|
-
return "{}";
|
|
46
|
-
}
|
|
41
|
+
return servedToolArgs(toolCall, "string", logger).text;
|
|
47
42
|
}
|
|
48
43
|
function buildBedrockStreamTextEvents(content, chunkSize, reasoning, overrides) {
|
|
49
44
|
const events = [{
|
|
@@ -311,6 +306,32 @@ function buildBedrockStreamToolCallEvents(toolCalls, chunkSize, logger, reasonin
|
|
|
311
306
|
});
|
|
312
307
|
return events;
|
|
313
308
|
}
|
|
309
|
+
/** Validate only message fields consumed by the user-message converter. */
|
|
310
|
+
function validateConverseMessages(req) {
|
|
311
|
+
for (const [i, message] of req.messages.entries()) {
|
|
312
|
+
if (message === null) return `Invalid request: messages[${i}] must not be null`;
|
|
313
|
+
if (message.role !== "user") continue;
|
|
314
|
+
if (!Array.isArray(message.content)) return `Invalid request: messages[${i}].content must be an array`;
|
|
315
|
+
for (const [j, block] of message.content.entries()) {
|
|
316
|
+
if (block === null) return `Invalid request: messages[${i}].content[${j}] must not be null`;
|
|
317
|
+
if (block.toolResult && !Array.isArray(block.toolResult.content)) return `Invalid request: messages[${i}].content[${j}].toolResult.content must be an array`;
|
|
318
|
+
}
|
|
319
|
+
}
|
|
320
|
+
}
|
|
321
|
+
/** Validate only system fields consumed by the converter. */
|
|
322
|
+
function validateConverseSystem(req) {
|
|
323
|
+
if (req.system && req.system.length > 0) {
|
|
324
|
+
if (!Array.isArray(req.system)) return "Invalid request: system must be an array";
|
|
325
|
+
for (const [i, block] of req.system.entries()) if (block === null) return `Invalid request: system[${i}] must not be null`;
|
|
326
|
+
}
|
|
327
|
+
}
|
|
328
|
+
/** Validate only tool fields consumed by the converter. */
|
|
329
|
+
function validateConverseTools(req) {
|
|
330
|
+
if (req.toolConfig?.tools && req.toolConfig.tools.length > 0) {
|
|
331
|
+
if (!Array.isArray(req.toolConfig.tools)) return "Invalid request: toolConfig.tools must be an array";
|
|
332
|
+
for (const [i, tool] of req.toolConfig.tools.entries()) if (tool?.toolSpec === null) return `Invalid request: toolConfig.tools[${i}].toolSpec must not be null`;
|
|
333
|
+
}
|
|
334
|
+
}
|
|
314
335
|
function converseToCompletionRequest(req, modelId, logger) {
|
|
315
336
|
const messages = [];
|
|
316
337
|
if (req.system && req.system.length > 0) {
|
|
@@ -404,17 +425,11 @@ function buildConverseToolCallResponse(toolCalls, logger, reasoning, overrides)
|
|
|
404
425
|
const contentBlocks = [];
|
|
405
426
|
if (reasoning) contentBlocks.push({ reasoningContent: { reasoningText: { text: reasoning } } });
|
|
406
427
|
for (const tc of toolCalls) {
|
|
407
|
-
|
|
408
|
-
try {
|
|
409
|
-
argsObj = JSON.parse(tc.arguments || "{}");
|
|
410
|
-
} catch {
|
|
411
|
-
logger.warn(`Malformed JSON in fixture tool call arguments for "${tc.name}": ${tc.arguments}`);
|
|
412
|
-
argsObj = {};
|
|
413
|
-
}
|
|
428
|
+
const args = servedToolArgs(tc, "object", logger);
|
|
414
429
|
contentBlocks.push({ toolUse: {
|
|
415
430
|
toolUseId: tc.id || generateToolUseId(),
|
|
416
431
|
name: tc.name,
|
|
417
|
-
input:
|
|
432
|
+
input: args.value
|
|
418
433
|
} });
|
|
419
434
|
}
|
|
420
435
|
return {
|
|
@@ -431,17 +446,11 @@ function buildConverseContentWithToolCallsResponse(content, toolCalls, logger, r
|
|
|
431
446
|
const contentBlocks = [];
|
|
432
447
|
if (reasoning) contentBlocks.push({ reasoningContent: { reasoningText: { text: reasoning } } });
|
|
433
448
|
const toolUseBlock = (tc) => {
|
|
434
|
-
|
|
435
|
-
try {
|
|
436
|
-
argsObj = JSON.parse(tc.arguments || "{}");
|
|
437
|
-
} catch {
|
|
438
|
-
logger.warn(`Malformed JSON in fixture tool call arguments for "${tc.name}": ${tc.arguments}`);
|
|
439
|
-
argsObj = {};
|
|
440
|
-
}
|
|
449
|
+
const args = servedToolArgs(tc, "object", logger);
|
|
441
450
|
return { toolUse: {
|
|
442
451
|
toolUseId: tc.id || generateToolUseId(),
|
|
443
452
|
name: tc.name,
|
|
444
|
-
input:
|
|
453
|
+
input: args.value
|
|
445
454
|
} };
|
|
446
455
|
};
|
|
447
456
|
let blockHasTools;
|
|
@@ -469,6 +478,160 @@ function buildConverseContentWithToolCallsResponse(content, toolCalls, logger, r
|
|
|
469
478
|
metrics: { latencyMs: 0 }
|
|
470
479
|
};
|
|
471
480
|
}
|
|
481
|
+
/** Prepare actual emitted calls and identities before journaling or writing bytes. */
|
|
482
|
+
function prepareConverseMisbehavior(plan, request, stream, defaults, headers) {
|
|
483
|
+
const response = plan.response;
|
|
484
|
+
const combined = isCombinedFixtureResponse(response);
|
|
485
|
+
let blocks = (combined && response.blocks?.length ? resolveFixtureBlockOutcome(response.blocks) : void 0)?.ordered.map((block) => ({ ...block })) ?? [..."content" in response && response.content ? [{
|
|
486
|
+
type: "text",
|
|
487
|
+
text: response.content
|
|
488
|
+
}] : [], ...(combined || isToolCallResponse(response) ? response.toolCalls ?? [] : []).map((call) => ({
|
|
489
|
+
type: "toolCall",
|
|
490
|
+
...call
|
|
491
|
+
}))];
|
|
492
|
+
const calls = blocks.filter((block) => block.type === "toolCall");
|
|
493
|
+
const preparedCalls = calls.map((call, index) => {
|
|
494
|
+
const args = toolArgsForWire(call);
|
|
495
|
+
return {
|
|
496
|
+
...call,
|
|
497
|
+
arguments: args.kind === "parsed" ? args.text : args.raw,
|
|
498
|
+
...index === plan.duplicateId?.destinationIndex ? {} : { id: call.id || generateToolUseId() }
|
|
499
|
+
};
|
|
500
|
+
});
|
|
501
|
+
if (plan.duplicateId) preparedCalls[plan.duplicateId.destinationIndex].id = preparedCalls[plan.duplicateId.sourceIndex].id;
|
|
502
|
+
let callIndex = 0;
|
|
503
|
+
blocks = blocks.map((block) => block.type === "toolCall" ? preparedCalls[callIndex++] : block);
|
|
504
|
+
let stopReason = converseStopReason("finishReason" in response ? response.finishReason : void 0, calls.length ? "tool_use" : "end_turn");
|
|
505
|
+
if (plan.stop === "stop") stopReason = "end_turn";
|
|
506
|
+
if (plan.stop === "length") stopReason = "max_tokens";
|
|
507
|
+
if (plan.stop === "content_filter") stopReason = "content_filtered";
|
|
508
|
+
if (!stream && plan.summary.fault === "tool-args-invalid-json") {
|
|
509
|
+
blocks = blocks.filter((block) => block.type !== "toolCall");
|
|
510
|
+
stopReason = "malformed_tool_use";
|
|
511
|
+
}
|
|
512
|
+
if (!stream && plan.summary.fault === "stop-length-mid-tool") {
|
|
513
|
+
let index = 0;
|
|
514
|
+
blocks = blocks.map((block) => {
|
|
515
|
+
if (block.type !== "toolCall") return block;
|
|
516
|
+
return index++ === plan.target?.index ? {
|
|
517
|
+
...block,
|
|
518
|
+
arguments: "{}"
|
|
519
|
+
} : block;
|
|
520
|
+
});
|
|
521
|
+
}
|
|
522
|
+
const reasoning = plan.reasoning ?? resolveReasoningForModel("reasoning" in response ? response.reasoning : void 0, request.model, resolveStrictMode(defaults.strict, headers), defaults.logger) ?? "";
|
|
523
|
+
const servedToolCalls = blocks.flatMap((block) => block.type === "toolCall" ? [{
|
|
524
|
+
name: block.name,
|
|
525
|
+
arguments: block.arguments,
|
|
526
|
+
id: block.id
|
|
527
|
+
}] : []);
|
|
528
|
+
const inputTokens = estimatePromptTokens(request.messages);
|
|
529
|
+
const outputTokens = estimateTokens(reasoning + blocks.map((block) => block.type === "text" ? block.text : block.name + block.arguments).join(""));
|
|
530
|
+
return {
|
|
531
|
+
plan: {
|
|
532
|
+
...plan,
|
|
533
|
+
summary: {
|
|
534
|
+
...plan.summary,
|
|
535
|
+
servedToolCalls
|
|
536
|
+
}
|
|
537
|
+
},
|
|
538
|
+
blocks,
|
|
539
|
+
reasoning,
|
|
540
|
+
stopReason,
|
|
541
|
+
usage: {
|
|
542
|
+
inputTokens,
|
|
543
|
+
outputTokens,
|
|
544
|
+
totalTokens: inputTokens + outputTokens
|
|
545
|
+
}
|
|
546
|
+
};
|
|
547
|
+
}
|
|
548
|
+
function buildConverseMisbehaviorResponse(prepared) {
|
|
549
|
+
const content = prepared.reasoning || prepared.plan.summary.fault === "reasoning-only" ? [{ reasoningContent: { reasoningText: { text: prepared.reasoning } } }] : [];
|
|
550
|
+
for (const block of prepared.blocks) if (block.type === "text") content.push({ text: block.text });
|
|
551
|
+
else {
|
|
552
|
+
const args = toolArgsForWire(block);
|
|
553
|
+
if (args.kind === "verbatim") throw new InvalidToolArgumentsError(block);
|
|
554
|
+
content.push({ toolUse: {
|
|
555
|
+
toolUseId: block.id,
|
|
556
|
+
name: block.name,
|
|
557
|
+
input: args.value
|
|
558
|
+
} });
|
|
559
|
+
}
|
|
560
|
+
return {
|
|
561
|
+
output: { message: {
|
|
562
|
+
role: "assistant",
|
|
563
|
+
content
|
|
564
|
+
} },
|
|
565
|
+
stopReason: prepared.stopReason,
|
|
566
|
+
usage: prepared.usage,
|
|
567
|
+
metrics: { latencyMs: 0 }
|
|
568
|
+
};
|
|
569
|
+
}
|
|
570
|
+
function buildConverseMisbehaviorEvents(prepared, chunkSize) {
|
|
571
|
+
const events = [{
|
|
572
|
+
eventType: "messageStart",
|
|
573
|
+
payload: { role: "assistant" }
|
|
574
|
+
}];
|
|
575
|
+
let index = 0;
|
|
576
|
+
if (prepared.reasoning || prepared.plan.summary.fault === "reasoning-only") {
|
|
577
|
+
events.push({
|
|
578
|
+
eventType: "contentBlockStart",
|
|
579
|
+
payload: {
|
|
580
|
+
contentBlockIndex: index,
|
|
581
|
+
start: { reasoningContent: {} }
|
|
582
|
+
}
|
|
583
|
+
});
|
|
584
|
+
for (let i = 0; i < prepared.reasoning.length; i += chunkSize) events.push({
|
|
585
|
+
eventType: "contentBlockDelta",
|
|
586
|
+
payload: {
|
|
587
|
+
contentBlockIndex: index,
|
|
588
|
+
delta: { reasoningContent: { text: prepared.reasoning.slice(i, i + chunkSize) } }
|
|
589
|
+
}
|
|
590
|
+
});
|
|
591
|
+
events.push({
|
|
592
|
+
eventType: "contentBlockStop",
|
|
593
|
+
payload: { contentBlockIndex: index++ }
|
|
594
|
+
});
|
|
595
|
+
}
|
|
596
|
+
for (const block of prepared.blocks) {
|
|
597
|
+
events.push({
|
|
598
|
+
eventType: "contentBlockStart",
|
|
599
|
+
payload: {
|
|
600
|
+
contentBlockIndex: index,
|
|
601
|
+
start: block.type === "toolCall" ? { toolUse: {
|
|
602
|
+
toolUseId: block.id,
|
|
603
|
+
name: block.name
|
|
604
|
+
} } : {}
|
|
605
|
+
}
|
|
606
|
+
});
|
|
607
|
+
const value = block.type === "text" ? block.text : block.arguments;
|
|
608
|
+
for (let i = 0; i < value.length; i += chunkSize) {
|
|
609
|
+
const part = value.slice(i, i + chunkSize);
|
|
610
|
+
events.push({
|
|
611
|
+
eventType: "contentBlockDelta",
|
|
612
|
+
payload: {
|
|
613
|
+
contentBlockIndex: index,
|
|
614
|
+
delta: block.type === "text" ? { text: part } : { toolUse: { input: part } }
|
|
615
|
+
}
|
|
616
|
+
});
|
|
617
|
+
}
|
|
618
|
+
events.push({
|
|
619
|
+
eventType: "contentBlockStop",
|
|
620
|
+
payload: { contentBlockIndex: index++ }
|
|
621
|
+
});
|
|
622
|
+
}
|
|
623
|
+
events.push({
|
|
624
|
+
eventType: "messageStop",
|
|
625
|
+
payload: { stopReason: prepared.stopReason }
|
|
626
|
+
}, {
|
|
627
|
+
eventType: "metadata",
|
|
628
|
+
payload: {
|
|
629
|
+
usage: prepared.usage,
|
|
630
|
+
metrics: { latencyMs: 0 }
|
|
631
|
+
}
|
|
632
|
+
});
|
|
633
|
+
return events;
|
|
634
|
+
}
|
|
472
635
|
async function handleConverse(req, res, raw, modelId, fixtures, journal, defaults, setCorsHeaders) {
|
|
473
636
|
const { logger } = defaults;
|
|
474
637
|
setCorsHeaders(res);
|
|
@@ -511,7 +674,8 @@ async function handleConverse(req, res, raw, modelId, fixtures, journal, default
|
|
|
511
674
|
} }));
|
|
512
675
|
return;
|
|
513
676
|
}
|
|
514
|
-
|
|
677
|
+
const messageError = !Array.isArray(converseReq.messages) ? "Invalid request: messages array is required" : validateConverseMessages(converseReq) ?? validateConverseSystem(converseReq) ?? validateConverseTools(converseReq);
|
|
678
|
+
if (messageError) {
|
|
515
679
|
journal.add({
|
|
516
680
|
method: req.method ?? "POST",
|
|
517
681
|
path: urlPath,
|
|
@@ -523,7 +687,7 @@ async function handleConverse(req, res, raw, modelId, fixtures, journal, default
|
|
|
523
687
|
}
|
|
524
688
|
});
|
|
525
689
|
writeErrorResponse(res, 400, JSON.stringify({ error: {
|
|
526
|
-
message:
|
|
690
|
+
message: messageError,
|
|
527
691
|
type: "invalid_request_error"
|
|
528
692
|
} }));
|
|
529
693
|
return;
|
|
@@ -600,9 +764,70 @@ async function handleConverse(req, res, raw, modelId, fixtures, journal, default
|
|
|
600
764
|
return;
|
|
601
765
|
}
|
|
602
766
|
const response = await resolveResponse(fixture, completionReq);
|
|
767
|
+
let misbehavior = planMisbehavior({
|
|
768
|
+
wire: "bedrock-converse",
|
|
769
|
+
emitsToolCallIds: true,
|
|
770
|
+
fixture,
|
|
771
|
+
response,
|
|
772
|
+
request: completionReq,
|
|
773
|
+
stream: false,
|
|
774
|
+
defaults,
|
|
775
|
+
rawHeaders: req.headers,
|
|
776
|
+
url: req.url
|
|
777
|
+
});
|
|
778
|
+
const addResponseEntry = (input) => {
|
|
779
|
+
const entry = journal.add(input);
|
|
780
|
+
recordMisbehaviorOutcome({
|
|
781
|
+
entry,
|
|
782
|
+
summary: misbehavior.summary,
|
|
783
|
+
defaults,
|
|
784
|
+
testId
|
|
785
|
+
});
|
|
786
|
+
return entry;
|
|
787
|
+
};
|
|
788
|
+
if (misbehavior.kind === "error") {
|
|
789
|
+
if (!misbehavior.summary?.evaluations.length) logger.error(misbehavior.message);
|
|
790
|
+
addResponseEntry({
|
|
791
|
+
method: req.method ?? "POST",
|
|
792
|
+
path: urlPath,
|
|
793
|
+
headers: flattenHeaders(req.headers),
|
|
794
|
+
body: completionReq,
|
|
795
|
+
response: {
|
|
796
|
+
status: misbehavior.status,
|
|
797
|
+
fixture,
|
|
798
|
+
error: misbehavior.message
|
|
799
|
+
}
|
|
800
|
+
});
|
|
801
|
+
const type = misbehavior.status === 400 ? "ValidationException" : "InternalServerException";
|
|
802
|
+
res.setHeader("x-amzn-errortype", type);
|
|
803
|
+
writeErrorResponse(res, misbehavior.status, JSON.stringify({
|
|
804
|
+
__type: type,
|
|
805
|
+
message: misbehavior.message,
|
|
806
|
+
code: misbehavior.code
|
|
807
|
+
}));
|
|
808
|
+
return;
|
|
809
|
+
}
|
|
810
|
+
if (misbehavior.kind === "applied") {
|
|
811
|
+
const prepared = prepareConverseMisbehavior(misbehavior, completionReq, false, defaults, req.headers);
|
|
812
|
+
misbehavior = prepared.plan;
|
|
813
|
+
const body = buildConverseMisbehaviorResponse(prepared);
|
|
814
|
+
addResponseEntry({
|
|
815
|
+
method: req.method ?? "POST",
|
|
816
|
+
path: urlPath,
|
|
817
|
+
headers: flattenHeaders(req.headers),
|
|
818
|
+
body: completionReq,
|
|
819
|
+
response: {
|
|
820
|
+
status: 200,
|
|
821
|
+
fixture
|
|
822
|
+
}
|
|
823
|
+
});
|
|
824
|
+
res.writeHead(200, { "Content-Type": "application/json" });
|
|
825
|
+
res.end(JSON.stringify(body));
|
|
826
|
+
return;
|
|
827
|
+
}
|
|
603
828
|
if (isErrorResponse(response)) {
|
|
604
829
|
const status = response.status ?? 500;
|
|
605
|
-
|
|
830
|
+
addResponseEntry({
|
|
606
831
|
method: req.method ?? "POST",
|
|
607
832
|
path: urlPath,
|
|
608
833
|
headers: flattenHeaders(req.headers),
|
|
@@ -622,11 +847,11 @@ async function handleConverse(req, res, raw, modelId, fixtures, journal, default
|
|
|
622
847
|
writeErrorResponse(res, status, JSON.stringify(errBody), { retryAfter: response.retryAfter });
|
|
623
848
|
return;
|
|
624
849
|
}
|
|
625
|
-
if (
|
|
850
|
+
if (isCombinedFixtureResponse(response)) {
|
|
626
851
|
if (response.webSearches?.length) logger.warn("webSearches in fixture response are not supported for Bedrock Converse API — ignoring");
|
|
627
852
|
const overrides = extractOverrides(response);
|
|
628
853
|
const effReasoning = resolveReasoningForModel(response.reasoning, completionReq.model, resolveStrictMode(defaults.strict, req.headers), logger);
|
|
629
|
-
|
|
854
|
+
addResponseEntry({
|
|
630
855
|
method: req.method ?? "POST",
|
|
631
856
|
path: urlPath,
|
|
632
857
|
headers: flattenHeaders(req.headers),
|
|
@@ -636,7 +861,8 @@ async function handleConverse(req, res, raw, modelId, fixtures, journal, default
|
|
|
636
861
|
fixture
|
|
637
862
|
}
|
|
638
863
|
});
|
|
639
|
-
const
|
|
864
|
+
const functionToolCalls = requireEmittedFunctionToolCalls(response, "Bedrock Converse");
|
|
865
|
+
const body = buildConverseContentWithToolCallsResponse(response.content ?? "", functionToolCalls, logger, effReasoning, overrides, response.blocks);
|
|
640
866
|
res.writeHead(200, { "Content-Type": "application/json" });
|
|
641
867
|
res.end(JSON.stringify(body));
|
|
642
868
|
return;
|
|
@@ -645,7 +871,7 @@ async function handleConverse(req, res, raw, modelId, fixtures, journal, default
|
|
|
645
871
|
if (response.webSearches?.length) logger.warn("webSearches in fixture response are not supported for Bedrock Converse API — ignoring");
|
|
646
872
|
const overrides = extractOverrides(response);
|
|
647
873
|
const effReasoning = resolveReasoningForModel(response.reasoning, completionReq.model, resolveStrictMode(defaults.strict, req.headers), logger);
|
|
648
|
-
|
|
874
|
+
addResponseEntry({
|
|
649
875
|
method: req.method ?? "POST",
|
|
650
876
|
path: urlPath,
|
|
651
877
|
headers: flattenHeaders(req.headers),
|
|
@@ -664,7 +890,7 @@ async function handleConverse(req, res, raw, modelId, fixtures, journal, default
|
|
|
664
890
|
if (response.webSearches?.length) logger.warn("webSearches in fixture response are not supported for Bedrock Converse API — ignoring");
|
|
665
891
|
const overrides = extractOverrides(response);
|
|
666
892
|
const effReasoning = resolveReasoningForModel(response.reasoning, completionReq.model, resolveStrictMode(defaults.strict, req.headers), logger);
|
|
667
|
-
|
|
893
|
+
addResponseEntry({
|
|
668
894
|
method: req.method ?? "POST",
|
|
669
895
|
path: urlPath,
|
|
670
896
|
headers: flattenHeaders(req.headers),
|
|
@@ -674,12 +900,12 @@ async function handleConverse(req, res, raw, modelId, fixtures, journal, default
|
|
|
674
900
|
fixture
|
|
675
901
|
}
|
|
676
902
|
});
|
|
677
|
-
const body = buildConverseToolCallResponse(response
|
|
903
|
+
const body = buildConverseToolCallResponse(requireEmittedFunctionToolCalls(response, "Bedrock Converse"), logger, effReasoning, overrides);
|
|
678
904
|
res.writeHead(200, { "Content-Type": "application/json" });
|
|
679
905
|
res.end(JSON.stringify(body));
|
|
680
906
|
return;
|
|
681
907
|
}
|
|
682
|
-
|
|
908
|
+
addResponseEntry({
|
|
683
909
|
method: req.method ?? "POST",
|
|
684
910
|
path: urlPath,
|
|
685
911
|
headers: flattenHeaders(req.headers),
|
|
@@ -736,7 +962,8 @@ async function handleConverseStream(req, res, raw, modelId, fixtures, journal, d
|
|
|
736
962
|
} }));
|
|
737
963
|
return;
|
|
738
964
|
}
|
|
739
|
-
|
|
965
|
+
const messageError = !Array.isArray(converseReq.messages) ? "Invalid request: messages array is required" : validateConverseMessages(converseReq) ?? validateConverseSystem(converseReq) ?? validateConverseTools(converseReq);
|
|
966
|
+
if (messageError) {
|
|
740
967
|
journal.add({
|
|
741
968
|
method: req.method ?? "POST",
|
|
742
969
|
path: urlPath,
|
|
@@ -748,7 +975,7 @@ async function handleConverseStream(req, res, raw, modelId, fixtures, journal, d
|
|
|
748
975
|
}
|
|
749
976
|
});
|
|
750
977
|
writeErrorResponse(res, 400, JSON.stringify({ error: {
|
|
751
|
-
message:
|
|
978
|
+
message: messageError,
|
|
752
979
|
type: "invalid_request_error"
|
|
753
980
|
} }));
|
|
754
981
|
return;
|
|
@@ -826,11 +1053,84 @@ async function handleConverseStream(req, res, raw, modelId, fixtures, journal, d
|
|
|
826
1053
|
return;
|
|
827
1054
|
}
|
|
828
1055
|
const response = await resolveResponse(fixture, completionReq);
|
|
1056
|
+
let misbehavior = planMisbehavior({
|
|
1057
|
+
wire: "bedrock-converse",
|
|
1058
|
+
emitsToolCallIds: true,
|
|
1059
|
+
fixture,
|
|
1060
|
+
response,
|
|
1061
|
+
request: completionReq,
|
|
1062
|
+
stream: true,
|
|
1063
|
+
defaults,
|
|
1064
|
+
rawHeaders: req.headers,
|
|
1065
|
+
url: req.url
|
|
1066
|
+
});
|
|
1067
|
+
const addResponseEntry = (input) => {
|
|
1068
|
+
const entry = journal.add(input);
|
|
1069
|
+
recordMisbehaviorOutcome({
|
|
1070
|
+
entry,
|
|
1071
|
+
summary: misbehavior.summary,
|
|
1072
|
+
defaults,
|
|
1073
|
+
testId
|
|
1074
|
+
});
|
|
1075
|
+
return entry;
|
|
1076
|
+
};
|
|
1077
|
+
if (misbehavior.kind === "error") {
|
|
1078
|
+
if (!misbehavior.summary?.evaluations.length) logger.error(misbehavior.message);
|
|
1079
|
+
addResponseEntry({
|
|
1080
|
+
method: req.method ?? "POST",
|
|
1081
|
+
path: urlPath,
|
|
1082
|
+
headers: flattenHeaders(req.headers),
|
|
1083
|
+
body: completionReq,
|
|
1084
|
+
response: {
|
|
1085
|
+
status: misbehavior.status,
|
|
1086
|
+
fixture,
|
|
1087
|
+
error: misbehavior.message
|
|
1088
|
+
}
|
|
1089
|
+
});
|
|
1090
|
+
const type = misbehavior.status === 400 ? "ValidationException" : "InternalServerException";
|
|
1091
|
+
res.setHeader("x-amzn-errortype", type);
|
|
1092
|
+
writeErrorResponse(res, misbehavior.status, JSON.stringify({
|
|
1093
|
+
__type: type,
|
|
1094
|
+
message: misbehavior.message,
|
|
1095
|
+
code: misbehavior.code
|
|
1096
|
+
}));
|
|
1097
|
+
return;
|
|
1098
|
+
}
|
|
829
1099
|
const latency = fixture.latency ?? defaults.latency;
|
|
830
1100
|
const chunkSize = Math.max(1, fixture.chunkSize ?? defaults.chunkSize);
|
|
1101
|
+
if (misbehavior.kind === "applied") {
|
|
1102
|
+
const prepared = prepareConverseMisbehavior(misbehavior, completionReq, true, defaults, req.headers);
|
|
1103
|
+
misbehavior = prepared.plan;
|
|
1104
|
+
const events = buildConverseMisbehaviorEvents(prepared, chunkSize);
|
|
1105
|
+
const entry = addResponseEntry({
|
|
1106
|
+
method: req.method ?? "POST",
|
|
1107
|
+
path: urlPath,
|
|
1108
|
+
headers: flattenHeaders(req.headers),
|
|
1109
|
+
body: completionReq,
|
|
1110
|
+
response: {
|
|
1111
|
+
status: 200,
|
|
1112
|
+
fixture
|
|
1113
|
+
}
|
|
1114
|
+
});
|
|
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
|
+
return;
|
|
1130
|
+
}
|
|
831
1131
|
if (isErrorResponse(response)) {
|
|
832
1132
|
const status = response.status ?? 500;
|
|
833
|
-
|
|
1133
|
+
addResponseEntry({
|
|
834
1134
|
method: req.method ?? "POST",
|
|
835
1135
|
path: urlPath,
|
|
836
1136
|
headers: flattenHeaders(req.headers),
|
|
@@ -850,11 +1150,11 @@ async function handleConverseStream(req, res, raw, modelId, fixtures, journal, d
|
|
|
850
1150
|
writeErrorResponse(res, status, JSON.stringify(errBody), { retryAfter: response.retryAfter });
|
|
851
1151
|
return;
|
|
852
1152
|
}
|
|
853
|
-
if (
|
|
1153
|
+
if (isCombinedFixtureResponse(response)) {
|
|
854
1154
|
if (response.webSearches?.length) logger.warn("webSearches in fixture response are not supported for Bedrock Converse API — ignoring");
|
|
855
1155
|
const overrides = extractOverrides(response);
|
|
856
1156
|
const effReasoning = resolveReasoningForModel(response.reasoning, completionReq.model, resolveStrictMode(defaults.strict, req.headers), logger);
|
|
857
|
-
const journalEntry =
|
|
1157
|
+
const journalEntry = addResponseEntry({
|
|
858
1158
|
method: req.method ?? "POST",
|
|
859
1159
|
path: urlPath,
|
|
860
1160
|
headers: flattenHeaders(req.headers),
|
|
@@ -864,7 +1164,8 @@ async function handleConverseStream(req, res, raw, modelId, fixtures, journal, d
|
|
|
864
1164
|
fixture
|
|
865
1165
|
}
|
|
866
1166
|
});
|
|
867
|
-
const
|
|
1167
|
+
const functionToolCalls = requireEmittedFunctionToolCalls(response, "Bedrock Converse");
|
|
1168
|
+
const events = buildBedrockStreamContentWithToolCallsEvents(response.content ?? "", functionToolCalls, chunkSize, logger, effReasoning, overrides, response.blocks);
|
|
868
1169
|
const interruption = createInterruptionSignal(fixture);
|
|
869
1170
|
if (!await writeEventStream(res, events, {
|
|
870
1171
|
latency,
|
|
@@ -885,7 +1186,7 @@ async function handleConverseStream(req, res, raw, modelId, fixtures, journal, d
|
|
|
885
1186
|
if (response.webSearches?.length) logger.warn("webSearches in fixture response are not supported for Bedrock Converse API — ignoring");
|
|
886
1187
|
const overrides = extractOverrides(response);
|
|
887
1188
|
const effReasoning = resolveReasoningForModel(response.reasoning, completionReq.model, resolveStrictMode(defaults.strict, req.headers), logger);
|
|
888
|
-
const journalEntry =
|
|
1189
|
+
const journalEntry = addResponseEntry({
|
|
889
1190
|
method: req.method ?? "POST",
|
|
890
1191
|
path: urlPath,
|
|
891
1192
|
headers: flattenHeaders(req.headers),
|
|
@@ -916,7 +1217,7 @@ async function handleConverseStream(req, res, raw, modelId, fixtures, journal, d
|
|
|
916
1217
|
if (response.webSearches?.length) logger.warn("webSearches in fixture response are not supported for Bedrock Converse API — ignoring");
|
|
917
1218
|
const overrides = extractOverrides(response);
|
|
918
1219
|
const effReasoning = resolveReasoningForModel(response.reasoning, completionReq.model, resolveStrictMode(defaults.strict, req.headers), logger);
|
|
919
|
-
const journalEntry =
|
|
1220
|
+
const journalEntry = addResponseEntry({
|
|
920
1221
|
method: req.method ?? "POST",
|
|
921
1222
|
path: urlPath,
|
|
922
1223
|
headers: flattenHeaders(req.headers),
|
|
@@ -926,7 +1227,7 @@ async function handleConverseStream(req, res, raw, modelId, fixtures, journal, d
|
|
|
926
1227
|
fixture
|
|
927
1228
|
}
|
|
928
1229
|
});
|
|
929
|
-
const events = buildBedrockStreamToolCallEvents(response
|
|
1230
|
+
const events = buildBedrockStreamToolCallEvents(requireEmittedFunctionToolCalls(response, "Bedrock Converse"), chunkSize, logger, effReasoning, overrides);
|
|
930
1231
|
const interruption = createInterruptionSignal(fixture);
|
|
931
1232
|
if (!await writeEventStream(res, events, {
|
|
932
1233
|
latency,
|
|
@@ -943,7 +1244,7 @@ async function handleConverseStream(req, res, raw, modelId, fixtures, journal, d
|
|
|
943
1244
|
interruption?.cleanup();
|
|
944
1245
|
return;
|
|
945
1246
|
}
|
|
946
|
-
|
|
1247
|
+
addResponseEntry({
|
|
947
1248
|
method: req.method ?? "POST",
|
|
948
1249
|
path: urlPath,
|
|
949
1250
|
headers: flattenHeaders(req.headers),
|