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 { 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 }; }