/**
* OpenAI provider adapter
*/
import OpenAI from 'openai';
import { BaseAIProvider } from './base.js';
import { AIProviderConfig, AIResponse, Message } from '../types.js';
export class OpenAIProvider extends BaseAIProvider {
private client: OpenAI | null = null;
private getClient(apiKey?: string): OpenAI {
if (!this.client) {
this.client = new OpenAI({
apiKey: apiKey || process.env.OPENAI_API_KEY
});
}
return this.client;
}
async call(messages: Message[], config: AIProviderConfig): Promise<AIResponse> {
const client = this.getClient(config.apiKey);
const completion = await client.chat.completions.create({
model: config.model,
messages: messages.map(msg => ({
role: msg.role,
content: msg.content
})),
temperature: config.temperature ?? 0.7,
max_tokens: config.maxTokens ?? 2000,
});
const choice = completion.choices[0];
if (!choice?.message?.content) {
throw new Error('No response from OpenAI');
}
return {
content: choice.message.content,
model: completion.model,
usage: completion.usage ? {
promptTokens: completion.usage.prompt_tokens,
completionTokens: completion.usage.completion_tokens,
totalTokens: completion.usage.total_tokens
} : undefined,
metadata: {
finishReason: choice.finish_reason,
id: completion.id
}
};
}
}