@yourgpt/llm-sdk 2.0.1 → 2.0.2-beta.2

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 (55) hide show
  1. package/dist/adapters/index.d.mts +27 -4
  2. package/dist/adapters/index.d.ts +27 -4
  3. package/dist/adapters/index.js +395 -25
  4. package/dist/adapters/index.js.map +1 -1
  5. package/dist/adapters/index.mjs +395 -25
  6. package/dist/adapters/index.mjs.map +1 -1
  7. package/dist/index.d.mts +24 -5
  8. package/dist/index.d.ts +24 -5
  9. package/dist/index.js +20 -4
  10. package/dist/index.js.map +1 -1
  11. package/dist/index.mjs +20 -4
  12. package/dist/index.mjs.map +1 -1
  13. package/dist/providers/anthropic/index.d.mts +1 -2
  14. package/dist/providers/anthropic/index.d.ts +1 -2
  15. package/dist/providers/anthropic/index.js +108 -12
  16. package/dist/providers/anthropic/index.js.map +1 -1
  17. package/dist/providers/anthropic/index.mjs +108 -12
  18. package/dist/providers/anthropic/index.mjs.map +1 -1
  19. package/dist/providers/azure/index.d.mts +1 -2
  20. package/dist/providers/azure/index.d.ts +1 -2
  21. package/dist/providers/azure/index.js.map +1 -1
  22. package/dist/providers/azure/index.mjs.map +1 -1
  23. package/dist/providers/google/index.d.mts +1 -2
  24. package/dist/providers/google/index.d.ts +1 -2
  25. package/dist/providers/google/index.js +61 -2
  26. package/dist/providers/google/index.js.map +1 -1
  27. package/dist/providers/google/index.mjs +61 -2
  28. package/dist/providers/google/index.mjs.map +1 -1
  29. package/dist/providers/ollama/index.d.mts +8 -3
  30. package/dist/providers/ollama/index.d.ts +8 -3
  31. package/dist/providers/ollama/index.js +227 -17
  32. package/dist/providers/ollama/index.js.map +1 -1
  33. package/dist/providers/ollama/index.mjs +227 -17
  34. package/dist/providers/ollama/index.mjs.map +1 -1
  35. package/dist/providers/openai/index.d.mts +1 -2
  36. package/dist/providers/openai/index.d.ts +1 -2
  37. package/dist/providers/openai/index.js +57 -3
  38. package/dist/providers/openai/index.js.map +1 -1
  39. package/dist/providers/openai/index.mjs +57 -3
  40. package/dist/providers/openai/index.mjs.map +1 -1
  41. package/dist/providers/openrouter/index.d.mts +56 -3
  42. package/dist/providers/openrouter/index.d.ts +56 -3
  43. package/dist/providers/openrouter/index.js +90 -276
  44. package/dist/providers/openrouter/index.js.map +1 -1
  45. package/dist/providers/openrouter/index.mjs +89 -277
  46. package/dist/providers/openrouter/index.mjs.map +1 -1
  47. package/dist/providers/xai/index.d.mts +1 -2
  48. package/dist/providers/xai/index.d.ts +1 -2
  49. package/dist/providers/xai/index.js.map +1 -1
  50. package/dist/providers/xai/index.mjs.map +1 -1
  51. package/dist/{base-DdxolpKP.d.mts → types-C_f95PKp.d.mts} +434 -3
  52. package/dist/{base-DdxolpKP.d.ts → types-C_f95PKp.d.ts} +434 -3
  53. package/package.json +1 -1
  54. package/dist/types-Ck25ZYma.d.mts +0 -323
  55. package/dist/types-Dsz8SpdB.d.ts +0 -323
@@ -1,164 +1,4 @@
1
1
  // src/providers/openrouter/provider.ts
2
- var OPENROUTER_MODELS = {
3
- // OpenAI
4
- "openai/gpt-4o": {
5
- vision: true,
6
- tools: true,
7
- jsonMode: true,
8
- maxTokens: 128e3
9
- },
10
- "openai/gpt-4o-mini": {
11
- vision: true,
12
- tools: true,
13
- jsonMode: true,
14
- maxTokens: 128e3
15
- },
16
- "openai/gpt-4-turbo": {
17
- vision: true,
18
- tools: true,
19
- jsonMode: true,
20
- maxTokens: 128e3
21
- },
22
- "openai/o1": {
23
- vision: true,
24
- tools: false,
25
- jsonMode: false,
26
- maxTokens: 128e3
27
- },
28
- "openai/o1-mini": {
29
- vision: true,
30
- tools: false,
31
- jsonMode: false,
32
- maxTokens: 128e3
33
- },
34
- // Anthropic
35
- "anthropic/claude-3.5-sonnet": {
36
- vision: true,
37
- tools: true,
38
- jsonMode: true,
39
- maxTokens: 2e5
40
- },
41
- "anthropic/claude-3.5-sonnet-20241022": {
42
- vision: true,
43
- tools: true,
44
- jsonMode: true,
45
- maxTokens: 2e5
46
- },
47
- "anthropic/claude-3-opus": {
48
- vision: true,
49
- tools: true,
50
- jsonMode: true,
51
- maxTokens: 2e5
52
- },
53
- "anthropic/claude-3-sonnet": {
54
- vision: true,
55
- tools: true,
56
- jsonMode: true,
57
- maxTokens: 2e5
58
- },
59
- "anthropic/claude-3-haiku": {
60
- vision: true,
61
- tools: true,
62
- jsonMode: true,
63
- maxTokens: 2e5
64
- },
65
- // Google
66
- "google/gemini-pro-1.5": {
67
- vision: true,
68
- tools: true,
69
- jsonMode: true,
70
- maxTokens: 1e6
71
- },
72
- "google/gemini-flash-1.5": {
73
- vision: true,
74
- tools: true,
75
- jsonMode: true,
76
- maxTokens: 1e6
77
- },
78
- "google/gemini-2.0-flash-exp": {
79
- vision: true,
80
- tools: true,
81
- jsonMode: true,
82
- maxTokens: 1e6
83
- },
84
- // Meta Llama
85
- "meta-llama/llama-3.1-405b-instruct": {
86
- vision: false,
87
- tools: true,
88
- jsonMode: true,
89
- maxTokens: 131072
90
- },
91
- "meta-llama/llama-3.1-70b-instruct": {
92
- vision: false,
93
- tools: true,
94
- jsonMode: true,
95
- maxTokens: 131072
96
- },
97
- "meta-llama/llama-3.1-8b-instruct": {
98
- vision: false,
99
- tools: true,
100
- jsonMode: true,
101
- maxTokens: 131072
102
- },
103
- "meta-llama/llama-3.2-90b-vision-instruct": {
104
- vision: true,
105
- tools: true,
106
- jsonMode: true,
107
- maxTokens: 131072
108
- },
109
- // Mistral
110
- "mistralai/mistral-large": {
111
- vision: false,
112
- tools: true,
113
- jsonMode: true,
114
- maxTokens: 128e3
115
- },
116
- "mistralai/mixtral-8x7b-instruct": {
117
- vision: false,
118
- tools: true,
119
- jsonMode: true,
120
- maxTokens: 32768
121
- },
122
- "mistralai/mistral-nemo": {
123
- vision: false,
124
- tools: true,
125
- jsonMode: true,
126
- maxTokens: 128e3
127
- },
128
- // DeepSeek
129
- "deepseek/deepseek-chat": {
130
- vision: false,
131
- tools: true,
132
- jsonMode: true,
133
- maxTokens: 64e3
134
- },
135
- "deepseek/deepseek-coder": {
136
- vision: false,
137
- tools: true,
138
- jsonMode: true,
139
- maxTokens: 64e3
140
- },
141
- // Qwen
142
- "qwen/qwen-2.5-72b-instruct": {
143
- vision: false,
144
- tools: true,
145
- jsonMode: true,
146
- maxTokens: 131072
147
- },
148
- "qwen/qwen-2-vl-72b-instruct": {
149
- vision: true,
150
- tools: true,
151
- jsonMode: true,
152
- maxTokens: 32768
153
- },
154
- // OpenRouter Auto (magic model)
155
- "openrouter/auto": {
156
- vision: true,
157
- tools: true,
158
- jsonMode: true,
159
- maxTokens: 128e3
160
- }
161
- };
162
2
  var DEFAULT_MODEL_CONFIG = {
163
3
  vision: true,
164
4
  tools: true,
@@ -187,7 +27,7 @@ function openrouter(modelId, options = {}) {
187
27
  }
188
28
  return client;
189
29
  }
190
- const modelConfig = OPENROUTER_MODELS[modelId] ?? DEFAULT_MODEL_CONFIG;
30
+ const modelConfig = DEFAULT_MODEL_CONFIG;
191
31
  return {
192
32
  provider: "openrouter",
193
33
  modelId,
@@ -386,6 +226,29 @@ function formatMessagesForOpenRouter(messages) {
386
226
  }
387
227
  });
388
228
  }
229
+ async function fetchOpenRouterModels(apiKey) {
230
+ const headers = {
231
+ "Content-Type": "application/json"
232
+ };
233
+ if (apiKey) {
234
+ headers["Authorization"] = `Bearer ${apiKey}`;
235
+ }
236
+ const response = await fetch("https://openrouter.ai/api/v1/models", {
237
+ headers
238
+ });
239
+ if (!response.ok) {
240
+ throw new Error(`Failed to fetch models: ${response.statusText}`);
241
+ }
242
+ const data = await response.json();
243
+ return data.data || [];
244
+ }
245
+ async function searchOpenRouterModels(query, apiKey) {
246
+ const models = await fetchOpenRouterModels(apiKey);
247
+ const lowerQuery = query.toLowerCase();
248
+ return models.filter(
249
+ (model) => model.id.toLowerCase().includes(lowerQuery) || model.name.toLowerCase().includes(lowerQuery)
250
+ );
251
+ }
389
252
 
390
253
  // src/core/utils.ts
391
254
  function generateId(prefix = "id") {
@@ -584,29 +447,60 @@ var OpenAIAdapter = class {
584
447
  request.systemPrompt
585
448
  );
586
449
  }
587
- const tools = request.actions?.length ? formatTools(request.actions) : void 0;
450
+ const tools = request.actions?.length ? formatTools(request.actions) : [];
451
+ const webSearchConfig = request.webSearch ?? this.config.webSearch;
452
+ if (webSearchConfig) {
453
+ const webSearchTool = {
454
+ type: "web_search_preview"
455
+ };
456
+ const wsConfig = typeof webSearchConfig === "object" ? webSearchConfig : {};
457
+ if (wsConfig.userLocation) {
458
+ webSearchTool.search_context_size = "medium";
459
+ }
460
+ tools.push(webSearchTool);
461
+ }
588
462
  const messageId = generateMessageId();
589
463
  yield { type: "message:start", id: messageId };
590
464
  try {
591
465
  const stream = await client.chat.completions.create({
592
466
  model: request.config?.model || this.model,
593
467
  messages,
594
- tools,
468
+ tools: tools.length > 0 ? tools : void 0,
595
469
  temperature: request.config?.temperature ?? this.config.temperature,
596
470
  max_tokens: request.config?.maxTokens ?? this.config.maxTokens,
597
471
  stream: true,
598
472
  stream_options: { include_usage: true }
599
473
  });
600
474
  let currentToolCall = null;
475
+ const collectedCitations = [];
476
+ let citationIndex = 0;
601
477
  let usage;
602
478
  for await (const chunk of stream) {
603
479
  if (request.signal?.aborted) {
604
480
  break;
605
481
  }
606
482
  const delta = chunk.choices[0]?.delta;
483
+ const choice = chunk.choices[0];
607
484
  if (delta?.content) {
608
485
  yield { type: "message:delta", content: delta.content };
609
486
  }
487
+ const annotations = delta?.annotations;
488
+ if (annotations && annotations.length > 0) {
489
+ for (const annotation of annotations) {
490
+ if (annotation.type === "url_citation" && annotation.url_citation?.url) {
491
+ citationIndex++;
492
+ const url = annotation.url_citation.url;
493
+ const domain = extractDomain(url);
494
+ collectedCitations.push({
495
+ index: citationIndex,
496
+ url,
497
+ title: annotation.url_citation.title || domain,
498
+ domain,
499
+ favicon: domain ? `https://www.google.com/s2/favicons?domain=${domain}&sz=32` : void 0
500
+ });
501
+ }
502
+ }
503
+ }
610
504
  if (delta?.tool_calls) {
611
505
  for (const toolCall of delta.tool_calls) {
612
506
  if (toolCall.id) {
@@ -639,7 +533,7 @@ var OpenAIAdapter = class {
639
533
  total_tokens: chunk.usage.total_tokens
640
534
  };
641
535
  }
642
- if (chunk.choices[0]?.finish_reason) {
536
+ if (choice?.finish_reason) {
643
537
  if (currentToolCall) {
644
538
  yield {
645
539
  type: "action:args",
@@ -649,6 +543,10 @@ var OpenAIAdapter = class {
649
543
  }
650
544
  }
651
545
  }
546
+ if (collectedCitations.length > 0) {
547
+ const uniqueCitations = deduplicateCitations(collectedCitations);
548
+ yield { type: "citation", citations: uniqueCitations };
549
+ }
652
550
  yield { type: "message:end" };
653
551
  yield { type: "done", usage };
654
552
  } catch (error) {
@@ -660,6 +558,25 @@ var OpenAIAdapter = class {
660
558
  }
661
559
  }
662
560
  };
561
+ function extractDomain(url) {
562
+ try {
563
+ const parsed = new URL(url);
564
+ return parsed.hostname;
565
+ } catch {
566
+ return "";
567
+ }
568
+ }
569
+ function deduplicateCitations(citations) {
570
+ const seen = /* @__PURE__ */ new Map();
571
+ let index = 0;
572
+ for (const citation of citations) {
573
+ if (!seen.has(citation.url)) {
574
+ index++;
575
+ seen.set(citation.url, { ...citation, index });
576
+ }
577
+ }
578
+ return Array.from(seen.values());
579
+ }
663
580
  function createOpenAIAdapter(config) {
664
581
  return new OpenAIAdapter(config);
665
582
  }
@@ -681,111 +598,6 @@ function createCallableProvider(providerFn, properties) {
681
598
  }
682
599
 
683
600
  // src/providers/openrouter/index.ts
684
- var OPENROUTER_MODELS2 = {
685
- // OpenAI
686
- "openai/gpt-4o": {
687
- vision: true,
688
- tools: true,
689
- jsonMode: true,
690
- maxTokens: 128e3
691
- },
692
- "openai/gpt-4o-mini": {
693
- vision: true,
694
- tools: true,
695
- jsonMode: true,
696
- maxTokens: 128e3
697
- },
698
- "openai/gpt-4-turbo": {
699
- vision: true,
700
- tools: true,
701
- jsonMode: true,
702
- maxTokens: 128e3
703
- },
704
- "openai/o1": {
705
- vision: true,
706
- tools: false,
707
- jsonMode: false,
708
- maxTokens: 128e3
709
- },
710
- // Anthropic
711
- "anthropic/claude-3.5-sonnet": {
712
- vision: true,
713
- tools: true,
714
- jsonMode: true,
715
- maxTokens: 2e5
716
- },
717
- "anthropic/claude-3.5-sonnet-20241022": {
718
- vision: true,
719
- tools: true,
720
- jsonMode: true,
721
- maxTokens: 2e5
722
- },
723
- "anthropic/claude-3-opus": {
724
- vision: true,
725
- tools: true,
726
- jsonMode: true,
727
- maxTokens: 2e5
728
- },
729
- "anthropic/claude-3-haiku": {
730
- vision: true,
731
- tools: true,
732
- jsonMode: true,
733
- maxTokens: 2e5
734
- },
735
- // Google
736
- "google/gemini-pro-1.5": {
737
- vision: true,
738
- tools: true,
739
- jsonMode: true,
740
- maxTokens: 1e6
741
- },
742
- "google/gemini-flash-1.5": {
743
- vision: true,
744
- tools: true,
745
- jsonMode: true,
746
- maxTokens: 1e6
747
- },
748
- // Meta Llama
749
- "meta-llama/llama-3.1-405b-instruct": {
750
- vision: false,
751
- tools: true,
752
- jsonMode: true,
753
- maxTokens: 131072
754
- },
755
- "meta-llama/llama-3.1-70b-instruct": {
756
- vision: false,
757
- tools: true,
758
- jsonMode: true,
759
- maxTokens: 131072
760
- },
761
- // Mistral
762
- "mistralai/mistral-large": {
763
- vision: false,
764
- tools: true,
765
- jsonMode: true,
766
- maxTokens: 128e3
767
- },
768
- "mistralai/mixtral-8x7b-instruct": {
769
- vision: false,
770
- tools: true,
771
- jsonMode: true,
772
- maxTokens: 32768
773
- },
774
- // DeepSeek
775
- "deepseek/deepseek-chat": {
776
- vision: false,
777
- tools: true,
778
- jsonMode: true,
779
- maxTokens: 64e3
780
- },
781
- // OpenRouter Auto (magic model - picks best for your prompt)
782
- "openrouter/auto": {
783
- vision: true,
784
- tools: true,
785
- jsonMode: true,
786
- maxTokens: 128e3
787
- }
788
- };
789
601
  var DEFAULT_CAPABILITIES = {
790
602
  vision: true,
791
603
  tools: true,
@@ -803,29 +615,29 @@ function createOpenRouter(config = {}) {
803
615
  });
804
616
  };
805
617
  const getCapabilities = (modelId) => {
806
- const model = OPENROUTER_MODELS2[modelId] ?? DEFAULT_CAPABILITIES;
807
618
  return {
808
- supportsVision: model.vision,
809
- supportsTools: model.tools,
619
+ supportsVision: DEFAULT_CAPABILITIES.vision,
620
+ supportsTools: DEFAULT_CAPABILITIES.tools,
810
621
  supportsThinking: false,
811
622
  supportsStreaming: true,
812
623
  supportsPDF: false,
813
624
  supportsAudio: false,
814
625
  supportsVideo: false,
815
- maxTokens: model.maxTokens,
816
- supportedImageTypes: model.vision ? ["image/png", "image/jpeg", "image/gif", "image/webp"] : [],
817
- supportsJsonMode: model.jsonMode,
626
+ maxTokens: DEFAULT_CAPABILITIES.maxTokens,
627
+ supportedImageTypes: ["image/png", "image/jpeg", "image/gif", "image/webp"] ,
628
+ supportsJsonMode: DEFAULT_CAPABILITIES.jsonMode,
818
629
  supportsSystemMessages: true
819
630
  };
820
631
  };
821
632
  return createCallableProvider(providerFn, {
822
633
  name: "openrouter",
823
- supportedModels: Object.keys(OPENROUTER_MODELS2),
634
+ supportedModels: [],
635
+ // Use fetchOpenRouterModels() to get live model list
824
636
  getCapabilities
825
637
  });
826
638
  }
827
639
  var createOpenRouterProvider = createOpenRouter;
828
640
 
829
- export { createOpenRouter, openrouter as createOpenRouterModel, createOpenRouterProvider, openrouter };
641
+ export { createOpenRouter, openrouter as createOpenRouterModel, createOpenRouterProvider, fetchOpenRouterModels, openrouter, searchOpenRouterModels };
830
642
  //# sourceMappingURL=index.mjs.map
831
643
  //# sourceMappingURL=index.mjs.map