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