@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.
- package/README.md +117 -10
- package/dist/batch/index.d.ts +4 -0
- package/dist/batch/index.d.ts.map +1 -0
- package/dist/batch/index.js +3 -0
- package/dist/batch/index.js.map +1 -0
- package/dist/batch/manager.d.ts +72 -0
- package/dist/batch/manager.d.ts.map +1 -0
- package/dist/batch/manager.js +328 -0
- package/dist/batch/manager.js.map +1 -0
- package/dist/batch/store.d.ts +54 -0
- package/dist/batch/store.d.ts.map +1 -0
- package/dist/batch/store.js +109 -0
- package/dist/batch/store.js.map +1 -0
- package/dist/cli.cjs +112 -19
- package/dist/cli.cjs.map +1 -1
- package/dist/cli.d.ts +2 -0
- package/dist/cli.d.ts.map +1 -0
- package/dist/cli.js +28 -1993
- package/dist/cli.js.map +1 -1
- package/dist/client.d.ts +42 -0
- package/dist/client.d.ts.map +1 -0
- package/dist/client.js +181 -0
- package/dist/client.js.map +1 -0
- package/dist/config.d.ts +6 -0
- package/dist/config.d.ts.map +1 -0
- package/dist/config.js +120 -0
- package/dist/config.js.map +1 -0
- package/dist/index.cjs +112 -19
- package/dist/index.cjs.map +1 -1
- package/dist/index.d.cts +10 -0
- package/dist/index.d.ts +14 -538
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +15 -1972
- package/dist/index.js.map +1 -1
- package/dist/providers/adapter.d.ts +33 -0
- package/dist/providers/adapter.d.ts.map +1 -0
- package/dist/providers/adapter.js +2 -0
- package/dist/providers/adapter.js.map +1 -0
- package/dist/providers/anthropic-batch.d.ts +3 -0
- package/dist/providers/anthropic-batch.d.ts.map +1 -0
- package/dist/providers/anthropic-batch.js +228 -0
- package/dist/providers/anthropic-batch.js.map +1 -0
- package/dist/providers/anthropic.d.ts +3 -0
- package/dist/providers/anthropic.d.ts.map +1 -0
- package/dist/providers/anthropic.js +358 -0
- package/dist/providers/anthropic.js.map +1 -0
- package/dist/providers/custom.d.ts +8 -0
- package/dist/providers/custom.d.ts.map +1 -0
- package/dist/providers/custom.js +61 -0
- package/dist/providers/custom.js.map +1 -0
- package/dist/providers/google.d.ts +3 -0
- package/dist/providers/google.d.ts.map +1 -0
- package/dist/providers/google.js +331 -0
- package/dist/providers/google.js.map +1 -0
- package/dist/providers/index.d.ts +6 -0
- package/dist/providers/index.d.ts.map +1 -0
- package/dist/providers/index.js +5 -0
- package/dist/providers/index.js.map +1 -0
- package/dist/providers/openai-batch.d.ts +3 -0
- package/dist/providers/openai-batch.d.ts.map +1 -0
- package/dist/providers/openai-batch.js +208 -0
- package/dist/providers/openai-batch.js.map +1 -0
- package/dist/providers/openai.d.ts +3 -0
- package/dist/providers/openai.d.ts.map +1 -0
- package/dist/providers/openai.js +221 -0
- package/dist/providers/openai.js.map +1 -0
- package/dist/providers/registry.d.ts +10 -0
- package/dist/providers/registry.d.ts.map +1 -0
- package/dist/providers/registry.js +27 -0
- package/dist/providers/registry.js.map +1 -0
- package/dist/router.d.ts +29 -0
- package/dist/router.d.ts.map +1 -0
- package/dist/router.js +212 -0
- package/dist/router.js.map +1 -0
- package/dist/server.d.ts +10 -0
- package/dist/server.d.ts.map +1 -0
- package/dist/server.js +149 -0
- package/dist/server.js.map +1 -0
- package/dist/types.d.ts +283 -0
- package/dist/types.d.ts.map +1 -0
- package/dist/types.js +21 -0
- package/dist/types.js.map +1 -0
- package/dist/utils/fs-io.d.ts +40 -0
- package/dist/utils/fs-io.d.ts.map +1 -0
- package/dist/utils/fs-io.js +203 -0
- package/dist/utils/fs-io.js.map +1 -0
- package/dist/utils/generation-stats.d.ts +25 -0
- package/dist/utils/generation-stats.d.ts.map +1 -0
- package/dist/utils/generation-stats.js +46 -0
- package/dist/utils/generation-stats.js.map +1 -0
- package/dist/utils/id.d.ts +2 -0
- package/dist/utils/id.d.ts.map +1 -0
- package/dist/utils/id.js +6 -0
- package/dist/utils/id.js.map +1 -0
- package/dist/utils/model-parser.d.ts +6 -0
- package/dist/utils/model-parser.d.ts.map +1 -0
- package/dist/utils/model-parser.js +21 -0
- package/dist/utils/model-parser.js.map +1 -0
- package/dist/utils/rate-limiter.d.ts +36 -0
- package/dist/utils/rate-limiter.d.ts.map +1 -0
- package/dist/utils/rate-limiter.js +80 -0
- package/dist/utils/rate-limiter.js.map +1 -0
- package/dist/utils/retry.d.ts +7 -0
- package/dist/utils/retry.d.ts.map +1 -0
- package/dist/utils/retry.js +54 -0
- package/dist/utils/retry.js.map +1 -0
- package/dist/utils/transforms.d.ts +7 -0
- package/dist/utils/transforms.d.ts.map +1 -0
- package/dist/utils/transforms.js +66 -0
- package/dist/utils/transforms.js.map +1 -0
- package/dist/utils/validate.d.ts +3 -0
- package/dist/utils/validate.d.ts.map +1 -0
- package/dist/utils/validate.js +31 -0
- package/dist/utils/validate.js.map +1 -0
- package/package.json +9 -2
package/dist/config.js
ADDED
|
@@ -0,0 +1,120 @@
|
|
|
1
|
+
import { readFileSync, existsSync } from 'node:fs';
|
|
2
|
+
import { resolve, join } from 'node:path';
|
|
3
|
+
import { homedir } from 'node:os';
|
|
4
|
+
const LOCAL_CONFIG_NAMES = ['anymodel.config.json'];
|
|
5
|
+
const GLOBAL_CONFIG_DIR = join(homedir(), '.anymodel');
|
|
6
|
+
const GLOBAL_CONFIG_FILE = join(GLOBAL_CONFIG_DIR, 'config.json');
|
|
7
|
+
/**
|
|
8
|
+
* Interpolate ${ENV_VAR} references in string values.
|
|
9
|
+
*/
|
|
10
|
+
function interpolateEnvVars(value) {
|
|
11
|
+
return value.replace(/\$\{([^}]+)\}/g, (_, name) => process.env[name] || '');
|
|
12
|
+
}
|
|
13
|
+
/**
|
|
14
|
+
* Recursively walk an object and interpolate string values.
|
|
15
|
+
*/
|
|
16
|
+
function interpolateDeep(obj) {
|
|
17
|
+
if (typeof obj === 'string')
|
|
18
|
+
return interpolateEnvVars(obj);
|
|
19
|
+
if (Array.isArray(obj))
|
|
20
|
+
return obj.map(interpolateDeep);
|
|
21
|
+
if (obj !== null && typeof obj === 'object') {
|
|
22
|
+
const result = {};
|
|
23
|
+
for (const [key, val] of Object.entries(obj)) {
|
|
24
|
+
result[key] = interpolateDeep(val);
|
|
25
|
+
}
|
|
26
|
+
return result;
|
|
27
|
+
}
|
|
28
|
+
return obj;
|
|
29
|
+
}
|
|
30
|
+
/**
|
|
31
|
+
* Load a JSON config file, returning null if not found.
|
|
32
|
+
*/
|
|
33
|
+
function loadJsonFile(path) {
|
|
34
|
+
if (!existsSync(path))
|
|
35
|
+
return null;
|
|
36
|
+
try {
|
|
37
|
+
const raw = readFileSync(path, 'utf-8');
|
|
38
|
+
const parsed = JSON.parse(raw);
|
|
39
|
+
return interpolateDeep(parsed);
|
|
40
|
+
}
|
|
41
|
+
catch {
|
|
42
|
+
return null;
|
|
43
|
+
}
|
|
44
|
+
}
|
|
45
|
+
/**
|
|
46
|
+
* Find local config file in the working directory.
|
|
47
|
+
*/
|
|
48
|
+
function findLocalConfig(cwd) {
|
|
49
|
+
const dir = cwd || process.cwd();
|
|
50
|
+
for (const name of LOCAL_CONFIG_NAMES) {
|
|
51
|
+
const config = loadJsonFile(resolve(dir, name));
|
|
52
|
+
if (config)
|
|
53
|
+
return config;
|
|
54
|
+
}
|
|
55
|
+
return null;
|
|
56
|
+
}
|
|
57
|
+
/**
|
|
58
|
+
* Load global config from ~/.anymodel/config.json
|
|
59
|
+
*/
|
|
60
|
+
function findGlobalConfig() {
|
|
61
|
+
return loadJsonFile(GLOBAL_CONFIG_FILE);
|
|
62
|
+
}
|
|
63
|
+
/**
|
|
64
|
+
* Deep merge two config objects. Source values override target values.
|
|
65
|
+
* Provider-level objects are merged, not replaced.
|
|
66
|
+
*/
|
|
67
|
+
function deepMerge(target, source) {
|
|
68
|
+
const result = { ...target };
|
|
69
|
+
for (const [key, value] of Object.entries(source)) {
|
|
70
|
+
if (value === undefined)
|
|
71
|
+
continue;
|
|
72
|
+
const existing = target[key];
|
|
73
|
+
if (existing !== null && typeof existing === 'object' && !Array.isArray(existing) &&
|
|
74
|
+
value !== null && typeof value === 'object' && !Array.isArray(value)) {
|
|
75
|
+
result[key] = deepMerge(existing, value);
|
|
76
|
+
}
|
|
77
|
+
else {
|
|
78
|
+
result[key] = value;
|
|
79
|
+
}
|
|
80
|
+
}
|
|
81
|
+
return result;
|
|
82
|
+
}
|
|
83
|
+
/**
|
|
84
|
+
* Build config from env vars only (auto-detected API keys).
|
|
85
|
+
*/
|
|
86
|
+
function envConfig() {
|
|
87
|
+
const config = {};
|
|
88
|
+
const envMap = [
|
|
89
|
+
['openai', 'OPENAI_API_KEY'],
|
|
90
|
+
['anthropic', 'ANTHROPIC_API_KEY'],
|
|
91
|
+
['google', 'GOOGLE_API_KEY'],
|
|
92
|
+
['mistral', 'MISTRAL_API_KEY'],
|
|
93
|
+
['groq', 'GROQ_API_KEY'],
|
|
94
|
+
['deepseek', 'DEEPSEEK_API_KEY'],
|
|
95
|
+
['xai', 'XAI_API_KEY'],
|
|
96
|
+
['together', 'TOGETHER_API_KEY'],
|
|
97
|
+
['fireworks', 'FIREWORKS_API_KEY'],
|
|
98
|
+
['perplexity', 'PERPLEXITY_API_KEY'],
|
|
99
|
+
];
|
|
100
|
+
for (const [key, envVar] of envMap) {
|
|
101
|
+
if (process.env[envVar]) {
|
|
102
|
+
config[key] = { apiKey: process.env[envVar] };
|
|
103
|
+
}
|
|
104
|
+
}
|
|
105
|
+
return config;
|
|
106
|
+
}
|
|
107
|
+
/**
|
|
108
|
+
* Resolve config with precedence: programmatic → local → global → env vars.
|
|
109
|
+
*/
|
|
110
|
+
export function resolveConfig(programmatic = {}, cwd) {
|
|
111
|
+
const env = envConfig();
|
|
112
|
+
const global = findGlobalConfig() || {};
|
|
113
|
+
const local = findLocalConfig(cwd) || {};
|
|
114
|
+
// Lowest priority first, each layer overrides the previous
|
|
115
|
+
let config = deepMerge(env, global);
|
|
116
|
+
config = deepMerge(config, local);
|
|
117
|
+
config = deepMerge(config, programmatic);
|
|
118
|
+
return config;
|
|
119
|
+
}
|
|
120
|
+
//# sourceMappingURL=config.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"config.js","sourceRoot":"","sources":["../src/config.ts"],"names":[],"mappings":"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"}
|
package/dist/index.cjs
CHANGED
|
@@ -650,7 +650,7 @@ function createOpenAIAdapter(apiKey, baseURL) {
|
|
|
650
650
|
async listModels() {
|
|
651
651
|
const res = await makeRequest("/models", void 0, "GET");
|
|
652
652
|
const data = await res.json();
|
|
653
|
-
return (data.data || []).filter((m) => m.id.startsWith("gpt-") || m.id.startsWith("
|
|
653
|
+
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) => ({
|
|
654
654
|
id: `openai/${m.id}`,
|
|
655
655
|
name: m.id,
|
|
656
656
|
created: m.created,
|
|
@@ -716,9 +716,10 @@ var SUPPORTED_PARAMS2 = /* @__PURE__ */ new Set([
|
|
|
716
716
|
"tool_choice",
|
|
717
717
|
"response_format"
|
|
718
718
|
]);
|
|
719
|
-
var
|
|
719
|
+
var FALLBACK_MODELS = [
|
|
720
720
|
{ 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) },
|
|
721
721
|
{ 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) },
|
|
722
|
+
{ 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) },
|
|
722
723
|
{ 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) }
|
|
723
724
|
];
|
|
724
725
|
function createAnthropicAdapter(apiKey) {
|
|
@@ -979,7 +980,40 @@ ${body.system}` : jsonInstruction;
|
|
|
979
980
|
};
|
|
980
981
|
},
|
|
981
982
|
async listModels() {
|
|
982
|
-
|
|
983
|
+
try {
|
|
984
|
+
const res = await fetch(`${ANTHROPIC_API_BASE}/models`, {
|
|
985
|
+
method: "GET",
|
|
986
|
+
headers: {
|
|
987
|
+
"x-api-key": apiKey,
|
|
988
|
+
"anthropic-version": ANTHROPIC_VERSION
|
|
989
|
+
}
|
|
990
|
+
});
|
|
991
|
+
if (!res.ok) return FALLBACK_MODELS;
|
|
992
|
+
const data = await res.json();
|
|
993
|
+
const models = data.data || [];
|
|
994
|
+
return models.filter((m) => m.type === "model").map((m) => ({
|
|
995
|
+
id: `anthropic/${m.id}`,
|
|
996
|
+
name: m.display_name || m.id,
|
|
997
|
+
created: m.created_at ? new Date(m.created_at).getTime() / 1e3 : 0,
|
|
998
|
+
description: m.display_name || "",
|
|
999
|
+
context_length: 2e5,
|
|
1000
|
+
pricing: { prompt: "0", completion: "0" },
|
|
1001
|
+
architecture: {
|
|
1002
|
+
modality: "text+image->text",
|
|
1003
|
+
input_modalities: ["text", "image"],
|
|
1004
|
+
output_modalities: ["text"],
|
|
1005
|
+
tokenizer: "claude"
|
|
1006
|
+
},
|
|
1007
|
+
top_provider: {
|
|
1008
|
+
context_length: 2e5,
|
|
1009
|
+
max_completion_tokens: 16384,
|
|
1010
|
+
is_moderated: false
|
|
1011
|
+
},
|
|
1012
|
+
supported_parameters: Array.from(SUPPORTED_PARAMS2)
|
|
1013
|
+
}));
|
|
1014
|
+
} catch {
|
|
1015
|
+
return FALLBACK_MODELS;
|
|
1016
|
+
}
|
|
983
1017
|
},
|
|
984
1018
|
supportsParameter(param) {
|
|
985
1019
|
return SUPPORTED_PARAMS2.has(param);
|
|
@@ -1017,7 +1051,7 @@ var SUPPORTED_PARAMS3 = /* @__PURE__ */ new Set([
|
|
|
1017
1051
|
"tool_choice",
|
|
1018
1052
|
"response_format"
|
|
1019
1053
|
]);
|
|
1020
|
-
var
|
|
1054
|
+
var FALLBACK_MODELS2 = [
|
|
1021
1055
|
{ 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) },
|
|
1022
1056
|
{ 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) }
|
|
1023
1057
|
];
|
|
@@ -1221,7 +1255,37 @@ function createGoogleAdapter(apiKey) {
|
|
|
1221
1255
|
};
|
|
1222
1256
|
},
|
|
1223
1257
|
async listModels() {
|
|
1224
|
-
|
|
1258
|
+
try {
|
|
1259
|
+
const res = await fetch(`${GEMINI_API_BASE}/models?key=${apiKey}`);
|
|
1260
|
+
if (!res.ok) return FALLBACK_MODELS2;
|
|
1261
|
+
const data = await res.json();
|
|
1262
|
+
const models = data.models || [];
|
|
1263
|
+
return models.filter((m) => m.name?.startsWith("models/gemini-") && m.supportedGenerationMethods?.includes("generateContent")).map((m) => {
|
|
1264
|
+
const modelId = m.name.replace("models/", "");
|
|
1265
|
+
return {
|
|
1266
|
+
id: `google/${modelId}`,
|
|
1267
|
+
name: m.displayName || modelId,
|
|
1268
|
+
created: 0,
|
|
1269
|
+
description: m.description || "",
|
|
1270
|
+
context_length: m.inputTokenLimit || 1048576,
|
|
1271
|
+
pricing: { prompt: "0", completion: "0" },
|
|
1272
|
+
architecture: {
|
|
1273
|
+
modality: "text+image->text",
|
|
1274
|
+
input_modalities: ["text", "image", "video", "audio"],
|
|
1275
|
+
output_modalities: ["text"],
|
|
1276
|
+
tokenizer: "gemini"
|
|
1277
|
+
},
|
|
1278
|
+
top_provider: {
|
|
1279
|
+
context_length: m.inputTokenLimit || 1048576,
|
|
1280
|
+
max_completion_tokens: m.outputTokenLimit || 65536,
|
|
1281
|
+
is_moderated: false
|
|
1282
|
+
},
|
|
1283
|
+
supported_parameters: Array.from(SUPPORTED_PARAMS3)
|
|
1284
|
+
};
|
|
1285
|
+
});
|
|
1286
|
+
} catch {
|
|
1287
|
+
return FALLBACK_MODELS2;
|
|
1288
|
+
}
|
|
1225
1289
|
},
|
|
1226
1290
|
supportsParameter(param) {
|
|
1227
1291
|
return SUPPORTED_PARAMS3.has(param);
|
|
@@ -1385,14 +1449,22 @@ function deepMerge(target, source) {
|
|
|
1385
1449
|
}
|
|
1386
1450
|
function envConfig() {
|
|
1387
1451
|
const config = {};
|
|
1388
|
-
|
|
1389
|
-
|
|
1390
|
-
|
|
1391
|
-
|
|
1392
|
-
|
|
1393
|
-
|
|
1394
|
-
|
|
1395
|
-
|
|
1452
|
+
const envMap = [
|
|
1453
|
+
["openai", "OPENAI_API_KEY"],
|
|
1454
|
+
["anthropic", "ANTHROPIC_API_KEY"],
|
|
1455
|
+
["google", "GOOGLE_API_KEY"],
|
|
1456
|
+
["mistral", "MISTRAL_API_KEY"],
|
|
1457
|
+
["groq", "GROQ_API_KEY"],
|
|
1458
|
+
["deepseek", "DEEPSEEK_API_KEY"],
|
|
1459
|
+
["xai", "XAI_API_KEY"],
|
|
1460
|
+
["together", "TOGETHER_API_KEY"],
|
|
1461
|
+
["fireworks", "FIREWORKS_API_KEY"],
|
|
1462
|
+
["perplexity", "PERPLEXITY_API_KEY"]
|
|
1463
|
+
];
|
|
1464
|
+
for (const [key, envVar] of envMap) {
|
|
1465
|
+
if (process.env[envVar]) {
|
|
1466
|
+
config[key] = { apiKey: process.env[envVar] };
|
|
1467
|
+
}
|
|
1396
1468
|
}
|
|
1397
1469
|
return config;
|
|
1398
1470
|
}
|
|
@@ -1807,21 +1879,42 @@ var AnyModel = class {
|
|
|
1807
1879
|
};
|
|
1808
1880
|
}
|
|
1809
1881
|
registerProviders() {
|
|
1810
|
-
const
|
|
1811
|
-
const
|
|
1812
|
-
const openaiKey = openai?.apiKey || process.env.OPENAI_API_KEY;
|
|
1813
|
-
const googleKey = google?.apiKey || process.env.GOOGLE_API_KEY;
|
|
1882
|
+
const config = this.config;
|
|
1883
|
+
const openaiKey = config.openai?.apiKey || process.env.OPENAI_API_KEY;
|
|
1814
1884
|
if (openaiKey) {
|
|
1815
1885
|
this.registry.register("openai", createOpenAIAdapter(openaiKey));
|
|
1816
1886
|
}
|
|
1887
|
+
const anthropicKey = config.anthropic?.apiKey || process.env.ANTHROPIC_API_KEY;
|
|
1817
1888
|
if (anthropicKey) {
|
|
1818
1889
|
this.registry.register("anthropic", createAnthropicAdapter(anthropicKey));
|
|
1819
1890
|
}
|
|
1891
|
+
const googleKey = config.google?.apiKey || process.env.GOOGLE_API_KEY;
|
|
1820
1892
|
if (googleKey) {
|
|
1821
1893
|
this.registry.register("google", createGoogleAdapter(googleKey));
|
|
1822
1894
|
}
|
|
1823
|
-
|
|
1824
|
-
|
|
1895
|
+
const builtinProviders = [
|
|
1896
|
+
{ name: "mistral", baseURL: "https://api.mistral.ai/v1", configKey: "mistral", envVar: "MISTRAL_API_KEY" },
|
|
1897
|
+
{ name: "groq", baseURL: "https://api.groq.com/openai/v1", configKey: "groq", envVar: "GROQ_API_KEY" },
|
|
1898
|
+
{ name: "deepseek", baseURL: "https://api.deepseek.com", configKey: "deepseek", envVar: "DEEPSEEK_API_KEY" },
|
|
1899
|
+
{ name: "xai", baseURL: "https://api.x.ai/v1", configKey: "xai", envVar: "XAI_API_KEY" },
|
|
1900
|
+
{ name: "together", baseURL: "https://api.together.xyz/v1", configKey: "together", envVar: "TOGETHER_API_KEY" },
|
|
1901
|
+
{ name: "fireworks", baseURL: "https://api.fireworks.ai/inference/v1", configKey: "fireworks", envVar: "FIREWORKS_API_KEY" },
|
|
1902
|
+
{ name: "perplexity", baseURL: "https://api.perplexity.ai", configKey: "perplexity", envVar: "PERPLEXITY_API_KEY" }
|
|
1903
|
+
];
|
|
1904
|
+
for (const { name, baseURL, configKey, envVar } of builtinProviders) {
|
|
1905
|
+
const providerConfig = config[configKey];
|
|
1906
|
+
const key = providerConfig?.apiKey || process.env[envVar];
|
|
1907
|
+
if (key) {
|
|
1908
|
+
this.registry.register(name, createCustomAdapter(name, { baseURL, apiKey: key }));
|
|
1909
|
+
}
|
|
1910
|
+
}
|
|
1911
|
+
const ollamaConfig = config.ollama;
|
|
1912
|
+
const ollamaURL = ollamaConfig?.baseURL || process.env.OLLAMA_BASE_URL || "http://localhost:11434/v1";
|
|
1913
|
+
if (ollamaConfig || process.env.OLLAMA_BASE_URL) {
|
|
1914
|
+
this.registry.register("ollama", createCustomAdapter("ollama", { baseURL: ollamaURL }));
|
|
1915
|
+
}
|
|
1916
|
+
if (config.custom) {
|
|
1917
|
+
for (const [name, customConfig] of Object.entries(config.custom)) {
|
|
1825
1918
|
this.registry.register(name, createCustomAdapter(name, customConfig));
|
|
1826
1919
|
}
|
|
1827
1920
|
}
|