diff --git a/src/engine/anthropic.ts b/src/engine/anthropic.ts index 708468e..88480f6 100644 --- a/src/engine/anthropic.ts +++ b/src/engine/anthropic.ts @@ -54,8 +54,13 @@ export class AnthropicEngine implements AiEngine { const data = await this.client.messages.create(params); const message = data?.content[0].text; + let content = message; - return message; + if (content && content.includes('')) { + return content.replace(/[\s\S]*?<\/think>/g, '').trim(); + } + + return content; } catch (error) { const err = error as Error; outro(`${chalk.red('✖')} ${err?.message || err}`); diff --git a/src/engine/azure.ts b/src/engine/azure.ts index db1b656..c2dc306 100644 --- a/src/engine/azure.ts +++ b/src/engine/azure.ts @@ -52,7 +52,14 @@ export class AzureEngine implements AiEngine { if (message?.content === null) { return undefined; } - return message?.content; + + let content = message?.content; + + if (content && content.includes('')) { + return content.replace(/[\s\S]*?<\/think>/g, '').trim(); + } + + return content; } catch (error) { outro(`${chalk.red('✖')} ${this.config.model}`); diff --git a/src/engine/deepseek.ts b/src/engine/deepseek.ts index 9424a9a..4ae2a68 100644 --- a/src/engine/deepseek.ts +++ b/src/engine/deepseek.ts @@ -2,7 +2,7 @@ import axios from 'axios'; import { OpenAI } from 'openai'; import { GenerateCommitMessageErrorEnum } from '../generateCommitMessageFromGitDiff'; import { tokenCount } from '../utils/tokenCount'; -import { OpenAiEngine, OpenAiConfig } from './openAI'; +import { OpenAiEngine, OpenAiConfig } from './openAi'; export interface DeepseekConfig extends OpenAiConfig {} @@ -41,8 +41,13 @@ export class DeepseekEngine extends OpenAiEngine { const completion = await this.client.chat.completions.create(params); const message = completion.choices[0].message; + let content = message?.content; - return message?.content; + if (content && content.includes('')) { + return content.replace(/[\s\S]*?<\/think>/g, '').trim(); + } + + return content; } catch (error) { const err = error as Error; if ( diff --git a/src/engine/flowise.ts b/src/engine/flowise.ts index 00890f5..7f49029 100644 --- a/src/engine/flowise.ts +++ b/src/engine/flowise.ts @@ -36,7 +36,13 @@ export class FlowiseEngine implements AiEngine { try { const response = await this.client.post('', payload); const message = response.data; - return message?.text; + let content = message?.text; + + if (content && content.includes('')) { + return content.replace(/[\s\S]*?<\/think>/g, '').trim(); + } + + return content; } catch (err: any) { const message = err.response?.data?.error ?? err.message; throw new Error('local model issues. details: ' + message); diff --git a/src/engine/gemini.ts b/src/engine/gemini.ts index e2e63ac..d516451 100644 --- a/src/engine/gemini.ts +++ b/src/engine/gemini.ts @@ -71,7 +71,13 @@ export class GeminiEngine implements AiEngine { } }); - return result.response.text(); + const content = result.response.text(); + + if (content && content.includes('')) { + return content.replace(/[\s\S]*?<\/think>/g, '').trim(); + } + + return content; } catch (error) { const err = error as Error; if ( diff --git a/src/engine/mistral.ts b/src/engine/mistral.ts index ce480f2..a16a6dc 100644 --- a/src/engine/mistral.ts +++ b/src/engine/mistral.ts @@ -1,27 +1,20 @@ import axios from 'axios'; -import { Mistral } from '@mistralai/mistralai'; import { OpenAI } from 'openai'; import { GenerateCommitMessageErrorEnum } from '../generateCommitMessageFromGitDiff'; import { tokenCount } from '../utils/tokenCount'; import { AiEngine, AiEngineConfig } from './Engine'; -import { - AssistantMessage as MistralAssistantMessage, - SystemMessage as MistralSystemMessage, - ToolMessage as MistralToolMessage, - UserMessage as MistralUserMessage -} from '@mistralai/mistralai/models/components'; +// Using any for Mistral types to avoid type declaration issues export interface MistralAiConfig extends AiEngineConfig {} -export type MistralCompletionMessageParam = Array< -| (MistralSystemMessage & { role: "system" }) -| (MistralUserMessage & { role: "user" }) -| (MistralAssistantMessage & { role: "assistant" }) -| (MistralToolMessage & { role: "tool" }) -> +export type MistralCompletionMessageParam = Array; + +// Import Mistral dynamically to avoid TS errors +// eslint-disable-next-line @typescript-eslint/no-var-requires +const Mistral = require('@mistralai/mistralai').Mistral; export class MistralAiEngine implements AiEngine { config: MistralAiConfig; - client: Mistral; + client: any; // Using any type for Mistral client to avoid TS errors constructor(config: MistralAiConfig) { this.config = config; @@ -64,7 +57,13 @@ export class MistralAiEngine implements AiEngine { if (!message || !message.content) throw Error('No completion choice available.') - return message.content as string; + let content = message.content as string; + + if (content && content.includes('')) { + return content.replace(/[\s\S]*?<\/think>/g, '').trim(); + } + + return content; } catch (error) { const err = error as Error; if ( diff --git a/src/engine/mlx.ts b/src/engine/mlx.ts index 4e324e5..4abedc4 100644 --- a/src/engine/mlx.ts +++ b/src/engine/mlx.ts @@ -37,11 +37,16 @@ export class MLXEngine implements AiEngine { const choices = response.data.choices; const message = choices[0].message; + let content = message?.content; + + if (content && content.includes('')) { + return content.replace(/[\s\S]*?<\/think>/g, '').trim(); + } - return message?.content; + return content; } catch (err: any) { const message = err.response?.data?.error ?? err.message; throw new Error(`MLX provider error: ${message}`); } } -} \ No newline at end of file +} diff --git a/src/engine/openAi.ts b/src/engine/openAi.ts index ea5d9e9..4c0c46c 100644 --- a/src/engine/openAi.ts +++ b/src/engine/openAi.ts @@ -45,8 +45,13 @@ export class OpenAiEngine implements AiEngine { const completion = await this.client.chat.completions.create(params); const message = completion.choices[0].message; + let content = message?.content; - return message?.content; + if (content && content.includes('')) { + return content.replace(/[\s\S]*?<\/think>/g, '').trim(); + } + + return content; } catch (error) { const err = error as Error; if (