ai.matey.backend 0.2.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 (159) hide show
  1. package/LICENSE +21 -0
  2. package/dist/cjs/index.js +60 -0
  3. package/dist/cjs/index.js.map +1 -0
  4. package/dist/cjs/providers/ai21.js +331 -0
  5. package/dist/cjs/providers/ai21.js.map +1 -0
  6. package/dist/cjs/providers/anthropic.js +664 -0
  7. package/dist/cjs/providers/anthropic.js.map +1 -0
  8. package/dist/cjs/providers/anyscale.js +338 -0
  9. package/dist/cjs/providers/anyscale.js.map +1 -0
  10. package/dist/cjs/providers/aws-bedrock.js +374 -0
  11. package/dist/cjs/providers/aws-bedrock.js.map +1 -0
  12. package/dist/cjs/providers/azure-openai.js +406 -0
  13. package/dist/cjs/providers/azure-openai.js.map +1 -0
  14. package/dist/cjs/providers/cerebras.js +356 -0
  15. package/dist/cjs/providers/cerebras.js.map +1 -0
  16. package/dist/cjs/providers/cloudflare.js +359 -0
  17. package/dist/cjs/providers/cloudflare.js.map +1 -0
  18. package/dist/cjs/providers/cohere.js +368 -0
  19. package/dist/cjs/providers/cohere.js.map +1 -0
  20. package/dist/cjs/providers/deepinfra.js +343 -0
  21. package/dist/cjs/providers/deepinfra.js.map +1 -0
  22. package/dist/cjs/providers/deepseek.js +104 -0
  23. package/dist/cjs/providers/deepseek.js.map +1 -0
  24. package/dist/cjs/providers/fireworks.js +363 -0
  25. package/dist/cjs/providers/fireworks.js.map +1 -0
  26. package/dist/cjs/providers/gemini.js +292 -0
  27. package/dist/cjs/providers/gemini.js.map +1 -0
  28. package/dist/cjs/providers/groq.js +143 -0
  29. package/dist/cjs/providers/groq.js.map +1 -0
  30. package/dist/cjs/providers/huggingface.js +392 -0
  31. package/dist/cjs/providers/huggingface.js.map +1 -0
  32. package/dist/cjs/providers/lmstudio.js +144 -0
  33. package/dist/cjs/providers/lmstudio.js.map +1 -0
  34. package/dist/cjs/providers/mistral.js +288 -0
  35. package/dist/cjs/providers/mistral.js.map +1 -0
  36. package/dist/cjs/providers/nvidia.js +167 -0
  37. package/dist/cjs/providers/nvidia.js.map +1 -0
  38. package/dist/cjs/providers/ollama.js +257 -0
  39. package/dist/cjs/providers/ollama.js.map +1 -0
  40. package/dist/cjs/providers/openai.js +640 -0
  41. package/dist/cjs/providers/openai.js.map +1 -0
  42. package/dist/cjs/providers/openrouter.js +379 -0
  43. package/dist/cjs/providers/openrouter.js.map +1 -0
  44. package/dist/cjs/providers/perplexity.js +372 -0
  45. package/dist/cjs/providers/perplexity.js.map +1 -0
  46. package/dist/cjs/providers/replicate.js +340 -0
  47. package/dist/cjs/providers/replicate.js.map +1 -0
  48. package/dist/cjs/providers/together-ai.js +341 -0
  49. package/dist/cjs/providers/together-ai.js.map +1 -0
  50. package/dist/cjs/providers/xai.js +339 -0
  51. package/dist/cjs/providers/xai.js.map +1 -0
  52. package/dist/cjs/shared.js +279 -0
  53. package/dist/cjs/shared.js.map +1 -0
  54. package/dist/esm/index.js +44 -0
  55. package/dist/esm/index.js.map +1 -0
  56. package/dist/esm/providers/ai21.js +327 -0
  57. package/dist/esm/providers/ai21.js.map +1 -0
  58. package/dist/esm/providers/anthropic.js +660 -0
  59. package/dist/esm/providers/anthropic.js.map +1 -0
  60. package/dist/esm/providers/anyscale.js +334 -0
  61. package/dist/esm/providers/anyscale.js.map +1 -0
  62. package/dist/esm/providers/aws-bedrock.js +370 -0
  63. package/dist/esm/providers/aws-bedrock.js.map +1 -0
  64. package/dist/esm/providers/azure-openai.js +402 -0
  65. package/dist/esm/providers/azure-openai.js.map +1 -0
  66. package/dist/esm/providers/cerebras.js +352 -0
  67. package/dist/esm/providers/cerebras.js.map +1 -0
  68. package/dist/esm/providers/cloudflare.js +355 -0
  69. package/dist/esm/providers/cloudflare.js.map +1 -0
  70. package/dist/esm/providers/cohere.js +364 -0
  71. package/dist/esm/providers/cohere.js.map +1 -0
  72. package/dist/esm/providers/deepinfra.js +339 -0
  73. package/dist/esm/providers/deepinfra.js.map +1 -0
  74. package/dist/esm/providers/deepseek.js +99 -0
  75. package/dist/esm/providers/deepseek.js.map +1 -0
  76. package/dist/esm/providers/fireworks.js +359 -0
  77. package/dist/esm/providers/fireworks.js.map +1 -0
  78. package/dist/esm/providers/gemini.js +288 -0
  79. package/dist/esm/providers/gemini.js.map +1 -0
  80. package/dist/esm/providers/groq.js +138 -0
  81. package/dist/esm/providers/groq.js.map +1 -0
  82. package/dist/esm/providers/huggingface.js +387 -0
  83. package/dist/esm/providers/huggingface.js.map +1 -0
  84. package/dist/esm/providers/lmstudio.js +139 -0
  85. package/dist/esm/providers/lmstudio.js.map +1 -0
  86. package/dist/esm/providers/mistral.js +284 -0
  87. package/dist/esm/providers/mistral.js.map +1 -0
  88. package/dist/esm/providers/nvidia.js +162 -0
  89. package/dist/esm/providers/nvidia.js.map +1 -0
  90. package/dist/esm/providers/ollama.js +253 -0
  91. package/dist/esm/providers/ollama.js.map +1 -0
  92. package/dist/esm/providers/openai.js +636 -0
  93. package/dist/esm/providers/openai.js.map +1 -0
  94. package/dist/esm/providers/openrouter.js +375 -0
  95. package/dist/esm/providers/openrouter.js.map +1 -0
  96. package/dist/esm/providers/perplexity.js +368 -0
  97. package/dist/esm/providers/perplexity.js.map +1 -0
  98. package/dist/esm/providers/replicate.js +336 -0
  99. package/dist/esm/providers/replicate.js.map +1 -0
  100. package/dist/esm/providers/together-ai.js +337 -0
  101. package/dist/esm/providers/together-ai.js.map +1 -0
  102. package/dist/esm/providers/xai.js +335 -0
  103. package/dist/esm/providers/xai.js.map +1 -0
  104. package/dist/esm/shared.js +272 -0
  105. package/dist/esm/shared.js.map +1 -0
  106. package/dist/types/index.d.ts +38 -0
  107. package/dist/types/index.d.ts.map +1 -0
  108. package/dist/types/providers/ai21.d.ts +106 -0
  109. package/dist/types/providers/ai21.d.ts.map +1 -0
  110. package/dist/types/providers/anthropic.d.ts +194 -0
  111. package/dist/types/providers/anthropic.d.ts.map +1 -0
  112. package/dist/types/providers/anyscale.d.ts +109 -0
  113. package/dist/types/providers/anyscale.d.ts.map +1 -0
  114. package/dist/types/providers/aws-bedrock.d.ts +152 -0
  115. package/dist/types/providers/aws-bedrock.d.ts.map +1 -0
  116. package/dist/types/providers/azure-openai.d.ts +142 -0
  117. package/dist/types/providers/azure-openai.d.ts.map +1 -0
  118. package/dist/types/providers/cerebras.d.ts +130 -0
  119. package/dist/types/providers/cerebras.d.ts.map +1 -0
  120. package/dist/types/providers/cloudflare.d.ts +125 -0
  121. package/dist/types/providers/cloudflare.d.ts.map +1 -0
  122. package/dist/types/providers/cohere.d.ts +114 -0
  123. package/dist/types/providers/cohere.d.ts.map +1 -0
  124. package/dist/types/providers/deepinfra.d.ts +118 -0
  125. package/dist/types/providers/deepinfra.d.ts.map +1 -0
  126. package/dist/types/providers/deepseek.d.ts +68 -0
  127. package/dist/types/providers/deepseek.d.ts.map +1 -0
  128. package/dist/types/providers/fireworks.d.ts +127 -0
  129. package/dist/types/providers/fireworks.d.ts.map +1 -0
  130. package/dist/types/providers/gemini.d.ts +71 -0
  131. package/dist/types/providers/gemini.d.ts.map +1 -0
  132. package/dist/types/providers/groq.d.ts +83 -0
  133. package/dist/types/providers/groq.d.ts.map +1 -0
  134. package/dist/types/providers/huggingface.d.ts +154 -0
  135. package/dist/types/providers/huggingface.d.ts.map +1 -0
  136. package/dist/types/providers/lmstudio.d.ts +88 -0
  137. package/dist/types/providers/lmstudio.d.ts.map +1 -0
  138. package/dist/types/providers/mistral.d.ts +65 -0
  139. package/dist/types/providers/mistral.d.ts.map +1 -0
  140. package/dist/types/providers/nvidia.d.ts +100 -0
  141. package/dist/types/providers/nvidia.d.ts.map +1 -0
  142. package/dist/types/providers/ollama.d.ts +59 -0
  143. package/dist/types/providers/ollama.d.ts.map +1 -0
  144. package/dist/types/providers/openai.d.ts +205 -0
  145. package/dist/types/providers/openai.d.ts.map +1 -0
  146. package/dist/types/providers/openrouter.d.ts +135 -0
  147. package/dist/types/providers/openrouter.d.ts.map +1 -0
  148. package/dist/types/providers/perplexity.d.ts +116 -0
  149. package/dist/types/providers/perplexity.d.ts.map +1 -0
  150. package/dist/types/providers/replicate.d.ts +91 -0
  151. package/dist/types/providers/replicate.d.ts.map +1 -0
  152. package/dist/types/providers/together-ai.d.ts +118 -0
  153. package/dist/types/providers/together-ai.d.ts.map +1 -0
  154. package/dist/types/providers/xai.d.ts +119 -0
  155. package/dist/types/providers/xai.d.ts.map +1 -0
  156. package/dist/types/shared.d.ts +116 -0
  157. package/dist/types/shared.d.ts.map +1 -0
  158. package/package.json +327 -0
  159. package/readme.md +86 -0
@@ -0,0 +1,339 @@
1
+ "use strict";
2
+ /**
3
+ * xAI Backend Adapter
4
+ *
5
+ * Adapts Universal IR to xAI (Grok) Chat Completions API.
6
+ * xAI is OpenAI-compatible with Grok models featuring real-time search.
7
+ *
8
+ * @module
9
+ */
10
+ Object.defineProperty(exports, "__esModule", { value: true });
11
+ exports.XAIBackendAdapter = void 0;
12
+ const ai_matey_errors_1 = require("ai.matey.errors");
13
+ const ai_matey_utils_1 = require("ai.matey.utils");
14
+ const ai_matey_utils_2 = require("ai.matey.utils");
15
+ // ============================================================================
16
+ // xAI Backend Adapter
17
+ // ============================================================================
18
+ /**
19
+ * Backend adapter for xAI (Grok) Chat Completions API.
20
+ *
21
+ * Features:
22
+ * - Grok models with real-time search capabilities
23
+ * - OpenAI-compatible API
24
+ * - 2M context window
25
+ * - Vision model support (Grok-vision)
26
+ * - Function calling support
27
+ * - Premium pricing ($5-$15 per 1M tokens)
28
+ */
29
+ class XAIBackendAdapter {
30
+ metadata;
31
+ config;
32
+ baseURL;
33
+ constructor(config) {
34
+ this.config = config;
35
+ this.baseURL = config.baseURL || 'https://api.x.ai/v1';
36
+ this.metadata = {
37
+ name: 'xai-backend',
38
+ version: '1.0.0',
39
+ provider: 'xAI',
40
+ capabilities: {
41
+ streaming: true,
42
+ multiModal: true, // Grok-vision available
43
+ tools: true, // Function calling
44
+ maxContextTokens: 2_000_000, // 2M context window
45
+ systemMessageStrategy: 'in-messages',
46
+ supportsMultipleSystemMessages: true,
47
+ supportsTemperature: true,
48
+ supportsTopP: true,
49
+ supportsTopK: false,
50
+ supportsSeed: false,
51
+ supportsFrequencyPenalty: true,
52
+ supportsPresencePenalty: true,
53
+ maxStopSequences: 4,
54
+ },
55
+ config: {
56
+ baseURL: this.baseURL,
57
+ },
58
+ };
59
+ }
60
+ /**
61
+ * Convert IR to xAI format.
62
+ */
63
+ fromIR(request) {
64
+ const { messages } = (0, ai_matey_utils_1.normalizeSystemMessages)(request.messages, this.metadata.capabilities.systemMessageStrategy, this.metadata.capabilities.supportsMultipleSystemMessages);
65
+ const xaiMessages = messages.map((msg) => ({
66
+ role: msg.role,
67
+ content: typeof msg.content === 'string'
68
+ ? msg.content
69
+ : msg.content.map((block) => {
70
+ if (block.type === 'text') {
71
+ return { type: 'text', text: block.text };
72
+ }
73
+ else if (block.type === 'image') {
74
+ return {
75
+ type: 'image_url',
76
+ image_url: {
77
+ url: block.source.type === 'url'
78
+ ? block.source.url
79
+ : `data:${block.source.mediaType};base64,${block.source.data}`,
80
+ },
81
+ };
82
+ }
83
+ return { type: 'text', text: JSON.stringify(block) };
84
+ }),
85
+ }));
86
+ return {
87
+ model: request.parameters?.model || this.config.defaultModel || 'grok-beta',
88
+ messages: xaiMessages,
89
+ temperature: request.parameters?.temperature,
90
+ max_tokens: request.parameters?.maxTokens,
91
+ top_p: request.parameters?.topP,
92
+ frequency_penalty: request.parameters?.frequencyPenalty,
93
+ presence_penalty: request.parameters?.presencePenalty,
94
+ stop: request.parameters?.stopSequences ? [...request.parameters.stopSequences] : undefined,
95
+ stream: request.stream || false,
96
+ };
97
+ }
98
+ /**
99
+ * Convert xAI response to IR.
100
+ */
101
+ toIR(response, originalRequest, latencyMs) {
102
+ const choice = response.choices[0];
103
+ if (!choice) {
104
+ throw new ai_matey_errors_1.ProviderError({
105
+ code: ai_matey_errors_1.ErrorCode.PROVIDER_ERROR,
106
+ message: 'No choices returned in response',
107
+ isRetryable: false,
108
+ provenance: { backend: this.metadata.name },
109
+ });
110
+ }
111
+ const message = {
112
+ role: choice.message.role === 'assistant' ? 'assistant' : 'user',
113
+ content: typeof choice.message.content === 'string'
114
+ ? choice.message.content
115
+ : choice.message.content.map((c) => (c.type === 'text' ? c.text : '')).join(''),
116
+ };
117
+ const finishReasonMap = {
118
+ stop: 'stop',
119
+ length: 'length',
120
+ tool_calls: 'tool_calls',
121
+ };
122
+ return {
123
+ message,
124
+ finishReason: finishReasonMap[choice.finish_reason || 'stop'] || 'stop',
125
+ usage: response.usage
126
+ ? {
127
+ promptTokens: response.usage.prompt_tokens,
128
+ completionTokens: response.usage.completion_tokens,
129
+ totalTokens: response.usage.total_tokens,
130
+ }
131
+ : undefined,
132
+ metadata: {
133
+ ...originalRequest.metadata,
134
+ providerResponseId: response.id,
135
+ provenance: {
136
+ ...originalRequest.metadata.provenance,
137
+ backend: this.metadata.name,
138
+ },
139
+ custom: {
140
+ ...originalRequest.metadata.custom,
141
+ latencyMs,
142
+ },
143
+ },
144
+ raw: response,
145
+ };
146
+ }
147
+ /**
148
+ * Execute non-streaming request.
149
+ */
150
+ async execute(request, signal) {
151
+ try {
152
+ const xaiRequest = this.fromIR(request);
153
+ xaiRequest.stream = false;
154
+ const startTime = Date.now();
155
+ const response = await fetch(`${this.baseURL}/chat/completions`, {
156
+ method: 'POST',
157
+ headers: this.getHeaders(),
158
+ body: JSON.stringify(xaiRequest),
159
+ signal,
160
+ });
161
+ if (!response.ok) {
162
+ throw (0, ai_matey_errors_1.createErrorFromHttpResponse)(response.status, response.statusText, await response.text(), { backend: this.metadata.name });
163
+ }
164
+ const data = (await response.json());
165
+ return this.toIR(data, request, Date.now() - startTime);
166
+ }
167
+ catch (error) {
168
+ if (error instanceof ai_matey_errors_1.NetworkError || error instanceof ai_matey_errors_1.ProviderError) {
169
+ throw error;
170
+ }
171
+ throw new ai_matey_errors_1.ProviderError({
172
+ code: ai_matey_errors_1.ErrorCode.PROVIDER_ERROR,
173
+ message: `xAI request failed: ${error instanceof Error ? error.message : String(error)}`,
174
+ isRetryable: true,
175
+ provenance: { backend: this.metadata.name },
176
+ cause: error instanceof Error ? error : undefined,
177
+ });
178
+ }
179
+ }
180
+ /**
181
+ * Execute streaming request.
182
+ */
183
+ async *executeStream(request, signal) {
184
+ try {
185
+ const xaiRequest = this.fromIR(request);
186
+ xaiRequest.stream = true;
187
+ const streamingConfig = (0, ai_matey_utils_2.mergeStreamingConfig)(this.config.streaming);
188
+ const effectiveMode = (0, ai_matey_utils_2.getEffectiveStreamMode)(request.streamMode, undefined, streamingConfig);
189
+ const includeBoth = streamingConfig.includeBoth || effectiveMode === 'accumulated';
190
+ const response = await fetch(`${this.baseURL}/chat/completions`, {
191
+ method: 'POST',
192
+ headers: this.getHeaders(),
193
+ body: JSON.stringify(xaiRequest),
194
+ signal,
195
+ });
196
+ if (!response.ok) {
197
+ throw (0, ai_matey_errors_1.createErrorFromHttpResponse)(response.status, response.statusText, await response.text(), { backend: this.metadata.name });
198
+ }
199
+ if (!response.body) {
200
+ throw new ai_matey_errors_1.StreamError({
201
+ code: ai_matey_errors_1.ErrorCode.STREAM_ERROR,
202
+ message: 'No response body',
203
+ provenance: { backend: this.metadata.name },
204
+ });
205
+ }
206
+ let sequence = 0;
207
+ let contentBuffer = '';
208
+ yield {
209
+ type: 'start',
210
+ sequence: sequence++,
211
+ metadata: {
212
+ ...request.metadata,
213
+ provenance: {
214
+ ...request.metadata.provenance,
215
+ backend: this.metadata.name,
216
+ },
217
+ },
218
+ };
219
+ const reader = response.body.getReader();
220
+ const decoder = new TextDecoder();
221
+ let buffer = '';
222
+ try {
223
+ while (true) {
224
+ const { done, value } = await reader.read();
225
+ if (done) {
226
+ break;
227
+ }
228
+ buffer += decoder.decode(value, { stream: true });
229
+ const lines = buffer.split('\n');
230
+ buffer = lines.pop() || '';
231
+ for (const line of lines) {
232
+ if (!line.trim() || !line.startsWith('data: ')) {
233
+ continue;
234
+ }
235
+ const data = line.slice(6).trim();
236
+ if (data === '[DONE]') {
237
+ continue;
238
+ }
239
+ try {
240
+ const chunk = JSON.parse(data);
241
+ const delta = chunk.choices[0]?.delta?.content;
242
+ if (delta) {
243
+ contentBuffer += delta;
244
+ const contentChunk = {
245
+ type: 'content',
246
+ sequence: sequence++,
247
+ delta: delta,
248
+ role: 'assistant',
249
+ };
250
+ if (includeBoth) {
251
+ contentChunk.accumulated = contentBuffer;
252
+ }
253
+ yield contentChunk;
254
+ }
255
+ if (chunk.choices[0]?.finish_reason) {
256
+ const finishReasonMap = {
257
+ stop: 'stop',
258
+ length: 'length',
259
+ };
260
+ yield {
261
+ type: 'done',
262
+ sequence: sequence++,
263
+ finishReason: finishReasonMap[chunk.choices[0].finish_reason] || 'stop',
264
+ message: { role: 'assistant', content: contentBuffer },
265
+ };
266
+ }
267
+ }
268
+ catch (parseError) {
269
+ console.warn('Failed to parse SSE chunk:', data, parseError);
270
+ }
271
+ }
272
+ }
273
+ }
274
+ finally {
275
+ reader.releaseLock();
276
+ }
277
+ }
278
+ catch (error) {
279
+ yield {
280
+ type: 'error',
281
+ sequence: 0,
282
+ error: {
283
+ code: error instanceof Error ? error.name : 'UNKNOWN_ERROR',
284
+ message: error instanceof Error ? error.message : String(error),
285
+ },
286
+ };
287
+ }
288
+ }
289
+ /**
290
+ * Get HTTP headers.
291
+ */
292
+ getHeaders() {
293
+ const headers = {
294
+ 'Content-Type': 'application/json',
295
+ Authorization: `Bearer ${this.config.apiKey}`,
296
+ };
297
+ return { ...headers, ...this.config.headers };
298
+ }
299
+ /**
300
+ * Health check.
301
+ */
302
+ async healthCheck() {
303
+ try {
304
+ const response = await fetch(`${this.baseURL}/models`, {
305
+ method: 'GET',
306
+ headers: this.getHeaders(),
307
+ signal: AbortSignal.timeout(5000),
308
+ });
309
+ return response.ok;
310
+ }
311
+ catch {
312
+ return false;
313
+ }
314
+ }
315
+ /**
316
+ * Estimate cost.
317
+ */
318
+ estimateCost(request) {
319
+ const pricing = {
320
+ 'grok-beta': { input: 5.0, output: 15.0 },
321
+ 'grok-vision-beta': { input: 5.0, output: 15.0 },
322
+ };
323
+ const model = request.parameters?.model || this.config.defaultModel || '';
324
+ const modelPricing = pricing[model];
325
+ if (!modelPricing) {
326
+ return Promise.resolve(null);
327
+ }
328
+ const inputTokens = request.messages.reduce((sum, msg) => {
329
+ const content = typeof msg.content === 'string' ? msg.content : '';
330
+ return sum + Math.ceil(content.length / 4);
331
+ }, 0);
332
+ const outputTokens = request.parameters?.maxTokens || 1024;
333
+ const inputCost = (inputTokens / 1_000_000) * modelPricing.input;
334
+ const outputCost = (outputTokens / 1_000_000) * modelPricing.output;
335
+ return Promise.resolve(inputCost + outputCost);
336
+ }
337
+ }
338
+ exports.XAIBackendAdapter = XAIBackendAdapter;
339
+ //# sourceMappingURL=xai.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"xai.js","sourceRoot":"","sources":["../../../src/providers/xai.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,279 @@
1
+ "use strict";
2
+ /**
3
+ * Backend Shared Utilities
4
+ *
5
+ * Common utilities shared across all backend adapters to reduce code duplication.
6
+ * These functions handle token estimation, model listing, and filtering.
7
+ *
8
+ * @module
9
+ */
10
+ Object.defineProperty(exports, "__esModule", { value: true });
11
+ exports.DEFAULT_ANTHROPIC_MODELS = exports.DEFAULT_OPENAI_MODELS = void 0;
12
+ exports.estimateTokens = estimateTokens;
13
+ exports.buildStaticResult = buildStaticResult;
14
+ exports.applyModelFilter = applyModelFilter;
15
+ exports.estimateCost = estimateCost;
16
+ // ============================================================================
17
+ // Token Estimation
18
+ // ============================================================================
19
+ /**
20
+ * Estimate token count for a chat request.
21
+ *
22
+ * Uses a rough heuristic of 4 characters per token, which provides
23
+ * a reasonable approximation across most LLMs.
24
+ *
25
+ * @param request - The IR chat request to estimate tokens for
26
+ * @returns Estimated token count
27
+ *
28
+ * @example
29
+ * ```typescript
30
+ * const tokens = estimateTokens({
31
+ * messages: [{ role: 'user', content: 'Hello, how are you?' }],
32
+ * });
33
+ * // tokens ≈ 5
34
+ * ```
35
+ */
36
+ function estimateTokens(request) {
37
+ let totalChars = 0;
38
+ for (const message of request.messages) {
39
+ if (typeof message.content === 'string') {
40
+ totalChars += message.content.length;
41
+ }
42
+ else {
43
+ for (const block of message.content) {
44
+ if (block.type === 'text') {
45
+ totalChars += block.text.length;
46
+ }
47
+ }
48
+ }
49
+ }
50
+ // Rough estimate: 4 characters per token
51
+ return Math.ceil(totalChars / 4);
52
+ }
53
+ // ============================================================================
54
+ // Model Listing Utilities
55
+ // ============================================================================
56
+ /**
57
+ * Build a ListModelsResult from static model configuration.
58
+ *
59
+ * Converts string model IDs or AIModel objects into a standardized result.
60
+ *
61
+ * @param models - Array of model IDs or AIModel objects
62
+ * @param ownedBy - Default owner for string-only model IDs
63
+ * @returns Standardized ListModelsResult
64
+ *
65
+ * @example
66
+ * ```typescript
67
+ * // With string IDs
68
+ * const result = buildStaticResult(['gpt-4', 'gpt-3.5-turbo'], 'openai');
69
+ *
70
+ * // With AIModel objects
71
+ * const result = buildStaticResult([
72
+ * { id: 'claude-3-sonnet', name: 'Claude 3 Sonnet', ownedBy: 'anthropic' }
73
+ * ]);
74
+ * ```
75
+ */
76
+ function buildStaticResult(models, ownedBy = 'provider') {
77
+ const normalizedModels = models.map((model) => {
78
+ if (typeof model === 'string') {
79
+ // Convert string ID to AIModel
80
+ return {
81
+ id: model,
82
+ name: model,
83
+ ownedBy,
84
+ };
85
+ }
86
+ return model;
87
+ });
88
+ return {
89
+ models: normalizedModels,
90
+ source: 'static',
91
+ fetchedAt: Date.now(),
92
+ isComplete: true,
93
+ };
94
+ }
95
+ /**
96
+ * Apply capability filter to a model list result.
97
+ *
98
+ * Filters the models based on their declared capabilities.
99
+ * Models without capability information are included by default.
100
+ *
101
+ * @param result - The model list result to filter
102
+ * @param filter - Optional capability filter criteria
103
+ * @returns Filtered ListModelsResult
104
+ *
105
+ * @example
106
+ * ```typescript
107
+ * const filtered = applyModelFilter(result, {
108
+ * supportsStreaming: true,
109
+ * supportsVision: true,
110
+ * });
111
+ * ```
112
+ */
113
+ function applyModelFilter(result, filter) {
114
+ if (!filter) {
115
+ return result;
116
+ }
117
+ const filteredModels = result.models.filter((model) => {
118
+ const capabilities = model.capabilities;
119
+ // If no capabilities info, can't filter - include the model
120
+ if (!capabilities) {
121
+ return true;
122
+ }
123
+ // Check each filter criterion
124
+ if (filter.supportsStreaming !== undefined &&
125
+ capabilities.supportsStreaming !== filter.supportsStreaming) {
126
+ return false;
127
+ }
128
+ if (filter.supportsVision !== undefined &&
129
+ capabilities.supportsVision !== filter.supportsVision) {
130
+ return false;
131
+ }
132
+ if (filter.supportsTools !== undefined && capabilities.supportsTools !== filter.supportsTools) {
133
+ return false;
134
+ }
135
+ if (filter.supportsJSON !== undefined && capabilities.supportsJSON !== filter.supportsJSON) {
136
+ return false;
137
+ }
138
+ return true;
139
+ });
140
+ return {
141
+ ...result,
142
+ models: filteredModels,
143
+ isComplete: result.isComplete && filteredModels.length === result.models.length,
144
+ };
145
+ }
146
+ /**
147
+ * Estimate request cost based on token counts and provider rates.
148
+ *
149
+ * @param inputTokens - Estimated input token count
150
+ * @param outputTokens - Estimated output token count (defaults to maxTokens or 1000)
151
+ * @param rates - Cost rates per million tokens
152
+ * @returns Estimated cost in USD
153
+ *
154
+ * @example
155
+ * ```typescript
156
+ * const cost = estimateCost(1000, 500, {
157
+ * inputPer1M: 3.00, // $3 per 1M input tokens
158
+ * outputPer1M: 15.00, // $15 per 1M output tokens
159
+ * });
160
+ * // cost ≈ $0.0105
161
+ * ```
162
+ */
163
+ function estimateCost(inputTokens, outputTokens, rates) {
164
+ const inputCost = (inputTokens / 1_000_000) * rates.inputPer1M;
165
+ const outputCost = (outputTokens / 1_000_000) * rates.outputPer1M;
166
+ return inputCost + outputCost;
167
+ }
168
+ // ============================================================================
169
+ // Default Model Lists
170
+ // ============================================================================
171
+ /**
172
+ * Default OpenAI models with capabilities.
173
+ */
174
+ exports.DEFAULT_OPENAI_MODELS = [
175
+ {
176
+ id: 'gpt-4o',
177
+ name: 'GPT-4o',
178
+ description: 'Most capable GPT-4 model with vision',
179
+ ownedBy: 'openai',
180
+ capabilities: {
181
+ maxTokens: 16384,
182
+ contextWindow: 128000,
183
+ supportsStreaming: true,
184
+ supportsVision: true,
185
+ supportsTools: true,
186
+ supportsJSON: true,
187
+ },
188
+ },
189
+ {
190
+ id: 'gpt-4o-mini',
191
+ name: 'GPT-4o Mini',
192
+ description: 'Fast and affordable GPT-4 variant',
193
+ ownedBy: 'openai',
194
+ capabilities: {
195
+ maxTokens: 16384,
196
+ contextWindow: 128000,
197
+ supportsStreaming: true,
198
+ supportsVision: true,
199
+ supportsTools: true,
200
+ supportsJSON: true,
201
+ },
202
+ },
203
+ {
204
+ id: 'gpt-4-turbo',
205
+ name: 'GPT-4 Turbo',
206
+ description: 'GPT-4 with larger context and vision',
207
+ ownedBy: 'openai',
208
+ capabilities: {
209
+ maxTokens: 4096,
210
+ contextWindow: 128000,
211
+ supportsStreaming: true,
212
+ supportsVision: true,
213
+ supportsTools: true,
214
+ supportsJSON: true,
215
+ },
216
+ },
217
+ {
218
+ id: 'gpt-3.5-turbo',
219
+ name: 'GPT-3.5 Turbo',
220
+ description: 'Fast and efficient for simple tasks',
221
+ ownedBy: 'openai',
222
+ capabilities: {
223
+ maxTokens: 4096,
224
+ contextWindow: 16385,
225
+ supportsStreaming: true,
226
+ supportsVision: false,
227
+ supportsTools: true,
228
+ supportsJSON: true,
229
+ },
230
+ },
231
+ ];
232
+ /**
233
+ * Default Anthropic Claude models with capabilities.
234
+ */
235
+ exports.DEFAULT_ANTHROPIC_MODELS = [
236
+ {
237
+ id: 'claude-3-5-sonnet-20241022',
238
+ name: 'Claude 3.5 Sonnet (Oct 2024)',
239
+ description: 'Most intelligent model with excellent reasoning',
240
+ ownedBy: 'anthropic',
241
+ capabilities: {
242
+ maxTokens: 8192,
243
+ contextWindow: 200000,
244
+ supportsStreaming: true,
245
+ supportsVision: true,
246
+ supportsTools: true,
247
+ supportsJSON: false,
248
+ },
249
+ },
250
+ {
251
+ id: 'claude-3-5-haiku-20241022',
252
+ name: 'Claude 3.5 Haiku (Oct 2024)',
253
+ description: 'Fastest model for high-throughput tasks',
254
+ ownedBy: 'anthropic',
255
+ capabilities: {
256
+ maxTokens: 8192,
257
+ contextWindow: 200000,
258
+ supportsStreaming: true,
259
+ supportsVision: false,
260
+ supportsTools: true,
261
+ supportsJSON: false,
262
+ },
263
+ },
264
+ {
265
+ id: 'claude-3-opus-20240229',
266
+ name: 'Claude 3 Opus',
267
+ description: 'Previous top-tier model',
268
+ ownedBy: 'anthropic',
269
+ capabilities: {
270
+ maxTokens: 4096,
271
+ contextWindow: 200000,
272
+ supportsStreaming: true,
273
+ supportsVision: true,
274
+ supportsTools: true,
275
+ supportsJSON: false,
276
+ },
277
+ },
278
+ ];
279
+ //# sourceMappingURL=shared.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"shared.js","sourceRoot":"","sources":["../../src/shared.ts"],"names":[],"mappings":"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"}