@copilotkit/aimock 1.33.0 → 1.35.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 (158) hide show
  1. package/.claude-plugin/marketplace.json +1 -1
  2. package/.claude-plugin/plugin.json +1 -1
  3. package/CHANGELOG.md +30 -0
  4. package/README.md +6 -1
  5. package/dist/agui-types.d.ts.map +1 -1
  6. package/dist/bedrock-converse.cjs +112 -10
  7. package/dist/bedrock-converse.cjs.map +1 -1
  8. package/dist/bedrock-converse.d.cts.map +1 -1
  9. package/dist/bedrock-converse.d.ts.map +1 -1
  10. package/dist/bedrock-converse.js +114 -12
  11. package/dist/bedrock-converse.js.map +1 -1
  12. package/dist/bedrock.cjs +143 -6
  13. package/dist/bedrock.cjs.map +1 -1
  14. package/dist/bedrock.d.cts.map +1 -1
  15. package/dist/bedrock.d.ts.map +1 -1
  16. package/dist/bedrock.js +145 -8
  17. package/dist/bedrock.js.map +1 -1
  18. package/dist/cohere.cjs +91 -9
  19. package/dist/cohere.cjs.map +1 -1
  20. package/dist/cohere.d.cts.map +1 -1
  21. package/dist/cohere.d.ts.map +1 -1
  22. package/dist/cohere.js +93 -11
  23. package/dist/cohere.js.map +1 -1
  24. package/dist/config-loader.d.ts.map +1 -1
  25. package/dist/fixture-loader.cjs +121 -20
  26. package/dist/fixture-loader.cjs.map +1 -1
  27. package/dist/fixture-loader.d.cts.map +1 -1
  28. package/dist/fixture-loader.d.ts.map +1 -1
  29. package/dist/fixture-loader.js +121 -20
  30. package/dist/fixture-loader.js.map +1 -1
  31. package/dist/gemini-interactions.cjs +146 -108
  32. package/dist/gemini-interactions.cjs.map +1 -1
  33. package/dist/gemini-interactions.d.cts.map +1 -1
  34. package/dist/gemini-interactions.d.ts.map +1 -1
  35. package/dist/gemini-interactions.js +147 -109
  36. package/dist/gemini-interactions.js.map +1 -1
  37. package/dist/gemini.cjs +72 -7
  38. package/dist/gemini.cjs.map +1 -1
  39. package/dist/gemini.d.cts.map +1 -1
  40. package/dist/gemini.d.ts.map +1 -1
  41. package/dist/gemini.js +74 -9
  42. package/dist/gemini.js.map +1 -1
  43. package/dist/grok-video.cjs +834 -0
  44. package/dist/grok-video.cjs.map +1 -0
  45. package/dist/grok-video.d.cts +74 -0
  46. package/dist/grok-video.d.cts.map +1 -0
  47. package/dist/grok-video.d.ts +74 -0
  48. package/dist/grok-video.d.ts.map +1 -0
  49. package/dist/grok-video.js +829 -0
  50. package/dist/grok-video.js.map +1 -0
  51. package/dist/helpers.cjs +181 -2
  52. package/dist/helpers.cjs.map +1 -1
  53. package/dist/helpers.d.cts +33 -3
  54. package/dist/helpers.d.cts.map +1 -1
  55. package/dist/helpers.d.ts +33 -3
  56. package/dist/helpers.d.ts.map +1 -1
  57. package/dist/helpers.js +181 -3
  58. package/dist/helpers.js.map +1 -1
  59. package/dist/index.cjs +11 -0
  60. package/dist/index.d.cts +5 -3
  61. package/dist/index.d.ts +5 -3
  62. package/dist/index.js +4 -2
  63. package/dist/messages.cjs +100 -11
  64. package/dist/messages.cjs.map +1 -1
  65. package/dist/messages.d.cts.map +1 -1
  66. package/dist/messages.d.ts.map +1 -1
  67. package/dist/messages.js +102 -13
  68. package/dist/messages.js.map +1 -1
  69. package/dist/metrics.cjs +11 -1
  70. package/dist/metrics.cjs.map +1 -1
  71. package/dist/metrics.d.cts.map +1 -1
  72. package/dist/metrics.d.ts.map +1 -1
  73. package/dist/metrics.js +8 -1
  74. package/dist/metrics.js.map +1 -1
  75. package/dist/ollama.cjs +77 -7
  76. package/dist/ollama.cjs.map +1 -1
  77. package/dist/ollama.d.cts.map +1 -1
  78. package/dist/ollama.d.ts.map +1 -1
  79. package/dist/ollama.js +79 -9
  80. package/dist/ollama.js.map +1 -1
  81. package/dist/openrouter-video.cjs +19 -138
  82. package/dist/openrouter-video.cjs.map +1 -1
  83. package/dist/openrouter-video.d.cts.map +1 -1
  84. package/dist/openrouter-video.d.ts.map +1 -1
  85. package/dist/openrouter-video.js +1 -120
  86. package/dist/openrouter-video.js.map +1 -1
  87. package/dist/recorder.cjs +12 -9
  88. package/dist/recorder.cjs.map +1 -1
  89. package/dist/recorder.js +12 -9
  90. package/dist/recorder.js.map +1 -1
  91. package/dist/responses.cjs +137 -59
  92. package/dist/responses.cjs.map +1 -1
  93. package/dist/responses.d.cts +2 -2
  94. package/dist/responses.d.cts.map +1 -1
  95. package/dist/responses.d.ts +2 -2
  96. package/dist/responses.d.ts.map +1 -1
  97. package/dist/responses.js +139 -61
  98. package/dist/responses.js.map +1 -1
  99. package/dist/router.cjs +236 -33
  100. package/dist/router.cjs.map +1 -1
  101. package/dist/router.d.cts +54 -2
  102. package/dist/router.d.cts.map +1 -1
  103. package/dist/router.d.ts +54 -2
  104. package/dist/router.d.ts.map +1 -1
  105. package/dist/router.js +236 -34
  106. package/dist/router.js.map +1 -1
  107. package/dist/server.cjs +163 -21
  108. package/dist/server.cjs.map +1 -1
  109. package/dist/server.d.cts +4 -0
  110. package/dist/server.d.cts.map +1 -1
  111. package/dist/server.d.ts +4 -0
  112. package/dist/server.d.ts.map +1 -1
  113. package/dist/server.js +166 -24
  114. package/dist/server.js.map +1 -1
  115. package/dist/stream-collapse.cjs +355 -79
  116. package/dist/stream-collapse.cjs.map +1 -1
  117. package/dist/stream-collapse.d.cts +27 -4
  118. package/dist/stream-collapse.d.cts.map +1 -1
  119. package/dist/stream-collapse.d.ts +27 -4
  120. package/dist/stream-collapse.d.ts.map +1 -1
  121. package/dist/stream-collapse.js +355 -79
  122. package/dist/stream-collapse.js.map +1 -1
  123. package/dist/types.d.cts +104 -7
  124. package/dist/types.d.cts.map +1 -1
  125. package/dist/types.d.ts +104 -7
  126. package/dist/types.d.ts.map +1 -1
  127. package/dist/vector-types.d.ts.map +1 -1
  128. package/dist/veo-video.cjs +794 -0
  129. package/dist/veo-video.cjs.map +1 -0
  130. package/dist/veo-video.d.cts +50 -0
  131. package/dist/veo-video.d.cts.map +1 -0
  132. package/dist/veo-video.d.ts +50 -0
  133. package/dist/veo-video.d.ts.map +1 -0
  134. package/dist/veo-video.js +789 -0
  135. package/dist/veo-video.js.map +1 -0
  136. package/dist/video-proxy-shared.cjs +145 -0
  137. package/dist/video-proxy-shared.cjs.map +1 -0
  138. package/dist/video-proxy-shared.js +140 -0
  139. package/dist/video-proxy-shared.js.map +1 -0
  140. package/dist/ws-gemini-live.cjs +96 -3
  141. package/dist/ws-gemini-live.cjs.map +1 -1
  142. package/dist/ws-gemini-live.d.cts.map +1 -1
  143. package/dist/ws-gemini-live.d.ts.map +1 -1
  144. package/dist/ws-gemini-live.js +97 -4
  145. package/dist/ws-gemini-live.js.map +1 -1
  146. package/dist/ws-realtime.cjs +281 -4
  147. package/dist/ws-realtime.cjs.map +1 -1
  148. package/dist/ws-realtime.d.cts.map +1 -1
  149. package/dist/ws-realtime.d.ts.map +1 -1
  150. package/dist/ws-realtime.js +282 -5
  151. package/dist/ws-realtime.js.map +1 -1
  152. package/dist/ws-responses.cjs +1 -1
  153. package/dist/ws-responses.cjs.map +1 -1
  154. package/dist/ws-responses.js +1 -1
  155. package/dist/ws-responses.js.map +1 -1
  156. package/fixtures/examples/llm/blocks-tool-first.json +13 -0
  157. package/package.json +1 -1
  158. package/skills/write-fixtures/SKILL.md +19 -1
@@ -1,5 +1,5 @@
1
1
  import { DEFAULT_TEST_ID } from "./constants.js";
2
- import { flattenHeaders, generateToolCallId, isContentWithToolCallsResponse, isErrorResponse, isTextResponse, isToolCallResponse, resolveResponse, resolveStrictMode, strictNoMatchLogLine, strictNoMatchMessage, strictOverrideField } from "./helpers.js";
2
+ import { flattenHeaders, generateToolCallId, isContentWithToolCallsResponse, isErrorResponse, isTextResponse, isToolCallResponse, resolveFixtureBlocks, resolveResponse, resolveStrictMode, strictNoMatchLogLine, strictNoMatchMessage, strictOverrideField } from "./helpers.js";
3
3
  import "./journal.js";
4
4
  import { matchFixtureDiagnostic } from "./router.js";
5
5
  import { calculateDelay, delay } from "./sse-writer.js";
@@ -545,6 +545,10 @@ async function handleResponseCreate(ws, fixtures, journal, defaults, session, co
545
545
  fixture
546
546
  }
547
547
  });
548
+ if (response.blocks && response.blocks.length > 0) {
549
+ await streamRealtimeBlocks(ws, resolveFixtureBlocks(response.blocks), responseId, fixture, defaults, latency, chunkSize, isBeta, conversationItems, journalEntry);
550
+ return;
551
+ }
548
552
  sendEvent(ws, {
549
553
  type: "response.created",
550
554
  response: {
@@ -597,7 +601,7 @@ async function handleResponseCreate(ws, fixtures, journal, defaults, session, co
597
601
  text: ""
598
602
  }
599
603
  }, isBeta);
600
- const content = response.content;
604
+ const content = response.content ?? "";
601
605
  const replaySpeed = fixture.replaySpeed ?? defaults.replaySpeed;
602
606
  const { recordedTimings } = fixture;
603
607
  let eventIndex = 0;
@@ -694,8 +698,9 @@ async function handleResponseCreate(ws, fixtures, journal, defaults, session, co
694
698
  return;
695
699
  }
696
700
  allOutputItems.push(textOutputItem);
697
- for (let tcIdx = 0; tcIdx < response.toolCalls.length; tcIdx++) {
698
- const tc = response.toolCalls[tcIdx];
701
+ const toolCalls = response.toolCalls ?? [];
702
+ for (let tcIdx = 0; tcIdx < toolCalls.length; tcIdx++) {
703
+ const tc = toolCalls[tcIdx];
699
704
  const callId = tc.id ?? generateToolCallId();
700
705
  const itemId = realtimeId("item");
701
706
  const outputIndex = tcIdx + 1;
@@ -881,7 +886,7 @@ async function handleResponseCreate(ws, fixtures, journal, defaults, session, co
881
886
  text: ""
882
887
  }
883
888
  }, isBeta);
884
- const content = response.content;
889
+ const content = response.content ?? "";
885
890
  const replaySpeed = fixture.replaySpeed ?? defaults.replaySpeed;
886
891
  const { recordedTimings } = fixture;
887
892
  const interruption = createInterruptionSignal(fixture);
@@ -1146,6 +1151,278 @@ async function handleResponseCreate(ws, fixtures, journal, defaults, session, co
1146
1151
  });
1147
1152
  buildErrorRealtimeEvent(ws, "Fixture response did not match any known type", isBeta, "server_error");
1148
1153
  }
1154
+ /**
1155
+ * Stream a content+toolCalls fixture's ordered `blocks` over the Realtime WS
1156
+ * surface (#274). Each block becomes its own output item, sequenced on the wire
1157
+ * with an incrementing `output_index` so a client observes the blocks in array
1158
+ * order (text and tool-call items can interleave in any order, unlike the
1159
+ * separate channels of chat-completions). Emits the same per-item event shapes
1160
+ * as the legacy text/tool branches; a blocks-only fixture therefore never
1161
+ * produces an empty payload.
1162
+ */
1163
+ async function streamRealtimeBlocks(ws, blocks, responseId, fixture, defaults, latency, chunkSize, isBeta, conversationItems, journalEntry) {
1164
+ sendEvent(ws, {
1165
+ type: "response.created",
1166
+ response: {
1167
+ id: responseId,
1168
+ object: "realtime.response",
1169
+ status: "in_progress",
1170
+ status_details: null,
1171
+ output: [],
1172
+ usage: null
1173
+ }
1174
+ }, isBeta);
1175
+ const interruption = createInterruptionSignal(fixture);
1176
+ let interrupted = false;
1177
+ const allOutputItems = [];
1178
+ const replaySpeed = fixture.replaySpeed ?? defaults.replaySpeed;
1179
+ const { recordedTimings } = fixture;
1180
+ let eventIndex = 0;
1181
+ const hasToolCalls = blocks.some((b) => b.type === "toolCall");
1182
+ for (let outputIndex = 0; outputIndex < blocks.length; outputIndex++) {
1183
+ if (ws.isClosed || interrupted) break;
1184
+ const block = blocks[outputIndex];
1185
+ if (block.type === "text") {
1186
+ const textItemId = realtimeId("item");
1187
+ const contentIndex = 0;
1188
+ const textPhase = hasToolCalls ? "commentary" : "final_answer";
1189
+ const text = block.text;
1190
+ const textOutputItem = {
1191
+ id: textItemId,
1192
+ type: "message",
1193
+ role: "assistant",
1194
+ status: "completed",
1195
+ content: [{
1196
+ type: "output_text",
1197
+ text
1198
+ }]
1199
+ };
1200
+ sendEvent(ws, {
1201
+ type: "response.output_item.added",
1202
+ response_id: responseId,
1203
+ output_index: outputIndex,
1204
+ item: {
1205
+ id: textItemId,
1206
+ type: "message",
1207
+ role: "assistant",
1208
+ status: "in_progress",
1209
+ content: [],
1210
+ phase: textPhase
1211
+ }
1212
+ }, isBeta);
1213
+ sendEvent(ws, {
1214
+ type: "response.content_part.added",
1215
+ response_id: responseId,
1216
+ item_id: textItemId,
1217
+ output_index: outputIndex,
1218
+ content_index: contentIndex,
1219
+ part: {
1220
+ type: "output_text",
1221
+ text: ""
1222
+ }
1223
+ }, isBeta);
1224
+ for (let i = 0; i < text.length; i += chunkSize) {
1225
+ if (ws.isClosed) break;
1226
+ const chunkDelay = calculateDelay(eventIndex, void 0, latency, recordedTimings, replaySpeed);
1227
+ if (chunkDelay > 0) await delay(chunkDelay, interruption?.signal);
1228
+ if (interruption?.signal.aborted) {
1229
+ interrupted = true;
1230
+ break;
1231
+ }
1232
+ if (ws.isClosed) break;
1233
+ const chunk = text.slice(i, i + chunkSize);
1234
+ try {
1235
+ sendEvent(ws, {
1236
+ type: "response.output_text.delta",
1237
+ response_id: responseId,
1238
+ item_id: textItemId,
1239
+ output_index: outputIndex,
1240
+ content_index: contentIndex,
1241
+ delta: chunk
1242
+ }, isBeta);
1243
+ } catch (err) {
1244
+ defaults.logger.debug("[ws-realtime] send failed during block text streaming, closing", err);
1245
+ break;
1246
+ }
1247
+ eventIndex++;
1248
+ interruption?.tick();
1249
+ if (interruption?.signal.aborted) {
1250
+ interrupted = true;
1251
+ break;
1252
+ }
1253
+ }
1254
+ if (interrupted || ws.isClosed) break;
1255
+ sendEvent(ws, {
1256
+ type: "response.output_text.done",
1257
+ response_id: responseId,
1258
+ item_id: textItemId,
1259
+ output_index: outputIndex,
1260
+ content_index: contentIndex,
1261
+ text
1262
+ }, isBeta);
1263
+ if (ws.isClosed) break;
1264
+ sendEvent(ws, {
1265
+ type: "response.content_part.done",
1266
+ response_id: responseId,
1267
+ item_id: textItemId,
1268
+ output_index: outputIndex,
1269
+ content_index: contentIndex,
1270
+ part: {
1271
+ type: "output_text",
1272
+ text
1273
+ }
1274
+ }, isBeta);
1275
+ if (ws.isClosed) break;
1276
+ sendEvent(ws, {
1277
+ type: "response.output_item.done",
1278
+ response_id: responseId,
1279
+ output_index: outputIndex,
1280
+ item: {
1281
+ ...textOutputItem,
1282
+ phase: textPhase
1283
+ }
1284
+ }, isBeta);
1285
+ sendEvent(ws, {
1286
+ type: "conversation.item.done",
1287
+ item: {
1288
+ id: textItemId,
1289
+ object: "realtime.item",
1290
+ type: "message",
1291
+ role: "assistant",
1292
+ status: "completed",
1293
+ content: textOutputItem.content
1294
+ }
1295
+ }, isBeta);
1296
+ if (ws.isClosed) break;
1297
+ allOutputItems.push(textOutputItem);
1298
+ } else {
1299
+ const callId = block.id ?? generateToolCallId();
1300
+ const itemId = realtimeId("item");
1301
+ const args = block.arguments;
1302
+ const toolOutputItem = {
1303
+ id: itemId,
1304
+ type: "function_call",
1305
+ status: "completed",
1306
+ call_id: callId,
1307
+ name: block.name,
1308
+ arguments: args
1309
+ };
1310
+ sendEvent(ws, {
1311
+ type: "response.output_item.added",
1312
+ response_id: responseId,
1313
+ output_index: outputIndex,
1314
+ item: {
1315
+ id: itemId,
1316
+ type: "function_call",
1317
+ status: "in_progress",
1318
+ call_id: callId,
1319
+ name: block.name,
1320
+ arguments: "",
1321
+ phase: "final_answer"
1322
+ }
1323
+ }, isBeta);
1324
+ for (let i = 0; i < args.length; i += chunkSize) {
1325
+ if (ws.isClosed) break;
1326
+ const chunkDelay = calculateDelay(eventIndex, void 0, latency, recordedTimings, replaySpeed);
1327
+ if (chunkDelay > 0) await delay(chunkDelay, interruption?.signal);
1328
+ if (interruption?.signal.aborted) {
1329
+ interrupted = true;
1330
+ break;
1331
+ }
1332
+ if (ws.isClosed) break;
1333
+ const chunk = args.slice(i, i + chunkSize);
1334
+ try {
1335
+ sendEvent(ws, {
1336
+ type: "response.function_call_arguments.delta",
1337
+ response_id: responseId,
1338
+ item_id: itemId,
1339
+ output_index: outputIndex,
1340
+ call_id: callId,
1341
+ delta: chunk
1342
+ }, isBeta);
1343
+ } catch (err) {
1344
+ defaults.logger.debug("[ws-realtime] send failed during block tool call streaming, closing", err);
1345
+ break;
1346
+ }
1347
+ eventIndex++;
1348
+ interruption?.tick();
1349
+ if (interruption?.signal.aborted) {
1350
+ interrupted = true;
1351
+ break;
1352
+ }
1353
+ }
1354
+ if (interrupted || ws.isClosed) break;
1355
+ sendEvent(ws, {
1356
+ type: "response.function_call_arguments.done",
1357
+ response_id: responseId,
1358
+ item_id: itemId,
1359
+ output_index: outputIndex,
1360
+ call_id: callId,
1361
+ arguments: args
1362
+ }, isBeta);
1363
+ if (ws.isClosed) break;
1364
+ sendEvent(ws, {
1365
+ type: "response.output_item.done",
1366
+ response_id: responseId,
1367
+ output_index: outputIndex,
1368
+ item: {
1369
+ ...toolOutputItem,
1370
+ phase: "final_answer"
1371
+ }
1372
+ }, isBeta);
1373
+ sendEvent(ws, {
1374
+ type: "conversation.item.done",
1375
+ item: {
1376
+ id: itemId,
1377
+ object: "realtime.item",
1378
+ type: "function_call",
1379
+ status: "completed",
1380
+ call_id: callId,
1381
+ name: block.name,
1382
+ arguments: args
1383
+ }
1384
+ }, isBeta);
1385
+ if (ws.isClosed) break;
1386
+ allOutputItems.push(toolOutputItem);
1387
+ }
1388
+ }
1389
+ if (interrupted) {
1390
+ ws.destroy();
1391
+ journalEntry.response.interrupted = true;
1392
+ journalEntry.response.interruptReason = interruption?.reason();
1393
+ interruption?.cleanup();
1394
+ return;
1395
+ }
1396
+ interruption?.cleanup();
1397
+ if (ws.isClosed) return;
1398
+ sendEvent(ws, {
1399
+ type: "response.done",
1400
+ response: {
1401
+ id: responseId,
1402
+ object: "realtime.response",
1403
+ status: "completed",
1404
+ output: allOutputItems,
1405
+ usage: {
1406
+ total_tokens: 0,
1407
+ input_tokens: 0,
1408
+ output_tokens: 0
1409
+ }
1410
+ }
1411
+ }, isBeta);
1412
+ for (const item of allOutputItems) {
1413
+ const it = item;
1414
+ if (it.type === "message") conversationItems.push({
1415
+ type: "message",
1416
+ id: it.id,
1417
+ role: "assistant",
1418
+ content: [{
1419
+ type: "text",
1420
+ text: it.content?.[0]?.text ?? ""
1421
+ }]
1422
+ });
1423
+ else conversationItems.push(item);
1424
+ }
1425
+ }
1149
1426
 
1150
1427
  //#endregion
1151
1428
  export { handleWebSocketRealtime };