fix(config): 优雅处理 Provider 未配置错误
- 添加 ConfigurationError 类替代 process.exit(1) - Server 端捕获配置错误并返回友好消息 - UI 端支持 config_error 类型的 WebSocket 消息 - 服务器不再因配置缺失而崩溃
This commit is contained in:
@@ -97,6 +97,9 @@ let coreModule: CoreModule | null = null;
|
||||
// Agent 实例缓存(每个 session 一个)
|
||||
const agentCache: Map<string, AgentInstance> = new Map();
|
||||
|
||||
// 配置错误缓存(用于向客户端返回友好错误)
|
||||
let lastConfigError: { provider: string; message: string } | null = null;
|
||||
|
||||
// ============================================================================
|
||||
// 公共 API
|
||||
// ============================================================================
|
||||
@@ -135,8 +138,13 @@ export function isCoreAvailable(): boolean {
|
||||
|
||||
/**
|
||||
* 获取或创建 Agent 实例
|
||||
*
|
||||
* @returns Agent 实例,或 null(Core 不可用或配置错误)
|
||||
*/
|
||||
export function getOrCreateAgent(sessionId: string): AgentInstance | null {
|
||||
// 清除之前的配置错误
|
||||
lastConfigError = null;
|
||||
|
||||
if (!coreModule) {
|
||||
return null;
|
||||
}
|
||||
@@ -146,17 +154,32 @@ export function getOrCreateAgent(sessionId: string): AgentInstance | null {
|
||||
return agentCache.get(sessionId)!;
|
||||
}
|
||||
|
||||
// 创建新 Agent
|
||||
const config = coreModule.loadConfig();
|
||||
const agent = new coreModule.Agent(config);
|
||||
agent.setRegistry(coreModule.toolRegistry);
|
||||
try {
|
||||
// 创建新 Agent(可能抛出 ConfigurationError)
|
||||
const config = coreModule.loadConfig();
|
||||
const agent = new coreModule.Agent(config);
|
||||
agent.setRegistry(coreModule.toolRegistry);
|
||||
|
||||
// 设置权限回调,通过 WebSocket 请求用户确认
|
||||
const permissionManager = coreModule.getPermissionManager();
|
||||
permissionManager.setAskCallback(createServerPermissionCallback(sessionId));
|
||||
// 设置权限回调,通过 WebSocket 请求用户确认
|
||||
const permissionManager = coreModule.getPermissionManager();
|
||||
permissionManager.setAskCallback(createServerPermissionCallback(sessionId));
|
||||
|
||||
agentCache.set(sessionId, agent);
|
||||
return agent;
|
||||
agentCache.set(sessionId, agent);
|
||||
return agent;
|
||||
} catch (error) {
|
||||
// 检测配置错误(通过 error.name 识别,避免直接依赖 Core 类型)
|
||||
if (error instanceof Error && error.name === 'ConfigurationError') {
|
||||
const configError = error as Error & { provider?: string };
|
||||
lastConfigError = {
|
||||
provider: configError.provider || 'unknown',
|
||||
message: error.message,
|
||||
};
|
||||
console.warn(`[Agent] Configuration error: ${error.message}`);
|
||||
return null;
|
||||
}
|
||||
// 其他错误继续抛出
|
||||
throw error;
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
@@ -180,6 +203,26 @@ export async function processMessage(sessionId: string, content: string): Promis
|
||||
const agent = getOrCreateAgent(sessionId);
|
||||
|
||||
if (!agent) {
|
||||
// 检查是否为配置错误
|
||||
if (lastConfigError) {
|
||||
// 返回配置错误,引导用户配置 Provider
|
||||
broadcastToSession(sessionId, {
|
||||
type: 'error',
|
||||
sessionId,
|
||||
payload: {
|
||||
type: 'config_error',
|
||||
message: lastConfigError.message,
|
||||
provider: lastConfigError.provider,
|
||||
action: 'open_providers_panel',
|
||||
},
|
||||
});
|
||||
|
||||
emitLogEvent(sessionId, 'error', `配置错误: ${lastConfigError.message}`);
|
||||
sessionManager.updateStatus(sessionId, 'idle' as SessionStatus);
|
||||
emitStatusEvent(sessionId, 'idle');
|
||||
return;
|
||||
}
|
||||
|
||||
// Core 模块不可用,返回占位响应
|
||||
broadcastToSession(sessionId, {
|
||||
type: 'chunk',
|
||||
|
||||
Reference in New Issue
Block a user