@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.
- package/README.md +32 -3
- package/dist/constants/index.d.ts +8 -0
- package/dist/constants/index.js +20 -0
- package/dist/constants/index.js.map +1 -1
- package/dist/index.d.ts +2 -2
- package/dist/index.js +3 -2
- package/dist/index.js.map +1 -1
- package/dist/services/chat/ChatServiceFactory.js +4 -1
- package/dist/services/chat/ChatServiceFactory.js.map +1 -1
- package/dist/services/chat/ClaudeChatService.d.ts +64 -0
- package/dist/services/chat/ClaudeChatService.js +237 -0
- package/dist/services/chat/ClaudeChatService.js.map +1 -0
- package/dist/services/chat/GeminiChatService.d.ts +63 -0
- package/dist/services/chat/GeminiChatService.js +314 -0
- package/dist/services/chat/GeminiChatService.js.map +1 -0
- package/dist/services/chat/OpenAIChatService.d.ts +1 -0
- package/dist/services/chat/OpenAIChatService.js +6 -1
- package/dist/services/chat/OpenAIChatService.js.map +1 -1
- package/dist/services/chat/providers/ChatServiceProvider.d.ts +2 -0
- package/dist/services/chat/providers/ClaudeChatServiceProvider.d.ts +39 -0
- package/dist/services/chat/providers/ClaudeChatServiceProvider.js +57 -0
- package/dist/services/chat/providers/ClaudeChatServiceProvider.js.map +1 -0
- package/dist/services/chat/providers/GeminiChatServiceProvider.d.ts +39 -0
- package/dist/services/chat/providers/GeminiChatServiceProvider.js +57 -0
- package/dist/services/chat/providers/GeminiChatServiceProvider.js.map +1 -0
- package/dist/services/chat/providers/OpenAIChatServiceProvider.d.ts +6 -0
- package/dist/services/chat/providers/OpenAIChatServiceProvider.js +16 -3
- package/dist/services/chat/providers/OpenAIChatServiceProvider.js.map +1 -1
- package/dist/services/voice/VoiceEngineAdapter.d.ts +2 -2
- package/dist/services/voice/VoiceEngineAdapter.js.map +1 -1
- package/dist/services/voice/VoiceService.d.ts +3 -3
- package/dist/services/voice/engines/AivisSpeechEngine.d.ts +1 -1
- package/dist/services/voice/engines/NijiVoiceEngine.d.ts +1 -2
- package/dist/services/voice/engines/NijiVoiceEngine.js.map +1 -1
- package/dist/services/voice/engines/OpenAiEngine.d.ts +1 -1
- package/dist/services/voice/engines/VoiceEngine.d.ts +1 -2
- package/dist/services/voice/engines/VoiceEngineFactory.d.ts +2 -1
- package/dist/services/voice/engines/VoiceEngineFactory.js.map +1 -1
- package/dist/services/voice/engines/VoicePeakEngine.d.ts +1 -1
- package/dist/services/voice/engines/VoiceVoxEngine.d.ts +1 -1
- package/dist/services/voice/messages.d.ts +2 -37
- package/dist/services/voice/messages.js +1 -9
- package/dist/services/voice/messages.js.map +1 -1
- package/dist/types/chat.d.ts +54 -0
- package/dist/types/chat.js +5 -0
- package/dist/types/chat.js.map +1 -0
- package/dist/types/index.d.ts +10 -80
- package/dist/types/index.js +9 -1
- package/dist/types/index.js.map +1 -1
- package/dist/types/memory.d.ts +34 -0
- package/dist/types/memory.js +2 -0
- package/dist/types/memory.js.map +1 -0
- package/dist/types/voice.d.ts +35 -0
- package/dist/types/voice.js +13 -0
- package/dist/types/voice.js.map +1 -0
- package/dist/types/voiceEngine.d.ts +1 -0
- package/dist/types/voiceEngine.js +2 -0
- package/dist/types/voiceEngine.js.map +1 -0
- package/dist/utils/screenplay.d.ts +4 -4
- package/dist/utils/screenplay.js.map +1 -1
- 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
|
|
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,
|
|
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
|
|
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";
|
package/dist/constants/index.js
CHANGED
|
@@ -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;
|
|
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
|
|
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
|
|
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,
|
|
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
|
+
}
|