export const AiErrorCodes = { AI_CONFIG_MISSING: 4501, AI_FUNC_NOT_FOUND: 4502, AI_INPUT_INVALID: 4503, AI_OUTPUT_INVALID: 4504, AI_UPSTREAM_ERROR: 4505, AI_UPSTREAM_TIMEOUT: 4506, AI_RATE_LIMITED: 4507, AI_KB_PATH_INVALID: 4511, AI_KB_NOT_FOUND: 4512, AI_CHAT_INPUT_INVALID: 4513, /** 助手工具声明/注册不合法:重名、越上限、坏 tool.yaml、执行体装载失败。 */ AI_TOOL_DECL_INVALID: 4514, } as const; export type AiErrorCode = (typeof AiErrorCodes)[keyof typeof AiErrorCodes]; export class AiApiError extends Error { readonly code: AiErrorCode; constructor(code: AiErrorCode, message: string, options?: ErrorOptions) { super(message, options); this.name = 'AiApiError'; this.code = code; } } export function isAbortError(error: unknown): boolean { return error instanceof Error && (error.name === 'AbortError' || error.name === 'TimeoutError'); }