@copilotkit/aimock 1.44.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.
Files changed (272) hide show
  1. package/.claude-plugin/marketplace.json +1 -1
  2. package/.claude-plugin/plugin.json +1 -1
  3. package/CHANGELOG.md +31 -0
  4. package/README.md +6 -0
  5. package/dist/agui-types.d.ts.map +1 -1
  6. package/dist/aimock-cli.cjs +31 -5
  7. package/dist/aimock-cli.cjs.map +1 -1
  8. package/dist/aimock-cli.d.cts.map +1 -1
  9. package/dist/aimock-cli.d.ts.map +1 -1
  10. package/dist/aimock-cli.js +31 -5
  11. package/dist/aimock-cli.js.map +1 -1
  12. package/dist/bedrock-converse.cjs +312 -39
  13. package/dist/bedrock-converse.cjs.map +1 -1
  14. package/dist/bedrock-converse.d.cts.map +1 -1
  15. package/dist/bedrock-converse.d.ts.map +1 -1
  16. package/dist/bedrock-converse.js +313 -40
  17. package/dist/bedrock-converse.js.map +1 -1
  18. package/dist/bedrock.cjs +195 -42
  19. package/dist/bedrock.cjs.map +1 -1
  20. package/dist/bedrock.d.cts.map +1 -1
  21. package/dist/bedrock.d.ts.map +1 -1
  22. package/dist/bedrock.js +196 -43
  23. package/dist/bedrock.js.map +1 -1
  24. package/dist/chaos.cjs +1 -0
  25. package/dist/chaos.js +1 -1
  26. package/dist/cli.cjs +152 -5
  27. package/dist/cli.cjs.map +1 -1
  28. package/dist/cli.js +155 -8
  29. package/dist/cli.js.map +1 -1
  30. package/dist/cohere.cjs +132 -71
  31. package/dist/cohere.cjs.map +1 -1
  32. package/dist/cohere.d.cts.map +1 -1
  33. package/dist/cohere.d.ts.map +1 -1
  34. package/dist/cohere.js +133 -72
  35. package/dist/cohere.js.map +1 -1
  36. package/dist/config-loader.cjs +62 -4
  37. package/dist/config-loader.cjs.map +1 -1
  38. package/dist/config-loader.d.cts +37 -4
  39. package/dist/config-loader.d.cts.map +1 -1
  40. package/dist/config-loader.d.ts +37 -4
  41. package/dist/config-loader.d.ts.map +1 -1
  42. package/dist/config-loader.js +62 -4
  43. package/dist/config-loader.js.map +1 -1
  44. package/dist/fakes-plugin.cjs +131 -0
  45. package/dist/fakes-plugin.cjs.map +1 -0
  46. package/dist/fakes-plugin.d.cts +23 -0
  47. package/dist/fakes-plugin.d.cts.map +1 -0
  48. package/dist/fakes-plugin.d.ts +23 -0
  49. package/dist/fakes-plugin.d.ts.map +1 -0
  50. package/dist/fakes-plugin.js +127 -0
  51. package/dist/fakes-plugin.js.map +1 -0
  52. package/dist/fixture-loader-services.cjs +1 -1
  53. package/dist/fixture-loader-services.cjs.map +1 -1
  54. package/dist/fixture-loader-services.js +1 -1
  55. package/dist/fixture-loader-services.js.map +1 -1
  56. package/dist/fixture-loader.cjs +389 -27
  57. package/dist/fixture-loader.cjs.map +1 -1
  58. package/dist/fixture-loader.d.cts +47 -3
  59. package/dist/fixture-loader.d.cts.map +1 -1
  60. package/dist/fixture-loader.d.ts +47 -3
  61. package/dist/fixture-loader.d.ts.map +1 -1
  62. package/dist/fixture-loader.js +384 -29
  63. package/dist/fixture-loader.js.map +1 -1
  64. package/dist/gemini-interactions.cjs +250 -52
  65. package/dist/gemini-interactions.cjs.map +1 -1
  66. package/dist/gemini-interactions.d.cts.map +1 -1
  67. package/dist/gemini-interactions.d.ts.map +1 -1
  68. package/dist/gemini-interactions.js +251 -53
  69. package/dist/gemini-interactions.js.map +1 -1
  70. package/dist/gemini.cjs +226 -37
  71. package/dist/gemini.cjs.map +1 -1
  72. package/dist/gemini.d.cts.map +1 -1
  73. package/dist/gemini.d.ts.map +1 -1
  74. package/dist/gemini.js +227 -38
  75. package/dist/gemini.js.map +1 -1
  76. package/dist/helpers.cjs +881 -7
  77. package/dist/helpers.cjs.map +1 -1
  78. package/dist/helpers.d.cts +85 -4
  79. package/dist/helpers.d.cts.map +1 -1
  80. package/dist/helpers.d.ts +85 -4
  81. package/dist/helpers.d.ts.map +1 -1
  82. package/dist/helpers.js +839 -8
  83. package/dist/helpers.js.map +1 -1
  84. package/dist/index.cjs +9 -0
  85. package/dist/index.d.cts +7 -5
  86. package/dist/index.d.ts +7 -5
  87. package/dist/index.js +4 -3
  88. package/dist/jest.cjs +31 -7
  89. package/dist/jest.cjs.map +1 -1
  90. package/dist/jest.d.cts +43 -3
  91. package/dist/jest.d.cts.map +1 -1
  92. package/dist/jest.d.ts +43 -3
  93. package/dist/jest.d.ts.map +1 -1
  94. package/dist/jest.js +33 -9
  95. package/dist/jest.js.map +1 -1
  96. package/dist/journal.cjs +135 -13
  97. package/dist/journal.cjs.map +1 -1
  98. package/dist/journal.d.cts +38 -4
  99. package/dist/journal.d.cts.map +1 -1
  100. package/dist/journal.d.ts +38 -4
  101. package/dist/journal.d.ts.map +1 -1
  102. package/dist/journal.js +135 -13
  103. package/dist/journal.js.map +1 -1
  104. package/dist/live-sanitize.cjs +4 -32
  105. package/dist/live-sanitize.cjs.map +1 -1
  106. package/dist/live-sanitize.js +4 -32
  107. package/dist/live-sanitize.js.map +1 -1
  108. package/dist/llmock.cjs +123 -30
  109. package/dist/llmock.cjs.map +1 -1
  110. package/dist/llmock.d.cts +16 -1
  111. package/dist/llmock.d.cts.map +1 -1
  112. package/dist/llmock.d.ts +16 -1
  113. package/dist/llmock.d.ts.map +1 -1
  114. package/dist/llmock.js +125 -32
  115. package/dist/llmock.js.map +1 -1
  116. package/dist/mcp-fakes-mount.cjs +1 -0
  117. package/dist/mcp-fakes-mount.cjs.map +1 -1
  118. package/dist/mcp-fakes-mount.js +1 -0
  119. package/dist/mcp-fakes-mount.js.map +1 -1
  120. package/dist/mcp-fakes-report.cjs +111 -0
  121. package/dist/mcp-fakes-report.cjs.map +1 -0
  122. package/dist/mcp-fakes-report.d.cts +40 -0
  123. package/dist/mcp-fakes-report.d.cts.map +1 -0
  124. package/dist/mcp-fakes-report.d.ts +40 -0
  125. package/dist/mcp-fakes-report.d.ts.map +1 -0
  126. package/dist/mcp-fakes-report.js +107 -0
  127. package/dist/mcp-fakes-report.js.map +1 -0
  128. package/dist/mcp-fakes.cjs +331 -8
  129. package/dist/mcp-fakes.cjs.map +1 -1
  130. package/dist/mcp-fakes.d.cts +406 -3
  131. package/dist/mcp-fakes.d.cts.map +1 -1
  132. package/dist/mcp-fakes.d.ts +406 -3
  133. package/dist/mcp-fakes.d.ts.map +1 -1
  134. package/dist/mcp-fakes.js +331 -8
  135. package/dist/mcp-fakes.js.map +1 -1
  136. package/dist/mcp-handler.cjs +209 -16
  137. package/dist/mcp-handler.cjs.map +1 -1
  138. package/dist/mcp-handler.d.cts +49 -0
  139. package/dist/mcp-handler.d.cts.map +1 -0
  140. package/dist/mcp-handler.d.ts +49 -0
  141. package/dist/mcp-handler.d.ts.map +1 -0
  142. package/dist/mcp-handler.js +207 -17
  143. package/dist/mcp-handler.js.map +1 -1
  144. package/dist/mcp-mock.cjs +112 -1
  145. package/dist/mcp-mock.cjs.map +1 -1
  146. package/dist/mcp-mock.d.cts +33 -2
  147. package/dist/mcp-mock.d.cts.map +1 -1
  148. package/dist/mcp-mock.d.ts +33 -2
  149. package/dist/mcp-mock.d.ts.map +1 -1
  150. package/dist/mcp-mock.js +112 -1
  151. package/dist/mcp-mock.js.map +1 -1
  152. package/dist/mcp-recorder.cjs +1224 -0
  153. package/dist/mcp-recorder.cjs.map +1 -0
  154. package/dist/mcp-recorder.d.cts +108 -0
  155. package/dist/mcp-recorder.d.cts.map +1 -0
  156. package/dist/mcp-recorder.d.ts +108 -0
  157. package/dist/mcp-recorder.d.ts.map +1 -0
  158. package/dist/mcp-recorder.js +1215 -0
  159. package/dist/mcp-recorder.js.map +1 -0
  160. package/dist/messages.cjs +362 -56
  161. package/dist/messages.cjs.map +1 -1
  162. package/dist/messages.d.cts.map +1 -1
  163. package/dist/messages.d.ts.map +1 -1
  164. package/dist/messages.js +363 -58
  165. package/dist/messages.js.map +1 -1
  166. package/dist/misbehavior.cjs +1523 -0
  167. package/dist/misbehavior.cjs.map +1 -0
  168. package/dist/misbehavior.d.cts +43 -0
  169. package/dist/misbehavior.d.cts.map +1 -0
  170. package/dist/misbehavior.d.ts +43 -0
  171. package/dist/misbehavior.d.ts.map +1 -0
  172. package/dist/misbehavior.js +1511 -0
  173. package/dist/misbehavior.js.map +1 -0
  174. package/dist/ollama.cjs +310 -112
  175. package/dist/ollama.cjs.map +1 -1
  176. package/dist/ollama.d.cts.map +1 -1
  177. package/dist/ollama.d.ts.map +1 -1
  178. package/dist/ollama.js +311 -113
  179. package/dist/ollama.js.map +1 -1
  180. package/dist/record-sanitize.cjs +231 -0
  181. package/dist/record-sanitize.cjs.map +1 -0
  182. package/dist/record-sanitize.js +224 -0
  183. package/dist/record-sanitize.js.map +1 -0
  184. package/dist/recorder.cjs +106 -5
  185. package/dist/recorder.cjs.map +1 -1
  186. package/dist/recorder.d.cts +2 -1
  187. package/dist/recorder.d.cts.map +1 -1
  188. package/dist/recorder.d.ts +2 -1
  189. package/dist/recorder.d.ts.map +1 -1
  190. package/dist/recorder.js +107 -7
  191. package/dist/recorder.js.map +1 -1
  192. package/dist/responses.cjs +667 -171
  193. package/dist/responses.cjs.map +1 -1
  194. package/dist/responses.d.cts +5 -13
  195. package/dist/responses.d.cts.map +1 -1
  196. package/dist/responses.d.ts +5 -13
  197. package/dist/responses.d.ts.map +1 -1
  198. package/dist/responses.js +665 -174
  199. package/dist/responses.js.map +1 -1
  200. package/dist/router.cjs +24 -2
  201. package/dist/router.cjs.map +1 -1
  202. package/dist/router.d.cts.map +1 -1
  203. package/dist/router.d.ts.map +1 -1
  204. package/dist/router.js +25 -4
  205. package/dist/router.js.map +1 -1
  206. package/dist/server.cjs +572 -76
  207. package/dist/server.cjs.map +1 -1
  208. package/dist/server.d.cts.map +1 -1
  209. package/dist/server.d.ts.map +1 -1
  210. package/dist/server.js +574 -78
  211. package/dist/server.js.map +1 -1
  212. package/dist/stream-collapse.cjs +236 -34
  213. package/dist/stream-collapse.cjs.map +1 -1
  214. package/dist/stream-collapse.d.cts +39 -4
  215. package/dist/stream-collapse.d.cts.map +1 -1
  216. package/dist/stream-collapse.d.ts +39 -4
  217. package/dist/stream-collapse.d.ts.map +1 -1
  218. package/dist/stream-collapse.js +235 -35
  219. package/dist/stream-collapse.js.map +1 -1
  220. package/dist/types.cjs.map +1 -1
  221. package/dist/types.d.cts +315 -4
  222. package/dist/types.d.cts.map +1 -1
  223. package/dist/types.d.ts +315 -4
  224. package/dist/types.d.ts.map +1 -1
  225. package/dist/types.js.map +1 -1
  226. package/dist/validate-cli.cjs +36 -4
  227. package/dist/validate-cli.cjs.map +1 -1
  228. package/dist/validate-cli.js +37 -5
  229. package/dist/validate-cli.js.map +1 -1
  230. package/dist/vector-types.d.ts.map +1 -1
  231. package/dist/version.cjs +45 -0
  232. package/dist/version.cjs.map +1 -0
  233. package/dist/version.js +44 -0
  234. package/dist/version.js.map +1 -0
  235. package/dist/vitest.cjs +66 -10
  236. package/dist/vitest.cjs.map +1 -1
  237. package/dist/vitest.d.cts +35 -4
  238. package/dist/vitest.d.cts.map +1 -1
  239. package/dist/vitest.d.ts +35 -4
  240. package/dist/vitest.d.ts.map +1 -1
  241. package/dist/vitest.js +67 -11
  242. package/dist/vitest.js.map +1 -1
  243. package/dist/watcher.cjs +6 -2
  244. package/dist/watcher.cjs.map +1 -1
  245. package/dist/watcher.js +6 -2
  246. package/dist/watcher.js.map +1 -1
  247. package/dist/ws-gemini-live.cjs +210 -101
  248. package/dist/ws-gemini-live.cjs.map +1 -1
  249. package/dist/ws-gemini-live.d.cts +9 -3
  250. package/dist/ws-gemini-live.d.cts.map +1 -1
  251. package/dist/ws-gemini-live.d.ts +9 -3
  252. package/dist/ws-gemini-live.d.ts.map +1 -1
  253. package/dist/ws-gemini-live.js +211 -102
  254. package/dist/ws-gemini-live.js.map +1 -1
  255. package/dist/ws-realtime.cjs +175 -62
  256. package/dist/ws-realtime.cjs.map +1 -1
  257. package/dist/ws-realtime.d.cts +8 -3
  258. package/dist/ws-realtime.d.cts.map +1 -1
  259. package/dist/ws-realtime.d.ts +8 -3
  260. package/dist/ws-realtime.d.ts.map +1 -1
  261. package/dist/ws-realtime.js +176 -63
  262. package/dist/ws-realtime.js.map +1 -1
  263. package/dist/ws-responses.cjs +109 -16
  264. package/dist/ws-responses.cjs.map +1 -1
  265. package/dist/ws-responses.d.cts +8 -12
  266. package/dist/ws-responses.d.cts.map +1 -1
  267. package/dist/ws-responses.d.ts +8 -12
  268. package/dist/ws-responses.d.ts.map +1 -1
  269. package/dist/ws-responses.js +111 -18
  270. package/dist/ws-responses.js.map +1 -1
  271. package/package.json +10 -2
  272. package/skills/write-fixtures/SKILL.md +179 -21
package/dist/cohere.cjs CHANGED
@@ -1,6 +1,7 @@
1
1
  const require_helpers = require('./helpers.cjs');
2
2
  const require_sse_writer = require('./sse-writer.cjs');
3
3
  const require_chaos = require('./chaos.cjs');
4
+ const require_misbehavior = require('./misbehavior.cjs');
4
5
  const require_router = require('./router.cjs');
5
6
  const require_recorder = require('./recorder.cjs');
6
7
  const require_interruption = require('./interruption.cjs');
@@ -96,12 +97,17 @@ function cohereToCompletionRequest(req) {
96
97
  parameters: t.function.parameters
97
98
  }
98
99
  };
100
+ const schema = require_misbehavior.normalizeDirectToolSchema({ tools: [t] }, t.name);
99
101
  return {
100
102
  type: "function",
101
103
  function: {
102
104
  name: t.name,
103
105
  description: t.description,
104
- parameters: t.parameter_definitions
106
+ parameters: schema ? {
107
+ type: "object",
108
+ properties: schema.properties,
109
+ required: [...schema.required]
110
+ } : void 0
105
111
  }
106
112
  };
107
113
  });
@@ -140,14 +146,7 @@ function buildCohereTextResponse(content, reasoning, overrides) {
140
146
  }
141
147
  function buildCohereToolCallResponse(toolCalls, logger, reasoning, overrides) {
142
148
  const cohereCalls = toolCalls.map((tc) => {
143
- let argsJson;
144
- try {
145
- JSON.parse(tc.arguments || "{}");
146
- argsJson = tc.arguments || "{}";
147
- } catch {
148
- logger.warn(`Malformed JSON in fixture tool call arguments for "${tc.name}": ${tc.arguments}`);
149
- argsJson = "{}";
150
- }
149
+ const argsJson = require_helpers.servedToolArgs(tc, "string", logger).raw;
151
150
  return {
152
151
  id: tc.id || require_helpers.generateToolCallId(),
153
152
  type: "function",
@@ -183,14 +182,7 @@ function buildCohereContentWithToolCallsResponse(content, toolCalls, logger, rea
183
182
  arguments: b.arguments,
184
183
  id: b.id
185
184
  })) : toolCalls).map((tc) => {
186
- let argsJson;
187
- try {
188
- JSON.parse(tc.arguments || "{}");
189
- argsJson = tc.arguments || "{}";
190
- } catch {
191
- logger.warn(`Malformed JSON in fixture tool call arguments for "${tc.name}": ${tc.arguments}`);
192
- argsJson = "{}";
193
- }
185
+ const argsJson = require_helpers.servedToolArgs(tc, "string", logger).raw;
194
186
  return {
195
187
  id: tc.id || require_helpers.generateToolCallId(),
196
188
  type: "function",
@@ -335,14 +327,7 @@ function buildCohereToolCallStreamEvents(toolCalls, chunkSize, logger, reasoning
335
327
  for (let idx = 0; idx < toolCalls.length; idx++) {
336
328
  const tc = toolCalls[idx];
337
329
  const callId = tc.id || require_helpers.generateToolCallId();
338
- let argsJson;
339
- try {
340
- JSON.parse(tc.arguments || "{}");
341
- argsJson = tc.arguments || "{}";
342
- } catch {
343
- logger.warn(`Malformed JSON in fixture tool call arguments for "${tc.name}": ${tc.arguments}`);
344
- argsJson = "{}";
345
- }
330
+ const argsJson = require_helpers.servedToolArgs(tc, "string", logger).raw;
346
331
  events.push({
347
332
  type: "tool-call-start",
348
333
  index: idx,
@@ -430,14 +415,7 @@ function buildCohereContentWithToolCallsStreamEvents(content, toolCalls, chunkSi
430
415
  toolPlanEmitted = true;
431
416
  }
432
417
  const callId = block.id || require_helpers.generateToolCallId();
433
- let argsJson;
434
- try {
435
- JSON.parse(block.arguments || "{}");
436
- argsJson = block.arguments || "{}";
437
- } catch {
438
- logger.warn(`Malformed JSON in fixture tool call arguments for "${block.name}": ${block.arguments}`);
439
- argsJson = "{}";
440
- }
418
+ const argsJson = require_helpers.servedToolArgs(block, "string", logger).raw;
441
419
  events.push({
442
420
  type: "tool-call-start",
443
421
  index: toolIdx,
@@ -517,14 +495,7 @@ function buildCohereContentWithToolCallsStreamEvents(content, toolCalls, chunkSi
517
495
  for (let idx = 0; idx < toolCalls.length; idx++) {
518
496
  const tc = toolCalls[idx];
519
497
  const callId = tc.id || require_helpers.generateToolCallId();
520
- let argsJson;
521
- try {
522
- JSON.parse(tc.arguments || "{}");
523
- argsJson = tc.arguments || "{}";
524
- } catch {
525
- logger.warn(`Malformed JSON in fixture tool call arguments for "${tc.name}": ${tc.arguments}`);
526
- argsJson = "{}";
527
- }
498
+ const argsJson = require_helpers.servedToolArgs(tc, "string", logger).raw;
528
499
  events.push({
529
500
  type: "tool-call-start",
530
501
  index: idx,
@@ -581,7 +552,10 @@ async function writeCohereSSEStream(res, events, optionsOrLatency) {
581
552
  if (signal?.aborted) return false;
582
553
  chunkIndex++;
583
554
  }
584
- if (!res.writableEnded) res.end();
555
+ if (!res.writableEnded) {
556
+ if (opts.terminalSentinel && !signal?.aborted) res.write("data: [DONE]\n\n");
557
+ res.end();
558
+ }
585
559
  return true;
586
560
  }
587
561
  async function handleCohere(req, res, raw, fixtures, journal, defaults, setCorsHeaders) {
@@ -736,29 +710,79 @@ async function handleCohere(req, res, raw, fixtures, journal, defaults, setCorsH
736
710
  } }));
737
711
  return;
738
712
  }
739
- const response = await require_helpers.resolveResponse(fixture, completionReq);
713
+ const resolvedResponse = await require_helpers.resolveResponse(fixture, completionReq);
714
+ const misbehavior = require_misbehavior.planMisbehavior({
715
+ wire: "cohere",
716
+ fixture,
717
+ response: resolvedResponse,
718
+ request: completionReq,
719
+ stream: cohereReq.stream === true,
720
+ emitsToolCallIds: true,
721
+ defaults,
722
+ rawHeaders: req.headers,
723
+ url: req.url
724
+ });
725
+ if (misbehavior.kind === "error") {
726
+ require_misbehavior.recordMisbehaviorOutcome({
727
+ entry: journal.add({
728
+ method: req.method ?? "POST",
729
+ path: req.url ?? "/v2/chat",
730
+ headers: require_helpers.flattenHeaders(req.headers),
731
+ body: completionReq,
732
+ response: {
733
+ status: misbehavior.status,
734
+ fixture
735
+ }
736
+ }),
737
+ summary: misbehavior.summary,
738
+ defaults,
739
+ testId
740
+ });
741
+ if (!misbehavior.summary?.evaluations.length) logger.error(misbehavior.message);
742
+ require_sse_writer.writeErrorResponse(res, misbehavior.status, JSON.stringify({
743
+ message: misbehavior.message,
744
+ code: misbehavior.code
745
+ }));
746
+ return;
747
+ }
748
+ const prepared = misbehavior.kind === "applied" ? require_helpers.prepareOpenAIChatMisbehavior(misbehavior) : void 0;
749
+ const observedK5Stream = cohereReq.stream === true && prepared?.summary.fault === "stop-length-mid-tool";
750
+ const appliedReasoning = prepared && "reasoning" in prepared.response ? require_helpers.resolveReasoningForModel(prepared.response.reasoning, cohereReq.model, require_helpers.resolveStrictMode(defaults.strict, req.headers), logger) : void 0;
751
+ const usage = prepared ? require_helpers.resolveOpenAIChatMisbehaviorUsage(prepared, completionReq, appliedReasoning !== void 0) : void 0;
752
+ const response = prepared && usage ? {
753
+ ...prepared.response,
754
+ usage,
755
+ ...prepared.stop ? { finishReason: observedK5Stream ? "tool_calls" : prepared.stop } : {}
756
+ } : resolvedResponse;
757
+ const summary = prepared?.summary ?? misbehavior.summary;
758
+ const empty = prepared?.summary.fault === "empty-response";
740
759
  const latency = fixture.latency ?? defaults.latency;
741
760
  const chunkSize = Math.max(1, fixture.chunkSize ?? defaults.chunkSize);
742
761
  if (require_helpers.isErrorResponse(response)) {
743
762
  const status = response.status ?? 500;
744
- journal.add({
745
- method: req.method ?? "POST",
746
- path: req.url ?? "/v2/chat",
747
- headers: require_helpers.flattenHeaders(req.headers),
748
- body: completionReq,
749
- response: {
750
- status,
751
- fixture
752
- }
763
+ require_misbehavior.recordMisbehaviorOutcome({
764
+ entry: journal.add({
765
+ method: req.method ?? "POST",
766
+ path: req.url ?? "/v2/chat",
767
+ headers: require_helpers.flattenHeaders(req.headers),
768
+ body: completionReq,
769
+ response: {
770
+ status,
771
+ fixture
772
+ }
773
+ }),
774
+ summary,
775
+ defaults,
776
+ testId
753
777
  });
754
778
  require_sse_writer.writeErrorResponse(res, status, require_helpers.serializeErrorResponse(response), { retryAfter: response.retryAfter });
755
779
  return;
756
780
  }
757
- if (require_helpers.isContentWithToolCallsResponse(response)) {
781
+ if (require_helpers.isCombinedFixtureResponse(response)) {
758
782
  if (response.webSearches?.length) logger.warn("webSearches in fixture response are not supported for Cohere v2 Chat API — ignoring");
759
783
  const overrides = require_helpers.extractOverrides(response);
760
784
  const effectiveStrict = require_helpers.resolveStrictMode(defaults.strict, req.headers);
761
- const effReasoning = require_helpers.resolveReasoningForModel(response.reasoning, cohereReq.model, effectiveStrict, logger);
785
+ const effReasoning = prepared ? appliedReasoning : require_helpers.resolveReasoningForModel(response.reasoning, cohereReq.model, effectiveStrict, logger);
762
786
  const journalEntry = journal.add({
763
787
  method: req.method ?? "POST",
764
788
  path: req.url ?? "/v2/chat",
@@ -769,14 +793,22 @@ async function handleCohere(req, res, raw, fixtures, journal, defaults, setCorsH
769
793
  fixture
770
794
  }
771
795
  });
796
+ require_misbehavior.recordMisbehaviorOutcome({
797
+ entry: journalEntry,
798
+ summary,
799
+ defaults,
800
+ testId
801
+ });
802
+ const functionToolCalls = require_helpers.requireEmittedFunctionToolCalls(response, "Cohere");
772
803
  if (cohereReq.stream !== true) {
773
- const body = buildCohereContentWithToolCallsResponse(response.content ?? "", response.toolCalls ?? [], logger, effReasoning, overrides, response.blocks);
804
+ const body = buildCohereContentWithToolCallsResponse(response.content ?? "", functionToolCalls, logger, effReasoning, overrides, response.blocks);
774
805
  res.writeHead(200, { "Content-Type": "application/json" });
775
806
  res.end(JSON.stringify(body));
776
807
  } else {
777
- const events = buildCohereContentWithToolCallsStreamEvents(response.content ?? "", response.toolCalls ?? [], chunkSize, logger, effReasoning, overrides, response.blocks);
808
+ const events = buildCohereContentWithToolCallsStreamEvents(response.content ?? "", functionToolCalls, chunkSize, logger, effReasoning, overrides, response.blocks);
778
809
  const interruption = require_interruption.createInterruptionSignal(fixture);
779
810
  if (!await writeCohereSSEStream(res, events, {
811
+ terminalSentinel: observedK5Stream,
780
812
  latency,
781
813
  streamingProfile: fixture.streamingProfile,
782
814
  recordedTimings: fixture.recordedTimings,
@@ -796,7 +828,7 @@ async function handleCohere(req, res, raw, fixtures, journal, defaults, setCorsH
796
828
  if (response.webSearches?.length) logger.warn("webSearches in fixture response are not supported for Cohere v2 Chat API — ignoring");
797
829
  const overrides = require_helpers.extractOverrides(response);
798
830
  const effectiveStrict = require_helpers.resolveStrictMode(defaults.strict, req.headers);
799
- const effReasoning = require_helpers.resolveReasoningForModel(response.reasoning, cohereReq.model, effectiveStrict, logger);
831
+ const effReasoning = prepared ? appliedReasoning : require_helpers.resolveReasoningForModel(response.reasoning, cohereReq.model, effectiveStrict, logger);
800
832
  const journalEntry = journal.add({
801
833
  method: req.method ?? "POST",
802
834
  path: req.url ?? "/v2/chat",
@@ -807,14 +839,30 @@ async function handleCohere(req, res, raw, fixtures, journal, defaults, setCorsH
807
839
  fixture
808
840
  }
809
841
  });
842
+ require_misbehavior.recordMisbehaviorOutcome({
843
+ entry: journalEntry,
844
+ summary,
845
+ defaults,
846
+ testId
847
+ });
810
848
  if (cohereReq.stream !== true) {
811
- const body = buildCohereTextResponse(response.content, effReasoning, overrides);
849
+ const body = empty ? {
850
+ ...buildCohereTextResponse("", void 0, overrides),
851
+ message: {
852
+ role: "assistant",
853
+ content: [],
854
+ tool_calls: [],
855
+ tool_plan: "",
856
+ citations: []
857
+ }
858
+ } : buildCohereTextResponse(response.content, effReasoning, overrides);
812
859
  res.writeHead(200, { "Content-Type": "application/json" });
813
860
  res.end(JSON.stringify(body));
814
861
  } else {
815
- const events = buildCohereTextStreamEvents(response.content, chunkSize, effReasoning, overrides);
862
+ const events = buildCohereTextStreamEvents(response.content, chunkSize, effReasoning, overrides).filter((event) => !empty || event.type === "message-start" || event.type === "message-end");
816
863
  const interruption = require_interruption.createInterruptionSignal(fixture);
817
864
  if (!await writeCohereSSEStream(res, events, {
865
+ terminalSentinel: observedK5Stream,
818
866
  latency,
819
867
  streamingProfile: fixture.streamingProfile,
820
868
  recordedTimings: fixture.recordedTimings,
@@ -834,7 +882,7 @@ async function handleCohere(req, res, raw, fixtures, journal, defaults, setCorsH
834
882
  if (response.webSearches?.length) logger.warn("webSearches in fixture response are not supported for Cohere v2 Chat API — ignoring");
835
883
  const overrides = require_helpers.extractOverrides(response);
836
884
  const effectiveStrict = require_helpers.resolveStrictMode(defaults.strict, req.headers);
837
- const effReasoning = require_helpers.resolveReasoningForModel(response.reasoning, cohereReq.model, effectiveStrict, logger);
885
+ const effReasoning = prepared ? appliedReasoning : require_helpers.resolveReasoningForModel(response.reasoning, cohereReq.model, effectiveStrict, logger);
838
886
  const journalEntry = journal.add({
839
887
  method: req.method ?? "POST",
840
888
  path: req.url ?? "/v2/chat",
@@ -845,14 +893,22 @@ async function handleCohere(req, res, raw, fixtures, journal, defaults, setCorsH
845
893
  fixture
846
894
  }
847
895
  });
896
+ require_misbehavior.recordMisbehaviorOutcome({
897
+ entry: journalEntry,
898
+ summary,
899
+ defaults,
900
+ testId
901
+ });
902
+ const functionToolCalls = require_helpers.requireEmittedFunctionToolCalls(response, "Cohere");
848
903
  if (cohereReq.stream !== true) {
849
- const body = buildCohereToolCallResponse(response.toolCalls, logger, effReasoning, overrides);
904
+ const body = buildCohereToolCallResponse(functionToolCalls, logger, effReasoning, overrides);
850
905
  res.writeHead(200, { "Content-Type": "application/json" });
851
906
  res.end(JSON.stringify(body));
852
907
  } else {
853
- const events = buildCohereToolCallStreamEvents(response.toolCalls, chunkSize, logger, effReasoning, overrides);
908
+ const events = buildCohereToolCallStreamEvents(functionToolCalls, chunkSize, logger, effReasoning, overrides);
854
909
  const interruption = require_interruption.createInterruptionSignal(fixture);
855
910
  if (!await writeCohereSSEStream(res, events, {
911
+ terminalSentinel: observedK5Stream,
856
912
  latency,
857
913
  streamingProfile: fixture.streamingProfile,
858
914
  recordedTimings: fixture.recordedTimings,
@@ -868,15 +924,20 @@ async function handleCohere(req, res, raw, fixtures, journal, defaults, setCorsH
868
924
  }
869
925
  return;
870
926
  }
871
- journal.add({
872
- method: req.method ?? "POST",
873
- path: req.url ?? "/v2/chat",
874
- headers: require_helpers.flattenHeaders(req.headers),
875
- body: completionReq,
876
- response: {
877
- status: 500,
878
- fixture
879
- }
927
+ require_misbehavior.recordMisbehaviorOutcome({
928
+ entry: journal.add({
929
+ method: req.method ?? "POST",
930
+ path: req.url ?? "/v2/chat",
931
+ headers: require_helpers.flattenHeaders(req.headers),
932
+ body: completionReq,
933
+ response: {
934
+ status: 500,
935
+ fixture
936
+ }
937
+ }),
938
+ summary,
939
+ defaults,
940
+ testId
880
941
  });
881
942
  require_sse_writer.writeErrorResponse(res, 500, JSON.stringify({ error: {
882
943
  message: "Fixture response did not match any known type",