@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
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("o") || m.id.startsWith("chatgpt-")).map((m) => ({
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 KNOWN_MODELS = [
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
- return KNOWN_MODELS;
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 KNOWN_MODELS2 = [
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
- return KNOWN_MODELS2;
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
- if (process.env.ANTHROPIC_API_KEY) {
1389
- config.anthropic = { apiKey: process.env.ANTHROPIC_API_KEY };
1390
- }
1391
- if (process.env.OPENAI_API_KEY) {
1392
- config.openai = { apiKey: process.env.OPENAI_API_KEY };
1393
- }
1394
- if (process.env.GOOGLE_API_KEY) {
1395
- config.google = { apiKey: process.env.GOOGLE_API_KEY };
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 { anthropic, openai, google } = this.config;
1811
- const anthropicKey = anthropic?.apiKey || process.env.ANTHROPIC_API_KEY;
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
- if (this.config.custom) {
1824
- for (const [name, customConfig] of Object.entries(this.config.custom)) {
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
  }