File size: 1,774 Bytes
755dd12 |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 |
import OpenAI from 'openai';
import { IChatInputMessage, IStreamHandler } from '../../interface';
import { BaseChat } from './base';
export class BaseOpenAIChat implements BaseChat {
private openai: OpenAI | null;
public platform: string;
constructor(platform: string, apiKey?: string, baseURL?: string) {
this.platform = platform;
if (apiKey) {
this.openai = new OpenAI({
baseURL,
apiKey,
});
}
}
public async chat(
messages: IChatInputMessage[],
model: string,
system?: string
) {
if (!this.openai) {
throw new Error(`${this.platform} key is not set`);
}
if (system) {
messages = [
{
role: 'system',
content: system,
},
...messages,
];
}
const res = await this.openai.chat.completions.create({
messages,
model
});
return res.choices[0]?.message.content;
}
public async chatStream(
messages: IChatInputMessage[],
onMessage: IStreamHandler,
model: string,
system?: string
) {
if (!this.openai) {
throw new Error(`${this.platform} key is not set`);
}
if (system) {
messages = [
{
role: 'system',
content: system,
},
...messages,
];
}
const stream = await this.openai.chat.completions.create({
messages,
model,
stream: true
});
for await (const chunk of stream) {
onMessage?.(chunk.choices[0].delta.content || null, false);
}
onMessage?.(null, true);
}
async listModels() {
if (!this.openai) throw new Error(`${this.platform} Key is Required.`);
const models = await this.openai.models.list();
return models.data.map((model) => model.id);
}
}
|