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

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.
@@ -213,6 +213,12 @@ function toGeminiSchema(rf) {
213
213
  GEMINI_UNSUPPORTED_KEYS
214
214
  );
215
215
  }
216
+ function parameterToGeminiSchema(param) {
217
+ return stripSchemaKeys(
218
+ parameterToJsonSchema(param),
219
+ GEMINI_UNSUPPORTED_KEYS
220
+ );
221
+ }
216
222
  function toOllamaFormat(rf) {
217
223
  if (!rf) return void 0;
218
224
  if (rf.type === "json_object") return "json";
@@ -1188,11 +1194,7 @@ var AnthropicAdapter = class {
1188
1194
  properties: action.parameters ? Object.fromEntries(
1189
1195
  Object.entries(action.parameters).map(([key, param]) => [
1190
1196
  key,
1191
- {
1192
- type: param.type,
1193
- description: param.description,
1194
- enum: param.enum
1195
- }
1197
+ parameterToJsonSchema(param)
1196
1198
  ])
1197
1199
  ) : {},
1198
1200
  required: action.parameters ? Object.entries(action.parameters).filter(([, param]) => param.required).map(([key]) => key) : []
@@ -1305,6 +1307,11 @@ var AnthropicAdapter = class {
1305
1307
  content,
1306
1308
  toolCalls,
1307
1309
  thinking: thinking || void 0,
1310
+ usage: response.usage ? {
1311
+ promptTokens: response.usage.input_tokens ?? 0,
1312
+ completionTokens: response.usage.output_tokens ?? 0,
1313
+ totalTokens: (response.usage.input_tokens ?? 0) + (response.usage.output_tokens ?? 0)
1314
+ } : void 0,
1308
1315
  rawResponse: response
1309
1316
  };
1310
1317
  } catch (error) {
@@ -1823,11 +1830,7 @@ function formatToolsForGemini(actions) {
1823
1830
  properties: Object.fromEntries(
1824
1831
  Object.entries(action.parameters).map(([key, param]) => [
1825
1832
  key,
1826
- {
1827
- type: param.type,
1828
- description: param.description,
1829
- enum: param.enum
1830
- }
1833
+ parameterToGeminiSchema(param)
1831
1834
  ])
1832
1835
  ),
1833
1836
  required: Object.entries(action.parameters).filter(([, param]) => param.required).map(([key]) => key)
@@ -2163,6 +2166,11 @@ var GoogleAdapter = class {
2163
2166
  return {
2164
2167
  content: textContent,
2165
2168
  toolCalls,
2169
+ usage: response.usageMetadata ? {
2170
+ promptTokens: response.usageMetadata.promptTokenCount ?? 0,
2171
+ completionTokens: (response.usageMetadata.candidatesTokenCount ?? 0) + (response.usageMetadata.thoughtsTokenCount ?? 0),
2172
+ totalTokens: response.usageMetadata.totalTokenCount ?? 0
2173
+ } : void 0,
2166
2174
  rawResponse: response
2167
2175
  };
2168
2176
  }
@@ -2391,6 +2399,11 @@ var AzureAdapter = class {
2391
2399
  return {
2392
2400
  content: message?.content || "",
2393
2401
  toolCalls,
2402
+ usage: response.usage ? {
2403
+ promptTokens: response.usage.prompt_tokens ?? 0,
2404
+ completionTokens: response.usage.completion_tokens ?? 0,
2405
+ totalTokens: response.usage.total_tokens ?? (response.usage.prompt_tokens ?? 0) + (response.usage.completion_tokens ?? 0)
2406
+ } : void 0,
2394
2407
  rawResponse: response
2395
2408
  };
2396
2409
  }
@@ -211,6 +211,12 @@ function toGeminiSchema(rf) {
211
211
  GEMINI_UNSUPPORTED_KEYS
212
212
  );
213
213
  }
214
+ function parameterToGeminiSchema(param) {
215
+ return stripSchemaKeys(
216
+ parameterToJsonSchema(param),
217
+ GEMINI_UNSUPPORTED_KEYS
218
+ );
219
+ }
214
220
  function toOllamaFormat(rf) {
215
221
  if (!rf) return void 0;
216
222
  if (rf.type === "json_object") return "json";
@@ -1186,11 +1192,7 @@ var AnthropicAdapter = class {
1186
1192
  properties: action.parameters ? Object.fromEntries(
1187
1193
  Object.entries(action.parameters).map(([key, param]) => [
1188
1194
  key,
1189
- {
1190
- type: param.type,
1191
- description: param.description,
1192
- enum: param.enum
1193
- }
1195
+ parameterToJsonSchema(param)
1194
1196
  ])
1195
1197
  ) : {},
1196
1198
  required: action.parameters ? Object.entries(action.parameters).filter(([, param]) => param.required).map(([key]) => key) : []
@@ -1303,6 +1305,11 @@ var AnthropicAdapter = class {
1303
1305
  content,
1304
1306
  toolCalls,
1305
1307
  thinking: thinking || void 0,
1308
+ usage: response.usage ? {
1309
+ promptTokens: response.usage.input_tokens ?? 0,
1310
+ completionTokens: response.usage.output_tokens ?? 0,
1311
+ totalTokens: (response.usage.input_tokens ?? 0) + (response.usage.output_tokens ?? 0)
1312
+ } : void 0,
1306
1313
  rawResponse: response
1307
1314
  };
1308
1315
  } catch (error) {
@@ -1821,11 +1828,7 @@ function formatToolsForGemini(actions) {
1821
1828
  properties: Object.fromEntries(
1822
1829
  Object.entries(action.parameters).map(([key, param]) => [
1823
1830
  key,
1824
- {
1825
- type: param.type,
1826
- description: param.description,
1827
- enum: param.enum
1828
- }
1831
+ parameterToGeminiSchema(param)
1829
1832
  ])
1830
1833
  ),
1831
1834
  required: Object.entries(action.parameters).filter(([, param]) => param.required).map(([key]) => key)
@@ -2161,6 +2164,11 @@ var GoogleAdapter = class {
2161
2164
  return {
2162
2165
  content: textContent,
2163
2166
  toolCalls,
2167
+ usage: response.usageMetadata ? {
2168
+ promptTokens: response.usageMetadata.promptTokenCount ?? 0,
2169
+ completionTokens: (response.usageMetadata.candidatesTokenCount ?? 0) + (response.usageMetadata.thoughtsTokenCount ?? 0),
2170
+ totalTokens: response.usageMetadata.totalTokenCount ?? 0
2171
+ } : void 0,
2164
2172
  rawResponse: response
2165
2173
  };
2166
2174
  }
@@ -2389,6 +2397,11 @@ var AzureAdapter = class {
2389
2397
  return {
2390
2398
  content: message?.content || "",
2391
2399
  toolCalls,
2400
+ usage: response.usage ? {
2401
+ promptTokens: response.usage.prompt_tokens ?? 0,
2402
+ completionTokens: response.usage.completion_tokens ?? 0,
2403
+ totalTokens: response.usage.total_tokens ?? (response.usage.prompt_tokens ?? 0) + (response.usage.completion_tokens ?? 0)
2404
+ } : void 0,
2392
2405
  rawResponse: response
2393
2406
  };
2394
2407
  }
package/dist/index.d.mts CHANGED
@@ -1001,7 +1001,7 @@ declare class Runtime {
1001
1001
  * 5. Loop continues until no more tool calls or max iterations reached
1002
1002
  * 6. Returns all new messages in the done event for client to append
1003
1003
  */
1004
- processChatWithLoop(request: ChatRequest, signal?: AbortSignal, _accumulatedMessages?: DoneEventMessage[], _isRecursive?: boolean, _httpRequest?: Request, _toolSearchState?: ToolSearchState): AsyncGenerator<StreamEvent>;
1004
+ processChatWithLoop(request: ChatRequest, signal?: AbortSignal, _accumulatedMessages?: DoneEventMessage[], _isRecursive?: boolean, _httpRequest?: Request, _toolSearchState?: ToolSearchState, _iteration?: number): AsyncGenerator<StreamEvent>;
1005
1005
  /**
1006
1006
  * Non-streaming agent loop implementation
1007
1007
  *
package/dist/index.d.ts CHANGED
@@ -1001,7 +1001,7 @@ declare class Runtime {
1001
1001
  * 5. Loop continues until no more tool calls or max iterations reached
1002
1002
  * 6. Returns all new messages in the done event for client to append
1003
1003
  */
1004
- processChatWithLoop(request: ChatRequest, signal?: AbortSignal, _accumulatedMessages?: DoneEventMessage[], _isRecursive?: boolean, _httpRequest?: Request, _toolSearchState?: ToolSearchState): AsyncGenerator<StreamEvent>;
1004
+ processChatWithLoop(request: ChatRequest, signal?: AbortSignal, _accumulatedMessages?: DoneEventMessage[], _isRecursive?: boolean, _httpRequest?: Request, _toolSearchState?: ToolSearchState, _iteration?: number): AsyncGenerator<StreamEvent>;
1005
1005
  /**
1006
1006
  * Non-streaming agent loop implementation
1007
1007
  *
package/dist/index.js CHANGED
@@ -2112,7 +2112,7 @@ var Runtime = class {
2112
2112
  * 5. Loop continues until no more tool calls or max iterations reached
2113
2113
  * 6. Returns all new messages in the done event for client to append
2114
2114
  */
2115
- async *processChatWithLoop(request, signal, _accumulatedMessages, _isRecursive, _httpRequest, _toolSearchState) {
2115
+ async *processChatWithLoop(request, signal, _accumulatedMessages, _isRecursive, _httpRequest, _toolSearchState, _iteration = 0) {
2116
2116
  const debug = this.config.debug;
2117
2117
  if (request.streaming === false) {
2118
2118
  if (debug) {
@@ -2131,7 +2131,25 @@ var Runtime = class {
2131
2131
  return;
2132
2132
  }
2133
2133
  const newMessages = _accumulatedMessages || [];
2134
- this.config.maxIterations ?? 20;
2134
+ const maxIterations = this.config.maxIterations ?? 20;
2135
+ if (signal?.aborted) {
2136
+ yield {
2137
+ type: "error",
2138
+ message: "Aborted",
2139
+ code: "ABORTED"
2140
+ };
2141
+ return;
2142
+ }
2143
+ if (_iteration >= maxIterations) {
2144
+ if (debug) {
2145
+ console.log(`[Copilot SDK] Max iterations (${maxIterations}) reached`);
2146
+ }
2147
+ yield {
2148
+ type: "done",
2149
+ messages: newMessages.length > 0 ? newMessages : void 0
2150
+ };
2151
+ return;
2152
+ }
2135
2153
  const allTools = this.collectToolsForRequest(request);
2136
2154
  const nativeToolSearch = this.resolveNativeToolSearchForRequest(request);
2137
2155
  const nativeToolCatalog = nativeToolSearch ? this.buildNativeToolCatalogForRequest(request, allTools) : null;
@@ -2393,7 +2411,8 @@ var Runtime = class {
2393
2411
  true,
2394
2412
  // Mark as recursive
2395
2413
  _httpRequest,
2396
- nextToolSearchState
2414
+ nextToolSearchState,
2415
+ _iteration + 1
2397
2416
  )) {
2398
2417
  yield event;
2399
2418
  }
@@ -2490,7 +2509,9 @@ var Runtime = class {
2490
2509
  _accumulatedMessages,
2491
2510
  _isRecursive,
2492
2511
  _httpRequest,
2493
- toolSearchState
2512
+ toolSearchState,
2513
+ iteration
2514
+ // carry the non-streaming loop's depth into the streaming sub-call
2494
2515
  )) {
2495
2516
  yield event;
2496
2517
  }
package/dist/index.mjs CHANGED
@@ -2110,7 +2110,7 @@ var Runtime = class {
2110
2110
  * 5. Loop continues until no more tool calls or max iterations reached
2111
2111
  * 6. Returns all new messages in the done event for client to append
2112
2112
  */
2113
- async *processChatWithLoop(request, signal, _accumulatedMessages, _isRecursive, _httpRequest, _toolSearchState) {
2113
+ async *processChatWithLoop(request, signal, _accumulatedMessages, _isRecursive, _httpRequest, _toolSearchState, _iteration = 0) {
2114
2114
  const debug = this.config.debug;
2115
2115
  if (request.streaming === false) {
2116
2116
  if (debug) {
@@ -2129,7 +2129,25 @@ var Runtime = class {
2129
2129
  return;
2130
2130
  }
2131
2131
  const newMessages = _accumulatedMessages || [];
2132
- this.config.maxIterations ?? 20;
2132
+ const maxIterations = this.config.maxIterations ?? 20;
2133
+ if (signal?.aborted) {
2134
+ yield {
2135
+ type: "error",
2136
+ message: "Aborted",
2137
+ code: "ABORTED"
2138
+ };
2139
+ return;
2140
+ }
2141
+ if (_iteration >= maxIterations) {
2142
+ if (debug) {
2143
+ console.log(`[Copilot SDK] Max iterations (${maxIterations}) reached`);
2144
+ }
2145
+ yield {
2146
+ type: "done",
2147
+ messages: newMessages.length > 0 ? newMessages : void 0
2148
+ };
2149
+ return;
2150
+ }
2133
2151
  const allTools = this.collectToolsForRequest(request);
2134
2152
  const nativeToolSearch = this.resolveNativeToolSearchForRequest(request);
2135
2153
  const nativeToolCatalog = nativeToolSearch ? this.buildNativeToolCatalogForRequest(request, allTools) : null;
@@ -2391,7 +2409,8 @@ var Runtime = class {
2391
2409
  true,
2392
2410
  // Mark as recursive
2393
2411
  _httpRequest,
2394
- nextToolSearchState
2412
+ nextToolSearchState,
2413
+ _iteration + 1
2395
2414
  )) {
2396
2415
  yield event;
2397
2416
  }
@@ -2488,7 +2507,9 @@ var Runtime = class {
2488
2507
  _accumulatedMessages,
2489
2508
  _isRecursive,
2490
2509
  _httpRequest,
2491
- toolSearchState
2510
+ toolSearchState,
2511
+ iteration
2512
+ // carry the non-streaming loop's depth into the streaming sub-call
2492
2513
  )) {
2493
2514
  yield event;
2494
2515
  }
@@ -39,6 +39,34 @@ ${stringifyForDebug(payload)}`
39
39
  );
40
40
  }
41
41
  }
42
+ function parameterToJsonSchema(param) {
43
+ const schema = {
44
+ type: param.type
45
+ };
46
+ if (param.description) {
47
+ schema.description = param.description;
48
+ }
49
+ if (param.enum) {
50
+ schema.enum = param.enum;
51
+ }
52
+ if (param.type === "array" && param.items) {
53
+ schema.items = parameterToJsonSchema(
54
+ param.items
55
+ );
56
+ }
57
+ if (param.type === "object" && param.properties) {
58
+ schema.properties = Object.fromEntries(
59
+ Object.entries(param.properties).map(([key, prop]) => [
60
+ key,
61
+ parameterToJsonSchema(
62
+ prop
63
+ )
64
+ ])
65
+ );
66
+ schema.additionalProperties = false;
67
+ }
68
+ return schema;
69
+ }
42
70
  function stripSchemaKeys(schema, keysToDrop, options = {}) {
43
71
  if (Array.isArray(schema)) {
44
72
  return schema.map((item) => stripSchemaKeys(item, keysToDrop, options));
@@ -863,11 +891,7 @@ var AnthropicAdapter = class {
863
891
  properties: action.parameters ? Object.fromEntries(
864
892
  Object.entries(action.parameters).map(([key, param]) => [
865
893
  key,
866
- {
867
- type: param.type,
868
- description: param.description,
869
- enum: param.enum
870
- }
894
+ parameterToJsonSchema(param)
871
895
  ])
872
896
  ) : {},
873
897
  required: action.parameters ? Object.entries(action.parameters).filter(([, param]) => param.required).map(([key]) => key) : []
@@ -980,6 +1004,11 @@ var AnthropicAdapter = class {
980
1004
  content,
981
1005
  toolCalls,
982
1006
  thinking: thinking || void 0,
1007
+ usage: response.usage ? {
1008
+ promptTokens: response.usage.input_tokens ?? 0,
1009
+ completionTokens: response.usage.output_tokens ?? 0,
1010
+ totalTokens: (response.usage.input_tokens ?? 0) + (response.usage.output_tokens ?? 0)
1011
+ } : void 0,
983
1012
  rawResponse: response
984
1013
  };
985
1014
  } catch (error) {
@@ -37,6 +37,34 @@ ${stringifyForDebug(payload)}`
37
37
  );
38
38
  }
39
39
  }
40
+ function parameterToJsonSchema(param) {
41
+ const schema = {
42
+ type: param.type
43
+ };
44
+ if (param.description) {
45
+ schema.description = param.description;
46
+ }
47
+ if (param.enum) {
48
+ schema.enum = param.enum;
49
+ }
50
+ if (param.type === "array" && param.items) {
51
+ schema.items = parameterToJsonSchema(
52
+ param.items
53
+ );
54
+ }
55
+ if (param.type === "object" && param.properties) {
56
+ schema.properties = Object.fromEntries(
57
+ Object.entries(param.properties).map(([key, prop]) => [
58
+ key,
59
+ parameterToJsonSchema(
60
+ prop
61
+ )
62
+ ])
63
+ );
64
+ schema.additionalProperties = false;
65
+ }
66
+ return schema;
67
+ }
40
68
  function stripSchemaKeys(schema, keysToDrop, options = {}) {
41
69
  if (Array.isArray(schema)) {
42
70
  return schema.map((item) => stripSchemaKeys(item, keysToDrop, options));
@@ -861,11 +889,7 @@ var AnthropicAdapter = class {
861
889
  properties: action.parameters ? Object.fromEntries(
862
890
  Object.entries(action.parameters).map(([key, param]) => [
863
891
  key,
864
- {
865
- type: param.type,
866
- description: param.description,
867
- enum: param.enum
868
- }
892
+ parameterToJsonSchema(param)
869
893
  ])
870
894
  ) : {},
871
895
  required: action.parameters ? Object.entries(action.parameters).filter(([, param]) => param.required).map(([key]) => key) : []
@@ -978,6 +1002,11 @@ var AnthropicAdapter = class {
978
1002
  content,
979
1003
  toolCalls,
980
1004
  thinking: thinking || void 0,
1005
+ usage: response.usage ? {
1006
+ promptTokens: response.usage.input_tokens ?? 0,
1007
+ completionTokens: response.usage.output_tokens ?? 0,
1008
+ totalTokens: (response.usage.input_tokens ?? 0) + (response.usage.output_tokens ?? 0)
1009
+ } : void 0,
981
1010
  rawResponse: response
982
1011
  };
983
1012
  } catch (error) {
@@ -419,6 +419,11 @@ var AzureAdapter = class {
419
419
  return {
420
420
  content: message?.content || "",
421
421
  toolCalls,
422
+ usage: response.usage ? {
423
+ promptTokens: response.usage.prompt_tokens ?? 0,
424
+ completionTokens: response.usage.completion_tokens ?? 0,
425
+ totalTokens: response.usage.total_tokens ?? (response.usage.prompt_tokens ?? 0) + (response.usage.completion_tokens ?? 0)
426
+ } : void 0,
422
427
  rawResponse: response
423
428
  };
424
429
  }
@@ -417,6 +417,11 @@ var AzureAdapter = class {
417
417
  return {
418
418
  content: message?.content || "",
419
419
  toolCalls,
420
+ usage: response.usage ? {
421
+ promptTokens: response.usage.prompt_tokens ?? 0,
422
+ completionTokens: response.usage.completion_tokens ?? 0,
423
+ totalTokens: response.usage.total_tokens ?? (response.usage.prompt_tokens ?? 0) + (response.usage.completion_tokens ?? 0)
424
+ } : void 0,
420
425
  rawResponse: response
421
426
  };
422
427
  }
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@yourgpt/llm-sdk",
3
- "version": "2.5.1-beta.3",
3
+ "version": "2.5.1-beta.5",
4
4
  "description": "AI SDK for building AI Agents with any LLM",
5
5
  "main": "./dist/index.js",
6
6
  "module": "./dist/index.mjs",