Skip to content
Merged
Show file tree
Hide file tree
Changes from 1 commit
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
7 changes: 6 additions & 1 deletion src/engine/anthropic.ts
Original file line number Diff line number Diff line change
Expand Up @@ -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('<think>')) {
return content.replace(/<think>[\s\S]*?<\/think>/g, '').trim();
}

return content;
} catch (error) {
const err = error as Error;
outro(`${chalk.red('✖')} ${err?.message || err}`);
Expand Down
9 changes: 8 additions & 1 deletion src/engine/azure.ts
Original file line number Diff line number Diff line change
Expand Up @@ -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('<think>')) {
return content.replace(/<think>[\s\S]*?<\/think>/g, '').trim();
}

return content;
} catch (error) {
outro(`${chalk.red('✖')} ${this.config.model}`);

Expand Down
9 changes: 7 additions & 2 deletions src/engine/deepseek.ts
Original file line number Diff line number Diff line change
Expand Up @@ -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 {}

Expand Down Expand Up @@ -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('<think>')) {
return content.replace(/<think>[\s\S]*?<\/think>/g, '').trim();
}

return content;
} catch (error) {
const err = error as Error;
if (
Expand Down
8 changes: 7 additions & 1 deletion src/engine/flowise.ts
Original file line number Diff line number Diff line change
Expand Up @@ -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('<think>')) {
return content.replace(/<think>[\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);
Expand Down
8 changes: 7 additions & 1 deletion src/engine/gemini.ts
Original file line number Diff line number Diff line change
Expand Up @@ -71,7 +71,13 @@ export class GeminiEngine implements AiEngine {
}
});

return result.response.text();
const content = result.response.text();

if (content && content.includes('<think>')) {
return content.replace(/<think>[\s\S]*?<\/think>/g, '').trim();
}

return content;
} catch (error) {
const err = error as Error;
if (
Expand Down
29 changes: 14 additions & 15 deletions src/engine/mistral.ts
Original file line number Diff line number Diff line change
@@ -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<any>;

// 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;
Expand Down Expand Up @@ -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('<think>')) {
return content.replace(/<think>[\s\S]*?<\/think>/g, '').trim();
}

return content;
} catch (error) {
const err = error as Error;
if (
Expand Down
9 changes: 7 additions & 2 deletions src/engine/mlx.ts
Original file line number Diff line number Diff line change
Expand Up @@ -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('<think>')) {
return content.replace(/<think>[\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}`);
}
}
}
}
7 changes: 6 additions & 1 deletion src/engine/openAi.ts
Original file line number Diff line number Diff line change
Expand Up @@ -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('<think>')) {
return content.replace(/<think>[\s\S]*?<\/think>/g, '').trim();
}

return content;
} catch (error) {
const err = error as Error;
if (
Expand Down
Loading