@aituber-onair/chat 0.2.1 → 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 (53) 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/openrouter/OpenRouterChatService.d.ts +108 -0
  21. package/dist/cjs/services/providers/openrouter/OpenRouterChatService.d.ts.map +1 -0
  22. package/dist/cjs/services/providers/openrouter/OpenRouterChatService.js +397 -0
  23. package/dist/cjs/services/providers/openrouter/OpenRouterChatService.js.map +1 -0
  24. package/dist/cjs/services/providers/openrouter/OpenRouterChatServiceProvider.d.ts +53 -0
  25. package/dist/cjs/services/providers/openrouter/OpenRouterChatServiceProvider.d.ts.map +1 -0
  26. package/dist/cjs/services/providers/openrouter/OpenRouterChatServiceProvider.js +89 -0
  27. package/dist/cjs/services/providers/openrouter/OpenRouterChatServiceProvider.js.map +1 -0
  28. package/dist/esm/constants/index.d.ts +1 -0
  29. package/dist/esm/constants/index.d.ts.map +1 -1
  30. package/dist/esm/constants/index.js +1 -0
  31. package/dist/esm/constants/index.js.map +1 -1
  32. package/dist/esm/constants/openrouter.d.ts +21 -0
  33. package/dist/esm/constants/openrouter.d.ts.map +1 -0
  34. package/dist/esm/constants/openrouter.js +29 -0
  35. package/dist/esm/constants/openrouter.js.map +1 -0
  36. package/dist/esm/index.d.ts +2 -0
  37. package/dist/esm/index.d.ts.map +1 -1
  38. package/dist/esm/index.js +3 -0
  39. package/dist/esm/index.js.map +1 -1
  40. package/dist/esm/services/ChatServiceFactory.d.ts.map +1 -1
  41. package/dist/esm/services/ChatServiceFactory.js +3 -0
  42. package/dist/esm/services/ChatServiceFactory.js.map +1 -1
  43. package/dist/esm/services/providers/ChatServiceProvider.d.ts +5 -1
  44. package/dist/esm/services/providers/ChatServiceProvider.d.ts.map +1 -1
  45. package/dist/esm/services/providers/openrouter/OpenRouterChatService.d.ts +108 -0
  46. package/dist/esm/services/providers/openrouter/OpenRouterChatService.d.ts.map +1 -0
  47. package/dist/esm/services/providers/openrouter/OpenRouterChatService.js +393 -0
  48. package/dist/esm/services/providers/openrouter/OpenRouterChatService.js.map +1 -0
  49. package/dist/esm/services/providers/openrouter/OpenRouterChatServiceProvider.d.ts +53 -0
  50. package/dist/esm/services/providers/openrouter/OpenRouterChatServiceProvider.d.ts.map +1 -0
  51. package/dist/esm/services/providers/openrouter/OpenRouterChatServiceProvider.js +85 -0
  52. package/dist/esm/services/providers/openrouter/OpenRouterChatServiceProvider.js.map +1 -0
  53. package/package.json +1 -1
@@ -12,6 +12,8 @@ export { GeminiChatService } from './services/providers/gemini/GeminiChatService
12
12
  export { GeminiChatServiceProvider } from './services/providers/gemini/GeminiChatServiceProvider';
13
13
  export { ClaudeChatService } from './services/providers/claude/ClaudeChatService';
14
14
  export { ClaudeChatServiceProvider } from './services/providers/claude/ClaudeChatServiceProvider';
15
+ export { OpenRouterChatService } from './services/providers/openrouter/OpenRouterChatService';
16
+ export { OpenRouterChatServiceProvider } from './services/providers/openrouter/OpenRouterChatServiceProvider';
15
17
  export * from './constants';
16
18
  export * from './utils';
17
19
  //# sourceMappingURL=index.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/index.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAGH,cAAc,SAAS,CAAC;AAGxB,YAAY,EAAE,WAAW,EAAE,MAAM,wBAAwB,CAAC;AAC1D,OAAO,EAAE,kBAAkB,EAAE,MAAM,+BAA+B,CAAC;AAGnE,YAAY,EACV,kBAAkB,EAClB,mBAAmB,GACpB,MAAM,0CAA0C,CAAC;AAGlD,OAAO,EAAE,iBAAiB,EAAE,MAAM,+CAA+C,CAAC;AAClF,OAAO,EAAE,yBAAyB,EAAE,MAAM,uDAAuD,CAAC;AAGlG,OAAO,EAAE,iBAAiB,EAAE,MAAM,+CAA+C,CAAC;AAClF,OAAO,EAAE,yBAAyB,EAAE,MAAM,uDAAuD,CAAC;AAGlG,OAAO,EAAE,iBAAiB,EAAE,MAAM,+CAA+C,CAAC;AAClF,OAAO,EAAE,yBAAyB,EAAE,MAAM,uDAAuD,CAAC;AAGlG,cAAc,aAAa,CAAC;AAG5B,cAAc,SAAS,CAAC"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/index.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAGH,cAAc,SAAS,CAAC;AAGxB,YAAY,EAAE,WAAW,EAAE,MAAM,wBAAwB,CAAC;AAC1D,OAAO,EAAE,kBAAkB,EAAE,MAAM,+BAA+B,CAAC;AAGnE,YAAY,EACV,kBAAkB,EAClB,mBAAmB,GACpB,MAAM,0CAA0C,CAAC;AAGlD,OAAO,EAAE,iBAAiB,EAAE,MAAM,+CAA+C,CAAC;AAClF,OAAO,EAAE,yBAAyB,EAAE,MAAM,uDAAuD,CAAC;AAGlG,OAAO,EAAE,iBAAiB,EAAE,MAAM,+CAA+C,CAAC;AAClF,OAAO,EAAE,yBAAyB,EAAE,MAAM,uDAAuD,CAAC;AAGlG,OAAO,EAAE,iBAAiB,EAAE,MAAM,+CAA+C,CAAC;AAClF,OAAO,EAAE,yBAAyB,EAAE,MAAM,uDAAuD,CAAC;AAGlG,OAAO,EAAE,qBAAqB,EAAE,MAAM,uDAAuD,CAAC;AAC9F,OAAO,EAAE,6BAA6B,EAAE,MAAM,+DAA+D,CAAC;AAG9G,cAAc,aAAa,CAAC;AAG5B,cAAc,SAAS,CAAC"}
package/dist/esm/index.js CHANGED
@@ -14,6 +14,9 @@ export { GeminiChatServiceProvider } from './services/providers/gemini/GeminiCha
14
14
  // Claude provider exports
15
15
  export { ClaudeChatService } from './services/providers/claude/ClaudeChatService';
16
16
  export { ClaudeChatServiceProvider } from './services/providers/claude/ClaudeChatServiceProvider';
17
+ // OpenRouter provider exports
18
+ export { OpenRouterChatService } from './services/providers/openrouter/OpenRouterChatService';
19
+ export { OpenRouterChatServiceProvider } from './services/providers/openrouter/OpenRouterChatServiceProvider';
17
20
  // Constants exports
18
21
  export * from './constants';
19
22
  // Utility exports
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/index.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,2BAA2B;AAC3B,cAAc,SAAS,CAAC;AAIxB,OAAO,EAAE,kBAAkB,EAAE,MAAM,+BAA+B,CAAC;AAQnE,0BAA0B;AAC1B,OAAO,EAAE,iBAAiB,EAAE,MAAM,+CAA+C,CAAC;AAClF,OAAO,EAAE,yBAAyB,EAAE,MAAM,uDAAuD,CAAC;AAElG,0BAA0B;AAC1B,OAAO,EAAE,iBAAiB,EAAE,MAAM,+CAA+C,CAAC;AAClF,OAAO,EAAE,yBAAyB,EAAE,MAAM,uDAAuD,CAAC;AAElG,0BAA0B;AAC1B,OAAO,EAAE,iBAAiB,EAAE,MAAM,+CAA+C,CAAC;AAClF,OAAO,EAAE,yBAAyB,EAAE,MAAM,uDAAuD,CAAC;AAElG,oBAAoB;AACpB,cAAc,aAAa,CAAC;AAE5B,kBAAkB;AAClB,cAAc,SAAS,CAAC"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/index.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,2BAA2B;AAC3B,cAAc,SAAS,CAAC;AAIxB,OAAO,EAAE,kBAAkB,EAAE,MAAM,+BAA+B,CAAC;AAQnE,0BAA0B;AAC1B,OAAO,EAAE,iBAAiB,EAAE,MAAM,+CAA+C,CAAC;AAClF,OAAO,EAAE,yBAAyB,EAAE,MAAM,uDAAuD,CAAC;AAElG,0BAA0B;AAC1B,OAAO,EAAE,iBAAiB,EAAE,MAAM,+CAA+C,CAAC;AAClF,OAAO,EAAE,yBAAyB,EAAE,MAAM,uDAAuD,CAAC;AAElG,0BAA0B;AAC1B,OAAO,EAAE,iBAAiB,EAAE,MAAM,+CAA+C,CAAC;AAClF,OAAO,EAAE,yBAAyB,EAAE,MAAM,uDAAuD,CAAC;AAElG,8BAA8B;AAC9B,OAAO,EAAE,qBAAqB,EAAE,MAAM,uDAAuD,CAAC;AAC9F,OAAO,EAAE,6BAA6B,EAAE,MAAM,+DAA+D,CAAC;AAE9G,oBAAoB;AACpB,cAAc,aAAa,CAAC;AAE5B,kBAAkB;AAClB,cAAc,SAAS,CAAC"}
@@ -1 +1 @@
1
- {"version":3,"file":"ChatServiceFactory.d.ts","sourceRoot":"","sources":["../../../src/services/ChatServiceFactory.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,WAAW,EAAE,MAAM,eAAe,CAAC;AAC5C,OAAO,EACL,kBAAkB,EAClB,mBAAmB,EACpB,MAAM,iCAAiC,CAAC;AAKzC;;;GAGG;AACH,qBAAa,kBAAkB;IAC7B,kCAAkC;IAClC,OAAO,CAAC,MAAM,CAAC,SAAS,CAA+C;IAEvE;;;OAGG;IACH,MAAM,CAAC,gBAAgB,CAAC,QAAQ,EAAE,mBAAmB,GAAG,IAAI;IAI5D;;;;;OAKG;IACH,MAAM,CAAC,iBAAiB,CACtB,YAAY,EAAE,MAAM,EACpB,OAAO,EAAE,kBAAkB,GAC1B,WAAW;IAQd;;;OAGG;IACH,MAAM,CAAC,YAAY,IAAI,GAAG,CAAC,MAAM,EAAE,mBAAmB,CAAC;IAIvD;;;OAGG;IACH,MAAM,CAAC,qBAAqB,IAAI,MAAM,EAAE;IAIxC;;;;OAIG;IACH,MAAM,CAAC,kBAAkB,CAAC,YAAY,EAAE,MAAM,GAAG,MAAM,EAAE;CAI1D"}
1
+ {"version":3,"file":"ChatServiceFactory.d.ts","sourceRoot":"","sources":["../../../src/services/ChatServiceFactory.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,WAAW,EAAE,MAAM,eAAe,CAAC;AAC5C,OAAO,EACL,kBAAkB,EAClB,mBAAmB,EACpB,MAAM,iCAAiC,CAAC;AAMzC;;;GAGG;AACH,qBAAa,kBAAkB;IAC7B,kCAAkC;IAClC,OAAO,CAAC,MAAM,CAAC,SAAS,CAA+C;IAEvE;;;OAGG;IACH,MAAM,CAAC,gBAAgB,CAAC,QAAQ,EAAE,mBAAmB,GAAG,IAAI;IAI5D;;;;;OAKG;IACH,MAAM,CAAC,iBAAiB,CACtB,YAAY,EAAE,MAAM,EACpB,OAAO,EAAE,kBAAkB,GAC1B,WAAW;IAQd;;;OAGG;IACH,MAAM,CAAC,YAAY,IAAI,GAAG,CAAC,MAAM,EAAE,mBAAmB,CAAC;IAIvD;;;OAGG;IACH,MAAM,CAAC,qBAAqB,IAAI,MAAM,EAAE;IAIxC;;;;OAIG;IACH,MAAM,CAAC,kBAAkB,CAAC,YAAY,EAAE,MAAM,GAAG,MAAM,EAAE;CAI1D"}
@@ -1,6 +1,7 @@
1
1
  import { OpenAIChatServiceProvider } from './providers/openai/OpenAIChatServiceProvider';
2
2
  import { GeminiChatServiceProvider } from './providers/gemini/GeminiChatServiceProvider';
3
3
  import { ClaudeChatServiceProvider } from './providers/claude/ClaudeChatServiceProvider';
4
+ import { OpenRouterChatServiceProvider } from './providers/openrouter/OpenRouterChatServiceProvider';
4
5
  /**
5
6
  * Chat service factory
6
7
  * Manages and creates various AI providers
@@ -58,4 +59,6 @@ ChatServiceFactory.registerProvider(new OpenAIChatServiceProvider());
58
59
  ChatServiceFactory.registerProvider(new GeminiChatServiceProvider());
59
60
  // Register Claude as a provider
60
61
  ChatServiceFactory.registerProvider(new ClaudeChatServiceProvider());
62
+ // Register OpenRouter as a provider
63
+ ChatServiceFactory.registerProvider(new OpenRouterChatServiceProvider());
61
64
  //# sourceMappingURL=ChatServiceFactory.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"ChatServiceFactory.js","sourceRoot":"","sources":["../../../src/services/ChatServiceFactory.ts"],"names":[],"mappings":"AAKA,OAAO,EAAE,yBAAyB,EAAE,MAAM,8CAA8C,CAAC;AACzF,OAAO,EAAE,yBAAyB,EAAE,MAAM,8CAA8C,CAAC;AACzF,OAAO,EAAE,yBAAyB,EAAE,MAAM,8CAA8C,CAAC;AAEzF;;;GAGG;AACH,MAAM,OAAO,kBAAkB;IAI7B;;;OAGG;IACH,MAAM,CAAC,gBAAgB,CAAC,QAA6B;QACnD,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,QAAQ,CAAC,eAAe,EAAE,EAAE,QAAQ,CAAC,CAAC;IAC3D,CAAC;IAED;;;;;OAKG;IACH,MAAM,CAAC,iBAAiB,CACtB,YAAoB,EACpB,OAA2B;QAE3B,MAAM,QAAQ,GAAG,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,YAAY,CAAC,CAAC;QAClD,IAAI,CAAC,QAAQ,EAAE,CAAC;YACd,MAAM,IAAI,KAAK,CAAC,0BAA0B,YAAY,EAAE,CAAC,CAAC;QAC5D,CAAC;QACD,OAAO,QAAQ,CAAC,iBAAiB,CAAC,OAAO,CAAC,CAAC;IAC7C,CAAC;IAED;;;OAGG;IACH,MAAM,CAAC,YAAY;QACjB,OAAO,IAAI,CAAC,SAAS,CAAC;IACxB,CAAC;IAED;;;OAGG;IACH,MAAM,CAAC,qBAAqB;QAC1B,OAAO,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,SAAS,CAAC,IAAI,EAAE,CAAC,CAAC;IAC3C,CAAC;IAED;;;;OAIG;IACH,MAAM,CAAC,kBAAkB,CAAC,YAAoB;QAC5C,MAAM,QAAQ,GAAG,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,YAAY,CAAC,CAAC;QAClD,OAAO,QAAQ,CAAC,CAAC,CAAC,QAAQ,CAAC,kBAAkB,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;IACvD,CAAC;;AApDD,kCAAkC;AACnB,4BAAS,GAAqC,IAAI,GAAG,EAAE,CAAC;AAsDzE,gCAAgC;AAChC,kBAAkB,CAAC,gBAAgB,CAAC,IAAI,yBAAyB,EAAE,CAAC,CAAC;AACrE,gCAAgC;AAChC,kBAAkB,CAAC,gBAAgB,CAAC,IAAI,yBAAyB,EAAE,CAAC,CAAC;AACrE,gCAAgC;AAChC,kBAAkB,CAAC,gBAAgB,CAAC,IAAI,yBAAyB,EAAE,CAAC,CAAC"}
1
+ {"version":3,"file":"ChatServiceFactory.js","sourceRoot":"","sources":["../../../src/services/ChatServiceFactory.ts"],"names":[],"mappings":"AAKA,OAAO,EAAE,yBAAyB,EAAE,MAAM,8CAA8C,CAAC;AACzF,OAAO,EAAE,yBAAyB,EAAE,MAAM,8CAA8C,CAAC;AACzF,OAAO,EAAE,yBAAyB,EAAE,MAAM,8CAA8C,CAAC;AACzF,OAAO,EAAE,6BAA6B,EAAE,MAAM,sDAAsD,CAAC;AAErG;;;GAGG;AACH,MAAM,OAAO,kBAAkB;IAI7B;;;OAGG;IACH,MAAM,CAAC,gBAAgB,CAAC,QAA6B;QACnD,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,QAAQ,CAAC,eAAe,EAAE,EAAE,QAAQ,CAAC,CAAC;IAC3D,CAAC;IAED;;;;;OAKG;IACH,MAAM,CAAC,iBAAiB,CACtB,YAAoB,EACpB,OAA2B;QAE3B,MAAM,QAAQ,GAAG,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,YAAY,CAAC,CAAC;QAClD,IAAI,CAAC,QAAQ,EAAE,CAAC;YACd,MAAM,IAAI,KAAK,CAAC,0BAA0B,YAAY,EAAE,CAAC,CAAC;QAC5D,CAAC;QACD,OAAO,QAAQ,CAAC,iBAAiB,CAAC,OAAO,CAAC,CAAC;IAC7C,CAAC;IAED;;;OAGG;IACH,MAAM,CAAC,YAAY;QACjB,OAAO,IAAI,CAAC,SAAS,CAAC;IACxB,CAAC;IAED;;;OAGG;IACH,MAAM,CAAC,qBAAqB;QAC1B,OAAO,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,SAAS,CAAC,IAAI,EAAE,CAAC,CAAC;IAC3C,CAAC;IAED;;;;OAIG;IACH,MAAM,CAAC,kBAAkB,CAAC,YAAoB;QAC5C,MAAM,QAAQ,GAAG,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,YAAY,CAAC,CAAC;QAClD,OAAO,QAAQ,CAAC,CAAC,CAAC,QAAQ,CAAC,kBAAkB,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;IACvD,CAAC;;AApDD,kCAAkC;AACnB,4BAAS,GAAqC,IAAI,GAAG,EAAE,CAAC;AAsDzE,gCAAgC;AAChC,kBAAkB,CAAC,gBAAgB,CAAC,IAAI,yBAAyB,EAAE,CAAC,CAAC;AACrE,gCAAgC;AAChC,kBAAkB,CAAC,gBAAgB,CAAC,IAAI,yBAAyB,EAAE,CAAC,CAAC;AACrE,gCAAgC;AAChC,kBAAkB,CAAC,gBAAgB,CAAC,IAAI,yBAAyB,EAAE,CAAC,CAAC;AACrE,oCAAoC;AACpC,kBAAkB,CAAC,gBAAgB,CAAC,IAAI,6BAA6B,EAAE,CAAC,CAAC"}
@@ -16,7 +16,7 @@ export interface ChatServiceOptions {
16
16
  responseLength?: ChatResponseLength;
17
17
  /** Verbosity level for GPT-5 models (OpenAI only) */
18
18
  verbosity?: 'low' | 'medium' | 'high';
19
- /** Reasoning effort level for GPT-5 models (OpenAI only) */
19
+ /** Reasoning effort level for GPT-5 models (OpenAI) and gpt-oss models (OpenRouter) */
20
20
  reasoning_effort?: 'minimal' | 'low' | 'medium' | 'high';
21
21
  /** GPT-5 usage preset (OpenAI only) - overrides individual reasoning/verbosity settings */
22
22
  gpt5Preset?: GPT5PresetKey;
@@ -24,6 +24,10 @@ export interface ChatServiceOptions {
24
24
  gpt5EndpointPreference?: 'chat' | 'responses' | 'auto';
25
25
  /** Enable reasoning summary for GPT-5 models (OpenAI only) - requires organization verification */
26
26
  enableReasoningSummary?: boolean;
27
+ /** Include reasoning in response (OpenRouter only) - default false to avoid empty responses */
28
+ includeReasoning?: boolean;
29
+ /** Maximum tokens allocated for reasoning (OpenRouter only) */
30
+ reasoningMaxTokens?: number;
27
31
  /** Additional provider-specific options */
28
32
  [key: string]: any;
29
33
  }
@@ -1 +1 @@
1
- {"version":3,"file":"ChatServiceProvider.d.ts","sourceRoot":"","sources":["../../../../src/services/providers/ChatServiceProvider.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,WAAW,EAAE,MAAM,gBAAgB,CAAC;AAC7C,OAAO,EAAE,kBAAkB,EAAE,aAAa,EAAE,MAAM,sBAAsB,CAAC;AAEzE;;GAEG;AACH,MAAM,WAAW,kBAAkB;IACjC,cAAc;IACd,MAAM,EAAE,MAAM,CAAC;IACf,iBAAiB;IACjB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,+CAA+C;IAC/C,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,sEAAsE;IACtE,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,8BAA8B;IAC9B,cAAc,CAAC,EAAE,kBAAkB,CAAC;IACpC,qDAAqD;IACrD,SAAS,CAAC,EAAE,KAAK,GAAG,QAAQ,GAAG,MAAM,CAAC;IACtC,4DAA4D;IAC5D,gBAAgB,CAAC,EAAE,SAAS,GAAG,KAAK,GAAG,QAAQ,GAAG,MAAM,CAAC;IACzD,2FAA2F;IAC3F,UAAU,CAAC,EAAE,aAAa,CAAC;IAC3B,+IAA+I;IAC/I,sBAAsB,CAAC,EAAE,MAAM,GAAG,WAAW,GAAG,MAAM,CAAC;IACvD,mGAAmG;IACnG,sBAAsB,CAAC,EAAE,OAAO,CAAC;IACjC,2CAA2C;IAC3C,CAAC,GAAG,EAAE,MAAM,GAAG,GAAG,CAAC;CACpB;AAED;;;GAGG;AACH,MAAM,WAAW,mBAAmB;IAClC;;;;OAIG;IACH,iBAAiB,CAAC,OAAO,EAAE,kBAAkB,GAAG,WAAW,CAAC;IAE5D;;;OAGG;IACH,eAAe,IAAI,MAAM,CAAC;IAE1B;;;OAGG;IACH,kBAAkB,IAAI,MAAM,EAAE,CAAC;IAE/B;;;OAGG;IACH,eAAe,IAAI,MAAM,CAAC;IAE1B;;;OAGG;IACH,cAAc,IAAI,OAAO,CAAC;CAC3B"}
1
+ {"version":3,"file":"ChatServiceProvider.d.ts","sourceRoot":"","sources":["../../../../src/services/providers/ChatServiceProvider.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,WAAW,EAAE,MAAM,gBAAgB,CAAC;AAC7C,OAAO,EAAE,kBAAkB,EAAE,aAAa,EAAE,MAAM,sBAAsB,CAAC;AAEzE;;GAEG;AACH,MAAM,WAAW,kBAAkB;IACjC,cAAc;IACd,MAAM,EAAE,MAAM,CAAC;IACf,iBAAiB;IACjB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,+CAA+C;IAC/C,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,sEAAsE;IACtE,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,8BAA8B;IAC9B,cAAc,CAAC,EAAE,kBAAkB,CAAC;IACpC,qDAAqD;IACrD,SAAS,CAAC,EAAE,KAAK,GAAG,QAAQ,GAAG,MAAM,CAAC;IACtC,uFAAuF;IACvF,gBAAgB,CAAC,EAAE,SAAS,GAAG,KAAK,GAAG,QAAQ,GAAG,MAAM,CAAC;IACzD,2FAA2F;IAC3F,UAAU,CAAC,EAAE,aAAa,CAAC;IAC3B,+IAA+I;IAC/I,sBAAsB,CAAC,EAAE,MAAM,GAAG,WAAW,GAAG,MAAM,CAAC;IACvD,mGAAmG;IACnG,sBAAsB,CAAC,EAAE,OAAO,CAAC;IACjC,+FAA+F;IAC/F,gBAAgB,CAAC,EAAE,OAAO,CAAC;IAC3B,+DAA+D;IAC/D,kBAAkB,CAAC,EAAE,MAAM,CAAC;IAC5B,2CAA2C;IAC3C,CAAC,GAAG,EAAE,MAAM,GAAG,GAAG,CAAC;CACpB;AAED;;;GAGG;AACH,MAAM,WAAW,mBAAmB;IAClC;;;;OAIG;IACH,iBAAiB,CAAC,OAAO,EAAE,kBAAkB,GAAG,WAAW,CAAC;IAE5D;;;OAGG;IACH,eAAe,IAAI,MAAM,CAAC;IAE1B;;;OAGG;IACH,kBAAkB,IAAI,MAAM,EAAE,CAAC;IAE/B;;;OAGG;IACH,eAAe,IAAI,MAAM,CAAC;IAE1B;;;OAGG;IACH,cAAc,IAAI,OAAO,CAAC;CAC3B"}
@@ -0,0 +1,108 @@
1
+ import { ChatService } from '../../ChatService';
2
+ import { Message, MessageWithVision } from '../../../types';
3
+ import { ToolDefinition, ToolChatCompletion } from '../../../types';
4
+ import { ChatResponseLength } from '../../../constants/chat';
5
+ /**
6
+ * OpenRouter implementation of ChatService
7
+ * OpenRouter provides access to multiple AI models through a unified API
8
+ */
9
+ export declare class OpenRouterChatService implements ChatService {
10
+ /** Provider name */
11
+ readonly provider: string;
12
+ private apiKey;
13
+ private model;
14
+ private visionModel;
15
+ private tools;
16
+ private endpoint;
17
+ private responseLength?;
18
+ private appName?;
19
+ private appUrl?;
20
+ private reasoning_effort?;
21
+ private includeReasoning?;
22
+ private reasoningMaxTokens?;
23
+ private lastRequestTime;
24
+ private requestCount;
25
+ /**
26
+ * Constructor
27
+ * @param apiKey OpenRouter API key
28
+ * @param model Name of the model to use
29
+ * @param visionModel Name of the vision model
30
+ * @param tools Tool definitions (optional)
31
+ * @param endpoint API endpoint (optional)
32
+ * @param responseLength Response length configuration (optional)
33
+ * @param appName Application name for OpenRouter analytics (optional)
34
+ * @param appUrl Application URL for OpenRouter analytics (optional)
35
+ * @param reasoning_effort Reasoning effort level (optional)
36
+ * @param includeReasoning Whether to include reasoning in response (optional)
37
+ * @param reasoningMaxTokens Maximum tokens for reasoning (optional)
38
+ */
39
+ constructor(apiKey: string, model?: string, visionModel?: string, tools?: ToolDefinition[], endpoint?: string, responseLength?: ChatResponseLength, appName?: string, appUrl?: string, reasoning_effort?: 'minimal' | 'low' | 'medium' | 'high', includeReasoning?: boolean, reasoningMaxTokens?: number);
40
+ /**
41
+ * Get the current model name
42
+ * @returns Model name
43
+ */
44
+ getModel(): string;
45
+ /**
46
+ * Get the current vision model name
47
+ * @returns Vision model name
48
+ */
49
+ getVisionModel(): string;
50
+ /**
51
+ * Apply rate limiting for free tier models
52
+ */
53
+ private applyRateLimiting;
54
+ /**
55
+ * Process chat messages
56
+ * @param messages Array of messages to send
57
+ * @param onPartialResponse Callback to receive each part of streaming response
58
+ * @param onCompleteResponse Callback to execute when response is complete
59
+ */
60
+ processChat(messages: Message[], onPartialResponse: (text: string) => void, onCompleteResponse: (text: string) => Promise<void>): Promise<void>;
61
+ /**
62
+ * Process chat messages with images
63
+ * @param messages Array of messages to send (including images)
64
+ * @param onPartialResponse Callback to receive each part of streaming response
65
+ * @param onCompleteResponse Callback to execute when response is complete
66
+ */
67
+ processVisionChat(messages: MessageWithVision[], onPartialResponse: (text: string) => void, onCompleteResponse: (text: string) => Promise<void>): Promise<void>;
68
+ /**
69
+ * Process chat messages with tools (text only)
70
+ * @param messages Array of messages to send
71
+ * @param stream Whether to use streaming
72
+ * @param onPartialResponse Callback for partial responses
73
+ * @param maxTokens Maximum tokens for response (optional)
74
+ * @returns Tool chat completion
75
+ */
76
+ chatOnce(messages: Message[], stream?: boolean, onPartialResponse?: (text: string) => void, maxTokens?: number): Promise<ToolChatCompletion>;
77
+ /**
78
+ * Process vision chat messages with tools
79
+ * @param messages Array of messages to send (including images)
80
+ * @param stream Whether to use streaming
81
+ * @param onPartialResponse Callback for partial responses
82
+ * @param maxTokens Maximum tokens for response (optional)
83
+ * @returns Tool chat completion
84
+ */
85
+ visionChatOnce(messages: MessageWithVision[], stream?: boolean, onPartialResponse?: (text: string) => void, maxTokens?: number): Promise<ToolChatCompletion>;
86
+ /**
87
+ * Call OpenRouter API
88
+ */
89
+ private callOpenRouter;
90
+ /**
91
+ * Build request body for OpenRouter API (OpenAI-compatible format)
92
+ */
93
+ private buildRequestBody;
94
+ /**
95
+ * Handle streaming response from OpenRouter
96
+ * OpenRouter uses SSE format with potential comment lines
97
+ */
98
+ private handleStream;
99
+ /**
100
+ * Parse streaming response with tool support
101
+ */
102
+ private parseStream;
103
+ /**
104
+ * Parse non-streaming response
105
+ */
106
+ private parseOneShot;
107
+ }
108
+ //# sourceMappingURL=OpenRouterChatService.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"OpenRouterChatService.d.ts","sourceRoot":"","sources":["../../../../../src/services/providers/openrouter/OpenRouterChatService.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,WAAW,EAAE,MAAM,mBAAmB,CAAC;AAChD,OAAO,EAAE,OAAO,EAAE,iBAAiB,EAAE,MAAM,gBAAgB,CAAC;AAC5D,OAAO,EACL,cAAc,EAEd,kBAAkB,EACnB,MAAM,gBAAgB,CAAC;AAQxB,OAAO,EACL,kBAAkB,EAEnB,MAAM,yBAAyB,CAAC;AAIjC;;;GAGG;AACH,qBAAa,qBAAsB,YAAW,WAAW;IACvD,oBAAoB;IACpB,QAAQ,CAAC,QAAQ,EAAE,MAAM,CAAgB;IAEzC,OAAO,CAAC,MAAM,CAAS;IACvB,OAAO,CAAC,KAAK,CAAS;IACtB,OAAO,CAAC,WAAW,CAAS;IAC5B,OAAO,CAAC,KAAK,CAAmB;IAChC,OAAO,CAAC,QAAQ,CAAS;IACzB,OAAO,CAAC,cAAc,CAAC,CAAqB;IAC5C,OAAO,CAAC,OAAO,CAAC,CAAS;IACzB,OAAO,CAAC,MAAM,CAAC,CAAS;IACxB,OAAO,CAAC,gBAAgB,CAAC,CAAwC;IACjE,OAAO,CAAC,gBAAgB,CAAC,CAAU;IACnC,OAAO,CAAC,kBAAkB,CAAC,CAAS;IACpC,OAAO,CAAC,eAAe,CAAa;IACpC,OAAO,CAAC,YAAY,CAAa;IAEjC;;;;;;;;;;;;;OAaG;gBAED,MAAM,EAAE,MAAM,EACd,KAAK,GAAE,MAA+B,EACtC,WAAW,GAAE,MAA+B,EAC5C,KAAK,CAAC,EAAE,cAAc,EAAE,EACxB,QAAQ,GAAE,MAAgC,EAC1C,cAAc,CAAC,EAAE,kBAAkB,EACnC,OAAO,CAAC,EAAE,MAAM,EAChB,MAAM,CAAC,EAAE,MAAM,EACf,gBAAgB,CAAC,EAAE,SAAS,GAAG,KAAK,GAAG,QAAQ,GAAG,MAAM,EACxD,gBAAgB,CAAC,EAAE,OAAO,EAC1B,kBAAkB,CAAC,EAAE,MAAM;IAkB7B;;;OAGG;IACH,QAAQ,IAAI,MAAM;IAIlB;;;OAGG;IACH,cAAc,IAAI,MAAM;IAIxB;;OAEG;YACW,iBAAiB;IA6B/B;;;;;OAKG;IACG,WAAW,CACf,QAAQ,EAAE,OAAO,EAAE,EACnB,iBAAiB,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,IAAI,EACzC,kBAAkB,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,OAAO,CAAC,IAAI,CAAC,GAClD,OAAO,CAAC,IAAI,CAAC;IA8BhB;;;;;OAKG;IACG,iBAAiB,CACrB,QAAQ,EAAE,iBAAiB,EAAE,EAC7B,iBAAiB,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,IAAI,EACzC,kBAAkB,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,OAAO,CAAC,IAAI,CAAC,GAClD,OAAO,CAAC,IAAI,CAAC;IA8ChB;;;;;;;OAOG;IACG,QAAQ,CACZ,QAAQ,EAAE,OAAO,EAAE,EACnB,MAAM,UAAO,EACb,iBAAiB,GAAE,CAAC,IAAI,EAAE,MAAM,KAAK,IAAe,EACpD,SAAS,CAAC,EAAE,MAAM,GACjB,OAAO,CAAC,kBAAkB,CAAC;IAa9B;;;;;;;OAOG;IACG,cAAc,CAClB,QAAQ,EAAE,iBAAiB,EAAE,EAC7B,MAAM,GAAE,OAAe,EACvB,iBAAiB,GAAE,CAAC,IAAI,EAAE,MAAM,KAAK,IAAe,EACpD,SAAS,CAAC,EAAE,MAAM,GACjB,OAAO,CAAC,kBAAkB,CAAC;IAoB9B;;OAEG;YACW,cAAc;IA0B5B;;OAEG;IACH,OAAO,CAAC,gBAAgB;IAuExB;;;OAGG;YACW,YAAY;IAgD1B;;OAEG;YACW,WAAW;IA+EzB;;OAEG;IACH,OAAO,CAAC,YAAY;CAsBrB"}
@@ -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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"}