feat(api): bridge ApiProfileManager to all AI callers, fix config split

- Add core/api/api-resolver.js: getSlotProfile(slot) + providerToApiMode()
- core/api.js: getApiSettings() async, reads 'main' slot profile first
- NccsApi.js: getNccsApiSettings() async, reads 'nccs' slot profile first
- Ngms_api.js: getNgmsApiSettings() async, reads 'ngms' slot profile first
- JqyhApi.js: getJqyhApiSettings() async, reads 'jqyh' slot profile first
- All callers updated with await; legacy DOM/extension_settings as fallback
- .gitignore: add WorkDiary.md and Structure.md (local-only files)

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
This commit is contained in:
2026-03-11 20:50:08 +08:00
parent 5a6a8b205c
commit 1c64718391
6 changed files with 162 additions and 48 deletions

View File

@@ -2,6 +2,7 @@ import { extension_settings, getContext } from "/scripts/extensions.js";
import { characters, this_chid, getRequestHeaders, saveSettingsDebounced, eventSource, event_types } from "/script.js";
import { extensionName } from "../../utils/settings.js";
import { amilyHelper } from '../../core/tavern-helper/main.js';
import { getSlotProfile, providerToApiMode } from './api-resolver.js';
let ChatCompletionService = undefined;
try {
@@ -42,16 +43,32 @@ function normalizeApiResponse(responseData) {
return data;
}
export function getNgmsApiSettings() {
export async function getNgmsApiSettings() {
// 优先读取 'ngms' 槽位分配的 Profile
const profile = await getSlotProfile('ngms');
if (profile) {
return {
apiMode: providerToApiMode(profile.provider),
apiUrl: profile.apiUrl,
apiKey: profile.apiKey ?? '',
model: profile.model,
maxTokens: profile.maxTokens ?? 65500,
temperature: profile.temperature ?? 1.0,
tavernProfile: '',
useFakeStream: false,
};
}
// 降级:读旧 extension_settings 字段
return {
apiMode: extension_settings[extensionName]?.ngmsApiMode || 'openai_test',
apiUrl: extension_settings[extensionName]?.ngmsApiUrl?.trim() || '',
apiKey: extension_settings[extensionName]?.ngmsApiKey?.trim() || '',
model: extension_settings[extensionName]?.ngmsModel || '',
maxTokens: extension_settings[extensionName]?.ngmsMaxTokens || 4000,
temperature: extension_settings[extensionName]?.ngmsTemperature || 0.7,
apiMode: extension_settings[extensionName]?.ngmsApiMode || 'openai_test',
apiUrl: extension_settings[extensionName]?.ngmsApiUrl?.trim() || '',
apiKey: extension_settings[extensionName]?.ngmsApiKey?.trim() || '',
model: extension_settings[extensionName]?.ngmsModel || '',
maxTokens: extension_settings[extensionName]?.ngmsMaxTokens || 4000,
temperature: extension_settings[extensionName]?.ngmsTemperature || 0.7,
tavernProfile: extension_settings[extensionName]?.ngmsTavernProfile || '',
useFakeStream: extension_settings[extensionName]?.ngmsFakeStreamEnabled || false
useFakeStream: extension_settings[extensionName]?.ngmsFakeStreamEnabled || false,
};
}
@@ -61,7 +78,7 @@ export async function callNgmsAI(messages, options = {}) {
return null;
}
const apiSettings = getNgmsApiSettings();
const apiSettings = await getNgmsApiSettings();
const finalOptions = {
maxTokens: apiSettings.maxTokens,
@@ -324,7 +341,7 @@ async function callNgmsSillyTavernPreset(messages, options) {
export async function fetchNgmsModels() {
console.log('[Amily2号-Ngms外交部] 开始获取模型列表');
const apiSettings = getNgmsApiSettings();
const apiSettings = await getNgmsApiSettings();
try {
if (apiSettings.apiMode === 'sillytavern_preset') {
@@ -407,7 +424,7 @@ export async function fetchNgmsModels() {
export async function testNgmsApiConnection() {
console.log('[Amily2号-Ngms外交部] 开始API连接测试');
const apiSettings = getNgmsApiSettings();
const apiSettings = await getNgmsApiSettings();
if (apiSettings.apiMode === 'sillytavern_preset') {
if (!apiSettings.tavernProfile) {