Skip to content

Commit 566a9b1

Browse files
committed
reuse function
Signed-off-by: Tiger Kaovilai <[email protected]>
1 parent f5c6c31 commit 566a9b1

File tree

11 files changed

+126
-55
lines changed

11 files changed

+126
-55
lines changed

src/engine/anthropic.ts

Lines changed: 2 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,7 @@ import axios from 'axios';
88
import chalk from 'chalk';
99
import { OpenAI } from 'openai';
1010
import { GenerateCommitMessageErrorEnum } from '../generateCommitMessageFromGitDiff';
11+
import { removeContentTags } from '../utils/removeContentTags';
1112
import { tokenCount } from '../utils/tokenCount';
1213
import { AiEngine, AiEngineConfig } from './Engine';
1314

@@ -55,12 +56,7 @@ export class AnthropicEngine implements AiEngine {
5556

5657
const message = data?.content[0].text;
5758
let content = message;
58-
59-
if (content && content.includes('<think>')) {
60-
return content.replace(/<think>[\s\S]*?<\/think>/g, '').trim();
61-
}
62-
63-
return content;
59+
return removeContentTags(content, 'think');
6460
} catch (error) {
6561
const err = error as Error;
6662
outro(`${chalk.red('✖')} ${err?.message || err}`);

src/engine/azure.ts

Lines changed: 2 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,7 @@ import axios from 'axios';
77
import chalk from 'chalk';
88
import { OpenAI } from 'openai';
99
import { GenerateCommitMessageErrorEnum } from '../generateCommitMessageFromGitDiff';
10+
import { removeContentTags } from '../utils/removeContentTags';
1011
import { tokenCount } from '../utils/tokenCount';
1112
import { AiEngine, AiEngineConfig } from './Engine';
1213

@@ -54,12 +55,7 @@ export class AzureEngine implements AiEngine {
5455
}
5556

5657
let content = message?.content;
57-
58-
if (content && content.includes('<think>')) {
59-
return content.replace(/<think>[\s\S]*?<\/think>/g, '').trim();
60-
}
61-
62-
return content;
58+
return removeContentTags(content, 'think');
6359
} catch (error) {
6460
outro(`${chalk.red('✖')} ${this.config.model}`);
6561

src/engine/deepseek.ts

Lines changed: 2 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
import axios from 'axios';
22
import { OpenAI } from 'openai';
33
import { GenerateCommitMessageErrorEnum } from '../generateCommitMessageFromGitDiff';
4+
import { removeContentTags } from '../utils/removeContentTags';
45
import { tokenCount } from '../utils/tokenCount';
56
import { OpenAiEngine, OpenAiConfig } from './openAi';
67

@@ -42,12 +43,7 @@ export class DeepseekEngine extends OpenAiEngine {
4243

4344
const message = completion.choices[0].message;
4445
let content = message?.content;
45-
46-
if (content && content.includes('<think>')) {
47-
return content.replace(/<think>[\s\S]*?<\/think>/g, '').trim();
48-
}
49-
50-
return content;
46+
return removeContentTags(content, 'think');
5147
} catch (error) {
5248
const err = error as Error;
5349
if (

src/engine/flowise.ts

Lines changed: 2 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
import axios, { AxiosInstance } from 'axios';
22
import { OpenAI } from 'openai';
3+
import { removeContentTags } from '../utils/removeContentTags';
34
import { AiEngine, AiEngineConfig } from './Engine';
45

56
interface FlowiseAiConfig extends AiEngineConfig {}
@@ -37,12 +38,7 @@ export class FlowiseEngine implements AiEngine {
3738
const response = await this.client.post('', payload);
3839
const message = response.data;
3940
let content = message?.text;
40-
41-
if (content && content.includes('<think>')) {
42-
return content.replace(/<think>[\s\S]*?<\/think>/g, '').trim();
43-
}
44-
45-
return content;
41+
return removeContentTags(content, 'think');
4642
} catch (err: any) {
4743
const message = err.response?.data?.error ?? err.message;
4844
throw new Error('local model issues. details: ' + message);

src/engine/gemini.ts

Lines changed: 2 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,7 @@ import {
77
} from '@google/generative-ai';
88
import axios from 'axios';
99
import { OpenAI } from 'openai';
10+
import { removeContentTags } from '../utils/removeContentTags';
1011
import { AiEngine, AiEngineConfig } from './Engine';
1112

1213
interface GeminiConfig extends AiEngineConfig {}
@@ -72,12 +73,7 @@ export class GeminiEngine implements AiEngine {
7273
});
7374

7475
const content = result.response.text();
75-
76-
if (content && content.includes('<think>')) {
77-
return content.replace(/<think>[\s\S]*?<\/think>/g, '').trim();
78-
}
79-
80-
return content;
76+
return removeContentTags(content, 'think');
8177
} catch (error) {
8278
const err = error as Error;
8379
if (

src/engine/mistral.ts

Lines changed: 2 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
import axios from 'axios';
22
import { OpenAI } from 'openai';
33
import { GenerateCommitMessageErrorEnum } from '../generateCommitMessageFromGitDiff';
4+
import { removeContentTags } from '../utils/removeContentTags';
45
import { tokenCount } from '../utils/tokenCount';
56
import { AiEngine, AiEngineConfig } from './Engine';
67

@@ -58,12 +59,7 @@ export class MistralAiEngine implements AiEngine {
5859
throw Error('No completion choice available.')
5960

6061
let content = message.content as string;
61-
62-
if (content && content.includes('<think>')) {
63-
return content.replace(/<think>[\s\S]*?<\/think>/g, '').trim();
64-
}
65-
66-
return content;
62+
return removeContentTags(content, 'think');
6763
} catch (error) {
6864
const err = error as Error;
6965
if (

src/engine/mlx.ts

Lines changed: 2 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
import axios, { AxiosInstance } from 'axios';
22
import { OpenAI } from 'openai';
3+
import { removeContentTags } from '../utils/removeContentTags';
34
import { AiEngine, AiEngineConfig } from './Engine';
4-
import { chown } from 'fs';
55

66
interface MLXConfig extends AiEngineConfig {}
77

@@ -38,12 +38,7 @@ export class MLXEngine implements AiEngine {
3838
const choices = response.data.choices;
3939
const message = choices[0].message;
4040
let content = message?.content;
41-
42-
if (content && content.includes('<think>')) {
43-
return content.replace(/<think>[\s\S]*?<\/think>/g, '').trim();
44-
}
45-
46-
return content;
41+
return removeContentTags(content, 'think');
4742
} catch (err: any) {
4843
const message = err.response?.data?.error ?? err.message;
4944
throw new Error(`MLX provider error: ${message}`);

src/engine/ollama.ts

Lines changed: 2 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
import axios, { AxiosInstance } from 'axios';
22
import { OpenAI } from 'openai';
3+
import { removeContentTags } from '../utils/removeContentTags';
34
import { AiEngine, AiEngineConfig } from './Engine';
45

56
interface OllamaConfig extends AiEngineConfig {}
@@ -35,12 +36,7 @@ export class OllamaEngine implements AiEngine {
3536

3637
const { message } = response.data;
3738
let content = message?.content;
38-
39-
if (content && content.includes('<think>')) {
40-
return content.replace(/<think>[\s\S]*?<\/think>/g, '').trim();
41-
}
42-
43-
return content;
39+
return removeContentTags(content, 'think');
4440
} catch (err: any) {
4541
const message = err.response?.data?.error ?? err.message;
4642
throw new Error(`Ollama provider error: ${message}`);

src/engine/openAi.ts

Lines changed: 2 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
import axios from 'axios';
22
import { OpenAI } from 'openai';
33
import { GenerateCommitMessageErrorEnum } from '../generateCommitMessageFromGitDiff';
4+
import { removeContentTags } from '../utils/removeContentTags';
45
import { tokenCount } from '../utils/tokenCount';
56
import { AiEngine, AiEngineConfig } from './Engine';
67

@@ -46,12 +47,7 @@ export class OpenAiEngine implements AiEngine {
4647

4748
const message = completion.choices[0].message;
4849
let content = message?.content;
49-
50-
if (content && content.includes('<think>')) {
51-
return content.replace(/<think>[\s\S]*?<\/think>/g, '').trim();
52-
}
53-
54-
return content;
50+
return removeContentTags(content, 'think');
5551
} catch (error) {
5652
const err = error as Error;
5753
if (

src/utils/removeContentTags.ts

Lines changed: 51 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,51 @@
1+
/**
2+
* Removes content wrapped in specified tags from a string
3+
* @param content The content string to process
4+
* @param tag The tag name without angle brackets (e.g., 'think' for '<think></think>')
5+
* @returns The content with the specified tags and their contents removed, and trimmed
6+
*/
7+
export function removeContentTags<T extends string | null | undefined>(content: T, tag: string): T {
8+
if (!content || typeof content !== 'string') {
9+
return content;
10+
}
11+
12+
// Dynamic implementation for other cases
13+
const openTag = `<${tag}>`;
14+
const closeTag = `</${tag}>`;
15+
16+
// Parse the content and remove tags
17+
let result = '';
18+
let skipUntil: number | null = null;
19+
let depth = 0;
20+
21+
for (let i = 0; i < content.length; i++) {
22+
// Check for opening tag
23+
if (content.substring(i, i + openTag.length) === openTag) {
24+
depth++;
25+
if (depth === 1) {
26+
skipUntil = content.indexOf(closeTag, i + openTag.length);
27+
i = i + openTag.length - 1; // Skip the opening tag
28+
continue;
29+
}
30+
}
31+
// Check for closing tag
32+
else if (content.substring(i, i + closeTag.length) === closeTag && depth > 0) {
33+
depth--;
34+
if (depth === 0) {
35+
i = i + closeTag.length - 1; // Skip the closing tag
36+
skipUntil = null;
37+
continue;
38+
}
39+
}
40+
41+
// Only add character if not inside a tag
42+
if (skipUntil === null) {
43+
result += content[i];
44+
}
45+
}
46+
47+
// Normalize spaces (replace multiple spaces with a single space)
48+
result = result.replace(/\s+/g, ' ').trim();
49+
50+
return result as unknown as T;
51+
}

0 commit comments

Comments
 (0)