@aituber-onair/chat 0.2.0 → 0.3.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 (65) hide show
  1. package/README.ja.md +21 -2
  2. package/README.md +22 -3
  3. package/dist/cjs/constants/index.d.ts +1 -0
  4. package/dist/cjs/constants/index.d.ts.map +1 -1
  5. package/dist/cjs/constants/index.js +1 -0
  6. package/dist/cjs/constants/index.js.map +1 -1
  7. package/dist/cjs/constants/openrouter.d.ts +21 -0
  8. package/dist/cjs/constants/openrouter.d.ts.map +1 -0
  9. package/dist/cjs/constants/openrouter.js +34 -0
  10. package/dist/cjs/constants/openrouter.js.map +1 -0
  11. package/dist/cjs/index.d.ts +2 -0
  12. package/dist/cjs/index.d.ts.map +1 -1
  13. package/dist/cjs/index.js +6 -1
  14. package/dist/cjs/index.js.map +1 -1
  15. package/dist/cjs/services/ChatServiceFactory.d.ts.map +1 -1
  16. package/dist/cjs/services/ChatServiceFactory.js +3 -0
  17. package/dist/cjs/services/ChatServiceFactory.js.map +1 -1
  18. package/dist/cjs/services/providers/ChatServiceProvider.d.ts +5 -1
  19. package/dist/cjs/services/providers/ChatServiceProvider.d.ts.map +1 -1
  20. package/dist/cjs/services/providers/openai/OpenAIChatService.d.ts.map +1 -1
  21. package/dist/cjs/services/providers/openai/OpenAIChatService.js +25 -7
  22. package/dist/cjs/services/providers/openai/OpenAIChatService.js.map +1 -1
  23. package/dist/cjs/services/providers/openai/OpenAIChatServiceProvider.d.ts.map +1 -1
  24. package/dist/cjs/services/providers/openai/OpenAIChatServiceProvider.js +8 -15
  25. package/dist/cjs/services/providers/openai/OpenAIChatServiceProvider.js.map +1 -1
  26. package/dist/cjs/services/providers/openrouter/OpenRouterChatService.d.ts +108 -0
  27. package/dist/cjs/services/providers/openrouter/OpenRouterChatService.d.ts.map +1 -0
  28. package/dist/cjs/services/providers/openrouter/OpenRouterChatService.js +397 -0
  29. package/dist/cjs/services/providers/openrouter/OpenRouterChatService.js.map +1 -0
  30. package/dist/cjs/services/providers/openrouter/OpenRouterChatServiceProvider.d.ts +53 -0
  31. package/dist/cjs/services/providers/openrouter/OpenRouterChatServiceProvider.d.ts.map +1 -0
  32. package/dist/cjs/services/providers/openrouter/OpenRouterChatServiceProvider.js +89 -0
  33. package/dist/cjs/services/providers/openrouter/OpenRouterChatServiceProvider.js.map +1 -0
  34. package/dist/esm/constants/index.d.ts +1 -0
  35. package/dist/esm/constants/index.d.ts.map +1 -1
  36. package/dist/esm/constants/index.js +1 -0
  37. package/dist/esm/constants/index.js.map +1 -1
  38. package/dist/esm/constants/openrouter.d.ts +21 -0
  39. package/dist/esm/constants/openrouter.d.ts.map +1 -0
  40. package/dist/esm/constants/openrouter.js +29 -0
  41. package/dist/esm/constants/openrouter.js.map +1 -0
  42. package/dist/esm/index.d.ts +2 -0
  43. package/dist/esm/index.d.ts.map +1 -1
  44. package/dist/esm/index.js +3 -0
  45. package/dist/esm/index.js.map +1 -1
  46. package/dist/esm/services/ChatServiceFactory.d.ts.map +1 -1
  47. package/dist/esm/services/ChatServiceFactory.js +3 -0
  48. package/dist/esm/services/ChatServiceFactory.js.map +1 -1
  49. package/dist/esm/services/providers/ChatServiceProvider.d.ts +5 -1
  50. package/dist/esm/services/providers/ChatServiceProvider.d.ts.map +1 -1
  51. package/dist/esm/services/providers/openai/OpenAIChatService.d.ts.map +1 -1
  52. package/dist/esm/services/providers/openai/OpenAIChatService.js +25 -7
  53. package/dist/esm/services/providers/openai/OpenAIChatService.js.map +1 -1
  54. package/dist/esm/services/providers/openai/OpenAIChatServiceProvider.d.ts.map +1 -1
  55. package/dist/esm/services/providers/openai/OpenAIChatServiceProvider.js +8 -15
  56. package/dist/esm/services/providers/openai/OpenAIChatServiceProvider.js.map +1 -1
  57. package/dist/esm/services/providers/openrouter/OpenRouterChatService.d.ts +108 -0
  58. package/dist/esm/services/providers/openrouter/OpenRouterChatService.d.ts.map +1 -0
  59. package/dist/esm/services/providers/openrouter/OpenRouterChatService.js +393 -0
  60. package/dist/esm/services/providers/openrouter/OpenRouterChatService.js.map +1 -0
  61. package/dist/esm/services/providers/openrouter/OpenRouterChatServiceProvider.d.ts +53 -0
  62. package/dist/esm/services/providers/openrouter/OpenRouterChatServiceProvider.d.ts.map +1 -0
  63. package/dist/esm/services/providers/openrouter/OpenRouterChatServiceProvider.js +85 -0
  64. package/dist/esm/services/providers/openrouter/OpenRouterChatServiceProvider.js.map +1 -0
  65. package/package.json +1 -1
@@ -0,0 +1,393 @@
1
+ import { ENDPOINT_OPENROUTER_API, MODEL_GPT_OSS_20B_FREE, isOpenRouterVisionModel, isOpenRouterFreeModel, OPENROUTER_FREE_RATE_LIMIT_PER_MINUTE, } from '../../../constants/openrouter';
2
+ import { getMaxTokensForResponseLength, } from '../../../constants/chat';
3
+ import { StreamTextAccumulator } from '../../../utils/streamTextAccumulator';
4
+ import { ChatServiceHttpClient } from '../../../utils/chatServiceHttpClient';
5
+ /**
6
+ * OpenRouter implementation of ChatService
7
+ * OpenRouter provides access to multiple AI models through a unified API
8
+ */
9
+ export class OpenRouterChatService {
10
+ /**
11
+ * Constructor
12
+ * @param apiKey OpenRouter API key
13
+ * @param model Name of the model to use
14
+ * @param visionModel Name of the vision model
15
+ * @param tools Tool definitions (optional)
16
+ * @param endpoint API endpoint (optional)
17
+ * @param responseLength Response length configuration (optional)
18
+ * @param appName Application name for OpenRouter analytics (optional)
19
+ * @param appUrl Application URL for OpenRouter analytics (optional)
20
+ * @param reasoning_effort Reasoning effort level (optional)
21
+ * @param includeReasoning Whether to include reasoning in response (optional)
22
+ * @param reasoningMaxTokens Maximum tokens for reasoning (optional)
23
+ */
24
+ constructor(apiKey, model = MODEL_GPT_OSS_20B_FREE, visionModel = MODEL_GPT_OSS_20B_FREE, tools, endpoint = ENDPOINT_OPENROUTER_API, responseLength, appName, appUrl, reasoning_effort, includeReasoning, reasoningMaxTokens) {
25
+ /** Provider name */
26
+ this.provider = 'openrouter';
27
+ this.lastRequestTime = 0;
28
+ this.requestCount = 0;
29
+ this.apiKey = apiKey;
30
+ this.model = model;
31
+ this.tools = tools || [];
32
+ this.endpoint = endpoint;
33
+ this.responseLength = responseLength;
34
+ this.appName = appName;
35
+ this.appUrl = appUrl;
36
+ this.reasoning_effort = reasoning_effort;
37
+ this.includeReasoning = includeReasoning;
38
+ this.reasoningMaxTokens = reasoningMaxTokens;
39
+ // Store vision model without validation at construction time
40
+ // Validation will be performed when vision methods are actually called
41
+ this.visionModel = visionModel;
42
+ }
43
+ /**
44
+ * Get the current model name
45
+ * @returns Model name
46
+ */
47
+ getModel() {
48
+ return this.model;
49
+ }
50
+ /**
51
+ * Get the current vision model name
52
+ * @returns Vision model name
53
+ */
54
+ getVisionModel() {
55
+ return this.visionModel;
56
+ }
57
+ /**
58
+ * Apply rate limiting for free tier models
59
+ */
60
+ async applyRateLimiting() {
61
+ if (!isOpenRouterFreeModel(this.model)) {
62
+ return;
63
+ }
64
+ const now = Date.now();
65
+ const timeSinceLastRequest = now - this.lastRequestTime;
66
+ // Reset counter if more than a minute has passed
67
+ if (timeSinceLastRequest > 60000) {
68
+ this.requestCount = 0;
69
+ }
70
+ // If we've hit the rate limit, wait
71
+ if (this.requestCount >= OPENROUTER_FREE_RATE_LIMIT_PER_MINUTE) {
72
+ const waitTime = 60000 - timeSinceLastRequest;
73
+ if (waitTime > 0) {
74
+ console.log(`Rate limit reached for free tier. Waiting ${waitTime}ms...`);
75
+ await new Promise((resolve) => setTimeout(resolve, waitTime));
76
+ this.requestCount = 0;
77
+ }
78
+ }
79
+ this.lastRequestTime = now;
80
+ this.requestCount++;
81
+ }
82
+ /**
83
+ * Process chat messages
84
+ * @param messages Array of messages to send
85
+ * @param onPartialResponse Callback to receive each part of streaming response
86
+ * @param onCompleteResponse Callback to execute when response is complete
87
+ */
88
+ async processChat(messages, onPartialResponse, onCompleteResponse) {
89
+ // Apply rate limiting for free tier
90
+ await this.applyRateLimiting();
91
+ // Not using tools
92
+ if (this.tools.length === 0) {
93
+ const res = await this.callOpenRouter(messages, this.model, true);
94
+ const full = await this.handleStream(res, onPartialResponse);
95
+ await onCompleteResponse(full);
96
+ return;
97
+ }
98
+ // Using tools
99
+ const { blocks, stop_reason } = await this.chatOnce(messages);
100
+ if (stop_reason === 'end') {
101
+ const full = blocks
102
+ .filter((b) => b.type === 'text')
103
+ .map((b) => b.text)
104
+ .join('');
105
+ await onCompleteResponse(full);
106
+ return;
107
+ }
108
+ throw new Error('processChat received tool_calls. ' +
109
+ 'ChatProcessor must use chatOnce() loop when tools are enabled.');
110
+ }
111
+ /**
112
+ * Process chat messages with images
113
+ * @param messages Array of messages to send (including images)
114
+ * @param onPartialResponse Callback to receive each part of streaming response
115
+ * @param onCompleteResponse Callback to execute when response is complete
116
+ */
117
+ async processVisionChat(messages, onPartialResponse, onCompleteResponse) {
118
+ // Always validate vision capabilities when vision methods are called
119
+ if (!isOpenRouterVisionModel(this.visionModel)) {
120
+ throw new Error(`Model ${this.visionModel} does not support vision capabilities.`);
121
+ }
122
+ // Apply rate limiting for free tier
123
+ await this.applyRateLimiting();
124
+ try {
125
+ // Not using tools
126
+ if (this.tools.length === 0) {
127
+ const res = await this.callOpenRouter(messages, this.visionModel, true);
128
+ const full = await this.handleStream(res, onPartialResponse);
129
+ await onCompleteResponse(full);
130
+ return;
131
+ }
132
+ // Using tools
133
+ const { blocks, stop_reason } = await this.visionChatOnce(messages, true, onPartialResponse);
134
+ if (stop_reason === 'end') {
135
+ const full = blocks
136
+ .filter((b) => b.type === 'text')
137
+ .map((b) => b.text)
138
+ .join('');
139
+ await onCompleteResponse(full);
140
+ return;
141
+ }
142
+ throw new Error('processVisionChat received tool_calls. ' +
143
+ 'ChatProcessor must use visionChatOnce() loop when tools are enabled.');
144
+ }
145
+ catch (error) {
146
+ console.error('Error in processVisionChat:', error);
147
+ throw error;
148
+ }
149
+ }
150
+ /**
151
+ * Process chat messages with tools (text only)
152
+ * @param messages Array of messages to send
153
+ * @param stream Whether to use streaming
154
+ * @param onPartialResponse Callback for partial responses
155
+ * @param maxTokens Maximum tokens for response (optional)
156
+ * @returns Tool chat completion
157
+ */
158
+ async chatOnce(messages, stream = true, onPartialResponse = () => { }, maxTokens) {
159
+ await this.applyRateLimiting();
160
+ const res = await this.callOpenRouter(messages, this.model, stream, maxTokens);
161
+ return stream
162
+ ? this.parseStream(res, onPartialResponse)
163
+ : this.parseOneShot(await res.json());
164
+ }
165
+ /**
166
+ * Process vision chat messages with tools
167
+ * @param messages Array of messages to send (including images)
168
+ * @param stream Whether to use streaming
169
+ * @param onPartialResponse Callback for partial responses
170
+ * @param maxTokens Maximum tokens for response (optional)
171
+ * @returns Tool chat completion
172
+ */
173
+ async visionChatOnce(messages, stream = false, onPartialResponse = () => { }, maxTokens) {
174
+ // Always validate vision capabilities when vision methods are called
175
+ if (!isOpenRouterVisionModel(this.visionModel)) {
176
+ throw new Error(`Model ${this.visionModel} does not support vision capabilities.`);
177
+ }
178
+ await this.applyRateLimiting();
179
+ const res = await this.callOpenRouter(messages, this.visionModel, stream, maxTokens);
180
+ return stream
181
+ ? this.parseStream(res, onPartialResponse)
182
+ : this.parseOneShot(await res.json());
183
+ }
184
+ /**
185
+ * Call OpenRouter API
186
+ */
187
+ async callOpenRouter(messages, model, stream = false, maxTokens) {
188
+ const body = this.buildRequestBody(messages, model, stream, maxTokens);
189
+ // Build headers
190
+ const headers = {
191
+ Authorization: `Bearer ${this.apiKey}`,
192
+ };
193
+ // Add optional analytics headers
194
+ if (this.appUrl) {
195
+ headers['HTTP-Referer'] = this.appUrl;
196
+ }
197
+ if (this.appName) {
198
+ headers['X-Title'] = this.appName;
199
+ }
200
+ const res = await ChatServiceHttpClient.post(this.endpoint, body, headers);
201
+ return res;
202
+ }
203
+ /**
204
+ * Build request body for OpenRouter API (OpenAI-compatible format)
205
+ */
206
+ buildRequestBody(messages, model, stream, maxTokens) {
207
+ const body = {
208
+ model,
209
+ messages,
210
+ stream,
211
+ };
212
+ // Add max_tokens if specified
213
+ const tokenLimit = maxTokens !== undefined
214
+ ? maxTokens
215
+ : getMaxTokensForResponseLength(this.responseLength);
216
+ // OpenRouter gpt-oss-20b model has known issues with token limits causing empty responses
217
+ // Remove all token limits to ensure proper functionality
218
+ if (tokenLimit) {
219
+ console.warn(`OpenRouter: Token limits are not supported for gpt-oss-20b model due to known issues. Using unlimited tokens instead.`);
220
+ // Do not set max_tokens - use unlimited tokens
221
+ }
222
+ // Add OpenRouter reasoning control
223
+ if (this.reasoning_effort ||
224
+ this.includeReasoning !== undefined ||
225
+ this.reasoningMaxTokens) {
226
+ body.reasoning = {};
227
+ if (this.reasoning_effort) {
228
+ // OpenRouter uses 'low' as the minimum effort level, map 'minimal' to 'low'
229
+ const effort = this.reasoning_effort === 'minimal' ? 'low' : this.reasoning_effort;
230
+ body.reasoning.effort = effort;
231
+ }
232
+ // Default to exclude reasoning if includeReasoning is not explicitly set to true
233
+ if (this.includeReasoning !== true) {
234
+ body.reasoning.exclude = true;
235
+ }
236
+ if (this.reasoningMaxTokens) {
237
+ body.reasoning.max_tokens = this.reasoningMaxTokens;
238
+ }
239
+ }
240
+ else {
241
+ // Default behavior: exclude reasoning to avoid empty responses
242
+ body.reasoning = { exclude: true };
243
+ }
244
+ // Add tools if available
245
+ if (this.tools.length > 0) {
246
+ body.tools = this.tools.map((t) => ({
247
+ type: 'function',
248
+ function: {
249
+ name: t.name,
250
+ description: t.description,
251
+ parameters: t.parameters,
252
+ },
253
+ }));
254
+ body.tool_choice = 'auto';
255
+ }
256
+ return body;
257
+ }
258
+ /**
259
+ * Handle streaming response from OpenRouter
260
+ * OpenRouter uses SSE format with potential comment lines
261
+ */
262
+ async handleStream(res, onPartial) {
263
+ const reader = res.body.getReader();
264
+ const dec = new TextDecoder();
265
+ let buffer = '';
266
+ let full = '';
267
+ while (true) {
268
+ const { done, value } = await reader.read();
269
+ if (done)
270
+ break;
271
+ buffer += dec.decode(value, { stream: true });
272
+ // Process line by line
273
+ const lines = buffer.split('\n');
274
+ buffer = lines.pop() || ''; // Keep incomplete line
275
+ for (const line of lines) {
276
+ const trimmedLine = line.trim();
277
+ // Skip empty lines and comment lines (OpenRouter specific)
278
+ if (!trimmedLine || trimmedLine.startsWith(':'))
279
+ continue;
280
+ if (!trimmedLine.startsWith('data:'))
281
+ continue;
282
+ const jsonStr = trimmedLine.slice(5).trim();
283
+ if (jsonStr === '[DONE]') {
284
+ return full;
285
+ }
286
+ try {
287
+ const json = JSON.parse(jsonStr);
288
+ const content = json.choices?.[0]?.delta?.content || '';
289
+ if (content) {
290
+ onPartial(content);
291
+ full += content;
292
+ }
293
+ }
294
+ catch (e) {
295
+ // Skip invalid JSON (could be partial or malformed)
296
+ console.debug('Failed to parse SSE data:', jsonStr);
297
+ }
298
+ }
299
+ }
300
+ return full;
301
+ }
302
+ /**
303
+ * Parse streaming response with tool support
304
+ */
305
+ async parseStream(res, onPartial) {
306
+ const reader = res.body.getReader();
307
+ const dec = new TextDecoder();
308
+ const textBlocks = [];
309
+ const toolCallsMap = new Map();
310
+ let buf = '';
311
+ while (true) {
312
+ const { done, value } = await reader.read();
313
+ if (done)
314
+ break;
315
+ buf += dec.decode(value, { stream: true });
316
+ // Process line by line
317
+ const lines = buf.split('\n');
318
+ buf = lines.pop() || ''; // Keep incomplete line
319
+ for (const line of lines) {
320
+ const trimmedLine = line.trim();
321
+ // Skip empty lines and OpenRouter comment lines
322
+ if (!trimmedLine || trimmedLine.startsWith(':'))
323
+ continue;
324
+ if (!trimmedLine.startsWith('data:'))
325
+ continue;
326
+ const payload = trimmedLine.slice(5).trim();
327
+ if (payload === '[DONE]') {
328
+ break;
329
+ }
330
+ try {
331
+ const json = JSON.parse(payload);
332
+ const delta = json.choices?.[0]?.delta;
333
+ if (delta?.content) {
334
+ onPartial(delta.content);
335
+ StreamTextAccumulator.append(textBlocks, delta.content);
336
+ }
337
+ // Handle tool calls
338
+ if (delta?.tool_calls) {
339
+ delta.tool_calls.forEach((c) => {
340
+ const entry = toolCallsMap.get(c.index) ?? {
341
+ id: c.id,
342
+ name: c.function?.name,
343
+ args: '',
344
+ };
345
+ entry.args += c.function?.arguments || '';
346
+ toolCallsMap.set(c.index, entry);
347
+ });
348
+ }
349
+ }
350
+ catch (e) {
351
+ console.debug('Failed to parse SSE data:', payload);
352
+ }
353
+ }
354
+ }
355
+ // Convert tool_calls to blocks
356
+ const toolBlocks = Array.from(toolCallsMap.entries())
357
+ .sort((a, b) => a[0] - b[0])
358
+ .map(([_, e]) => ({
359
+ type: 'tool_use',
360
+ id: e.id,
361
+ name: e.name,
362
+ input: JSON.parse(e.args || '{}'),
363
+ }));
364
+ const blocks = [...textBlocks, ...toolBlocks];
365
+ return {
366
+ blocks,
367
+ stop_reason: toolBlocks.length ? 'tool_use' : 'end',
368
+ };
369
+ }
370
+ /**
371
+ * Parse non-streaming response
372
+ */
373
+ parseOneShot(data) {
374
+ const choice = data.choices?.[0];
375
+ const blocks = [];
376
+ if (choice?.finish_reason === 'tool_calls' && choice?.message?.tool_calls) {
377
+ choice.message.tool_calls.forEach((c) => blocks.push({
378
+ type: 'tool_use',
379
+ id: c.id,
380
+ name: c.function?.name,
381
+ input: JSON.parse(c.function?.arguments || '{}'),
382
+ }));
383
+ }
384
+ else if (choice?.message?.content) {
385
+ blocks.push({ type: 'text', text: choice.message.content });
386
+ }
387
+ return {
388
+ blocks,
389
+ stop_reason: choice?.finish_reason === 'tool_calls' ? 'tool_use' : 'end',
390
+ };
391
+ }
392
+ }
393
+ //# sourceMappingURL=OpenRouterChatService.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"OpenRouterChatService.js","sourceRoot":"","sources":["../../../../../src/services/providers/openrouter/OpenRouterChatService.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,53 @@
1
+ import { ChatService } from '../../ChatService';
2
+ import { ChatServiceOptions, ChatServiceProvider } from '../ChatServiceProvider';
3
+ /**
4
+ * OpenRouter API provider implementation
5
+ * Provides access to multiple AI models through OpenRouter's unified API
6
+ */
7
+ export declare class OpenRouterChatServiceProvider implements ChatServiceProvider {
8
+ /**
9
+ * Create a chat service instance
10
+ * @param options Service options
11
+ * @returns OpenRouterChatService instance
12
+ */
13
+ createChatService(options: ChatServiceOptions): ChatService;
14
+ /**
15
+ * Get the provider name
16
+ * @returns Provider name ('openrouter')
17
+ */
18
+ getProviderName(): string;
19
+ /**
20
+ * Get the list of supported models
21
+ * Currently only supports gpt-oss-20b:free
22
+ * @returns Array of supported model names
23
+ */
24
+ getSupportedModels(): string[];
25
+ /**
26
+ * Get the default model
27
+ * @returns Default model name (gpt-oss-20b:free)
28
+ */
29
+ getDefaultModel(): string;
30
+ /**
31
+ * Check if this provider supports vision (image processing)
32
+ * @returns Vision support status (false - gpt-oss-20b does not support vision)
33
+ */
34
+ supportsVision(): boolean;
35
+ /**
36
+ * Check if a specific model supports vision capabilities
37
+ * @param model The model name to check
38
+ * @returns True if the model supports vision, false otherwise
39
+ */
40
+ supportsVisionForModel(model: string): boolean;
41
+ /**
42
+ * Get list of free tier models
43
+ * @returns Array of free model names
44
+ */
45
+ getFreeModels(): string[];
46
+ /**
47
+ * Check if a model is free tier
48
+ * @param model Model name to check
49
+ * @returns True if the model is free
50
+ */
51
+ isModelFree(model: string): boolean;
52
+ }
53
+ //# sourceMappingURL=OpenRouterChatServiceProvider.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"OpenRouterChatServiceProvider.d.ts","sourceRoot":"","sources":["../../../../../src/services/providers/openrouter/OpenRouterChatServiceProvider.ts"],"names":[],"mappings":"AAKA,OAAO,EAAE,WAAW,EAAE,MAAM,mBAAmB,CAAC;AAEhD,OAAO,EACL,kBAAkB,EAClB,mBAAmB,EACpB,MAAM,wBAAwB,CAAC;AAGhC;;;GAGG;AACH,qBAAa,6BAA8B,YAAW,mBAAmB;IACvE;;;;OAIG;IACH,iBAAiB,CAAC,OAAO,EAAE,kBAAkB,GAAG,WAAW;IAsC3D;;;OAGG;IACH,eAAe,IAAI,MAAM;IAIzB;;;;OAIG;IACH,kBAAkB,IAAI,MAAM,EAAE;IAO9B;;;OAGG;IACH,eAAe,IAAI,MAAM;IAIzB;;;OAGG;IACH,cAAc,IAAI,OAAO;IAIzB;;;;OAIG;IACH,sBAAsB,CAAC,KAAK,EAAE,MAAM,GAAG,OAAO;IAI9C;;;OAGG;IACH,aAAa,IAAI,MAAM,EAAE;IAIzB;;;;OAIG;IACH,WAAW,CAAC,KAAK,EAAE,MAAM,GAAG,OAAO;CAGpC"}
@@ -0,0 +1,85 @@
1
+ import { MODEL_GPT_OSS_20B_FREE, OPENROUTER_FREE_MODELS, isOpenRouterVisionModel, } from '../../../constants/openrouter';
2
+ import { OpenRouterChatService } from './OpenRouterChatService';
3
+ /**
4
+ * OpenRouter API provider implementation
5
+ * Provides access to multiple AI models through OpenRouter's unified API
6
+ */
7
+ export class OpenRouterChatServiceProvider {
8
+ /**
9
+ * Create a chat service instance
10
+ * @param options Service options
11
+ * @returns OpenRouterChatService instance
12
+ */
13
+ createChatService(options) {
14
+ // For OpenRouter, use the main model as vision model placeholder
15
+ // Only validate if visionModel is explicitly provided
16
+ const visionModel = options.visionModel || options.model || this.getDefaultModel();
17
+ // If visionModel is explicitly provided and different from main model, validate it
18
+ if (options.visionModel &&
19
+ !this.supportsVisionForModel(options.visionModel)) {
20
+ throw new Error(`Model ${options.visionModel} does not support vision capabilities.`);
21
+ }
22
+ // Tools definition
23
+ const tools = options.tools;
24
+ // Extract OpenRouter-specific options
25
+ const appName = options.appName;
26
+ const appUrl = options.appUrl;
27
+ return new OpenRouterChatService(options.apiKey, options.model || this.getDefaultModel(), visionModel, tools, options.endpoint, options.responseLength, appName, appUrl, options.reasoning_effort, options.includeReasoning, options.reasoningMaxTokens);
28
+ }
29
+ /**
30
+ * Get the provider name
31
+ * @returns Provider name ('openrouter')
32
+ */
33
+ getProviderName() {
34
+ return 'openrouter';
35
+ }
36
+ /**
37
+ * Get the list of supported models
38
+ * Currently only supports gpt-oss-20b:free
39
+ * @returns Array of supported model names
40
+ */
41
+ getSupportedModels() {
42
+ return [
43
+ // Free models
44
+ MODEL_GPT_OSS_20B_FREE,
45
+ ];
46
+ }
47
+ /**
48
+ * Get the default model
49
+ * @returns Default model name (gpt-oss-20b:free)
50
+ */
51
+ getDefaultModel() {
52
+ return MODEL_GPT_OSS_20B_FREE;
53
+ }
54
+ /**
55
+ * Check if this provider supports vision (image processing)
56
+ * @returns Vision support status (false - gpt-oss-20b does not support vision)
57
+ */
58
+ supportsVision() {
59
+ return false;
60
+ }
61
+ /**
62
+ * Check if a specific model supports vision capabilities
63
+ * @param model The model name to check
64
+ * @returns True if the model supports vision, false otherwise
65
+ */
66
+ supportsVisionForModel(model) {
67
+ return isOpenRouterVisionModel(model);
68
+ }
69
+ /**
70
+ * Get list of free tier models
71
+ * @returns Array of free model names
72
+ */
73
+ getFreeModels() {
74
+ return OPENROUTER_FREE_MODELS;
75
+ }
76
+ /**
77
+ * Check if a model is free tier
78
+ * @param model Model name to check
79
+ * @returns True if the model is free
80
+ */
81
+ isModelFree(model) {
82
+ return OPENROUTER_FREE_MODELS.includes(model) || model.endsWith(':free');
83
+ }
84
+ }
85
+ //# sourceMappingURL=OpenRouterChatServiceProvider.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"OpenRouterChatServiceProvider.js","sourceRoot":"","sources":["../../../../../src/services/providers/openrouter/OpenRouterChatServiceProvider.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,sBAAsB,EACtB,sBAAsB,EACtB,uBAAuB,GACxB,MAAM,+BAA+B,CAAC;AAEvC,OAAO,EAAE,qBAAqB,EAAE,MAAM,yBAAyB,CAAC;AAOhE;;;GAGG;AACH,MAAM,OAAO,6BAA6B;IACxC;;;;OAIG;IACH,iBAAiB,CAAC,OAA2B;QAC3C,iEAAiE;QACjE,sDAAsD;QACtD,MAAM,WAAW,GACf,OAAO,CAAC,WAAW,IAAI,OAAO,CAAC,KAAK,IAAI,IAAI,CAAC,eAAe,EAAE,CAAC;QAEjE,mFAAmF;QACnF,IACE,OAAO,CAAC,WAAW;YACnB,CAAC,IAAI,CAAC,sBAAsB,CAAC,OAAO,CAAC,WAAW,CAAC,EACjD,CAAC;YACD,MAAM,IAAI,KAAK,CACb,SAAS,OAAO,CAAC,WAAW,wCAAwC,CACrE,CAAC;QACJ,CAAC;QAED,mBAAmB;QACnB,MAAM,KAAK,GAAiC,OAAO,CAAC,KAAK,CAAC;QAE1D,sCAAsC;QACtC,MAAM,OAAO,GAAI,OAAe,CAAC,OAAO,CAAC;QACzC,MAAM,MAAM,GAAI,OAAe,CAAC,MAAM,CAAC;QAEvC,OAAO,IAAI,qBAAqB,CAC9B,OAAO,CAAC,MAAM,EACd,OAAO,CAAC,KAAK,IAAI,IAAI,CAAC,eAAe,EAAE,EACvC,WAAW,EACX,KAAK,EACL,OAAO,CAAC,QAAQ,EAChB,OAAO,CAAC,cAAc,EACtB,OAAO,EACP,MAAM,EACN,OAAO,CAAC,gBAAgB,EACxB,OAAO,CAAC,gBAAgB,EACvB,OAAe,CAAC,kBAAkB,CACpC,CAAC;IACJ,CAAC;IAED;;;OAGG;IACH,eAAe;QACb,OAAO,YAAY,CAAC;IACtB,CAAC;IAED;;;;OAIG;IACH,kBAAkB;QAChB,OAAO;YACL,cAAc;YACd,sBAAsB;SACvB,CAAC;IACJ,CAAC;IAED;;;OAGG;IACH,eAAe;QACb,OAAO,sBAAsB,CAAC;IAChC,CAAC;IAED;;;OAGG;IACH,cAAc;QACZ,OAAO,KAAK,CAAC;IACf,CAAC;IAED;;;;OAIG;IACH,sBAAsB,CAAC,KAAa;QAClC,OAAO,uBAAuB,CAAC,KAAK,CAAC,CAAC;IACxC,CAAC;IAED;;;OAGG;IACH,aAAa;QACX,OAAO,sBAAsB,CAAC;IAChC,CAAC;IAED;;;;OAIG;IACH,WAAW,CAAC,KAAa;QACvB,OAAO,sBAAsB,CAAC,QAAQ,CAAC,KAAK,CAAC,IAAI,KAAK,CAAC,QAAQ,CAAC,OAAO,CAAC,CAAC;IAC3E,CAAC;CACF"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@aituber-onair/chat",
3
- "version": "0.2.0",
3
+ "version": "0.3.0",
4
4
  "description": "Chat and LLM API integration library for AITuber OnAir",
5
5
  "main": "dist/cjs/index.js",
6
6
  "module": "dist/esm/index.js",