Skip to content

Commit 4a8b8da

Browse files
author
yigeyufu
committed
批处理优化
1 parent e0b8b77 commit 4a8b8da

File tree

7 files changed

+195
-136
lines changed

7 files changed

+195
-136
lines changed

app/server/ai_server/siliconflow.py

Lines changed: 6 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -30,7 +30,11 @@ async def translateObject(text: str, target_lang_code: str = "zh") -> str:
3030

3131

3232
target_lang_name = _lang_to_name(target_lang_code)
33-
prompt = f"将以下AI绘画提示词翻译成{target_lang_name},只输出翻译结果:{text}"
33+
# 处理批量翻译:如果文本包含换行符,说明是多个翻译项
34+
if '\n' in text:
35+
prompt = f"将以下每一行AI绘画提示词翻译成{target_lang_name},每行对应一个翻译结果,保持相同的行数和顺序:\n{text}"
36+
else:
37+
prompt = f"将以下AI绘画提示词翻译成{target_lang_name},只输出翻译结果:{text}"
3438

3539
payload = {
3640
"model": model,
@@ -82,7 +86,7 @@ async def translateObject(text: str, target_lang_code: str = "zh") -> str:
8286
"Content-Type": "application/json"
8387
}
8488

85-
response = requests.post(url, json=payload, headers=headers,timeout=(5,10))
89+
response = requests.post(url, json=payload, headers=headers,timeout=(10,60))
8690
dataResponse = response.json()
8791
if response.status_code != 200:
8892
raise RuntimeError(

app/server/translate/new_translate_api.py

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -6,11 +6,11 @@
66
def api_service_translate(text, from_lang='auto', to_lang='en', apiService='alibaba'):
77
"""
88
统一翻译接口
9-
:param text: 待翻译文本
9+
:param text: 待翻译文本(支持换行符分隔的批量翻译)
1010
:param from_lang: 源语言
1111
:param to_lang: 目标语言
1212
:param apiService: 选择翻译服务,支持 'alibaba', 'bing', 'youdao'
13-
:return: 翻译文本
13+
:return: 翻译文本(批量翻译时返回换行符分隔的结果)
1414
"""
1515
apiService = apiService.lower()
1616
if apiService == 'alibaba':

dist/javascript/main.entry.js

Lines changed: 103 additions & 96 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

dist/javascript/main.entry.js.map

Lines changed: 1 addition & 1 deletion
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

dist/style.css

Lines changed: 1 addition & 1 deletion
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

src/package-lock.json

Lines changed: 0 additions & 7 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

src/src/view/prompt_box/prompt_index.vue

Lines changed: 82 additions & 27 deletions
Original file line numberDiff line numberDiff line change
@@ -1865,7 +1865,7 @@ const processInput = async () => {
18651865
postMessageToWindowsPrompt();
18661866
18671867
// 处理翻译
1868-
const batchSize = 20; // 每批处理的数量
1868+
const batchSize = 50; // 每批处理的数量
18691869
let currentIndex = 0;
18701870
18711871
while (currentIndex < tokens.value.length) {
@@ -1910,47 +1910,102 @@ const processInput = async () => {
19101910
const oneClickTranslatePrompt = async () => {
19111911
19121912
// if (localStorage.getItem('weilin_prompt_ui_translater_setting') == 'translater') {
1913-
const batchSize = 20; // 每批处理的数量
1913+
const batchSize = 50; // 每批处理的数量
19141914
let currentIndex = 0;
1915+
let processedCount = 0;
1916+
let totalCount = 0;
1917+
1918+
// 计算需要翻译的总数
1919+
for (let i = 0; i < tokens.value.length; i++) {
1920+
const token = tokens.value[i];
1921+
if (token.translate && (token.translate === token.text || /[a-zA-Z]/.test(token.translate)) && !(typeof token.text === 'string' && token.text.startsWith('<wlr'))) {
1922+
totalCount++;
1923+
}
1924+
}
1925+
1926+
console.log(`开始批量翻译,总共需要翻译 ${totalCount} 个项目,批量大小: ${batchSize}`);
19151927
19161928
while (currentIndex < tokens.value.length) {
19171929
const endIndex = Math.min(currentIndex + batchSize, tokens.value.length);
1918-
const promises = [];
1930+
const batchData = [];
1931+
const tokenIndices = [];
19191932
1933+
// 收集本批次需要翻译的token
19201934
for (let i = currentIndex; i < endIndex; i++) {
19211935
const token = tokens.value[i];
19221936
// 检查translate是否包含英文字符 /[a-zA-Z]/.test(token.translate)
19231937
if (token.translate && (token.translate === token.text || /[a-zA-Z]/.test(token.translate)) && !(typeof token.text === 'string' && token.text.startsWith('<wlr'))) {
1924-
// 提取需要翻译的文本
1925-
const textToTranslate = token.text;
1926-
const promise = new Promise((resolve) => {
1927-
1928-
// if (localStorage.getItem('weilin_prompt_ui_translater_setting') == 'network') {
1929-
// translate.request.translateText(textToTranslate, function (data) {
1930-
// if (data.result > 0) {
1931-
// const translatedText = data.text.map(item => item.replace(/[\[\]“”]/g, '')).join(', ');
1932-
// tokens.value[i].translate = translatedText;
1933-
// }
1934-
// resolve();
1935-
// });
1936-
// } else {
1937-
translatorApi.translaterText('', textToTranslate).then(res => {
1938-
// console.log(res)
1939-
if (res.data.length > 0) {
1940-
tokens.value[i].translate = res.data;
1938+
batchData.push(token.text);
1939+
tokenIndices.push(i);
1940+
}
1941+
}
1942+
1943+
if (batchData.length > 0) {
1944+
console.log(`处理第 ${Math.floor(currentIndex / batchSize) + 1} 批,翻译 ${batchData.length} 个项目`);
1945+
1946+
// 批量翻译:将多个文本用换行符连接
1947+
const combinedText = batchData.join('\n');
1948+
try {
1949+
// 设置超时处理
1950+
const timeoutPromise = new Promise((_, reject) =>
1951+
setTimeout(() => reject(new Error('翻译请求超时')), 30000)
1952+
);
1953+
1954+
const res = await Promise.race([
1955+
translatorApi.translaterText('', combinedText),
1956+
timeoutPromise
1957+
]);
1958+
1959+
if (res.data && res.data.length > 0) {
1960+
// 拆分翻译结果
1961+
const translatedResults = res.data.split('\n');
1962+
1963+
// 验证结果数量匹配
1964+
if (translatedResults.length === batchData.length) {
1965+
// 将翻译结果回填到对应的token
1966+
for (let j = 0; j < tokenIndices.length; j++) {
1967+
const tokenIndex = tokenIndices[j];
1968+
if (j < translatedResults.length && translatedResults[j].trim()) {
1969+
tokens.value[tokenIndex].translate = translatedResults[j].trim();
1970+
processedCount++;
1971+
}
19411972
}
1942-
resolve();
1943-
})
1944-
// }
1945-
});
1946-
promises.push(promise);
1973+
console.log(`${Math.floor(currentIndex / batchSize) + 1} 批翻译完成,已处理 ${processedCount}/${totalCount}`);
1974+
} else {
1975+
throw new Error(`翻译结果数量不匹配: 期望${batchData.length}个,实际${translatedResults.length}`);
1976+
}
1977+
} else {
1978+
throw new Error('翻译返回结果为空');
1979+
}
1980+
} catch (e) {
1981+
console.error(`${Math.floor(currentIndex / batchSize) + 1} 批批量翻译失败:`, e);
1982+
console.log('回退到逐个翻译模式...');
1983+
1984+
// 回退到逐个翻译
1985+
let fallbackCount = 0;
1986+
for (let j = 0; j < tokenIndices.length; j++) {
1987+
const tokenIndex = tokenIndices[j];
1988+
const textToTranslate = batchData[j];
1989+
1990+
try {
1991+
const res = await translatorApi.translaterText('', textToTranslate);
1992+
if (res.data && res.data.length > 0) {
1993+
tokens.value[tokenIndex].translate = res.data;
1994+
processedCount++;
1995+
fallbackCount++;
1996+
}
1997+
} catch (fallbackError) {
1998+
console.error(`单个翻译失败 (${textToTranslate}):`, fallbackError);
1999+
}
2000+
}
2001+
console.log(`回退翻译完成,成功 ${fallbackCount}`);
19472002
}
19482003
}
19492004
1950-
// 等待当前批次完成
1951-
await Promise.all(promises);
19522005
currentIndex = endIndex;
19532006
}
2007+
2008+
console.log(`批量翻译完成!总共处理 ${processedCount}/${totalCount} 个项目`);
19542009
// }
19552010
19562011
// else {

0 commit comments

Comments
 (0)