@copilotkit/aimock 1.22.0 → 1.23.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 (189) hide show
  1. package/.claude-plugin/marketplace.json +1 -1
  2. package/.claude-plugin/plugin.json +1 -1
  3. package/CHANGELOG.md +37 -0
  4. package/README.md +10 -10
  5. package/dist/agui-types.d.ts.map +1 -1
  6. package/dist/aimock-cli.cjs +0 -0
  7. package/dist/aimock-cli.js +0 -0
  8. package/dist/bedrock-converse.cjs +62 -22
  9. package/dist/bedrock-converse.cjs.map +1 -1
  10. package/dist/bedrock-converse.d.cts.map +1 -1
  11. package/dist/bedrock-converse.d.ts.map +1 -1
  12. package/dist/bedrock-converse.js +62 -22
  13. package/dist/bedrock-converse.js.map +1 -1
  14. package/dist/bedrock.cjs +59 -20
  15. package/dist/bedrock.cjs.map +1 -1
  16. package/dist/bedrock.d.cts.map +1 -1
  17. package/dist/bedrock.d.ts.map +1 -1
  18. package/dist/bedrock.js +59 -20
  19. package/dist/bedrock.js.map +1 -1
  20. package/dist/cli.cjs +8 -2
  21. package/dist/cli.cjs.map +1 -1
  22. package/dist/cli.js +8 -2
  23. package/dist/cli.js.map +1 -1
  24. package/dist/cohere.cjs +29 -9
  25. package/dist/cohere.cjs.map +1 -1
  26. package/dist/cohere.d.cts.map +1 -1
  27. package/dist/cohere.d.ts.map +1 -1
  28. package/dist/cohere.js +30 -10
  29. package/dist/cohere.js.map +1 -1
  30. package/dist/config-loader.d.cts.map +1 -1
  31. package/dist/constants.cjs +8 -0
  32. package/dist/constants.cjs.map +1 -0
  33. package/dist/constants.d.cts +8 -0
  34. package/dist/constants.d.cts.map +1 -0
  35. package/dist/constants.d.ts +8 -0
  36. package/dist/constants.d.ts.map +1 -0
  37. package/dist/constants.js +7 -0
  38. package/dist/constants.js.map +1 -0
  39. package/dist/elevenlabs-audio.cjs +41 -18
  40. package/dist/elevenlabs-audio.cjs.map +1 -1
  41. package/dist/elevenlabs-audio.d.cts.map +1 -1
  42. package/dist/elevenlabs-audio.d.ts.map +1 -1
  43. package/dist/elevenlabs-audio.js +42 -19
  44. package/dist/elevenlabs-audio.js.map +1 -1
  45. package/dist/embeddings.cjs +19 -17
  46. package/dist/embeddings.cjs.map +1 -1
  47. package/dist/embeddings.d.cts.map +1 -1
  48. package/dist/embeddings.d.ts.map +1 -1
  49. package/dist/embeddings.js +20 -18
  50. package/dist/embeddings.js.map +1 -1
  51. package/dist/fal-audio.cjs +128 -39
  52. package/dist/fal-audio.cjs.map +1 -1
  53. package/dist/fal-audio.d.cts.map +1 -1
  54. package/dist/fal-audio.d.ts.map +1 -1
  55. package/dist/fal-audio.js +129 -40
  56. package/dist/fal-audio.js.map +1 -1
  57. package/dist/fal.cjs +25 -8
  58. package/dist/fal.cjs.map +1 -1
  59. package/dist/fal.d.cts.map +1 -1
  60. package/dist/fal.d.ts.map +1 -1
  61. package/dist/fal.js +26 -9
  62. package/dist/fal.js.map +1 -1
  63. package/dist/fixture-loader.cjs +11 -2
  64. package/dist/fixture-loader.cjs.map +1 -1
  65. package/dist/fixture-loader.d.cts.map +1 -1
  66. package/dist/fixture-loader.d.ts.map +1 -1
  67. package/dist/fixture-loader.js +11 -2
  68. package/dist/fixture-loader.js.map +1 -1
  69. package/dist/gemini-interactions.cjs +29 -7
  70. package/dist/gemini-interactions.cjs.map +1 -1
  71. package/dist/gemini-interactions.js +28 -8
  72. package/dist/gemini-interactions.js.map +1 -1
  73. package/dist/gemini.cjs +45 -19
  74. package/dist/gemini.cjs.map +1 -1
  75. package/dist/gemini.d.cts.map +1 -1
  76. package/dist/gemini.d.ts.map +1 -1
  77. package/dist/gemini.js +45 -19
  78. package/dist/gemini.js.map +1 -1
  79. package/dist/helpers.cjs +52 -8
  80. package/dist/helpers.cjs.map +1 -1
  81. package/dist/helpers.d.cts +6 -0
  82. package/dist/helpers.d.cts.map +1 -1
  83. package/dist/helpers.d.ts +6 -0
  84. package/dist/helpers.d.ts.map +1 -1
  85. package/dist/helpers.js +52 -9
  86. package/dist/helpers.js.map +1 -1
  87. package/dist/images.cjs +26 -8
  88. package/dist/images.cjs.map +1 -1
  89. package/dist/images.d.cts.map +1 -1
  90. package/dist/images.d.ts.map +1 -1
  91. package/dist/images.js +27 -9
  92. package/dist/images.js.map +1 -1
  93. package/dist/index.cjs +2 -1
  94. package/dist/index.d.cts +2 -1
  95. package/dist/index.d.ts +2 -1
  96. package/dist/index.js +2 -1
  97. package/dist/journal.cjs +17 -7
  98. package/dist/journal.cjs.map +1 -1
  99. package/dist/journal.d.cts +2 -3
  100. package/dist/journal.d.cts.map +1 -1
  101. package/dist/journal.d.ts +2 -3
  102. package/dist/journal.d.ts.map +1 -1
  103. package/dist/journal.js +15 -4
  104. package/dist/journal.js.map +1 -1
  105. package/dist/messages.cjs +33 -12
  106. package/dist/messages.cjs.map +1 -1
  107. package/dist/messages.d.cts.map +1 -1
  108. package/dist/messages.d.ts.map +1 -1
  109. package/dist/messages.js +33 -12
  110. package/dist/messages.js.map +1 -1
  111. package/dist/model-utils.cjs +11 -0
  112. package/dist/model-utils.cjs.map +1 -0
  113. package/dist/model-utils.js +10 -0
  114. package/dist/model-utils.js.map +1 -0
  115. package/dist/ollama.cjs +59 -18
  116. package/dist/ollama.cjs.map +1 -1
  117. package/dist/ollama.d.cts.map +1 -1
  118. package/dist/ollama.d.ts.map +1 -1
  119. package/dist/ollama.js +60 -19
  120. package/dist/ollama.js.map +1 -1
  121. package/dist/recorder.cjs +30 -11
  122. package/dist/recorder.cjs.map +1 -1
  123. package/dist/recorder.d.cts.map +1 -1
  124. package/dist/recorder.d.ts.map +1 -1
  125. package/dist/recorder.js +30 -11
  126. package/dist/recorder.js.map +1 -1
  127. package/dist/responses.cjs +61 -52
  128. package/dist/responses.cjs.map +1 -1
  129. package/dist/responses.d.cts +1 -1
  130. package/dist/responses.d.cts.map +1 -1
  131. package/dist/responses.d.ts +1 -1
  132. package/dist/responses.d.ts.map +1 -1
  133. package/dist/responses.js +62 -53
  134. package/dist/responses.js.map +1 -1
  135. package/dist/router.cjs +7 -3
  136. package/dist/router.cjs.map +1 -1
  137. package/dist/router.js +7 -3
  138. package/dist/router.js.map +1 -1
  139. package/dist/server.cjs +64 -180
  140. package/dist/server.cjs.map +1 -1
  141. package/dist/server.d.cts.map +1 -1
  142. package/dist/server.d.ts.map +1 -1
  143. package/dist/server.js +40 -156
  144. package/dist/server.js.map +1 -1
  145. package/dist/speech.cjs +26 -8
  146. package/dist/speech.cjs.map +1 -1
  147. package/dist/speech.d.cts.map +1 -1
  148. package/dist/speech.d.ts.map +1 -1
  149. package/dist/speech.js +27 -9
  150. package/dist/speech.js.map +1 -1
  151. package/dist/transcription.cjs +57 -19
  152. package/dist/transcription.cjs.map +1 -1
  153. package/dist/transcription.d.cts.map +1 -1
  154. package/dist/transcription.d.ts.map +1 -1
  155. package/dist/transcription.js +58 -20
  156. package/dist/transcription.js.map +1 -1
  157. package/dist/types.d.cts +19 -2
  158. package/dist/types.d.cts.map +1 -1
  159. package/dist/types.d.ts +19 -2
  160. package/dist/types.d.ts.map +1 -1
  161. package/dist/video.cjs +50 -14
  162. package/dist/video.cjs.map +1 -1
  163. package/dist/video.d.cts +8 -1
  164. package/dist/video.d.cts.map +1 -1
  165. package/dist/video.d.ts +8 -1
  166. package/dist/video.d.ts.map +1 -1
  167. package/dist/video.js +51 -15
  168. package/dist/video.js.map +1 -1
  169. package/dist/ws-gemini-live.cjs +34 -27
  170. package/dist/ws-gemini-live.cjs.map +1 -1
  171. package/dist/ws-gemini-live.d.cts +2 -2
  172. package/dist/ws-gemini-live.d.cts.map +1 -1
  173. package/dist/ws-gemini-live.d.ts.map +1 -1
  174. package/dist/ws-gemini-live.js +34 -27
  175. package/dist/ws-gemini-live.js.map +1 -1
  176. package/dist/ws-realtime.cjs +776 -175
  177. package/dist/ws-realtime.cjs.map +1 -1
  178. package/dist/ws-realtime.d.cts +2 -2
  179. package/dist/ws-realtime.d.cts.map +1 -1
  180. package/dist/ws-realtime.d.ts.map +1 -1
  181. package/dist/ws-realtime.js +776 -175
  182. package/dist/ws-realtime.js.map +1 -1
  183. package/dist/ws-responses.cjs +48 -12
  184. package/dist/ws-responses.cjs.map +1 -1
  185. package/dist/ws-responses.d.cts.map +1 -1
  186. package/dist/ws-responses.d.ts.map +1 -1
  187. package/dist/ws-responses.js +49 -13
  188. package/dist/ws-responses.js.map +1 -1
  189. package/package.json +2 -2
package/dist/server.cjs CHANGED
@@ -113,21 +113,6 @@ const CORS_HEADERS = {
113
113
  function setCorsHeaders(res) {
114
114
  for (const [key, value] of Object.entries(CORS_HEADERS)) res.setHeader(key, value);
115
115
  }
116
- const DEFAULT_MAX_BODY_BYTES = 10 * 1024 * 1024;
117
- async function readBody(req, maxBytes = DEFAULT_MAX_BODY_BYTES) {
118
- const buffers = [];
119
- let totalBytes = 0;
120
- for await (const chunk of req) {
121
- const buf = chunk;
122
- totalBytes += buf.length;
123
- if (totalBytes > maxBytes) {
124
- req.destroy();
125
- throw new Error(`Request body exceeded size limit of ${maxBytes} bytes`);
126
- }
127
- buffers.push(buf);
128
- }
129
- return Buffer.concat(buffers).toString();
130
- }
131
116
  function handleOptions(res) {
132
117
  setCorsHeaders(res);
133
118
  res.writeHead(204);
@@ -162,7 +147,7 @@ async function handleControlAPI(req, res, pathname, fixtures, journal, videoStat
162
147
  if (subPath === "/fixtures" && req.method === "POST") {
163
148
  let raw;
164
149
  try {
165
- raw = await readBody(req);
150
+ raw = await require_helpers.readBody(req);
166
151
  } catch (err) {
167
152
  const msg = err instanceof Error ? err.message : String(err);
168
153
  defaults.logger.error(`POST /__aimock/fixtures: failed to read body: ${msg}`);
@@ -214,6 +199,8 @@ async function handleControlAPI(req, res, pathname, fixtures, journal, videoStat
214
199
  videoStates.clear();
215
200
  require_fal_audio.falJobs.clear();
216
201
  require_fal.falQueueStates.clear();
202
+ require_gemini_interactions.resetInteractionCounter();
203
+ require_gemini_interactions.resetEventIdCounter();
217
204
  if (defaults.registry) defaults.registry.setGauge("aimock_fixtures_loaded", {}, fixtures.length);
218
205
  res.writeHead(200, { "Content-Type": "application/json" });
219
206
  res.end(JSON.stringify({ reset: true }));
@@ -222,7 +209,7 @@ async function handleControlAPI(req, res, pathname, fixtures, journal, videoStat
222
209
  if (subPath === "/error" && req.method === "POST") {
223
210
  let raw;
224
211
  try {
225
- raw = await readBody(req);
212
+ raw = await require_helpers.readBody(req);
226
213
  } catch (err) {
227
214
  const msg = err instanceof Error ? err.message : String(err);
228
215
  defaults.logger.error(`POST /__aimock/error: failed to read body: ${msg}`);
@@ -279,7 +266,7 @@ async function handleCompletions(req, res, fixtures, journal, defaults, modelFal
279
266
  setCorsHeaders(res);
280
267
  let raw;
281
268
  try {
282
- raw = await readBody(req);
269
+ raw = await require_helpers.readBody(req);
283
270
  } catch (err) {
284
271
  const msg = err instanceof Error ? err.message : "Failed to read request body";
285
272
  journal.add({
@@ -371,6 +358,29 @@ async function handleCompletions(req, res, fixtures, journal, defaults, modelFal
371
358
  return;
372
359
  }
373
360
  if (!fixture) {
361
+ if (require_helpers.resolveStrictMode(defaults.strict, req.headers)) {
362
+ const strictStatus = 503;
363
+ const strictMessage = "Strict mode: no fixture matched";
364
+ defaults.logger.error(`STRICT: No fixture matched for ${req.method ?? "POST"} ${req.url ?? COMPLETIONS_PATH}`);
365
+ journal.add({
366
+ method: req.method ?? "POST",
367
+ path: req.url ?? COMPLETIONS_PATH,
368
+ headers: require_helpers.flattenHeaders(req.headers),
369
+ body,
370
+ response: {
371
+ status: strictStatus,
372
+ fixture: null,
373
+ ...require_helpers.strictOverrideField(defaults.strict, req.headers)
374
+ }
375
+ });
376
+ require_sse_writer.writeErrorResponse(res, strictStatus, JSON.stringify({ error: {
377
+ message: strictMessage,
378
+ type: "invalid_request_error",
379
+ param: null,
380
+ code: "no_fixture_match"
381
+ } }));
382
+ return;
383
+ }
374
384
  if (defaults.record && providerKey) {
375
385
  const hookOptions = chaosAction === "malformed" ? {
376
386
  beforeWriteResponse: () => {
@@ -388,7 +398,7 @@ async function handleCompletions(req, res, fixtures, journal, defaults, modelFal
388
398
  } : void 0;
389
399
  const outcome = await require_recorder.proxyAndRecord(req, res, body, providerKey, req.url ?? COMPLETIONS_PATH, fixtures, defaults, raw, hookOptions);
390
400
  if (outcome === "handled_by_hook") return;
391
- if (outcome === "relayed") {
401
+ if (outcome !== "not_configured") {
392
402
  journal.add({
393
403
  method: req.method ?? "POST",
394
404
  path: req.url ?? COMPLETIONS_PATH,
@@ -403,23 +413,19 @@ async function handleCompletions(req, res, fixtures, journal, defaults, modelFal
403
413
  return;
404
414
  }
405
415
  }
406
- const effectiveStrict = require_helpers.resolveStrictMode(defaults.strict, req.headers);
407
- const strictStatus = effectiveStrict ? 503 : 404;
408
- const strictMessage = effectiveStrict ? "Strict mode: no fixture matched" : "No fixture matched";
409
- if (effectiveStrict) defaults.logger.error(`STRICT: No fixture matched for ${req.method ?? "POST"} ${req.url ?? COMPLETIONS_PATH}`);
410
416
  journal.add({
411
417
  method: req.method ?? "POST",
412
418
  path: req.url ?? COMPLETIONS_PATH,
413
419
  headers: require_helpers.flattenHeaders(req.headers),
414
420
  body,
415
421
  response: {
416
- status: strictStatus,
422
+ status: 404,
417
423
  fixture: null,
418
424
  ...require_helpers.strictOverrideField(defaults.strict, req.headers)
419
425
  }
420
426
  });
421
- require_sse_writer.writeErrorResponse(res, strictStatus, JSON.stringify({ error: {
422
- message: strictMessage,
427
+ require_sse_writer.writeErrorResponse(res, 404, JSON.stringify({ error: {
428
+ message: "No fixture matched",
423
429
  type: "invalid_request_error",
424
430
  param: null,
425
431
  code: "no_fixture_match"
@@ -441,13 +447,7 @@ async function handleCompletions(req, res, fixtures, journal, defaults, modelFal
441
447
  fixture
442
448
  }
443
449
  });
444
- const errorBody = { error: {
445
- message: response.error.message,
446
- type: response.error.type ?? "server_error",
447
- param: null,
448
- code: response.error.code ?? null
449
- } };
450
- require_sse_writer.writeErrorResponse(res, status, JSON.stringify(errorBody));
450
+ require_sse_writer.writeErrorResponse(res, status, require_helpers.serializeErrorResponse(response));
451
451
  return;
452
452
  }
453
453
  if (require_helpers.isAudioResponse(response)) {
@@ -536,6 +536,7 @@ async function handleCompletions(req, res, fixtures, journal, defaults, modelFal
536
536
  return;
537
537
  }
538
538
  if (require_helpers.isToolCallResponse(response)) {
539
+ if (response.webSearches?.length) defaults.logger.warn("webSearches in fixture response are not supported for Chat Completions API — ignoring");
539
540
  const overrides = require_helpers.extractOverrides(response);
540
541
  const journalEntry = journal.add({
541
542
  method: req.method ?? "POST",
@@ -778,7 +779,7 @@ async function createServer(fixtures, options, mounts, serviceFixtures) {
778
779
  }
779
780
  if (pathname === RESPONSES_PATH && req.method === "POST") {
780
781
  try {
781
- await require_responses.handleResponses(req, res, await readBody(req), fixtures, journal, defaults, setCorsHeaders);
782
+ await require_responses.handleResponses(req, res, await require_helpers.readBody(req), fixtures, journal, defaults, setCorsHeaders);
782
783
  } catch (err) {
783
784
  const msg = err instanceof Error ? err.message : "Internal error";
784
785
  if (!res.headersSent) require_sse_writer.writeErrorResponse(res, 500, JSON.stringify({ error: {
@@ -796,7 +797,7 @@ async function createServer(fixtures, options, mounts, serviceFixtures) {
796
797
  }
797
798
  if (pathname === MESSAGES_PATH && req.method === "POST") {
798
799
  try {
799
- await require_messages.handleMessages(req, res, await readBody(req), fixtures, journal, defaults, setCorsHeaders);
800
+ await require_messages.handleMessages(req, res, await require_helpers.readBody(req), fixtures, journal, defaults, setCorsHeaders);
800
801
  } catch (err) {
801
802
  const msg = err instanceof Error ? err.message : "Internal error";
802
803
  if (!res.headersSent) require_sse_writer.writeErrorResponse(res, 500, JSON.stringify({ error: {
@@ -814,7 +815,7 @@ async function createServer(fixtures, options, mounts, serviceFixtures) {
814
815
  }
815
816
  if (pathname === COHERE_CHAT_PATH && req.method === "POST") {
816
817
  try {
817
- await require_cohere.handleCohere(req, res, await readBody(req), fixtures, journal, defaults, setCorsHeaders);
818
+ await require_cohere.handleCohere(req, res, await require_helpers.readBody(req), fixtures, journal, defaults, setCorsHeaders);
818
819
  } catch (err) {
819
820
  const msg = err instanceof Error ? err.message : "Internal error";
820
821
  if (!res.headersSent) require_sse_writer.writeErrorResponse(res, 500, JSON.stringify({ error: {
@@ -834,7 +835,7 @@ async function createServer(fixtures, options, mounts, serviceFixtures) {
834
835
  try {
835
836
  const deploymentId = azureDeploymentId;
836
837
  const embeddingsProvider = azureDeploymentId ? "azure" : "openai";
837
- let raw = await readBody(req);
838
+ let raw = await require_helpers.readBody(req);
838
839
  if (deploymentId) try {
839
840
  const parsed = JSON.parse(raw);
840
841
  if (!parsed.model) {
@@ -857,7 +858,7 @@ async function createServer(fixtures, options, mounts, serviceFixtures) {
857
858
  }
858
859
  if (pathname === IMAGES_PATH && req.method === "POST") {
859
860
  try {
860
- await require_images.handleImages(req, res, await readBody(req), fixtures, journal, defaults, setCorsHeaders);
861
+ await require_images.handleImages(req, res, await require_helpers.readBody(req), fixtures, journal, defaults, setCorsHeaders);
861
862
  } catch (err) {
862
863
  const msg = err instanceof Error ? err.message : "Internal error";
863
864
  if (!res.headersSent) require_sse_writer.writeErrorResponse(res, 500, JSON.stringify({ error: {
@@ -870,7 +871,7 @@ async function createServer(fixtures, options, mounts, serviceFixtures) {
870
871
  }
871
872
  if (pathname === SPEECH_PATH && req.method === "POST") {
872
873
  try {
873
- await require_speech.handleSpeech(req, res, await readBody(req), fixtures, journal, defaults, setCorsHeaders);
874
+ await require_speech.handleSpeech(req, res, await require_helpers.readBody(req), fixtures, journal, defaults, setCorsHeaders);
874
875
  } catch (err) {
875
876
  const msg = err instanceof Error ? err.message : "Internal error";
876
877
  if (!res.headersSent) require_sse_writer.writeErrorResponse(res, 500, JSON.stringify({ error: {
@@ -883,7 +884,7 @@ async function createServer(fixtures, options, mounts, serviceFixtures) {
883
884
  }
884
885
  if (pathname === TRANSCRIPTIONS_PATH && req.method === "POST") {
885
886
  try {
886
- await require_transcription.handleTranscription(req, res, await readBody(req), fixtures, journal, defaults, setCorsHeaders);
887
+ await require_transcription.handleTranscription(req, res, await require_helpers.readBody(req), fixtures, journal, defaults, setCorsHeaders);
887
888
  } catch (err) {
888
889
  const msg = err instanceof Error ? err.message : "Internal error";
889
890
  if (!res.headersSent) require_sse_writer.writeErrorResponse(res, 500, JSON.stringify({ error: {
@@ -896,7 +897,7 @@ async function createServer(fixtures, options, mounts, serviceFixtures) {
896
897
  }
897
898
  if (pathname === VIDEOS_PATH && req.method === "POST") {
898
899
  try {
899
- await require_video.handleVideoCreate(req, res, await readBody(req), fixtures, journal, defaults, setCorsHeaders, videoStates);
900
+ await require_video.handleVideoCreate(req, res, await require_helpers.readBody(req), fixtures, journal, defaults, setCorsHeaders, videoStates);
900
901
  } catch (err) {
901
902
  const msg = err instanceof Error ? err.message : "Internal error";
902
903
  if (!res.headersSent) require_sse_writer.writeErrorResponse(res, 500, JSON.stringify({ error: {
@@ -917,7 +918,7 @@ async function createServer(fixtures, options, mounts, serviceFixtures) {
917
918
  if (geminiPredictMatch && req.method === "POST") {
918
919
  const predictModel = geminiPredictMatch[1];
919
920
  try {
920
- await require_images.handleImages(req, res, await readBody(req), fixtures, journal, defaults, setCorsHeaders, "gemini", predictModel);
921
+ await require_images.handleImages(req, res, await require_helpers.readBody(req), fixtures, journal, defaults, setCorsHeaders, "gemini", predictModel);
921
922
  } catch (err) {
922
923
  const msg = err instanceof Error ? err.message : "Internal error";
923
924
  if (!res.headersSent) require_sse_writer.writeErrorResponse(res, 500, JSON.stringify({ error: {
@@ -930,7 +931,7 @@ async function createServer(fixtures, options, mounts, serviceFixtures) {
930
931
  }
931
932
  if (pathname === GEMINI_INTERACTIONS_PATH && req.method === "POST") {
932
933
  try {
933
- await require_gemini_interactions.handleGeminiInteractions(req, res, await readBody(req), fixtures, journal, defaults, setCorsHeaders);
934
+ await require_gemini_interactions.handleGeminiInteractions(req, res, await require_helpers.readBody(req), fixtures, journal, defaults, setCorsHeaders);
934
935
  } catch (err) {
935
936
  const msg = err instanceof Error ? err.message : "Internal error";
936
937
  if (!res.headersSent) require_sse_writer.writeErrorResponse(res, 500, JSON.stringify({ error: {
@@ -951,7 +952,7 @@ async function createServer(fixtures, options, mounts, serviceFixtures) {
951
952
  const geminiModel = geminiMatch[1];
952
953
  const streaming = geminiMatch[2] === "streamGenerateContent";
953
954
  try {
954
- await require_gemini.handleGemini(req, res, await readBody(req), geminiModel, streaming, fixtures, journal, defaults, setCorsHeaders);
955
+ await require_gemini.handleGemini(req, res, await require_helpers.readBody(req), geminiModel, streaming, fixtures, journal, defaults, setCorsHeaders);
955
956
  } catch (err) {
956
957
  const msg = err instanceof Error ? err.message : "Internal error";
957
958
  if (!res.headersSent) require_sse_writer.writeErrorResponse(res, 500, JSON.stringify({ error: {
@@ -972,7 +973,7 @@ async function createServer(fixtures, options, mounts, serviceFixtures) {
972
973
  const vertexModel = vertexMatch[1];
973
974
  const streaming = vertexMatch[2] === "streamGenerateContent";
974
975
  try {
975
- await require_gemini.handleGemini(req, res, await readBody(req), vertexModel, streaming, fixtures, journal, defaults, setCorsHeaders, "vertexai");
976
+ await require_gemini.handleGemini(req, res, await require_helpers.readBody(req), vertexModel, streaming, fixtures, journal, defaults, setCorsHeaders, "vertexai");
976
977
  } catch (err) {
977
978
  const msg = err instanceof Error ? err.message : "Internal error";
978
979
  if (!res.headersSent) require_sse_writer.writeErrorResponse(res, 500, JSON.stringify({ error: {
@@ -992,7 +993,7 @@ async function createServer(fixtures, options, mounts, serviceFixtures) {
992
993
  if (bedrockMatch && req.method === "POST") {
993
994
  const bedrockModelId = bedrockMatch[1];
994
995
  try {
995
- await require_bedrock.handleBedrock(req, res, await readBody(req), bedrockModelId, fixtures, journal, defaults, setCorsHeaders);
996
+ await require_bedrock.handleBedrock(req, res, await require_helpers.readBody(req), bedrockModelId, fixtures, journal, defaults, setCorsHeaders);
996
997
  } catch (err) {
997
998
  const msg = err instanceof Error ? err.message : "Internal error";
998
999
  if (!res.headersSent) require_sse_writer.writeErrorResponse(res, 500, JSON.stringify({ error: {
@@ -1007,7 +1008,7 @@ async function createServer(fixtures, options, mounts, serviceFixtures) {
1007
1008
  if (bedrockStreamMatch && req.method === "POST") {
1008
1009
  const bedrockModelId = bedrockStreamMatch[1];
1009
1010
  try {
1010
- await require_bedrock.handleBedrockStream(req, res, await readBody(req), bedrockModelId, fixtures, journal, defaults, setCorsHeaders);
1011
+ await require_bedrock.handleBedrockStream(req, res, await require_helpers.readBody(req), bedrockModelId, fixtures, journal, defaults, setCorsHeaders);
1011
1012
  } catch (err) {
1012
1013
  const msg = err instanceof Error ? err.message : "Internal error";
1013
1014
  if (!res.headersSent) require_sse_writer.writeErrorResponse(res, 500, JSON.stringify({ error: {
@@ -1022,7 +1023,7 @@ async function createServer(fixtures, options, mounts, serviceFixtures) {
1022
1023
  if (converseMatch && req.method === "POST") {
1023
1024
  const converseModelId = converseMatch[1];
1024
1025
  try {
1025
- await require_bedrock_converse.handleConverse(req, res, await readBody(req), converseModelId, fixtures, journal, defaults, setCorsHeaders);
1026
+ await require_bedrock_converse.handleConverse(req, res, await require_helpers.readBody(req), converseModelId, fixtures, journal, defaults, setCorsHeaders);
1026
1027
  } catch (err) {
1027
1028
  const msg = err instanceof Error ? err.message : "Internal error";
1028
1029
  if (!res.headersSent) require_sse_writer.writeErrorResponse(res, 500, JSON.stringify({ error: {
@@ -1037,7 +1038,7 @@ async function createServer(fixtures, options, mounts, serviceFixtures) {
1037
1038
  if (converseStreamMatch && req.method === "POST") {
1038
1039
  const converseStreamModelId = converseStreamMatch[1];
1039
1040
  try {
1040
- await require_bedrock_converse.handleConverseStream(req, res, await readBody(req), converseStreamModelId, fixtures, journal, defaults, setCorsHeaders);
1041
+ await require_bedrock_converse.handleConverseStream(req, res, await require_helpers.readBody(req), converseStreamModelId, fixtures, journal, defaults, setCorsHeaders);
1041
1042
  } catch (err) {
1042
1043
  const msg = err instanceof Error ? err.message : "Internal error";
1043
1044
  if (!res.headersSent) require_sse_writer.writeErrorResponse(res, 500, JSON.stringify({ error: {
@@ -1050,7 +1051,7 @@ async function createServer(fixtures, options, mounts, serviceFixtures) {
1050
1051
  }
1051
1052
  if (pathname === OLLAMA_CHAT_PATH && req.method === "POST") {
1052
1053
  try {
1053
- await require_ollama.handleOllama(req, res, await readBody(req), fixtures, journal, defaults, setCorsHeaders);
1054
+ await require_ollama.handleOllama(req, res, await require_helpers.readBody(req), fixtures, journal, defaults, setCorsHeaders);
1054
1055
  } catch (err) {
1055
1056
  const msg = err instanceof Error ? err.message : "Internal error";
1056
1057
  if (!res.headersSent) require_sse_writer.writeErrorResponse(res, 500, JSON.stringify({ error: {
@@ -1063,7 +1064,7 @@ async function createServer(fixtures, options, mounts, serviceFixtures) {
1063
1064
  }
1064
1065
  if (pathname === OLLAMA_GENERATE_PATH && req.method === "POST") {
1065
1066
  try {
1066
- await require_ollama.handleOllamaGenerate(req, res, await readBody(req), fixtures, journal, defaults, setCorsHeaders);
1067
+ await require_ollama.handleOllamaGenerate(req, res, await require_helpers.readBody(req), fixtures, journal, defaults, setCorsHeaders);
1067
1068
  } catch (err) {
1068
1069
  const msg = err instanceof Error ? err.message : "Internal error";
1069
1070
  if (!res.headersSent) require_sse_writer.writeErrorResponse(res, 500, JSON.stringify({ error: {
@@ -1092,7 +1093,7 @@ async function createServer(fixtures, options, mounts, serviceFixtures) {
1092
1093
  }
1093
1094
  if (pathname === SEARCH_PATH && req.method === "POST") {
1094
1095
  try {
1095
- await require_search.handleSearch(req, res, await readBody(req), serviceFixtures?.search ?? [], journal, defaults, setCorsHeaders);
1096
+ await require_search.handleSearch(req, res, await require_helpers.readBody(req), serviceFixtures?.search ?? [], journal, defaults, setCorsHeaders);
1096
1097
  } catch (err) {
1097
1098
  const msg = err instanceof Error ? err.message : "Internal error";
1098
1099
  if (!res.headersSent) require_sse_writer.writeErrorResponse(res, 500, JSON.stringify({ error: {
@@ -1105,7 +1106,7 @@ async function createServer(fixtures, options, mounts, serviceFixtures) {
1105
1106
  }
1106
1107
  if (pathname === RERANK_PATH && req.method === "POST") {
1107
1108
  try {
1108
- await require_rerank.handleRerank(req, res, await readBody(req), serviceFixtures?.rerank ?? [], journal, defaults, setCorsHeaders);
1109
+ await require_rerank.handleRerank(req, res, await require_helpers.readBody(req), serviceFixtures?.rerank ?? [], journal, defaults, setCorsHeaders);
1109
1110
  } catch (err) {
1110
1111
  const msg = err instanceof Error ? err.message : "Internal error";
1111
1112
  if (!res.headersSent) require_sse_writer.writeErrorResponse(res, 500, JSON.stringify({ error: {
@@ -1118,7 +1119,7 @@ async function createServer(fixtures, options, mounts, serviceFixtures) {
1118
1119
  }
1119
1120
  if (pathname === MODERATIONS_PATH && req.method === "POST") {
1120
1121
  try {
1121
- await require_moderation.handleModeration(req, res, await readBody(req), serviceFixtures?.moderation ?? [], journal, defaults, setCorsHeaders);
1122
+ await require_moderation.handleModeration(req, res, await require_helpers.readBody(req), serviceFixtures?.moderation ?? [], journal, defaults, setCorsHeaders);
1122
1123
  } catch (err) {
1123
1124
  const msg = err instanceof Error ? err.message : "Internal error";
1124
1125
  if (!res.headersSent) require_sse_writer.writeErrorResponse(res, 500, JSON.stringify({ error: {
@@ -1132,35 +1133,7 @@ async function createServer(fixtures, options, mounts, serviceFixtures) {
1132
1133
  if (pathname === ELEVENLABS_SOUND_GENERATION_PATH && req.method === "POST") {
1133
1134
  setCorsHeaders(res);
1134
1135
  try {
1135
- const raw = await readBody(req);
1136
- let elSoundFixture = null;
1137
- try {
1138
- const parsed = JSON.parse(raw);
1139
- const syntheticReq = {
1140
- model: parsed.model_id ?? "eleven_text_to_sound_v2",
1141
- messages: [{
1142
- role: "user",
1143
- content: parsed.text ?? ""
1144
- }],
1145
- _endpointType: "audio-gen"
1146
- };
1147
- const testId = require_helpers.getTestId(req);
1148
- elSoundFixture = require_router.matchFixture(fixtures, syntheticReq, journal.getFixtureMatchCountsForTest(testId), defaults.requestTransform);
1149
- } catch {}
1150
- const chaosAction = require_chaos.evaluateChaos(elSoundFixture, defaults.chaos, req.headers, defaults.logger);
1151
- if (chaosAction) {
1152
- require_chaos.applyChaosAction(chaosAction, res, elSoundFixture, journal, {
1153
- method: req.method ?? "POST",
1154
- path: pathname,
1155
- headers: require_helpers.flattenHeaders(req.headers),
1156
- body: {
1157
- model: "",
1158
- messages: []
1159
- }
1160
- }, "fixture", defaults.registry);
1161
- return;
1162
- }
1163
- await require_elevenlabs_audio.handleElevenLabsAudio(req, res, raw, fixtures, defaults, journal, "sound-generation");
1136
+ await require_elevenlabs_audio.handleElevenLabsAudio(req, res, await require_helpers.readBody(req), fixtures, defaults, journal, "sound-generation");
1164
1137
  } catch (err) {
1165
1138
  const msg = err instanceof Error ? err.message : "Internal error";
1166
1139
  if (!res.headersSent) require_sse_writer.writeErrorResponse(res, 500, JSON.stringify({ error: {
@@ -1176,36 +1149,7 @@ async function createServer(fixtures, options, mounts, serviceFixtures) {
1176
1149
  setCorsHeaders(res);
1177
1150
  const musicSubType = musicMatch[1] ?? "music";
1178
1151
  try {
1179
- const raw = await readBody(req);
1180
- let elMusicFixture = null;
1181
- try {
1182
- const parsed = JSON.parse(raw);
1183
- const prompt = (typeof parsed.prompt === "string" ? parsed.prompt : null) ?? (parsed.composition_plan != null ? typeof parsed.composition_plan === "string" ? parsed.composition_plan : JSON.stringify(parsed.composition_plan) : "");
1184
- const syntheticReq = {
1185
- model: parsed.model_id ?? "music_v1",
1186
- messages: [{
1187
- role: "user",
1188
- content: prompt
1189
- }],
1190
- _endpointType: "audio-gen"
1191
- };
1192
- const testId = require_helpers.getTestId(req);
1193
- elMusicFixture = require_router.matchFixture(fixtures, syntheticReq, journal.getFixtureMatchCountsForTest(testId), defaults.requestTransform);
1194
- } catch {}
1195
- const chaosAction = require_chaos.evaluateChaos(elMusicFixture, defaults.chaos, req.headers, defaults.logger);
1196
- if (chaosAction) {
1197
- require_chaos.applyChaosAction(chaosAction, res, elMusicFixture, journal, {
1198
- method: req.method ?? "POST",
1199
- path: pathname,
1200
- headers: require_helpers.flattenHeaders(req.headers),
1201
- body: {
1202
- model: "",
1203
- messages: []
1204
- }
1205
- }, "fixture", defaults.registry);
1206
- return;
1207
- }
1208
- await require_elevenlabs_audio.handleElevenLabsAudio(req, res, raw, fixtures, defaults, journal, musicSubType);
1152
+ await require_elevenlabs_audio.handleElevenLabsAudio(req, res, await require_helpers.readBody(req), fixtures, defaults, journal, musicSubType);
1209
1153
  } catch (err) {
1210
1154
  const msg = err instanceof Error ? err.message : "Internal error";
1211
1155
  if (!res.headersSent) require_sse_writer.writeErrorResponse(res, 500, JSON.stringify({ error: {
@@ -1220,7 +1164,7 @@ async function createServer(fixtures, options, mounts, serviceFixtures) {
1220
1164
  if (FAL_PREFIX_RE.test(pathname) && req.headers["x-fal-target-host"]) {
1221
1165
  setCorsHeaders(res);
1222
1166
  try {
1223
- falBody = req.method === "POST" || req.method === "PUT" ? await readBody(req) : "";
1167
+ falBody = req.method === "POST" || req.method === "PUT" ? await require_helpers.readBody(req) : "";
1224
1168
  const raw = falBody;
1225
1169
  const chaosAction = require_chaos.evaluateChaos(null, defaults.chaos, req.headers, defaults.logger);
1226
1170
  if (chaosAction) {
@@ -1246,40 +1190,10 @@ async function createServer(fixtures, options, mounts, serviceFixtures) {
1246
1190
  return;
1247
1191
  }
1248
1192
  }
1249
- const falQueueSubmitMatch = pathname.match(FAL_QUEUE_SUBMIT_RE);
1250
- if (falQueueSubmitMatch && req.method === "POST") {
1193
+ if (pathname.match(FAL_QUEUE_SUBMIT_RE) && req.method === "POST") {
1251
1194
  setCorsHeaders(res);
1252
1195
  try {
1253
- const raw = falBody ?? await readBody(req);
1254
- let falSubmitFixture = null;
1255
- try {
1256
- const parsed = raw.trim() ? JSON.parse(raw) : {};
1257
- const prompt = (typeof parsed.prompt === "string" ? parsed.prompt : null) ?? (typeof parsed.text === "string" ? parsed.text : null) ?? "";
1258
- const syntheticReq = {
1259
- model: falQueueSubmitMatch[1],
1260
- messages: [{
1261
- role: "user",
1262
- content: prompt
1263
- }],
1264
- _endpointType: "fal-audio"
1265
- };
1266
- const testId = require_helpers.getTestId(req);
1267
- falSubmitFixture = require_router.matchFixture(fixtures, syntheticReq, journal.getFixtureMatchCountsForTest(testId), defaults.requestTransform);
1268
- } catch {}
1269
- const chaosAction = require_chaos.evaluateChaos(falSubmitFixture, defaults.chaos, req.headers, defaults.logger);
1270
- if (chaosAction) {
1271
- require_chaos.applyChaosAction(chaosAction, res, falSubmitFixture, journal, {
1272
- method: req.method ?? "POST",
1273
- path: pathname,
1274
- headers: require_helpers.flattenHeaders(req.headers),
1275
- body: {
1276
- model: "",
1277
- messages: []
1278
- }
1279
- }, "fixture", defaults.registry);
1280
- return;
1281
- }
1282
- await require_fal_audio.handleFalQueue(req, res, raw, pathname, fixtures, defaults, journal);
1196
+ await require_fal_audio.handleFalQueue(req, res, falBody ?? await require_helpers.readBody(req), pathname, fixtures, defaults, journal);
1283
1197
  } catch (err) {
1284
1198
  const msg = err instanceof Error ? err.message : "Internal error";
1285
1199
  if (!res.headersSent) require_sse_writer.writeErrorResponse(res, 500, JSON.stringify({ error: {
@@ -1293,7 +1207,7 @@ async function createServer(fixtures, options, mounts, serviceFixtures) {
1293
1207
  if (pathname.match(FAL_QUEUE_REQUESTS_RE) && (req.method === "GET" || req.method === "POST" || req.method === "PUT")) {
1294
1208
  setCorsHeaders(res);
1295
1209
  try {
1296
- const raw = req.method === "POST" || req.method === "PUT" ? falBody ?? await readBody(req) : "{}";
1210
+ const raw = req.method === "POST" || req.method === "PUT" ? falBody ?? await require_helpers.readBody(req) : "{}";
1297
1211
  const chaosAction = require_chaos.evaluateChaos(null, defaults.chaos, req.headers, defaults.logger);
1298
1212
  if (chaosAction) {
1299
1213
  require_chaos.applyChaosAction(chaosAction, res, null, journal, {
@@ -1318,40 +1232,10 @@ async function createServer(fixtures, options, mounts, serviceFixtures) {
1318
1232
  }
1319
1233
  return;
1320
1234
  }
1321
- const falRunMatch = pathname.match(FAL_RUN_RE);
1322
- if (falRunMatch && req.method === "POST") {
1235
+ if (pathname.match(FAL_RUN_RE) && req.method === "POST") {
1323
1236
  setCorsHeaders(res);
1324
1237
  try {
1325
- const raw = falBody ?? await readBody(req);
1326
- let falRunFixture = null;
1327
- try {
1328
- const parsed = raw.trim() ? JSON.parse(raw) : {};
1329
- const prompt = (typeof parsed.prompt === "string" ? parsed.prompt : null) ?? (typeof parsed.text === "string" ? parsed.text : null) ?? "";
1330
- const syntheticReq = {
1331
- model: falRunMatch[1],
1332
- messages: [{
1333
- role: "user",
1334
- content: prompt
1335
- }],
1336
- _endpointType: "fal-audio"
1337
- };
1338
- const testId = require_helpers.getTestId(req);
1339
- falRunFixture = require_router.matchFixture(fixtures, syntheticReq, journal.getFixtureMatchCountsForTest(testId), defaults.requestTransform);
1340
- } catch {}
1341
- const chaosAction = require_chaos.evaluateChaos(falRunFixture, defaults.chaos, req.headers, defaults.logger);
1342
- if (chaosAction) {
1343
- require_chaos.applyChaosAction(chaosAction, res, falRunFixture, journal, {
1344
- method: req.method ?? "POST",
1345
- path: pathname,
1346
- headers: require_helpers.flattenHeaders(req.headers),
1347
- body: {
1348
- model: "",
1349
- messages: []
1350
- }
1351
- }, "fixture", defaults.registry);
1352
- return;
1353
- }
1354
- await require_fal_audio.handleFalQueue(req, res, raw, pathname, fixtures, defaults, journal);
1238
+ await require_fal_audio.handleFalQueue(req, res, falBody ?? await require_helpers.readBody(req), pathname, fixtures, defaults, journal);
1355
1239
  } catch (err) {
1356
1240
  const msg = err instanceof Error ? err.message : "Internal error";
1357
1241
  if (!res.headersSent) require_sse_writer.writeErrorResponse(res, 500, JSON.stringify({ error: {
@@ -1439,7 +1323,7 @@ async function createServer(fixtures, options, mounts, serviceFixtures) {
1439
1323
  upgradeHeaders: req.headers
1440
1324
  });
1441
1325
  else if (pathname === REALTIME_PATH) {
1442
- const model = parsedUrl.searchParams.get("model") ?? "gpt-4o-realtime";
1326
+ const model = parsedUrl.searchParams.get("model") ?? "gpt-realtime-2";
1443
1327
  require_ws_realtime.handleWebSocketRealtime(ws, fixtures, journal, {
1444
1328
  ...defaults,
1445
1329
  model,