50 lines
1.2 KiB
TypeScript
50 lines
1.2 KiB
TypeScript
import OpenAI from "openai";
|
|
import type {
|
|
Message,
|
|
ModelEvent,
|
|
ModelPort,
|
|
ModelRequest,
|
|
} from "@great-agent/agent-core";
|
|
|
|
export type DeepSeekModelOptions = Readonly<{
|
|
apiKey: string;
|
|
baseURL: string;
|
|
model: string;
|
|
}>;
|
|
|
|
export class DeepSeekModelAdapter implements ModelPort {
|
|
private readonly client: OpenAI;
|
|
|
|
constructor(private readonly options: DeepSeekModelOptions) {
|
|
this.client = new OpenAI({
|
|
apiKey: options.apiKey,
|
|
baseURL: options.baseURL,
|
|
});
|
|
}
|
|
|
|
async *stream(
|
|
request: ModelRequest,
|
|
signal: AbortSignal,
|
|
): AsyncIterable<ModelEvent> {
|
|
const response = await this.client.chat.completions.create(
|
|
{
|
|
model: request.model === "default" ? this.options.model : request.model,
|
|
messages: request.messages.map(toModelMessage),
|
|
stream: true,
|
|
},
|
|
{ signal },
|
|
);
|
|
for await (const chunk of response) {
|
|
const delta = chunk.choices[0]?.delta.content;
|
|
if (delta) yield { type: "text.delta", delta };
|
|
}
|
|
yield { type: "response.completed" };
|
|
}
|
|
}
|
|
|
|
function toModelMessage(
|
|
message: Message,
|
|
): OpenAI.Chat.Completions.ChatCompletionMessageParam {
|
|
return { role: message.role, content: message.content };
|
|
}
|