@yourgpt/llm-sdk 2.5.0 → 2.5.1-beta.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 (59) hide show
  1. package/dist/adapters/index.d.mts +4 -4
  2. package/dist/adapters/index.d.ts +4 -4
  3. package/dist/adapters/index.js +156 -13
  4. package/dist/adapters/index.mjs +156 -13
  5. package/dist/base-C58Dsr9p.d.ts +259 -0
  6. package/dist/base-tNgbBaSo.d.mts +259 -0
  7. package/dist/fallback/index.d.mts +4 -4
  8. package/dist/fallback/index.d.ts +4 -4
  9. package/dist/index.d.mts +8 -7
  10. package/dist/index.d.ts +8 -7
  11. package/dist/index.js +12 -0
  12. package/dist/index.mjs +12 -0
  13. package/dist/providers/anthropic/index.d.mts +3 -3
  14. package/dist/providers/anthropic/index.d.ts +3 -3
  15. package/dist/providers/anthropic/index.js +271 -195
  16. package/dist/providers/anthropic/index.mjs +271 -195
  17. package/dist/providers/azure/index.d.mts +3 -3
  18. package/dist/providers/azure/index.d.ts +3 -3
  19. package/dist/providers/azure/index.js +49 -1
  20. package/dist/providers/azure/index.mjs +49 -1
  21. package/dist/providers/fireworks/index.d.mts +1 -1
  22. package/dist/providers/fireworks/index.d.ts +1 -1
  23. package/dist/providers/fireworks/index.js +56 -0
  24. package/dist/providers/fireworks/index.mjs +56 -0
  25. package/dist/providers/google/index.d.mts +3 -3
  26. package/dist/providers/google/index.d.ts +3 -3
  27. package/dist/providers/google/index.js +252 -205
  28. package/dist/providers/google/index.mjs +252 -205
  29. package/dist/providers/ollama/index.d.mts +4 -4
  30. package/dist/providers/ollama/index.d.ts +4 -4
  31. package/dist/providers/ollama/index.js +10 -2
  32. package/dist/providers/ollama/index.mjs +10 -2
  33. package/dist/providers/openai/index.d.mts +3 -3
  34. package/dist/providers/openai/index.d.ts +3 -3
  35. package/dist/providers/openai/index.js +267 -214
  36. package/dist/providers/openai/index.mjs +267 -214
  37. package/dist/providers/openrouter/index.d.mts +3 -3
  38. package/dist/providers/openrouter/index.d.ts +3 -3
  39. package/dist/providers/openrouter/index.js +257 -204
  40. package/dist/providers/openrouter/index.mjs +257 -204
  41. package/dist/providers/togetherai/index.d.mts +3 -3
  42. package/dist/providers/togetherai/index.d.ts +3 -3
  43. package/dist/providers/togetherai/index.js +257 -204
  44. package/dist/providers/togetherai/index.mjs +257 -204
  45. package/dist/providers/xai/index.d.mts +3 -3
  46. package/dist/providers/xai/index.d.ts +3 -3
  47. package/dist/providers/xai/index.js +256 -208
  48. package/dist/providers/xai/index.mjs +256 -208
  49. package/dist/{types-D4YfrQJR.d.mts → types-B6dhnguR.d.mts} +1 -1
  50. package/dist/{types-DRqxMIjF.d.mts → types-BQ31QIsA.d.ts} +2 -1
  51. package/dist/{types-BctsnC3g.d.ts → types-BSSiJW2o.d.mts} +2 -1
  52. package/dist/{base-D-U61JaB.d.mts → types-BkQCSiIt.d.mts} +388 -213
  53. package/dist/{base-iGi9Va6Z.d.ts → types-BkQCSiIt.d.ts} +388 -213
  54. package/dist/{types-38yolWJn.d.ts → types-CCxPmkmK.d.ts} +1 -1
  55. package/dist/yourgpt/index.d.mts +1 -1
  56. package/dist/yourgpt/index.d.ts +1 -1
  57. package/package.json +1 -1
  58. package/dist/types-CR8mi9I0.d.mts +0 -417
  59. package/dist/types-CR8mi9I0.d.ts +0 -417
@@ -1,5 +1,234 @@
1
1
  'use strict';
2
2
 
3
+ // src/adapters/base.ts
4
+ function stringifyForDebug(value) {
5
+ return JSON.stringify(
6
+ value,
7
+ (_key, currentValue) => {
8
+ if (typeof currentValue === "bigint") {
9
+ return currentValue.toString();
10
+ }
11
+ if (currentValue instanceof Error) {
12
+ return {
13
+ name: currentValue.name,
14
+ message: currentValue.message,
15
+ stack: currentValue.stack
16
+ };
17
+ }
18
+ return currentValue;
19
+ },
20
+ 2
21
+ );
22
+ }
23
+ function logProviderPayload(provider, label, payload, enabled) {
24
+ if (!enabled) {
25
+ return;
26
+ }
27
+ if (label.toLowerCase().includes("stream ")) {
28
+ return;
29
+ }
30
+ try {
31
+ console.log(
32
+ `[llm-sdk:${provider}] ${label}
33
+ ${stringifyForDebug(payload)}`
34
+ );
35
+ } catch (error) {
36
+ console.log(
37
+ `[llm-sdk:${provider}] ${label} (failed to stringify payload)`,
38
+ error
39
+ );
40
+ }
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
+ }
70
+ function normalizeObjectJsonSchema(schema) {
71
+ if (!schema || typeof schema !== "object") {
72
+ return {
73
+ type: "object",
74
+ properties: {},
75
+ required: [],
76
+ additionalProperties: false
77
+ };
78
+ }
79
+ const normalized = { ...schema };
80
+ const type = normalized.type;
81
+ if (type === "object") {
82
+ const properties = normalized.properties && typeof normalized.properties === "object" && !Array.isArray(normalized.properties) ? normalized.properties : {};
83
+ normalized.properties = Object.fromEntries(
84
+ Object.entries(properties).map(([key, value]) => [
85
+ key,
86
+ normalizeObjectJsonSchema(value)
87
+ ])
88
+ );
89
+ const propertyKeys = Object.keys(properties);
90
+ const required = Array.isArray(normalized.required) ? normalized.required.filter(
91
+ (value) => typeof value === "string"
92
+ ) : [];
93
+ normalized.required = Array.from(/* @__PURE__ */ new Set([...required, ...propertyKeys]));
94
+ if (normalized.additionalProperties === void 0) {
95
+ normalized.additionalProperties = false;
96
+ }
97
+ } else if (type === "array" && normalized.items && typeof normalized.items === "object") {
98
+ normalized.items = normalizeObjectJsonSchema(
99
+ normalized.items
100
+ );
101
+ }
102
+ return normalized;
103
+ }
104
+ function isOpenAIReasoningModel(modelId) {
105
+ if (!modelId) return false;
106
+ return /^(o1|o3|o4|gpt-5)/i.test(modelId);
107
+ }
108
+ function buildOpenAITokenParams(modelId, maxTokens, temperature) {
109
+ if (isOpenAIReasoningModel(modelId)) {
110
+ return { max_completion_tokens: maxTokens };
111
+ }
112
+ return { max_tokens: maxTokens, temperature };
113
+ }
114
+ function toOpenAIResponseFormat(rf) {
115
+ if (!rf) return void 0;
116
+ if (rf.type === "json_object") return { type: "json_object" };
117
+ return {
118
+ type: "json_schema",
119
+ json_schema: {
120
+ name: rf.json_schema.name,
121
+ schema: normalizeObjectJsonSchema(rf.json_schema.schema),
122
+ strict: rf.json_schema.strict ?? true
123
+ }
124
+ };
125
+ }
126
+ function toOpenAIResponsesTextFormat(rf) {
127
+ if (!rf || rf.type !== "json_schema") return void 0;
128
+ return {
129
+ type: "json_schema",
130
+ name: rf.json_schema.name,
131
+ schema: normalizeObjectJsonSchema(rf.json_schema.schema),
132
+ strict: rf.json_schema.strict ?? true
133
+ };
134
+ }
135
+ function formatTools(actions) {
136
+ return actions.map((action) => ({
137
+ type: "function",
138
+ function: {
139
+ name: action.name,
140
+ description: action.description,
141
+ parameters: {
142
+ type: "object",
143
+ properties: action.parameters ? Object.fromEntries(
144
+ Object.entries(action.parameters).map(([key, param]) => [
145
+ key,
146
+ parameterToJsonSchema(param)
147
+ ])
148
+ ) : {},
149
+ required: action.parameters ? Object.entries(action.parameters).filter(([, param]) => param.required).map(([key]) => key) : [],
150
+ additionalProperties: false
151
+ }
152
+ }
153
+ }));
154
+ }
155
+ function hasImageAttachments(message) {
156
+ const attachments = message.metadata?.attachments;
157
+ return attachments?.some((a) => a.type === "image") ?? false;
158
+ }
159
+ function attachmentToOpenAIImage(attachment) {
160
+ if (attachment.type !== "image") return null;
161
+ let imageUrl;
162
+ if (attachment.url) {
163
+ imageUrl = attachment.url;
164
+ } else if (attachment.data) {
165
+ imageUrl = attachment.data.startsWith("data:") ? attachment.data : `data:${attachment.mimeType || "image/png"};base64,${attachment.data}`;
166
+ } else {
167
+ return null;
168
+ }
169
+ return {
170
+ type: "image_url",
171
+ image_url: {
172
+ url: imageUrl,
173
+ detail: "auto"
174
+ }
175
+ };
176
+ }
177
+ function messageToOpenAIContent(message) {
178
+ const attachments = message.metadata?.attachments;
179
+ const content = message.content ?? "";
180
+ if (!hasImageAttachments(message)) {
181
+ return content;
182
+ }
183
+ const blocks = [];
184
+ if (content) {
185
+ blocks.push({ type: "text", text: content });
186
+ }
187
+ if (attachments) {
188
+ for (const attachment of attachments) {
189
+ const imageBlock = attachmentToOpenAIImage(attachment);
190
+ if (imageBlock) {
191
+ blocks.push(imageBlock);
192
+ }
193
+ }
194
+ }
195
+ return blocks;
196
+ }
197
+ function formatMessagesForOpenAI(messages, systemPrompt) {
198
+ const formatted = [];
199
+ if (systemPrompt) {
200
+ formatted.push({ role: "system", content: systemPrompt });
201
+ }
202
+ for (const msg of messages) {
203
+ if (msg.role === "system") {
204
+ formatted.push({ role: "system", content: msg.content ?? "" });
205
+ } else if (msg.role === "user") {
206
+ formatted.push({
207
+ role: "user",
208
+ content: messageToOpenAIContent(msg)
209
+ });
210
+ } else if (msg.role === "assistant") {
211
+ const hasToolCalls = msg.tool_calls && msg.tool_calls.length > 0;
212
+ const assistantMsg = {
213
+ role: "assistant",
214
+ // Gemini/xAI (OpenAI-compatible) reject content: "" on assistant messages with tool_calls
215
+ content: hasToolCalls ? msg.content || null : msg.content
216
+ };
217
+ if (hasToolCalls) {
218
+ assistantMsg.tool_calls = msg.tool_calls;
219
+ }
220
+ formatted.push(assistantMsg);
221
+ } else if (msg.role === "tool" && msg.tool_call_id) {
222
+ formatted.push({
223
+ role: "tool",
224
+ content: msg.content ?? "",
225
+ tool_call_id: msg.tool_call_id
226
+ });
227
+ }
228
+ }
229
+ return formatted;
230
+ }
231
+
3
232
  // src/providers/google/provider.ts
4
233
  var GOOGLE_MODELS = {
5
234
  // Gemini 2.5 (Experimental)
@@ -119,7 +348,8 @@ function google(modelId, options = {}) {
119
348
  messages,
120
349
  tools: params.tools,
121
350
  temperature: params.temperature,
122
- max_tokens: params.maxTokens
351
+ max_tokens: params.maxTokens,
352
+ response_format: toOpenAIResponseFormat(params.responseFormat)
123
353
  });
124
354
  const choice = response.choices[0];
125
355
  const message = choice.message;
@@ -151,6 +381,7 @@ function google(modelId, options = {}) {
151
381
  tools: params.tools,
152
382
  temperature: params.temperature,
153
383
  max_tokens: params.maxTokens,
384
+ response_format: toOpenAIResponseFormat(params.responseFormat),
154
385
  stream: true
155
386
  });
156
387
  let currentToolCall = null;
@@ -296,204 +527,6 @@ function generateToolCallId() {
296
527
  return generateId("call");
297
528
  }
298
529
 
299
- // src/adapters/base.ts
300
- function stringifyForDebug(value) {
301
- return JSON.stringify(
302
- value,
303
- (_key, currentValue) => {
304
- if (typeof currentValue === "bigint") {
305
- return currentValue.toString();
306
- }
307
- if (currentValue instanceof Error) {
308
- return {
309
- name: currentValue.name,
310
- message: currentValue.message,
311
- stack: currentValue.stack
312
- };
313
- }
314
- return currentValue;
315
- },
316
- 2
317
- );
318
- }
319
- function logProviderPayload(provider, label, payload, enabled) {
320
- if (!enabled) {
321
- return;
322
- }
323
- if (label.toLowerCase().includes("stream ")) {
324
- return;
325
- }
326
- try {
327
- console.log(
328
- `[llm-sdk:${provider}] ${label}
329
- ${stringifyForDebug(payload)}`
330
- );
331
- } catch (error) {
332
- console.log(
333
- `[llm-sdk:${provider}] ${label} (failed to stringify payload)`,
334
- error
335
- );
336
- }
337
- }
338
- function parameterToJsonSchema(param) {
339
- const schema = {
340
- type: param.type
341
- };
342
- if (param.description) {
343
- schema.description = param.description;
344
- }
345
- if (param.enum) {
346
- schema.enum = param.enum;
347
- }
348
- if (param.type === "array" && param.items) {
349
- schema.items = parameterToJsonSchema(
350
- param.items
351
- );
352
- }
353
- if (param.type === "object" && param.properties) {
354
- schema.properties = Object.fromEntries(
355
- Object.entries(param.properties).map(([key, prop]) => [
356
- key,
357
- parameterToJsonSchema(
358
- prop
359
- )
360
- ])
361
- );
362
- schema.additionalProperties = false;
363
- }
364
- return schema;
365
- }
366
- function normalizeObjectJsonSchema(schema) {
367
- if (!schema || typeof schema !== "object") {
368
- return {
369
- type: "object",
370
- properties: {},
371
- required: [],
372
- additionalProperties: false
373
- };
374
- }
375
- const normalized = { ...schema };
376
- const type = normalized.type;
377
- if (type === "object") {
378
- const properties = normalized.properties && typeof normalized.properties === "object" && !Array.isArray(normalized.properties) ? normalized.properties : {};
379
- normalized.properties = Object.fromEntries(
380
- Object.entries(properties).map(([key, value]) => [
381
- key,
382
- normalizeObjectJsonSchema(value)
383
- ])
384
- );
385
- const propertyKeys = Object.keys(properties);
386
- const required = Array.isArray(normalized.required) ? normalized.required.filter(
387
- (value) => typeof value === "string"
388
- ) : [];
389
- normalized.required = Array.from(/* @__PURE__ */ new Set([...required, ...propertyKeys]));
390
- if (normalized.additionalProperties === void 0) {
391
- normalized.additionalProperties = false;
392
- }
393
- } else if (type === "array" && normalized.items && typeof normalized.items === "object") {
394
- normalized.items = normalizeObjectJsonSchema(
395
- normalized.items
396
- );
397
- }
398
- return normalized;
399
- }
400
- function formatTools(actions) {
401
- return actions.map((action) => ({
402
- type: "function",
403
- function: {
404
- name: action.name,
405
- description: action.description,
406
- parameters: {
407
- type: "object",
408
- properties: action.parameters ? Object.fromEntries(
409
- Object.entries(action.parameters).map(([key, param]) => [
410
- key,
411
- parameterToJsonSchema(param)
412
- ])
413
- ) : {},
414
- required: action.parameters ? Object.entries(action.parameters).filter(([, param]) => param.required).map(([key]) => key) : [],
415
- additionalProperties: false
416
- }
417
- }
418
- }));
419
- }
420
- function hasImageAttachments(message) {
421
- const attachments = message.metadata?.attachments;
422
- return attachments?.some((a) => a.type === "image") ?? false;
423
- }
424
- function attachmentToOpenAIImage(attachment) {
425
- if (attachment.type !== "image") return null;
426
- let imageUrl;
427
- if (attachment.url) {
428
- imageUrl = attachment.url;
429
- } else if (attachment.data) {
430
- imageUrl = attachment.data.startsWith("data:") ? attachment.data : `data:${attachment.mimeType || "image/png"};base64,${attachment.data}`;
431
- } else {
432
- return null;
433
- }
434
- return {
435
- type: "image_url",
436
- image_url: {
437
- url: imageUrl,
438
- detail: "auto"
439
- }
440
- };
441
- }
442
- function messageToOpenAIContent(message) {
443
- const attachments = message.metadata?.attachments;
444
- const content = message.content ?? "";
445
- if (!hasImageAttachments(message)) {
446
- return content;
447
- }
448
- const blocks = [];
449
- if (content) {
450
- blocks.push({ type: "text", text: content });
451
- }
452
- if (attachments) {
453
- for (const attachment of attachments) {
454
- const imageBlock = attachmentToOpenAIImage(attachment);
455
- if (imageBlock) {
456
- blocks.push(imageBlock);
457
- }
458
- }
459
- }
460
- return blocks;
461
- }
462
- function formatMessagesForOpenAI(messages, systemPrompt) {
463
- const formatted = [];
464
- if (systemPrompt) {
465
- formatted.push({ role: "system", content: systemPrompt });
466
- }
467
- for (const msg of messages) {
468
- if (msg.role === "system") {
469
- formatted.push({ role: "system", content: msg.content ?? "" });
470
- } else if (msg.role === "user") {
471
- formatted.push({
472
- role: "user",
473
- content: messageToOpenAIContent(msg)
474
- });
475
- } else if (msg.role === "assistant") {
476
- const hasToolCalls = msg.tool_calls && msg.tool_calls.length > 0;
477
- const assistantMsg = {
478
- role: "assistant",
479
- // Gemini/xAI (OpenAI-compatible) reject content: "" on assistant messages with tool_calls
480
- content: hasToolCalls ? msg.content || null : msg.content
481
- };
482
- if (hasToolCalls) {
483
- assistantMsg.tool_calls = msg.tool_calls;
484
- }
485
- formatted.push(assistantMsg);
486
- } else if (msg.role === "tool" && msg.tool_call_id) {
487
- formatted.push({
488
- role: "tool",
489
- content: msg.content ?? "",
490
- tool_call_id: msg.tool_call_id
491
- });
492
- }
493
- }
494
- return formatted;
495
- }
496
-
497
530
  // src/adapters/openai.ts
498
531
  var OpenAIAdapter = class _OpenAIAdapter {
499
532
  constructor(config) {
@@ -608,6 +641,9 @@ var OpenAIAdapter = class _OpenAIAdapter {
608
641
  async completeWithResponses(request) {
609
642
  const client = await this.getClient();
610
643
  const openaiToolOptions = request.providerToolOptions?.openai;
644
+ const responsesTextFormat = toOpenAIResponsesTextFormat(
645
+ request.config?.responseFormat
646
+ );
611
647
  const payload = {
612
648
  model: request.config?.model || this.model,
613
649
  instructions: request.systemPrompt,
@@ -617,6 +653,7 @@ var OpenAIAdapter = class _OpenAIAdapter {
617
653
  parallel_tool_calls: openaiToolOptions?.parallelToolCalls,
618
654
  temperature: request.config?.temperature ?? this.config.temperature,
619
655
  max_output_tokens: request.config?.maxTokens ?? this.config.maxTokens,
656
+ ...responsesTextFormat ? { text: { format: responsesTextFormat } } : {},
620
657
  stream: false
621
658
  };
622
659
  logProviderPayload("openai", "request payload", payload, request.debug);
@@ -738,14 +775,19 @@ var OpenAIAdapter = class _OpenAIAdapter {
738
775
  name: openaiToolOptions.toolChoice.name
739
776
  }
740
777
  } : openaiToolOptions?.toolChoice;
778
+ const modelIdForPayload = request.config?.model || this.model;
741
779
  const payload = {
742
- model: request.config?.model || this.model,
780
+ model: modelIdForPayload,
743
781
  messages,
744
782
  tools: tools.length > 0 ? tools : void 0,
745
783
  tool_choice: tools.length > 0 ? toolChoice : void 0,
746
784
  parallel_tool_calls: tools.length > 0 ? openaiToolOptions?.parallelToolCalls : void 0,
747
- temperature: request.config?.temperature ?? this.config.temperature,
748
- max_tokens: request.config?.maxTokens ?? this.config.maxTokens,
785
+ ...buildOpenAITokenParams(
786
+ modelIdForPayload,
787
+ request.config?.maxTokens ?? this.config.maxTokens,
788
+ request.config?.temperature ?? this.config.temperature
789
+ ),
790
+ response_format: toOpenAIResponseFormat(request.config?.responseFormat),
749
791
  stream: true,
750
792
  stream_options: { include_usage: true }
751
793
  };
@@ -887,14 +929,19 @@ var OpenAIAdapter = class _OpenAIAdapter {
887
929
  name: openaiToolOptions.toolChoice.name
888
930
  }
889
931
  } : openaiToolOptions?.toolChoice;
932
+ const modelIdForCompletePayload = request.config?.model || this.model;
890
933
  const payload = {
891
- model: request.config?.model || this.model,
934
+ model: modelIdForCompletePayload,
892
935
  messages,
893
936
  tools: tools.length > 0 ? tools : void 0,
894
937
  tool_choice: tools.length > 0 ? toolChoice : void 0,
895
938
  parallel_tool_calls: tools.length > 0 ? openaiToolOptions?.parallelToolCalls : void 0,
896
- temperature: request.config?.temperature ?? this.config.temperature,
897
- max_tokens: request.config?.maxTokens ?? this.config.maxTokens,
939
+ ...buildOpenAITokenParams(
940
+ modelIdForCompletePayload,
941
+ request.config?.maxTokens ?? this.config.maxTokens,
942
+ request.config?.temperature ?? this.config.temperature
943
+ ),
944
+ response_format: toOpenAIResponseFormat(request.config?.responseFormat),
898
945
  stream: false
899
946
  };
900
947
  logProviderPayload("openai", "request payload", payload, request.debug);