@anolilab/ai-model-registry 1.4.0 → 2.0.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 (147) hide show
  1. package/CHANGELOG.md +41 -0
  2. package/LICENSE.md +8 -13
  3. package/MIGRATION.md +474 -0
  4. package/README.md +94 -49
  5. package/dist/index.d.ts +16 -16
  6. package/dist/index.js +1 -3
  7. package/dist/packem_chunks/alibaba.js +1 -0
  8. package/dist/packem_chunks/amazon-bedrock.js +1 -0
  9. package/dist/packem_chunks/anthropic.js +1 -0
  10. package/dist/packem_chunks/api.js +75 -0
  11. package/dist/packem_chunks/azure-open-ai.js +1 -0
  12. package/dist/packem_chunks/cerebras.js +1 -0
  13. package/dist/packem_chunks/chutes.js +1 -0
  14. package/dist/packem_chunks/cloudflare.js +3 -0
  15. package/dist/packem_chunks/deep-infra.js +1 -0
  16. package/dist/packem_chunks/deep-seek.js +1 -0
  17. package/dist/packem_chunks/fireworks-ai.js +1 -0
  18. package/dist/packem_chunks/git-hub-copilot.js +1 -0
  19. package/dist/packem_chunks/git-hub-models.js +1 -0
  20. package/dist/packem_chunks/google-partner.js +1 -0
  21. package/dist/packem_chunks/google-vertex.js +1 -0
  22. package/dist/packem_chunks/google.js +1 -0
  23. package/dist/packem_chunks/groq.js +1 -0
  24. package/dist/packem_chunks/hugging-face.js +1 -0
  25. package/dist/packem_chunks/inception.js +1 -0
  26. package/dist/packem_chunks/inference.js +1 -0
  27. package/dist/packem_chunks/meta.js +1 -0
  28. package/dist/packem_chunks/mistral.js +1 -0
  29. package/dist/packem_chunks/model-scope.js +1 -0
  30. package/dist/packem_chunks/morph.js +1 -0
  31. package/dist/packem_chunks/open-ai.js +1 -0
  32. package/dist/packem_chunks/open-router.js +1 -0
  33. package/dist/packem_chunks/providers.js +1 -0
  34. package/dist/packem_chunks/requesty.js +73 -0
  35. package/dist/packem_chunks/together-ai.js +1 -0
  36. package/dist/packem_chunks/upstage.js +1 -0
  37. package/dist/packem_chunks/v0.js +1 -0
  38. package/dist/packem_chunks/venice.js +1 -0
  39. package/dist/packem_chunks/vercel.js +1 -0
  40. package/dist/packem_chunks/weights-_-biases.js +1 -0
  41. package/dist/packem_chunks/xai.js +1 -0
  42. package/dist/schema.d.ts +1 -1
  43. package/dist/schema.js +1 -1
  44. package/dist/types/alibaba.d.ts +6 -0
  45. package/dist/types/alibaba.js +0 -0
  46. package/dist/types/amazon-bedrock.d.ts +6 -0
  47. package/dist/types/amazon-bedrock.js +0 -0
  48. package/dist/types/anthropic.d.ts +6 -0
  49. package/dist/types/anthropic.js +0 -0
  50. package/dist/types/azure-open-ai.d.ts +6 -0
  51. package/dist/types/azure-open-ai.js +0 -0
  52. package/dist/types/cerebras.d.ts +6 -0
  53. package/dist/types/cerebras.js +0 -0
  54. package/dist/types/chutes.d.ts +6 -0
  55. package/dist/types/chutes.js +0 -0
  56. package/dist/types/cloudflare.d.ts +6 -0
  57. package/dist/types/cloudflare.js +0 -0
  58. package/dist/types/deep-infra.d.ts +6 -0
  59. package/dist/types/deep-infra.js +0 -0
  60. package/dist/types/deep-seek.d.ts +6 -0
  61. package/dist/types/deep-seek.js +0 -0
  62. package/dist/types/fireworks-ai.d.ts +6 -0
  63. package/dist/types/fireworks-ai.js +0 -0
  64. package/dist/types/git-hub-copilot.d.ts +6 -0
  65. package/dist/types/git-hub-copilot.js +0 -0
  66. package/dist/types/git-hub-models.d.ts +6 -0
  67. package/dist/types/git-hub-models.js +0 -0
  68. package/dist/types/google-partner.d.ts +6 -0
  69. package/dist/types/google-partner.js +0 -0
  70. package/dist/types/google-vertex.d.ts +6 -0
  71. package/dist/types/google-vertex.js +0 -0
  72. package/dist/types/google.d.ts +6 -0
  73. package/dist/types/google.js +0 -0
  74. package/dist/types/groq.d.ts +6 -0
  75. package/dist/types/groq.js +0 -0
  76. package/dist/types/hugging-face.d.ts +6 -0
  77. package/dist/types/hugging-face.js +0 -0
  78. package/dist/types/inception.d.ts +6 -0
  79. package/dist/types/inception.js +0 -0
  80. package/dist/types/inference.d.ts +6 -0
  81. package/dist/types/inference.js +0 -0
  82. package/dist/types/meta.d.ts +6 -0
  83. package/dist/types/meta.js +0 -0
  84. package/dist/types/mistral.d.ts +6 -0
  85. package/dist/types/mistral.js +0 -0
  86. package/dist/types/model-scope.d.ts +6 -0
  87. package/dist/types/model-scope.js +0 -0
  88. package/dist/types/morph.d.ts +6 -0
  89. package/dist/types/morph.js +0 -0
  90. package/dist/types/open-ai.d.ts +6 -0
  91. package/dist/types/open-ai.js +0 -0
  92. package/dist/types/open-router.d.ts +6 -0
  93. package/dist/types/open-router.js +0 -0
  94. package/dist/types/providers.d.ts +11 -0
  95. package/dist/types/providers.js +1 -0
  96. package/dist/types/requesty.d.ts +6 -0
  97. package/dist/types/requesty.js +0 -0
  98. package/dist/types/together-ai.d.ts +6 -0
  99. package/dist/types/together-ai.js +0 -0
  100. package/dist/types/upstage.d.ts +6 -0
  101. package/dist/types/upstage.js +0 -0
  102. package/dist/types/v0.d.ts +6 -0
  103. package/dist/types/v0.js +0 -0
  104. package/dist/types/venice.d.ts +6 -0
  105. package/dist/types/venice.js +0 -0
  106. package/dist/types/vercel.d.ts +6 -0
  107. package/dist/types/vercel.js +0 -0
  108. package/dist/types/weights-_-biases.d.ts +6 -0
  109. package/dist/types/weights-_-biases.js +0 -0
  110. package/dist/types/xai.d.ts +6 -0
  111. package/dist/types/xai.js +0 -0
  112. package/package.json +6 -1
  113. package/public/alibaba.json +326 -0
  114. package/public/amazon-bedrock.json +2141 -0
  115. package/public/anthropic.json +396 -0
  116. package/public/api.json +13504 -3
  117. package/public/azure-open-ai.json +332 -0
  118. package/public/cerebras.json +288 -0
  119. package/public/chutes.json +3220 -0
  120. package/public/cloudflare.json +3094 -0
  121. package/public/deep-infra.json +956 -0
  122. package/public/deep-seek.json +46 -0
  123. package/public/fireworks-ai.json +14486 -0
  124. package/public/git-hub-copilot.json +676 -0
  125. package/public/git-hub-models.json +256 -0
  126. package/public/google-partner.json +536 -0
  127. package/public/google-vertex.json +1376 -0
  128. package/public/google.json +536 -0
  129. package/public/groq.json +882 -0
  130. package/public/hugging-face.json +1096 -0
  131. package/public/inception.json +81 -0
  132. package/public/inference.json +291 -0
  133. package/public/meta.json +151 -0
  134. package/public/mistral.json +2181 -0
  135. package/public/model-scope.json +37839 -0
  136. package/public/morph.json +46 -0
  137. package/public/open-ai.json +606 -0
  138. package/public/open-router.json +15341 -0
  139. package/public/providers.json +43 -0
  140. package/public/requesty.json +13757 -0
  141. package/public/together-ai.json +641 -0
  142. package/public/upstage.json +606 -0
  143. package/public/v0.json +431 -0
  144. package/public/venice.json +501 -0
  145. package/public/vercel.json +4071 -0
  146. package/public/weights-&-biases.json +551 -0
  147. package/public/xai.json +256 -0
package/README.md CHANGED
@@ -51,19 +51,19 @@ pnpm add @anolilab/ai-model-registry
51
51
  ## Usage
52
52
 
53
53
  ```typescript
54
- import { getProviders, getModelsByProvider, getModelById, searchModels, getAllModels } from "@anolilab/ai-model-registry";
54
+ import { getProviders, getModelsByProvider, getModelById, searchModels, getAllModels, type ProviderName } from "@anolilab/ai-model-registry";
55
55
 
56
- // Get all available providers
57
- const providers = getProviders();
56
+ // Get all available providers (async)
57
+ const providers = await getProviders();
58
58
  console.log(providers);
59
59
  // ['Anthropic', 'Google', 'Groq', 'Meta', 'OpenAI', 'DeepSeek', ...]
60
60
 
61
- // Get all models from a specific provider
62
- const anthropicModels = getModelsByProvider("Anthropic");
61
+ // Get all models from a specific provider (type-safe provider name)
62
+ const anthropicModels = await getModelsByProvider("Anthropic" as ProviderName);
63
63
  console.log(`Found ${anthropicModels.length} Anthropic models`);
64
64
 
65
65
  // Get a specific model by ID
66
- const model = getModelById("claude-3-opus-20240229");
66
+ const model = await getModelById("claude-3-opus-20240229");
67
67
  if (model) {
68
68
  console.log(`Model: ${model.name}`);
69
69
  console.log(`Provider: ${model.provider}`);
@@ -72,18 +72,38 @@ if (model) {
72
72
  }
73
73
 
74
74
  // Search for models with specific capabilities
75
- const visionModels = searchModels({ vision: true });
76
- const reasoningModels = searchModels({ reasoning: true });
77
- const toolCallModels = searchModels({ tool_call: true });
75
+ const visionModels = await searchModels({ vision: true });
76
+ const reasoningModels = await searchModels({ reasoning: true });
77
+ const toolCallModels = await searchModels({ tool_call: true });
78
78
 
79
79
  // Get all models for advanced filtering
80
- const allModels = getAllModels();
80
+ const allModels = await getAllModels();
81
+ ```
82
+
83
+ ### Type-Safe Provider and Model Names
84
+
85
+ The package provides TypeScript types for provider names and model IDs:
86
+
87
+ ```typescript
88
+ import type { ProviderName } from "@anolilab/ai-model-registry";
89
+ import type ModelName from "@anolilab/ai-model-registry/types/open-router";
90
+
91
+ // Type-safe provider names
92
+ const provider: ProviderName = "OpenAI"; // ✅ Valid
93
+ const invalid: ProviderName = "InvalidProvider"; // ❌ TypeScript error
94
+
95
+ // Type-safe model IDs for specific providers
96
+ const modelId: ModelName = "meta-llama/llama-3.1-8b-instruct"; // ✅ Valid
97
+ const invalidId: ModelName = "invalid-model"; // ❌ TypeScript error
81
98
  ```
82
99
 
83
100
  ## Features
84
101
 
85
102
  - Unified interface to access models from multiple providers through a single API
86
103
  - Full TypeScript support with Zod schema validation for type safety
104
+ - Type-safe provider names and model IDs with generated union types
105
+ - Dynamic imports for optimal code splitting and tree shaking
106
+ - Provider-specific JSON files for efficient loading
87
107
  - Tree shaking support - import only what you need to minimize bundle size
88
108
  - Comprehensive model information including capabilities, pricing, and limits
89
109
  - Advanced search and filtering capabilities across all models
@@ -95,48 +115,52 @@ const allModels = getAllModels();
95
115
 
96
116
  ### Core Functions
97
117
 
98
- #### `getProviders(): string[]`
118
+ All functions are async and use dynamic imports for optimal code splitting.
119
+
120
+ #### `getProviders(): Promise<ProviderName[]>`
99
121
 
100
122
  Returns an array of all available provider names.
101
123
 
102
124
  ```typescript
103
- const providers = getProviders();
125
+ const providers = await getProviders();
104
126
  // ['Anthropic', 'Google', 'Groq', 'Meta', 'OpenAI', ...]
105
127
  ```
106
128
 
107
- #### `getModelsByProvider(provider: string): Model[]`
129
+ #### `getModelsByProvider(provider: ProviderName): Promise<Model[]>`
108
130
 
109
- Returns all models for a specific provider.
131
+ Returns all models for a specific provider. Uses provider-specific JSON files for efficient loading.
110
132
 
111
133
  ```typescript
112
- const openAIModels = getModelsByProvider("OpenAI");
113
- const anthropicModels = getModelsByProvider("Anthropic");
134
+ import type { ProviderName } from "@anolilab/ai-model-registry";
135
+
136
+ const openAIModels = await getModelsByProvider("OpenAI" as ProviderName);
137
+ const anthropicModels = await getModelsByProvider("Anthropic" as ProviderName);
114
138
  ```
115
139
 
116
- #### `getModelById(id: string): Model | undefined`
140
+ #### `getModelById(id: string): Promise<Model | undefined>`
117
141
 
118
142
  Returns a specific model by its ID, or `undefined` if not found.
119
143
 
120
144
  ```typescript
121
- const gpt4 = getModelById("gpt-4");
122
- const claude = getModelById("claude-3-opus-20240229");
145
+ const gpt4 = await getModelById("gpt-4");
146
+ const claude = await getModelById("claude-3-opus-20240229");
123
147
  ```
124
148
 
125
- #### `getAllModels(): Model[]`
149
+ #### `getAllModels(): Promise<Model[]>`
126
150
 
127
- Returns all models (useful for advanced filtering and custom logic).
151
+ Returns all models (useful for advanced filtering and custom logic). Loads all provider files in parallel.
128
152
 
129
153
  ```typescript
130
- const allModels = getAllModels();
154
+ const allModels = await getAllModels();
131
155
  const expensiveModels = allModels.filter((model) => (model.cost.input || 0) > 0.1 || (model.cost.output || 0) > 0.1);
132
156
  ```
133
157
 
134
- #### `getProviderStats(): Record<string, number>`
158
+ #### `getProviderStats(): Promise<Record<ProviderName, number>>`
135
159
 
136
160
  Returns provider statistics with model counts.
137
161
 
138
162
  ```typescript
139
- const stats = getProviderStats();
163
+ const stats = await getProviderStats();
140
164
  console.log(stats);
141
165
  // {
142
166
  // 'OpenAI': 15,
@@ -149,9 +173,9 @@ console.log(stats);
149
173
 
150
174
  ### Advanced Search
151
175
 
152
- #### `searchModels(criteria: SearchCriteria): Model[]`
176
+ #### `searchModels(criteria: SearchCriteria): Promise<Model[]>`
153
177
 
154
- Search models by various criteria with powerful filtering options.
178
+ Search models by various criteria with powerful filtering options. Automatically uses provider-specific files when a provider filter is specified.
155
179
 
156
180
  ```typescript
157
181
  interface SearchCriteria {
@@ -163,7 +187,7 @@ interface SearchCriteria {
163
187
  preview?: boolean;
164
188
 
165
189
  // Provider filter
166
- provider?: string;
190
+ provider?: ProviderName;
167
191
 
168
192
  // Modality filters
169
193
  modalities?: {
@@ -185,38 +209,32 @@ interface SearchCriteria {
185
209
 
186
210
  ```typescript
187
211
  // Find all vision-capable models
188
- const visionModels = searchModels({ vision: true });
212
+ const visionModels = await searchModels({ vision: true });
189
213
 
190
214
  // Find models with reasoning capabilities
191
- const reasoningModels = searchModels({ reasoning: true });
215
+ const reasoningModels = await searchModels({ reasoning: true });
192
216
 
193
217
  // Find models that support tool calling
194
- const toolCallModels = searchModels({ tool_call: true });
218
+ const toolCallModels = await searchModels({ tool_call: true });
195
219
 
196
- // Find models from a specific provider
197
- const openAIModels = searchModels({ provider: "OpenAI" });
220
+ // Find models from a specific provider (uses provider-specific file)
221
+ const openAIModels = await searchModels({ provider: "OpenAI" as ProviderName });
198
222
 
199
223
  // Find models with large context windows
200
- const largeContextModels = searchModels({ context_min: 100000 });
201
-
202
- // Find affordable models
203
- const affordableModels = searchModels({
204
- max_input_cost: 0.01,
205
- max_output_cost: 0.02,
206
- });
224
+ const largeContextModels = await searchModels({ context_min: 100000 });
207
225
 
208
226
  // Find models that accept text and image input
209
- const multimodalModels = searchModels({
227
+ const multimodalModels = await searchModels({
210
228
  modalities: {
211
229
  input: ["text", "image"],
212
230
  },
213
231
  });
214
232
 
215
233
  // Find models with streaming support
216
- const streamingModels = searchModels({ streaming_supported: true });
234
+ const streamingModels = await searchModels({ streaming_supported: true });
217
235
 
218
236
  // Find preview/beta models
219
- const previewModels = searchModels({ preview: true });
237
+ const previewModels = await searchModels({ preview: true });
220
238
  ```
221
239
 
222
240
  ## Model Schema
@@ -312,21 +330,34 @@ interface Model {
312
330
  }
313
331
  ```
314
332
 
315
- ## Tree Shaking
333
+ ## Tree Shaking and Code Splitting
316
334
 
317
- The package supports tree shaking, so you can import only what you need:
335
+ The package supports tree shaking and uses dynamic imports for optimal code splitting:
318
336
 
319
337
  ```typescript
320
338
  // Only import specific functions
321
- import { getProviders, getModelById } from "@anolilab/ai-model-registry";
339
+ import { getProviders, getModelById, type ProviderName } from "@anolilab/ai-model-registry";
322
340
 
323
341
  // Import schema for validation
324
342
  import { ModelSchema } from "@anolilab/ai-model-registry/schema";
325
343
 
326
344
  // Import icons (if needed)
327
345
  import { getIcon } from "@anolilab/ai-model-registry/icons";
346
+
347
+ // Import provider-specific model ID types
348
+ import type ModelName from "@anolilab/ai-model-registry/types/open-router";
349
+ import type { ProviderName } from "@anolilab/ai-model-registry/types/providers";
328
350
  ```
329
351
 
352
+ ### Dynamic Loading
353
+
354
+ The package uses dynamic imports to load provider-specific JSON files on demand:
355
+
356
+ - **Single provider queries**: Only loads the specific provider's JSON file
357
+ - **All models queries**: Loads all provider files in parallel
358
+ - **Automatic caching**: Results are cached to avoid re-loading
359
+ - **Better code splitting**: Bundlers can split provider files into separate chunks
360
+
330
361
  ## Supported Providers
331
362
 
332
363
  The registry includes models from 50+ providers:
@@ -500,7 +531,11 @@ pnpm run build
500
531
  - Fetches pricing data from Helicone API
501
532
  - Enriches models with icon information
502
533
  - Synchronizes data between models with the same ID
503
- - Generates `data/all-models.json` and `src/models-data.ts`
534
+ - Generates `public/api.json` (main API file)
535
+ - Generates `public/{provider-name}.json` (provider-specific files)
536
+ - Generates `public/providers.json` (provider index)
537
+ - Generates `src/types/providers.ts` (ProviderName type)
538
+ - Generates `src/types/{provider-name}.ts` (ModelName types per provider)
504
539
 
505
540
  3. **Generate Icons (`pnpm run generate-icons`)**:
506
541
  - Creates SVG sprite sheet from LobeHub icons and custom icons
@@ -552,15 +587,25 @@ pnpm run lint:types
552
587
  ```
553
588
  packages/ai-model-registry/
554
589
  ├── src/
555
- │ ├── index.ts # Main exports
590
+ │ ├── index.ts # Main exports (async functions)
556
591
  │ ├── schema.ts # Model schema definitions
557
- └── models-data.ts # Generated model data
592
+ ├── icons-sprite.ts # Generated icon sprite
593
+ │ └── types/ # Generated TypeScript types
594
+ │ ├── providers.ts # ProviderName type
595
+ │ ├── open-router.ts # ModelName type for OpenRouter
596
+ │ ├── open-ai.ts # ModelName type for OpenAI
597
+ │ └── ... # Other provider model types
558
598
  ├── scripts/
559
599
  │ ├── aggregate-providers.ts # Data aggregation script
560
600
  │ ├── generate-svg-sprite.ts # Icon generation
561
601
  │ └── download/ # Provider data downloaders
602
+ ├── public/ # Generated JSON files
603
+ │ ├── api.json # Main API file (all models)
604
+ │ ├── providers.json # Provider index
605
+ │ ├── open-router.json # Provider-specific models
606
+ │ ├── open-ai.json # Provider-specific models
607
+ │ └── ... # Other provider files
562
608
  ├── data/
563
- │ ├── all-models.json # Generated model data
564
609
  │ └── providers/ # Raw provider data
565
610
  └── assets/
566
611
  └── icons/ # Provider icons
package/dist/index.d.ts CHANGED
@@ -1,25 +1,25 @@
1
1
  import { Model } from './schema.js';
2
- export { ModelSchema } from './schema.js';
3
- export { getIcon, hasProviderIcon, iconSymbols, isBase64Icon, isSvgIcon, providerIconMap, spriteSheet } from './icons-sprite.js';
2
+ import { ProviderName } from './types/providers.js';
4
3
  import 'zod';
5
4
 
6
5
  /**
7
6
  * Retrieves all available AI model providers from the registry.
8
- * @returns An array of provider names sorted alphabetically.
7
+ * @returns Promise that resolves to an array of provider names sorted alphabetically.
9
8
  */
10
- declare const getProviders: () => string[];
9
+ declare const getProviders: () => Promise<ProviderName[]>;
11
10
  /**
12
11
  * Retrieves all AI models for a specific provider.
12
+ * First tries to load from provider-specific JSON file, falls back to filtering all models.
13
13
  * @param provider The name of the provider to filter by.
14
- * @returns An array of models belonging to the specified provider.
14
+ * @returns Promise that resolves to an array of models belonging to the specified provider.
15
15
  */
16
- declare const getModelsByProvider: (provider: string) => Model[];
16
+ declare const getModelsByProvider: (provider: ProviderName) => Promise<Model[]>;
17
17
  /**
18
18
  * Retrieves a specific AI model by its unique identifier.
19
19
  * @param id The unique identifier of the model to retrieve.
20
- * @returns The model if found, undefined otherwise.
20
+ * @returns Promise that resolves to the model if found, undefined otherwise.
21
21
  */
22
- declare const getModelById: (id: string) => Model | undefined;
22
+ declare const getModelById: (id: string) => Promise<Model | undefined>;
23
23
  /**
24
24
  * Searches and filters AI models based on various criteria such as capabilities, provider, and context window.
25
25
  * @param criteria The search criteria to filter models by.
@@ -34,7 +34,7 @@ declare const getModelById: (id: string) => Model | undefined;
34
34
  * @param criteria.streaming_supported Whether to filter by streaming support.
35
35
  * @param criteria.tool_call Whether to filter by tool calling capability.
36
36
  * @param criteria.vision Whether to filter by vision capability.
37
- * @returns An array of models that match the specified criteria.
37
+ * @returns Promise that resolves to an array of models that match the specified criteria.
38
38
  */
39
39
  declare const searchModels: (criteria: {
40
40
  context_max?: number;
@@ -44,21 +44,21 @@ declare const searchModels: (criteria: {
44
44
  output?: string[];
45
45
  };
46
46
  preview?: boolean;
47
- provider?: string;
47
+ provider?: ProviderName;
48
48
  reasoning?: boolean;
49
49
  streaming_supported?: boolean;
50
50
  tool_call?: boolean;
51
51
  vision?: boolean;
52
- }) => Model[];
52
+ }) => Promise<Model[]>;
53
53
  /**
54
54
  * Retrieves all AI models from the registry for advanced filtering and processing.
55
- * @returns A copy of all models in the registry.
55
+ * @returns Promise that resolves to a copy of all models in the registry.
56
56
  */
57
- declare const getAllModels: () => Model[];
57
+ declare const getAllModels: () => Promise<Model[]>;
58
58
  /**
59
59
  * Retrieves statistics about AI model providers including their model counts.
60
- * @returns An object mapping provider names to their model counts.
60
+ * @returns Promise that resolves to an object mapping provider names to their model counts.
61
61
  */
62
- declare const getProviderStats: () => Record<string, number>;
62
+ declare const getProviderStats: () => Promise<Record<ProviderName, number>>;
63
63
 
64
- export { Model, getAllModels, getModelById, getModelsByProvider, getProviderStats, getProviders, searchModels };
64
+ export { getAllModels, getModelById, getModelsByProvider, getProviderStats, getProviders, searchModels };