Extends #445 to other providers which many provides deepseek

This commit is contained in:
Tiger Kaovilai
2025-04-11 12:50:16 -04:00
parent 60a7650e1c
commit f5c6c313fc
8 changed files with 62 additions and 24 deletions
+6 -1
View File
@@ -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}`);
+8 -1
View File
@@ -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}`);
+7 -2
View File
@@ -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('<think>')) {
return content.replace(/<think>[\s\S]*?<\/think>/g, '').trim();
}
return content;
} catch (error) {
const err = error as Error;
if (
+7 -1
View File
@@ -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);
+7 -1
View File
@@ -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 (
+14 -15
View File
@@ -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;
@@ -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 (
+7 -2
View File
@@ -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}`);
}
}
}
}
+6 -1
View File
@@ -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 (