@aituber-onair/core
Version:
Core library for AITuber OnAir providing voice synthesis and chat processing
86 lines • 3.6 kB
JavaScript
import { ENDPOINT_GEMINI_API, MODEL_GEMINI_2_0_FLASH_LITE, } from '../../../../constants';
import { DEFAULT_SUMMARY_PROMPT_TEMPLATE } from '../../../../constants';
/**
* Implementation of summarization functionality using Gemini
*/
export class GeminiSummarizer {
/**
* Constructor
* @param apiKey Google API key
* @param model Name of the model to use
* @param defaultPromptTemplate Default prompt template for summarization
*/
constructor(apiKey, model = MODEL_GEMINI_2_0_FLASH_LITE, defaultPromptTemplate = DEFAULT_SUMMARY_PROMPT_TEMPLATE) {
this.apiKey = apiKey;
this.model = model;
this.defaultPromptTemplate = defaultPromptTemplate;
}
/**
* Summarize chat messages
* @param messages Array of messages to summarize
* @param maxLength Maximum number of characters (default 256)
* @param customPrompt Custom prompt template for summarization (optional)
* @returns Summarized text
*/
async summarize(messages, maxLength = 256, customPrompt) {
try {
// Create system prompt
const promptTemplate = customPrompt || this.defaultPromptTemplate;
const systemPrompt = promptTemplate.replace('{maxLength}', maxLength.toString());
// Join message content
const conversationText = messages
.map((msg) => `${msg.role}: ${msg.content}`)
.join('\n');
// Create the endpoint URL with API key
const apiUrl = `${ENDPOINT_GEMINI_API}/models/${this.model}:generateContent?key=${this.apiKey}`;
// API request
const response = await fetch(apiUrl, {
method: 'POST',
headers: {
'Content-Type': 'application/json',
},
body: JSON.stringify({
contents: [
{
role: 'user',
parts: [
{
text: systemPrompt,
},
{
text: conversationText,
},
],
},
],
generationConfig: {
temperature: 0.2,
topK: 40,
topP: 0.95,
maxOutputTokens: maxLength,
},
}),
});
if (!response.ok) {
const errorData = await response.json();
throw new Error(`Gemini API error: ${errorData.error?.message || response.statusText}`);
}
const data = await response.json();
// Extract response text from Gemini's response format
if (data.candidates &&
data.candidates.length > 0 &&
data.candidates[0].content &&
data.candidates[0].content.parts &&
data.candidates[0].content.parts.length > 0) {
return data.candidates[0].content.parts[0].text || '';
}
return '';
}
catch (error) {
console.error('Error in summarize:', error);
// Error fallback - simple summary
return `${messages.length} messages. Latest topic: ${messages[messages.length - 1]?.content.substring(0, 50) || 'none'}...`;
}
}
}
//# sourceMappingURL=GeminiSummarizer.js.map