优化 callNccsAI 函数,增强配置管理和兼容性,自动收集额外参数,改进日志记录

This commit is contained in:
2026-01-20 10:03:34 +08:00
parent 56017782bb
commit 8f2b91c36c

View File

@@ -60,43 +60,69 @@ export async function callNccsAI(messages, options = {}) {
return null; return null;
} }
const apiSettings = getNccsApiSettings(); const settings = getNccsApiSettings();
const finalOptions = {
...apiSettings,
...options
};
if (finalOptions.apiMode !== 'sillytavern_preset') { // 0. 全局开关检查
if (!finalOptions.apiUrl || !finalOptions.model || !finalOptions.apiKey) { if (settings.nccsEnabled === false) {
// 暂不阻断,仅作为配置读取,保持兼容性
}
// 1. 基础配置确定 (options 覆盖 settings)
const activeMode = options.apiMode || settings.apiMode;
const activeUrl = options.apiUrl || settings.apiUrl;
const activeKey = options.apiKey || settings.apiKey;
const activeModel = options.model || settings.model;
const activeProfile = options.tavernProfile || settings.tavernProfile;
const activeMaxTokens = options.maxTokens ?? settings.maxTokens;
const activeTemperature = options.temperature ?? settings.temperature;
const activeFakeStream = options.useFakeStream ?? settings.useFakeStream;
if (activeMode !== 'sillytavern_preset') {
if (!activeUrl || !activeModel || !activeKey) {
console.warn("[Amily2-Nccs外交部] API配置不完整无法调用AI"); console.warn("[Amily2-Nccs外交部] API配置不完整无法调用AI");
toastr.error("API配置不完整请检查URL、Key和模型配置。", "Nccs-外交部"); toastr.error("API配置不完整请检查URL、Key和模型配置。", "Nccs-外交部");
return null; return null;
} }
} }
// [兼容性修复] 自动收集 options 中的额外参数到 params防止 ModelCaller 丢失 top_p 等参数
const standardKeys = [
'apiMode', 'apiUrl', 'apiKey', 'model',
'maxTokens', 'temperature', 'tavernProfile', 'useFakeStream',
'params'
];
const extraParams = {};
Object.keys(options).forEach(key => {
if (!standardKeys.includes(key)) {
extraParams[key] = options[key];
}
});
// 合并显式的 options.params 和 收集到的 extraParams
const finalParams = { ...extraParams, ...(options.params || {}) };
// ============================================================ // ============================================================
// 尝试路径 A: 新版 Amily2Bus ModelCaller (支持 FakeStream) // 尝试路径 A: 新版 Amily2Bus ModelCaller (支持 FakeStream)
// ============================================================ // ============================================================
if (nccsCtx && nccsCtx.model) { if (nccsCtx && nccsCtx.model) {
try { try {
nccsCtx.log('Main', 'info', `[v2 尝试通过 ModelCaller 调用 (${finalOptions.useFakeStream ? 'FakeStream' : 'Standard'})...`); nccsCtx.log('Main', 'info', `[v2] 尝试通过 ModelCaller 调用 (${activeFakeStream ? 'FakeStream' : 'Standard'})...`);
const Options = nccsCtx.model.Options; const builder = nccsCtx.model.Options.builder()
const builder = Options.builder() .setFakeStream(activeFakeStream)
.setFakeStream(finalOptions.useFakeStream) .setMaxTokens(activeMaxTokens)
.setMaxTokens(finalOptions.maxTokens) .setTemperature(activeTemperature)
.setTemperature(finalOptions.temperature) .setParams(finalParams);
.setParams(options.params || {});
if (finalOptions.apiMode === 'sillytavern_preset') { if (activeMode === 'sillytavern_preset') {
builder.setMode('preset') builder.setMode('preset')
.setPresetId(finalOptions.tavernProfile) .setPresetId(activeProfile)
.setModel(finalOptions.model); .setModel(activeModel);
} else { } else {
builder.setMode('direct') builder.setMode('direct')
.setApiUrl(finalOptions.apiUrl) .setApiUrl(activeUrl)
.setApiKey(finalOptions.apiKey) .setApiKey(activeKey)
.setModel(finalOptions.model); .setModel(activeModel);
} }
// 发起请求 // 发起请求
@@ -123,21 +149,34 @@ export async function callNccsAI(messages, options = {}) {
// ============================================================ // ============================================================
// 尝试路径 B: 旧版 Legacy 方法 (Fallback) // 尝试路径 B: 旧版 Legacy 方法 (Fallback)
// ============================================================ // ============================================================
// 构建 Legacy 兼容对象
const legacyOptions = {
apiMode: activeMode,
apiUrl: activeUrl,
apiKey: activeKey,
model: activeModel,
tavernProfile: activeProfile,
maxTokens: activeMaxTokens,
temperature: activeTemperature,
useFakeStream: activeFakeStream,
...finalParams // 将额外参数直接展平回 legacyOptions 根目录
};
try { try {
console.groupCollapsed(`[Amily2-Nccs] 降级使用 Legacy API 调用`); console.groupCollapsed(`[Amily2-Nccs] 降级使用 Legacy API 调用`);
console.log("Fallback Mode Active"); console.log("Fallback Mode Active");
let responseContent; let responseContent;
switch (finalOptions.apiMode) { switch (activeMode) {
case 'openai_test': case 'openai_test':
responseContent = await callNccsOpenAITest(messages, finalOptions); responseContent = await callNccsOpenAITest(messages, legacyOptions);
break; break;
case 'sillytavern_preset': case 'sillytavern_preset':
responseContent = await callNccsSillyTavernPreset(messages, finalOptions); responseContent = await callNccsSillyTavernPreset(messages, legacyOptions);
break; break;
default: default:
console.error(`未支持的 API 模式: ${finalOptions.apiMode}`); console.error(`未支持的 API 模式: ${activeMode}`);
return null; return null;
} }