@copilotkit/aimock 1.28.0 → 1.30.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 (177) hide show
  1. package/CHANGELOG.md +42 -0
  2. package/dist/bedrock-converse.cjs +63 -31
  3. package/dist/bedrock-converse.cjs.map +1 -1
  4. package/dist/bedrock-converse.d.cts.map +1 -1
  5. package/dist/bedrock-converse.d.ts.map +1 -1
  6. package/dist/bedrock-converse.js +65 -33
  7. package/dist/bedrock-converse.js.map +1 -1
  8. package/dist/bedrock.cjs +95 -33
  9. package/dist/bedrock.cjs.map +1 -1
  10. package/dist/bedrock.d.cts.map +1 -1
  11. package/dist/bedrock.d.ts.map +1 -1
  12. package/dist/bedrock.js +97 -35
  13. package/dist/bedrock.js.map +1 -1
  14. package/dist/cohere.cjs +49 -15
  15. package/dist/cohere.cjs.map +1 -1
  16. package/dist/cohere.d.cts.map +1 -1
  17. package/dist/cohere.d.ts.map +1 -1
  18. package/dist/cohere.js +51 -17
  19. package/dist/cohere.js.map +1 -1
  20. package/dist/config-loader.d.ts.map +1 -1
  21. package/dist/elevenlabs-audio.cjs +8 -4
  22. package/dist/elevenlabs-audio.cjs.map +1 -1
  23. package/dist/elevenlabs-audio.d.cts.map +1 -1
  24. package/dist/elevenlabs-audio.d.ts.map +1 -1
  25. package/dist/elevenlabs-audio.js +10 -6
  26. package/dist/elevenlabs-audio.js.map +1 -1
  27. package/dist/embeddings.cjs +4 -3
  28. package/dist/embeddings.cjs.map +1 -1
  29. package/dist/embeddings.d.cts.map +1 -1
  30. package/dist/embeddings.d.ts.map +1 -1
  31. package/dist/embeddings.js +6 -5
  32. package/dist/embeddings.js.map +1 -1
  33. package/dist/fal-audio.cjs +8 -4
  34. package/dist/fal-audio.cjs.map +1 -1
  35. package/dist/fal-audio.d.cts.map +1 -1
  36. package/dist/fal-audio.d.ts.map +1 -1
  37. package/dist/fal-audio.js +10 -6
  38. package/dist/fal-audio.js.map +1 -1
  39. package/dist/fal.cjs +4 -2
  40. package/dist/fal.cjs.map +1 -1
  41. package/dist/fal.d.cts.map +1 -1
  42. package/dist/fal.d.ts.map +1 -1
  43. package/dist/fal.js +6 -4
  44. package/dist/fal.js.map +1 -1
  45. package/dist/gemini-embeddings.cjs +4 -3
  46. package/dist/gemini-embeddings.cjs.map +1 -1
  47. package/dist/gemini-embeddings.js +6 -5
  48. package/dist/gemini-embeddings.js.map +1 -1
  49. package/dist/gemini-interactions.cjs +3 -3
  50. package/dist/gemini-interactions.cjs.map +1 -1
  51. package/dist/gemini-interactions.d.cts.map +1 -1
  52. package/dist/gemini-interactions.d.ts.map +1 -1
  53. package/dist/gemini-interactions.js +5 -5
  54. package/dist/gemini-interactions.js.map +1 -1
  55. package/dist/gemini.cjs +55 -24
  56. package/dist/gemini.cjs.map +1 -1
  57. package/dist/gemini.d.cts.map +1 -1
  58. package/dist/gemini.d.ts.map +1 -1
  59. package/dist/gemini.js +57 -26
  60. package/dist/gemini.js.map +1 -1
  61. package/dist/helpers.cjs +120 -2
  62. package/dist/helpers.cjs.map +1 -1
  63. package/dist/helpers.d.cts +43 -3
  64. package/dist/helpers.d.cts.map +1 -1
  65. package/dist/helpers.d.ts +43 -3
  66. package/dist/helpers.d.ts.map +1 -1
  67. package/dist/helpers.js +117 -3
  68. package/dist/helpers.js.map +1 -1
  69. package/dist/images.cjs +12 -6
  70. package/dist/images.cjs.map +1 -1
  71. package/dist/images.d.cts.map +1 -1
  72. package/dist/images.d.ts.map +1 -1
  73. package/dist/images.js +14 -8
  74. package/dist/images.js.map +1 -1
  75. package/dist/index.cjs +3 -0
  76. package/dist/index.d.cts +3 -3
  77. package/dist/index.d.ts +3 -3
  78. package/dist/index.js +3 -3
  79. package/dist/journal.cjs +10 -0
  80. package/dist/journal.cjs.map +1 -1
  81. package/dist/journal.d.cts +8 -0
  82. package/dist/journal.d.ts +8 -0
  83. package/dist/journal.js +10 -0
  84. package/dist/journal.js.map +1 -1
  85. package/dist/messages.cjs +325 -85
  86. package/dist/messages.cjs.map +1 -1
  87. package/dist/messages.d.cts.map +1 -1
  88. package/dist/messages.d.ts.map +1 -1
  89. package/dist/messages.js +327 -87
  90. package/dist/messages.js.map +1 -1
  91. package/dist/model-utils.cjs +68 -0
  92. package/dist/model-utils.cjs.map +1 -1
  93. package/dist/model-utils.js +68 -1
  94. package/dist/model-utils.js.map +1 -1
  95. package/dist/ollama.cjs +58 -21
  96. package/dist/ollama.cjs.map +1 -1
  97. package/dist/ollama.d.cts.map +1 -1
  98. package/dist/ollama.d.ts.map +1 -1
  99. package/dist/ollama.js +60 -23
  100. package/dist/ollama.js.map +1 -1
  101. package/dist/recorder.cjs +49 -8
  102. package/dist/recorder.cjs.map +1 -1
  103. package/dist/recorder.js +50 -9
  104. package/dist/recorder.js.map +1 -1
  105. package/dist/responses.cjs +26 -12
  106. package/dist/responses.cjs.map +1 -1
  107. package/dist/responses.d.cts +1 -1
  108. package/dist/responses.d.cts.map +1 -1
  109. package/dist/responses.d.ts +1 -1
  110. package/dist/responses.d.ts.map +1 -1
  111. package/dist/responses.js +28 -14
  112. package/dist/responses.js.map +1 -1
  113. package/dist/router.cjs +37 -8
  114. package/dist/router.cjs.map +1 -1
  115. package/dist/router.d.cts +30 -1
  116. package/dist/router.d.cts.map +1 -1
  117. package/dist/router.d.ts +30 -1
  118. package/dist/router.d.ts.map +1 -1
  119. package/dist/router.js +37 -9
  120. package/dist/router.js.map +1 -1
  121. package/dist/server.cjs +55 -19
  122. package/dist/server.cjs.map +1 -1
  123. package/dist/server.d.cts.map +1 -1
  124. package/dist/server.d.ts.map +1 -1
  125. package/dist/server.js +57 -21
  126. package/dist/server.js.map +1 -1
  127. package/dist/speech.cjs +4 -2
  128. package/dist/speech.cjs.map +1 -1
  129. package/dist/speech.d.cts.map +1 -1
  130. package/dist/speech.d.ts.map +1 -1
  131. package/dist/speech.js +6 -4
  132. package/dist/speech.js.map +1 -1
  133. package/dist/stream-collapse.cjs +44 -1
  134. package/dist/stream-collapse.cjs.map +1 -1
  135. package/dist/stream-collapse.d.cts +28 -0
  136. package/dist/stream-collapse.d.cts.map +1 -1
  137. package/dist/stream-collapse.d.ts +28 -0
  138. package/dist/stream-collapse.d.ts.map +1 -1
  139. package/dist/stream-collapse.js +44 -2
  140. package/dist/stream-collapse.js.map +1 -1
  141. package/dist/transcription.cjs +4 -2
  142. package/dist/transcription.cjs.map +1 -1
  143. package/dist/transcription.d.cts.map +1 -1
  144. package/dist/transcription.d.ts.map +1 -1
  145. package/dist/transcription.js +6 -4
  146. package/dist/transcription.js.map +1 -1
  147. package/dist/types.d.cts +42 -0
  148. package/dist/types.d.cts.map +1 -1
  149. package/dist/types.d.ts +42 -0
  150. package/dist/types.d.ts.map +1 -1
  151. package/dist/vector-types.d.cts.map +1 -1
  152. package/dist/vector-types.d.ts.map +1 -1
  153. package/dist/video.cjs +21 -3
  154. package/dist/video.cjs.map +1 -1
  155. package/dist/video.d.cts.map +1 -1
  156. package/dist/video.d.ts.map +1 -1
  157. package/dist/video.js +23 -5
  158. package/dist/video.js.map +1 -1
  159. package/dist/ws-gemini-live.cjs +4 -3
  160. package/dist/ws-gemini-live.cjs.map +1 -1
  161. package/dist/ws-gemini-live.d.cts.map +1 -1
  162. package/dist/ws-gemini-live.d.ts.map +1 -1
  163. package/dist/ws-gemini-live.js +6 -5
  164. package/dist/ws-gemini-live.js.map +1 -1
  165. package/dist/ws-realtime.cjs +4 -3
  166. package/dist/ws-realtime.cjs.map +1 -1
  167. package/dist/ws-realtime.d.cts.map +1 -1
  168. package/dist/ws-realtime.d.ts.map +1 -1
  169. package/dist/ws-realtime.js +6 -5
  170. package/dist/ws-realtime.js.map +1 -1
  171. package/dist/ws-responses.cjs +8 -6
  172. package/dist/ws-responses.cjs.map +1 -1
  173. package/dist/ws-responses.d.cts.map +1 -1
  174. package/dist/ws-responses.d.ts.map +1 -1
  175. package/dist/ws-responses.js +10 -8
  176. package/dist/ws-responses.js.map +1 -1
  177. package/package.json +2 -2
@@ -1 +1 @@
1
- {"version":3,"file":"server.d.cts","names":[],"sources":["../src/server.ts"],"sourcesContent":[],"mappings":";;;;;;;;;UAyEiB,cAAA;UACP,MAAA,CAAK;EADE,OAAA,EAEN,OAFM;EAAc,GAAA,EAAA,MAAA;UACrB,EAGE,eAHG;aACJ,EAGI,aAHJ;;AAGI,UAy3BE,eAAA,CAz3BF;EAAa,MAAA,EA03BlB,aA13BkB,EAAA;EAy3BX,MAAA,EAEP,aAFsB,EAAA;EAAA,UAAA,EAGlB,iBAHkB,EAAA;;AAEtB,iBAOY,YAAA,CAPZ,QAAA,EAQE,OARF,EAAA,EAAA,OAAA,CAAA,EASE,iBATF,EAAA,MAOV,CAPU,EAUC,KAVD,CAAA;MACI,EAAA,MAAA;EAAiB,OAAA,EASW,SATX;AAM/B,CAAA,CAAA,EAAsB,eAAY,CAAA,EAId,eAJc,CAAA,EAK/B,OAL+B,CAKvB,cALuB,CAAA"}
1
+ {"version":3,"file":"server.d.cts","names":[],"sources":["../src/server.ts"],"sourcesContent":[],"mappings":";;;;;;;;;UA4EiB,cAAA;UACP,MAAA,CAAK;EADE,OAAA,EAEN,OAFM;EAAc,GAAA,EAAA,MAAA;UACrB,EAGE,eAHG;aACJ,EAGI,aAHJ;;AAGI,UA87BE,eAAA,CA97BF;EAAa,MAAA,EA+7BlB,aA/7BkB,EAAA;EA87BX,MAAA,EAEP,aAFsB,EAAA;EAAA,UAAA,EAGlB,iBAHkB,EAAA;;AAEtB,iBAOY,YAAA,CAPZ,QAAA,EAQE,OARF,EAAA,EAAA,OAAA,CAAA,EASE,iBATF,EAAA,MAOV,CAPU,EAUC,KAVD,CAAA;MACI,EAAA,MAAA;EAAiB,OAAA,EASW,SATX;AAM/B,CAAA,CAAA,EAAsB,eAAY,CAAA,EAId,eAJc,CAAA,EAK/B,OAL+B,CAKvB,cALuB,CAAA"}
@@ -1 +1 @@
1
- {"version":3,"file":"server.d.ts","names":[],"sources":["../src/server.ts"],"sourcesContent":[],"mappings":";;;;;;;;;UAyEiB,cAAA;UACP,MAAA,CAAK;EADE,OAAA,EAEN,OAFM;EAAc,GAAA,EAAA,MAAA;UACrB,EAGE,eAHG;aACJ,EAGI,aAHJ;;AAGI,UAy3BE,eAAA,CAz3BF;EAAa,MAAA,EA03BlB,aA13BkB,EAAA;EAy3BX,MAAA,EAEP,aAFsB,EAAA;EAAA,UAAA,EAGlB,iBAHkB,EAAA;;AAEtB,iBAOY,YAAA,CAPZ,QAAA,EAQE,OARF,EAAA,EAAA,OAAA,CAAA,EASE,iBATF,EAAA,MAOV,CAPU,EAUC,KAVD,CAAA;MACI,EAAA,MAAA;EAAiB,OAAA,EASW,SATX;AAM/B,CAAA,CAAA,EAAsB,eAAY,CAAA,EAId,eAJc,CAAA,EAK/B,OAL+B,CAKvB,cALuB,CAAA"}
1
+ {"version":3,"file":"server.d.ts","names":[],"sources":["../src/server.ts"],"sourcesContent":[],"mappings":";;;;;;;;;UA4EiB,cAAA;UACP,MAAA,CAAK;EADE,OAAA,EAEN,OAFM;EAAc,GAAA,EAAA,MAAA;UACrB,EAGE,eAHG;aACJ,EAGI,aAHJ;;AAGI,UA87BE,eAAA,CA97BF;EAAa,MAAA,EA+7BlB,aA/7BkB,EAAA;EA87BX,MAAA,EAEP,aAFsB,EAAA;EAAA,UAAA,EAGlB,iBAHkB,EAAA;;AAEtB,iBAOY,YAAA,CAPZ,QAAA,EAQE,OARF,EAAA,EAAA,OAAA,CAAA,EASE,iBATF,EAAA,MAOV,CAPU,EAUC,KAVD,CAAA;MACI,EAAA,MAAA;EAAiB,OAAA,EASW,SATX;AAM/B,CAAA,CAAA,EAAsB,eAAY,CAAA,EAId,eAJc,CAAA,EAK/B,OAL+B,CAKvB,cALuB,CAAA"}
package/dist/server.js CHANGED
@@ -1,7 +1,7 @@
1
- import { buildContentWithToolCallsChunks, buildContentWithToolCallsCompletion, buildTextChunks, buildTextCompletion, buildToolCallChunks, buildToolCallCompletion, buildUsageChunk, estimatePromptTokens, estimateTokens, extractOverrides, flattenHeaders, getContext, getTestId, isAudioResponse, isContentWithToolCallsResponse, isErrorResponse, isTextResponse, isToolCallResponse, readBody, resolveResponse, resolveStrictMode, serializeErrorResponse, strictOverrideField } from "./helpers.js";
1
+ import { buildContentWithToolCallsChunks, buildContentWithToolCallsCompletion, buildTextChunks, buildTextCompletion, buildToolCallChunks, buildToolCallCompletion, buildUsageChunk, estimatePromptTokens, estimateTokens, extractOverrides, flattenHeaders, getContext, getTestId, isAudioResponse, isContentWithToolCallsResponse, isErrorResponse, isTextResponse, isToolCallResponse, readBody, resolveReasoningForModel, resolveResponse, resolveStrictMode, serializeErrorResponse, strictNoMatchLogLine, strictNoMatchMessage, strictOverrideField } from "./helpers.js";
2
2
  import { Logger } from "./logger.js";
3
3
  import { Journal } from "./journal.js";
4
- import { matchFixture } from "./router.js";
4
+ import { matchFixtureDiagnostic } from "./router.js";
5
5
  import { entryToFixture, validateFixtures } from "./fixture-loader.js";
6
6
  import { writeErrorResponse, writeSSEStream } from "./sse-writer.js";
7
7
  import { createInterruptionSignal } from "./interruption.js";
@@ -137,6 +137,22 @@ function handleNotFound(res, message) {
137
137
  }
138
138
  const CONTROL_PREFIX = "/__aimock";
139
139
  /**
140
+ * Perform a full fixtures reset: clear the fixtures array, journal, video/fal
141
+ * generation state, and the interaction/event-id counters, then zero the
142
+ * `aimock_fixtures_loaded` gauge. Shared by `/reset/fixtures` and the
143
+ * deprecated `/reset` alias.
144
+ */
145
+ function performFixturesReset(fixtures, journal, videoStates, defaults) {
146
+ fixtures.length = 0;
147
+ journal.clear();
148
+ videoStates.clear();
149
+ falJobs.clear();
150
+ falQueueStates.clear();
151
+ resetInteractionCounter();
152
+ resetEventIdCounter();
153
+ if (defaults.registry) defaults.registry.setGauge("aimock_fixtures_loaded", {}, fixtures.length);
154
+ }
155
+ /**
140
156
  * Handle requests under `/__aimock/`. Returns `true` if the request was
141
157
  * handled, `false` if the path doesn't match the control prefix.
142
158
  */
@@ -203,19 +219,33 @@ async function handleControlAPI(req, res, pathname, fixtures, journal, videoStat
203
219
  res.end(JSON.stringify({ cleared: true }));
204
220
  return true;
205
221
  }
206
- if (subPath === "/reset" && req.method === "POST") {
207
- fixtures.length = 0;
208
- journal.clear();
209
- videoStates.clear();
210
- falJobs.clear();
211
- falQueueStates.clear();
212
- resetInteractionCounter();
213
- resetEventIdCounter();
214
- if (defaults.registry) defaults.registry.setGauge("aimock_fixtures_loaded", {}, fixtures.length);
222
+ if (subPath === "/reset/fixtures" && req.method === "POST") {
223
+ performFixturesReset(fixtures, journal, videoStates, defaults);
224
+ res.writeHead(200, { "Content-Type": "application/json" });
225
+ res.end(JSON.stringify({ reset: true }));
226
+ return true;
227
+ }
228
+ if (subPath === "/reset/journal" && req.method === "POST") {
229
+ journal.clearEntries();
215
230
  res.writeHead(200, { "Content-Type": "application/json" });
216
231
  res.end(JSON.stringify({ reset: true }));
217
232
  return true;
218
233
  }
234
+ if (subPath === "/reset" && req.method === "POST") {
235
+ performFixturesReset(fixtures, journal, videoStates, defaults);
236
+ const deprecation = "POST /__aimock/reset is deprecated; use POST /__aimock/reset/fixtures (full reset) or POST /__aimock/reset/journal (journal only)";
237
+ defaults.logger.warn("POST /__aimock/reset is deprecated; use /__aimock/reset/fixtures or /__aimock/reset/journal");
238
+ res.writeHead(200, {
239
+ "Content-Type": "application/json",
240
+ Deprecation: "true"
241
+ });
242
+ res.end(JSON.stringify({
243
+ reset: true,
244
+ deprecated: true,
245
+ deprecation
246
+ }));
247
+ return true;
248
+ }
219
249
  if (subPath === "/error" && req.method === "POST") {
220
250
  let raw;
221
251
  try {
@@ -344,7 +374,7 @@ async function handleCompletions(req, res, fixtures, journal, defaults, modelFal
344
374
  body._endpointType = "chat";
345
375
  body._context = getContext(req);
346
376
  const testId = getTestId(req);
347
- const fixture = matchFixture(fixtures, body, journal.getFixtureMatchCountsForTest(testId), defaults.requestTransform);
377
+ const { fixture, skippedBySequenceOrTurn } = matchFixtureDiagnostic(fixtures, body, journal.getFixtureMatchCountsForTest(testId), defaults.requestTransform);
348
378
  if (fixture) {
349
379
  journal.incrementFixtureMatchCount(fixture, fixtures, testId);
350
380
  defaults.logger.debug(`Fixture matched: ${JSON.stringify(fixture.match).slice(0, 120)}`);
@@ -371,8 +401,8 @@ async function handleCompletions(req, res, fixtures, journal, defaults, modelFal
371
401
  if (!fixture) {
372
402
  if (resolveStrictMode(defaults.strict, req.headers)) {
373
403
  const strictStatus = 503;
374
- const strictMessage = "Strict mode: no fixture matched";
375
- defaults.logger.error(`STRICT: No fixture matched for ${req.method ?? "POST"} ${req.url ?? COMPLETIONS_PATH}`);
404
+ const strictMessage = strictNoMatchMessage(skippedBySequenceOrTurn);
405
+ defaults.logger.error(strictNoMatchLogLine(req.method ?? "POST", req.url ?? COMPLETIONS_PATH, skippedBySequenceOrTurn));
376
406
  journal.add({
377
407
  method: req.method ?? "POST",
378
408
  path: req.url ?? COMPLETIONS_PATH,
@@ -482,6 +512,8 @@ async function handleCompletions(req, res, fixtures, journal, defaults, modelFal
482
512
  if (isContentWithToolCallsResponse(response)) {
483
513
  if (response.webSearches?.length) defaults.logger.warn("webSearches in fixture response are not supported for Chat Completions API — ignoring");
484
514
  const overrides = extractOverrides(response);
515
+ const effectiveStrict = resolveStrictMode(defaults.strict, req.headers);
516
+ const effReasoning = resolveReasoningForModel(response.reasoning, body.model, effectiveStrict, defaults.logger);
485
517
  const journalEntry = journal.add({
486
518
  method: req.method ?? "POST",
487
519
  path: req.url ?? COMPLETIONS_PATH,
@@ -493,11 +525,11 @@ async function handleCompletions(req, res, fixtures, journal, defaults, modelFal
493
525
  }
494
526
  });
495
527
  if (body.stream !== true) {
496
- const completion = buildContentWithToolCallsCompletion(response.content, response.toolCalls, body.model, response.reasoning, overrides, body.messages);
528
+ const completion = buildContentWithToolCallsCompletion(response.content, response.toolCalls, body.model, effReasoning, overrides, body.messages);
497
529
  res.writeHead(200, { "Content-Type": "application/json" });
498
530
  res.end(JSON.stringify(completion));
499
531
  } else {
500
- const chunks = buildContentWithToolCallsChunks(response.content, response.toolCalls, body.model, chunkSize, response.reasoning, overrides);
532
+ const chunks = buildContentWithToolCallsChunks(response.content, response.toolCalls, body.model, chunkSize, effReasoning, overrides);
501
533
  const completionText = response.content + response.toolCalls.map((tc) => tc.name + tc.arguments).join("");
502
534
  const usageChunk = includeUsage ? buildUsageChunk(chunks[0]?.id ?? "chatcmpl-unknown", overrides?.model ?? body.model, chunks[0]?.created ?? Math.floor(Date.now() / 1e3), overrides?.usage ? {
503
535
  prompt_tokens: overrides.usage.prompt_tokens ?? 0,
@@ -529,6 +561,8 @@ async function handleCompletions(req, res, fixtures, journal, defaults, modelFal
529
561
  if (isTextResponse(response)) {
530
562
  if (response.webSearches?.length) defaults.logger.warn("webSearches in fixture response are not supported for Chat Completions API — ignoring");
531
563
  const overrides = extractOverrides(response);
564
+ const effectiveStrict = resolveStrictMode(defaults.strict, req.headers);
565
+ const effReasoning = resolveReasoningForModel(response.reasoning, body.model, effectiveStrict, defaults.logger);
532
566
  const journalEntry = journal.add({
533
567
  method: req.method ?? "POST",
534
568
  path: req.url ?? COMPLETIONS_PATH,
@@ -540,11 +574,11 @@ async function handleCompletions(req, res, fixtures, journal, defaults, modelFal
540
574
  }
541
575
  });
542
576
  if (body.stream !== true) {
543
- const completion = buildTextCompletion(response.content, body.model, response.reasoning, overrides, body.messages);
577
+ const completion = buildTextCompletion(response.content, body.model, effReasoning, overrides, body.messages);
544
578
  res.writeHead(200, { "Content-Type": "application/json" });
545
579
  res.end(JSON.stringify(completion));
546
580
  } else {
547
- const chunks = buildTextChunks(response.content, body.model, chunkSize, response.reasoning, overrides);
581
+ const chunks = buildTextChunks(response.content, body.model, chunkSize, effReasoning, overrides);
548
582
  const usageChunk = includeUsage ? buildUsageChunk(chunks[0]?.id ?? "chatcmpl-unknown", overrides?.model ?? body.model, chunks[0]?.created ?? Math.floor(Date.now() / 1e3), overrides?.usage ? {
549
583
  prompt_tokens: overrides.usage.prompt_tokens ?? 0,
550
584
  completion_tokens: overrides.usage.completion_tokens ?? 0,
@@ -575,6 +609,8 @@ async function handleCompletions(req, res, fixtures, journal, defaults, modelFal
575
609
  if (isToolCallResponse(response)) {
576
610
  if (response.webSearches?.length) defaults.logger.warn("webSearches in fixture response are not supported for Chat Completions API — ignoring");
577
611
  const overrides = extractOverrides(response);
612
+ const effectiveStrict = resolveStrictMode(defaults.strict, req.headers);
613
+ const effReasoning = resolveReasoningForModel(response.reasoning, body.model, effectiveStrict, defaults.logger);
578
614
  const journalEntry = journal.add({
579
615
  method: req.method ?? "POST",
580
616
  path: req.url ?? COMPLETIONS_PATH,
@@ -586,11 +622,11 @@ async function handleCompletions(req, res, fixtures, journal, defaults, modelFal
586
622
  }
587
623
  });
588
624
  if (body.stream !== true) {
589
- const completion = buildToolCallCompletion(response.toolCalls, body.model, overrides, body.messages);
625
+ const completion = buildToolCallCompletion(response.toolCalls, body.model, effReasoning, overrides, body.messages);
590
626
  res.writeHead(200, { "Content-Type": "application/json" });
591
627
  res.end(JSON.stringify(completion));
592
628
  } else {
593
- const chunks = buildToolCallChunks(response.toolCalls, body.model, chunkSize, overrides);
629
+ const chunks = buildToolCallChunks(response.toolCalls, body.model, chunkSize, effReasoning, overrides);
594
630
  const completionText = response.toolCalls.map((tc) => tc.name + tc.arguments).join("");
595
631
  const usageChunk = includeUsage ? buildUsageChunk(chunks[0]?.id ?? "chatcmpl-unknown", overrides?.model ?? body.model, chunks[0]?.created ?? Math.floor(Date.now() / 1e3), overrides?.usage ? {
596
632
  prompt_tokens: overrides.usage.prompt_tokens ?? 0,
@@ -878,7 +914,7 @@ async function createServer(fixtures, options, mounts, serviceFixtures) {
878
914
  return;
879
915
  }
880
916
  if (req.method === "DELETE") {
881
- journal.clear();
917
+ journal.clearEntries();
882
918
  res.writeHead(204);
883
919
  res.end();
884
920
  return;