Просмотр исходного кода

Merge pull request #1566 from lightrabbit/feature/openai-compatible-deepseek-reasoning-support

feat: openai-compatible deepseek/qwq reasoning support
Matt Rubens 11 месяцев назад
Родитель
Сommit
c8b3095d93
1 измененных файлов с 15 добавлено и 3 удалено
  1. 15 3
      src/api/providers/openai.ts

+ 15 - 3
src/api/providers/openai.ts

@@ -14,6 +14,7 @@ import { convertToR1Format } from "../transform/r1-format"
 import { convertToSimpleMessages } from "../transform/simple-format"
 import { ApiStream, ApiStreamUsageChunk } from "../transform/stream"
 import { BaseProvider } from "./base-provider"
+import { XmlMatcher } from "../../utils/xml-matcher"
 
 const DEEP_SEEK_DEFAULT_TEMPERATURE = 0.6
 
@@ -134,15 +135,23 @@ export class OpenAiHandler extends BaseProvider implements SingleCompletionHandl
 
 			const stream = await this.client.chat.completions.create(requestOptions)
 
+			const matcher = new XmlMatcher(
+				"think",
+				(chunk) =>
+					({
+						type: chunk.matched ? "reasoning" : "text",
+						text: chunk.data,
+					}) as const,
+			)
+
 			let lastUsage
 
 			for await (const chunk of stream) {
 				const delta = chunk.choices[0]?.delta ?? {}
 
 				if (delta.content) {
-					yield {
-						type: "text",
-						text: delta.content,
+					for (const chunk of matcher.update(delta.content)) {
+						yield chunk
 					}
 				}
 
@@ -156,6 +165,9 @@ export class OpenAiHandler extends BaseProvider implements SingleCompletionHandl
 					lastUsage = chunk.usage
 				}
 			}
+			for (const chunk of matcher.final()) {
+				yield chunk
+			}
 
 			if (lastUsage) {
 				yield this.processUsageMetrics(lastUsage, modelInfo)