@llmgateway/models 0.0.1 → 1.0.1

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 (38) hide show
  1. package/README.md +104 -0
  2. package/dist/index.d.ts +0 -9
  3. package/dist/index.js +0 -9
  4. package/dist/index.js.map +1 -1
  5. package/package.json +7 -7
  6. package/dist/get-cheapest-from-available-providers.d.ts +0 -30
  7. package/dist/get-cheapest-from-available-providers.js +0 -183
  8. package/dist/get-cheapest-from-available-providers.js.map +0 -1
  9. package/dist/get-cheapest-model-for-provider.d.ts +0 -2
  10. package/dist/get-cheapest-model-for-provider.js +0 -49
  11. package/dist/get-cheapest-model-for-provider.js.map +0 -1
  12. package/dist/get-provider-endpoint.d.ts +0 -3
  13. package/dist/get-provider-endpoint.js +0 -243
  14. package/dist/get-provider-endpoint.js.map +0 -1
  15. package/dist/get-provider-headers.d.ts +0 -5
  16. package/dist/get-provider-headers.js +0 -45
  17. package/dist/get-provider-headers.js.map +0 -1
  18. package/dist/models.spec.d.ts +0 -1
  19. package/dist/models.spec.js +0 -263
  20. package/dist/models.spec.js.map +0 -1
  21. package/dist/prepare-request-body.d.ts +0 -10
  22. package/dist/prepare-request-body.js +0 -1081
  23. package/dist/prepare-request-body.js.map +0 -1
  24. package/dist/prepare-request-body.spec.d.ts +0 -1
  25. package/dist/prepare-request-body.spec.js +0 -231
  26. package/dist/prepare-request-body.spec.js.map +0 -1
  27. package/dist/process-image-url.d.ts +0 -4
  28. package/dist/process-image-url.js +0 -121
  29. package/dist/process-image-url.js.map +0 -1
  30. package/dist/transform-anthropic-messages.d.ts +0 -2
  31. package/dist/transform-anthropic-messages.js +0 -185
  32. package/dist/transform-anthropic-messages.js.map +0 -1
  33. package/dist/transform-google-messages.d.ts +0 -25
  34. package/dist/transform-google-messages.js +0 -122
  35. package/dist/transform-google-messages.js.map +0 -1
  36. package/dist/validate-provider-key.d.ts +0 -4
  37. package/dist/validate-provider-key.js +0 -113
  38. package/dist/validate-provider-key.js.map +0 -1
package/README.md ADDED
@@ -0,0 +1,104 @@
1
+ # @llmgateway/models
2
+
3
+ Model and provider definitions for [LLM Gateway](https://llmgateway.io) - the unified API for all LLM providers.
4
+
5
+ ## Installation
6
+
7
+ ```bash
8
+ npm install @llmgateway/models
9
+ ```
10
+
11
+ ## Usage
12
+
13
+ ### Models
14
+
15
+ The `models` array contains all supported LLM models with their pricing and provider mappings:
16
+
17
+ ```typescript
18
+ import { models } from "@llmgateway/models";
19
+
20
+ // Find a specific model
21
+ const gpt4 = models.find((m) => m.id === "gpt-4o");
22
+
23
+ console.log(gpt4.id); // "gpt-4o"
24
+ console.log(gpt4.family); // "openai"
25
+ console.log(gpt4.contextSize); // 128000
26
+ console.log(gpt4.providers); // Provider mappings with pricing
27
+ ```
28
+
29
+ #### Model Properties
30
+
31
+ | Property | Type | Description |
32
+ | ------------------- | ------------------------ | ---------------------------------------------- |
33
+ | `id` | `string` | Unique model identifier |
34
+ | `family` | `string` | Model family (openai, anthropic, google, etc.) |
35
+ | `contextSize` | `number` | Maximum context window in tokens |
36
+ | `maxOutput` | `number` | Maximum output tokens |
37
+ | `providers` | `ProviderModelMapping[]` | Available providers with pricing |
38
+ | `supportsImages` | `boolean` | Whether model supports image inputs |
39
+ | `supportsTools` | `boolean` | Whether model supports tool/function calling |
40
+ | `supportsReasoning` | `boolean` | Whether model supports extended reasoning |
41
+ | `free` | `boolean` | Whether model is free to use |
42
+
43
+ #### Provider Mapping Properties
44
+
45
+ | Property | Type | Description |
46
+ | ------------------ | -------- | ---------------------------------- |
47
+ | `providerId` | `string` | Provider identifier |
48
+ | `modelName` | `string` | Model name at the provider |
49
+ | `inputPrice` | `number` | Price per input token (USD) |
50
+ | `outputPrice` | `number` | Price per output token (USD) |
51
+ | `cachedInputPrice` | `number` | Price per cached input token (USD) |
52
+ | `contextSize` | `number` | Provider-specific context size |
53
+ | `maxOutput` | `number` | Provider-specific max output |
54
+
55
+ ### Providers
56
+
57
+ The `providers` array contains all supported LLM providers:
58
+
59
+ ```typescript
60
+ import { providers } from "@llmgateway/models";
61
+
62
+ // List all providers
63
+ providers.forEach((p) => {
64
+ console.log(`${p.name}: ${p.description}`);
65
+ });
66
+
67
+ // Find a specific provider
68
+ const openai = providers.find((p) => p.id === "openai");
69
+ console.log(openai.name); // "OpenAI"
70
+ console.log(openai.website); // "https://openai.com"
71
+ ```
72
+
73
+ #### Provider Properties
74
+
75
+ | Property | Type | Description |
76
+ | ------------- | --------- | ----------------------------------- |
77
+ | `id` | `string` | Unique provider identifier |
78
+ | `name` | `string` | Display name |
79
+ | `description` | `string` | Provider description |
80
+ | `website` | `string` | Provider website URL |
81
+ | `streaming` | `boolean` | Whether provider supports streaming |
82
+ | `color` | `string` | Brand color (hex) |
83
+
84
+ ## Supported Providers
85
+
86
+ - OpenAI
87
+ - Anthropic
88
+ - Google AI Studio
89
+ - Google Vertex AI
90
+ - Azure OpenAI
91
+ - AWS Bedrock
92
+ - Mistral
93
+ - DeepSeek
94
+ - xAI (Grok)
95
+ - Perplexity
96
+ - And more...
97
+
98
+ ## Full Model List
99
+
100
+ For the complete list of models with live pricing, visit [llmgateway.io/models](https://llmgateway.io/models).
101
+
102
+ ## License
103
+
104
+ See [LICENSE](https://github.com/theopenco/llmgateway/blob/main/LICENSE) for details.
package/dist/index.d.ts CHANGED
@@ -5,12 +5,3 @@ export * from "./providers.js";
5
5
  export * from "./types.js";
6
6
  export * from "./type-guards.js";
7
7
  export * from "./helpers.js";
8
- export * from "./transform-anthropic-messages.js";
9
- export * from "./process-image-url.js";
10
- export * from "./transform-google-messages.js";
11
- export * from "./get-provider-headers.js";
12
- export * from "./prepare-request-body.js";
13
- export * from "./get-provider-endpoint.js";
14
- export * from "./get-cheapest-from-available-providers.js";
15
- export * from "./validate-provider-key.js";
16
- export * from "./get-cheapest-model-for-provider.js";
package/dist/index.js CHANGED
@@ -5,13 +5,4 @@ export * from "./providers.js";
5
5
  export * from "./types.js";
6
6
  export * from "./type-guards.js";
7
7
  export * from "./helpers.js";
8
- export * from "./transform-anthropic-messages.js";
9
- export * from "./process-image-url.js";
10
- export * from "./transform-google-messages.js";
11
- export * from "./get-provider-headers.js";
12
- export * from "./prepare-request-body.js";
13
- export * from "./get-provider-endpoint.js";
14
- export * from "./get-cheapest-from-available-providers.js";
15
- export * from "./validate-provider-key.js";
16
- export * from "./get-cheapest-model-for-provider.js";
17
8
  //# sourceMappingURL=index.js.map
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,cAAc,cAAc,CAAC;AAC7B,cAAc,aAAa,CAAC;AAC5B,cAAc,eAAe,CAAC;AAC9B,cAAc,gBAAgB,CAAC;AAC/B,cAAc,YAAY,CAAC;AAC3B,cAAc,kBAAkB,CAAC;AACjC,cAAc,cAAc,CAAC;AAC7B,cAAc,mCAAmC,CAAC;AAClD,cAAc,wBAAwB,CAAC;AACvC,cAAc,gCAAgC,CAAC;AAC/C,cAAc,2BAA2B,CAAC;AAC1C,cAAc,2BAA2B,CAAC;AAC1C,cAAc,4BAA4B,CAAC;AAC3C,cAAc,4CAA4C,CAAC;AAC3D,cAAc,4BAA4B,CAAC;AAC3C,cAAc,sCAAsC,CAAC"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,cAAc,cAAc,CAAC;AAC7B,cAAc,aAAa,CAAC;AAC5B,cAAc,eAAe,CAAC;AAC9B,cAAc,gBAAgB,CAAC;AAC/B,cAAc,YAAY,CAAC;AAC3B,cAAc,kBAAkB,CAAC;AACjC,cAAc,cAAc,CAAC"}
package/package.json CHANGED
@@ -1,7 +1,12 @@
1
1
  {
2
2
  "name": "@llmgateway/models",
3
- "version": "0.0.1",
3
+ "version": "1.0.1",
4
4
  "private": false,
5
+ "repository": {
6
+ "type": "git",
7
+ "url": "https://github.com/theopenco/llmgateway",
8
+ "directory": "packages/models"
9
+ },
5
10
  "license": "SEE LICENSE IN ../../LICENSE",
6
11
  "type": "module",
7
12
  "exports": {
@@ -20,10 +25,5 @@
20
25
  "dev": "tsc-watch --onSuccess 'resolve-tspaths'",
21
26
  "format": "eslint --fix . && prettier --write .",
22
27
  "lint": "eslint . && prettier --check ."
23
- },
24
- "dependencies": {
25
- "@llmgateway/db": "workspace:*",
26
- "@llmgateway/logger": "workspace:*"
27
- },
28
- "devDependencies": {}
28
+ }
29
29
  }
@@ -1,30 +0,0 @@
1
- import type { AvailableModelProvider, ModelWithPricing } from "./types.js";
2
- import type { ProviderMetrics } from "@llmgateway/db";
3
- export interface RoutingMetadata {
4
- availableProviders: string[];
5
- selectedProvider: string;
6
- selectionReason: string;
7
- providerScores: Array<{
8
- providerId: string;
9
- score: number;
10
- uptime?: number;
11
- latency?: number;
12
- throughput?: number;
13
- price: number;
14
- priority?: number;
15
- }>;
16
- originalProvider?: string;
17
- originalProviderUptime?: number;
18
- noFallback?: boolean;
19
- }
20
- export interface ProviderSelectionResult<T extends AvailableModelProvider> {
21
- provider: T;
22
- metadata: RoutingMetadata;
23
- }
24
- export interface ProviderSelectionOptions {
25
- metricsMap?: Map<string, ProviderMetrics>;
26
- isStreaming?: boolean;
27
- }
28
- export declare function getCheapestFromAvailableProviders<T extends AvailableModelProvider>(availableModelProviders: T[], modelWithPricing: ModelWithPricing & {
29
- id: string;
30
- }, options?: ProviderSelectionOptions): ProviderSelectionResult<T> | null;
@@ -1,183 +0,0 @@
1
- import { getProviderDefinition } from "./providers.js";
2
- const PRICE_WEIGHT = 0.2;
3
- const UPTIME_WEIGHT = 0.5;
4
- const THROUGHPUT_WEIGHT = 0.2;
5
- const LATENCY_WEIGHT = 0.1;
6
- const UPTIME_PENALTY_THRESHOLD = 95;
7
- function calculateUptimePenalty(uptime) {
8
- if (uptime >= UPTIME_PENALTY_THRESHOLD) {
9
- return 0;
10
- }
11
- const deficit = (UPTIME_PENALTY_THRESHOLD - uptime) / UPTIME_PENALTY_THRESHOLD;
12
- return Math.pow(deficit * 5, 2);
13
- }
14
- const DEFAULT_UPTIME = 100;
15
- const DEFAULT_LATENCY = 1000;
16
- const DEFAULT_THROUGHPUT = 50;
17
- const EXPLORATION_RATE = 0.01;
18
- export function getCheapestFromAvailableProviders(availableModelProviders, modelWithPricing, options) {
19
- const metricsMap = options?.metricsMap;
20
- const isStreaming = options?.isStreaming ?? false;
21
- if (availableModelProviders.length === 0) {
22
- return null;
23
- }
24
- const stableProviders = availableModelProviders.filter((provider) => {
25
- const providerInfo = modelWithPricing.providers.find((p) => p.providerId === provider.providerId);
26
- const providerStability = providerInfo && "stability" in providerInfo
27
- ? providerInfo.stability
28
- : undefined;
29
- const modelStability = "stability" in modelWithPricing
30
- ? modelWithPricing.stability
31
- : undefined;
32
- const effectiveStability = providerStability ?? modelStability;
33
- return (effectiveStability !== "unstable" && effectiveStability !== "experimental");
34
- });
35
- if (stableProviders.length === 0) {
36
- return null;
37
- }
38
- const isTest = process.env.NODE_ENV === "test" || process.env.VITEST;
39
- if (!isTest && Math.random() < EXPLORATION_RATE) {
40
- const randomProvider = stableProviders[Math.floor(Math.random() * stableProviders.length)];
41
- return {
42
- provider: randomProvider,
43
- metadata: {
44
- availableProviders: stableProviders.map((p) => p.providerId),
45
- selectedProvider: randomProvider.providerId,
46
- selectionReason: "random-exploration",
47
- providerScores: [],
48
- },
49
- };
50
- }
51
- if (!metricsMap || metricsMap.size === 0) {
52
- return selectByPriceOnly(stableProviders, modelWithPricing);
53
- }
54
- const providerScores = [];
55
- for (const provider of stableProviders) {
56
- const providerInfo = modelWithPricing.providers.find((p) => p.providerId === provider.providerId);
57
- const discount = providerInfo?.discount || 0;
58
- const discountMultiplier = 1 - discount;
59
- const price = (((providerInfo?.inputPrice || 0) + (providerInfo?.outputPrice || 0)) /
60
- 2) *
61
- discountMultiplier;
62
- const metricsKey = `${modelWithPricing.id}:${provider.providerId}`;
63
- const metrics = metricsMap.get(metricsKey);
64
- providerScores.push({
65
- provider,
66
- score: 0,
67
- price,
68
- uptime: metrics?.uptime,
69
- latency: metrics?.averageLatency,
70
- throughput: metrics?.throughput,
71
- });
72
- }
73
- const prices = providerScores.map((p) => p.price);
74
- const minPrice = Math.min(...prices);
75
- const maxPrice = Math.max(...prices);
76
- const uptimes = providerScores.map((p) => p.uptime ?? DEFAULT_UPTIME);
77
- const minUptime = Math.min(...uptimes);
78
- const maxUptime = Math.max(...uptimes);
79
- const throughputs = providerScores.map((p) => p.throughput ?? DEFAULT_THROUGHPUT);
80
- const minThroughput = Math.min(...throughputs);
81
- const maxThroughput = Math.max(...throughputs);
82
- const latencies = providerScores.map((p) => p.latency ?? DEFAULT_LATENCY);
83
- const minLatency = Math.min(...latencies);
84
- const maxLatency = Math.max(...latencies);
85
- for (const providerScore of providerScores) {
86
- const priceRange = maxPrice - minPrice;
87
- const priceScore = priceRange > 0 ? (providerScore.price - minPrice) / priceRange : 0;
88
- const uptime = providerScore.uptime ?? DEFAULT_UPTIME;
89
- const uptimeRange = maxUptime - minUptime;
90
- const uptimeScore = uptimeRange > 0 ? (maxUptime - uptime) / uptimeRange : 0;
91
- const uptimePenalty = calculateUptimePenalty(uptime);
92
- const throughput = providerScore.throughput ?? DEFAULT_THROUGHPUT;
93
- const throughputRange = maxThroughput - minThroughput;
94
- const throughputScore = throughputRange > 0 ? (maxThroughput - throughput) / throughputRange : 0;
95
- let latencyScore = 0;
96
- if (isStreaming) {
97
- const latency = providerScore.latency ?? DEFAULT_LATENCY;
98
- const latencyRange = maxLatency - minLatency;
99
- latencyScore =
100
- latencyRange > 0 ? (latency - minLatency) / latencyRange : 0;
101
- }
102
- const effectiveLatencyWeight = isStreaming ? LATENCY_WEIGHT : 0;
103
- const weightSum = PRICE_WEIGHT + UPTIME_WEIGHT + THROUGHPUT_WEIGHT + effectiveLatencyWeight;
104
- const baseScore = (PRICE_WEIGHT / weightSum) * priceScore +
105
- (UPTIME_WEIGHT / weightSum) * uptimeScore +
106
- (THROUGHPUT_WEIGHT / weightSum) * throughputScore +
107
- (effectiveLatencyWeight / weightSum) * latencyScore;
108
- const providerDef = getProviderDefinition(providerScore.provider.providerId);
109
- const priority = providerDef?.priority ?? 1;
110
- const priorityPenalty = 1 - priority;
111
- providerScore.score = baseScore + priorityPenalty + uptimePenalty;
112
- }
113
- let bestProvider = providerScores[0];
114
- for (const providerScore of providerScores) {
115
- if (providerScore.score < bestProvider.score) {
116
- bestProvider = providerScore;
117
- }
118
- }
119
- const metadata = {
120
- availableProviders: providerScores.map((p) => p.provider.providerId),
121
- selectedProvider: bestProvider.provider.providerId,
122
- selectionReason: metricsMap ? "weighted-score" : "price-only",
123
- providerScores: providerScores.map((p) => {
124
- const providerDef = getProviderDefinition(p.provider.providerId);
125
- const priority = providerDef?.priority ?? 1;
126
- return {
127
- providerId: p.provider.providerId,
128
- score: Number(p.score.toFixed(3)),
129
- uptime: p.uptime,
130
- latency: p.latency,
131
- throughput: p.throughput,
132
- price: p.price,
133
- priority,
134
- };
135
- }),
136
- };
137
- return {
138
- provider: bestProvider.provider,
139
- metadata,
140
- };
141
- }
142
- function selectByPriceOnly(stableProviders, modelWithPricing) {
143
- let cheapestProvider = stableProviders[0];
144
- let lowestEffectivePrice = Number.MAX_VALUE;
145
- const providerPrices = [];
146
- for (const provider of stableProviders) {
147
- const providerInfo = modelWithPricing.providers.find((p) => p.providerId === provider.providerId);
148
- const discount = providerInfo?.discount || 0;
149
- const discountMultiplier = 1 - discount;
150
- const totalPrice = (((providerInfo?.inputPrice || 0) + (providerInfo?.outputPrice || 0)) /
151
- 2) *
152
- discountMultiplier;
153
- const providerDef = getProviderDefinition(provider.providerId);
154
- const priority = providerDef?.priority ?? 1;
155
- const effectivePrice = priority > 0 ? totalPrice / priority : totalPrice;
156
- providerPrices.push({
157
- providerId: provider.providerId,
158
- price: totalPrice,
159
- effectivePrice,
160
- priority,
161
- });
162
- if (effectivePrice < lowestEffectivePrice) {
163
- lowestEffectivePrice = effectivePrice;
164
- cheapestProvider = provider;
165
- }
166
- }
167
- const metadata = {
168
- availableProviders: stableProviders.map((p) => p.providerId),
169
- selectedProvider: cheapestProvider.providerId,
170
- selectionReason: "price-only-no-metrics",
171
- providerScores: providerPrices.map((p) => ({
172
- providerId: p.providerId,
173
- score: 0,
174
- price: p.price,
175
- priority: p.priority,
176
- })),
177
- };
178
- return {
179
- provider: cheapestProvider,
180
- metadata,
181
- };
182
- }
183
- //# sourceMappingURL=get-cheapest-from-available-providers.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"get-cheapest-from-available-providers.js","sourceRoot":"","sources":["../src/get-cheapest-from-available-providers.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,qBAAqB,EAAE,MAAM,gBAAgB,CAAC;AAgBvD,MAAM,YAAY,GAAG,GAAG,CAAC;AACzB,MAAM,aAAa,GAAG,GAAG,CAAC;AAC1B,MAAM,iBAAiB,GAAG,GAAG,CAAC;AAC9B,MAAM,cAAc,GAAG,GAAG,CAAC;AAG3B,MAAM,wBAAwB,GAAG,EAAE,CAAC;AAYpC,SAAS,sBAAsB,CAAC,MAAc;IAC7C,IAAI,MAAM,IAAI,wBAAwB,EAAE,CAAC;QACxC,OAAO,CAAC,CAAC;IACV,CAAC;IAED,MAAM,OAAO,GACZ,CAAC,wBAAwB,GAAG,MAAM,CAAC,GAAG,wBAAwB,CAAC;IAEhE,OAAO,IAAI,CAAC,GAAG,CAAC,OAAO,GAAG,CAAC,EAAE,CAAC,CAAC,CAAC;AACjC,CAAC;AAGD,MAAM,cAAc,GAAG,GAAG,CAAC;AAC3B,MAAM,eAAe,GAAG,IAAI,CAAC;AAC7B,MAAM,kBAAkB,GAAG,EAAE,CAAC;AAG9B,MAAM,gBAAgB,GAAG,IAAI,CAAC;AAyC9B,MAAM,UAAU,iCAAiC,CAGhD,uBAA4B,EAC5B,gBAAmD,EACnD,OAAkC;IAElC,MAAM,UAAU,GAAG,OAAO,EAAE,UAAU,CAAC;IACvC,MAAM,WAAW,GAAG,OAAO,EAAE,WAAW,IAAI,KAAK,CAAC;IAClD,IAAI,uBAAuB,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QAC1C,OAAO,IAAI,CAAC;IACb,CAAC;IAGD,MAAM,eAAe,GAAG,uBAAuB,CAAC,MAAM,CAAC,CAAC,QAAQ,EAAE,EAAE;QACnE,MAAM,YAAY,GAAG,gBAAgB,CAAC,SAAS,CAAC,IAAI,CACnD,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,UAAU,KAAK,QAAQ,CAAC,UAAU,CAC3C,CAAC;QACF,MAAM,iBAAiB,GACtB,YAAY,IAAI,WAAW,IAAI,YAAY;YAC1C,CAAC,CAAE,YAAqC,CAAC,SAAS;YAClD,CAAC,CAAC,SAAS,CAAC;QACd,MAAM,cAAc,GACnB,WAAW,IAAI,gBAAgB;YAC9B,CAAC,CAAE,gBAA2C,CAAC,SAAS;YACxD,CAAC,CAAC,SAAS,CAAC;QACd,MAAM,kBAAkB,GAAG,iBAAiB,IAAI,cAAc,CAAC;QAC/D,OAAO,CACN,kBAAkB,KAAK,UAAU,IAAI,kBAAkB,KAAK,cAAc,CAC1E,CAAC;IACH,CAAC,CAAC,CAAC;IAEH,IAAI,eAAe,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QAClC,OAAO,IAAI,CAAC;IACb,CAAC;IAKD,MAAM,MAAM,GAAG,OAAO,CAAC,GAAG,CAAC,QAAQ,KAAK,MAAM,IAAI,OAAO,CAAC,GAAG,CAAC,MAAM,CAAC;IACrE,IAAI,CAAC,MAAM,IAAI,IAAI,CAAC,MAAM,EAAE,GAAG,gBAAgB,EAAE,CAAC;QACjD,MAAM,cAAc,GACnB,eAAe,CAAC,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,MAAM,EAAE,GAAG,eAAe,CAAC,MAAM,CAAC,CAAC,CAAC;QACrE,OAAO;YACN,QAAQ,EAAE,cAAc;YACxB,QAAQ,EAAE;gBACT,kBAAkB,EAAE,eAAe,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,UAAU,CAAC;gBAC5D,gBAAgB,EAAE,cAAc,CAAC,UAAU;gBAC3C,eAAe,EAAE,oBAAoB;gBACrC,cAAc,EAAE,EAAE;aAClB;SACD,CAAC;IACH,CAAC;IAGD,IAAI,CAAC,UAAU,IAAI,UAAU,CAAC,IAAI,KAAK,CAAC,EAAE,CAAC;QAC1C,OAAO,iBAAiB,CAAC,eAAe,EAAE,gBAAgB,CAAC,CAAC;IAC7D,CAAC;IAGD,MAAM,cAAc,GAAuB,EAAE,CAAC;IAE9C,KAAK,MAAM,QAAQ,IAAI,eAAe,EAAE,CAAC;QACxC,MAAM,YAAY,GAAG,gBAAgB,CAAC,SAAS,CAAC,IAAI,CACnD,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,UAAU,KAAK,QAAQ,CAAC,UAAU,CAC3C,CAAC;QACF,MAAM,QAAQ,GAAI,YAAqC,EAAE,QAAQ,IAAI,CAAC,CAAC;QACvE,MAAM,kBAAkB,GAAG,CAAC,GAAG,QAAQ,CAAC;QACxC,MAAM,KAAK,GACV,CAAC,CAAC,CAAC,YAAY,EAAE,UAAU,IAAI,CAAC,CAAC,GAAG,CAAC,YAAY,EAAE,WAAW,IAAI,CAAC,CAAC,CAAC;YACpE,CAAC,CAAC;YACH,kBAAkB,CAAC;QAEpB,MAAM,UAAU,GAAG,GAAG,gBAAgB,CAAC,EAAE,IAAI,QAAQ,CAAC,UAAU,EAAE,CAAC;QACnE,MAAM,OAAO,GAAG,UAAU,CAAC,GAAG,CAAC,UAAU,CAAC,CAAC;QAE3C,cAAc,CAAC,IAAI,CAAC;YACnB,QAAQ;YACR,KAAK,EAAE,CAAC;YACR,KAAK;YACL,MAAM,EAAE,OAAO,EAAE,MAAM;YACvB,OAAO,EAAE,OAAO,EAAE,cAAc;YAChC,UAAU,EAAE,OAAO,EAAE,UAAU;SAC/B,CAAC,CAAC;IACJ,CAAC;IAGD,MAAM,MAAM,GAAG,cAAc,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC;IAClD,MAAM,QAAQ,GAAG,IAAI,CAAC,GAAG,CAAC,GAAG,MAAM,CAAC,CAAC;IACrC,MAAM,QAAQ,GAAG,IAAI,CAAC,GAAG,CAAC,GAAG,MAAM,CAAC,CAAC;IAErC,MAAM,OAAO,GAAG,cAAc,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,MAAM,IAAI,cAAc,CAAC,CAAC;IACtE,MAAM,SAAS,GAAG,IAAI,CAAC,GAAG,CAAC,GAAG,OAAO,CAAC,CAAC;IACvC,MAAM,SAAS,GAAG,IAAI,CAAC,GAAG,CAAC,GAAG,OAAO,CAAC,CAAC;IAEvC,MAAM,WAAW,GAAG,cAAc,CAAC,GAAG,CACrC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,UAAU,IAAI,kBAAkB,CACzC,CAAC;IACF,MAAM,aAAa,GAAG,IAAI,CAAC,GAAG,CAAC,GAAG,WAAW,CAAC,CAAC;IAC/C,MAAM,aAAa,GAAG,IAAI,CAAC,GAAG,CAAC,GAAG,WAAW,CAAC,CAAC;IAE/C,MAAM,SAAS,GAAG,cAAc,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,OAAO,IAAI,eAAe,CAAC,CAAC;IAC1E,MAAM,UAAU,GAAG,IAAI,CAAC,GAAG,CAAC,GAAG,SAAS,CAAC,CAAC;IAC1C,MAAM,UAAU,GAAG,IAAI,CAAC,GAAG,CAAC,GAAG,SAAS,CAAC,CAAC;IAG1C,KAAK,MAAM,aAAa,IAAI,cAAc,EAAE,CAAC;QAE5C,MAAM,UAAU,GAAG,QAAQ,GAAG,QAAQ,CAAC;QACvC,MAAM,UAAU,GACf,UAAU,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,aAAa,CAAC,KAAK,GAAG,QAAQ,CAAC,GAAG,UAAU,CAAC,CAAC,CAAC,CAAC,CAAC;QAIpE,MAAM,MAAM,GAAG,aAAa,CAAC,MAAM,IAAI,cAAc,CAAC;QACtD,MAAM,WAAW,GAAG,SAAS,GAAG,SAAS,CAAC;QAC1C,MAAM,WAAW,GAChB,WAAW,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,SAAS,GAAG,MAAM,CAAC,GAAG,WAAW,CAAC,CAAC,CAAC,CAAC,CAAC;QAG1D,MAAM,aAAa,GAAG,sBAAsB,CAAC,MAAM,CAAC,CAAC;QAIrD,MAAM,UAAU,GAAG,aAAa,CAAC,UAAU,IAAI,kBAAkB,CAAC;QAClE,MAAM,eAAe,GAAG,aAAa,GAAG,aAAa,CAAC;QACtD,MAAM,eAAe,GACpB,eAAe,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,aAAa,GAAG,UAAU,CAAC,GAAG,eAAe,CAAC,CAAC,CAAC,CAAC,CAAC;QAI1E,IAAI,YAAY,GAAG,CAAC,CAAC;QACrB,IAAI,WAAW,EAAE,CAAC;YACjB,MAAM,OAAO,GAAG,aAAa,CAAC,OAAO,IAAI,eAAe,CAAC;YACzD,MAAM,YAAY,GAAG,UAAU,GAAG,UAAU,CAAC;YAC7C,YAAY;gBACX,YAAY,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,OAAO,GAAG,UAAU,CAAC,GAAG,YAAY,CAAC,CAAC,CAAC,CAAC,CAAC;QAC/D,CAAC;QAID,MAAM,sBAAsB,GAAG,WAAW,CAAC,CAAC,CAAC,cAAc,CAAC,CAAC,CAAC,CAAC,CAAC;QAChE,MAAM,SAAS,GACd,YAAY,GAAG,aAAa,GAAG,iBAAiB,GAAG,sBAAsB,CAAC;QAC3E,MAAM,SAAS,GACd,CAAC,YAAY,GAAG,SAAS,CAAC,GAAG,UAAU;YACvC,CAAC,aAAa,GAAG,SAAS,CAAC,GAAG,WAAW;YACzC,CAAC,iBAAiB,GAAG,SAAS,CAAC,GAAG,eAAe;YACjD,CAAC,sBAAsB,GAAG,SAAS,CAAC,GAAG,YAAY,CAAC;QAKrD,MAAM,WAAW,GAAG,qBAAqB,CACxC,aAAa,CAAC,QAAQ,CAAC,UAAU,CACjC,CAAC;QACF,MAAM,QAAQ,GAAG,WAAW,EAAE,QAAQ,IAAI,CAAC,CAAC;QAC5C,MAAM,eAAe,GAAG,CAAC,GAAG,QAAQ,CAAC;QAIrC,aAAa,CAAC,KAAK,GAAG,SAAS,GAAG,eAAe,GAAG,aAAa,CAAC;IACnE,CAAC;IAGD,IAAI,YAAY,GAAG,cAAc,CAAC,CAAC,CAAC,CAAC;IACrC,KAAK,MAAM,aAAa,IAAI,cAAc,EAAE,CAAC;QAC5C,IAAI,aAAa,CAAC,KAAK,GAAG,YAAY,CAAC,KAAK,EAAE,CAAC;YAC9C,YAAY,GAAG,aAAa,CAAC;QAC9B,CAAC;IACF,CAAC;IAGD,MAAM,QAAQ,GAAoB;QACjC,kBAAkB,EAAE,cAAc,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,QAAQ,CAAC,UAAU,CAAC;QACpE,gBAAgB,EAAE,YAAY,CAAC,QAAQ,CAAC,UAAU;QAClD,eAAe,EAAE,UAAU,CAAC,CAAC,CAAC,gBAAgB,CAAC,CAAC,CAAC,YAAY;QAC7D,cAAc,EAAE,cAAc,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE;YACxC,MAAM,WAAW,GAAG,qBAAqB,CAAC,CAAC,CAAC,QAAQ,CAAC,UAAU,CAAC,CAAC;YACjE,MAAM,QAAQ,GAAG,WAAW,EAAE,QAAQ,IAAI,CAAC,CAAC;YAC5C,OAAO;gBACN,UAAU,EAAE,CAAC,CAAC,QAAQ,CAAC,UAAU;gBACjC,KAAK,EAAE,MAAM,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC;gBACjC,MAAM,EAAE,CAAC,CAAC,MAAM;gBAChB,OAAO,EAAE,CAAC,CAAC,OAAO;gBAClB,UAAU,EAAE,CAAC,CAAC,UAAU;gBACxB,KAAK,EAAE,CAAC,CAAC,KAAK;gBACd,QAAQ;aACR,CAAC;QACH,CAAC,CAAC;KACF,CAAC;IAEF,OAAO;QACN,QAAQ,EAAE,YAAY,CAAC,QAAQ;QAC/B,QAAQ;KACR,CAAC;AACH,CAAC;AAKD,SAAS,iBAAiB,CACzB,eAAoB,EACpB,gBAAmD;IAEnD,IAAI,gBAAgB,GAAG,eAAe,CAAC,CAAC,CAAC,CAAC;IAC1C,IAAI,oBAAoB,GAAG,MAAM,CAAC,SAAS,CAAC;IAE5C,MAAM,cAAc,GAKf,EAAE,CAAC;IAER,KAAK,MAAM,QAAQ,IAAI,eAAe,EAAE,CAAC;QACxC,MAAM,YAAY,GAAG,gBAAgB,CAAC,SAAS,CAAC,IAAI,CACnD,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,UAAU,KAAK,QAAQ,CAAC,UAAU,CAC3C,CAAC;QACF,MAAM,QAAQ,GAAI,YAAqC,EAAE,QAAQ,IAAI,CAAC,CAAC;QACvE,MAAM,kBAAkB,GAAG,CAAC,GAAG,QAAQ,CAAC;QACxC,MAAM,UAAU,GACf,CAAC,CAAC,CAAC,YAAY,EAAE,UAAU,IAAI,CAAC,CAAC,GAAG,CAAC,YAAY,EAAE,WAAW,IAAI,CAAC,CAAC,CAAC;YACpE,CAAC,CAAC;YACH,kBAAkB,CAAC;QAGpB,MAAM,WAAW,GAAG,qBAAqB,CAAC,QAAQ,CAAC,UAAU,CAAC,CAAC;QAC/D,MAAM,QAAQ,GAAG,WAAW,EAAE,QAAQ,IAAI,CAAC,CAAC;QAC5C,MAAM,cAAc,GAAG,QAAQ,GAAG,CAAC,CAAC,CAAC,CAAC,UAAU,GAAG,QAAQ,CAAC,CAAC,CAAC,UAAU,CAAC;QAEzE,cAAc,CAAC,IAAI,CAAC;YACnB,UAAU,EAAE,QAAQ,CAAC,UAAU;YAC/B,KAAK,EAAE,UAAU;YACjB,cAAc;YACd,QAAQ;SACR,CAAC,CAAC;QAEH,IAAI,cAAc,GAAG,oBAAoB,EAAE,CAAC;YAC3C,oBAAoB,GAAG,cAAc,CAAC;YACtC,gBAAgB,GAAG,QAAQ,CAAC;QAC7B,CAAC;IACF,CAAC;IAED,MAAM,QAAQ,GAAoB;QACjC,kBAAkB,EAAE,eAAe,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,UAAU,CAAC;QAC5D,gBAAgB,EAAE,gBAAgB,CAAC,UAAU;QAC7C,eAAe,EAAE,uBAAuB;QACxC,cAAc,EAAE,cAAc,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC;YAC1C,UAAU,EAAE,CAAC,CAAC,UAAU;YACxB,KAAK,EAAE,CAAC;YACR,KAAK,EAAE,CAAC,CAAC,KAAK;YACd,QAAQ,EAAE,CAAC,CAAC,QAAQ;SACpB,CAAC,CAAC;KACH,CAAC;IAEF,OAAO;QACN,QAAQ,EAAE,gBAAgB;QAC1B,QAAQ;KACR,CAAC;AACH,CAAC"}
@@ -1,2 +0,0 @@
1
- import type { ProviderId } from "./providers.js";
2
- export declare function getCheapestModelForProvider(provider: ProviderId): string | null;
@@ -1,49 +0,0 @@
1
- import { models } from "./models.js";
2
- export function getCheapestModelForProvider(provider) {
3
- const currentDate = new Date();
4
- const availableModels = models
5
- .filter((model) => model.providers.some((p) => p.providerId === provider))
6
- .map((model) => ({
7
- model: model.id,
8
- modelStability: "stability" in model
9
- ? model.stability
10
- : undefined,
11
- provider: model.providers.find((p) => p.providerId === provider),
12
- }))
13
- .filter(({ provider: providerInfo }) => {
14
- const deprecated = providerInfo.deprecatedAt &&
15
- currentDate >= providerInfo.deprecatedAt;
16
- const deactivated = providerInfo.deactivatedAt &&
17
- currentDate >= providerInfo.deactivatedAt;
18
- return !deprecated && !deactivated;
19
- })
20
- .filter(({ provider: providerInfo }) => providerInfo.inputPrice !== undefined &&
21
- providerInfo.outputPrice !== undefined)
22
- .filter(({ provider: providerInfo, modelStability }) => {
23
- const providerStability = "stability" in providerInfo
24
- ? providerInfo.stability
25
- : undefined;
26
- const effectiveStability = providerStability ?? modelStability;
27
- return (effectiveStability !== "unstable" &&
28
- effectiveStability !== "experimental");
29
- });
30
- if (availableModels.length === 0) {
31
- return null;
32
- }
33
- const paidModels = availableModels.filter(({ provider: providerInfo }) => providerInfo.inputPrice !== 0 || providerInfo.outputPrice !== 0);
34
- const modelsToConsider = paidModels.length > 0 ? paidModels : availableModels;
35
- let cheapestModel = modelsToConsider[0].provider.modelName;
36
- let lowestPrice = Number.MAX_VALUE;
37
- for (const { provider: providerInfo } of modelsToConsider) {
38
- const discount = providerInfo.discount ?? 0;
39
- const discountMultiplier = 1 - discount;
40
- const totalPrice = ((providerInfo.inputPrice + providerInfo.outputPrice) / 2) *
41
- discountMultiplier;
42
- if (totalPrice < lowestPrice) {
43
- lowestPrice = totalPrice;
44
- cheapestModel = providerInfo.modelName;
45
- }
46
- }
47
- return cheapestModel;
48
- }
49
- //# sourceMappingURL=get-cheapest-model-for-provider.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"get-cheapest-model-for-provider.js","sourceRoot":"","sources":["../src/get-cheapest-model-for-provider.ts"],"names":[],"mappings":"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"}
@@ -1,3 +0,0 @@
1
- import type { ProviderId } from "./providers.js";
2
- import type { ProviderKeyOptions } from "@llmgateway/db";
3
- export declare function getProviderEndpoint(provider: ProviderId, baseUrl?: string, model?: string, token?: string, stream?: boolean, supportsReasoning?: boolean, hasExistingToolCalls?: boolean, providerKeyOptions?: ProviderKeyOptions, configIndex?: number, imageGenerations?: boolean): string;