From 7d28ff516c9700925b428b610e4b0c382a0090fb Mon Sep 17 00:00:00 2001 From: Matt Rubens Date: Fri, 31 Jan 2025 17:50:29 -0500 Subject: [PATCH] Streaming version of o3-mini --- .changeset/gold-pillows-fix.md | 5 +++++ src/api/providers/openai-native.ts | 31 ++++++++++++++++++++++++++++-- 2 files changed, 34 insertions(+), 2 deletions(-) create mode 100644 .changeset/gold-pillows-fix.md diff --git a/.changeset/gold-pillows-fix.md b/.changeset/gold-pillows-fix.md new file mode 100644 index 0000000..888f79e --- /dev/null +++ b/.changeset/gold-pillows-fix.md @@ -0,0 +1,5 @@ +--- +"roo-cline": patch +--- + +Streaming version of o3-mini diff --git a/src/api/providers/openai-native.ts b/src/api/providers/openai-native.ts index ef98ade..4c90496 100644 --- a/src/api/providers/openai-native.ts +++ b/src/api/providers/openai-native.ts @@ -27,8 +27,7 @@ export class OpenAiNativeHandler implements ApiHandler, SingleCompletionHandler switch (modelId) { case "o1": case "o1-preview": - case "o1-mini": - case "o3-mini": { + case "o1-mini": { // o1-preview and o1-mini don't support streaming, non-1 temp, or system prompt // o1 doesnt support streaming or non-1 temp but does support a developer prompt const response = await this.client.chat.completions.create({ @@ -49,6 +48,34 @@ export class OpenAiNativeHandler implements ApiHandler, SingleCompletionHandler } break } + case "o3-mini": { + const stream = await this.client.chat.completions.create({ + model: this.getModel().id, + messages: [{ role: "developer", content: systemPrompt }, ...convertToOpenAiMessages(messages)], + stream: true, + stream_options: { include_usage: true }, + }) + + for await (const chunk of stream) { + const delta = chunk.choices[0]?.delta + if (delta?.content) { + yield { + type: "text", + text: delta.content, + } + } + + // contains a null value except for the last chunk which contains the token usage statistics for the entire request + if (chunk.usage) { + yield { + type: "usage", + inputTokens: chunk.usage.prompt_tokens || 0, + outputTokens: chunk.usage.completion_tokens || 0, + } + } + } + break + } default: { const stream = await this.client.chat.completions.create({ model: this.getModel().id,