contaigents
Version:
Modular AI Content Ecosystem with Audio Generation
120 lines (119 loc) • 4.09 kB
JavaScript
import { BaseLLM } from "./BaseLLM.js";
export class OpenAIProvider extends BaseLLM {
constructor() {
super(OpenAIProvider.providerConfig);
}
async executePrompt(prompt, options = {}) {
if (!(await this.isConfigured())) {
throw new Error("OpenAI provider is not configured");
}
const response = await fetch("https://api.openai.com/v1/chat/completions", {
method: "POST",
headers: {
"Content-Type": "application/json",
Authorization: `Bearer ${this.config.apiKey}`,
},
body: JSON.stringify({
model: this.config.model,
messages: [{ role: "user", content: prompt }],
temperature: options.temperature ?? 0.7,
max_tokens: options.maxTokens,
}),
});
if (!response.ok) {
const error = await response.json();
throw new Error(`OpenAI API error: ${error.error?.message || "Unknown error"}`);
}
const data = await response.json();
return {
content: data.choices[0].message.content,
raw: data,
};
}
async executeConversation(messages, options = {}) {
if (!(await this.isConfigured())) {
throw new Error("OpenAI provider is not configured");
}
// Convert ConversationMessage to OpenAI format
const openAIMessages = messages.map(msg => ({
role: msg.role,
content: msg.content
}));
const response = await fetch("https://api.openai.com/v1/chat/completions", {
method: "POST",
headers: {
"Content-Type": "application/json",
Authorization: `Bearer ${this.config.apiKey}`,
},
body: JSON.stringify({
model: this.config.model,
messages: openAIMessages,
temperature: options.temperature ?? 0.7,
max_tokens: options.maxTokens,
}),
});
if (!response.ok) {
const error = await response.json();
throw new Error(`OpenAI API error: ${error.error?.message || "Unknown error"}`);
}
const data = await response.json();
return {
content: data.choices[0].message.content,
raw: data,
};
}
async imagine(prompt, options = {}) {
if (!(await this.isConfigured())) {
throw new Error("OpenAI provider is not configured");
}
const modelName = options.model || "dall-e-3";
const size = options.aspect_ratio || "1024x1024";
const n = options.number_of_images || 1;
const response = await fetch("https://api.openai.com/v1/images/generations", {
method: "POST",
headers: {
"Content-Type": "application/json",
Authorization: `Bearer ${this.config.apiKey}`,
},
body: JSON.stringify({
model: modelName,
prompt,
n,
size,
response_format: "url",
}),
});
if (!response.ok) {
const error = await response.json();
throw new Error(`OpenAI DALL-E API error: ${error.error?.message || "Unknown error"}`);
}
const data = await response.json();
return {
urls: data.data.map((image) => image.url),
raw: data,
};
}
}
OpenAIProvider.providerConfig = {
name: "OpenAI",
configFields: [
{
name: "apiKey",
required: true,
},
{
name: "model",
required: true,
options: [
"gpt-4o",
"gpt-4",
"gpt-3.5-turbo",
"gpt-4-turbo-preview",
"gpt-4-0125-preview",
"gpt-4-1106-preview",
"gpt-3.5-turbo-0125",
],
default: "gpt-4",
},
],
};