@yuchida-tamu/podcast-gen
Version:
AI-Powered Monologue Podcast Generator
70 lines • 2.33 kB
JavaScript
import { APIClient } from '../core/APIClient.js';
import { validateApiKey } from '../utils/errors.js';
export class AnthropicService extends APIClient {
client;
llmConfig;
constructor(client, config) {
validateApiKey();
const llmConfig = {
apiKey: process.env.ANTHROPIC_API_KEY || '',
model: 'claude-3-5-sonnet-20241022',
maxTokens: 500,
...config,
};
// Map LLM config to API config for APIClient
const apiConfig = {
retries: 3,
timeout: 30000,
baseDelay: 1000,
maxDelay: 10000,
};
super(apiConfig);
this.llmConfig = llmConfig;
this.client = client;
}
// Implement the abstract fetch method from APIClient
async fetch(request) {
const response = await this.client.messages.create({
model: this.llmConfig.model,
max_tokens: this.llmConfig.maxTokens,
system: request.systemPrompt,
messages: [
{
role: 'user',
content: request.userPrompt,
},
],
});
// Validate response format
if (!response.content[0] || !('text' in response.content[0])) {
throw new Error('Invalid response format from API');
}
const content = response.content[0].text.trim();
return {
content,
usage: {
promptTokens: response.usage.input_tokens,
completionTokens: response.usage.output_tokens,
totalTokens: response.usage.input_tokens + response.usage.output_tokens,
},
};
}
// Implement LLMService interface
async generateContent(request) {
return this.executeWithRetry(request);
}
async isHealthy() {
try {
const testRequest = {
systemPrompt: 'You are a helpful assistant.',
userPrompt: 'Say "healthy" if you can respond.',
};
const response = await this.generateContent(testRequest);
return response.content.toLowerCase().includes('healthy');
}
catch (error) {
return false;
}
}
}
//# sourceMappingURL=AnthropicService.js.map