fix: tone error (#382)

This commit is contained in:
Gabe
2025-11-06 20:15:15 +08:00
parent 7eb64a463b
commit 89b2bbe9ac
5 changed files with 91 additions and 16 deletions

View File

@@ -1,4 +1,4 @@
# 自定义接口示例
# 自定义接口说明及示例
## 默认接口规范
@@ -21,7 +21,7 @@ Response
[
{
"text": "你好", // 译文
"src": "en" // 原文语言
"src": "en" // 原文语言
}
]
```
@@ -33,12 +33,36 @@ v2.0.4版后亦支持以下 Response 格式
"translations": [ // 译文列表
{
"text": "你好", // 译文
"src": "en" // 原文语言
"src": "en" // 原文语言
}
]
}
```
## Prompt 相关
`Prompt` 可替换占位符:
```js
`{{from}}` // 原文语言名称
`{{to}}` // 目标语言名称
`{{fromLang}}` // 原文语言代码
`{{toLang}}` // 目标语言代码
`{{text}}` // 原文
`{{tone}}` // 风格
`{{title}}` // 页面标题
`{{description}}` // 页面描述
```
Hook 中 `Prompt` 类型说明:
```js
`systemPrompt` // 聚合翻译 System Prompt
`nobatchPrompt` // 非聚合翻译 System Prompt
`nobatchUserPrompt` // 非聚合翻译 User Prompt
`subtitlePrompt` // 字幕翻译 System Prompt
```
## 谷歌翻译接口
> 此接口不支持聚合
@@ -101,7 +125,10 @@ async (args) => {
content: JSON.stringify({
targetLanguage: args.toLang,
segments: args.texts.map((text, id) => ({ id, text })),
glossary: {},
title: "", // 可省略
description: "", // 可省略
glossary: {}, // 可省略
tone: "", // 可省略
}),
},
],
@@ -134,7 +161,10 @@ async (args) => {
content: JSON.stringify({
targetLanguage: args.toLang,
segments: args.texts.map((text, id) => ({ id, text })),
glossary: {},
title: "", // 可省略
description: "", // 可省略
glossary: {}, // 可省略
tone: "", // 可省略
}),
},
],
@@ -295,6 +325,7 @@ Hook参数里面的语言含义说明
["cs", "Czech - Čeština"],
["da", "Danish - Dansk"],
["nl", "Dutch - Nederlands"],
["fa", "Persian - فارسی"],
["fi", "Finnish - Suomi"],
["fr", "French - Français"],
["de", "German - Deutsch"],

View File

@@ -419,7 +419,7 @@ export const apiTranslate = async ({
toLang,
apiSetting = DEFAULT_API_SETTING,
docInfo = {},
glossary = {},
glossary,
useCache = true,
usePool = true,
}) => {

View File

@@ -30,6 +30,11 @@ import {
defaultSubtitlePrompt,
defaultNobatchPrompt,
defaultNobatchUserPrompt,
INPUT_PLACE_TONE,
INPUT_PLACE_TITLE,
INPUT_PLACE_DESCRIPTION,
INPUT_PLACE_TO_LANG,
INPUT_PLACE_FROM_LANG,
} from "../config";
import { msAuth } from "../libs/auth";
import { genDeeplFree } from "./deepl";
@@ -62,36 +67,62 @@ const keyPick = (apiSlug, key = "", cacheMap) => {
return keys[curIndex];
};
const genSystemPrompt = ({ systemPrompt, from, to }) =>
const genSystemPrompt = ({
systemPrompt,
tone,
from,
to,
fromLang,
toLang,
texts,
docInfo: { title = "", description = "" } = {},
}) =>
systemPrompt
.replaceAll(INPUT_PLACE_TITLE, title)
.replaceAll(INPUT_PLACE_DESCRIPTION, description)
.replaceAll(INPUT_PLACE_TONE, tone)
.replaceAll(INPUT_PLACE_FROM, from)
.replaceAll(INPUT_PLACE_TO, to);
.replaceAll(INPUT_PLACE_TO, to)
.replaceAll(INPUT_PLACE_FROM_LANG, fromLang)
.replaceAll(INPUT_PLACE_TO_LANG, toLang)
.replaceAll(INPUT_PLACE_TEXT, texts[0]);
const genUserPrompt = ({
nobatchUserPrompt,
useBatchFetch,
tone,
glossary = {},
glossary,
from,
to,
fromLang,
toLang,
texts,
docInfo,
docInfo: { title = "", description = "" } = {},
}) => {
if (useBatchFetch) {
return JSON.stringify({
const promptObj = {
targetLanguage: toLang,
title: docInfo.title,
description: docInfo.description,
segments: texts.map((text, i) => ({ id: i, text })),
glossary,
tone,
});
};
title && (promptObj.title = title);
description && (promptObj.description = description);
glossary &&
Object.keys(glossary).length !== 0 &&
(promptObj.glossary = glossary);
tone && (promptObj.tone = tone);
return JSON.stringify(promptObj);
}
return nobatchUserPrompt
.replaceAll(INPUT_PLACE_TITLE, title)
.replaceAll(INPUT_PLACE_DESCRIPTION, description)
.replaceAll(INPUT_PLACE_TONE, tone)
.replaceAll(INPUT_PLACE_FROM, from)
.replaceAll(INPUT_PLACE_TO, to)
.replaceAll(INPUT_PLACE_FROM_LANG, fromLang)
.replaceAll(INPUT_PLACE_TO_LANG, toLang)
.replaceAll(INPUT_PLACE_TEXT, texts[0]);
};
@@ -647,6 +678,7 @@ export const genTransReq = async ({ reqHook, ...args }) => {
customHeader,
customBody,
events,
tone,
} = args;
if (API_SPE_TYPES.mulkeys.has(apiType)) {
@@ -662,6 +694,11 @@ export const genTransReq = async ({ reqHook, ...args }) => {
systemPrompt: useBatchFetch ? systemPrompt : nobatchPrompt,
from,
to,
fromLang,
toLang,
texts,
docInfo,
tone,
});
args.userPrompt = !!events
? JSON.stringify(events)
@@ -674,6 +711,7 @@ export const genTransReq = async ({ reqHook, ...args }) => {
toLang,
texts,
docInfo,
tone,
glossary,
});
}

View File

@@ -9,7 +9,12 @@ export const DEFAULT_CONTEXT_SIZE = 3; // 上下文会话数量
export const INPUT_PLACE_URL = "{{url}}"; // 占位符
export const INPUT_PLACE_FROM = "{{from}}"; // 占位符
export const INPUT_PLACE_TO = "{{to}}"; // 占位符
export const INPUT_PLACE_FROM_LANG = "{{fromLang}}"; // 占位符
export const INPUT_PLACE_TO_LANG = "{{toLang}}"; // 占位符
export const INPUT_PLACE_TEXT = "{{text}}"; // 占位符
export const INPUT_PLACE_TONE = "{{tone}}"; // 占位符
export const INPUT_PLACE_TITLE = "{{title}}"; // 占位符
export const INPUT_PLACE_DESCRIPTION = "{{description}}"; // 占位符
export const INPUT_PLACE_KEY = "{{key}}"; // 占位符
export const INPUT_PLACE_MODEL = "{{model}}"; // 占位符

View File

@@ -32,6 +32,7 @@ export default function ReusableAutocomplete({
name: name,
value: newValue,
},
preventDefault: () => {},
};
onChange(syntheticEvent);
}