@yourgpt/llm-sdk 2.5.1-beta.5 → 2.5.1-beta.6

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 (3) hide show
  1. package/dist/index.js +109 -25
  2. package/dist/index.mjs +109 -25
  3. package/package.json +1 -1
package/dist/index.js CHANGED
@@ -1052,6 +1052,14 @@ var StreamResult = class {
1052
1052
  }
1053
1053
  if (event.requiresAction) {
1054
1054
  collected.requiresAction = true;
1055
+ const resolvedToolIds = new Set(
1056
+ (event.messages ?? []).filter((m) => m.role === "tool" && m.tool_call_id).map((m) => m.tool_call_id)
1057
+ );
1058
+ if (resolvedToolIds.size > 0) {
1059
+ collected.toolCalls = collected.toolCalls.filter(
1060
+ (tc) => !resolvedToolIds.has(tc.id)
1061
+ );
1062
+ }
1055
1063
  }
1056
1064
  if (event.usage) {
1057
1065
  this.capturedUsage = event.usage;
@@ -2353,6 +2361,49 @@ var Runtime = class {
2353
2361
  const clientToolCalls = toolCalls.filter(
2354
2362
  (tc) => !serverToolIds.has(tc.id)
2355
2363
  );
2364
+ const serverToolResultMessages = serverToolResults.map((tr) => {
2365
+ const aiContent = buildToolResultForAI(tr.tool, tr.result, tr.args);
2366
+ const content = typeof aiContent === "string" ? aiContent : JSON.stringify(serializeToolResultContent(aiContent));
2367
+ return {
2368
+ role: "tool",
2369
+ content,
2370
+ tool_call_id: tr.id
2371
+ };
2372
+ });
2373
+ if (serverToolResults.length > 0 && clientToolCalls.length > 0) {
2374
+ if (debug) {
2375
+ console.log(
2376
+ `[Copilot SDK] Mixed turn: ${serverToolResults.length} server + ${clientToolCalls.length} client tool(s). Suspending for client tools.`
2377
+ );
2378
+ }
2379
+ const assistantMessage = {
2380
+ role: "assistant",
2381
+ content: accumulatedText || null,
2382
+ tool_calls: toolCalls.map((tc) => ({
2383
+ id: tc.id,
2384
+ type: "function",
2385
+ function: {
2386
+ name: tc.name,
2387
+ arguments: JSON.stringify(tc.args)
2388
+ },
2389
+ ...tc.extra_content ? { extra_content: tc.extra_content } : {}
2390
+ }))
2391
+ };
2392
+ newMessages.push(assistantMessage);
2393
+ newMessages.push(...serverToolResultMessages);
2394
+ yield {
2395
+ type: "tool_calls",
2396
+ toolCalls: clientToolCalls,
2397
+ assistantMessage
2398
+ };
2399
+ yield {
2400
+ type: "done",
2401
+ requiresAction: true,
2402
+ messages: newMessages,
2403
+ usage: adapterUsage
2404
+ };
2405
+ return;
2406
+ }
2356
2407
  if (serverToolResults.length > 0) {
2357
2408
  if (debug) {
2358
2409
  console.log(
@@ -2375,17 +2426,7 @@ var Runtime = class {
2375
2426
  };
2376
2427
  })
2377
2428
  };
2378
- const toolResultMessages = serverToolResults.map(
2379
- (tr) => {
2380
- const aiContent = buildToolResultForAI(tr.tool, tr.result, tr.args);
2381
- const content = typeof aiContent === "string" ? aiContent : JSON.stringify(serializeToolResultContent(aiContent));
2382
- return {
2383
- role: "tool",
2384
- content,
2385
- tool_call_id: tr.id
2386
- };
2387
- }
2388
- );
2429
+ const toolResultMessages = serverToolResultMessages;
2389
2430
  newMessages.push(assistantWithToolCalls);
2390
2431
  newMessages.push(...toolResultMessages);
2391
2432
  const messagesWithResults = [
@@ -2640,6 +2681,48 @@ var Runtime = class {
2640
2681
  }
2641
2682
  }
2642
2683
  }
2684
+ const serverToolResultMessages = serverToolResults.map((tr) => {
2685
+ const aiContent = buildToolResultForAI(
2686
+ tr.tool,
2687
+ tr.result,
2688
+ tr.args
2689
+ );
2690
+ const content = typeof aiContent === "string" ? aiContent : JSON.stringify(serializeToolResultContent(aiContent));
2691
+ return {
2692
+ role: "tool",
2693
+ content,
2694
+ tool_call_id: tr.id
2695
+ };
2696
+ });
2697
+ if (serverToolResults.length > 0 && clientToolCalls.length > 0) {
2698
+ const assistantMessage = {
2699
+ role: "assistant",
2700
+ content: result.content || null,
2701
+ tool_calls: result.toolCalls.map((tc) => ({
2702
+ id: tc.id,
2703
+ type: "function",
2704
+ function: {
2705
+ name: tc.name,
2706
+ arguments: JSON.stringify(tc.args)
2707
+ },
2708
+ ...tc.extra_content ? { extra_content: tc.extra_content } : {}
2709
+ }))
2710
+ };
2711
+ newMessages.push(assistantMessage);
2712
+ newMessages.push(...serverToolResultMessages);
2713
+ yield {
2714
+ type: "tool_calls",
2715
+ toolCalls: clientToolCalls,
2716
+ assistantMessage
2717
+ };
2718
+ yield {
2719
+ type: "done",
2720
+ requiresAction: true,
2721
+ messages: newMessages,
2722
+ usage: accumulatedUsage.total_tokens > 0 ? accumulatedUsage : void 0
2723
+ };
2724
+ return;
2725
+ }
2643
2726
  if (serverToolResults.length > 0) {
2644
2727
  const assistantWithToolCalls = {
2645
2728
  role: "assistant",
@@ -2654,19 +2737,7 @@ var Runtime = class {
2654
2737
  ...tc.extra_content ? { extra_content: tc.extra_content } : {}
2655
2738
  }))
2656
2739
  };
2657
- const toolResultMessages = serverToolResults.map((tr) => {
2658
- const aiContent = buildToolResultForAI(
2659
- tr.tool,
2660
- tr.result,
2661
- tr.args
2662
- );
2663
- const content = typeof aiContent === "string" ? aiContent : JSON.stringify(serializeToolResultContent(aiContent));
2664
- return {
2665
- role: "tool",
2666
- content,
2667
- tool_call_id: tr.id
2668
- };
2669
- });
2740
+ const toolResultMessages = serverToolResultMessages;
2670
2741
  newMessages.push(assistantWithToolCalls);
2671
2742
  newMessages.push(...toolResultMessages);
2672
2743
  conversationMessages = [
@@ -3005,10 +3076,23 @@ var Runtime = class {
3005
3076
  result: event.result || event.error
3006
3077
  });
3007
3078
  break;
3008
- case "done":
3079
+ case "done": {
3009
3080
  messages = event.messages || [];
3010
3081
  requiresAction = event.requiresAction || false;
3082
+ if (requiresAction) {
3083
+ const resolvedToolIds = new Set(
3084
+ messages.filter((m) => m.role === "tool" && m.tool_call_id).map((m) => m.tool_call_id)
3085
+ );
3086
+ if (resolvedToolIds.size > 0) {
3087
+ for (let i = toolCalls.length - 1; i >= 0; i--) {
3088
+ if (resolvedToolIds.has(toolCalls[i].id)) {
3089
+ toolCalls.splice(i, 1);
3090
+ }
3091
+ }
3092
+ }
3093
+ }
3011
3094
  break;
3095
+ }
3012
3096
  case "error":
3013
3097
  error = { message: event.message, code: event.code };
3014
3098
  break;
package/dist/index.mjs CHANGED
@@ -1050,6 +1050,14 @@ var StreamResult = class {
1050
1050
  }
1051
1051
  if (event.requiresAction) {
1052
1052
  collected.requiresAction = true;
1053
+ const resolvedToolIds = new Set(
1054
+ (event.messages ?? []).filter((m) => m.role === "tool" && m.tool_call_id).map((m) => m.tool_call_id)
1055
+ );
1056
+ if (resolvedToolIds.size > 0) {
1057
+ collected.toolCalls = collected.toolCalls.filter(
1058
+ (tc) => !resolvedToolIds.has(tc.id)
1059
+ );
1060
+ }
1053
1061
  }
1054
1062
  if (event.usage) {
1055
1063
  this.capturedUsage = event.usage;
@@ -2351,6 +2359,49 @@ var Runtime = class {
2351
2359
  const clientToolCalls = toolCalls.filter(
2352
2360
  (tc) => !serverToolIds.has(tc.id)
2353
2361
  );
2362
+ const serverToolResultMessages = serverToolResults.map((tr) => {
2363
+ const aiContent = buildToolResultForAI(tr.tool, tr.result, tr.args);
2364
+ const content = typeof aiContent === "string" ? aiContent : JSON.stringify(serializeToolResultContent(aiContent));
2365
+ return {
2366
+ role: "tool",
2367
+ content,
2368
+ tool_call_id: tr.id
2369
+ };
2370
+ });
2371
+ if (serverToolResults.length > 0 && clientToolCalls.length > 0) {
2372
+ if (debug) {
2373
+ console.log(
2374
+ `[Copilot SDK] Mixed turn: ${serverToolResults.length} server + ${clientToolCalls.length} client tool(s). Suspending for client tools.`
2375
+ );
2376
+ }
2377
+ const assistantMessage = {
2378
+ role: "assistant",
2379
+ content: accumulatedText || null,
2380
+ tool_calls: toolCalls.map((tc) => ({
2381
+ id: tc.id,
2382
+ type: "function",
2383
+ function: {
2384
+ name: tc.name,
2385
+ arguments: JSON.stringify(tc.args)
2386
+ },
2387
+ ...tc.extra_content ? { extra_content: tc.extra_content } : {}
2388
+ }))
2389
+ };
2390
+ newMessages.push(assistantMessage);
2391
+ newMessages.push(...serverToolResultMessages);
2392
+ yield {
2393
+ type: "tool_calls",
2394
+ toolCalls: clientToolCalls,
2395
+ assistantMessage
2396
+ };
2397
+ yield {
2398
+ type: "done",
2399
+ requiresAction: true,
2400
+ messages: newMessages,
2401
+ usage: adapterUsage
2402
+ };
2403
+ return;
2404
+ }
2354
2405
  if (serverToolResults.length > 0) {
2355
2406
  if (debug) {
2356
2407
  console.log(
@@ -2373,17 +2424,7 @@ var Runtime = class {
2373
2424
  };
2374
2425
  })
2375
2426
  };
2376
- const toolResultMessages = serverToolResults.map(
2377
- (tr) => {
2378
- const aiContent = buildToolResultForAI(tr.tool, tr.result, tr.args);
2379
- const content = typeof aiContent === "string" ? aiContent : JSON.stringify(serializeToolResultContent(aiContent));
2380
- return {
2381
- role: "tool",
2382
- content,
2383
- tool_call_id: tr.id
2384
- };
2385
- }
2386
- );
2427
+ const toolResultMessages = serverToolResultMessages;
2387
2428
  newMessages.push(assistantWithToolCalls);
2388
2429
  newMessages.push(...toolResultMessages);
2389
2430
  const messagesWithResults = [
@@ -2638,6 +2679,48 @@ var Runtime = class {
2638
2679
  }
2639
2680
  }
2640
2681
  }
2682
+ const serverToolResultMessages = serverToolResults.map((tr) => {
2683
+ const aiContent = buildToolResultForAI(
2684
+ tr.tool,
2685
+ tr.result,
2686
+ tr.args
2687
+ );
2688
+ const content = typeof aiContent === "string" ? aiContent : JSON.stringify(serializeToolResultContent(aiContent));
2689
+ return {
2690
+ role: "tool",
2691
+ content,
2692
+ tool_call_id: tr.id
2693
+ };
2694
+ });
2695
+ if (serverToolResults.length > 0 && clientToolCalls.length > 0) {
2696
+ const assistantMessage = {
2697
+ role: "assistant",
2698
+ content: result.content || null,
2699
+ tool_calls: result.toolCalls.map((tc) => ({
2700
+ id: tc.id,
2701
+ type: "function",
2702
+ function: {
2703
+ name: tc.name,
2704
+ arguments: JSON.stringify(tc.args)
2705
+ },
2706
+ ...tc.extra_content ? { extra_content: tc.extra_content } : {}
2707
+ }))
2708
+ };
2709
+ newMessages.push(assistantMessage);
2710
+ newMessages.push(...serverToolResultMessages);
2711
+ yield {
2712
+ type: "tool_calls",
2713
+ toolCalls: clientToolCalls,
2714
+ assistantMessage
2715
+ };
2716
+ yield {
2717
+ type: "done",
2718
+ requiresAction: true,
2719
+ messages: newMessages,
2720
+ usage: accumulatedUsage.total_tokens > 0 ? accumulatedUsage : void 0
2721
+ };
2722
+ return;
2723
+ }
2641
2724
  if (serverToolResults.length > 0) {
2642
2725
  const assistantWithToolCalls = {
2643
2726
  role: "assistant",
@@ -2652,19 +2735,7 @@ var Runtime = class {
2652
2735
  ...tc.extra_content ? { extra_content: tc.extra_content } : {}
2653
2736
  }))
2654
2737
  };
2655
- const toolResultMessages = serverToolResults.map((tr) => {
2656
- const aiContent = buildToolResultForAI(
2657
- tr.tool,
2658
- tr.result,
2659
- tr.args
2660
- );
2661
- const content = typeof aiContent === "string" ? aiContent : JSON.stringify(serializeToolResultContent(aiContent));
2662
- return {
2663
- role: "tool",
2664
- content,
2665
- tool_call_id: tr.id
2666
- };
2667
- });
2738
+ const toolResultMessages = serverToolResultMessages;
2668
2739
  newMessages.push(assistantWithToolCalls);
2669
2740
  newMessages.push(...toolResultMessages);
2670
2741
  conversationMessages = [
@@ -3003,10 +3074,23 @@ var Runtime = class {
3003
3074
  result: event.result || event.error
3004
3075
  });
3005
3076
  break;
3006
- case "done":
3077
+ case "done": {
3007
3078
  messages = event.messages || [];
3008
3079
  requiresAction = event.requiresAction || false;
3080
+ if (requiresAction) {
3081
+ const resolvedToolIds = new Set(
3082
+ messages.filter((m) => m.role === "tool" && m.tool_call_id).map((m) => m.tool_call_id)
3083
+ );
3084
+ if (resolvedToolIds.size > 0) {
3085
+ for (let i = toolCalls.length - 1; i >= 0; i--) {
3086
+ if (resolvedToolIds.has(toolCalls[i].id)) {
3087
+ toolCalls.splice(i, 1);
3088
+ }
3089
+ }
3090
+ }
3091
+ }
3009
3092
  break;
3093
+ }
3010
3094
  case "error":
3011
3095
  error = { message: event.message, code: event.code };
3012
3096
  break;
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@yourgpt/llm-sdk",
3
- "version": "2.5.1-beta.5",
3
+ "version": "2.5.1-beta.6",
4
4
  "description": "AI SDK for building AI Agents with any LLM",
5
5
  "main": "./dist/index.js",
6
6
  "module": "./dist/index.mjs",