@cogitator-ai/models 0.1.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/LICENSE +21 -0
- package/README.md +59 -0
- package/dist/__tests__/registry.test.d.ts +2 -0
- package/dist/__tests__/registry.test.d.ts.map +1 -0
- package/dist/__tests__/registry.test.js +132 -0
- package/dist/__tests__/registry.test.js.map +1 -0
- package/dist/cache.d.ts +21 -0
- package/dist/cache.d.ts.map +1 -0
- package/dist/cache.js +92 -0
- package/dist/cache.js.map +1 -0
- package/dist/fetcher.d.ts +4 -0
- package/dist/fetcher.d.ts.map +1 -0
- package/dist/fetcher.js +167 -0
- package/dist/fetcher.js.map +1 -0
- package/dist/index.d.ts +6 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +5 -0
- package/dist/index.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 +95 -0
- package/dist/providers/anthropic.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 +98 -0
- package/dist/providers/google.js.map +1 -0
- package/dist/providers/index.d.ts +11 -0
- package/dist/providers/index.d.ts.map +1 -0
- package/dist/providers/index.js +29 -0
- package/dist/providers/index.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 +121 -0
- package/dist/providers/openai.js.map +1 -0
- package/dist/registry.d.ts +40 -0
- package/dist/registry.d.ts.map +1 -0
- package/dist/registry.js +258 -0
- package/dist/registry.js.map +1 -0
- package/dist/types.d.ts +183 -0
- package/dist/types.d.ts.map +1 -0
- package/dist/types.js +32 -0
- package/dist/types.js.map +1 -0
- package/package.json +43 -0
package/LICENSE
ADDED
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
MIT License
|
|
2
|
+
|
|
3
|
+
Copyright (c) 2025 Cogitator Contributors
|
|
4
|
+
|
|
5
|
+
Permission is hereby granted, free of charge, to any person obtaining a copy
|
|
6
|
+
of this software and associated documentation files (the "Software"), to deal
|
|
7
|
+
in the Software without restriction, including without limitation the rights
|
|
8
|
+
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
|
9
|
+
copies of the Software, and to permit persons to whom the Software is
|
|
10
|
+
furnished to do so, subject to the following conditions:
|
|
11
|
+
|
|
12
|
+
The above copyright notice and this permission notice shall be included in all
|
|
13
|
+
copies or substantial portions of the Software.
|
|
14
|
+
|
|
15
|
+
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
|
16
|
+
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
|
17
|
+
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
|
18
|
+
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
|
19
|
+
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
|
20
|
+
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
|
21
|
+
SOFTWARE.
|
package/README.md
ADDED
|
@@ -0,0 +1,59 @@
|
|
|
1
|
+
# @cogitator-ai/models
|
|
2
|
+
|
|
3
|
+
Dynamic model registry with pricing information for Cogitator. Fetches up-to-date model data from LiteLLM.
|
|
4
|
+
|
|
5
|
+
## Installation
|
|
6
|
+
|
|
7
|
+
```bash
|
|
8
|
+
pnpm add @cogitator-ai/models
|
|
9
|
+
```
|
|
10
|
+
|
|
11
|
+
## Usage
|
|
12
|
+
|
|
13
|
+
### Get Model Information
|
|
14
|
+
|
|
15
|
+
```typescript
|
|
16
|
+
import { getModel, getPrice, listModels } from '@cogitator-ai/models';
|
|
17
|
+
|
|
18
|
+
// Get model details
|
|
19
|
+
const model = await getModel('gpt-4o');
|
|
20
|
+
console.log(model.contextWindow); // 128000
|
|
21
|
+
|
|
22
|
+
// Get pricing
|
|
23
|
+
const price = await getPrice('claude-sonnet-4-20250514');
|
|
24
|
+
console.log(price.inputPerMillion); // $3.00
|
|
25
|
+
console.log(price.outputPerMillion); // $15.00
|
|
26
|
+
|
|
27
|
+
// List all models
|
|
28
|
+
const models = await listModels({
|
|
29
|
+
provider: 'openai',
|
|
30
|
+
hasToolCalling: true,
|
|
31
|
+
});
|
|
32
|
+
```
|
|
33
|
+
|
|
34
|
+
### Built-in Providers
|
|
35
|
+
|
|
36
|
+
- **OpenAI**: GPT-4o, GPT-4o Mini, o1, o3-mini
|
|
37
|
+
- **Anthropic**: Claude Sonnet 4, Claude 3.5 Sonnet/Haiku, Claude 3 Opus
|
|
38
|
+
- **Google**: Gemini 2.5 Pro/Flash, Gemini 2.0 Flash, Gemini 1.5 Pro/Flash
|
|
39
|
+
|
|
40
|
+
### Caching
|
|
41
|
+
|
|
42
|
+
Model data is cached for 24 hours with automatic refresh:
|
|
43
|
+
|
|
44
|
+
```typescript
|
|
45
|
+
import { ModelRegistry } from '@cogitator-ai/models';
|
|
46
|
+
|
|
47
|
+
const registry = new ModelRegistry({
|
|
48
|
+
cacheTtl: 3600 * 1000, // 1 hour
|
|
49
|
+
cacheDir: './cache',
|
|
50
|
+
});
|
|
51
|
+
```
|
|
52
|
+
|
|
53
|
+
## Documentation
|
|
54
|
+
|
|
55
|
+
See the [Cogitator documentation](https://github.com/eL1fe/cogitator) for full API reference.
|
|
56
|
+
|
|
57
|
+
## License
|
|
58
|
+
|
|
59
|
+
MIT
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"registry.test.d.ts","sourceRoot":"","sources":["../../src/__tests__/registry.test.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1,132 @@
|
|
|
1
|
+
import { describe, it, expect, beforeEach, vi } from 'vitest';
|
|
2
|
+
import { ModelRegistry, getModelRegistry, getPrice, getModel, listModels } from '../registry';
|
|
3
|
+
import { BUILTIN_MODELS } from '../providers/index';
|
|
4
|
+
describe('ModelRegistry', () => {
|
|
5
|
+
let registry;
|
|
6
|
+
beforeEach(() => {
|
|
7
|
+
registry = new ModelRegistry({ fallbackToBuiltin: true });
|
|
8
|
+
});
|
|
9
|
+
describe('getModel', () => {
|
|
10
|
+
it('should return model by exact id', () => {
|
|
11
|
+
const model = registry.getModel('gpt-4o');
|
|
12
|
+
expect(model).toBeDefined();
|
|
13
|
+
expect(model?.id).toBe('gpt-4o');
|
|
14
|
+
expect(model?.provider).toBe('openai');
|
|
15
|
+
});
|
|
16
|
+
it('should return model by alias', () => {
|
|
17
|
+
const model = registry.getModel('claude-3-5-sonnet');
|
|
18
|
+
expect(model).toBeDefined();
|
|
19
|
+
expect(model?.provider).toBe('anthropic');
|
|
20
|
+
});
|
|
21
|
+
it('should return null for unknown model', () => {
|
|
22
|
+
const model = registry.getModel('unknown-model-xyz');
|
|
23
|
+
expect(model).toBeNull();
|
|
24
|
+
});
|
|
25
|
+
it('should handle provider prefix in model id', () => {
|
|
26
|
+
const model = registry.getModel('openai/gpt-4o');
|
|
27
|
+
expect(model).toBeDefined();
|
|
28
|
+
expect(model?.id).toBe('gpt-4o');
|
|
29
|
+
});
|
|
30
|
+
it('should be case insensitive', () => {
|
|
31
|
+
const model = registry.getModel('GPT-4O');
|
|
32
|
+
expect(model).toBeDefined();
|
|
33
|
+
expect(model?.id).toBe('gpt-4o');
|
|
34
|
+
});
|
|
35
|
+
});
|
|
36
|
+
describe('getPrice', () => {
|
|
37
|
+
it('should return pricing for known model', () => {
|
|
38
|
+
const price = registry.getPrice('gpt-4o');
|
|
39
|
+
expect(price).toBeDefined();
|
|
40
|
+
expect(price?.input).toBeGreaterThan(0);
|
|
41
|
+
expect(price?.output).toBeGreaterThan(0);
|
|
42
|
+
});
|
|
43
|
+
it('should return null for unknown model', () => {
|
|
44
|
+
const price = registry.getPrice('unknown-model');
|
|
45
|
+
expect(price).toBeNull();
|
|
46
|
+
});
|
|
47
|
+
it('should return correct pricing for gpt-4o-mini', () => {
|
|
48
|
+
const price = registry.getPrice('gpt-4o-mini');
|
|
49
|
+
expect(price).toBeDefined();
|
|
50
|
+
expect(price?.input).toBe(0.15);
|
|
51
|
+
expect(price?.output).toBe(0.6);
|
|
52
|
+
});
|
|
53
|
+
it('should return correct pricing for claude-3-5-sonnet', () => {
|
|
54
|
+
const price = registry.getPrice('claude-3-5-sonnet-20241022');
|
|
55
|
+
expect(price).toBeDefined();
|
|
56
|
+
expect(price?.input).toBe(3);
|
|
57
|
+
expect(price?.output).toBe(15);
|
|
58
|
+
});
|
|
59
|
+
});
|
|
60
|
+
describe('listModels', () => {
|
|
61
|
+
it('should return all builtin models', () => {
|
|
62
|
+
const models = registry.listModels();
|
|
63
|
+
expect(models.length).toBeGreaterThanOrEqual(BUILTIN_MODELS.length);
|
|
64
|
+
});
|
|
65
|
+
it('should filter by provider', () => {
|
|
66
|
+
const openaiModels = registry.listModels({ provider: 'openai' });
|
|
67
|
+
expect(openaiModels.every((m) => m.provider === 'openai')).toBe(true);
|
|
68
|
+
expect(openaiModels.length).toBeGreaterThan(0);
|
|
69
|
+
});
|
|
70
|
+
it('should filter by tool support', () => {
|
|
71
|
+
const toolModels = registry.listModels({ supportsTools: true });
|
|
72
|
+
expect(toolModels.every((m) => m.capabilities?.supportsTools)).toBe(true);
|
|
73
|
+
});
|
|
74
|
+
it('should filter by vision support', () => {
|
|
75
|
+
const visionModels = registry.listModels({ supportsVision: true });
|
|
76
|
+
expect(visionModels.every((m) => m.capabilities?.supportsVision)).toBe(true);
|
|
77
|
+
});
|
|
78
|
+
it('should filter by context window', () => {
|
|
79
|
+
const largeContextModels = registry.listModels({ minContextWindow: 100000 });
|
|
80
|
+
expect(largeContextModels.every((m) => m.contextWindow >= 100000)).toBe(true);
|
|
81
|
+
});
|
|
82
|
+
it('should filter by max price', () => {
|
|
83
|
+
const cheapModels = registry.listModels({ maxPricePerMillion: 1 });
|
|
84
|
+
expect(cheapModels.every((m) => (m.pricing.input + m.pricing.output) / 2 <= 1)).toBe(true);
|
|
85
|
+
});
|
|
86
|
+
});
|
|
87
|
+
describe('listProviders', () => {
|
|
88
|
+
it('should return all providers', () => {
|
|
89
|
+
const providers = registry.listProviders();
|
|
90
|
+
expect(providers.length).toBeGreaterThan(0);
|
|
91
|
+
const providerIds = providers.map((p) => p.id);
|
|
92
|
+
expect(providerIds).toContain('openai');
|
|
93
|
+
expect(providerIds).toContain('anthropic');
|
|
94
|
+
expect(providerIds).toContain('google');
|
|
95
|
+
});
|
|
96
|
+
it('should include model count per provider', () => {
|
|
97
|
+
const providers = registry.listProviders();
|
|
98
|
+
const openai = providers.find((p) => p.id === 'openai');
|
|
99
|
+
expect(openai?.models.length).toBeGreaterThan(0);
|
|
100
|
+
});
|
|
101
|
+
});
|
|
102
|
+
});
|
|
103
|
+
describe('Global helpers', () => {
|
|
104
|
+
it('getModelRegistry should return singleton', () => {
|
|
105
|
+
const reg1 = getModelRegistry();
|
|
106
|
+
const reg2 = getModelRegistry();
|
|
107
|
+
expect(reg1).toBe(reg2);
|
|
108
|
+
});
|
|
109
|
+
it('getPrice should work without initialization', () => {
|
|
110
|
+
const price = getPrice('gpt-4o');
|
|
111
|
+
expect(price).toBeDefined();
|
|
112
|
+
});
|
|
113
|
+
it('getModel should work without initialization', () => {
|
|
114
|
+
const model = getModel('gpt-4o');
|
|
115
|
+
expect(model).toBeDefined();
|
|
116
|
+
});
|
|
117
|
+
it('listModels should work without initialization', () => {
|
|
118
|
+
const models = listModels();
|
|
119
|
+
expect(models.length).toBeGreaterThan(0);
|
|
120
|
+
});
|
|
121
|
+
});
|
|
122
|
+
describe('ModelRegistry initialization', () => {
|
|
123
|
+
it('should fallback to builtin when network fails', async () => {
|
|
124
|
+
const mockFetch = vi.fn().mockRejectedValue(new Error('Network error'));
|
|
125
|
+
global.fetch = mockFetch;
|
|
126
|
+
const reg = new ModelRegistry({ fallbackToBuiltin: true });
|
|
127
|
+
await reg.initialize();
|
|
128
|
+
expect(reg.isInitialized()).toBe(true);
|
|
129
|
+
expect(reg.getModelCount()).toBeGreaterThan(0);
|
|
130
|
+
});
|
|
131
|
+
});
|
|
132
|
+
//# sourceMappingURL=registry.test.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"registry.test.js","sourceRoot":"","sources":["../../src/__tests__/registry.test.ts"],"names":[],"mappings":"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"}
|
package/dist/cache.d.ts
ADDED
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
import type { ModelInfo, CacheOptions } from './types';
|
|
2
|
+
interface CacheEntry {
|
|
3
|
+
models: ModelInfo[];
|
|
4
|
+
timestamp: number;
|
|
5
|
+
version: string;
|
|
6
|
+
}
|
|
7
|
+
export declare class ModelCache {
|
|
8
|
+
private memoryCache;
|
|
9
|
+
private options;
|
|
10
|
+
constructor(options?: Partial<CacheOptions>);
|
|
11
|
+
get(): Promise<ModelInfo[] | null>;
|
|
12
|
+
getStale(): Promise<ModelInfo[] | null>;
|
|
13
|
+
set(models: ModelInfo[]): Promise<void>;
|
|
14
|
+
clear(): Promise<void>;
|
|
15
|
+
isStale(entry: CacheEntry): boolean;
|
|
16
|
+
private getEntry;
|
|
17
|
+
private readFromFile;
|
|
18
|
+
private writeToFile;
|
|
19
|
+
}
|
|
20
|
+
export {};
|
|
21
|
+
//# sourceMappingURL=cache.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"cache.d.ts","sourceRoot":"","sources":["../src/cache.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,SAAS,EAAE,YAAY,EAAE,MAAM,SAAS,CAAC;AAKvD,UAAU,UAAU;IAClB,MAAM,EAAE,SAAS,EAAE,CAAC;IACpB,SAAS,EAAE,MAAM,CAAC;IAClB,OAAO,EAAE,MAAM,CAAC;CACjB;AAKD,qBAAa,UAAU;IACrB,OAAO,CAAC,WAAW,CAA2B;IAC9C,OAAO,CAAC,OAAO,CAAyB;gBAE5B,OAAO,GAAE,OAAO,CAAC,YAAY,CAAM;IAQzC,GAAG,IAAI,OAAO,CAAC,SAAS,EAAE,GAAG,IAAI,CAAC;IAYlC,QAAQ,IAAI,OAAO,CAAC,SAAS,EAAE,GAAG,IAAI,CAAC;IAKvC,GAAG,CAAC,MAAM,EAAE,SAAS,EAAE,GAAG,OAAO,CAAC,IAAI,CAAC;IAcvC,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC;IAW5B,OAAO,CAAC,KAAK,EAAE,UAAU,GAAG,OAAO;YAKrB,QAAQ;YAgBR,YAAY;YAiBZ,WAAW;CAY1B"}
|
package/dist/cache.js
ADDED
|
@@ -0,0 +1,92 @@
|
|
|
1
|
+
import { writeFile, readFile, mkdir } from 'fs/promises';
|
|
2
|
+
import { dirname, join } from 'path';
|
|
3
|
+
import { homedir } from 'os';
|
|
4
|
+
const CACHE_VERSION = '1.0.0';
|
|
5
|
+
const DEFAULT_CACHE_PATH = join(homedir(), '.cogitator', 'models-cache.json');
|
|
6
|
+
export class ModelCache {
|
|
7
|
+
memoryCache = null;
|
|
8
|
+
options;
|
|
9
|
+
constructor(options = {}) {
|
|
10
|
+
this.options = {
|
|
11
|
+
ttl: options.ttl ?? 24 * 60 * 60 * 1000,
|
|
12
|
+
storage: options.storage ?? 'memory',
|
|
13
|
+
filePath: options.filePath ?? DEFAULT_CACHE_PATH,
|
|
14
|
+
};
|
|
15
|
+
}
|
|
16
|
+
async get() {
|
|
17
|
+
const entry = await this.getEntry();
|
|
18
|
+
if (!entry)
|
|
19
|
+
return null;
|
|
20
|
+
if (this.isStale(entry)) {
|
|
21
|
+
return null;
|
|
22
|
+
}
|
|
23
|
+
return entry.models;
|
|
24
|
+
}
|
|
25
|
+
async getStale() {
|
|
26
|
+
const entry = await this.getEntry();
|
|
27
|
+
return entry?.models ?? null;
|
|
28
|
+
}
|
|
29
|
+
async set(models) {
|
|
30
|
+
const entry = {
|
|
31
|
+
models,
|
|
32
|
+
timestamp: Date.now(),
|
|
33
|
+
version: CACHE_VERSION,
|
|
34
|
+
};
|
|
35
|
+
this.memoryCache = entry;
|
|
36
|
+
if (this.options.storage === 'file') {
|
|
37
|
+
await this.writeToFile(entry);
|
|
38
|
+
}
|
|
39
|
+
}
|
|
40
|
+
async clear() {
|
|
41
|
+
this.memoryCache = null;
|
|
42
|
+
if (this.options.storage === 'file') {
|
|
43
|
+
try {
|
|
44
|
+
await writeFile(this.options.filePath, '', 'utf-8');
|
|
45
|
+
}
|
|
46
|
+
catch {
|
|
47
|
+
}
|
|
48
|
+
}
|
|
49
|
+
}
|
|
50
|
+
isStale(entry) {
|
|
51
|
+
const age = Date.now() - entry.timestamp;
|
|
52
|
+
return age > this.options.ttl || entry.version !== CACHE_VERSION;
|
|
53
|
+
}
|
|
54
|
+
async getEntry() {
|
|
55
|
+
if (this.memoryCache) {
|
|
56
|
+
return this.memoryCache;
|
|
57
|
+
}
|
|
58
|
+
if (this.options.storage === 'file') {
|
|
59
|
+
const fileEntry = await this.readFromFile();
|
|
60
|
+
if (fileEntry) {
|
|
61
|
+
this.memoryCache = fileEntry;
|
|
62
|
+
return fileEntry;
|
|
63
|
+
}
|
|
64
|
+
}
|
|
65
|
+
return null;
|
|
66
|
+
}
|
|
67
|
+
async readFromFile() {
|
|
68
|
+
try {
|
|
69
|
+
const content = await readFile(this.options.filePath, 'utf-8');
|
|
70
|
+
if (!content.trim())
|
|
71
|
+
return null;
|
|
72
|
+
const entry = JSON.parse(content);
|
|
73
|
+
if (!entry.models || !entry.timestamp || entry.version !== CACHE_VERSION) {
|
|
74
|
+
return null;
|
|
75
|
+
}
|
|
76
|
+
return entry;
|
|
77
|
+
}
|
|
78
|
+
catch {
|
|
79
|
+
return null;
|
|
80
|
+
}
|
|
81
|
+
}
|
|
82
|
+
async writeToFile(entry) {
|
|
83
|
+
try {
|
|
84
|
+
await mkdir(dirname(this.options.filePath), { recursive: true });
|
|
85
|
+
await writeFile(this.options.filePath, JSON.stringify(entry, null, 2), 'utf-8');
|
|
86
|
+
}
|
|
87
|
+
catch (error) {
|
|
88
|
+
console.warn('Failed to write model cache to file:', error);
|
|
89
|
+
}
|
|
90
|
+
}
|
|
91
|
+
}
|
|
92
|
+
//# sourceMappingURL=cache.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"cache.js","sourceRoot":"","sources":["../src/cache.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"fetcher.d.ts","sourceRoot":"","sources":["../src/fetcher.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,gBAAgB,EAAqB,SAAS,EAAgB,MAAM,SAAS,CAAC;AAO5F,wBAAsB,gBAAgB,IAAI,OAAO,CAAC,gBAAgB,CAAC,CAsBlE;AAqHD,wBAAgB,oBAAoB,CAAC,IAAI,EAAE,gBAAgB,GAAG,SAAS,EAAE,CA8CxE"}
|
package/dist/fetcher.js
ADDED
|
@@ -0,0 +1,167 @@
|
|
|
1
|
+
const LITELLM_URL = 'https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json';
|
|
2
|
+
const FETCH_TIMEOUT = 10_000;
|
|
3
|
+
export async function fetchLiteLLMData() {
|
|
4
|
+
const controller = new AbortController();
|
|
5
|
+
const timeoutId = setTimeout(() => controller.abort(), FETCH_TIMEOUT);
|
|
6
|
+
try {
|
|
7
|
+
const response = await fetch(LITELLM_URL, {
|
|
8
|
+
signal: controller.signal,
|
|
9
|
+
headers: {
|
|
10
|
+
'Accept': 'application/json',
|
|
11
|
+
'User-Agent': 'Cogitator/1.0',
|
|
12
|
+
},
|
|
13
|
+
});
|
|
14
|
+
if (!response.ok) {
|
|
15
|
+
throw new Error(`Failed to fetch LiteLLM data: ${response.status} ${response.statusText}`);
|
|
16
|
+
}
|
|
17
|
+
const data = await response.json();
|
|
18
|
+
return data;
|
|
19
|
+
}
|
|
20
|
+
finally {
|
|
21
|
+
clearTimeout(timeoutId);
|
|
22
|
+
}
|
|
23
|
+
}
|
|
24
|
+
const PROVIDER_MAPPINGS = {
|
|
25
|
+
'openai': 'openai',
|
|
26
|
+
'azure': 'azure',
|
|
27
|
+
'azure_ai': 'azure',
|
|
28
|
+
'anthropic': 'anthropic',
|
|
29
|
+
'bedrock': 'aws',
|
|
30
|
+
'vertex_ai': 'google',
|
|
31
|
+
'vertex_ai-': 'google',
|
|
32
|
+
'gemini': 'google',
|
|
33
|
+
'palm': 'google',
|
|
34
|
+
'cohere': 'cohere',
|
|
35
|
+
'cohere_chat': 'cohere',
|
|
36
|
+
'replicate': 'replicate',
|
|
37
|
+
'huggingface': 'huggingface',
|
|
38
|
+
'together_ai': 'together',
|
|
39
|
+
'together': 'together',
|
|
40
|
+
'ollama': 'ollama',
|
|
41
|
+
'ollama_chat': 'ollama',
|
|
42
|
+
'deepinfra': 'deepinfra',
|
|
43
|
+
'perplexity': 'perplexity',
|
|
44
|
+
'groq': 'groq',
|
|
45
|
+
'mistral': 'mistral',
|
|
46
|
+
'text-completion-codestral': 'mistral',
|
|
47
|
+
'codestral': 'mistral',
|
|
48
|
+
'fireworks_ai': 'fireworks',
|
|
49
|
+
'anyscale': 'anyscale',
|
|
50
|
+
'cloudflare': 'cloudflare',
|
|
51
|
+
'databricks': 'databricks',
|
|
52
|
+
'ai21': 'ai21',
|
|
53
|
+
'nlp_cloud': 'nlp_cloud',
|
|
54
|
+
'aleph_alpha': 'aleph_alpha',
|
|
55
|
+
'voyage': 'voyage',
|
|
56
|
+
'sagemaker': 'aws',
|
|
57
|
+
'xinference': 'xinference',
|
|
58
|
+
'friendliai': 'friendliai',
|
|
59
|
+
'github': 'github',
|
|
60
|
+
'xai': 'xai',
|
|
61
|
+
};
|
|
62
|
+
function normalizeProvider(litellmProvider, modelId) {
|
|
63
|
+
if (litellmProvider) {
|
|
64
|
+
const normalized = PROVIDER_MAPPINGS[litellmProvider];
|
|
65
|
+
if (normalized)
|
|
66
|
+
return normalized;
|
|
67
|
+
for (const [prefix, provider] of Object.entries(PROVIDER_MAPPINGS)) {
|
|
68
|
+
if (litellmProvider.startsWith(prefix)) {
|
|
69
|
+
return provider;
|
|
70
|
+
}
|
|
71
|
+
}
|
|
72
|
+
}
|
|
73
|
+
const prefixMatch = /^([a-z_-]+)\//.exec(modelId);
|
|
74
|
+
if (prefixMatch) {
|
|
75
|
+
const prefix = prefixMatch[1];
|
|
76
|
+
return PROVIDER_MAPPINGS[prefix] ?? prefix;
|
|
77
|
+
}
|
|
78
|
+
if (modelId.startsWith('gpt-') || modelId.startsWith('o1') || modelId.startsWith('o3') || modelId.includes('davinci') || modelId.includes('curie')) {
|
|
79
|
+
return 'openai';
|
|
80
|
+
}
|
|
81
|
+
if (modelId.startsWith('claude')) {
|
|
82
|
+
return 'anthropic';
|
|
83
|
+
}
|
|
84
|
+
if (modelId.startsWith('gemini') || modelId.startsWith('palm')) {
|
|
85
|
+
return 'google';
|
|
86
|
+
}
|
|
87
|
+
if (modelId.startsWith('llama') || modelId.startsWith('mistral') || modelId.startsWith('mixtral')) {
|
|
88
|
+
return 'meta';
|
|
89
|
+
}
|
|
90
|
+
return 'unknown';
|
|
91
|
+
}
|
|
92
|
+
function extractModelName(modelId) {
|
|
93
|
+
if (modelId.includes('/')) {
|
|
94
|
+
return modelId.split('/').pop() ?? modelId;
|
|
95
|
+
}
|
|
96
|
+
return modelId;
|
|
97
|
+
}
|
|
98
|
+
function createDisplayName(modelId) {
|
|
99
|
+
const name = extractModelName(modelId);
|
|
100
|
+
return name
|
|
101
|
+
.replace(/-/g, ' ')
|
|
102
|
+
.replace(/_/g, ' ')
|
|
103
|
+
.replace(/\b\w/g, (c) => c.toUpperCase())
|
|
104
|
+
.replace(/Gpt/g, 'GPT')
|
|
105
|
+
.replace(/Ai/g, 'AI')
|
|
106
|
+
.replace(/(\d+)k/gi, '$1K')
|
|
107
|
+
.trim();
|
|
108
|
+
}
|
|
109
|
+
function calculatePricing(entry) {
|
|
110
|
+
let inputCost = 0;
|
|
111
|
+
let outputCost = 0;
|
|
112
|
+
if (entry.input_cost_per_token !== undefined) {
|
|
113
|
+
inputCost = entry.input_cost_per_token * 1_000_000;
|
|
114
|
+
}
|
|
115
|
+
else if (entry.input_cost_per_character !== undefined) {
|
|
116
|
+
inputCost = entry.input_cost_per_character * 4 * 1_000_000;
|
|
117
|
+
}
|
|
118
|
+
if (entry.output_cost_per_token !== undefined) {
|
|
119
|
+
outputCost = entry.output_cost_per_token * 1_000_000;
|
|
120
|
+
}
|
|
121
|
+
else if (entry.output_cost_per_character !== undefined) {
|
|
122
|
+
outputCost = entry.output_cost_per_character * 4 * 1_000_000;
|
|
123
|
+
}
|
|
124
|
+
return {
|
|
125
|
+
input: Math.round(inputCost * 1000) / 1000,
|
|
126
|
+
output: Math.round(outputCost * 1000) / 1000,
|
|
127
|
+
};
|
|
128
|
+
}
|
|
129
|
+
export function transformLiteLLMData(data) {
|
|
130
|
+
const models = [];
|
|
131
|
+
const seenIds = new Set();
|
|
132
|
+
for (const [modelId, entry] of Object.entries(data)) {
|
|
133
|
+
if (modelId.startsWith('sample_spec') || modelId === 'sample_spec') {
|
|
134
|
+
continue;
|
|
135
|
+
}
|
|
136
|
+
const normalizedId = extractModelName(modelId).toLowerCase();
|
|
137
|
+
if (seenIds.has(normalizedId)) {
|
|
138
|
+
continue;
|
|
139
|
+
}
|
|
140
|
+
seenIds.add(normalizedId);
|
|
141
|
+
const provider = normalizeProvider(entry.litellm_provider, modelId);
|
|
142
|
+
const pricing = calculatePricing(entry);
|
|
143
|
+
const contextWindow = entry.max_input_tokens ?? entry.max_tokens ?? 4096;
|
|
144
|
+
const maxOutputTokens = entry.max_output_tokens ?? entry.max_tokens;
|
|
145
|
+
const isDeprecated = entry.deprecation_date
|
|
146
|
+
? new Date(entry.deprecation_date) < new Date()
|
|
147
|
+
: false;
|
|
148
|
+
const model = {
|
|
149
|
+
id: extractModelName(modelId),
|
|
150
|
+
provider,
|
|
151
|
+
displayName: createDisplayName(modelId),
|
|
152
|
+
pricing,
|
|
153
|
+
contextWindow,
|
|
154
|
+
maxOutputTokens,
|
|
155
|
+
capabilities: {
|
|
156
|
+
supportsTools: entry.supports_function_calling ?? entry.supports_tool_choice,
|
|
157
|
+
supportsVision: entry.supports_vision,
|
|
158
|
+
supportsFunctions: entry.supports_function_calling,
|
|
159
|
+
supportsJson: entry.supports_response_schema,
|
|
160
|
+
},
|
|
161
|
+
deprecated: isDeprecated || undefined,
|
|
162
|
+
};
|
|
163
|
+
models.push(model);
|
|
164
|
+
}
|
|
165
|
+
return models.sort((a, b) => a.id.localeCompare(b.id));
|
|
166
|
+
}
|
|
167
|
+
//# sourceMappingURL=fetcher.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"fetcher.js","sourceRoot":"","sources":["../src/fetcher.ts"],"names":[],"mappings":"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"}
|
package/dist/index.d.ts
ADDED
|
@@ -0,0 +1,6 @@
|
|
|
1
|
+
export type { ModelInfo, ModelPricing, ModelCapabilities, ModelFilter, ProviderInfo, CacheOptions, RegistryOptions, } from './types';
|
|
2
|
+
export { ModelRegistry, getModelRegistry, initializeModels, getPrice, getModel, listModels, } from './registry';
|
|
3
|
+
export { ModelCache } from './cache';
|
|
4
|
+
export { fetchLiteLLMData, transformLiteLLMData, } from './fetcher';
|
|
5
|
+
export { BUILTIN_MODELS, BUILTIN_PROVIDERS, OPENAI_MODELS, ANTHROPIC_MODELS, GOOGLE_MODELS, } from './providers/index';
|
|
6
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,YAAY,EACV,SAAS,EACT,YAAY,EACZ,iBAAiB,EACjB,WAAW,EACX,YAAY,EACZ,YAAY,EACZ,eAAe,GAChB,MAAM,SAAS,CAAC;AAEjB,OAAO,EACL,aAAa,EACb,gBAAgB,EAChB,gBAAgB,EAChB,QAAQ,EACR,QAAQ,EACR,UAAU,GACX,MAAM,YAAY,CAAC;AAEpB,OAAO,EAAE,UAAU,EAAE,MAAM,SAAS,CAAC;AAErC,OAAO,EACL,gBAAgB,EAChB,oBAAoB,GACrB,MAAM,WAAW,CAAC;AAEnB,OAAO,EACL,cAAc,EACd,iBAAiB,EACjB,aAAa,EACb,gBAAgB,EAChB,aAAa,GACd,MAAM,mBAAmB,CAAC"}
|
package/dist/index.js
ADDED
|
@@ -0,0 +1,5 @@
|
|
|
1
|
+
export { ModelRegistry, getModelRegistry, initializeModels, getPrice, getModel, listModels, } from './registry';
|
|
2
|
+
export { ModelCache } from './cache';
|
|
3
|
+
export { fetchLiteLLMData, transformLiteLLMData, } from './fetcher';
|
|
4
|
+
export { BUILTIN_MODELS, BUILTIN_PROVIDERS, OPENAI_MODELS, ANTHROPIC_MODELS, GOOGLE_MODELS, } from './providers/index';
|
|
5
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAUA,OAAO,EACL,aAAa,EACb,gBAAgB,EAChB,gBAAgB,EAChB,QAAQ,EACR,QAAQ,EACR,UAAU,GACX,MAAM,YAAY,CAAC;AAEpB,OAAO,EAAE,UAAU,EAAE,MAAM,SAAS,CAAC;AAErC,OAAO,EACL,gBAAgB,EAChB,oBAAoB,GACrB,MAAM,WAAW,CAAC;AAEnB,OAAO,EACL,cAAc,EACd,iBAAiB,EACjB,aAAa,EACb,gBAAgB,EAChB,aAAa,GACd,MAAM,mBAAmB,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"anthropic.d.ts","sourceRoot":"","sources":["../../src/providers/anthropic.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,UAAU,CAAC;AAE1C,eAAO,MAAM,gBAAgB,EAAE,SAAS,EA6FvC,CAAC"}
|