@aituber-onair/core 0.1.2 → 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 (61) hide show
  1. package/README.md +32 -3
  2. package/dist/constants/index.d.ts +8 -0
  3. package/dist/constants/index.js +20 -0
  4. package/dist/constants/index.js.map +1 -1
  5. package/dist/index.d.ts +2 -2
  6. package/dist/index.js +3 -2
  7. package/dist/index.js.map +1 -1
  8. package/dist/services/chat/ChatServiceFactory.js +4 -1
  9. package/dist/services/chat/ChatServiceFactory.js.map +1 -1
  10. package/dist/services/chat/ClaudeChatService.d.ts +64 -0
  11. package/dist/services/chat/ClaudeChatService.js +237 -0
  12. package/dist/services/chat/ClaudeChatService.js.map +1 -0
  13. package/dist/services/chat/GeminiChatService.d.ts +63 -0
  14. package/dist/services/chat/GeminiChatService.js +314 -0
  15. package/dist/services/chat/GeminiChatService.js.map +1 -0
  16. package/dist/services/chat/OpenAIChatService.d.ts +1 -0
  17. package/dist/services/chat/OpenAIChatService.js +6 -1
  18. package/dist/services/chat/OpenAIChatService.js.map +1 -1
  19. package/dist/services/chat/providers/ChatServiceProvider.d.ts +2 -0
  20. package/dist/services/chat/providers/ClaudeChatServiceProvider.d.ts +39 -0
  21. package/dist/services/chat/providers/ClaudeChatServiceProvider.js +57 -0
  22. package/dist/services/chat/providers/ClaudeChatServiceProvider.js.map +1 -0
  23. package/dist/services/chat/providers/GeminiChatServiceProvider.d.ts +39 -0
  24. package/dist/services/chat/providers/GeminiChatServiceProvider.js +57 -0
  25. package/dist/services/chat/providers/GeminiChatServiceProvider.js.map +1 -0
  26. package/dist/services/chat/providers/OpenAIChatServiceProvider.d.ts +6 -0
  27. package/dist/services/chat/providers/OpenAIChatServiceProvider.js +16 -3
  28. package/dist/services/chat/providers/OpenAIChatServiceProvider.js.map +1 -1
  29. package/dist/services/voice/VoiceEngineAdapter.d.ts +2 -2
  30. package/dist/services/voice/VoiceEngineAdapter.js.map +1 -1
  31. package/dist/services/voice/VoiceService.d.ts +3 -3
  32. package/dist/services/voice/engines/AivisSpeechEngine.d.ts +1 -1
  33. package/dist/services/voice/engines/NijiVoiceEngine.d.ts +1 -2
  34. package/dist/services/voice/engines/NijiVoiceEngine.js.map +1 -1
  35. package/dist/services/voice/engines/OpenAiEngine.d.ts +1 -1
  36. package/dist/services/voice/engines/VoiceEngine.d.ts +1 -2
  37. package/dist/services/voice/engines/VoiceEngineFactory.d.ts +2 -1
  38. package/dist/services/voice/engines/VoiceEngineFactory.js.map +1 -1
  39. package/dist/services/voice/engines/VoicePeakEngine.d.ts +1 -1
  40. package/dist/services/voice/engines/VoiceVoxEngine.d.ts +1 -1
  41. package/dist/services/voice/messages.d.ts +2 -37
  42. package/dist/services/voice/messages.js +1 -9
  43. package/dist/services/voice/messages.js.map +1 -1
  44. package/dist/types/chat.d.ts +54 -0
  45. package/dist/types/chat.js +5 -0
  46. package/dist/types/chat.js.map +1 -0
  47. package/dist/types/index.d.ts +10 -80
  48. package/dist/types/index.js +9 -1
  49. package/dist/types/index.js.map +1 -1
  50. package/dist/types/memory.d.ts +34 -0
  51. package/dist/types/memory.js +2 -0
  52. package/dist/types/memory.js.map +1 -0
  53. package/dist/types/voice.d.ts +35 -0
  54. package/dist/types/voice.js +13 -0
  55. package/dist/types/voice.js.map +1 -0
  56. package/dist/types/voiceEngine.d.ts +1 -0
  57. package/dist/types/voiceEngine.js +2 -0
  58. package/dist/types/voiceEngine.js.map +1 -0
  59. package/dist/utils/screenplay.d.ts +4 -4
  60. package/dist/utils/screenplay.js.map +1 -1
  61. package/package.json +1 -2
package/README.md CHANGED
@@ -355,13 +355,15 @@ aituber.updateVoiceService({
355
355
 
356
356
  ## AI Provider System
357
357
 
358
- AITuber OnAir Core uses an extensible provider system to accommodate various AI APIs. By default, it uses the OpenAI API, but other providers (Gemini, Claude, etc.) can be added.
358
+ AITuber OnAir Core adopts an extensible provider system, enabling integration with various AI APIs.
359
+ Currently, OpenAI API and Gemini API is available, but other API providers (such as Claude API, etc.) are planned to be added soon.
359
360
 
360
361
  ### Available Providers
361
362
 
362
363
  Currently, the following AI provider is built-in:
363
364
 
364
- - **OpenAI**: Supports models like GPT-4o, GPT-4o-mini, GPT-4 Turbo, etc.
365
+ - **OpenAI**: Supports models like GPT-4o, GPT-4o-mini, O3-mini.
366
+ - **Gemini**: Supports models like Gemini 2.0 Flash, Gemini 2.0 Flash-Lite, Gemini 1.5 Flash
365
367
 
366
368
  ### Specifying a Provider
367
369
 
@@ -371,11 +373,38 @@ You can specify the provider when instantiating `AITuberOnAirCore`:
371
373
  const aituberCore = new AITuberOnAirCore({
372
374
  chatProvider: 'openai', // Provider name
373
375
  apiKey: 'your-api-key',
374
- model: 'gpt-4o-mini', // Optional (if omitted, the default model is used)
376
+ model: 'gpt-4o-mini', // Optional (if omitted, the default model 'gpt-4o-mini' will be used)
375
377
  // Other options...
376
378
  });
377
379
  ```
378
380
 
381
+ ### Model-Specific Feature Limitations
382
+
383
+ Different AI models support different features. For example:
384
+
385
+ - **GPT-4o**, **GPT-4o-mini**: Support both text chat and image processing (Vision)
386
+ - **O3-mini**: Supports text chat only (does not support image processing)
387
+
388
+ When selecting a model, be aware of these limitations. Attempting to use unsupported features will result in an explicit error.
389
+
390
+ **Note**: If you don't specify a model, the default model used is 'gpt-4o-mini'. This model supports both text chat and image processing.
391
+
392
+ ### Using Different Models Together
393
+
394
+ If you want to use different models for text chat and image processing, you can use the `visionModel` option:
395
+
396
+ ```typescript
397
+ const aituberCore = new AITuberOnAirCore({
398
+ apiKey: 'your-api-key',
399
+ chatProvider: 'openai',
400
+ model: 'o3-mini', // For text chat
401
+ visionModel: 'gpt-4o', // For image processing
402
+ // Other options...
403
+ });
404
+ ```
405
+
406
+ This allows for optimizations such as using a lightweight model for text chat and a more powerful model only when image processing is needed.
407
+
379
408
  ### Retrieving Providers & Models
380
409
 
381
410
  You can programmatically retrieve available providers and their supported models:
@@ -7,7 +7,15 @@ export declare const VOICE_VOX_API_URL = "http://localhost:50021";
7
7
  export declare const VOICEPEAK_API_URL = "http://localhost:20202";
8
8
  export declare const AIVIS_SPEECH_API_URL = "http://localhost:10101";
9
9
  export declare const NIJI_VOICE_API_URL = "https://api.nijivoice.com/api/platform/v1";
10
+ export declare const ENDPOINT_GEMINI_API = "https://generativelanguage.googleapis.com/v1";
10
11
  export declare const MODEL_GPT_4O_MINI = "gpt-4o-mini";
12
+ export declare const MODEL_GPT_4O = "gpt-4o";
13
+ export declare const MODEL_O3_MINI = "o3-mini";
14
+ export declare const MODEL_GEMINI_2_0_FLASH = "gemini-2.0-flash";
15
+ export declare const MODEL_GEMINI_2_0_FLASH_LITE = "gemini-2.0-flash-lite";
16
+ export declare const MODEL_GEMINI_1_5_FLASH = "gemini-1.5-flash";
17
+ export declare const VISION_SUPPORTED_MODELS: string[];
18
+ export declare const GEMINI_VISION_SUPPORTED_MODELS: string[];
11
19
  export declare const CHAT_RESPONSE_LENGTH: {
12
20
  readonly VERY_SHORT: "veryShort";
13
21
  readonly SHORT: "short";
@@ -7,8 +7,28 @@ export const VOICE_VOX_API_URL = 'http://localhost:50021';
7
7
  export const VOICEPEAK_API_URL = 'http://localhost:20202';
8
8
  export const AIVIS_SPEECH_API_URL = 'http://localhost:10101';
9
9
  export const NIJI_VOICE_API_URL = 'https://api.nijivoice.com/api/platform/v1';
10
+ // API Endpoints
11
+ export const ENDPOINT_GEMINI_API = 'https://generativelanguage.googleapis.com/v1';
10
12
  // gpt model
11
13
  export const MODEL_GPT_4O_MINI = 'gpt-4o-mini';
14
+ export const MODEL_GPT_4O = 'gpt-4o';
15
+ export const MODEL_O3_MINI = 'o3-mini';
16
+ // gemini model
17
+ export const MODEL_GEMINI_2_0_FLASH = 'gemini-2.0-flash';
18
+ export const MODEL_GEMINI_2_0_FLASH_LITE = 'gemini-2.0-flash-lite';
19
+ export const MODEL_GEMINI_1_5_FLASH = 'gemini-1.5-flash';
20
+ // Vision support for models
21
+ export const VISION_SUPPORTED_MODELS = [
22
+ MODEL_GPT_4O_MINI,
23
+ MODEL_GPT_4O,
24
+ // MODEL_O3_MINI is not included as it doesn't support vision
25
+ ];
26
+ // Vision support for Gemini models
27
+ export const GEMINI_VISION_SUPPORTED_MODELS = [
28
+ MODEL_GEMINI_2_0_FLASH,
29
+ MODEL_GEMINI_2_0_FLASH_LITE,
30
+ MODEL_GEMINI_1_5_FLASH,
31
+ ];
12
32
  // chat response length
13
33
  export const CHAT_RESPONSE_LENGTH = {
14
34
  VERY_SHORT: 'veryShort',
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/constants/index.ts"],"names":[],"mappings":"AAAA;;GAEG;AACH,MAAM,CAAC,MAAM,oCAAoC,GAC/C,4CAA4C,CAAC;AAC/C,MAAM,CAAC,MAAM,oBAAoB,GAAG,2CAA2C,CAAC;AAChF,MAAM,CAAC,MAAM,iBAAiB,GAAG,wBAAwB,CAAC;AAC1D,MAAM,CAAC,MAAM,iBAAiB,GAAG,wBAAwB,CAAC;AAC1D,MAAM,CAAC,MAAM,oBAAoB,GAAG,wBAAwB,CAAC;AAC7D,MAAM,CAAC,MAAM,kBAAkB,GAAG,2CAA2C,CAAC;AAE9E,YAAY;AACZ,MAAM,CAAC,MAAM,iBAAiB,GAAG,aAAa,CAAC;AAE/C,uBAAuB;AACvB,MAAM,CAAC,MAAM,oBAAoB,GAAG;IAClC,UAAU,EAAE,WAAW;IACvB,KAAK,EAAE,OAAO;IACd,MAAM,EAAE,QAAQ;IAChB,IAAI,EAAE,MAAM;CACJ,CAAC;AAEX,MAAM,CAAC,MAAM,oBAAoB,GAAG;IAClC,CAAC,oBAAoB,CAAC,UAAU,CAAC,EAAE,EAAE;IACrC,CAAC,oBAAoB,CAAC,KAAK,CAAC,EAAE,GAAG;IACjC,CAAC,oBAAoB,CAAC,MAAM,CAAC,EAAE,GAAG;IAClC,CAAC,oBAAoB,CAAC,IAAI,CAAC,EAAE,GAAG;CACxB,CAAC"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/constants/index.ts"],"names":[],"mappings":"AAAA;;GAEG;AACH,MAAM,CAAC,MAAM,oCAAoC,GAC/C,4CAA4C,CAAC;AAC/C,MAAM,CAAC,MAAM,oBAAoB,GAAG,2CAA2C,CAAC;AAChF,MAAM,CAAC,MAAM,iBAAiB,GAAG,wBAAwB,CAAC;AAC1D,MAAM,CAAC,MAAM,iBAAiB,GAAG,wBAAwB,CAAC;AAC1D,MAAM,CAAC,MAAM,oBAAoB,GAAG,wBAAwB,CAAC;AAC7D,MAAM,CAAC,MAAM,kBAAkB,GAAG,2CAA2C,CAAC;AAE9E,gBAAgB;AAChB,MAAM,CAAC,MAAM,mBAAmB,GAAG,8CAA8C,CAAC;AAElF,YAAY;AACZ,MAAM,CAAC,MAAM,iBAAiB,GAAG,aAAa,CAAC;AAC/C,MAAM,CAAC,MAAM,YAAY,GAAG,QAAQ,CAAC;AACrC,MAAM,CAAC,MAAM,aAAa,GAAG,SAAS,CAAC;AAEvC,eAAe;AACf,MAAM,CAAC,MAAM,sBAAsB,GAAG,kBAAkB,CAAC;AACzD,MAAM,CAAC,MAAM,2BAA2B,GAAG,uBAAuB,CAAC;AACnE,MAAM,CAAC,MAAM,sBAAsB,GAAG,kBAAkB,CAAC;AAEzD,4BAA4B;AAC5B,MAAM,CAAC,MAAM,uBAAuB,GAAG;IACrC,iBAAiB;IACjB,YAAY;IACZ,6DAA6D;CAC9D,CAAC;AAEF,mCAAmC;AACnC,MAAM,CAAC,MAAM,8BAA8B,GAAG;IAC5C,sBAAsB;IACtB,2BAA2B;IAC3B,sBAAsB;CACvB,CAAC;AAEF,uBAAuB;AACvB,MAAM,CAAC,MAAM,oBAAoB,GAAG;IAClC,UAAU,EAAE,WAAW;IACvB,KAAK,EAAE,OAAO;IACd,MAAM,EAAE,QAAQ;IAChB,IAAI,EAAE,MAAM;CACJ,CAAC;AAEX,MAAM,CAAC,MAAM,oBAAoB,GAAG;IAClC,CAAC,oBAAoB,CAAC,UAAU,CAAC,EAAE,EAAE;IACrC,CAAC,oBAAoB,CAAC,KAAK,CAAC,EAAE,GAAG;IACjC,CAAC,oBAAoB,CAAC,MAAM,CAAC,EAAE,GAAG;IAClC,CAAC,oBAAoB,CAAC,IAAI,CAAC,EAAE,GAAG;CACxB,CAAC"}
package/dist/index.d.ts CHANGED
@@ -9,6 +9,7 @@ export { OpenAISummarizer } from './services/chat/OpenAISummarizer';
9
9
  export type { ChatServiceOptions, ChatServiceProvider, } from './services/chat/providers/ChatServiceProvider';
10
10
  export { ChatServiceFactory } from './services/chat/ChatServiceFactory';
11
11
  export { OpenAIChatServiceProvider } from './services/chat/providers/OpenAIChatServiceProvider';
12
+ export { GeminiChatServiceProvider } from './services/chat/providers/GeminiChatServiceProvider';
12
13
  export type { VoiceService, VoiceServiceOptions, AudioPlayOptions, } from './services/voice/VoiceService';
13
14
  export { VoiceEngineAdapter } from './services/voice/VoiceEngineAdapter';
14
15
  export { EventEmitter } from './core/EventEmitter';
@@ -18,7 +19,6 @@ export type { ChatProcessorOptions } from './core/ChatProcessor';
18
19
  export { ChatProcessor } from './core/ChatProcessor';
19
20
  export type { AITuberOnAirCoreOptions } from './core/AITuberOnAirCore';
20
21
  export { AITuberOnAirCore, AITuberOnAirCoreEvent, } from './core/AITuberOnAirCore';
22
+ export * from './constants';
21
23
  export * from './utils';
22
24
  export { createMemoryStorage } from './utils/storage';
23
- export * from './constants';
24
- export type { Screenplay } from './types';
package/dist/index.js CHANGED
@@ -8,15 +8,16 @@ export { OpenAIChatService } from './services/chat/OpenAIChatService';
8
8
  export { OpenAISummarizer } from './services/chat/OpenAISummarizer';
9
9
  export { ChatServiceFactory } from './services/chat/ChatServiceFactory';
10
10
  export { OpenAIChatServiceProvider } from './services/chat/providers/OpenAIChatServiceProvider';
11
+ export { GeminiChatServiceProvider } from './services/chat/providers/GeminiChatServiceProvider';
11
12
  export { VoiceEngineAdapter } from './services/voice/VoiceEngineAdapter';
12
13
  // Core module exports
13
14
  export { EventEmitter } from './core/EventEmitter';
14
15
  export { MemoryManager } from './core/MemoryManager';
15
16
  export { ChatProcessor } from './core/ChatProcessor';
16
17
  export { AITuberOnAirCore, AITuberOnAirCoreEvent, } from './core/AITuberOnAirCore';
18
+ // Constants exports
19
+ export * from './constants';
17
20
  // Utility exports
18
21
  export * from './utils';
19
22
  export { createMemoryStorage } from './utils/storage';
20
- // Constants exports
21
- export * from './constants';
22
23
  //# sourceMappingURL=index.js.map
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,2BAA2B;AAC3B,cAAc,SAAS,CAAC;AAIxB,OAAO,EAAE,iBAAiB,EAAE,MAAM,mCAAmC,CAAC;AACtE,OAAO,EAAE,gBAAgB,EAAE,MAAM,kCAAkC,CAAC;AAOpE,OAAO,EAAE,kBAAkB,EAAE,MAAM,oCAAoC,CAAC;AACxE,OAAO,EAAE,yBAAyB,EAAE,MAAM,qDAAqD,CAAC;AAQhG,OAAO,EAAE,kBAAkB,EAAE,MAAM,qCAAqC,CAAC;AAEzE,sBAAsB;AACtB,OAAO,EAAE,YAAY,EAAE,MAAM,qBAAqB,CAAC;AAEnD,OAAO,EAAE,aAAa,EAAE,MAAM,sBAAsB,CAAC;AAErD,OAAO,EAAE,aAAa,EAAE,MAAM,sBAAsB,CAAC;AAErD,OAAO,EACL,gBAAgB,EAChB,qBAAqB,GACtB,MAAM,yBAAyB,CAAC;AAEjC,kBAAkB;AAClB,cAAc,SAAS,CAAC;AACxB,OAAO,EAAE,mBAAmB,EAAE,MAAM,iBAAiB,CAAC;AAEtD,oBAAoB;AACpB,cAAc,aAAa,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,iBAAiB,EAAE,MAAM,mCAAmC,CAAC;AACtE,OAAO,EAAE,gBAAgB,EAAE,MAAM,kCAAkC,CAAC;AAOpE,OAAO,EAAE,kBAAkB,EAAE,MAAM,oCAAoC,CAAC;AACxE,OAAO,EAAE,yBAAyB,EAAE,MAAM,qDAAqD,CAAC;AAChG,OAAO,EAAE,yBAAyB,EAAE,MAAM,qDAAqD,CAAC;AAQhG,OAAO,EAAE,kBAAkB,EAAE,MAAM,qCAAqC,CAAC;AAEzE,sBAAsB;AACtB,OAAO,EAAE,YAAY,EAAE,MAAM,qBAAqB,CAAC;AAEnD,OAAO,EAAE,aAAa,EAAE,MAAM,sBAAsB,CAAC;AAErD,OAAO,EAAE,aAAa,EAAE,MAAM,sBAAsB,CAAC;AAErD,OAAO,EACL,gBAAgB,EAChB,qBAAqB,GACtB,MAAM,yBAAyB,CAAC;AAEjC,oBAAoB;AACpB,cAAc,aAAa,CAAC;AAE5B,kBAAkB;AAClB,cAAc,SAAS,CAAC;AACxB,OAAO,EAAE,mBAAmB,EAAE,MAAM,iBAAiB,CAAC"}
@@ -1,4 +1,5 @@
1
1
  import { OpenAIChatServiceProvider } from './providers/OpenAIChatServiceProvider';
2
+ import { GeminiChatServiceProvider } from './providers/GeminiChatServiceProvider';
2
3
  /**
3
4
  * Chat service factory
4
5
  * Manages and creates various AI providers
@@ -50,6 +51,8 @@ export class ChatServiceFactory {
50
51
  }
51
52
  /** Map of registered providers */
52
53
  ChatServiceFactory.providers = new Map();
53
- // Register OpenAI as the default provider
54
+ // Register OpenAI as a provider
54
55
  ChatServiceFactory.registerProvider(new OpenAIChatServiceProvider());
56
+ // Register Gemini as a provider
57
+ ChatServiceFactory.registerProvider(new GeminiChatServiceProvider());
55
58
  //# sourceMappingURL=ChatServiceFactory.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"ChatServiceFactory.js","sourceRoot":"","sources":["../../../src/services/chat/ChatServiceFactory.ts"],"names":[],"mappings":"AAKA,OAAO,EAAE,yBAAyB,EAAE,MAAM,uCAAuC,CAAC;AAElF;;;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,0CAA0C;AAC1C,kBAAkB,CAAC,gBAAgB,CAAC,IAAI,yBAAyB,EAAE,CAAC,CAAC"}
1
+ {"version":3,"file":"ChatServiceFactory.js","sourceRoot":"","sources":["../../../src/services/chat/ChatServiceFactory.ts"],"names":[],"mappings":"AAKA,OAAO,EAAE,yBAAyB,EAAE,MAAM,uCAAuC,CAAC;AAClF,OAAO,EAAE,yBAAyB,EAAE,MAAM,uCAAuC,CAAC;AAElF;;;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"}
@@ -0,0 +1,64 @@
1
+ import { ChatService } from './ChatService';
2
+ import { Message, MessageWithVision } from '../../types';
3
+ /**
4
+ * Claude implementation of ChatService
5
+ */
6
+ export declare class ClaudeChatService implements ChatService {
7
+ private apiKey;
8
+ private model;
9
+ private visionModel;
10
+ private anthropic;
11
+ /** Provider name */
12
+ readonly provider: string;
13
+ /**
14
+ * Constructor
15
+ * @param apiKey Anthropic API key
16
+ * @param model Name of the model to use
17
+ * @param visionModel Name of the vision model
18
+ */
19
+ constructor(apiKey: string, model?: string, visionModel?: string);
20
+ /**
21
+ * Get the current model name
22
+ * @returns Model name
23
+ */
24
+ getModel(): string;
25
+ /**
26
+ * Process chat messages
27
+ * @param messages Array of messages to send
28
+ * @param onPartialResponse Callback to receive each part of streaming response
29
+ * @param onCompleteResponse Callback to execute when response is complete
30
+ */
31
+ processChat(messages: Message[], onPartialResponse: (text: string) => void, onCompleteResponse: (text: string) => Promise<void>): Promise<void>;
32
+ /**
33
+ * Process chat messages with images
34
+ * @param messages Array of messages to send (including images)
35
+ * @param onPartialResponse Callback to receive each part of streaming response
36
+ * @param onCompleteResponse Callback to execute when response is complete
37
+ * @throws Error if the selected model doesn't support vision
38
+ */
39
+ processVisionChat(messages: MessageWithVision[], onPartialResponse: (text: string) => void, onCompleteResponse: (text: string) => Promise<void>): Promise<void>;
40
+ /**
41
+ * Convert AITuber OnAir messages to Claude format
42
+ * @param messages Array of messages
43
+ * @returns Claude formatted messages
44
+ */
45
+ private convertMessagesToClaudeFormat;
46
+ /**
47
+ * Convert AITuber OnAir vision messages to Claude format
48
+ * @param messages Array of vision messages
49
+ * @returns Claude formatted vision messages
50
+ */
51
+ private convertVisionMessagesToClaudeFormat;
52
+ /**
53
+ * Map AITuber OnAir roles to Claude roles
54
+ * @param role AITuber OnAir role
55
+ * @returns Claude role
56
+ */
57
+ private mapRoleToClaude;
58
+ /**
59
+ * Get MIME type from URL
60
+ * @param url Image URL
61
+ * @returns MIME type
62
+ */
63
+ private getMimeTypeFromUrl;
64
+ }
@@ -0,0 +1,237 @@
1
+ import { MODEL_CLAUDE_3_HAIKU, CLAUDE_VISION_SUPPORTED_MODELS } from '../../constants';
2
+ import { Anthropic } from '@anthropic-ai/sdk';
3
+ /**
4
+ * Claude implementation of ChatService
5
+ */
6
+ export class ClaudeChatService {
7
+ /**
8
+ * Constructor
9
+ * @param apiKey Anthropic API key
10
+ * @param model Name of the model to use
11
+ * @param visionModel Name of the vision model
12
+ */
13
+ constructor(apiKey, model = MODEL_CLAUDE_3_HAIKU, visionModel = MODEL_CLAUDE_3_HAIKU) {
14
+ /** Provider name */
15
+ this.provider = 'claude';
16
+ this.apiKey = apiKey;
17
+ this.model = model || MODEL_CLAUDE_3_HAIKU;
18
+ this.visionModel = visionModel || MODEL_CLAUDE_3_HAIKU;
19
+ this.anthropic = new Anthropic({
20
+ apiKey: this.apiKey,
21
+ dangerouslyAllowBrowser: true // CORSエラーを回避するための設定
22
+ });
23
+ }
24
+ /**
25
+ * Get the current model name
26
+ * @returns Model name
27
+ */
28
+ getModel() {
29
+ return this.model;
30
+ }
31
+ /**
32
+ * Process chat messages
33
+ * @param messages Array of messages to send
34
+ * @param onPartialResponse Callback to receive each part of streaming response
35
+ * @param onCompleteResponse Callback to execute when response is complete
36
+ */
37
+ async processChat(messages, onPartialResponse, onCompleteResponse) {
38
+ try {
39
+ // Extract system message (if any) and regular messages
40
+ const systemMessage = messages.find(msg => msg.role === 'system');
41
+ const nonSystemMessages = messages.filter(msg => msg.role !== 'system');
42
+ // Convert messages to Claude format
43
+ const claudeMessages = this.convertMessagesToClaudeFormat(nonSystemMessages);
44
+ // Create message stream using Anthropic SDK
45
+ const stream = await this.anthropic.messages.create({
46
+ model: this.model,
47
+ messages: claudeMessages,
48
+ system: systemMessage?.content || '',
49
+ stream: true,
50
+ max_tokens: 1000,
51
+ });
52
+ let fullText = '';
53
+ // Process streaming response
54
+ for await (const chunk of stream) {
55
+ if (chunk.type === 'content_block_delta' && chunk.delta && 'text' in chunk.delta) {
56
+ const deltaText = chunk.delta.text || '';
57
+ if (deltaText) {
58
+ fullText += deltaText;
59
+ onPartialResponse(deltaText);
60
+ }
61
+ }
62
+ }
63
+ // Complete response callback
64
+ await onCompleteResponse(fullText);
65
+ }
66
+ catch (error) {
67
+ console.error('Error in processChat:', error);
68
+ throw error;
69
+ }
70
+ }
71
+ /**
72
+ * Process chat messages with images
73
+ * @param messages Array of messages to send (including images)
74
+ * @param onPartialResponse Callback to receive each part of streaming response
75
+ * @param onCompleteResponse Callback to execute when response is complete
76
+ * @throws Error if the selected model doesn't support vision
77
+ */
78
+ async processVisionChat(messages, onPartialResponse, onCompleteResponse) {
79
+ try {
80
+ // Check if the vision model supports vision capabilities
81
+ if (!CLAUDE_VISION_SUPPORTED_MODELS.includes(this.visionModel)) {
82
+ throw new Error(`Model ${this.visionModel} does not support vision capabilities.`);
83
+ }
84
+ // Extract system message (if any) and regular messages
85
+ const systemMessage = messages.find(msg => msg.role === 'system');
86
+ const nonSystemMessages = messages.filter(msg => msg.role !== 'system');
87
+ // Convert messages to Claude vision format
88
+ const claudeMessages = this.convertVisionMessagesToClaudeFormat(nonSystemMessages);
89
+ // Create message stream using Anthropic SDK
90
+ const stream = await this.anthropic.messages.create({
91
+ model: this.visionModel,
92
+ messages: claudeMessages,
93
+ // @ts-ignore
94
+ system: systemMessage?.content || '',
95
+ stream: true,
96
+ max_tokens: 1000,
97
+ });
98
+ let fullText = '';
99
+ // Process streaming response
100
+ for await (const chunk of stream) {
101
+ if (chunk.type === 'content_block_delta' && chunk.delta && 'text' in chunk.delta) {
102
+ const deltaText = chunk.delta.text || '';
103
+ if (deltaText) {
104
+ fullText += deltaText;
105
+ onPartialResponse(deltaText);
106
+ }
107
+ }
108
+ }
109
+ // Complete response callback
110
+ await onCompleteResponse(fullText);
111
+ }
112
+ catch (error) {
113
+ console.error('Error in processVisionChat:', error);
114
+ throw error;
115
+ }
116
+ }
117
+ /**
118
+ * Convert AITuber OnAir messages to Claude format
119
+ * @param messages Array of messages
120
+ * @returns Claude formatted messages
121
+ */
122
+ convertMessagesToClaudeFormat(messages) {
123
+ return messages.map(msg => ({
124
+ role: this.mapRoleToClaude(msg.role),
125
+ content: msg.content,
126
+ }));
127
+ }
128
+ /**
129
+ * Convert AITuber OnAir vision messages to Claude format
130
+ * @param messages Array of vision messages
131
+ * @returns Claude formatted vision messages
132
+ */
133
+ convertVisionMessagesToClaudeFormat(messages) {
134
+ return messages.map(msg => {
135
+ // If message content is a string, create a text-only message
136
+ if (typeof msg.content === 'string') {
137
+ return {
138
+ role: this.mapRoleToClaude(msg.role),
139
+ content: [
140
+ {
141
+ type: 'text',
142
+ text: msg.content,
143
+ },
144
+ ],
145
+ };
146
+ }
147
+ // If message content is an array of blocks, convert each block
148
+ else if (Array.isArray(msg.content)) {
149
+ const content = msg.content.map(block => {
150
+ if (block.type === 'text') {
151
+ return {
152
+ type: 'text',
153
+ text: block.text,
154
+ };
155
+ }
156
+ else if (block.type === 'image_url') {
157
+ // データURLかどうかをチェック
158
+ if (block.image_url.url.startsWith('data:')) {
159
+ // Data URLからBase64部分を抽出
160
+ const matches = block.image_url.url.match(/^data:([A-Za-z-+/]+);base64,(.+)$/);
161
+ if (matches && matches.length >= 3) {
162
+ const mediaType = matches[1];
163
+ const base64Data = matches[2];
164
+ return {
165
+ type: 'image',
166
+ source: {
167
+ type: 'base64',
168
+ media_type: mediaType,
169
+ data: base64Data
170
+ }
171
+ };
172
+ }
173
+ }
174
+ // 通常のURLの場合
175
+ return {
176
+ type: 'image',
177
+ source: {
178
+ type: 'url',
179
+ url: block.image_url.url,
180
+ media_type: this.getMimeTypeFromUrl(block.image_url.url),
181
+ },
182
+ };
183
+ }
184
+ return null;
185
+ }).filter(item => item !== null);
186
+ return {
187
+ role: this.mapRoleToClaude(msg.role),
188
+ content,
189
+ };
190
+ }
191
+ return {
192
+ role: this.mapRoleToClaude(msg.role),
193
+ content: [],
194
+ };
195
+ });
196
+ }
197
+ /**
198
+ * Map AITuber OnAir roles to Claude roles
199
+ * @param role AITuber OnAir role
200
+ * @returns Claude role
201
+ */
202
+ mapRoleToClaude(role) {
203
+ switch (role) {
204
+ case 'system':
205
+ // Claude handles system messages separately, but we'll map it anyway
206
+ return 'system';
207
+ case 'user':
208
+ return 'user';
209
+ case 'assistant':
210
+ return 'assistant';
211
+ default:
212
+ return 'user';
213
+ }
214
+ }
215
+ /**
216
+ * Get MIME type from URL
217
+ * @param url Image URL
218
+ * @returns MIME type
219
+ */
220
+ getMimeTypeFromUrl(url) {
221
+ const extension = url.split('.').pop()?.toLowerCase();
222
+ switch (extension) {
223
+ case 'jpg':
224
+ case 'jpeg':
225
+ return 'image/jpeg';
226
+ case 'png':
227
+ return 'image/png';
228
+ case 'gif':
229
+ return 'image/gif';
230
+ case 'webp':
231
+ return 'image/webp';
232
+ default:
233
+ return 'image/jpeg';
234
+ }
235
+ }
236
+ }
237
+ //# sourceMappingURL=ClaudeChatService.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ClaudeChatService.js","sourceRoot":"","sources":["../../../src/services/chat/ClaudeChatService.ts"],"names":[],"mappings":"AAEA,OAAO,EAEL,oBAAoB,EACpB,8BAA8B,EAC/B,MAAM,iBAAiB,CAAC;AACzB,OAAO,EAAE,SAAS,EAAE,MAAM,mBAAmB,CAAC;AAE9C;;GAEG;AACH,MAAM,OAAO,iBAAiB;IAQ5B;;;;;OAKG;IACH,YACE,MAAc,EACd,QAAgB,oBAAoB,EACpC,cAAsB,oBAAoB;QAZ5C,oBAAoB;QACX,aAAQ,GAAW,QAAQ,CAAC;QAanC,IAAI,CAAC,MAAM,GAAG,MAAM,CAAC;QACrB,IAAI,CAAC,KAAK,GAAG,KAAK,IAAI,oBAAoB,CAAC;QAC3C,IAAI,CAAC,WAAW,GAAG,WAAW,IAAI,oBAAoB,CAAC;QACvD,IAAI,CAAC,SAAS,GAAG,IAAI,SAAS,CAAC;YAC7B,MAAM,EAAE,IAAI,CAAC,MAAM;YACnB,uBAAuB,EAAE,IAAI,CAAC,oBAAoB;SACnD,CAAC,CAAC;IACL,CAAC;IAED;;;OAGG;IACH,QAAQ;QACN,OAAO,IAAI,CAAC,KAAK,CAAC;IACpB,CAAC;IAED;;;;;OAKG;IACH,KAAK,CAAC,WAAW,CACf,QAAmB,EACnB,iBAAyC,EACzC,kBAAmD;QAEnD,IAAI,CAAC;YACH,uDAAuD;YACvD,MAAM,aAAa,GAAG,QAAQ,CAAC,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,CAAC,IAAI,KAAK,QAAQ,CAAC,CAAC;YAClE,MAAM,iBAAiB,GAAG,QAAQ,CAAC,MAAM,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,CAAC,IAAI,KAAK,QAAQ,CAAC,CAAC;YAExE,oCAAoC;YACpC,MAAM,cAAc,GAAG,IAAI,CAAC,6BAA6B,CAAC,iBAAiB,CAAC,CAAC;YAE7E,4CAA4C;YAC5C,MAAM,MAAM,GAAG,MAAM,IAAI,CAAC,SAAS,CAAC,QAAQ,CAAC,MAAM,CAAC;gBAClD,KAAK,EAAE,IAAI,CAAC,KAAK;gBACjB,QAAQ,EAAE,cAAc;gBACxB,MAAM,EAAE,aAAa,EAAE,OAAO,IAAI,EAAE;gBACpC,MAAM,EAAE,IAAI;gBACZ,UAAU,EAAE,IAAI;aACjB,CAAC,CAAC;YAEH,IAAI,QAAQ,GAAG,EAAE,CAAC;YAElB,6BAA6B;YAC7B,IAAI,KAAK,EAAE,MAAM,KAAK,IAAI,MAAM,EAAE,CAAC;gBACjC,IAAI,KAAK,CAAC,IAAI,KAAK,qBAAqB,IAAI,KAAK,CAAC,KAAK,IAAI,MAAM,IAAI,KAAK,CAAC,KAAK,EAAE,CAAC;oBACjF,MAAM,SAAS,GAAG,KAAK,CAAC,KAAK,CAAC,IAAI,IAAI,EAAE,CAAC;oBACzC,IAAI,SAAS,EAAE,CAAC;wBACd,QAAQ,IAAI,SAAS,CAAC;wBACtB,iBAAiB,CAAC,SAAS,CAAC,CAAC;oBAC/B,CAAC;gBACH,CAAC;YACH,CAAC;YAED,6BAA6B;YAC7B,MAAM,kBAAkB,CAAC,QAAQ,CAAC,CAAC;QACrC,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,OAAO,CAAC,KAAK,CAAC,uBAAuB,EAAE,KAAK,CAAC,CAAC;YAC9C,MAAM,KAAK,CAAC;QACd,CAAC;IACH,CAAC;IAED;;;;;;OAMG;IACH,KAAK,CAAC,iBAAiB,CACrB,QAA6B,EAC7B,iBAAyC,EACzC,kBAAmD;QAEnD,IAAI,CAAC;YACH,yDAAyD;YACzD,IAAI,CAAC,8BAA8B,CAAC,QAAQ,CAAC,IAAI,CAAC,WAAW,CAAC,EAAE,CAAC;gBAC/D,MAAM,IAAI,KAAK,CAAC,SAAS,IAAI,CAAC,WAAW,wCAAwC,CAAC,CAAC;YACrF,CAAC;YAED,uDAAuD;YACvD,MAAM,aAAa,GAAG,QAAQ,CAAC,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,CAAC,IAAI,KAAK,QAAQ,CAAC,CAAC;YAClE,MAAM,iBAAiB,GAAG,QAAQ,CAAC,MAAM,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,CAAC,IAAI,KAAK,QAAQ,CAAC,CAAC;YAExE,2CAA2C;YAC3C,MAAM,cAAc,GAAG,IAAI,CAAC,mCAAmC,CAAC,iBAAiB,CAAC,CAAC;YAEnF,4CAA4C;YAC5C,MAAM,MAAM,GAAG,MAAM,IAAI,CAAC,SAAS,CAAC,QAAQ,CAAC,MAAM,CAAC;gBAClD,KAAK,EAAE,IAAI,CAAC,WAAW;gBACvB,QAAQ,EAAE,cAAc;gBACxB,aAAa;gBACb,MAAM,EAAE,aAAa,EAAE,OAAO,IAAI,EAAE;gBACpC,MAAM,EAAE,IAAI;gBACZ,UAAU,EAAE,IAAI;aACjB,CAAC,CAAC;YAEH,IAAI,QAAQ,GAAG,EAAE,CAAC;YAElB,6BAA6B;YAC7B,IAAI,KAAK,EAAE,MAAM,KAAK,IAAI,MAAM,EAAE,CAAC;gBACjC,IAAI,KAAK,CAAC,IAAI,KAAK,qBAAqB,IAAI,KAAK,CAAC,KAAK,IAAI,MAAM,IAAI,KAAK,CAAC,KAAK,EAAE,CAAC;oBACjF,MAAM,SAAS,GAAG,KAAK,CAAC,KAAK,CAAC,IAAI,IAAI,EAAE,CAAC;oBACzC,IAAI,SAAS,EAAE,CAAC;wBACd,QAAQ,IAAI,SAAS,CAAC;wBACtB,iBAAiB,CAAC,SAAS,CAAC,CAAC;oBAC/B,CAAC;gBACH,CAAC;YACH,CAAC;YAED,6BAA6B;YAC7B,MAAM,kBAAkB,CAAC,QAAQ,CAAC,CAAC;QACrC,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,OAAO,CAAC,KAAK,CAAC,6BAA6B,EAAE,KAAK,CAAC,CAAC;YACpD,MAAM,KAAK,CAAC;QACd,CAAC;IACH,CAAC;IAED;;;;OAIG;IACK,6BAA6B,CAAC,QAAmB;QAIvD,OAAO,QAAQ,CAAC,GAAG,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;YAC1B,IAAI,EAAE,IAAI,CAAC,eAAe,CAAC,GAAG,CAAC,IAAI,CAAyB;YAC5D,OAAO,EAAE,GAAG,CAAC,OAAO;SACrB,CAAC,CAAC,CAAC;IACN,CAAC;IAED;;;;OAIG;IACK,mCAAmC,CAAC,QAA6B;QAIvE,OAAO,QAAQ,CAAC,GAAG,CAAC,GAAG,CAAC,EAAE;YACxB,6DAA6D;YAC7D,IAAI,OAAO,GAAG,CAAC,OAAO,KAAK,QAAQ,EAAE,CAAC;gBACpC,OAAO;oBACL,IAAI,EAAE,IAAI,CAAC,eAAe,CAAC,GAAG,CAAC,IAAI,CAAyB;oBAC5D,OAAO,EAAE;wBACP;4BACE,IAAI,EAAE,MAAM;4BACZ,IAAI,EAAE,GAAG,CAAC,OAAO;yBAClB;qBACF;iBACF,CAAC;YACJ,CAAC;YACD,+DAA+D;iBAC1D,IAAI,KAAK,CAAC,OAAO,CAAC,GAAG,CAAC,OAAO,CAAC,EAAE,CAAC;gBACpC,MAAM,OAAO,GAAG,GAAG,CAAC,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,EAAE;oBACtC,IAAI,KAAK,CAAC,IAAI,KAAK,MAAM,EAAE,CAAC;wBAC1B,OAAO;4BACL,IAAI,EAAE,MAAM;4BACZ,IAAI,EAAE,KAAK,CAAC,IAAI;yBACjB,CAAC;oBACJ,CAAC;yBAAM,IAAI,KAAK,CAAC,IAAI,KAAK,WAAW,EAAE,CAAC;wBACtC,kBAAkB;wBAClB,IAAI,KAAK,CAAC,SAAS,CAAC,GAAG,CAAC,UAAU,CAAC,OAAO,CAAC,EAAE,CAAC;4BAC5C,wBAAwB;4BACxB,MAAM,OAAO,GAAG,KAAK,CAAC,SAAS,CAAC,GAAG,CAAC,KAAK,CAAC,mCAAmC,CAAC,CAAC;4BAC/E,IAAI,OAAO,IAAI,OAAO,CAAC,MAAM,IAAI,CAAC,EAAE,CAAC;gCACnC,MAAM,SAAS,GAAG,OAAO,CAAC,CAAC,CAAC,CAAC;gCAC7B,MAAM,UAAU,GAAG,OAAO,CAAC,CAAC,CAAC,CAAC;gCAC9B,OAAO;oCACL,IAAI,EAAE,OAAO;oCACb,MAAM,EAAE;wCACN,IAAI,EAAE,QAAQ;wCACd,UAAU,EAAE,SAAS;wCACrB,IAAI,EAAE,UAAU;qCACjB;iCACF,CAAC;4BACJ,CAAC;wBACH,CAAC;wBAED,YAAY;wBACZ,OAAO;4BACL,IAAI,EAAE,OAAO;4BACb,MAAM,EAAE;gCACN,IAAI,EAAE,KAAK;gCACX,GAAG,EAAE,KAAK,CAAC,SAAS,CAAC,GAAG;gCACxB,UAAU,EAAE,IAAI,CAAC,kBAAkB,CAAC,KAAK,CAAC,SAAS,CAAC,GAAG,CAAC;6BACzD;yBACF,CAAC;oBACJ,CAAC;oBACD,OAAO,IAAI,CAAC;gBACd,CAAC,CAAC,CAAC,MAAM,CAAC,IAAI,CAAC,EAAE,CAAC,IAAI,KAAK,IAAI,CAAC,CAAC;gBAEjC,OAAO;oBACL,IAAI,EAAE,IAAI,CAAC,eAAe,CAAC,GAAG,CAAC,IAAI,CAAyB;oBAC5D,OAAO;iBACR,CAAC;YACJ,CAAC;YAED,OAAO;gBACL,IAAI,EAAE,IAAI,CAAC,eAAe,CAAC,GAAG,CAAC,IAAI,CAAyB;gBAC5D,OAAO,EAAE,EAAE;aACZ,CAAC;QACJ,CAAC,CAAC,CAAC;IACL,CAAC;IAED;;;;OAIG;IACK,eAAe,CAAC,IAAY;QAClC,QAAQ,IAAI,EAAE,CAAC;YACb,KAAK,QAAQ;gBACX,qEAAqE;gBACrE,OAAO,QAAQ,CAAC;YAClB,KAAK,MAAM;gBACT,OAAO,MAAM,CAAC;YAChB,KAAK,WAAW;gBACd,OAAO,WAAW,CAAC;YACrB;gBACE,OAAO,MAAM,CAAC;QAClB,CAAC;IACH,CAAC;IAED;;;;OAIG;IACK,kBAAkB,CAAC,GAAW;QACpC,MAAM,SAAS,GAAG,GAAG,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,GAAG,EAAE,EAAE,WAAW,EAAE,CAAC;QACtD,QAAQ,SAAS,EAAE,CAAC;YAClB,KAAK,KAAK,CAAC;YACX,KAAK,MAAM;gBACT,OAAO,YAAY,CAAC;YACtB,KAAK,KAAK;gBACR,OAAO,WAAW,CAAC;YACrB,KAAK,KAAK;gBACR,OAAO,WAAW,CAAC;YACrB,KAAK,MAAM;gBACT,OAAO,YAAY,CAAC;YACtB;gBACE,OAAO,YAAY,CAAC;QACxB,CAAC;IACH,CAAC;CACF"}
@@ -0,0 +1,63 @@
1
+ import { ChatService } from './ChatService';
2
+ import { Message, MessageWithVision } from '../../types';
3
+ /**
4
+ * Gemini implementation of ChatService
5
+ */
6
+ export declare class GeminiChatService implements ChatService {
7
+ private apiKey;
8
+ private model;
9
+ private visionModel;
10
+ /** Provider name */
11
+ readonly provider: string;
12
+ /**
13
+ * Constructor
14
+ * @param apiKey Google API key
15
+ * @param model Name of the model to use
16
+ * @param visionModel Name of the vision model
17
+ */
18
+ constructor(apiKey: string, model?: string, visionModel?: string);
19
+ /**
20
+ * Get the current model name
21
+ * @returns Model name
22
+ */
23
+ getModel(): string;
24
+ /**
25
+ * Process chat messages
26
+ * @param messages Array of messages to send
27
+ * @param onPartialResponse Callback to receive each part of streaming response
28
+ * @param onCompleteResponse Callback to execute when response is complete
29
+ */
30
+ processChat(messages: Message[], onPartialResponse: (text: string) => void, onCompleteResponse: (text: string) => Promise<void>): Promise<void>;
31
+ /**
32
+ * Process chat messages with images
33
+ * @param messages Array of messages to send (including images)
34
+ * @param onPartialResponse Callback to receive each part of streaming response
35
+ * @param onCompleteResponse Callback to execute when response is complete
36
+ * @throws Error if the selected model doesn't support vision
37
+ */
38
+ processVisionChat(messages: MessageWithVision[], onPartialResponse: (text: string) => void, onCompleteResponse: (text: string) => Promise<void>): Promise<void>;
39
+ /**
40
+ * Convert AITuber OnAir messages to Gemini format
41
+ * @param messages Array of messages
42
+ * @returns Gemini formatted messages
43
+ */
44
+ private convertMessagesToGeminiFormat;
45
+ /**
46
+ * Convert AITuber OnAir vision messages to Gemini format
47
+ * @param messages Array of vision messages
48
+ * @returns Gemini formatted vision messages
49
+ */
50
+ private convertVisionMessagesToGeminiFormat;
51
+ /**
52
+ * Convert Blob to Base64 string
53
+ * @param blob Image blob
54
+ * @returns Promise with base64 encoded string
55
+ */
56
+ private blobToBase64;
57
+ /**
58
+ * Map AITuber OnAir roles to Gemini roles
59
+ * @param role AITuber OnAir role
60
+ * @returns Gemini role
61
+ */
62
+ private mapRoleToGemini;
63
+ }