@aeye/openrouter 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.
@@ -0,0 +1,315 @@
1
+ /**
2
+ * OpenRouter Provider
3
+ *
4
+ * Provider for OpenRouter API with provider-specific routing and fallback options.
5
+ */
6
+ import { detectTier } from '@aeye/ai';
7
+ import { OpenAIProvider } from '@aeye/openai';
8
+ import OpenAI from 'openai';
9
+ import { fetchModels, fetchZDRModels } from './source';
10
+ /**
11
+ * Convert OpenRouter parameter names to our ModelParameter format
12
+ */
13
+ function convertSupportedParameters(openRouterParams) {
14
+ const paramMap = {
15
+ 'max_tokens': 'maxTokens',
16
+ 'temperature': 'temperature',
17
+ 'top_p': 'topP',
18
+ 'frequency_penalty': 'frequencyPenalty',
19
+ 'presence_penalty': 'presencePenalty',
20
+ 'stop': 'stop',
21
+ 'seed': 'seed',
22
+ 'response_format': 'responseFormat',
23
+ 'structured_outputs': 'structuredOutput',
24
+ 'tools': 'tools',
25
+ 'tool_choice': 'toolChoice',
26
+ 'logit_bias': 'logitBias',
27
+ 'logprobs': 'logProbabilities',
28
+ 'top_logprobs': 'logProbabilities',
29
+ 'reasoning': 'reason',
30
+ 'include_reasoning': 'reason',
31
+ };
32
+ const converted = new Set();
33
+ for (const param of openRouterParams) {
34
+ const mapped = paramMap[param];
35
+ if (mapped) {
36
+ converted.add(mapped);
37
+ }
38
+ }
39
+ return Array.from(converted);
40
+ }
41
+ /**
42
+ * Detect capabilities from input/output modalities
43
+ */
44
+ function detectCapabilities(model) {
45
+ const capabilities = new Set();
46
+ // Chat capability - if model outputs text
47
+ if (model.architecture.output_modalities.includes('text')) {
48
+ capabilities.add('chat');
49
+ }
50
+ // Image generation - if model outputs images
51
+ if (model.architecture.output_modalities.includes('image')) {
52
+ capabilities.add('image');
53
+ }
54
+ // Vision capability - if model accepts images as input
55
+ if (model.architecture.input_modalities.includes('image')) {
56
+ capabilities.add('vision');
57
+ }
58
+ // Audio/hearing capability - if model accepts audio as input
59
+ if (model.architecture.input_modalities.includes('audio')) {
60
+ capabilities.add('hearing');
61
+ }
62
+ // File handling capability
63
+ if (model.architecture.input_modalities.includes('file')) {
64
+ capabilities.add('vision'); // Files often imply document/vision capabilities
65
+ }
66
+ // Tools/function calling
67
+ if (model.supported_parameters.includes('tools') || model.supported_parameters.includes('tool_choice')) {
68
+ capabilities.add('tools');
69
+ }
70
+ // Reasoning capability
71
+ if (model.supported_parameters.includes('reasoning') || model.supported_parameters.includes('include_reasoning')) {
72
+ capabilities.add('reasoning');
73
+ }
74
+ // JSON output capability
75
+ if (model.supported_parameters.includes('response_format')) {
76
+ capabilities.add('json');
77
+ }
78
+ // Structured output capability
79
+ if (model.supported_parameters.includes('structured_outputs')) {
80
+ capabilities.add('structured');
81
+ }
82
+ // Streaming capability (most models support this)
83
+ capabilities.add('streaming');
84
+ return Array.from(capabilities);
85
+ }
86
+ /**
87
+ * Convert OpenRouter model to ModelInfo with full details
88
+ */
89
+ export function convertOpenRouterModel(model, zdrModelIds, metrics) {
90
+ const capabilities = detectCapabilities(model);
91
+ const supportedParameters = convertSupportedParameters(model.supported_parameters);
92
+ const tier = detectTier(model.name);
93
+ // Update ZDR support from ZDR endpoint
94
+ if (zdrModelIds.has(model.id)) {
95
+ capabilities.push('zdr');
96
+ }
97
+ const hasValue = (x) => {
98
+ return x !== undefined && x !== null && x !== '' && x !== '0';
99
+ };
100
+ return {
101
+ provider: 'openrouter',
102
+ id: model.id,
103
+ name: model.name,
104
+ capabilities: new Set(capabilities), // Will be serialized as array
105
+ tier,
106
+ pricing: {
107
+ text: hasValue(model.pricing.prompt) || hasValue(model.pricing.completion) ? {
108
+ input: hasValue(model.pricing.prompt) ? parseFloat(model.pricing.prompt) * 1_000_000 : undefined,
109
+ output: hasValue(model.pricing.completion) ? parseFloat(model.pricing.completion) * 1_000_000 : undefined,
110
+ } : undefined,
111
+ image: hasValue(model.pricing.image) ? {
112
+ input: parseFloat(model.pricing.image) * 1_000_000,
113
+ } : undefined,
114
+ reasoning: hasValue(model.pricing.internal_reasoning) ? {
115
+ output: parseFloat(model.pricing.internal_reasoning) * 1_000_000,
116
+ } : undefined,
117
+ perRequest: hasValue(model.pricing.request)
118
+ ? parseFloat(model.pricing.request)
119
+ : undefined,
120
+ },
121
+ contextWindow: model.context_length,
122
+ maxOutputTokens: model.top_provider.max_completion_tokens ?? undefined,
123
+ tokenizer: model.architecture.tokenizer,
124
+ supportedParameters: new Set(supportedParameters), // Will be serialized as array
125
+ metrics: metrics ? {
126
+ timeToFirstToken: metrics.latency,
127
+ tokensPerSecond: metrics.throughput,
128
+ // Store uptime in metadata since it's not a standard metric
129
+ } : undefined,
130
+ metadata: {
131
+ description: model.description,
132
+ defaultParameters: model.default_parameters,
133
+ canonicalSlug: model.canonical_slug,
134
+ huggingFaceId: model.hugging_face_id,
135
+ created: model.created,
136
+ uptime: metrics?.uptime,
137
+ },
138
+ };
139
+ }
140
+ /**
141
+ * OpenRouter provider implementation extending base OpenAI-compatible provider
142
+ */
143
+ export class OpenRouterProvider extends OpenAIProvider {
144
+ name = 'openrouter';
145
+ createClient(config) {
146
+ return new OpenAI({
147
+ apiKey: config.apiKey,
148
+ baseURL: config.baseURL || 'https://openrouter.ai/api/v1',
149
+ project: config.project,
150
+ organization: config.organization,
151
+ defaultHeaders: {
152
+ 'HTTP-Referer': config.defaultParams?.siteUrl,
153
+ 'X-Title': config.defaultParams?.appName,
154
+ },
155
+ });
156
+ }
157
+ convertModel(model) {
158
+ // This won't be used since we override listModels, but provide implementation
159
+ return {
160
+ provider: 'openrouter',
161
+ id: model.id,
162
+ name: model.id,
163
+ capabilities: new Set(['chat', 'streaming']),
164
+ tier: detectTier(model.id),
165
+ pricing: {},
166
+ contextWindow: 0,
167
+ maxOutputTokens: undefined,
168
+ metadata: {},
169
+ };
170
+ }
171
+ /**
172
+ * Augment chat request with OpenRouter-specific parameters
173
+ */
174
+ augmentChatRequest(params, request, config) {
175
+ // Add reasoning if specified
176
+ if (request.reason) {
177
+ params.reasoning = {
178
+ enabled: true,
179
+ effort: request.reason.effort,
180
+ max_tokens: request.reason.maxTokens,
181
+ };
182
+ }
183
+ // Merge provider parameters from config defaults
184
+ if (config.defaultParams) {
185
+ const dp = config.defaultParams;
186
+ params.provider = {
187
+ allow_fallbacks: dp.providers?.allowFallbacks,
188
+ require_parameters: dp.providers?.requireParameters,
189
+ data_collection: dp.providers?.dataCollection,
190
+ max_price: dp.providers?.maxPrice,
191
+ ...dp.providers,
192
+ };
193
+ if (dp.transforms) {
194
+ params.transforms = dp.transforms;
195
+ }
196
+ }
197
+ }
198
+ /**
199
+ *
200
+ * @param expected
201
+ * @param response
202
+ */
203
+ augmentChatResponse(expected, response, config) {
204
+ const message = expected.choices?.[0]?.message;
205
+ if (message) {
206
+ if (message.reasoning) {
207
+ response.reasoning = message.reasoning;
208
+ }
209
+ else if (message.reasoning_details) {
210
+ response.reasoning = message.reasoning_details
211
+ .map(rd => [rd.text, rd.summary])
212
+ .flat()
213
+ .filter(Boolean)
214
+ .join('\n');
215
+ }
216
+ }
217
+ const usage = expected.usage;
218
+ if (usage) {
219
+ if (!response.usage) {
220
+ response.usage = {};
221
+ }
222
+ if (!response.usage.text) {
223
+ response.usage.text = {};
224
+ }
225
+ if (usage.completion_tokens) {
226
+ response.usage.text.output = usage.completion_tokens;
227
+ }
228
+ if (usage.prompt_tokens) {
229
+ response.usage.text.input = usage.prompt_tokens;
230
+ }
231
+ if (usage.cost) {
232
+ response.usage.cost = usage.cost;
233
+ }
234
+ }
235
+ }
236
+ augmentChatChunk(expected, chunk, config) {
237
+ const usage = expected.usage;
238
+ if (usage) {
239
+ if (!chunk.usage) {
240
+ chunk.usage = {};
241
+ }
242
+ if (!chunk.usage.text) {
243
+ chunk.usage.text = {};
244
+ }
245
+ if (usage.completion_tokens) {
246
+ chunk.usage.text.output = usage.completion_tokens;
247
+ }
248
+ if (usage.prompt_tokens) {
249
+ chunk.usage.text.input = usage.prompt_tokens;
250
+ }
251
+ if (usage.cost) {
252
+ chunk.usage.cost = usage.cost;
253
+ }
254
+ }
255
+ if (expected.reasoning) {
256
+ chunk.reasoning = expected.reasoning;
257
+ }
258
+ else if (expected.reasoning_details) {
259
+ chunk.reasoning = expected.reasoning_details
260
+ .map(rd => [rd.text, rd.summary])
261
+ .flat()
262
+ .filter(Boolean)
263
+ .join('\n');
264
+ }
265
+ }
266
+ /**
267
+ * OpenRouter does not support image generation
268
+ */
269
+ generateImage = undefined;
270
+ /**
271
+ * OpenRouter does not support image generation streaming
272
+ */
273
+ generateImageStream = undefined;
274
+ /**
275
+ * OpenRouter does not support image editing
276
+ */
277
+ editImage = undefined;
278
+ /**
279
+ * OpenRouter does not support image editing
280
+ */
281
+ editImageStream = undefined;
282
+ /**
283
+ * OpenRouter does not support audio transcription
284
+ */
285
+ transcribe = undefined;
286
+ /**
287
+ * OpenRouter does not support audio transcription streaming
288
+ */
289
+ transcribeStream = undefined;
290
+ /**
291
+ * OpenRouter does not support speech synthesis
292
+ */
293
+ speech = undefined;
294
+ /**
295
+ * OpenRouter does not support embeddings
296
+ */
297
+ embed = undefined;
298
+ /**
299
+ * Override listModels to use OpenRouter's model API with ZDR support
300
+ */
301
+ async listModels(config) {
302
+ try {
303
+ // Fetch both models and ZDR models in parallel
304
+ const [models, zdrModels] = await Promise.all([
305
+ fetchModels(config.apiKey),
306
+ fetchZDRModels(config.apiKey),
307
+ ]);
308
+ return models.map((model) => convertOpenRouterModel(model, zdrModels));
309
+ }
310
+ catch (error) {
311
+ throw new Error(`Failed to list OpenRouter models: ${error}`);
312
+ }
313
+ }
314
+ }
315
+ //# sourceMappingURL=openrouter.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"openrouter.js","sourceRoot":"","sources":["../src/openrouter.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,34 @@
1
+ /**
2
+ * OpenRouter Model Source
3
+ *
4
+ * Fetches model information from OpenRouter API to enrich all providers
5
+ * with comprehensive model metadata (pricing, capabilities, ZDR support).
6
+ */
7
+ import type { ModelInfo, ModelSource } from '@aeye/ai';
8
+ import { OpenRouterModel } from './types';
9
+ /**
10
+ * Configuration for OpenRouter model source
11
+ */
12
+ export interface OpenRouterSourceConfig {
13
+ apiKey?: string;
14
+ includeZDR?: boolean;
15
+ }
16
+ /**
17
+ * Fetch ZDR (Zero Data Retention) compliant models
18
+ */
19
+ export declare function fetchZDRModels(apiKey?: string): Promise<Set<string>>;
20
+ /**
21
+ * Fetch all OpenRouter models
22
+ * @returns
23
+ */
24
+ export declare function fetchModels(apiKey?: string): Promise<OpenRouterModel[]>;
25
+ /**
26
+ * OpenRouter model source implementation
27
+ */
28
+ export declare class OpenRouterModelSource implements ModelSource {
29
+ readonly name = "openrouter";
30
+ private config;
31
+ constructor(config?: OpenRouterSourceConfig);
32
+ fetchModels(config?: Record<string, unknown>): Promise<ModelInfo[]>;
33
+ }
34
+ //# sourceMappingURL=source.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"source.d.ts","sourceRoot":"","sources":["../src/source.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,KAAK,EAAE,SAAS,EAAE,WAAW,EAAE,MAAM,UAAU,CAAC;AAEvD,OAAO,EAAE,eAAe,EAAY,MAAM,SAAS,CAAC;AAEpD;;GAEG;AACH,MAAM,WAAW,sBAAsB;IACrC,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,UAAU,CAAC,EAAE,OAAO,CAAC;CACtB;AAED;;GAEG;AACH,wBAAsB,cAAc,CAAC,MAAM,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC,CAsB1E;AAED;;;GAGG;AACH,wBAAsB,WAAW,CAAC,MAAM,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,eAAe,EAAE,CAAC,CAa7E;AAED;;GAEG;AACH,qBAAa,qBAAsB,YAAW,WAAW;IACvD,QAAQ,CAAC,IAAI,gBAAgB;IAC7B,OAAO,CAAC,MAAM,CAAyB;gBAE3B,MAAM,GAAE,sBAA2B;IAIzC,WAAW,CAAC,MAAM,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,OAAO,CAAC,SAAS,EAAE,CAAC;CAiB1E"}
package/dist/source.js ADDED
@@ -0,0 +1,77 @@
1
+ /**
2
+ * OpenRouter Model Source
3
+ *
4
+ * Fetches model information from OpenRouter API to enrich all providers
5
+ * with comprehensive model metadata (pricing, capabilities, ZDR support).
6
+ */
7
+ import { convertOpenRouterModel } from './openrouter';
8
+ /**
9
+ * Fetch ZDR (Zero Data Retention) compliant models
10
+ */
11
+ export async function fetchZDRModels(apiKey) {
12
+ try {
13
+ const effectiveKey = apiKey ?? process.env.OPENROUTER_API_KEY;
14
+ const response = await fetch('https://openrouter.ai/api/v1/endpoints/zdr', {
15
+ headers: {
16
+ 'Content-Type': 'application/json',
17
+ 'Authorization': effectiveKey ? `Bearer ${effectiveKey}` : undefined,
18
+ },
19
+ });
20
+ if (!response.ok) {
21
+ console.warn('Failed to fetch ZDR models from OpenRouter');
22
+ return new Set();
23
+ }
24
+ const data = (await response.json());
25
+ // The model_name field contains the model ID in provider/model format
26
+ return new Set(data.data.map((model) => model.model_name));
27
+ }
28
+ catch (error) {
29
+ console.warn('Error fetching ZDR models:', error);
30
+ return new Set();
31
+ }
32
+ }
33
+ /**
34
+ * Fetch all OpenRouter models
35
+ * @returns
36
+ */
37
+ export async function fetchModels(apiKey) {
38
+ const effectiveKey = apiKey ?? process.env.OPENROUTER_API_KEY;
39
+ const response = await fetch('https://openrouter.ai/api/v1/models', {
40
+ headers: {
41
+ 'Content-Type': 'application/json',
42
+ 'Authorization': effectiveKey ? `Bearer ${effectiveKey}` : undefined,
43
+ },
44
+ });
45
+ if (!response.ok) {
46
+ throw new Error(`Failed to fetch models: ${response.statusText}`);
47
+ }
48
+ const data = (await response.json());
49
+ return data.data;
50
+ }
51
+ /**
52
+ * OpenRouter model source implementation
53
+ */
54
+ export class OpenRouterModelSource {
55
+ name = 'openrouter';
56
+ config;
57
+ constructor(config = {}) {
58
+ this.config = config;
59
+ }
60
+ async fetchModels(config) {
61
+ const effectiveConfig = { ...this.config, ...config };
62
+ try {
63
+ // Fetch both models and ZDR models in parallel if ZDR is enabled
64
+ const [models, zdrModels] = await Promise.all([
65
+ fetchModels(effectiveConfig.apiKey),
66
+ effectiveConfig.includeZDR !== false ? fetchZDRModels(effectiveConfig.apiKey) : Promise.resolve(new Set()),
67
+ ]);
68
+ // Convert models and update ZDR support
69
+ return models.map((model) => convertOpenRouterModel(model, zdrModels));
70
+ }
71
+ catch (error) {
72
+ console.error('Failed to fetch models from OpenRouter:', error);
73
+ throw error;
74
+ }
75
+ }
76
+ }
77
+ //# sourceMappingURL=source.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"source.js","sourceRoot":"","sources":["../src/source.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,178 @@
1
+ import OpenAI from "openai";
2
+ /**
3
+ * OpenRouter modalities
4
+ */
5
+ export type OpenRouterModality = 'text->text' | 'text+image->text' | 'text+image->text+image';
6
+ /**
7
+ * OpenRouter input modalities
8
+ */
9
+ export type OpenRouterInput = 'audio' | 'file' | 'image' | 'text';
10
+ /**
11
+ * OpenRouter output modalities
12
+ */
13
+ export type OpenRouterOutput = 'image' | 'text';
14
+ /**
15
+ * OpenRouter tokenizer types
16
+ */
17
+ export type OpenRouterTokenize = 'Other' | 'GPT' | 'Mistral' | 'Llama3' | 'Qwen3' | 'Qwen' | 'Gemini' | 'DeepSeek' | 'Claude' | 'Grok' | 'Llama4' | 'Llama2' | 'Cohere' | 'Nova' | 'Router';
18
+ /**
19
+ * OpenRouter supported parameters
20
+ */
21
+ export type OpenRouterSupportedParameter = 'max_tokens' | 'temperature' | 'top_p' | 'stop' | 'seed' | 'presence_penalty' | 'frequency_penalty' | 'response_format' | 'top_k' | 'tools' | 'structured_outputs' | 'tool_choice' | 'repetition_penalty' | 'reasoning' | 'include_reasoning' | 'min_p' | 'logit_bias' | 'logprobs' | 'top_a' | 'top_logprobs' | 'web_search_options';
22
+ /**
23
+ * OpenRouter model response from API
24
+ */
25
+ export interface OpenRouterModel {
26
+ id: string;
27
+ canonical_slug: string;
28
+ hugging_face_id: string;
29
+ name: string;
30
+ created: number;
31
+ description?: string;
32
+ context_length: number;
33
+ architecture: {
34
+ modality: string;
35
+ input_modalities: OpenRouterInput[];
36
+ output_modalities: OpenRouterOutput[];
37
+ tokenizer: OpenRouterTokenize;
38
+ instruct_type: string | null;
39
+ };
40
+ pricing: {
41
+ prompt: string;
42
+ completion: string;
43
+ image?: string;
44
+ request?: string;
45
+ web_search?: string;
46
+ internal_reasoning?: string;
47
+ input_cache_read?: string;
48
+ input_cache_write?: string;
49
+ };
50
+ top_provider: {
51
+ context_length: number;
52
+ max_completion_tokens: number | null;
53
+ is_moderated: boolean;
54
+ };
55
+ supported_parameters: OpenRouterSupportedParameter[];
56
+ default_parameters: {
57
+ frequency_penalty: number;
58
+ temperature: number;
59
+ top_p: number;
60
+ };
61
+ }
62
+ /**
63
+ * ZDR model info from OpenRouter ZDR endpoint
64
+ */
65
+ export interface ZDRModel {
66
+ name: string;
67
+ model_name: string;
68
+ context_length: number;
69
+ pricing: {
70
+ prompt?: string;
71
+ completion?: string;
72
+ request?: string;
73
+ image?: string;
74
+ };
75
+ provider_name: string;
76
+ tag: string;
77
+ quantization: string | null;
78
+ max_completion_tokens: number | null;
79
+ max_prompt_tokens: number | null;
80
+ supported_parameters: OpenRouterSupportedParameter[];
81
+ status: number;
82
+ uptime_last_30m: number | null;
83
+ supports_implicit_caching: boolean;
84
+ }
85
+ /**
86
+ * OpenRouter chat request with extensions
87
+ */
88
+ export type OpenRouterChatRequest = OpenAI.Chat.ChatCompletionCreateParams & {
89
+ reasoning?: {
90
+ enabled: boolean;
91
+ effort?: 'low' | 'medium' | 'high';
92
+ max_tokens?: number;
93
+ };
94
+ provider?: {
95
+ order?: string[];
96
+ allow_fallbacks?: boolean;
97
+ require_parameters?: boolean;
98
+ data_collection?: 'deny' | 'allow';
99
+ zdr?: boolean;
100
+ only?: string[];
101
+ ignore?: string[];
102
+ quantizations?: ('int4' | 'int8' | 'fp4' | 'fp6' | 'fp8' | 'fp16' | 'bf16' | 'fp32' | 'unknown')[];
103
+ sort?: 'price' | 'throughput' | 'latency';
104
+ max_price?: {
105
+ prompt?: number;
106
+ completion?: number;
107
+ image?: number;
108
+ };
109
+ };
110
+ transforms?: string[];
111
+ user?: string;
112
+ models?: string[];
113
+ };
114
+ /**
115
+ * OpenRouter's extended usage information
116
+ */
117
+ export type OpenRouterUsage = OpenAI.CompletionUsage & {
118
+ completion_tokens?: number;
119
+ completion_tokens_details?: {
120
+ reasoning_tokens?: number;
121
+ };
122
+ cost?: number;
123
+ cost_details?: {
124
+ upstream_inference_cost?: number;
125
+ };
126
+ prompt_tokens?: number;
127
+ prompt_tokens_details?: {
128
+ cached_tokens?: number;
129
+ audio_tokens?: number;
130
+ };
131
+ total_tokens?: number;
132
+ };
133
+ /**
134
+ * OpenRouter reasoning information
135
+ */
136
+ export type OpenRouterReasoning = {
137
+ reasoning?: string;
138
+ reasoning_details?: OpenRouterReasoningDetails[];
139
+ };
140
+ /**
141
+ * OpenRouter reasoning detail
142
+ */
143
+ export type OpenRouterReasoningDetails = {
144
+ id?: string | null;
145
+ type: 'reasoning.encrypted' | 'reasoning.summary' | 'reasoning.text';
146
+ format: 'unknown' | 'openai-responses-v1' | 'xai-responses-v1' | 'anthropic-claude-v1';
147
+ index?: number;
148
+ summary?: string;
149
+ text?: string;
150
+ encrypted?: string;
151
+ signature?: string;
152
+ data?: string;
153
+ };
154
+ /**
155
+ * OpenRouter chunk with extended usage info
156
+ */
157
+ export type OpenRouterChatChunk = OpenAI.Chat.Completions.ChatCompletionChunk & OpenRouterReasoning & {
158
+ usage?: OpenRouterUsage | null;
159
+ };
160
+ /**
161
+ * OpenRouter response with extended usage info
162
+ */
163
+ export type OpenRouterChatResponse = OpenAI.Chat.ChatCompletion & {
164
+ choices: OpenRouterChoice[];
165
+ usage?: OpenRouterUsage;
166
+ };
167
+ /**
168
+ * OpenRouter message with reasoning info
169
+ */
170
+ export type OpenRouterMessage = OpenAI.Chat.Completions.ChatCompletionMessage & OpenRouterReasoning;
171
+ /**
172
+ * OpenRouter choice with reasoning info
173
+ */
174
+ export type OpenRouterChoice = OpenAI.ChatCompletion.Choice & {
175
+ native_finish_reason?: string;
176
+ message: OpenRouterMessage;
177
+ };
178
+ //# sourceMappingURL=types.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"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"}
package/dist/types.js ADDED
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=types.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.js","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":""}