From 53ff9bd3071e798d130113551b4b290053d21a01 Mon Sep 17 00:00:00 2001 From: Silence_Lurker Date: Tue, 20 Jan 2026 10:36:44 +0800 Subject: [PATCH] fix --- SL/bus/api/ModelCaller.js | 33 +++++++++++++++++++++------------ 1 file changed, 21 insertions(+), 12 deletions(-) diff --git a/SL/bus/api/ModelCaller.js b/SL/bus/api/ModelCaller.js index 4b024fb..cb1761c 100644 --- a/SL/bus/api/ModelCaller.js +++ b/SL/bus/api/ModelCaller.js @@ -268,30 +268,39 @@ export default class ModelCaller { * 用于在手动构造请求时模拟 ST 后端行为 */ _buildProfilePayload(targetProfile) { - // 1. 全量继承 Profile 属性,防止遗漏自定义字段 (如 custom_url, user_name 等) + // 1. 全量继承 Profile 属性 const payload = { ...targetProfile }; // 2. 规范化关键字段 - // ST 的 Profile 里模型名可能叫 openai_model, claude_model 等,统一映射为 model + // ST 的 Profile 里模型名可能叫 openai_model if (!payload.model) { payload.model = payload.openai_model || payload.claude_model || payload.mistral_model || payload.text_generation_webui_model || ''; } - // 3. 确保 chat_completion_source 存在 - if (!payload.chat_completion_source) { - payload.chat_completion_source = 'openai'; + // 3. 强制修正 URL 映射 (解决 400 错误的核心) + // Profile 原始数据里可能是 api-url (中划线), api_url, custom_url 等 + const rawUrl = payload['api-url'] || payload['api_url'] || payload.custom_url || payload.url; + + if (rawUrl) { + // OpenAI 模式认 reverse_proxy + payload.reverse_proxy = rawUrl; + // Custom 模式认 custom_url (双保险) + payload.custom_url = rawUrl; + // 某些后端可能需要这个 + payload.openai_reverse_proxy = rawUrl; } - // 4. 处理 URL 映射 (OpenAI 兼容接口通常需要 reverse_proxy) - // 如果 Profile 里只有 custom_url 或 api_url,尝试映射给 reverse_proxy - if (!payload.reverse_proxy && (payload.custom_url || payload.api_url)) { - payload.reverse_proxy = payload.custom_url || payload.api_url; - } + // 4. 强制指定 Source 为 OpenAI + // 我们的 ModelCaller._fetchFakeStream 是按 OpenAI SSE 格式解析的 + // 只要 reverse_proxy 设置正确,后端就会按 OpenAI 协议转发 + payload.chat_completion_source = 'openai'; - // 5. 补充默认采样参数 (如果 Profile 里完全缺失) + // 5. 补充默认采样参数 (防止 undefined) if (payload.temperature === undefined) payload.temperature = 1; if (payload.max_tokens === undefined) payload.max_tokens = 2000; - // 注意:top_p 等如果为 undefined,通常后端会用默认值,这里暂不强行赋值,以免覆盖后端逻辑 + if (payload.top_p === undefined) payload.top_p = 1; + if (payload.frequency_penalty === undefined) payload.frequency_penalty = 0; + if (payload.presence_penalty === undefined) payload.presence_penalty = 0; return payload; }