@probeo/anymodel 0.1.0 → 0.3.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 (115) hide show
  1. package/README.md +117 -10
  2. package/dist/batch/index.d.ts +4 -0
  3. package/dist/batch/index.d.ts.map +1 -0
  4. package/dist/batch/index.js +3 -0
  5. package/dist/batch/index.js.map +1 -0
  6. package/dist/batch/manager.d.ts +72 -0
  7. package/dist/batch/manager.d.ts.map +1 -0
  8. package/dist/batch/manager.js +328 -0
  9. package/dist/batch/manager.js.map +1 -0
  10. package/dist/batch/store.d.ts +54 -0
  11. package/dist/batch/store.d.ts.map +1 -0
  12. package/dist/batch/store.js +109 -0
  13. package/dist/batch/store.js.map +1 -0
  14. package/dist/cli.cjs +112 -19
  15. package/dist/cli.cjs.map +1 -1
  16. package/dist/cli.d.ts +2 -0
  17. package/dist/cli.d.ts.map +1 -0
  18. package/dist/cli.js +28 -1993
  19. package/dist/cli.js.map +1 -1
  20. package/dist/client.d.ts +42 -0
  21. package/dist/client.d.ts.map +1 -0
  22. package/dist/client.js +181 -0
  23. package/dist/client.js.map +1 -0
  24. package/dist/config.d.ts +6 -0
  25. package/dist/config.d.ts.map +1 -0
  26. package/dist/config.js +120 -0
  27. package/dist/config.js.map +1 -0
  28. package/dist/index.cjs +112 -19
  29. package/dist/index.cjs.map +1 -1
  30. package/dist/index.d.cts +10 -0
  31. package/dist/index.d.ts +14 -538
  32. package/dist/index.d.ts.map +1 -0
  33. package/dist/index.js +15 -1972
  34. package/dist/index.js.map +1 -1
  35. package/dist/providers/adapter.d.ts +33 -0
  36. package/dist/providers/adapter.d.ts.map +1 -0
  37. package/dist/providers/adapter.js +2 -0
  38. package/dist/providers/adapter.js.map +1 -0
  39. package/dist/providers/anthropic-batch.d.ts +3 -0
  40. package/dist/providers/anthropic-batch.d.ts.map +1 -0
  41. package/dist/providers/anthropic-batch.js +228 -0
  42. package/dist/providers/anthropic-batch.js.map +1 -0
  43. package/dist/providers/anthropic.d.ts +3 -0
  44. package/dist/providers/anthropic.d.ts.map +1 -0
  45. package/dist/providers/anthropic.js +358 -0
  46. package/dist/providers/anthropic.js.map +1 -0
  47. package/dist/providers/custom.d.ts +8 -0
  48. package/dist/providers/custom.d.ts.map +1 -0
  49. package/dist/providers/custom.js +61 -0
  50. package/dist/providers/custom.js.map +1 -0
  51. package/dist/providers/google.d.ts +3 -0
  52. package/dist/providers/google.d.ts.map +1 -0
  53. package/dist/providers/google.js +331 -0
  54. package/dist/providers/google.js.map +1 -0
  55. package/dist/providers/index.d.ts +6 -0
  56. package/dist/providers/index.d.ts.map +1 -0
  57. package/dist/providers/index.js +5 -0
  58. package/dist/providers/index.js.map +1 -0
  59. package/dist/providers/openai-batch.d.ts +3 -0
  60. package/dist/providers/openai-batch.d.ts.map +1 -0
  61. package/dist/providers/openai-batch.js +208 -0
  62. package/dist/providers/openai-batch.js.map +1 -0
  63. package/dist/providers/openai.d.ts +3 -0
  64. package/dist/providers/openai.d.ts.map +1 -0
  65. package/dist/providers/openai.js +221 -0
  66. package/dist/providers/openai.js.map +1 -0
  67. package/dist/providers/registry.d.ts +10 -0
  68. package/dist/providers/registry.d.ts.map +1 -0
  69. package/dist/providers/registry.js +27 -0
  70. package/dist/providers/registry.js.map +1 -0
  71. package/dist/router.d.ts +29 -0
  72. package/dist/router.d.ts.map +1 -0
  73. package/dist/router.js +212 -0
  74. package/dist/router.js.map +1 -0
  75. package/dist/server.d.ts +10 -0
  76. package/dist/server.d.ts.map +1 -0
  77. package/dist/server.js +149 -0
  78. package/dist/server.js.map +1 -0
  79. package/dist/types.d.ts +283 -0
  80. package/dist/types.d.ts.map +1 -0
  81. package/dist/types.js +21 -0
  82. package/dist/types.js.map +1 -0
  83. package/dist/utils/fs-io.d.ts +40 -0
  84. package/dist/utils/fs-io.d.ts.map +1 -0
  85. package/dist/utils/fs-io.js +203 -0
  86. package/dist/utils/fs-io.js.map +1 -0
  87. package/dist/utils/generation-stats.d.ts +25 -0
  88. package/dist/utils/generation-stats.d.ts.map +1 -0
  89. package/dist/utils/generation-stats.js +46 -0
  90. package/dist/utils/generation-stats.js.map +1 -0
  91. package/dist/utils/id.d.ts +2 -0
  92. package/dist/utils/id.d.ts.map +1 -0
  93. package/dist/utils/id.js +6 -0
  94. package/dist/utils/id.js.map +1 -0
  95. package/dist/utils/model-parser.d.ts +6 -0
  96. package/dist/utils/model-parser.d.ts.map +1 -0
  97. package/dist/utils/model-parser.js +21 -0
  98. package/dist/utils/model-parser.js.map +1 -0
  99. package/dist/utils/rate-limiter.d.ts +36 -0
  100. package/dist/utils/rate-limiter.d.ts.map +1 -0
  101. package/dist/utils/rate-limiter.js +80 -0
  102. package/dist/utils/rate-limiter.js.map +1 -0
  103. package/dist/utils/retry.d.ts +7 -0
  104. package/dist/utils/retry.d.ts.map +1 -0
  105. package/dist/utils/retry.js +54 -0
  106. package/dist/utils/retry.js.map +1 -0
  107. package/dist/utils/transforms.d.ts +7 -0
  108. package/dist/utils/transforms.d.ts.map +1 -0
  109. package/dist/utils/transforms.js +66 -0
  110. package/dist/utils/transforms.js.map +1 -0
  111. package/dist/utils/validate.d.ts +3 -0
  112. package/dist/utils/validate.d.ts.map +1 -0
  113. package/dist/utils/validate.js +31 -0
  114. package/dist/utils/validate.js.map +1 -0
  115. package/package.json +9 -2
@@ -0,0 +1 @@
1
+ {"version":3,"file":"store.d.ts","sourceRoot":"","sources":["../../src/batch/store.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,WAAW,EAAE,eAAe,EAAE,MAAM,aAAa,CAAC;AAiBhE;;;;GAIG;AACH,qBAAa,UAAU;IACrB,OAAO,CAAC,GAAG,CAAS;IACpB,OAAO,CAAC,WAAW,CAAS;gBAEhB,GAAG,CAAC,EAAE,MAAM;YAIV,IAAI;IAMlB,OAAO,CAAC,QAAQ;IAIhB;;OAEG;IACG,MAAM,CAAC,KAAK,EAAE,WAAW,GAAG,OAAO,CAAC,IAAI,CAAC;IAO/C;;OAEG;IACG,UAAU,CAAC,KAAK,EAAE,WAAW,GAAG,OAAO,CAAC,IAAI,CAAC;IAOnD;;OAEG;IACG,YAAY,CAAC,EAAE,EAAE,MAAM,EAAE,QAAQ,EAAE,OAAO,EAAE,GAAG,OAAO,CAAC,IAAI,CAAC;IAKlE;;OAEG;IACG,YAAY,CAAC,EAAE,EAAE,MAAM,EAAE,MAAM,EAAE,eAAe,GAAG,OAAO,CAAC,IAAI,CAAC;IAOtE;;OAEG;IACG,iBAAiB,CAAC,EAAE,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,OAAO,CAAC,IAAI,CAAC;IAOlF;;OAEG;IACG,iBAAiB,CAAC,EAAE,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,IAAI,CAAC;IAM5E;;OAEG;IACG,OAAO,CAAC,EAAE,EAAE,MAAM,GAAG,OAAO,CAAC,WAAW,GAAG,IAAI,CAAC;IAMtD;;OAEG;IACG,UAAU,CAAC,EAAE,EAAE,MAAM,GAAG,OAAO,CAAC,eAAe,EAAE,CAAC;IAWxD;;OAEG;IACG,WAAW,IAAI,OAAO,CAAC,MAAM,EAAE,CAAC;IAUtC;;OAEG;IACG,MAAM,CAAC,EAAE,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC;CAG3C"}
@@ -0,0 +1,109 @@
1
+ import { ensureDir, readFileQueued, readJsonQueued, readDirQueued, writeFileQueued, writeFileFlushedQueued, appendFileQueued, pathExistsQueued, fileExistsQueued, joinPath, resolvePath, } from '../utils/fs-io.js';
2
+ const DEFAULT_BATCH_DIR = joinPath(process.cwd(), '.anymodel', 'batches');
3
+ /**
4
+ * Disk-based batch persistence store.
5
+ * Uses queued, concurrency-limited IO for high-volume operations.
6
+ * Structure: {dir}/{batchId}/meta.json, requests.jsonl, results.jsonl, provider.json
7
+ */
8
+ export class BatchStore {
9
+ dir;
10
+ initialized = false;
11
+ constructor(dir) {
12
+ this.dir = resolvePath(dir || DEFAULT_BATCH_DIR);
13
+ }
14
+ async init() {
15
+ if (this.initialized)
16
+ return;
17
+ await ensureDir(this.dir);
18
+ this.initialized = true;
19
+ }
20
+ batchDir(id) {
21
+ return joinPath(this.dir, id);
22
+ }
23
+ /**
24
+ * Create a new batch directory and save initial metadata.
25
+ */
26
+ async create(batch) {
27
+ await this.init();
28
+ const dir = this.batchDir(batch.id);
29
+ await ensureDir(dir);
30
+ await writeFileFlushedQueued(joinPath(dir, 'meta.json'), JSON.stringify(batch, null, 2));
31
+ }
32
+ /**
33
+ * Update batch metadata (atomic write).
34
+ */
35
+ async updateMeta(batch) {
36
+ await writeFileFlushedQueued(joinPath(this.batchDir(batch.id), 'meta.json'), JSON.stringify(batch, null, 2));
37
+ }
38
+ /**
39
+ * Save requests as JSONL.
40
+ */
41
+ async saveRequests(id, requests) {
42
+ const lines = requests.map(r => JSON.stringify(r)).join('\n') + '\n';
43
+ await writeFileQueued(joinPath(this.batchDir(id), 'requests.jsonl'), lines);
44
+ }
45
+ /**
46
+ * Append a result to results.jsonl.
47
+ */
48
+ async appendResult(id, result) {
49
+ await appendFileQueued(joinPath(this.batchDir(id), 'results.jsonl'), JSON.stringify(result) + '\n');
50
+ }
51
+ /**
52
+ * Save provider-specific state (e.g., provider batch ID).
53
+ */
54
+ async saveProviderState(id, state) {
55
+ await writeFileFlushedQueued(joinPath(this.batchDir(id), 'provider.json'), JSON.stringify(state, null, 2));
56
+ }
57
+ /**
58
+ * Load provider state.
59
+ */
60
+ async loadProviderState(id) {
61
+ const p = joinPath(this.batchDir(id), 'provider.json');
62
+ if (!(await fileExistsQueued(p)))
63
+ return null;
64
+ return readJsonQueued(p);
65
+ }
66
+ /**
67
+ * Get batch metadata.
68
+ */
69
+ async getMeta(id) {
70
+ const p = joinPath(this.batchDir(id), 'meta.json');
71
+ if (!(await fileExistsQueued(p)))
72
+ return null;
73
+ return readJsonQueued(p);
74
+ }
75
+ /**
76
+ * Get all results for a batch.
77
+ */
78
+ async getResults(id) {
79
+ const p = joinPath(this.batchDir(id), 'results.jsonl');
80
+ if (!(await fileExistsQueued(p)))
81
+ return [];
82
+ const raw = (await readFileQueued(p, 'utf8'));
83
+ return raw
84
+ .trim()
85
+ .split('\n')
86
+ .filter(Boolean)
87
+ .map(line => JSON.parse(line));
88
+ }
89
+ /**
90
+ * List all batch IDs.
91
+ */
92
+ async listBatches() {
93
+ await this.init();
94
+ if (!(await pathExistsQueued(this.dir)))
95
+ return [];
96
+ const entries = await readDirQueued(this.dir);
97
+ return entries
98
+ .filter(d => d.isDirectory())
99
+ .map(d => d.name)
100
+ .sort();
101
+ }
102
+ /**
103
+ * Check if a batch exists.
104
+ */
105
+ async exists(id) {
106
+ return fileExistsQueued(joinPath(this.batchDir(id), 'meta.json'));
107
+ }
108
+ }
109
+ //# sourceMappingURL=store.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"store.js","sourceRoot":"","sources":["../../src/batch/store.ts"],"names":[],"mappings":"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"}
package/dist/cli.cjs CHANGED
@@ -623,7 +623,7 @@ function createOpenAIAdapter(apiKey, baseURL) {
623
623
  async listModels() {
624
624
  const res = await makeRequest("/models", void 0, "GET");
625
625
  const data = await res.json();
626
- return (data.data || []).filter((m) => m.id.startsWith("gpt-") || m.id.startsWith("o") || m.id.startsWith("chatgpt-")).map((m) => ({
626
+ return (data.data || []).filter((m) => m.id.startsWith("gpt-") || m.id.startsWith("o1") || m.id.startsWith("o3") || m.id.startsWith("o4") || m.id.startsWith("chatgpt-")).map((m) => ({
627
627
  id: `openai/${m.id}`,
628
628
  name: m.id,
629
629
  created: m.created,
@@ -689,9 +689,10 @@ var SUPPORTED_PARAMS2 = /* @__PURE__ */ new Set([
689
689
  "tool_choice",
690
690
  "response_format"
691
691
  ]);
692
- var KNOWN_MODELS = [
692
+ var FALLBACK_MODELS = [
693
693
  { id: "anthropic/claude-opus-4-6", name: "Claude Opus 4.6", created: 0, description: "Most capable model", context_length: 2e5, pricing: { prompt: "0.000005", completion: "0.000025" }, architecture: { modality: "text+image->text", input_modalities: ["text", "image"], output_modalities: ["text"], tokenizer: "claude" }, top_provider: { context_length: 2e5, max_completion_tokens: 32768, is_moderated: false }, supported_parameters: Array.from(SUPPORTED_PARAMS2) },
694
694
  { id: "anthropic/claude-sonnet-4-6", name: "Claude Sonnet 4.6", created: 0, description: "Best balance of speed and capability", context_length: 2e5, pricing: { prompt: "0.000003", completion: "0.000015" }, architecture: { modality: "text+image->text", input_modalities: ["text", "image"], output_modalities: ["text"], tokenizer: "claude" }, top_provider: { context_length: 2e5, max_completion_tokens: 16384, is_moderated: false }, supported_parameters: Array.from(SUPPORTED_PARAMS2) },
695
+ { id: "anthropic/claude-sonnet-4-5-20251022", name: "Claude Sonnet 4.5", created: 0, description: "Previous generation balanced model", context_length: 2e5, pricing: { prompt: "0.000003", completion: "0.000015" }, architecture: { modality: "text+image->text", input_modalities: ["text", "image"], output_modalities: ["text"], tokenizer: "claude" }, top_provider: { context_length: 2e5, max_completion_tokens: 16384, is_moderated: false }, supported_parameters: Array.from(SUPPORTED_PARAMS2) },
695
696
  { id: "anthropic/claude-haiku-4-5", name: "Claude Haiku 4.5", created: 0, description: "Fastest and most compact", context_length: 2e5, pricing: { prompt: "0.000001", completion: "0.000005" }, architecture: { modality: "text+image->text", input_modalities: ["text", "image"], output_modalities: ["text"], tokenizer: "claude" }, top_provider: { context_length: 2e5, max_completion_tokens: 8192, is_moderated: false }, supported_parameters: Array.from(SUPPORTED_PARAMS2) }
696
697
  ];
697
698
  function createAnthropicAdapter(apiKey) {
@@ -952,7 +953,40 @@ ${body.system}` : jsonInstruction;
952
953
  };
953
954
  },
954
955
  async listModels() {
955
- return KNOWN_MODELS;
956
+ try {
957
+ const res = await fetch(`${ANTHROPIC_API_BASE}/models`, {
958
+ method: "GET",
959
+ headers: {
960
+ "x-api-key": apiKey,
961
+ "anthropic-version": ANTHROPIC_VERSION
962
+ }
963
+ });
964
+ if (!res.ok) return FALLBACK_MODELS;
965
+ const data = await res.json();
966
+ const models = data.data || [];
967
+ return models.filter((m) => m.type === "model").map((m) => ({
968
+ id: `anthropic/${m.id}`,
969
+ name: m.display_name || m.id,
970
+ created: m.created_at ? new Date(m.created_at).getTime() / 1e3 : 0,
971
+ description: m.display_name || "",
972
+ context_length: 2e5,
973
+ pricing: { prompt: "0", completion: "0" },
974
+ architecture: {
975
+ modality: "text+image->text",
976
+ input_modalities: ["text", "image"],
977
+ output_modalities: ["text"],
978
+ tokenizer: "claude"
979
+ },
980
+ top_provider: {
981
+ context_length: 2e5,
982
+ max_completion_tokens: 16384,
983
+ is_moderated: false
984
+ },
985
+ supported_parameters: Array.from(SUPPORTED_PARAMS2)
986
+ }));
987
+ } catch {
988
+ return FALLBACK_MODELS;
989
+ }
956
990
  },
957
991
  supportsParameter(param) {
958
992
  return SUPPORTED_PARAMS2.has(param);
@@ -990,7 +1024,7 @@ var SUPPORTED_PARAMS3 = /* @__PURE__ */ new Set([
990
1024
  "tool_choice",
991
1025
  "response_format"
992
1026
  ]);
993
- var KNOWN_MODELS2 = [
1027
+ var FALLBACK_MODELS2 = [
994
1028
  { id: "google/gemini-2.5-pro", name: "Gemini 2.5 Pro", created: 0, description: "Most capable Gemini model", context_length: 1048576, pricing: { prompt: "0.00000125", completion: "0.000005" }, architecture: { modality: "text+image->text", input_modalities: ["text", "image", "video", "audio"], output_modalities: ["text"], tokenizer: "gemini" }, top_provider: { context_length: 1048576, max_completion_tokens: 65536, is_moderated: false }, supported_parameters: Array.from(SUPPORTED_PARAMS3) },
995
1029
  { id: "google/gemini-2.5-flash", name: "Gemini 2.5 Flash", created: 0, description: "Fast and efficient", context_length: 1048576, pricing: { prompt: "0.00000015", completion: "0.0000006" }, architecture: { modality: "text+image->text", input_modalities: ["text", "image", "video", "audio"], output_modalities: ["text"], tokenizer: "gemini" }, top_provider: { context_length: 1048576, max_completion_tokens: 65536, is_moderated: false }, supported_parameters: Array.from(SUPPORTED_PARAMS3) }
996
1030
  ];
@@ -1194,7 +1228,37 @@ function createGoogleAdapter(apiKey) {
1194
1228
  };
1195
1229
  },
1196
1230
  async listModels() {
1197
- return KNOWN_MODELS2;
1231
+ try {
1232
+ const res = await fetch(`${GEMINI_API_BASE}/models?key=${apiKey}`);
1233
+ if (!res.ok) return FALLBACK_MODELS2;
1234
+ const data = await res.json();
1235
+ const models = data.models || [];
1236
+ return models.filter((m) => m.name?.startsWith("models/gemini-") && m.supportedGenerationMethods?.includes("generateContent")).map((m) => {
1237
+ const modelId = m.name.replace("models/", "");
1238
+ return {
1239
+ id: `google/${modelId}`,
1240
+ name: m.displayName || modelId,
1241
+ created: 0,
1242
+ description: m.description || "",
1243
+ context_length: m.inputTokenLimit || 1048576,
1244
+ pricing: { prompt: "0", completion: "0" },
1245
+ architecture: {
1246
+ modality: "text+image->text",
1247
+ input_modalities: ["text", "image", "video", "audio"],
1248
+ output_modalities: ["text"],
1249
+ tokenizer: "gemini"
1250
+ },
1251
+ top_provider: {
1252
+ context_length: m.inputTokenLimit || 1048576,
1253
+ max_completion_tokens: m.outputTokenLimit || 65536,
1254
+ is_moderated: false
1255
+ },
1256
+ supported_parameters: Array.from(SUPPORTED_PARAMS3)
1257
+ };
1258
+ });
1259
+ } catch {
1260
+ return FALLBACK_MODELS2;
1261
+ }
1198
1262
  },
1199
1263
  supportsParameter(param) {
1200
1264
  return SUPPORTED_PARAMS3.has(param);
@@ -1358,14 +1422,22 @@ function deepMerge(target, source) {
1358
1422
  }
1359
1423
  function envConfig() {
1360
1424
  const config = {};
1361
- if (process.env.ANTHROPIC_API_KEY) {
1362
- config.anthropic = { apiKey: process.env.ANTHROPIC_API_KEY };
1363
- }
1364
- if (process.env.OPENAI_API_KEY) {
1365
- config.openai = { apiKey: process.env.OPENAI_API_KEY };
1366
- }
1367
- if (process.env.GOOGLE_API_KEY) {
1368
- config.google = { apiKey: process.env.GOOGLE_API_KEY };
1425
+ const envMap = [
1426
+ ["openai", "OPENAI_API_KEY"],
1427
+ ["anthropic", "ANTHROPIC_API_KEY"],
1428
+ ["google", "GOOGLE_API_KEY"],
1429
+ ["mistral", "MISTRAL_API_KEY"],
1430
+ ["groq", "GROQ_API_KEY"],
1431
+ ["deepseek", "DEEPSEEK_API_KEY"],
1432
+ ["xai", "XAI_API_KEY"],
1433
+ ["together", "TOGETHER_API_KEY"],
1434
+ ["fireworks", "FIREWORKS_API_KEY"],
1435
+ ["perplexity", "PERPLEXITY_API_KEY"]
1436
+ ];
1437
+ for (const [key, envVar] of envMap) {
1438
+ if (process.env[envVar]) {
1439
+ config[key] = { apiKey: process.env[envVar] };
1440
+ }
1369
1441
  }
1370
1442
  return config;
1371
1443
  }
@@ -1780,21 +1852,42 @@ var AnyModel = class {
1780
1852
  };
1781
1853
  }
1782
1854
  registerProviders() {
1783
- const { anthropic, openai, google } = this.config;
1784
- const anthropicKey = anthropic?.apiKey || process.env.ANTHROPIC_API_KEY;
1785
- const openaiKey = openai?.apiKey || process.env.OPENAI_API_KEY;
1786
- const googleKey = google?.apiKey || process.env.GOOGLE_API_KEY;
1855
+ const config = this.config;
1856
+ const openaiKey = config.openai?.apiKey || process.env.OPENAI_API_KEY;
1787
1857
  if (openaiKey) {
1788
1858
  this.registry.register("openai", createOpenAIAdapter(openaiKey));
1789
1859
  }
1860
+ const anthropicKey = config.anthropic?.apiKey || process.env.ANTHROPIC_API_KEY;
1790
1861
  if (anthropicKey) {
1791
1862
  this.registry.register("anthropic", createAnthropicAdapter(anthropicKey));
1792
1863
  }
1864
+ const googleKey = config.google?.apiKey || process.env.GOOGLE_API_KEY;
1793
1865
  if (googleKey) {
1794
1866
  this.registry.register("google", createGoogleAdapter(googleKey));
1795
1867
  }
1796
- if (this.config.custom) {
1797
- for (const [name, customConfig] of Object.entries(this.config.custom)) {
1868
+ const builtinProviders = [
1869
+ { name: "mistral", baseURL: "https://api.mistral.ai/v1", configKey: "mistral", envVar: "MISTRAL_API_KEY" },
1870
+ { name: "groq", baseURL: "https://api.groq.com/openai/v1", configKey: "groq", envVar: "GROQ_API_KEY" },
1871
+ { name: "deepseek", baseURL: "https://api.deepseek.com", configKey: "deepseek", envVar: "DEEPSEEK_API_KEY" },
1872
+ { name: "xai", baseURL: "https://api.x.ai/v1", configKey: "xai", envVar: "XAI_API_KEY" },
1873
+ { name: "together", baseURL: "https://api.together.xyz/v1", configKey: "together", envVar: "TOGETHER_API_KEY" },
1874
+ { name: "fireworks", baseURL: "https://api.fireworks.ai/inference/v1", configKey: "fireworks", envVar: "FIREWORKS_API_KEY" },
1875
+ { name: "perplexity", baseURL: "https://api.perplexity.ai", configKey: "perplexity", envVar: "PERPLEXITY_API_KEY" }
1876
+ ];
1877
+ for (const { name, baseURL, configKey, envVar } of builtinProviders) {
1878
+ const providerConfig = config[configKey];
1879
+ const key = providerConfig?.apiKey || process.env[envVar];
1880
+ if (key) {
1881
+ this.registry.register(name, createCustomAdapter(name, { baseURL, apiKey: key }));
1882
+ }
1883
+ }
1884
+ const ollamaConfig = config.ollama;
1885
+ const ollamaURL = ollamaConfig?.baseURL || process.env.OLLAMA_BASE_URL || "http://localhost:11434/v1";
1886
+ if (ollamaConfig || process.env.OLLAMA_BASE_URL) {
1887
+ this.registry.register("ollama", createCustomAdapter("ollama", { baseURL: ollamaURL }));
1888
+ }
1889
+ if (config.custom) {
1890
+ for (const [name, customConfig] of Object.entries(config.custom)) {
1798
1891
  this.registry.register(name, createCustomAdapter(name, customConfig));
1799
1892
  }
1800
1893
  }