From 943af814a12b34d1306723001ad23f1ccfd6dc1e Mon Sep 17 00:00:00 2001
From: Rayy Summers <106456682+RayySummers@users.noreply.github.com>
Date: Wed, 5 Aug 2026 21:21:36 +0800
Subject: [PATCH 1/3] =?UTF-8?q?feat:=20=E6=9B=B4=E6=96=B0=20DeepSeek=20?=
=?UTF-8?q?=E6=A8=A1=E5=9E=8B=E5=B9=B6=E6=94=AF=E6=8C=81=20Responses=20API?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
---
docs/config/translation-engines.md | 2 +-
entrypoints/service/deepseek.ts | 47 ++++++++++++++++++++++++++----
entrypoints/service/newapi.ts | 2 +-
entrypoints/utils/option.ts | 2 +-
entrypoints/utils/template.ts | 24 +++++++++++++--
5 files changed, 67 insertions(+), 10 deletions(-)
diff --git a/docs/config/translation-engines.md b/docs/config/translation-engines.md
index c3f238b..dadd62f 100644
--- a/docs/config/translation-engines.md
+++ b/docs/config/translation-engines.md
@@ -48,7 +48,7 @@
2. 点击设置图标,进入设置页面
3. 选择 "翻译引擎" 选项卡
4. 在引擎列表中选择 "DeepSeek"
-5. 选择 `deepseek-chat` 模型,并填入配置信息
+5. 选择 `deepseek-v4-flash` 模型,并填入配置信息
diff --git a/entrypoints/service/deepseek.ts b/entrypoints/service/deepseek.ts
index c7c30f2..157cf97 100644
--- a/entrypoints/service/deepseek.ts
+++ b/entrypoints/service/deepseek.ts
@@ -1,8 +1,14 @@
import { method, urls } from "../utils/constant";
-import { deepseekMsgTemplate } from "../utils/template";
+import { deepseekMsgTemplate, deepseekResponsesMsgTemplate, getCurrentModel } from "../utils/template";
import { config } from "@/entrypoints/utils/config";
import { contentPostHandler } from "@/entrypoints/utils/check";
+// deepseek-v4-* 系列模型走官方的 Responses API(POST /responses)
+// 其他模型(含自定义模型)走 OpenAI 兼容的 chat completions 接口
+function useResponsesApi(model: string) {
+ return model.startsWith("deepseek-v4-");
+}
+
async function deepseek(message: any) {
try {
const headers = new Headers({
@@ -10,12 +16,21 @@ async function deepseek(message: any) {
'Authorization': `Bearer ${config.token[config.service]}`
});
- const url = config.proxy[config.service] || urls[config.service];
+ const model = getCurrentModel();
+ const endpoint = config.proxy[config.service] || urls[config.service];
+
+ // Responses API 与 chat completions 的端点不同,把 /chat/completions 路径替换为 /responses
+ const isResponses = useResponsesApi(model);
+ const url = isResponses
+ ? endpoint.replace(/\/chat\/completions\/?$/, '/responses')
+ : endpoint;
const resp = await fetch(url, {
method: method.POST,
headers,
- body: deepseekMsgTemplate(message.origin)
+ body: isResponses
+ ? deepseekResponsesMsgTemplate(message.origin)
+ : deepseekMsgTemplate(message.origin)
});
if (!resp.ok) {
@@ -23,11 +38,33 @@ async function deepseek(message: any) {
}
const result = await resp.json();
- return contentPostHandler(result.choices[0].message.content);
+
+ // Responses API: output 数组中的 message 类型内容;chat completions: choices[0].message.content
+ if (isResponses) {
+ if (typeof result.output_text === 'string' && result.output_text) {
+ return contentPostHandler(result.output_text);
+ }
+ const output = result.output || [];
+ const text = output
+ .filter((item: any) => item.type === 'message' && item.content)
+ .flatMap((item: any) => item.content)
+ .filter((part: any) => part.type === 'output_text')
+ .map((part: any) => part.text)
+ .join('');
+ if (text) {
+ return contentPostHandler(text);
+ }
+ throw new Error('翻译失败: 上游未返回内容');
+ }
+
+ if (result.choices && result.choices.length > 0) {
+ return contentPostHandler(result.choices[0].message.content);
+ }
+ throw new Error('翻译失败: 上游未返回内容');
} catch (error) {
console.error('API调用失败:', error);
throw error;
}
}
-export default deepseek;
\ No newline at end of file
+export default deepseek;
diff --git a/entrypoints/service/newapi.ts b/entrypoints/service/newapi.ts
index 87ac161..05cbeb8 100644
--- a/entrypoints/service/newapi.ts
+++ b/entrypoints/service/newapi.ts
@@ -1,5 +1,5 @@
import { method, urls } from "../utils/constant";
-import {commonMsgTemplate, deepseekMsgTemplate} from "../utils/template";
+import {commonMsgTemplate} from "../utils/template";
import { config } from "@/entrypoints/utils/config";
import { contentPostHandler } from "@/entrypoints/utils/check";
diff --git a/entrypoints/utils/option.ts b/entrypoints/utils/option.ts
index 8293314..4c70270 100644
--- a/entrypoints/utils/option.ts
+++ b/entrypoints/utils/option.ts
@@ -186,7 +186,7 @@ export const models = new Map>([
[services.infini, ["llama-2-13b-chat", "llama-3.3-70b-instruct", "qwen2.5-14b-instruct", "gemma-2-27b-it", "glm-4-9b-chat", customModelString]],
[services.baichuan, ["Baichuan4-Air", "Baichuan4-Turbo", "Baichuan4", customModelString]],
[services.lingyi, ["yi-lightning", customModelString]],
- [services.deepseek, ["deepseek-chat", "deepseek-reasoner", customModelString]],
+ [services.deepseek, ["deepseek-v4-flash", "deepseek-v4-pro", customModelString]],
[services.minimax, ["chatcompletion_v2"]],
[services.jieyue, ["step-1-8k", customModelString]],
[services.huanYuan, ["hunyuan-turbos-latest", "hunyuan-t1-latest", "hunyuan-a13b", "hunyuan-lite", "hunyuan-standard", customModelString]],
diff --git a/entrypoints/utils/template.ts b/entrypoints/utils/template.ts
index 865b492..4487cd6 100644
--- a/entrypoints/utils/template.ts
+++ b/entrypoints/utils/template.ts
@@ -25,12 +25,32 @@ export function commonMsgTemplate(origin: string) {
}
// deepseek
-export function deepseekMsgTemplate(origin: string) {
+export function getCurrentModel() {
// 检测是否使用自定义模型
let model = config.model[config.service] === customModelString ? config.customModel[config.service] : config.model[config.service]
// 删除模型名称中的中文括号及其内容,如"gpt-4(推荐)" -> "gpt-4"
- model = model.replace(/(.*)/g, "");
+ return model.replace(/(.*)/g, "");
+}
+
+// DeepSeek Responses API 格式(POST /responses),仅 deepseek-v4-* 系列模型支持
+// 参考: https://api-docs.deepseek.com/guides/responses_api/
+export function deepseekResponsesMsgTemplate(origin: string) {
+ let system = config.system_role[config.service] || defaultOption.system_role;
+ let user = (config.user_role[config.service] || defaultOption.user_role)
+ .replace('{{to}}', config.to).replace('{{origin}}', origin);
+
+ return JSON.stringify({
+ 'model': getCurrentModel(),
+ 'instructions': system,
+ 'input': user,
+ 'temperature': 0.7,
+ })
+}
+
+// DeepSeek chat completions 格式(POST /chat/completions),兼容自定义模型与第三方 OpenAI 兼容端点
+export function deepseekMsgTemplate(origin: string) {
+ let model = getCurrentModel();
let system = config.system_role[config.service] || defaultOption.system_role;
let user = (config.user_role[config.service] || defaultOption.user_role)
From 1cb1dcd87cb30b5bfa464fdd7356c04ee3672641 Mon Sep 17 00:00:00 2001
From: Rayy Summers <106456682+RayySummers@users.noreply.github.com>
Date: Wed, 5 Aug 2026 21:23:46 +0800
Subject: [PATCH 2/3] =?UTF-8?q?feat:=20DeepSeek=20=E5=A2=9E=E5=8A=A0=20API?=
=?UTF-8?q?=20=E6=A0=BC=E5=BC=8F=E5=88=87=E6=8D=A2=E9=80=89=E9=A1=B9?=
=?UTF-8?q?=EF=BC=88=E8=87=AA=E5=8A=A8/Responses/Chat=EF=BC=89?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
---
components/Main.vue | 21 +++++++++++++++++++++
entrypoints/service/deepseek.ts | 7 ++++++-
entrypoints/utils/model.ts | 2 ++
entrypoints/utils/option.ts | 6 ++++++
4 files changed, 35 insertions(+), 1 deletion(-)
diff --git a/components/Main.vue b/components/Main.vue
index a4f1bce..d8615f3 100644
--- a/components/Main.vue
+++ b/components/Main.vue
@@ -398,6 +398,25 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
@@ -760,6 +779,8 @@ let compute = ref({
showNewAPI: computed(() => servicesType.isNewApi(config.value.service)),
// 14、是否显示Azure OpenAI端点配置
showAzureOpenaiEndpoint: computed(() => servicesType.isAzureOpenai(config.value.service)),
+ // 15、是否显示 DeepSeek API 格式配置
+ showDeepseekApiType: computed(() => config.value.service === 'deepseek'),
})
// 监听主题变化
diff --git a/entrypoints/service/deepseek.ts b/entrypoints/service/deepseek.ts
index 157cf97..efd6f65 100644
--- a/entrypoints/service/deepseek.ts
+++ b/entrypoints/service/deepseek.ts
@@ -5,8 +5,13 @@ import { contentPostHandler } from "@/entrypoints/utils/check";
// deepseek-v4-* 系列模型走官方的 Responses API(POST /responses)
// 其他模型(含自定义模型)走 OpenAI 兼容的 chat completions 接口
+// API 格式由设置中的 deepseekApiType 控制:'responses' 强制 Responses API,'chat' 强制 Chat Completion,'auto' 按模型支持情况自动选择
function useResponsesApi(model: string) {
- return model.startsWith("deepseek-v4-");
+ const apiType = config.deepseekApiType;
+ if (apiType === 'responses') return true;
+ if (apiType === 'chat') return false;
+ // auto: v4-flash 官方原生支持 Responses API;v4-pro 支持尚在灰度,走 chat completions 最稳
+ return model === 'deepseek-v4-flash';
}
async function deepseek(message: any) {
diff --git a/entrypoints/utils/model.ts b/entrypoints/utils/model.ts
index 915e58c..c65fba2 100644
--- a/entrypoints/utils/model.ts
+++ b/entrypoints/utils/model.ts
@@ -53,6 +53,7 @@ export class Config {
translationStatus: boolean; // 是否启用全文翻译进度面板
inputBoxTranslationTrigger: string; // 输入框翻译触发方式
inputBoxTranslationTarget: string; // 输入框翻译目标语言
+ deepseekApiType: string; // DeepSeek API 格式: 'auto' | 'responses' | 'chat'
constructor() {
this.on = true;
@@ -98,6 +99,7 @@ export class Config {
this.translationStatus = true; // 默认启用翻译进度面板
this.inputBoxTranslationTrigger = 'disabled'; // 默认关闭输入框翻译
this.inputBoxTranslationTarget = 'en'; // 默认翻译成英文
+ this.deepseekApiType = 'auto'; // DeepSeek 默认自动选择 API 格式
}
}
diff --git a/entrypoints/utils/option.ts b/entrypoints/utils/option.ts
index 4c70270..b0139dc 100644
--- a/entrypoints/utils/option.ts
+++ b/entrypoints/utils/option.ts
@@ -220,6 +220,12 @@ export const options = {
{value: false, label: "关闭"},
],
form: [{value: "auto", label: "自动检测"}],
+ // DeepSeek API 格式(仅 DeepSeek 服务显示)
+ deepseekApiType: [
+ {value: "auto", label: "自动(推荐)"},
+ {value: "responses", label: "Responses API"},
+ {value: "chat", label: "Chat Completion"},
+ ],
to: [
{value: "zh-Hans", label: "中文"},
{value: "en", label: "英语"},
From a465b76e80b8f5e56930fad621a6ca6aec727111 Mon Sep 17 00:00:00 2001
From: Rayy Summers <106456682+RayySummers@users.noreply.github.com>
Date: Wed, 5 Aug 2026 21:34:50 +0800
Subject: [PATCH 3/3] =?UTF-8?q?refactor:=20=E5=93=8D=E5=BA=94=20code=20rev?=
=?UTF-8?q?iew=E2=80=94=E2=80=94=E5=81=A5=E5=A3=AE=E5=8C=96=E7=AB=AF?=
=?UTF-8?q?=E7=82=B9=E6=9E=84=E9=80=A0=E5=B9=B6=E7=BB=9F=E4=B8=80=20DeepSe?=
=?UTF-8?q?ek=20=E6=B8=A9=E5=BA=A6=E9=80=BB=E8=BE=91?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
---
entrypoints/service/deepseek.ts | 10 ++++++----
entrypoints/utils/template.ts | 29 +++++++++++++++++++++--------
2 files changed, 27 insertions(+), 12 deletions(-)
diff --git a/entrypoints/service/deepseek.ts b/entrypoints/service/deepseek.ts
index efd6f65..39e3965 100644
--- a/entrypoints/service/deepseek.ts
+++ b/entrypoints/service/deepseek.ts
@@ -24,11 +24,13 @@ async function deepseek(message: any) {
const model = getCurrentModel();
const endpoint = config.proxy[config.service] || urls[config.service];
- // Responses API 与 chat completions 的端点不同,把 /chat/completions 路径替换为 /responses
+ // 去掉可能存在的 /chat/completions 后缀得到 base URL,再按所选 API 格式拼接端点。
+ // 这样无论配置的是完整端点(.../chat/completions)还是 base URL(.../v1),
+ // payload 与端点都由同一个 isResponses 决定,不会出现格式错配。
const isResponses = useResponsesApi(model);
- const url = isResponses
- ? endpoint.replace(/\/chat\/completions\/?$/, '/responses')
- : endpoint;
+ // 去掉 /chat/completions 后缀和多余的尾斜杠,得到干净的 base URL
+ const baseUrl = endpoint.replace(/\/chat\/completions\/?$/, '').replace(/\/+$/, '');
+ const url = isResponses ? `${baseUrl}/responses` : `${baseUrl}/chat/completions`;
const resp = await fetch(url, {
method: method.POST,
diff --git a/entrypoints/utils/template.ts b/entrypoints/utils/template.ts
index 4487cd6..2f13889 100644
--- a/entrypoints/utils/template.ts
+++ b/entrypoints/utils/template.ts
@@ -33,24 +33,37 @@ export function getCurrentModel() {
return model.replace(/(.*)/g, "");
}
+// DeepSeek 温度参数:thinking 模式(deepseek-reasoner)下 temperature 无效,不传;其余模型统一 0.7
+// 两种 API 格式共用同一逻辑,保证行为一致
+function deepseekTemperature(model: string): number | undefined {
+ return model === 'deepseek-reasoner' ? undefined : 0.7;
+}
+
// DeepSeek Responses API 格式(POST /responses),仅 deepseek-v4-* 系列模型支持
// 参考: https://api-docs.deepseek.com/guides/responses_api/
export function deepseekResponsesMsgTemplate(origin: string) {
+ const model = getCurrentModel();
let system = config.system_role[config.service] || defaultOption.system_role;
let user = (config.user_role[config.service] || defaultOption.user_role)
.replace('{{to}}', config.to).replace('{{origin}}', origin);
- return JSON.stringify({
- 'model': getCurrentModel(),
+ const payload: any = {
+ 'model': model,
'instructions': system,
'input': user,
- 'temperature': 0.7,
- })
+ };
+
+ const temperature = deepseekTemperature(model);
+ if (temperature !== undefined) {
+ payload.temperature = temperature;
+ }
+
+ return JSON.stringify(payload);
}
// DeepSeek chat completions 格式(POST /chat/completions),兼容自定义模型与第三方 OpenAI 兼容端点
export function deepseekMsgTemplate(origin: string) {
- let model = getCurrentModel();
+ const model = getCurrentModel();
let system = config.system_role[config.service] || defaultOption.system_role;
let user = (config.user_role[config.service] || defaultOption.user_role)
@@ -64,9 +77,9 @@ export function deepseekMsgTemplate(origin: string) {
]
};
- // 如果不是 deepseek-reasoner 模型,则添加 temperature
- if (model !== 'deepseek-reasoner') {
- payload.temperature = 0.7;
+ const temperature = deepseekTemperature(model);
+ if (temperature !== undefined) {
+ payload.temperature = temperature;
}
return JSON.stringify(payload);