fix: LLM 配置变更后立即生效 — 热重载 Provider Adapter

- AgentLoopEngine 新增 setAdapter() 热切换方法
- main.ts 提取 createAdapter 工厂函数
- IPC config:set 监听 LLM 相关 key 变更,触发热重载
- 覆盖 provider/model/apiKey/baseURL/numCtx 五个关键配置
This commit is contained in:
thzxx
2026-07-01 20:04:05 +08:00
parent 97a3d3d53b
commit ba85328c4f
3 changed files with 40 additions and 17 deletions
+26 -17
View File
@@ -87,23 +87,26 @@ async function initialize(): Promise<void> {
const memoryManager = new MemoryManager(() => db);
memoryManager.initialize();
// ===== 步骤 4: Provider Adapter =====
const provider = configService.get<string>('llm.provider') ?? '';
const model = configService.get<string>('llm.model') ?? '';
const apiKey = configService.get<string>('llm.apiKey') ?? '';
const baseURL = configService.get<string>('llm.baseURL') ?? '';
// ===== 步骤 4: Provider Adapter 工厂 =====
const createAdapter = () => {
const provider = configService.get<string>('llm.provider') ?? '';
const model = configService.get<string>('llm.model') ?? '';
const apiKey = configService.get<string>('llm.apiKey') ?? '';
const baseURL = configService.get<string>('llm.baseURL') ?? '';
if (!provider || !baseURL || !model) {
log.warn('LLM not configured. Please set provider, baseURL, and model in Settings.');
}
if (!provider || !baseURL || !model) {
log.warn('LLM not configured. Please set provider, baseURL, and model in Settings.');
}
const adapterConfig = { provider, baseURL, apiKey, defaultModel: model };
let adapter;
switch (provider) {
case 'agnes': adapter = new AgnesAdapter(adapterConfig); break;
case 'ollama': adapter = new OllamaAdapter(adapterConfig); break;
default: adapter = new DeepSeekAdapter(adapterConfig); break;
}
const adapterConfig = { provider, baseURL, apiKey, defaultModel: model };
switch (provider) {
case 'agnes': return new AgnesAdapter(adapterConfig);
case 'ollama': return new OllamaAdapter(adapterConfig);
default: return new DeepSeekAdapter(adapterConfig);
}
};
const adapter = createAdapter();
// ===== 步骤 5: 工作空间文件 + System Prompt =====
const contextBuilder = new ContextBuilder();
@@ -161,6 +164,12 @@ async function initialize(): Promise<void> {
agentLoop.setTools(toolRegistry.listTools());
agentLoop.setWorkspacePath(workspaceInfo.path);
// ===== 热重载 Adapter 回调(设置变更时触发)=====
const reloadAdapter = () => {
const newAdapter = createAdapter();
agentLoop.setAdapter(newAdapter);
};
// ===== 窗口管理 =====
windowManager = new WindowManager();
const mainWindow = windowManager.createWindow({
@@ -200,7 +209,7 @@ async function initialize(): Promise<void> {
registerAllIPCHandlers(
mainWindow, sessionService, configService, workspaceService,
contextBuilder, agentLoop, toolRegistry, auditService,
sessionRecorder, memoryManager, mcpManager,
sessionRecorder, memoryManager, mcpManager, createAdapter,
);
// ===== 应用生命周期 =====
@@ -227,7 +236,7 @@ async function initialize(): Promise<void> {
if (databaseService) { databaseService.close(); databaseService = null; }
});
log.info(`MetonaAI Desktop initialized [Provider: ${provider}, Model: ${model}, Tools: ${toolRegistry.size}]`);
log.info(`MetonaAI Desktop initialized [Provider: ${configService.get<string>('llm.provider') ?? 'none'}, Model: ${configService.get<string>('llm.model') ?? 'none'}, Tools: ${toolRegistry.size}]`);
}
app.whenReady().then(initialize);