From d8e1ddee2bfe5046ba0215759c65feb625273023 Mon Sep 17 00:00:00 2001 From: avtc Date: Mon, 19 May 2025 01:16:42 +0300 Subject: [PATCH] lmstudio reasoning support (thinking block) Similar to ollama implementation in #1080 --- src/api/providers/lmstudio.ts | 21 +++++++++++++++++---- 1 file changed, 17 insertions(+), 4 deletions(-) diff --git a/src/api/providers/lmstudio.ts b/src/api/providers/lmstudio.ts index 9a3ab187bf2..6053ed056d4 100644 --- a/src/api/providers/lmstudio.ts +++ b/src/api/providers/lmstudio.ts @@ -7,6 +7,7 @@ import { ApiHandlerOptions, ModelInfo, openAiModelInfoSaneDefaults } from "../.. import { convertToOpenAiMessages } from "../transform/openai-format" import { ApiStream } from "../transform/stream" import { BaseProvider } from "./base-provider" +import { XmlMatcher } from "../../utils/xml-matcher" const LMSTUDIO_DEFAULT_TEMPERATURE = 0 @@ -44,18 +45,30 @@ export class LmStudioHandler extends BaseProvider implements SingleCompletionHan } const results = await this.client.chat.completions.create(params) - + + const matcher = new XmlMatcher( + "think", + (chunk) => + ({ + type: chunk.matched ? "reasoning" : "text", + text: chunk.data, + }) as const, + ) + // Stream handling // @ts-ignore for await (const chunk of results) { 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 } } } + for (const chunk of matcher.final()) { + yield chunk + } } catch (error) { // LM Studio doesn't return an error code/body for now throw new Error(