fix: LLM 配置变更后立即生效 — 热重载 Provider Adapter
- AgentLoopEngine 新增 setAdapter() 热切换方法 - main.ts 提取 createAdapter 工厂函数 - IPC config:set 监听 LLM 相关 key 变更,触发热重载 - 覆盖 provider/model/apiKey/baseURL/numCtx 五个关键配置
This commit is contained in:
+26
-17
@@ -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);
|
||||
|
||||
Reference in New Issue
Block a user