This commit is contained in:
2026-01-20 10:36:44 +08:00
parent 8e87a8d297
commit 46eb943904

View File

@@ -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;
}