@huyooo/ai-chat-core 0.2.13 → 0.2.14

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/constants.ts","../src/types.ts","../src/events.ts","../src/tools.ts","../src/router.ts","../src/providers/orchestrator.ts","../src/providers/adapters/ark.ts","../src/providers/adapters/openrouter.ts","../src/providers/adapters/qwen.ts","../src/providers/adapters/gemini.ts","../src/agent.ts","../src/builtin-tools/get-cwd.ts","../src/builtin-tools/get-platform.ts","../src/builtin-tools/execute-command.ts","../src/gemini.ts","../src/builtin-tools/analyze-image.ts","../src/builtin-tools/generate-image.ts","../src/builtin-tools/analyze-video.ts","../src/builtin-tools/weather/city-adcodes.ts","../src/builtin-tools/weather/get-weather.ts","../src/builtin-tools/ui-actions/show-toast.ts","../src/builtin-tools/ui-actions/open-confirm-dialog.ts","../src/builtin-tools/ui-actions/open-file-preview.ts","../src/builtin-tools/ui-actions/navigate-to-directory.ts","../src/builtin-tools/ui-actions/index.ts","../src/builtin-tools/search-documents.ts"],"names":["tools","result","tool","GoogleGenAI","getStringArg"],"mappings":"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AAA;AAAA,EACN,cAAA,EAAM,QAAA;AAAA;AAAA,EAEN,cAAA,EAAM,QAAA;AAAA,EACN,cAAA,EAAM,QAAA;AAAA,EACN,cAAA,EAAM,QAAA;AAAA,EACN,cAAA,EAAM,QAAA;AAAA,EACN,cAAA,EAAM,QAAA;AAAA,EACN,cAAA,EAAM,QAAA;AAAA,EACN,cAAA,EAAM,QAAA;AAAA,EACN,cAAA,EAAM,QAAA;AAAA,EACN,cAAA,EAAM,QAAA;AAAA;AAAA,EAEN,cAAA,EAAM,QAAA;AAAA,EACN,oBAAA,EAAO,QAAA;AAAA,EACP,cAAA,EAAM,QAAA;AAAA,EACN,cAAA,EAAM,QAAA;AAAA,EACN,cAAA,EAAM,QAAA;AAAA,EACN,cAAA,EAAM,QAAA;AAAA,EACN,cAAA,EAAM,QAAA;AAAA,EACN,cAAA,EAAM,QAAA;AAAA,EACN,cAAA,EAAM,QAAA;AAAA,EACN,cAAA,EAAM,QAAA;AAAA,EACN,cAAA,EAAM,QAAA;AAAA;AAAA,EAEN,cAAA,EAAM,QAAA;AAAA,EACN,cAAA,EAAM,QAAA;AAAA,EACN,cAAA,EAAM,QAAA;AAAA,EACN,cAAA,EAAM,QAAA;AAAA,EACN,cAAA,EAAM,QAAA;AAAA,EACN,cAAA,EAAM,QAAA;AAAA,EACN,cAAA,EAAM,QAAA;AAAA,EACN,cAAA,EAAM,QAAA;AAAA,EACN,cAAA,EAAM,QAAA;AAAA,EACN,cAAA,EAAM,QAAA;AAAA,EACN,cAAA,EAAM,QAAA;AAAA,EACN,cAAA,EAAM,QAAA;AAAA,EACN,cAAA,EAAM,QAAA;AAAA,EACN,cAAA,EAAM,QAAA;AAAA,EACN,cAAA,EAAM,QAAA;AAAA,EACN,cAAA,EAAM,QAAA;AAAA;AAAA,EAEN,cAAA,EAAM,QAAA;AAAA,EACN,cAAA,EAAM,QAAA;AAAA,EACN,cAAA,EAAM,QAAA;AAAA,EACN,oBAAA,EAAO,QAAA;AAAA,EACP,cAAA,EAAM,QAAA;AAAA,EACN,cAAA,EAAM,QAAA;AAAA,EACN,cAAA,EAAM,QAAA;AAAA,EACN,cAAA,EAAM,QAAA;AAAA,EACN,cAAA,EAAM,QAAA;AAAA,EACN,cAAA,EAAM,QAAA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","file":"index.js","sourcesContent":["/**\n * 常量定义\n * \n * 所有模型配置统一在此管理\n */\n\n// ==================== API URL ====================\nexport const DEFAULT_ARK_URL = 'https://ark.cn-beijing.volces.com/api/v3';\nexport const DEFAULT_QWEN_URL = 'https://dashscope.aliyuncs.com/api/v1';\nexport const DEFAULT_QWEN_NATIVE_URL = 'https://dashscope.aliyuncs.com/api/v1';\nexport const DEFAULT_OPENROUTER_URL = 'https://openrouter.ai/api/v1';\n\n// ==================== 模型配置类型 ====================\ninterface ModelConfig {\n id: string;\n displayName: string;\n isOpenRouter?: boolean;\n /** 提供商名称(用于分组) */\n provider?: string;\n /** 模型描述 */\n description?: string;\n}\n\n// ==================== 豆包模型 (ARK) ====================\nexport const DOUBAO_SEED_1_8: ModelConfig = { \n id: 'doubao-seed-1-8-251215', \n displayName: '豆包 Seed 1.8',\n provider: '豆包',\n};\nexport const DOUBAO_SEED_1_6: ModelConfig = { \n id: 'doubao-seed-1-6-250615', \n displayName: '豆包 Seed 1.6',\n provider: '豆包',\n};\nexport const DOUBAO_SEED_1_6_LATEST: ModelConfig = { \n id: 'doubao-seed-1-6-251015', \n displayName: '豆包 Seed 1.6 Latest',\n provider: '豆包',\n};\nexport const DOUBAO_SEED_1_6_FLASH: ModelConfig = { \n id: 'doubao-seed-1-6-flash-250617', \n displayName: '豆包 Seed 1.6 Flash',\n provider: '豆包',\n};\n\n// ==================== DeepSeek 模型 (ARK) ====================\nexport const DEEPSEEK_V3: ModelConfig = { \n id: 'deepseek-v3-1-terminus', \n displayName: 'DeepSeek V3',\n provider: 'DeepSeek',\n};\n\n// ==================== 通义千问模型 ====================\nexport const QWEN_MAX: ModelConfig = { id: 'qwen-max', displayName: '通义千问 Max', provider: '通义千问' };\nexport const QWEN_MAX_LATEST: ModelConfig = { id: 'qwen-max-latest', displayName: '通义千问 Max Latest', provider: '通义千问' };\nexport const QWEN_PLUS: ModelConfig = { id: 'qwen-plus', displayName: '通义千问 Plus', provider: '通义千问' };\nexport const QWEN_PLUS_LATEST: ModelConfig = { id: 'qwen-plus-latest', displayName: '通义千问 Plus Latest', provider: '通义千问' };\nexport const QWEN_TURBO: ModelConfig = { id: 'qwen-turbo', displayName: '通义千问 Turbo', provider: '通义千问' };\nexport const QWEN_TURBO_LATEST: ModelConfig = { id: 'qwen-turbo-latest', displayName: '通义千问 Turbo Latest', provider: '通义千问' };\nexport const QWEN3_235B: ModelConfig = { id: 'qwen3-235b-a22b', displayName: 'Qwen3 235B', provider: '通义千问' };\nexport const QWEN3_MAX_PREVIEW: ModelConfig = { \n id: 'qwen3-max-preview', \n displayName: '通义千问 3 Max',\n provider: '通义千问',\n};\n\n// ==================== Gemini 模型 ====================\nexport const GEMINI_2_5_FLASH: ModelConfig = { id: 'gemini-2.5-flash-preview-05-20', displayName: 'Gemini 2.5 Flash', provider: 'Gemini' };\nexport const GEMINI_2_5_PRO: ModelConfig = { id: 'gemini-2.5-pro-preview-05-06', displayName: 'Gemini 2.5 Pro', provider: 'Gemini' };\nexport const GEMINI_2_0_FLASH: ModelConfig = { id: 'gemini-2.0-flash', displayName: 'Gemini 2.0 Flash', provider: 'Gemini' };\nexport const GEMINI_2_0_FLASH_LITE: ModelConfig = { id: 'gemini-2.0-flash-lite', displayName: 'Gemini 2.0 Flash Lite', provider: 'Gemini' };\nexport const GEMINI_3_PRO: ModelConfig = { \n id: 'gemini-3-pro-preview', \n displayName: 'Gemini 3 Pro',\n provider: 'Gemini',\n};\n// 图片模型(仅 id)\nexport const GEMINI_IMAGE_MODEL = 'gemini-2.0-flash';\nexport const GEMINI_IMAGE_GEN_MODEL = 'gemini-3-pro-image-preview';\n\n// ==================== OpenRouter 模型 ====================\nexport const OR_GEMINI_2_5_FLASH: ModelConfig = { \n id: 'google/gemini-2.5-flash-preview', \n displayName: 'Gemini 2.5 Flash', \n isOpenRouter: true,\n provider: 'Gemini',\n};\nexport const OR_GEMINI_2_5_PRO: ModelConfig = { \n id: 'google/gemini-2.5-pro-preview', \n displayName: 'Gemini 2.5 Pro', \n isOpenRouter: true,\n provider: 'Gemini',\n};\nexport const OR_GEMINI_2_0_FLASH: ModelConfig = { \n id: 'google/gemini-2.0-flash-001', \n displayName: 'Gemini 2.0 Flash', \n isOpenRouter: true,\n provider: 'Gemini',\n};\nexport const OR_GEMINI_3_PRO: ModelConfig = { \n id: 'google/gemini-3-pro-preview', \n displayName: 'Gemini 3 Pro', \n isOpenRouter: true,\n provider: 'Gemini',\n};\nexport const OR_GPT_5_2: ModelConfig = { \n id: 'openai/gpt-5.2', \n displayName: 'GPT-5.2', \n isOpenRouter: true,\n provider: 'OpenAI',\n};\nexport const OR_CLAUDE_OPUS_4_5: ModelConfig = { \n id: 'anthropic/claude-opus-4.5', \n displayName: 'Claude Opus 4.5', \n isOpenRouter: true,\n provider: 'Anthropic',\n};\nexport const OR_QWEN3_MAX: ModelConfig = { \n id: 'qwen/qwen3-max', \n displayName: '通义千问 Max', \n isOpenRouter: true,\n provider: '通义千问',\n};\nexport const OR_DEEPSEEK_R1: ModelConfig = { \n id: 'deepseek/deepseek-r1', \n displayName: 'DeepSeek R1', \n isOpenRouter: true,\n provider: 'DeepSeek',\n};\nexport const OR_DEEPSEEK_CHAT_V3: ModelConfig = { \n id: 'deepseek/deepseek-chat-v3-0324', \n displayName: 'DeepSeek Chat V3', \n isOpenRouter: true,\n provider: 'DeepSeek',\n};\nexport const OR_DEEPSEEK_V3_2: ModelConfig = { \n id: 'deepseek/deepseek-v3.2', \n displayName: 'DeepSeek V3.2', \n isOpenRouter: true,\n provider: 'DeepSeek',\n};\n\n// ==================== 前端显示的模型列表 ====================\nexport const DISPLAY_MODELS: ModelConfig[] = [\n // 原生模型\n DOUBAO_SEED_1_6,\n DEEPSEEK_V3,\n QWEN3_MAX_PREVIEW,\n GEMINI_3_PRO,\n // OpenRouter 模型\n OR_GPT_5_2,\n OR_CLAUDE_OPUS_4_5,\n OR_GEMINI_3_PRO,\n OR_QWEN3_MAX,\n OR_DEEPSEEK_V3_2,\n];\n\n// ==================== 默认配置 ====================\nexport const DEFAULT_MODEL = DOUBAO_SEED_1_6.id;\nexport const MAX_ITERATIONS = 10;\n\n/** plan 模式提示词 */\nexport const PLAN_MODE_PROMPT = '分析需求并制定执行计划,以 Markdown 格式输出步骤,等待用户确认后再执行。';\n\n/** agent 模式提示词 */\nexport const AGENT_MODE_PROMPT = `你是一个专业的 AI 助手。请遵循以下规则:\n- 返回的内容尽量不要使用表情符号(emoji),除非用户要求使用\n- 使用 Markdown 格式组织内容\n- 代码块使用正确的语言标识`;\n\n","/**\n * AI Chat Core 类型定义\n * \n * 注意:事件类型已迁移到 events.ts\n */\n\nimport { DISPLAY_MODELS } from './constants';\n\n// ==================== 模式与模型 ====================\n\n/** 对话模式 */\nexport type ChatMode = 'agent' | 'plan' | 'ask';\n\n// ProviderType 从 router.ts 导出(后端路由用)\nimport type { ProviderType } from './router';\nexport type { ProviderType };\n\n/** \n * 简化的模型配置\n * \n * - modelId: 发送给 API 的模型 ID\n * - displayName: 前端显示名称\n * - group: 分组名称(由后端决定,前端只负责渲染)\n */\nexport interface ModelOption {\n /** 模型 ID(发送给 API) */\n modelId: string;\n /** 显示名称 */\n displayName: string;\n /** 分组名称(由后端决定,前端只负责渲染,必填) */\n group: string;\n /** 是否来自 OpenRouter(保留用于兼容,后续可能移除) */\n isOpenRouter?: boolean;\n /** 提供商名称(保留用于兼容,后续可能移除) */\n provider?: string;\n}\n\n/**\n * 预定义模型列表(从 constants.ts 映射)\n * \n * 分组信息由后端决定,前端只负责渲染\n */\nexport const MODELS: ModelOption[] = DISPLAY_MODELS.map(m => ({\n modelId: m.id,\n displayName: m.displayName,\n group: m.isOpenRouter ? 'OpenRouter' : '原生模型', // 后端决定分组\n isOpenRouter: m.isOpenRouter,\n provider: m.provider,\n}));\n\n/** 获取原生模型 */\nexport function getNativeModels(): ModelOption[] {\n return MODELS.filter(m => !m.isOpenRouter);\n}\n\n/** 获取 OpenRouter 模型 */\nexport function getOpenRouterModels(): ModelOption[] {\n return MODELS.filter(m => m.isOpenRouter);\n}\n\n/** 根据 modelId 获取模型 */\nexport function getModelByModelId(modelId: string): ModelOption | undefined {\n return MODELS.find(m => m.modelId === modelId);\n}\n\n// ==================== 配置 ====================\n\n/** 工具批准回调函数 */\nexport type ToolApprovalCallback = (toolCall: {\n id: string;\n name: string;\n args: Record<string, unknown>;\n}) => Promise<boolean>;\n\n/** Agent 配置 */\nexport interface AgentConfig {\n /** 豆包/火山引擎 API Key (用于豆包和 DeepSeek) */\n arkApiKey: string;\n /** 豆包 API URL */\n arkApiUrl?: string;\n /** 通义千问 API Key */\n qwenApiKey?: string;\n /** 通义千问 API URL */\n qwenApiUrl?: string;\n /** OpenRouter API Key */\n openrouterApiKey?: string;\n /** OpenRouter API URL */\n openrouterApiUrl?: string;\n /** Gemini API Key (用于图片/视频,注意:中国大陆无法直接访问) */\n geminiApiKey: string;\n /** 当前工作目录(Current Working Directory) */\n cwd?: string;\n /** \n * 工具列表(Vite 插件风格)\n * \n * 支持多种形式:\n * - 单个工具:getCwdTool\n * - 工具插件:searchPlugin({ dataDir, workspace })\n * - Promise:await asyncPlugin()\n * \n * @example\n * ```typescript\n * tools: [\n * getCwdTool,\n * executeCommandTool,\n * searchPlugin({ dataDir: '/path', workspace: '/project' }),\n * ]\n * ```\n */\n tools?: ToolConfigItem[];\n /** \n * plan 模式的系统提示词(可选,有默认值)\n * 用于指导 AI 如何制定执行计划\n */\n planPrompt?: string;\n /** \n * 工具批准回调(manual 模式使用)\n * 返回 true 表示批准执行,false 表示跳过\n */\n onToolApprovalRequest?: ToolApprovalCallback;\n /**\n * 动态获取自动运行配置回调\n * 每次检查工具批准时调用,获取最新配置\n */\n getAutoRunConfig?: () => Promise<AutoRunConfig | undefined>;\n}\n\n/** 深度思考模式 */\nexport type ThinkingMode = 'enabled' | 'disabled';\n\n/** 自动运行模式 */\nexport type AutoRunMode = 'run-everything' | 'manual';\n\n/** 自动运行配置 */\nexport interface AutoRunConfig {\n /** \n * 自动运行模式\n * - 'run-everything': 运行所有内容(自动执行)\n * - 'manual': 手动批准(每次执行前询问)\n */\n mode?: AutoRunMode;\n}\n\n/** 聊天消息格式(用于传递历史) */\nexport interface ChatHistoryMessage {\n role: 'user' | 'assistant' | 'system' | 'tool';\n content: string;\n}\n\n/** 聊天配置(每次聊天可变的选项) */\nexport interface ChatOptions {\n /** 对话模式 */\n mode?: ChatMode;\n /** 使用的模型 */\n model?: string;\n /** 模型提供商 */\n provider?: ProviderType;\n /** 是否启用联网搜索 */\n enableWebSearch?: boolean;\n /** \n * 深度思考模式\n * - 'enabled': 强制开启深度思考\n * - 'disabled': 强制关闭深度思考\n */\n thinkingMode?: ThinkingMode;\n /** 自动运行配置 */\n autoRunConfig?: AutoRunConfig;\n /** 对话历史(从数据库加载,无状态架构) */\n history?: ChatHistoryMessage[];\n // 注意:每个 provider 内部使用自己的最优参数\n // - ARK: reasoning.effort = 'high'\n // - Qwen: thinking_budget = 38400\n // - Gemini: thinkingLevel = 'high'\n // 外部只需关心 thinkingMode 开关即可\n}\n\n// ==================== 工具相关 ====================\n\n/**\n * 副作用定义(参考 REST API 规范)\n * \n * @example\n * // 通知\n * { type: 'notification', success: true, message: '图片生成完成' }\n * \n * // 文件系统变更\n * { type: 'filesystem', success: true, data: { paths: ['/path/to/file'] } }\n * \n * // 失败\n * { type: 'notification', success: false, message: 'API 超时' }\n */\nexport interface SideEffect {\n /** 副作用类型 */\n type: string;\n /** 是否成功 */\n success: boolean;\n /** 附加数据 */\n data?: unknown;\n /** 消息(成功时为提示,失败时为错误信息) */\n message?: string;\n}\n\n/**\n * 工具执行结果(支持动态副作用)\n * \n * 工具可以返回此类型来动态声明副作用\n */\nexport interface ToolResult {\n /** 执行结果(字符串) */\n result: string;\n /** 动态副作用(覆盖静态声明) */\n sideEffects?: SideEffect[];\n}\n\n/** 工具执行上下文 */\nexport interface ToolContext {\n /** 当前工作目录(Current Working Directory) */\n cwd: string;\n /** Gemini 客户端(供多模态工具使用) */\n geminiClient?: unknown;\n /** 执行 Shell 命令(内置方法) */\n executeCommand: (command: string, cwd?: string) => Promise<{ success: boolean; output?: string; error?: string }>;\n /** 中断信号(用于取消长时间操作) */\n signal?: AbortSignal;\n}\n\n/** \n * 工具接口(用户可实现此接口创建自定义工具)\n * \n * 示例:\n * ```typescript\n * const myTool: Tool = {\n * name: 'my_tool',\n * description: '我的自定义工具',\n * parameters: { type: 'object', properties: {}, required: [] },\n * sideEffects: ['filesystem'], // 声明副作用\n * execute: async (args, ctx) => '执行结果'\n * };\n * ```\n */\nexport interface Tool {\n /** 工具名称 */\n name: string;\n /** 工具描述(供 AI 理解) */\n description: string;\n /** 参数定义(JSON Schema) */\n parameters: {\n type: 'object';\n properties: Record<string, {\n type: string;\n description: string;\n enum?: string[];\n items?: { type: string };\n }>;\n required: string[];\n };\n /** \n * 静态副作用声明(可选)\n * \n * 用于通知前端该工具执行后可能产生的副作用\n * \n * @example\n * sideEffects: [{ type: 'notification', message: '图片生成完成', level: 'success' }]\n * \n * 注意:如果 execute 返回 ToolResult 带有 sideEffects,会覆盖此静态声明\n */\n sideEffects?: SideEffect[];\n /** \n * 执行函数\n * \n * 返回值:\n * - string: 简单返回结果,使用静态 sideEffects\n * - ToolResult: 带动态副作用的结果,覆盖静态 sideEffects\n */\n execute: (args: Record<string, unknown>, context: ToolContext) => Promise<string | ToolResult>;\n}\n\n/** 工具执行器接口(可由使用方实现,用于自定义命令执行环境) */\nexport interface ToolExecutor {\n /** 执行 Shell 命令 */\n executeCommand(command: string, cwd?: string, signal?: AbortSignal): Promise<{ success: boolean; output?: string; error?: string }>;\n}\n\n// ==================== 工具插件(Vite 插件风格) ====================\n\n/**\n * 工具插件实例\n * \n * 由 createXxxPlugin() 返回,可直接在 tools 数组中展开使用\n */\nexport interface ToolPlugin {\n /** 插件提供的工具数组 */\n tools: Tool[];\n /** 插件控制方法(可选,由各插件自定义) */\n [key: string]: unknown;\n}\n\n/**\n * 创建单个工具插件(辅助函数)\n * \n * @example\n * ```typescript\n * export function getCwdTool(): ToolPlugin {\n * return tool({\n * name: 'get_cwd',\n * description: '...',\n * parameters: { ... },\n * execute: async (args, context) => { ... }\n * });\n * }\n * ```\n */\nexport function tool(t: Tool): ToolPlugin {\n return { tools: [t] };\n}\n\n/**\n * 创建多个工具插件(辅助函数)\n * \n * @example\n * ```typescript\n * export function myPlugin(): ToolPlugin {\n * return tools([\n * { name: 'tool1', ... },\n * { name: 'tool2', ... },\n * ]);\n * }\n * ```\n */\nexport function tools(ts: Tool[]): ToolPlugin {\n return { tools: ts };\n}\n\n/**\n * 工具配置项(Vite 插件风格,只支持插件形式)\n * \n * @example\n * ```typescript\n * tools: [\n * getCwdTool(), // 工具插件(函数调用)\n * searchPlugin({ dataDir, workspace }), // 异步插件(返回 Promise<ToolPlugin>)\n * ]\n * ```\n */\nexport type ToolConfigItem = ToolPlugin | Promise<ToolPlugin>;\n\n/**\n * 解析工具配置,统一转换为 Tool[]\n * \n * 所有工具都必须是 ToolPlugin 形式(Vite 插件风格)\n */\nexport async function resolveTools(items: ToolConfigItem[]): Promise<Tool[]> {\n const tools: Tool[] = [];\n \n for (const item of items) {\n const resolved = await item;\n \n if ('tools' in resolved && Array.isArray(resolved.tools)) {\n // ToolPlugin\n tools.push(...resolved.tools);\n } else {\n console.warn('工具配置项必须是 ToolPlugin 形式:', resolved);\n }\n }\n \n return tools;\n}\n\n/** 工具定义(OpenAI 格式,内部使用) */\nexport interface ToolDefinition {\n type: 'function';\n function: {\n name: string;\n description: string;\n parameters: {\n type: 'object';\n properties: Record<string, {\n type: string;\n description: string;\n enum?: string[];\n items?: { type: string };\n }>;\n required: string[];\n };\n };\n}\n\n// ==================== 消息相关 ====================\n\n/** 聊天消息(内部格式) */\nexport interface ChatMessage {\n /** 消息 ID */\n id?: string;\n role: 'system' | 'user' | 'assistant' | 'tool';\n content: string;\n /** 深度思考内容 */\n reasoning_content?: string;\n tool_call_id?: string;\n tool_calls?: Array<{\n id: string;\n type: 'function';\n function: {\n name: string;\n arguments: string;\n };\n }>;\n}\n\n// ==================== API 特定类型 ====================\n\n/** 火山引擎 Responses API 工具定义 */\nexport interface ResponsesApiTool {\n type: 'function' | 'web_search';\n // Function 类型\n name?: string;\n description?: string;\n parameters?: Record<string, unknown>;\n // Web Search 类型\n max_keyword?: number;\n limit?: number;\n sources?: string[];\n}\n","/**\n * AI Chat 事件系统\n * \n * 模块化的事件类型定义,用于 Agent 与前端之间的通信。\n * \n * 设计原则:\n * 1. 每种事件类型有明确的数据结构\n * 2. 事件分组便于管理和扩展\n * 3. 类型安全,避免 unknown\n * 4. 统一的时间追踪(开始/结束/耗时)\n */\n\n// ==================== 基础类型 ====================\n\n/** 搜索结果项 */\nexport interface SearchResult {\n title: string;\n url: string;\n snippet: string;\n}\n\n/** 工具调用状态 */\nexport type ToolCallStatus = 'pending' | 'running' | 'success' | 'error';\n\n/** 工具调用信息(用于前端状态管理) */\nexport interface ToolCallInfo {\n id: string;\n name: string;\n args: Record<string, unknown>;\n status: ToolCallStatus;\n result?: string;\n error?: string;\n startedAt?: number;\n duration?: number;\n}\n\n/** Token 使用统计 */\nexport interface TokenUsage {\n promptTokens: number;\n completionTokens: number;\n totalTokens: number;\n /** 思考 token 数(如果有) */\n reasoningTokens?: number;\n /** 缓存命中 token 数(如果有) */\n cachedTokens?: number;\n}\n\n// ==================== 错误类型 ====================\n\n/** 错误类别 - 参考 AI SDK 设计 */\nexport type ErrorCategory = \n | 'api' // API 调用错误(网络、认证、服务端错误)\n | 'rate_limit' // 速率限制\n | 'validation' // 参数验证错误\n | 'tool' // 工具执行错误\n | 'timeout' // 超时错误\n | 'abort' // 用户取消\n | 'parse' // 解析错误(JSON、响应格式)\n | 'unknown'; // 未知错误\n\n/** 错误详情 - 结构化错误信息 */\nexport interface ErrorDetails {\n /** 错误分类 */\n category: ErrorCategory;\n /** 人类可读的错误信息 */\n message: string;\n /** 错误代码(如 'RATE_LIMIT', 'NETWORK_ERROR') */\n code?: string;\n /** HTTP 状态码(如果适用) */\n statusCode?: number;\n /** HTTP 状态文本 */\n statusText?: string;\n /** 是否可重试 */\n retryable?: boolean;\n /** 重试等待时间(秒) */\n retryAfter?: number;\n /** 原始错误信息(用于调试) */\n cause?: string;\n /** 错误发生的上下文(如模型名、工具名) */\n context?: string;\n}\n\n// ==================== 思考相关事件 ====================\n\n/** 思考开始事件 */\nexport interface ThinkingStartEvent {\n type: 'thinking_start';\n data: {\n /** 开始时间戳(毫秒) */\n startedAt: number;\n };\n}\n\n/** 思考内容增量事件 */\nexport interface ThinkingDeltaEvent {\n type: 'thinking_delta';\n data: {\n /** 增量内容 */\n content: string;\n };\n}\n\n/** 思考结束事件 */\nexport interface ThinkingEndEvent {\n type: 'thinking_end';\n data: {\n /** 结束时间戳(毫秒) */\n endedAt: number;\n /** 思考耗时(毫秒) */\n duration: number;\n };\n}\n\n/** 思考相关事件联合类型 */\nexport type ThinkingEvent = ThinkingStartEvent | ThinkingDeltaEvent | ThinkingEndEvent;\n\n// ==================== 搜索相关事件 ====================\n\n/** 搜索开始事件 */\nexport interface SearchStartEvent {\n type: 'search_start';\n data: {\n /** 搜索查询词 */\n query: string;\n /** 开始时间戳(毫秒) */\n startedAt: number;\n };\n}\n\n/** 搜索结果事件(成功完成) */\nexport interface SearchResultEvent {\n type: 'search_result';\n data: {\n /** 搜索结果列表 */\n results: SearchResult[];\n /** 结束时间戳(毫秒) */\n endedAt: number;\n /** 搜索耗时(毫秒) */\n duration: number;\n };\n}\n\n/** 搜索结束事件(失败或取消) */\nexport interface SearchEndEvent {\n type: 'search_end';\n data: {\n /** 是否成功 */\n success: boolean;\n /** 错误信息(失败时) */\n error?: string;\n /** 结束时间戳(毫秒) */\n endedAt: number;\n /** 搜索耗时(毫秒) */\n duration: number;\n };\n}\n\n/** 搜索相关事件联合类型 */\nexport type SearchEvent = SearchStartEvent | SearchResultEvent | SearchEndEvent;\n\n// ==================== 工具相关事件 ====================\n\n/** 工具调用开始事件 */\nexport interface ToolCallStartEvent {\n type: 'tool_call_start';\n data: {\n /** 工具调用 ID */\n id: string;\n /** 工具名称 */\n name: string;\n /** 工具参数 */\n args: Record<string, unknown>;\n /** 开始时间戳(毫秒) */\n startedAt: number;\n };\n}\n\n/** 副作用定义(从 types.ts 复制,避免循环依赖) */\nexport interface SideEffect {\n type: string;\n success: boolean;\n data?: unknown;\n message?: string;\n}\n\n/** 工具调用结果事件 */\nexport interface ToolCallResultEvent {\n type: 'tool_call_result';\n data: {\n /** 工具调用 ID */\n id: string;\n /** 工具名称 */\n name: string;\n /** 执行结果 */\n result: string;\n /** 是否成功 */\n success: boolean;\n /** 错误信息(失败时) */\n error?: string;\n /** 结束时间戳(毫秒) */\n endedAt: number;\n /** 执行耗时(毫秒) */\n duration: number;\n /** \n * 工具副作用\n * 前端可根据此字段处理通知、刷新文件列表等\n */\n sideEffects?: SideEffect[];\n };\n}\n\n/** 工具执行批准请求事件(manual 模式) */\nexport interface ToolApprovalRequestEvent {\n type: 'tool_approval_request';\n data: {\n /** 工具调用 ID */\n id: string;\n /** 工具名称 */\n name: string;\n /** 工具参数 */\n args: Record<string, unknown>;\n /** 请求时间戳 */\n requestedAt: number;\n };\n}\n\n/** 工具相关事件联合类型 */\nexport type ToolEvent = ToolCallStartEvent | ToolCallResultEvent | ToolApprovalRequestEvent;\n\n// ==================== 文本相关事件 ====================\n\n/** 文本增量事件 */\nexport interface TextDeltaEvent {\n type: 'text_delta';\n data: {\n /** 增量文本 */\n content: string;\n };\n}\n\n/** 文本相关事件联合类型 */\nexport type TextEvent = TextDeltaEvent;\n\n// ==================== 媒体相关事件 ====================\n\n/** 图片事件 */\nexport interface ImageEvent {\n type: 'image';\n data: {\n /** 图片路径 */\n path?: string;\n /** Base64 编码 */\n base64?: string;\n /** MIME 类型 */\n mimeType?: string;\n };\n}\n\n/** 视频事件 */\nexport interface VideoEvent {\n type: 'video';\n data: {\n /** 视频路径 */\n path: string;\n };\n}\n\n/** 媒体相关事件联合类型 */\nexport type MediaEvent = ImageEvent | VideoEvent;\n\n// ==================== 状态事件 ====================\n\n/** 流开始事件 */\nexport interface StreamStartEvent {\n type: 'stream_start';\n data: {\n /** 请求 ID */\n requestId?: string;\n /** 使用的模型 */\n model: string;\n /** 开始时间戳 */\n startedAt: number;\n };\n}\n\n/** 完成事件 */\nexport interface DoneEvent {\n type: 'done';\n data: {\n /** 完整的最终文本 */\n text: string;\n /** Token 使用统计 */\n usage?: TokenUsage;\n /** 总耗时(毫秒) */\n duration?: number;\n };\n}\n\n/** 错误事件 - 结构化错误信息 */\nexport interface ErrorEvent {\n type: 'error';\n data: ErrorDetails;\n}\n\n/** 中止事件 - 用户主动取消 */\nexport interface AbortEvent {\n type: 'abort';\n data: {\n /** 中止原因 */\n reason?: string;\n /** 中止时间戳 */\n abortedAt: number;\n };\n}\n\n/** 状态相关事件联合类型 */\nexport type StatusEvent = StreamStartEvent | DoneEvent | ErrorEvent | AbortEvent;\n\n// ==================== 步骤追踪事件 ====================\n\n/** 步骤开始事件 */\nexport interface StepStartEvent {\n type: 'step_start';\n data: {\n /** 步骤编号(从 1 开始) */\n stepNumber: number;\n /** 步骤描述(可选) */\n description?: string;\n /** 开始时间戳 */\n startedAt: number;\n };\n}\n\n/** 步骤结束事件 */\nexport interface StepEndEvent {\n type: 'step_end';\n data: {\n /** 步骤编号 */\n stepNumber: number;\n /** 结束时间戳 */\n endedAt: number;\n /** 耗时(毫秒) */\n duration: number;\n };\n}\n\n/** 步骤相关事件联合类型 */\nexport type StepEvent = StepStartEvent | StepEndEvent;\n\n// ==================== 聚合类型 ====================\n\n/** 所有事件类型 */\nexport type ChatEvent =\n | ThinkingEvent\n | SearchEvent\n | ToolEvent\n | TextEvent\n | MediaEvent\n | StatusEvent\n | StepEvent;\n\n/** 事件类型字符串 */\nexport type ChatEventType = ChatEvent['type'];\n\n// ==================== 工具函数 ====================\n\n/**\n * 创建思考开始事件\n */\nexport function createThinkingStart(): ThinkingStartEvent {\n return {\n type: 'thinking_start',\n data: { startedAt: Date.now() }\n };\n}\n\n/**\n * 创建思考增量事件\n */\nexport function createThinkingDelta(content: string): ThinkingDeltaEvent {\n return {\n type: 'thinking_delta',\n data: { content }\n };\n}\n\n/**\n * 创建思考结束事件\n */\nexport function createThinkingEnd(startedAt: number): ThinkingEndEvent {\n const endedAt = Date.now();\n return {\n type: 'thinking_end',\n data: {\n endedAt,\n duration: endedAt - startedAt\n }\n };\n}\n\n/**\n * 创建搜索开始事件\n */\nexport function createSearchStart(query: string): SearchStartEvent {\n return {\n type: 'search_start',\n data: { query, startedAt: Date.now() }\n };\n}\n\n/**\n * 创建搜索结果事件(成功)\n */\nexport function createSearchResult(results: SearchResult[], startedAt: number): SearchResultEvent {\n const endedAt = Date.now();\n return {\n type: 'search_result',\n data: { \n results, \n endedAt,\n duration: endedAt - startedAt\n }\n };\n}\n\n/**\n * 创建搜索结束事件(失败或取消)\n */\nexport function createSearchEnd(\n success: boolean, \n startedAt: number, \n error?: string\n): SearchEndEvent {\n const endedAt = Date.now();\n return {\n type: 'search_end',\n data: { \n success, \n error,\n endedAt,\n duration: endedAt - startedAt\n }\n };\n}\n\n/**\n * 创建工具调用开始事件\n */\nexport function createToolCallStart(\n id: string,\n name: string,\n args: Record<string, unknown>\n): ToolCallStartEvent {\n return {\n type: 'tool_call_start',\n data: { id, name, args, startedAt: Date.now() }\n };\n}\n\n/**\n * 创建工具调用结果事件\n */\nexport function createToolCallResult(\n id: string,\n name: string,\n result: string,\n success: boolean,\n startedAt: number,\n error?: string,\n sideEffects?: SideEffect[]\n): ToolCallResultEvent {\n const endedAt = Date.now();\n return {\n type: 'tool_call_result',\n data: { \n id, \n name, \n result, \n success, \n error,\n endedAt,\n duration: endedAt - startedAt,\n sideEffects\n }\n };\n}\n\n/**\n * 创建文本增量事件\n */\nexport function createTextDelta(content: string): TextDeltaEvent {\n return {\n type: 'text_delta',\n data: { content }\n };\n}\n\n/**\n * 创建流开始事件\n */\nexport function createStreamStart(model: string, requestId?: string): StreamStartEvent {\n return {\n type: 'stream_start',\n data: {\n model,\n requestId,\n startedAt: Date.now()\n }\n };\n}\n\n/**\n * 创建完成事件\n */\nexport function createDone(text: string, usage?: TokenUsage, duration?: number): DoneEvent {\n return {\n type: 'done',\n data: { text, usage, duration }\n };\n}\n\n/**\n * 创建错误事件(完整版)\n */\nexport function createError(details: ErrorDetails): ErrorEvent {\n return {\n type: 'error',\n data: details\n };\n}\n\n/**\n * 创建 API 错误事件\n */\nexport function createApiError(\n message: string,\n options: {\n code?: string;\n statusCode?: number;\n statusText?: string;\n retryable?: boolean;\n retryAfter?: number;\n cause?: string;\n context?: string;\n } = {}\n): ErrorEvent {\n return createError({\n category: 'api',\n message,\n ...options\n });\n}\n\n/**\n * 创建速率限制错误事件\n */\nexport function createRateLimitError(\n message: string,\n retryAfter?: number,\n context?: string\n): ErrorEvent {\n return createError({\n category: 'rate_limit',\n message,\n code: 'RATE_LIMIT',\n statusCode: 429,\n retryable: true,\n retryAfter,\n context\n });\n}\n\n/**\n * 创建工具错误事件\n */\nexport function createToolError(\n message: string,\n toolName: string,\n cause?: string\n): ErrorEvent {\n return createError({\n category: 'tool',\n message,\n code: 'TOOL_ERROR',\n context: toolName,\n cause,\n retryable: false\n });\n}\n\n/**\n * 创建超时错误事件\n */\nexport function createTimeoutError(\n message: string,\n context?: string\n): ErrorEvent {\n return createError({\n category: 'timeout',\n message,\n code: 'TIMEOUT',\n retryable: true,\n context\n });\n}\n\n/**\n * 创建解析错误事件\n */\nexport function createParseError(\n message: string,\n cause?: string\n): ErrorEvent {\n return createError({\n category: 'parse',\n message,\n code: 'PARSE_ERROR',\n cause,\n retryable: false\n });\n}\n\n/**\n * 创建中止事件\n */\nexport function createAbort(reason?: string): AbortEvent {\n return {\n type: 'abort',\n data: { \n reason,\n abortedAt: Date.now()\n }\n };\n}\n\n/**\n * 创建步骤开始事件\n */\nexport function createStepStart(stepNumber: number, description?: string): StepStartEvent {\n return {\n type: 'step_start',\n data: { stepNumber, description, startedAt: Date.now() }\n };\n}\n\n/**\n * 创建步骤结束事件\n */\nexport function createStepEnd(stepNumber: number, startedAt: number): StepEndEvent {\n const endedAt = Date.now();\n return {\n type: 'step_end',\n data: { \n stepNumber, \n endedAt,\n duration: endedAt - startedAt\n }\n };\n}\n\n/**\n * 创建图片事件\n */\nexport function createImage(options: { path?: string; base64?: string; mimeType?: string }): ImageEvent {\n return {\n type: 'image',\n data: options\n };\n}\n\n/**\n * 创建视频事件\n */\nexport function createVideo(path: string): VideoEvent {\n return {\n type: 'video',\n data: { path }\n };\n}\n\n// ==================== 类型守卫 ====================\n\n/** 检查是否为思考事件 */\nexport function isThinkingEvent(event: ChatEvent): event is ThinkingEvent {\n return event.type.startsWith('thinking_');\n}\n\n/** 检查是否为搜索事件 */\nexport function isSearchEvent(event: ChatEvent): event is SearchEvent {\n return event.type.startsWith('search_');\n}\n\n/** 检查是否为工具事件 */\nexport function isToolEvent(event: ChatEvent): event is ToolEvent {\n return event.type.startsWith('tool_');\n}\n\n/** 检查是否为文本事件 */\nexport function isTextEvent(event: ChatEvent): event is TextEvent {\n return event.type === 'text_delta';\n}\n\n/** 检查是否为媒体事件 */\nexport function isMediaEvent(event: ChatEvent): event is MediaEvent {\n return event.type === 'image' || event.type === 'video';\n}\n\n/** 检查是否为状态事件 */\nexport function isStatusEvent(event: ChatEvent): event is StatusEvent {\n return event.type === 'stream_start' || event.type === 'done' || event.type === 'error' || event.type === 'abort';\n}\n\n/** 检查是否为错误事件 */\nexport function isErrorEvent(event: ChatEvent): event is ErrorEvent {\n return event.type === 'error';\n}\n\n/** 检查是否为中止事件 */\nexport function isAbortEvent(event: ChatEvent): event is AbortEvent {\n return event.type === 'abort';\n}\n\n/** 检查是否为步骤事件 */\nexport function isStepEvent(event: ChatEvent): event is StepEvent {\n return event.type.startsWith('step_');\n}\n\n/** 检查错误是否可重试 */\nexport function isRetryableError(event: ChatEvent): boolean {\n if (event.type !== 'error') return false;\n return event.data.retryable === true;\n}\n","/**\n * 工具执行器\n */\n\nimport type { ToolExecutor } from './types';\n\n/** 危险命令黑名单 */\nconst DANGEROUS_COMMANDS = [\n 'rm -rf /', 'rm -rf ~', 'format', 'mkfs', 'dd if=',\n 'shutdown', 'reboot', 'sudo rm', 'sudo format'\n];\n\nfunction isDangerousCommand(command: string): boolean {\n const lowerCommand = command.toLowerCase().trim();\n return DANGEROUS_COMMANDS.some(dangerous => \n lowerCommand.includes(dangerous.toLowerCase())\n );\n}\n\n/**\n * 创建默认工具执行器(Node.js 环境)\n * \n * 用于执行 shell 命令,包含基本安全检查\n * 支持通过 AbortSignal 取消命令执行\n */\nexport function createDefaultToolExecutor(defaultCwd: string = process.cwd()): ToolExecutor {\n return {\n async executeCommand(command: string, cwd?: string, signal?: AbortSignal) {\n // 检查是否已取消\n if (signal?.aborted) {\n return { success: false, error: '操作已取消' };\n }\n \n if (isDangerousCommand(command)) {\n return { success: false, error: '该命令被安全策略阻止' };\n }\n\n try {\n const { spawn } = await import('child_process');\n \n return new Promise((resolve) => {\n let stdout = '';\n let stderr = '';\n let killed = false;\n \n const child = spawn('sh', ['-c', command], {\n cwd: cwd || defaultCwd,\n env: process.env,\n });\n \n // 设置超时\n const timeout = setTimeout(() => {\n if (!killed) {\n killed = true;\n child.kill('SIGTERM');\n resolve({ success: false, error: '命令执行超时(30秒)' });\n }\n }, 30000);\n \n // 监听取消信号\n const abortHandler = () => {\n if (!killed) {\n killed = true;\n child.kill('SIGTERM');\n clearTimeout(timeout);\n resolve({ success: false, error: '操作已取消' });\n }\n };\n signal?.addEventListener('abort', abortHandler);\n \n child.stdout?.on('data', (data) => {\n stdout += data.toString();\n });\n \n child.stderr?.on('data', (data) => {\n stderr += data.toString();\n });\n \n child.on('close', (code) => {\n clearTimeout(timeout);\n signal?.removeEventListener('abort', abortHandler);\n \n if (killed) return;\n \n const output = stdout.trim();\n const errOutput = stderr.trim();\n \n if (code === 0) {\n resolve({ success: true, output: output || errOutput || '执行成功' });\n } else {\n // 非零退出码但有输出时,也算成功(某些命令会这样)\n if (output) {\n const warning = errOutput ? `\\n[警告: ${errOutput}]` : '';\n resolve({ success: true, output: output + warning });\n } else if (errOutput) {\n resolve({ success: false, error: errOutput });\n } else {\n resolve({ success: false, error: `命令退出码: ${code}` });\n }\n }\n });\n \n child.on('error', (err) => {\n clearTimeout(timeout);\n signal?.removeEventListener('abort', abortHandler);\n \n if (!killed) {\n resolve({ success: false, error: err.message });\n }\n });\n });\n } catch (error) {\n return { success: false, error: error instanceof Error ? error.message : String(error) };\n }\n }\n };\n}\n","/**\n * 模型路由模块\n * \n * 根据模型名称将请求路由到对应的 Provider\n * \n * 设计原则:\n * 1. 配置驱动:路由规则集中管理,易于扩展\n * 2. 优先级机制:高优先级规则先匹配\n * 3. 多种匹配模式:支持精确、前缀、包含、正则匹配\n */\n\n/** Provider 类型(API 供应商) */\nexport type ProviderType = 'ark' | 'qwen' | 'gemini' | 'openrouter' | 'vercel';\n\n/** 路由规则匹配类型 */\nexport type RouteMatchType = 'exact' | 'prefix' | 'contains' | 'regex';\n\n/** 单条路由规则 */\nexport interface RouteRule {\n /** 规则类型 */\n type: RouteMatchType;\n /** 匹配模式(大小写不敏感) */\n pattern: string;\n /** 目标 Provider */\n provider: ProviderType;\n /** 规则优先级(数字越大越优先,默认 0) */\n priority: number;\n /** 规则描述(调试用) */\n description?: string;\n}\n\n/** 路由结果 */\nexport interface RouteResult {\n /** 匹配的 Provider */\n provider: ProviderType;\n /** 匹配的规则(如果有) */\n matchedRule?: RouteRule;\n /** 是否使用了默认路由 */\n isDefault: boolean;\n}\n\n/**\n * 模型路由配置\n * \n * 规则按优先级排序,高优先级规则先匹配\n * \n * 匹配类型说明:\n * - exact: 精确匹配(大小写不敏感)\n * - prefix: 前缀匹配\n * - contains: 包含匹配\n * - regex: 正则匹配\n * \n * 路由策略:\n * 1. OpenRouter 格式(包含 /)优先级最高 - 确保 vendor/model 格式都走 OpenRouter\n * 2. 原生 Provider 前缀匹配 - qwen-*, gemini-* 走原生 API\n * 3. 默认路由到 ARK(火山引擎)\n */\nconst MODEL_ROUTES: RouteRule[] = [\n // === 高优先级:OpenRouter 格式(包含 /)===\n // 所有包含 / 的模型名都路由到 OpenRouter\n // 例如:qwen/qwen3-max, anthropic/claude-opus-4.5, openai/gpt-5.2\n {\n type: 'contains',\n pattern: '/',\n provider: 'openrouter',\n priority: 100,\n description: 'OpenRouter 格式模型(vendor/model)'\n },\n\n // === 中优先级:原生 Provider 前缀匹配 ===\n {\n type: 'prefix',\n pattern: 'qwen',\n provider: 'qwen',\n priority: 50,\n description: 'Qwen (DashScope) 原生模型'\n },\n {\n type: 'prefix',\n pattern: 'gemini',\n provider: 'gemini',\n priority: 50,\n description: 'Gemini (Google AI) 原生模型'\n },\n\n // === 低优先级:ARK 火山引擎模型 ===\n {\n type: 'prefix',\n pattern: 'doubao',\n provider: 'ark',\n priority: 30,\n description: '豆包模型(火山引擎)'\n },\n {\n type: 'prefix',\n pattern: 'deepseek',\n provider: 'ark',\n priority: 30,\n description: 'DeepSeek 模型(火山引擎)'\n },\n];\n\n/** 默认 Provider(无规则匹配时) */\nconst DEFAULT_PROVIDER: ProviderType = 'ark';\n\n/** 按优先级排序的规则缓存 */\nlet sortedRulesCache: RouteRule[] | null = null;\n\n/** 获取排序后的规则 */\nfunction getSortedRules(): RouteRule[] {\n if (!sortedRulesCache) {\n sortedRulesCache = [...MODEL_ROUTES].sort((a, b) => b.priority - a.priority);\n }\n return sortedRulesCache;\n}\n\n/** 匹配单条规则 */\nfunction matchRule(model: string, rule: RouteRule): boolean {\n const lowerPattern = rule.pattern.toLowerCase();\n \n switch (rule.type) {\n case 'exact':\n return model === lowerPattern;\n case 'prefix':\n return model.startsWith(lowerPattern);\n case 'contains':\n return model.includes(lowerPattern);\n case 'regex':\n return new RegExp(rule.pattern, 'i').test(model);\n default:\n return false;\n }\n}\n\n/**\n * 将模型路由到对应的 Provider\n * \n * @param model - 模型名称\n * @returns Provider 类型\n */\nexport function routeModelToProvider(model: string): ProviderType {\n return routeModelWithDetails(model).provider;\n}\n\n/**\n * 将模型路由到对应的 Provider(带详细信息)\n * \n * @param model - 模型名称\n * @returns 路由结果(包含匹配规则信息)\n */\nexport function routeModelWithDetails(model: string): RouteResult {\n const lowerModel = model.toLowerCase();\n const sortedRules = getSortedRules();\n \n for (const rule of sortedRules) {\n if (matchRule(lowerModel, rule)) {\n return {\n provider: rule.provider,\n matchedRule: rule,\n isDefault: false\n };\n }\n }\n \n return {\n provider: DEFAULT_PROVIDER,\n isDefault: true\n };\n}\n\n/**\n * 获取所有路由规则(调试用)\n */\nexport function getRouteRules(): readonly RouteRule[] {\n return MODEL_ROUTES;\n}\n\n/**\n * 获取默认 Provider\n */\nexport function getDefaultProvider(): ProviderType {\n return DEFAULT_PROVIDER;\n}\n\n/**\n * 检查模型是否匹配某个 Provider\n * \n * @param model - 模型名称\n * @param provider - Provider 类型\n * @returns 是否匹配\n */\nexport function isModelForProvider(model: string, provider: ProviderType): boolean {\n return routeModelToProvider(model) === provider;\n}\n\n","/**\n * Chat Orchestrator\n * \n * 统一处理:\n * 1. 工具调用循环 (while iterations < MAX)\n * 2. 消息历史维护 (assistant + tool 消息)\n * 3. 事件发射 (ChatEvent)\n * 4. 错误处理\n * \n * 所有 Provider 通过此类执行,确保行为一致\n */\n\nimport type { ChatEvent } from '../events';\nimport type { ChatMessage, ToolDefinition, SideEffect } from '../types';\nimport type {\n ProviderAdapter,\n StandardMessage,\n StreamChunk,\n ToolCallRequest,\n OrchestratorConfig,\n OrchestratorContext,\n OrchestratorOptions,\n SearchResultItem,\n AutoRunConfig,\n} from './types';\nimport {\n createTextDelta,\n createThinkingStart,\n createThinkingDelta,\n createThinkingEnd,\n createSearchStart,\n createSearchResult,\n createSearchEnd,\n createToolCallStart,\n createToolCallResult,\n createDone,\n createAbort,\n createApiError,\n} from '../events';\nimport type { ToolApprovalRequestEvent } from '../events';\n\n/** 默认最大迭代次数 */\nconst DEFAULT_MAX_ITERATIONS = 10;\n\n/**\n * Chat Orchestrator\n * \n * 核心职责:统一处理工具调用循环,所有 Provider 共享相同的逻辑\n */\nexport class ChatOrchestrator {\n private config: OrchestratorConfig;\n \n constructor(config: OrchestratorConfig) {\n this.config = {\n maxIterations: DEFAULT_MAX_ITERATIONS,\n ...config,\n };\n }\n\n /**\n * 执行聊天\n * \n * @param adapter Provider 适配器\n * @param message 用户消息\n * @param context Orchestrator 上下文\n * @param options 选项\n */\n async *chat(\n adapter: ProviderAdapter,\n message: string,\n context: OrchestratorContext,\n options: OrchestratorOptions\n ): AsyncGenerator<ChatEvent> {\n const startedAt = Date.now();\n const maxIterations = this.config.maxIterations ?? DEFAULT_MAX_ITERATIONS;\n \n // 构建标准化消息列表\n const messages = this.buildMessages(context, message);\n \n // 状态追踪\n let iterations = 0;\n let finalText = '';\n let thinkingText = '';\n let thinkingStartedAt = 0;\n let thinkingComplete = !options.enableThinking;\n let searchResults: SearchResultItem[] = [];\n let searchStartedAt = 0;\n let searchStarted = false;\n \n // 发送思考开始事件\n if (options.enableThinking) {\n thinkingStartedAt = Date.now();\n yield createThinkingStart();\n }\n \n // 工具调用循环\n while (iterations < maxIterations) {\n if (context.signal.aborted) {\n // 取消请求,前端负责保存消息到数据库\n yield createAbort('请求已取消');\n return;\n }\n \n iterations++;\n \n try {\n // 调用 Adapter 获取单次响应\n const pendingToolCalls: ToolCallRequest[] = [];\n let hasToolCalls = false;\n \n const stream = adapter.streamOnce(messages, context.tools, {\n model: options.model,\n enableThinking: options.enableThinking && iterations === 1, // 只在第一轮启用思考\n enableSearch: options.enableSearch && iterations === 1,\n signal: context.signal,\n });\n \n for await (const chunk of stream) {\n switch (chunk.type) {\n case 'text':\n if (chunk.text) {\n // 如果还在思考中,先结束思考\n if (!thinkingComplete) {\n thinkingComplete = true;\n yield createThinkingEnd(thinkingStartedAt);\n }\n finalText += chunk.text;\n yield createTextDelta(chunk.text);\n }\n break;\n \n case 'thinking':\n if (chunk.thinking) {\n thinkingText += chunk.thinking;\n yield createThinkingDelta(chunk.thinking);\n }\n break;\n \n case 'thinking_done':\n if (!thinkingComplete) {\n thinkingComplete = true;\n yield createThinkingEnd(thinkingStartedAt);\n }\n break;\n \n case 'tool_call':\n if (chunk.toolCall) {\n pendingToolCalls.push(chunk.toolCall);\n hasToolCalls = true;\n }\n break;\n \n case 'search_result':\n if (chunk.searchResults) {\n // 首次收到搜索结果时,发送 search_start 事件\n if (!searchStarted) {\n searchStarted = true;\n searchStartedAt = Date.now();\n yield createSearchStart(message);\n }\n searchResults = chunk.searchResults;\n yield createSearchResult(searchResults, searchStartedAt);\n }\n break;\n \n case 'done':\n // 响应完成\n if (chunk.finishReason === 'tool_calls') {\n hasToolCalls = true;\n }\n break;\n \n case 'error':\n yield createApiError(chunk.error ?? '未知错误');\n return;\n }\n }\n \n // 确保思考状态完成\n if (!thinkingComplete) {\n thinkingComplete = true;\n yield createThinkingEnd(thinkingStartedAt);\n }\n \n // 处理工具调用\n if (hasToolCalls && pendingToolCalls.length > 0) {\n // 1. 添加 assistant 消息(包含 tool_calls)到消息历史\n const assistantMessage: StandardMessage = {\n role: 'assistant',\n content: finalText,\n toolCalls: pendingToolCalls,\n };\n messages.push(assistantMessage);\n \n // 2. 执行工具并添加 tool 消息\n for (const toolCall of pendingToolCalls) {\n const toolStartedAt = Date.now();\n \n // 解析参数\n let args: Record<string, unknown>;\n try {\n args = JSON.parse(toolCall.arguments || '{}');\n } catch {\n // 参数解析失败,添加错误消息\n messages.push({\n role: 'tool',\n content: '参数解析错误',\n toolCallId: toolCall.id,\n });\n continue;\n }\n \n // 获取最新的自动运行配置(优先使用动态回调)\n const autoRunConfig = this.config.getAutoRunConfig \n ? await this.config.getAutoRunConfig()\n : (options.autoRunConfig || this.config.autoRunConfig);\n\n // 手动批准模式:需要用户确认\n console.log('[Orchestrator] 检查工具批准:', {\n toolName: toolCall.name,\n autoRunConfigMode: autoRunConfig?.mode,\n hasCallback: !!this.config.onToolApprovalRequest,\n });\n if (autoRunConfig?.mode === 'manual' && this.config.onToolApprovalRequest) {\n console.log('[Orchestrator] 发送工具批准请求:', toolCall.name);\n // 发送批准请求事件\n const approvalRequest: ToolApprovalRequestEvent = {\n type: 'tool_approval_request',\n data: {\n id: toolCall.id,\n name: toolCall.name,\n args,\n requestedAt: Date.now(),\n },\n };\n yield approvalRequest;\n\n // 等待用户批准\n const approved = await this.config.onToolApprovalRequest({\n id: toolCall.id,\n name: toolCall.name,\n args,\n });\n\n if (!approved) {\n // 用户跳过执行\n const result = JSON.stringify({ skipped: true, message: '用户跳过了此工具' });\n yield createToolCallResult(toolCall.id, toolCall.name, result, false, toolStartedAt);\n messages.push({\n role: 'tool',\n content: result,\n toolCallId: toolCall.id,\n toolName: toolCall.name,\n });\n continue;\n }\n }\n\n // 发射工具开始事件\n yield createToolCallStart(toolCall.id, toolCall.name, args);\n \n // 执行工具\n let result: string;\n let dynamicSideEffects: SideEffect[] | undefined;\n let success = true;\n try {\n const executeResult = await this.config.executeTool(toolCall.name, args, context.signal);\n // 处理返回值:可能是字符串或 ToolResult\n if (typeof executeResult === 'string') {\n result = executeResult;\n } else {\n result = executeResult.result;\n dynamicSideEffects = executeResult.sideEffects;\n }\n } catch (error) {\n success = false;\n const errorMessage = error instanceof Error ? error.message : String(error);\n result = `错误: ${errorMessage}`;\n }\n \n // 获取副作用:动态副作用优先,否则使用静态声明\n const tool = this.config.tools?.get(toolCall.name);\n const sideEffects = dynamicSideEffects ?? tool?.sideEffects;\n \n // 发射工具结果事件(包含副作用信息)\n yield createToolCallResult(toolCall.id, toolCall.name, result, success, toolStartedAt, undefined, sideEffects);\n \n // 添加 tool 消息到历史\n messages.push({\n role: 'tool',\n content: result,\n toolCallId: toolCall.id,\n toolName: toolCall.name, // Gemini 需要工具名称\n });\n \n // 工具执行后检查取消信号:如果用户在工具执行过程中取消,立即终止\n if (context.signal.aborted) {\n yield createAbort('请求已取消');\n return;\n }\n }\n \n // 清空累积文本,进入下一轮\n finalText = '';\n continue;\n }\n \n // 没有工具调用,响应完成\n break;\n \n } catch (error) {\n if (context.signal.aborted) {\n // 取消请求,前端负责保存消息到数据库\n yield createAbort('请求已取消');\n } else {\n yield createApiError(error instanceof Error ? error.message : String(error));\n }\n return;\n }\n }\n \n // 确保搜索状态完成\n if (searchStarted) {\n yield createSearchEnd(true, searchStartedAt);\n }\n \n // 注意:不再更新 context.history\n // 无状态架构:前端负责保存消息到数据库,下次请求时重新构建历史\n \n // 发射完成事件\n const duration = Date.now() - startedAt;\n yield createDone(finalText, undefined, duration);\n }\n \n /**\n * 构建标准化消息列表\n */\n private buildMessages(context: OrchestratorContext, message: string): StandardMessage[] {\n const messages: StandardMessage[] = [];\n \n // 系统提示\n if (context.systemPrompt) {\n messages.push({\n role: 'system',\n content: context.systemPrompt,\n });\n }\n \n // 历史消息\n for (const msg of context.history) {\n const standardMsg: StandardMessage = {\n role: msg.role as 'user' | 'assistant',\n content: msg.content,\n };\n \n // 处理工具调用\n if (msg.tool_calls) {\n standardMsg.toolCalls = msg.tool_calls.map(tc => ({\n id: tc.id,\n name: tc.function.name,\n arguments: tc.function.arguments,\n }));\n }\n \n messages.push(standardMsg);\n }\n \n // 当前用户消息\n messages.push({\n role: 'user',\n content: message,\n images: context.images,\n });\n \n return messages;\n }\n}\n\n/**\n * 创建 Orchestrator 实例\n */\nexport function createOrchestrator(config: OrchestratorConfig): ChatOrchestrator {\n return new ChatOrchestrator(config);\n}\n","/**\n * ARK (火山引擎) Adapter\n * \n * 职责:\n * - 将标准消息转换为 ARK Responses API 格式\n * - 调用 API 并解析响应为标准 StreamChunk\n * - 不处理工具执行和消息历史\n */\n\nimport type {\n ProviderAdapter,\n AdapterConfig,\n StandardMessage,\n StreamChunk,\n StreamOnceOptions,\n ToolCallRequest,\n SearchResultItem,\n SimpleToolDefinition,\n} from '../types';\nimport {\n DOUBAO_SEED_1_8,\n DOUBAO_SEED_1_6,\n DOUBAO_SEED_1_6_LATEST,\n DOUBAO_SEED_1_6_FLASH,\n DEFAULT_ARK_URL,\n} from '../../constants';\n\n/** ARK 支持的模型 */\nexport const ARK_MODELS = [\n DOUBAO_SEED_1_8.id,\n DOUBAO_SEED_1_6.id,\n DOUBAO_SEED_1_6_LATEST.id,\n DOUBAO_SEED_1_6_FLASH.id,\n 'doubao-1-5-pro-32k-250115',\n 'doubao-1-5-pro-256k-250115',\n 'doubao-1-5-lite-32k-250115',\n];\n\n/**\n * ARK Adapter\n * \n * 使用 Responses API 格式\n */\nexport class ArkAdapter implements ProviderAdapter {\n readonly name = 'ark';\n readonly supportedModels = ARK_MODELS;\n \n private apiKey: string;\n private apiUrl: string;\n \n constructor(config: AdapterConfig) {\n this.apiKey = config.apiKey;\n this.apiUrl = config.apiUrl ?? DEFAULT_ARK_URL;\n }\n \n supportsModel(model: string): boolean {\n return this.supportedModels.some(m => model.includes(m) || m.includes(model));\n }\n \n /**\n * 单次流式调用\n */\n async *streamOnce(\n messages: StandardMessage[],\n tools: SimpleToolDefinition[],\n options: StreamOnceOptions\n ): AsyncGenerator<StreamChunk> {\n // 转换为 ARK Responses API 格式\n const input = this.convertMessages(messages);\n \n // 构建请求体\n const requestBody: Record<string, unknown> = {\n model: options.model,\n stream: true,\n max_output_tokens: 32768,\n input,\n };\n \n // 构建工具列表\n const apiTools: unknown[] = [];\n \n // 添加联网搜索工具\n if (options.enableSearch) {\n apiTools.push({ type: 'web_search', max_keyword: 5, limit: 20 });\n }\n \n // 添加函数调用工具\n if (tools.length > 0) {\n for (const t of tools) {\n apiTools.push({\n type: 'function',\n name: t.name,\n description: t.description,\n parameters: t.parameters,\n });\n }\n }\n \n if (apiTools.length > 0) {\n requestBody.tools = apiTools;\n }\n \n if (options.enableThinking) {\n // 只使用 thinking 参数,某些模型不支持 reasoning\n requestBody.thinking = { type: 'enabled' };\n }\n \n // 发送请求\n const response = await fetch(`${this.apiUrl}/responses`, {\n method: 'POST',\n headers: {\n 'Authorization': `Bearer ${this.apiKey}`,\n 'Content-Type': 'application/json',\n },\n body: JSON.stringify(requestBody),\n signal: options.signal,\n });\n \n if (!response.ok) {\n const errorText = await response.text();\n yield { type: 'error', error: `ARK API 错误: ${response.status} - ${errorText}` };\n return;\n }\n \n const reader = response.body?.getReader();\n if (!reader) {\n yield { type: 'error', error: '无法获取响应流' };\n return;\n }\n \n // 解析流式响应\n yield* this.parseStream(reader);\n }\n \n /**\n * 转换标准消息为 ARK Responses API 格式\n */\n private convertMessages(messages: StandardMessage[]): unknown[] {\n const input: unknown[] = [];\n \n for (const msg of messages) {\n switch (msg.role) {\n case 'system':\n input.push({ role: 'system', content: msg.content });\n break;\n \n case 'user': {\n const content: unknown[] = [{ type: 'input_text', text: msg.content }];\n // 添加图片\n if (msg.images?.length) {\n for (const img of msg.images) {\n content.push({\n type: 'input_image',\n image_url: img.startsWith('data:') ? img : `data:image/jpeg;base64,${img}`,\n });\n }\n }\n input.push({ role: 'user', content });\n break;\n }\n \n case 'assistant':\n // 如果有工具调用,添加 function_call\n if (msg.toolCalls?.length) {\n for (const tc of msg.toolCalls) {\n input.push({\n type: 'function_call',\n call_id: tc.id,\n name: tc.name,\n arguments: tc.arguments,\n });\n }\n } else {\n // 普通助手消息\n input.push({\n role: 'developer',\n content: `[上一轮AI回复]: ${msg.content}`,\n });\n }\n break;\n \n case 'tool':\n input.push({\n type: 'function_call_output',\n call_id: msg.toolCallId,\n output: msg.content,\n });\n break;\n }\n }\n \n return input;\n }\n \n /**\n * 解析 ARK 流式响应\n */\n private async *parseStream(reader: ReadableStreamDefaultReader<Uint8Array>): AsyncGenerator<StreamChunk> {\n const decoder = new TextDecoder();\n let buffer = '';\n const pendingToolCalls = new Map<string, ToolCallRequest>();\n let currentFunctionCallId: string | null = null;\n const searchResults: SearchResultItem[] = [];\n \n while (true) {\n const { done, value } = await reader.read();\n if (done) break;\n \n buffer += decoder.decode(value, { stream: true });\n const lines = buffer.split('\\n');\n buffer = lines.pop() || '';\n \n for (const line of lines) {\n if (!line.startsWith('data:')) continue;\n const data = line.slice(5).trim();\n if (data === '[DONE]') {\n // 发送完成信号\n if (pendingToolCalls.size > 0) {\n // 先发送所有工具调用\n for (const tc of pendingToolCalls.values()) {\n yield { type: 'tool_call', toolCall: tc };\n }\n yield { type: 'done', finishReason: 'tool_calls' };\n } else {\n yield { type: 'done', finishReason: 'stop' };\n }\n return;\n }\n \n try {\n const event = JSON.parse(data);\n \n switch (event.type) {\n case 'response.output_item.added': {\n const item = event.item;\n if (item?.type === 'function_call') {\n // ARK Responses API 使用 call_id 字段\n const callId = item.call_id;\n if (!callId) {\n console.warn('[ARK] function_call 缺少 call_id');\n break;\n }\n currentFunctionCallId = callId;\n pendingToolCalls.set(callId, {\n id: callId,\n name: item.name || '',\n arguments: item.arguments || '',\n });\n }\n break;\n }\n \n case 'response.function_call_arguments.delta': {\n if (currentFunctionCallId) {\n const call = pendingToolCalls.get(currentFunctionCallId);\n if (call) {\n call.arguments += event.delta || '';\n }\n }\n break;\n }\n \n case 'response.function_call_arguments.done':\n case 'response.output_item.done': {\n const item = event.item;\n if (item?.type === 'function_call' && item.call_id) {\n // ARK Responses API 使用 call_id 字段\n const callId = item.call_id;\n const existing = pendingToolCalls.get(callId);\n pendingToolCalls.set(callId, {\n id: callId,\n name: item.name || existing?.name || '',\n arguments: item.arguments || existing?.arguments || '{}',\n });\n }\n break;\n }\n \n case 'response.output_text.annotation.added': {\n const annotation = event.annotation;\n const isUrlCitation = annotation?.type === 'url_citation' || \n annotation?.type === 'citation' ||\n annotation?.url;\n if (isUrlCitation && annotation?.url) {\n const exists = searchResults.some(r => r.url === annotation.url);\n if (!exists) {\n searchResults.push({\n title: annotation.title || annotation.text || '',\n url: annotation.url,\n snippet: annotation.summary || annotation.snippet || '',\n });\n yield { type: 'search_result', searchResults: [...searchResults] };\n }\n }\n break;\n }\n \n case 'response.output_text.delta':\n if (event.delta) {\n yield { type: 'text', text: event.delta };\n }\n break;\n \n case 'response.reasoning_summary_text.delta':\n if (event.delta) {\n yield { type: 'thinking', thinking: event.delta };\n }\n break;\n \n case 'response.reasoning_summary_text.done':\n yield { type: 'thinking_done' };\n break;\n }\n } catch {\n // 忽略解析错误\n }\n }\n }\n \n // 处理最后的工具调用\n if (pendingToolCalls.size > 0) {\n for (const tc of pendingToolCalls.values()) {\n yield { type: 'tool_call', toolCall: tc };\n }\n yield { type: 'done', finishReason: 'tool_calls' };\n } else {\n yield { type: 'done', finishReason: 'stop' };\n }\n }\n}\n\n/**\n * 创建 ARK Adapter\n */\nexport function createArkAdapter(config: AdapterConfig): ArkAdapter {\n return new ArkAdapter(config);\n}\n","/**\n * OpenRouter Adapter\n * \n * 职责:\n * - 将标准消息转换为 OpenAI 兼容格式\n * - 调用 API 并解析响应为标准 StreamChunk\n * - 不处理工具执行和消息历史\n */\n\nimport type {\n ProviderAdapter,\n AdapterConfig,\n StandardMessage,\n StreamChunk,\n StreamOnceOptions,\n ToolCallRequest,\n SimpleToolDefinition,\n SearchResultItem,\n} from '../types';\nimport {\n OR_GEMINI_2_5_FLASH,\n OR_GEMINI_2_5_PRO,\n OR_GEMINI_2_0_FLASH,\n OR_DEEPSEEK_R1,\n OR_DEEPSEEK_CHAT_V3,\n DEFAULT_OPENROUTER_URL,\n} from '../../constants';\n\n/** OpenRouter 支持的模型 */\nexport const OPENROUTER_MODELS = [\n OR_GEMINI_2_5_FLASH.id,\n OR_GEMINI_2_5_PRO.id,\n OR_GEMINI_2_0_FLASH.id,\n 'anthropic/claude-sonnet-4',\n 'anthropic/claude-3.5-sonnet',\n 'openai/gpt-4o',\n 'openai/gpt-4o-mini',\n OR_DEEPSEEK_R1.id,\n OR_DEEPSEEK_CHAT_V3.id,\n];\n\n/** 流式响应 delta */\ninterface StreamDelta {\n content?: string;\n reasoning?: string;\n tool_calls?: Array<{\n index: number;\n id?: string;\n type?: string;\n function?: {\n name?: string;\n arguments?: string;\n };\n }>;\n}\n\n/**\n * OpenRouter Adapter\n * \n * 使用 OpenAI 兼容 API 格式\n */\nexport class OpenRouterAdapter implements ProviderAdapter {\n readonly name = 'openrouter';\n readonly supportedModels = OPENROUTER_MODELS;\n \n private apiKey: string;\n private apiUrl: string;\n \n constructor(config: AdapterConfig) {\n this.apiKey = config.apiKey;\n this.apiUrl = config.apiUrl ?? DEFAULT_OPENROUTER_URL;\n }\n \n supportsModel(model: string): boolean {\n return this.supportedModels.some(m => model.includes(m) || m.includes(model));\n }\n \n /**\n * 单次流式调用\n */\n async *streamOnce(\n messages: StandardMessage[],\n tools: SimpleToolDefinition[],\n options: StreamOnceOptions\n ): AsyncGenerator<StreamChunk> {\n // 转换为 OpenAI 格式\n const apiMessages = this.convertMessages(messages);\n \n // 构建请求体\n const requestBody: Record<string, unknown> = {\n model: options.model,\n messages: apiMessages,\n stream: true,\n max_tokens: 32768,\n };\n \n if (tools.length > 0) {\n requestBody.tools = tools.map(t => ({\n type: 'function',\n function: {\n name: t.name,\n description: t.description,\n parameters: t.parameters,\n },\n }));\n }\n \n // Gemini 模型特殊处理\n if (options.model.includes('gemini') && options.enableThinking) {\n requestBody.reasoning = { effort: 'high' };\n }\n \n // Claude 模型 Extended Thinking\n if (options.model.includes('claude') && options.enableThinking) {\n requestBody.reasoning = { effort: 'high', exclude: false };\n }\n \n // Web Search 插件\n if (options.enableSearch) {\n // 根据模型调整搜索结果数量,避免超出上下文限制\n const isSmallContext = options.model.includes('deepseek') || options.model.includes('qwen');\n const maxResults = isSmallContext ? 2 : 3;\n requestBody.plugins = [{ id: 'web', max_results: maxResults }];\n }\n \n // 发送请求\n const response = await fetch(`${this.apiUrl}/chat/completions`, {\n method: 'POST',\n headers: {\n 'Authorization': `Bearer ${this.apiKey}`,\n 'Content-Type': 'application/json',\n 'HTTP-Referer': 'https://ai-chat.local',\n 'X-Title': 'AI Chat',\n },\n body: JSON.stringify(requestBody),\n signal: options.signal,\n });\n \n if (!response.ok) {\n const errorText = await response.text();\n yield { type: 'error', error: `OpenRouter API 错误: ${response.status} - ${errorText}` };\n return;\n }\n \n const reader = response.body?.getReader();\n if (!reader) {\n yield { type: 'error', error: '无法获取响应流' };\n return;\n }\n \n // 解析流式响应\n yield* this.parseStream(reader);\n }\n \n /**\n * 转换标准消息为 OpenAI 格式\n */\n private convertMessages(messages: StandardMessage[]): unknown[] {\n const apiMessages: unknown[] = [];\n \n for (const msg of messages) {\n switch (msg.role) {\n case 'system':\n apiMessages.push({ role: 'system', content: msg.content });\n break;\n \n case 'user': {\n if (msg.images?.length) {\n // 多模态消息\n const content: unknown[] = [{ type: 'text', text: msg.content }];\n for (const img of msg.images) {\n content.push({\n type: 'image_url',\n image_url: { url: img.startsWith('data:') ? img : `data:image/jpeg;base64,${img}` },\n });\n }\n apiMessages.push({ role: 'user', content });\n } else {\n apiMessages.push({ role: 'user', content: msg.content });\n }\n break;\n }\n \n case 'assistant':\n if (msg.toolCalls?.length) {\n // 包含工具调用的助手消息\n apiMessages.push({\n role: 'assistant',\n content: msg.content || null,\n tool_calls: msg.toolCalls.map(tc => ({\n id: tc.id,\n type: 'function',\n function: {\n name: tc.name,\n arguments: tc.arguments,\n },\n })),\n });\n } else {\n apiMessages.push({ role: 'assistant', content: msg.content });\n }\n break;\n \n case 'tool':\n apiMessages.push({\n role: 'tool',\n tool_call_id: msg.toolCallId,\n content: msg.content,\n });\n break;\n }\n }\n \n return apiMessages;\n }\n \n /**\n * 解析 OpenAI 兼容流式响应\n */\n private async *parseStream(reader: ReadableStreamDefaultReader<Uint8Array>): AsyncGenerator<StreamChunk> {\n const decoder = new TextDecoder();\n let buffer = '';\n const toolCallsMap = new Map<number, ToolCallRequest>();\n let toolCallCounter = 0;\n let finishReason: string | null = null;\n const searchResults: SearchResultItem[] = [];\n let hasThinking = false;\n let thinkingDone = false;\n \n while (true) {\n const { done, value } = await reader.read();\n if (done) break;\n \n buffer += decoder.decode(value, { stream: true });\n const lines = buffer.split('\\n');\n buffer = lines.pop() || '';\n \n for (const line of lines) {\n if (!line.startsWith('data:')) continue;\n const data = line.slice(5).trim();\n if (data === '[DONE]') {\n // 发送搜索结果(如果有)\n if (searchResults.length > 0) {\n yield { type: 'search_result', searchResults: [...searchResults] };\n }\n // 发送工具调用\n if (toolCallsMap.size > 0) {\n for (const tc of toolCallsMap.values()) {\n if (tc.name) {\n yield { type: 'tool_call', toolCall: tc };\n }\n }\n yield { type: 'done', finishReason: 'tool_calls' };\n } else {\n yield { type: 'done', finishReason: 'stop' };\n }\n return;\n }\n \n try {\n const json = JSON.parse(data);\n const choice = json.choices?.[0];\n \n // 处理 annotations(搜索结果引用)\n const annotations = json.annotations as Array<{\n type: string;\n url_citation?: { url: string; title?: string; content?: string };\n }> | undefined;\n if (annotations?.length) {\n for (const annotation of annotations) {\n if (annotation.type === 'url_citation' && annotation.url_citation?.url) {\n const exists = searchResults.some(r => r.url === annotation.url_citation!.url);\n if (!exists) {\n searchResults.push({\n url: annotation.url_citation.url,\n title: annotation.url_citation.title || '',\n snippet: annotation.url_citation.content || '',\n });\n yield { type: 'search_result', searchResults: [...searchResults] };\n }\n }\n }\n }\n \n if (!choice) continue;\n \n const delta: StreamDelta = choice.delta || {};\n finishReason = choice.finish_reason;\n \n // 处理思考内容 (Gemini/Claude) - 必须在 text 之前处理\n if (delta.reasoning) {\n hasThinking = true;\n yield { type: 'thinking', thinking: delta.reasoning };\n }\n \n // 处理文本内容\n if (delta.content) {\n // 如果之前有思考内容,先发送 thinking_done\n if (hasThinking && !thinkingDone) {\n thinkingDone = true;\n yield { type: 'thinking_done' };\n }\n yield { type: 'text', text: delta.content };\n }\n \n // 处理工具调用\n if (delta.tool_calls?.length) {\n for (const tc of delta.tool_calls) {\n const index = tc.index;\n const existing = toolCallsMap.get(index);\n \n if (existing) {\n if (tc.function?.arguments) {\n existing.arguments += tc.function.arguments;\n }\n if (tc.function?.name) {\n existing.name = tc.function.name;\n }\n if (tc.id) {\n existing.id = tc.id;\n }\n } else {\n toolCallsMap.set(index, {\n id: tc.id || `call_${Date.now()}_${toolCallCounter++}`,\n name: tc.function?.name || '',\n arguments: tc.function?.arguments || '',\n });\n }\n }\n }\n \n // 检查完成原因\n if (finishReason === 'tool_calls') {\n // 发送工具调用\n for (const tc of toolCallsMap.values()) {\n if (tc.name) {\n yield { type: 'tool_call', toolCall: tc };\n }\n }\n yield { type: 'done', finishReason: 'tool_calls' };\n return;\n }\n } catch {\n // 忽略解析错误\n }\n }\n }\n \n // 发送最终搜索结果\n if (searchResults.length > 0) {\n yield { type: 'search_result', searchResults: [...searchResults] };\n }\n \n // 处理剩余的工具调用\n if (toolCallsMap.size > 0) {\n for (const tc of toolCallsMap.values()) {\n if (tc.name) {\n yield { type: 'tool_call', toolCall: tc };\n }\n }\n yield { type: 'done', finishReason: 'tool_calls' };\n } else {\n yield { type: 'done', finishReason: 'stop' };\n }\n }\n}\n\n/**\n * 创建 OpenRouter Adapter\n */\nexport function createOpenRouterAdapter(config: AdapterConfig): OpenRouterAdapter {\n return new OpenRouterAdapter(config);\n}\n","/**\n * Qwen (通义千问) Adapter\n * \n * 职责:\n * - 将标准消息转换为 DashScope 原生 API 格式\n * - 调用 API 并解析响应为标准 StreamChunk\n * - 不处理工具执行和消息历史\n */\n\nimport type {\n ProviderAdapter,\n AdapterConfig,\n StandardMessage,\n StreamChunk,\n StreamOnceOptions,\n ToolCallRequest,\n SearchResultItem,\n SimpleToolDefinition,\n} from '../types';\nimport {\n QWEN_MAX,\n QWEN_MAX_LATEST,\n QWEN_PLUS,\n QWEN_PLUS_LATEST,\n QWEN_TURBO,\n QWEN_TURBO_LATEST,\n QWEN3_235B,\n DEFAULT_QWEN_URL,\n} from '../../constants';\n\n/** Qwen 支持的模型 */\nexport const QWEN_MODELS = [\n QWEN_MAX.id,\n QWEN_MAX_LATEST.id,\n QWEN_PLUS.id,\n QWEN_PLUS_LATEST.id,\n QWEN_TURBO.id,\n QWEN_TURBO_LATEST.id,\n QWEN3_235B.id,\n];\n\n/** 流式响应消息 */\ninterface QwenStreamMessage {\n role?: string;\n content?: string;\n reasoning_content?: string; // 思考内容\n tool_calls?: Array<{\n id: string;\n type: string;\n function: {\n name: string;\n arguments: string;\n };\n }>;\n}\n\n/**\n * Qwen Adapter\n * \n * 使用 DashScope 原生协议\n */\nexport class QwenAdapter implements ProviderAdapter {\n readonly name = 'qwen';\n readonly supportedModels = QWEN_MODELS;\n \n private apiKey: string;\n private apiUrl: string;\n \n constructor(config: AdapterConfig) {\n this.apiKey = config.apiKey;\n this.apiUrl = config.apiUrl ?? DEFAULT_QWEN_URL;\n }\n \n supportsModel(model: string): boolean {\n return this.supportedModels.some(m => model.includes(m) || m.includes(model));\n }\n \n /**\n * 单次流式调用\n */\n async *streamOnce(\n messages: StandardMessage[],\n tools: SimpleToolDefinition[],\n options: StreamOnceOptions\n ): AsyncGenerator<StreamChunk> {\n // 转换为 Qwen 格式\n const apiMessages = this.convertMessages(messages);\n \n // 构建请求体\n const requestBody: Record<string, unknown> = {\n model: options.model,\n input: { messages: apiMessages },\n parameters: {\n result_format: 'message',\n incremental_output: true,\n enable_search: options.enableSearch,\n // 深度思考支持\n ...(options.enableThinking && {\n enable_thinking: true,\n thinking_budget: 38400,\n }),\n },\n };\n \n if (tools.length > 0) {\n requestBody.parameters = {\n ...requestBody.parameters as Record<string, unknown>,\n tools: tools.map(t => ({\n type: 'function',\n function: {\n name: t.name,\n description: t.description,\n parameters: t.parameters,\n },\n })),\n };\n }\n \n // 发送请求\n const response = await fetch(`${this.apiUrl}/services/aigc/text-generation/generation`, {\n method: 'POST',\n headers: {\n 'Authorization': `Bearer ${this.apiKey}`,\n 'Content-Type': 'application/json',\n 'X-DashScope-SSE': 'enable',\n },\n body: JSON.stringify(requestBody),\n signal: options.signal,\n });\n \n if (!response.ok) {\n const errorText = await response.text();\n yield { type: 'error', error: `Qwen API 错误: ${response.status} - ${errorText}` };\n return;\n }\n \n const reader = response.body?.getReader();\n if (!reader) {\n yield { type: 'error', error: '无法获取响应流' };\n return;\n }\n \n // 解析流式响应\n yield* this.parseStream(reader);\n }\n \n /**\n * 转换标准消息为 Qwen 格式\n */\n private convertMessages(messages: StandardMessage[]): unknown[] {\n const apiMessages: unknown[] = [];\n \n for (const msg of messages) {\n switch (msg.role) {\n case 'system':\n apiMessages.push({ role: 'system', content: msg.content });\n break;\n \n case 'user': {\n if (msg.images?.length) {\n // 多模态消息\n const content: unknown[] = [{ type: 'text', text: msg.content }];\n for (const img of msg.images) {\n content.push({\n type: 'image_url',\n image_url: { url: img.startsWith('data:') ? img : `data:image/jpeg;base64,${img}` },\n });\n }\n apiMessages.push({ role: 'user', content });\n } else {\n apiMessages.push({ role: 'user', content: msg.content });\n }\n break;\n }\n \n case 'assistant':\n if (msg.toolCalls?.length) {\n apiMessages.push({\n role: 'assistant',\n content: msg.content || '',\n tool_calls: msg.toolCalls.map(tc => ({\n id: tc.id,\n type: 'function',\n function: {\n name: tc.name,\n arguments: tc.arguments,\n },\n })),\n });\n } else {\n apiMessages.push({ role: 'assistant', content: msg.content });\n }\n break;\n \n case 'tool':\n apiMessages.push({\n role: 'tool',\n tool_call_id: msg.toolCallId,\n content: msg.content,\n });\n break;\n }\n }\n \n return apiMessages;\n }\n \n /**\n * 解析 Qwen 流式响应\n */\n private async *parseStream(reader: ReadableStreamDefaultReader<Uint8Array>): AsyncGenerator<StreamChunk> {\n const decoder = new TextDecoder();\n let buffer = '';\n const toolCallsMap = new Map<number, ToolCallRequest>();\n let toolCallCounter = 0;\n const searchResults: SearchResultItem[] = [];\n let hasThinking = false;\n let thinkingDone = false;\n \n while (true) {\n const { done, value } = await reader.read();\n if (done) break;\n \n buffer += decoder.decode(value, { stream: true });\n const lines = buffer.split('\\n');\n buffer = lines.pop() || '';\n \n for (const line of lines) {\n if (!line.startsWith('data:')) continue;\n const data = line.slice(5).trim();\n if (!data || data === '[DONE]') continue;\n \n try {\n const json = JSON.parse(data);\n const output = json.output;\n if (!output) continue;\n \n const choice = output.choices?.[0];\n const message: QwenStreamMessage = choice?.message || {};\n const finishReason = choice?.finish_reason;\n \n // 处理思考内容\n if (message.reasoning_content) {\n hasThinking = true;\n yield { type: 'thinking', thinking: message.reasoning_content };\n }\n \n // 处理文本内容\n if (message.content) {\n // 如果之前有思考内容,先发送 thinking_done\n if (!thinkingDone && hasThinking) {\n thinkingDone = true;\n yield { type: 'thinking_done' };\n }\n yield { type: 'text', text: message.content };\n }\n \n // 处理搜索结果(通过 search_info)\n const searchInfo = json.output?.search_info;\n if (searchInfo?.search_results?.length) {\n for (const result of searchInfo.search_results) {\n const exists = searchResults.some(r => r.url === result.url);\n if (!exists) {\n searchResults.push({\n title: result.title || '',\n url: result.url || '',\n snippet: result.snippet || '',\n });\n }\n }\n yield { type: 'search_result', searchResults: [...searchResults] };\n }\n \n // 处理工具调用\n if (message.tool_calls?.length) {\n for (const tc of message.tool_calls) {\n const index = toolCallsMap.size;\n const existing = toolCallsMap.get(index);\n \n if (existing) {\n if (tc.function?.arguments) {\n existing.arguments += tc.function.arguments;\n }\n } else {\n toolCallsMap.set(index, {\n id: tc.id || `call_${Date.now()}_${toolCallCounter++}`,\n name: tc.function.name,\n arguments: tc.function.arguments,\n });\n }\n }\n }\n \n // 检查完成原因\n if (finishReason === 'stop' || finishReason === 'length' || finishReason === 'tool_calls') {\n if (toolCallsMap.size > 0) {\n for (const tc of toolCallsMap.values()) {\n yield { type: 'tool_call', toolCall: tc };\n }\n yield { type: 'done', finishReason: 'tool_calls' };\n } else {\n yield { type: 'done', finishReason: 'stop' };\n }\n return;\n }\n } catch {\n // 忽略解析错误\n }\n }\n }\n \n // 处理剩余的工具调用\n if (toolCallsMap.size > 0) {\n for (const tc of toolCallsMap.values()) {\n yield { type: 'tool_call', toolCall: tc };\n }\n yield { type: 'done', finishReason: 'tool_calls' };\n } else {\n yield { type: 'done', finishReason: 'stop' };\n }\n }\n}\n\n/**\n * 创建 Qwen Adapter\n */\nexport function createQwenAdapter(config: AdapterConfig): QwenAdapter {\n return new QwenAdapter(config);\n}\n","/**\n * Gemini Adapter\n * \n * 职责:\n * - 将标准消息转换为 Gemini SDK 格式\n * - 调用 SDK 并解析响应为标准 StreamChunk\n * - 不处理工具执行和消息历史\n */\n\nimport type {\n ProviderAdapter,\n StandardMessage,\n StreamChunk,\n StreamOnceOptions,\n ToolCallRequest,\n SimpleToolDefinition,\n} from '../types';\nimport {\n GEMINI_2_5_FLASH,\n GEMINI_2_5_PRO,\n GEMINI_2_0_FLASH,\n GEMINI_2_0_FLASH_LITE,\n GEMINI_3_PRO,\n} from '../../constants';\n\n/** Gemini 支持的模型 */\nexport const GEMINI_MODELS = [\n GEMINI_2_5_FLASH.id,\n GEMINI_2_5_PRO.id,\n GEMINI_2_0_FLASH.id,\n GEMINI_2_0_FLASH_LITE.id,\n GEMINI_3_PRO.id,\n];\n\n/** Gemini Adapter 配置 */\nexport interface GeminiAdapterConfig {\n apiKey: string;\n}\n\n/** Part 扩展类型 */\ninterface ExtendedPart {\n text?: string;\n thought?: boolean;\n thoughtSignature?: string;\n functionCall?: {\n name: string;\n args: Record<string, unknown>;\n };\n}\n\n/**\n * Gemini Adapter\n * \n * 使用 @google/genai SDK\n */\nexport class GeminiAdapter implements ProviderAdapter {\n readonly name = 'gemini';\n readonly supportedModels = GEMINI_MODELS;\n \n private client: unknown = null;\n private apiKey: string;\n \n constructor(config: GeminiAdapterConfig) {\n this.apiKey = config.apiKey;\n }\n \n /** 懒加载客户端 */\n private async getClient() {\n if (!this.client) {\n const { GoogleGenAI } = await import('@google/genai');\n this.client = new GoogleGenAI({ apiKey: this.apiKey });\n }\n return this.client as { models: { generateContentStream: (options: unknown) => Promise<AsyncIterable<unknown>> } };\n }\n \n supportsModel(model: string): boolean {\n return this.supportedModels.some(m => model.includes(m) || m.includes(model)) || model.startsWith('gemini-');\n }\n \n /**\n * 单次流式调用\n */\n async *streamOnce(\n messages: StandardMessage[],\n tools: SimpleToolDefinition[],\n options: StreamOnceOptions\n ): AsyncGenerator<StreamChunk> {\n const client = await this.getClient();\n \n // 转换为 Gemini 格式\n const geminiMessages = this.convertMessages(messages);\n \n // 构建配置\n const generateConfig: Record<string, unknown> = {};\n \n // 构建工具列表\n const toolsConfig: unknown[] = [];\n \n if (tools.length > 0) {\n toolsConfig.push({\n functionDeclarations: tools.map(t => ({\n name: t.name,\n description: t.description,\n parameters: t.parameters,\n })),\n });\n }\n \n // 添加 Google Search 工具\n if (options.enableSearch) {\n toolsConfig.push({ googleSearch: {} });\n }\n \n if (toolsConfig.length > 0) {\n generateConfig.tools = toolsConfig;\n }\n \n if (options.enableThinking) {\n generateConfig.thinkingConfig = {\n thinkingLevel: 'high',\n includeThoughts: true,\n };\n }\n \n try {\n const streamResponse = await client.models.generateContentStream({\n model: options.model,\n contents: geminiMessages,\n config: generateConfig,\n });\n \n const pendingToolCalls: ToolCallRequest[] = [];\n let toolCallCounter = 0;\n let hasThinking = false;\n let thinkingDone = false;\n \n for await (const chunk of streamResponse) {\n // 检查中断\n if (options.signal.aborted) {\n yield { type: 'error', error: '请求已取消' };\n return;\n }\n \n const candidate = (chunk as { candidates?: Array<{ content?: { parts?: ExtendedPart[] } }> }).candidates?.[0];\n if (!candidate) continue;\n \n const parts = candidate.content?.parts || [];\n \n for (const part of parts) {\n // 处理思考内容\n if (part.thought && part.text) {\n hasThinking = true;\n yield { type: 'thinking', thinking: part.text };\n continue;\n }\n \n // 处理文本内容\n if (part.text && !part.thought) {\n // 如果之前有思考内容,先发送 thinking_done\n if (hasThinking && !thinkingDone) {\n thinkingDone = true;\n yield { type: 'thinking_done' };\n }\n yield { type: 'text', text: part.text };\n }\n \n // 处理工具调用\n if (part.functionCall && part.functionCall.name) {\n pendingToolCalls.push({\n id: `call_${Date.now()}_${toolCallCounter++}`,\n name: part.functionCall.name,\n arguments: JSON.stringify(part.functionCall.args || {}),\n });\n }\n }\n }\n \n // 发送工具调用\n if (pendingToolCalls.length > 0) {\n for (const tc of pendingToolCalls) {\n yield { type: 'tool_call', toolCall: tc };\n }\n yield { type: 'done', finishReason: 'tool_calls' };\n } else {\n yield { type: 'done', finishReason: 'stop' };\n }\n \n } catch (error) {\n const errorStr = String(error);\n if (errorStr.includes('User location is not supported') || \n errorStr.includes('FAILED_PRECONDITION')) {\n yield { \n type: 'error', \n error: 'Gemini API 不支持当前地区(中国大陆无法访问)。请使用其他模型。' \n };\n } else {\n yield { type: 'error', error: errorStr };\n }\n }\n }\n \n /**\n * 转换标准消息为 Gemini 格式\n */\n private convertMessages(messages: StandardMessage[]) {\n const geminiMessages: Array<{ role: string; parts: unknown[] }> = [];\n \n for (const msg of messages) {\n switch (msg.role) {\n case 'system':\n // Gemini 没有 system role,用 user+model 模拟\n geminiMessages.push(\n { role: 'user', parts: [{ text: msg.content }] },\n { role: 'model', parts: [{ text: 'OK' }] }\n );\n break;\n \n case 'user': {\n const parts: unknown[] = [{ text: msg.content }];\n // 添加图片\n if (msg.images?.length) {\n for (const img of msg.images) {\n const base64 = img.startsWith('data:') \n ? img.split(',')[1] \n : img;\n parts.push({\n inlineData: {\n mimeType: 'image/jpeg',\n data: base64,\n },\n });\n }\n }\n geminiMessages.push({ role: 'user', parts });\n break;\n }\n \n case 'assistant':\n if (msg.toolCalls?.length) {\n // 包含工具调用的助手消息\n const parts: unknown[] = [];\n if (msg.content) {\n parts.push({ text: msg.content });\n }\n for (const tc of msg.toolCalls) {\n parts.push({\n functionCall: {\n name: tc.name,\n args: JSON.parse(tc.arguments || '{}'),\n },\n });\n }\n geminiMessages.push({ role: 'model', parts });\n } else {\n geminiMessages.push({\n role: 'model',\n parts: [{ text: msg.content }],\n });\n }\n break;\n \n case 'tool':\n // Gemini 使用 functionResponse,需要工具名称\n geminiMessages.push({\n role: 'user',\n parts: [{\n functionResponse: {\n name: msg.toolName || 'unknown_tool',\n response: { result: msg.content },\n },\n }],\n });\n break;\n }\n }\n \n return geminiMessages;\n }\n}\n\n/**\n * 创建 Gemini Adapter\n */\nexport function createGeminiAdapter(config: GeminiAdapterConfig): GeminiAdapter {\n return new GeminiAdapter(config);\n}\n","/**\n * HybridAgent - 混合 AI Agent\n * \n * 新架构说明:\n * - ChatOrchestrator: 统一处理工具调用循环、消息历史、事件发射\n * - ProviderAdapter: 只负责 API 格式转换,不处理业务逻辑\n * - HybridAgent: 协调者,负责初始化和路由\n * \n * 这种设计确保:\n * 1. 所有 Provider 共享相同的工具调用逻辑\n * 2. 修改一处,所有 Provider 生效\n * 3. 每个 Adapter 只关心自己的 API 格式\n */\n\nimport { GoogleGenAI } from '@google/genai';\nimport type { \n AgentConfig, \n ToolExecutor,\n ChatMessage,\n ChatOptions,\n ThinkingMode,\n Tool,\n ToolContext,\n ToolResult,\n ToolConfigItem,\n} from './types';\nimport { resolveTools } from './types';\nimport type { ChatEvent } from './events';\nimport { createApiError } from './events';\nimport { MODELS } from './types';\nimport { createDefaultToolExecutor } from './tools';\nimport { DEFAULT_ARK_URL, DEFAULT_QWEN_NATIVE_URL, DEFAULT_OPENROUTER_URL, DEFAULT_MODEL, PLAN_MODE_PROMPT, AGENT_MODE_PROMPT } from './constants';\nimport { routeModelToProvider, routeModelWithDetails, type ProviderType, type RouteResult } from './router';\n\n// 新架构导入\nimport type { ProviderAdapter, OrchestratorContext, SimpleToolDefinition } from './providers/types';\nimport { ChatOrchestrator } from './providers/orchestrator';\nimport { \n ArkAdapter, \n OpenRouterAdapter, \n QwenAdapter, \n GeminiAdapter \n} from './providers/adapters';\n\n/** 运行时配置(API Keys 和 URLs) */\nexport interface RuntimeConfig {\n arkApiKey: string;\n arkApiUrl: string;\n qwenApiKey: string;\n qwenApiUrl: string;\n openrouterApiKey: string;\n openrouterApiUrl: string;\n geminiApiKey: string;\n cwd: string;\n planPrompt: string;\n}\n\n/**\n * 混合 Agent 类\n * \n * 职责:\n * 1. 管理多个 ProviderAdapter\n * 2. 路由请求到正确的 Adapter\n * 3. 使用 ChatOrchestrator 统一处理工具调用\n * 4. 管理对话历史和工具注册\n */\nexport class HybridAgent {\n private config: RuntimeConfig;\n private adapters: Map<string, ProviderAdapter> = new Map();\n private orchestrator: ChatOrchestrator;\n private geminiClient: GoogleGenAI;\n private toolExecutor: ToolExecutor;\n private abortController: AbortController | null = null;\n \n /** 已注册的工具 */\n private tools: Map<string, Tool> = new Map();\n \n /** 工具配置(用于异步初始化) */\n private toolConfig: ToolConfigItem[] | undefined;\n\n constructor(config: AgentConfig, toolExecutor?: ToolExecutor) {\n this.config = {\n arkApiKey: config.arkApiKey,\n arkApiUrl: config.arkApiUrl || DEFAULT_ARK_URL,\n qwenApiKey: config.qwenApiKey || '',\n qwenApiUrl: config.qwenApiUrl || DEFAULT_QWEN_NATIVE_URL,\n openrouterApiKey: config.openrouterApiKey || '',\n openrouterApiUrl: config.openrouterApiUrl || DEFAULT_OPENROUTER_URL,\n geminiApiKey: config.geminiApiKey,\n cwd: config.cwd || process.cwd(),\n planPrompt: config.planPrompt || PLAN_MODE_PROMPT,\n };\n\n this.geminiClient = new GoogleGenAI({ apiKey: this.config.geminiApiKey });\n this.toolExecutor = toolExecutor || createDefaultToolExecutor(this.config.cwd);\n\n // 保存工具配置(用于异步初始化)\n this.toolConfig = config.tools;\n \n // 初始化工具(异步,但构造函数不能是 async,所以先初始化空的)\n // 工具会在第一次 chat 调用前通过 asyncInit 完成初始化\n this.tools = new Map();\n \n // 初始化 Adapter\n this.initializeAdapters();\n \n // 初始化 Orchestrator(工具会在 asyncInit 中设置)\n this.orchestrator = new ChatOrchestrator({\n maxIterations: 10,\n executeTool: this.executeTool.bind(this),\n tools: this.tools, // 传入工具列表,用于获取 sideEffects\n // autoRunConfig 在每次 chat 调用时通过 options 传递\n onToolApprovalRequest: config.onToolApprovalRequest, // 传递工具批准回调\n getAutoRunConfig: config.getAutoRunConfig, // 传递动态获取配置回调\n });\n }\n\n /** 异步初始化工具(在第一次 chat 前调用) */\n private async asyncInit(): Promise<void> {\n if (this.toolConfig && this.tools.size === 0) {\n const resolvedTools = await resolveTools(this.toolConfig);\n for (const tool of resolvedTools) {\n this.tools.set(tool.name, tool);\n }\n }\n }\n\n /** 初始化所有 Adapter */\n private initializeAdapters(): void {\n if (this.config.arkApiKey) {\n this.adapters.set('ark', new ArkAdapter({\n apiKey: this.config.arkApiKey,\n apiUrl: this.config.arkApiUrl\n }));\n }\n\n if (this.config.qwenApiKey) {\n this.adapters.set('qwen', new QwenAdapter({\n apiKey: this.config.qwenApiKey,\n apiUrl: this.config.qwenApiUrl\n }));\n }\n\n if (this.config.geminiApiKey) {\n this.adapters.set('gemini', new GeminiAdapter({\n apiKey: this.config.geminiApiKey\n }));\n }\n\n if (this.config.openrouterApiKey) {\n this.adapters.set('openrouter', new OpenRouterAdapter({\n apiKey: this.config.openrouterApiKey,\n apiUrl: this.config.openrouterApiUrl\n }));\n }\n }\n \n /** \n * 判断模型提供商\n */\n private getModelProvider(model: string): ProviderType {\n return routeModelToProvider(model);\n }\n\n /** 获取 Adapter */\n private getAdapter(model: string): ProviderAdapter | undefined {\n const providerName = this.getModelProvider(model);\n return this.adapters.get(providerName);\n }\n \n /**\n * 调试:获取模型路由信息\n */\n getModelRouteInfo(model: string): RouteResult & { available: boolean } {\n const result = routeModelWithDetails(model);\n return {\n ...result,\n available: this.adapters.has(result.provider)\n };\n }\n\n /** 构建系统提示词 */\n private buildSystemPrompt(options: ChatOptions): string {\n if (options.mode === 'plan') {\n return this.config.planPrompt;\n }\n // Agent 和 Ask 模式使用默认提示词\n return AGENT_MODE_PROMPT;\n }\n\n /** 获取默认深度思考模式 */\n private getDefaultThinkingMode(): ThinkingMode {\n return 'disabled';\n }\n\n /** 创建工具执行上下文 */\n private createToolContext(signal?: AbortSignal): ToolContext {\n return {\n cwd: this.config.cwd,\n geminiClient: this.geminiClient,\n executeCommand: (command: string, cwd?: string) => \n this.toolExecutor.executeCommand(command, cwd || this.config.cwd, signal),\n signal,\n };\n }\n\n /** 执行工具 */\n private async executeTool(name: string, args: Record<string, unknown>, signal?: AbortSignal): Promise<string | ToolResult> {\n const tool = this.tools.get(name);\n if (!tool) {\n return `未知工具: ${name}`;\n }\n return await tool.execute(args, this.createToolContext(signal));\n }\n\n /** 获取工具定义列表 */\n private getToolDefinitions(): SimpleToolDefinition[] {\n return Array.from(this.tools.values()).map(tool => ({\n name: tool.name,\n description: tool.description,\n parameters: tool.parameters\n }));\n }\n\n /**\n * 聊天入口\n * \n * 使用 ChatOrchestrator 统一处理所有 Provider 的工具调用循环\n */\n async *chat(\n message: string, \n options: ChatOptions = {},\n images?: string[]\n ): AsyncGenerator<ChatEvent> {\n // 异步初始化工具(如果还没初始化)\n await this.asyncInit();\n \n this.abortController = new AbortController();\n const signal = this.abortController.signal;\n\n const model = options.model || DEFAULT_MODEL;\n \n const adapter = this.getAdapter(model);\n if (!adapter) {\n const providerName = this.getModelProvider(model);\n yield createApiError(`缺少 ${providerName} Provider 的 API Key`, { code: 'MISSING_API_KEY' });\n return;\n }\n \n const thinkingMode = options.thinkingMode ?? this.getDefaultThinkingMode();\n const systemPrompt = this.buildSystemPrompt(options);\n\n // ask 模式不注入工具\n const tools = options.mode === 'ask' ? [] : this.getToolDefinitions();\n\n // 使用传入的历史(无状态架构,历史从数据库加载)\n // 如果没有传入历史,使用空数组\n const history = options.history || [];\n\n // 构建 Orchestrator 上下文\n const context: OrchestratorContext = {\n systemPrompt,\n history,\n tools,\n signal,\n images,\n };\n \n try {\n // 使用 Orchestrator 统一处理\n yield* this.orchestrator.chat(adapter, message, context, {\n model,\n enableThinking: thinkingMode === 'enabled',\n enableSearch: options.enableWebSearch,\n autoRunConfig: options.autoRunConfig,\n });\n } finally {\n this.abortController = null;\n }\n }\n\n /** 中断当前请求 */\n abort(): void {\n if (this.abortController) {\n this.abortController.abort();\n }\n }\n\n /** 设置当前工作目录 */\n setCwd(dir: string): void {\n this.config.cwd = dir;\n }\n\n /** 获取当前配置 */\n getConfig(): RuntimeConfig {\n return { ...this.config };\n }\n\n /** 获取所有支持的模型 */\n getSupportedModels() {\n return MODELS;\n }\n}\n","/**\n * 获取当前工作目录工具(Vite 插件风格)\n */\nimport type { ToolPlugin } from '../types';\nimport { tool } from '../types';\n\nexport function getCwdTool(): ToolPlugin {\n return tool({\n name: 'get_cwd',\n description: '获取用户当前工作目录的绝对路径。当你需要知道用户在哪个目录下工作时使用。',\n parameters: {\n type: 'object',\n properties: {},\n required: []\n },\n execute: async (_args, context) => {\n return JSON.stringify({ cwd: context.cwd });\n }\n });\n}\n","/**\n * 获取平台信息工具(Vite 插件风格)\n */\nimport type { ToolPlugin } from '../types';\nimport { tool } from '../types';\n\nexport function getPlatformTool(): ToolPlugin {\n return tool({\n name: 'get_platform',\n description: '获取操作系统信息(macOS/Windows/Linux)。当你需要确定使用哪种命令语法时调用(如 ls vs dir)。',\n parameters: {\n type: 'object',\n properties: {},\n required: []\n },\n execute: async () => {\n // 动态导入 os 模块,避免前端构建时打包\n const os = await import('os');\n const platform = os.default.platform(); // 'darwin' | 'win32' | 'linux'\n const platformName = platform === 'darwin' ? 'macOS' : platform === 'win32' ? 'Windows' : 'Linux';\n const shell = platform === 'win32' ? 'powershell' : 'bash/zsh';\n const pathSeparator = platform === 'win32' ? '\\\\' : '/';\n \n return JSON.stringify({\n platform,\n platformName,\n shell,\n pathSeparator,\n });\n }\n });\n}\n","/**\n * 执行命令工具(Vite 插件风格)\n */\nimport type { ToolPlugin } from '../types';\nimport { tool } from '../types';\n\nexport function executeCommandTool(): ToolPlugin {\n return tool({\n name: 'execute_command',\n description: '执行 shell 命令。执行前建议先用 get_cwd 获取当前目录、get_platform 获取系统类型,以确保使用正确的路径和命令语法。',\n parameters: {\n type: 'object',\n properties: {\n command: { type: 'string', description: '要执行的命令' },\n cwd: { type: 'string', description: '执行命令的目录(不传则使用用户当前工作目录)' }\n },\n required: ['command']\n },\n execute: async (args, context) => {\n const cwd = (args.cwd as string | undefined) || context.cwd;\n const result = await context.executeCommand(args.command as string, cwd);\n \n if (result.success) {\n return result.output || '执行成功';\n }\n \n // 检查是否是取消操作\n if (result.error === '操作已取消') {\n return JSON.stringify({ success: false, error: '操作已取消', cancelled: true });\n }\n \n return `错误: ${result.error}`;\n }\n });\n}\n","/**\n * Gemini 媒体处理模块\n * \n * 负责图片分析、图片生成、视频分析\n */\n\nimport type { GoogleGenAI } from '@google/genai';\nimport { GEMINI_IMAGE_MODEL, GEMINI_IMAGE_GEN_MODEL } from './constants';\n\n/** 获取图片 MIME 类型 */\nfunction getMimeType(ext: string): string {\n const types: Record<string, string> = {\n '.jpg': 'image/jpeg',\n '.jpeg': 'image/jpeg',\n '.png': 'image/png',\n '.gif': 'image/gif',\n '.webp': 'image/webp'\n };\n return types[ext] || 'image/jpeg';\n}\n\n/** 获取视频 MIME 类型 */\nfunction getVideoMimeType(ext: string): string {\n const types: Record<string, string> = {\n '.mp4': 'video/mp4',\n '.mov': 'video/quicktime',\n '.avi': 'video/x-msvideo',\n '.webm': 'video/webm'\n };\n return types[ext] || 'video/mp4';\n}\n\n/**\n * 分析图片\n */\nexport async function analyzeImage(\n geminiClient: GoogleGenAI,\n imagePath: string, \n question?: string,\n signal?: AbortSignal\n): Promise<string> {\n try {\n if (signal?.aborted) {\n return JSON.stringify({ success: false, error: '操作已取消', cancelled: true });\n }\n \n const fs = await import('fs/promises');\n const path = await import('path');\n \n const imageData = await fs.readFile(imagePath);\n const base64 = imageData.toString('base64');\n const ext = path.extname(imagePath).toLowerCase();\n const mimeType = getMimeType(ext);\n\n const response = await geminiClient.models.generateContent({\n model: GEMINI_IMAGE_MODEL,\n contents: [{\n role: 'user',\n parts: [\n { text: question || '请详细描述这张图片的内容' },\n { inlineData: { mimeType, data: base64 } }\n ]\n }],\n config: { abortSignal: signal }\n });\n\n return response.text || '无法分析图片';\n } catch (error) {\n if (signal?.aborted) return JSON.stringify({ success: false, error: '操作已取消', cancelled: true });\n return `图片分析失败: ${error}`;\n }\n}\n\n/**\n * 生成图片\n */\nexport async function generateImage(\n geminiClient: GoogleGenAI,\n cwd: string,\n prompt: string, \n outputPath?: string,\n signal?: AbortSignal\n): Promise<string> {\n try {\n // 检查是否已取消\n if (signal?.aborted) {\n return JSON.stringify({ success: false, error: '操作已取消' });\n }\n \n const response = await geminiClient.models.generateContent({\n model: GEMINI_IMAGE_GEN_MODEL,\n contents: [{ role: 'user', parts: [{ text: prompt }] }],\n config: { abortSignal: signal }\n });\n\n for (const part of response.candidates?.[0]?.content?.parts || []) {\n if (part.inlineData) {\n const imageData = Buffer.from(part.inlineData.data as string, 'base64');\n \n // 根据 mimeType 确定文件扩展名\n const mimeType = part.inlineData.mimeType || 'image/png';\n const ext = mimeType === 'image/jpeg' ? '.jpg' : \n mimeType === 'image/webp' ? '.webp' : '.png';\n \n const fs = await import('fs/promises');\n const savePath = outputPath || `${cwd}/generated_${Date.now()}${ext}`;\n await fs.writeFile(savePath, imageData);\n \n // 返回简洁的 JSON 结果(业界标准格式)\n return JSON.stringify({\n success: true,\n path: savePath,\n format: mimeType\n });\n }\n }\n\n return JSON.stringify({ success: false, error: '图片生成失败' });\n } catch (error) {\n // 取消错误特殊处理\n if (signal?.aborted) {\n return JSON.stringify({ success: false, error: '操作已取消', cancelled: true });\n }\n return JSON.stringify({ success: false, error: `图片生成失败: ${error}` });\n }\n}\n\n/**\n * 分析视频\n */\nexport async function analyzeVideo(\n geminiClient: GoogleGenAI,\n videoPath: string, \n question?: string,\n signal?: AbortSignal\n): Promise<string> {\n try {\n if (signal?.aborted) {\n return JSON.stringify({ success: false, error: '操作已取消', cancelled: true });\n }\n \n const fs = await import('fs/promises');\n const path = await import('path');\n \n const videoData = await fs.readFile(videoPath);\n const base64 = videoData.toString('base64');\n const ext = path.extname(videoPath).toLowerCase();\n const mimeType = getVideoMimeType(ext);\n\n const response = await geminiClient.models.generateContent({\n model: GEMINI_IMAGE_MODEL,\n contents: [{\n role: 'user',\n parts: [\n { text: question || '请详细描述这个视频的内容' },\n { inlineData: { mimeType, data: base64 } }\n ]\n }],\n config: { abortSignal: signal }\n });\n\n return response.text || '无法分析视频';\n } catch (error) {\n if (signal?.aborted) return JSON.stringify({ success: false, error: '操作已取消', cancelled: true });\n return `视频分析失败: ${error}`;\n }\n}\n\n","/**\n * 分析图片工具(Vite 插件风格)\n */\nimport type { ToolPlugin } from '../types';\nimport { tool } from '../types';\nimport type { GoogleGenAI } from '@google/genai';\nimport { analyzeImage } from '../gemini';\n\nexport function analyzeImageTool(): ToolPlugin {\n return tool({\n name: 'analyze_image',\n description: '分析图片内容(识别物体、场景、文字等)',\n parameters: {\n type: 'object',\n properties: {\n imagePath: { type: 'string', description: '图片文件路径' },\n question: { type: 'string', description: '关于图片的问题(可选)' }\n },\n required: ['imagePath']\n },\n execute: async (args, context) => {\n if (!context.geminiClient) {\n return '错误: 未配置 Gemini API Key,无法使用图片分析功能';\n }\n return await analyzeImage(\n context.geminiClient as GoogleGenAI,\n args.imagePath as string,\n args.question as string | undefined,\n context.signal\n );\n }\n });\n}\n","/**\n * 生成图片工具(Vite 插件风格)\n */\nimport type { ToolPlugin } from '../types';\nimport { tool } from '../types';\nimport type { GoogleGenAI } from '@google/genai';\nimport { generateImage } from '../gemini';\n\nexport function generateImageTool(): ToolPlugin {\n return tool({\n name: 'generate_image',\n description: '根据文字描述生成图片并保存到本地。返回保存路径。',\n parameters: {\n type: 'object',\n properties: {\n prompt: { type: 'string', description: '图片描述,使用详细的英文描述效果更好' },\n outputPath: { type: 'string', description: '保存路径(可选)' }\n },\n required: ['prompt']\n },\n // 图片生成完成后通知用户\n sideEffects: [{ type: 'notification', success: true, message: '🎨 图片生成完成' }],\n execute: async (args, context) => {\n if (!context.geminiClient) {\n return '错误: 未配置 Gemini API Key,无法使用图片生成功能';\n }\n return await generateImage(\n context.geminiClient as GoogleGenAI,\n context.cwd,\n args.prompt as string,\n args.outputPath as string | undefined,\n context.signal\n );\n }\n });\n}\n","/**\n * 分析视频工具(Vite 插件风格)\n */\nimport type { ToolPlugin } from '../types';\nimport { tool } from '../types';\nimport type { GoogleGenAI } from '@google/genai';\nimport { analyzeVideo } from '../gemini';\n\nexport function analyzeVideoTool(): ToolPlugin {\n return tool({\n name: 'analyze_video',\n description: '分析视频内容(识别场景、动作、物体等)',\n parameters: {\n type: 'object',\n properties: {\n videoPath: { type: 'string', description: '视频文件路径' },\n question: { type: 'string', description: '关于视频的问题(可选)' }\n },\n required: ['videoPath']\n },\n execute: async (args, context) => {\n if (!context.geminiClient) {\n return '错误: 未配置 Gemini API Key,无法使用视频分析功能';\n }\n return await analyzeVideo(\n context.geminiClient as GoogleGenAI,\n args.videoPath as string,\n args.question as string | undefined,\n context.signal\n );\n }\n });\n}\n","/**\n * 全国 337 个地级市 adcode 映射\n * 数据来源:高德开放平台城市编码表\n * https://lbs.amap.com/api/webservice/download\n */\n\nexport const CITY_ADCODE_MAP: Record<string, string> = {\n // 直辖市\n '北京': '110000',\n '天津': '120000',\n '上海': '310000',\n '重庆': '500000',\n // 河北省\n '石家庄': '130100',\n '唐山': '130200',\n '秦皇岛': '130300',\n '邯郸': '130400',\n '邢台': '130500',\n '保定': '130600',\n '张家口': '130700',\n '承德': '130800',\n '沧州': '130900',\n '廊坊': '131000',\n '衡水': '131100',\n // 山西省\n '太原': '140100',\n '大同': '140200',\n '阳泉': '140300',\n '长治': '140400',\n '晋城': '140500',\n '朔州': '140600',\n '晋中': '140700',\n '运城': '140800',\n '忻州': '140900',\n '临汾': '141000',\n '吕梁': '141100',\n // 内蒙古自治区\n '呼和浩特': '150100',\n '包头': '150200',\n '乌海': '150300',\n '赤峰': '150400',\n '通辽': '150500',\n '鄂尔多斯': '150600',\n '呼伦贝尔': '150700',\n '巴彦淖尔': '150800',\n '乌兰察布': '150900',\n '兴安盟': '152200',\n '锡林郭勒盟': '152500',\n '阿拉善盟': '152900',\n // 辽宁省\n '沈阳': '210100',\n '大连': '210200',\n '鞍山': '210300',\n '抚顺': '210400',\n '本溪': '210500',\n '丹东': '210600',\n '锦州': '210700',\n '营口': '210800',\n '阜新': '210900',\n '辽阳': '211000',\n '盘锦': '211100',\n '铁岭': '211200',\n '朝阳': '211300',\n '葫芦岛': '211400',\n // 吉林省\n '长春': '220100',\n '吉林': '220200',\n '四平': '220300',\n '辽源': '220400',\n '通化': '220500',\n '白山': '220600',\n '松原': '220700',\n '白城': '220800',\n '延边朝鲜族自治州': '222400',\n // 黑龙江省\n '哈尔滨': '230100',\n '齐齐哈尔': '230200',\n '鸡西': '230300',\n '鹤岗': '230400',\n '双鸭山': '230500',\n '大庆': '230600',\n '伊春': '230700',\n '佳木斯': '230800',\n '七台河': '230900',\n '牡丹江': '231000',\n '黑河': '231100',\n '绥化': '231200',\n '大兴安岭地区': '232700',\n // 江苏省\n '南京': '320100',\n '无锡': '320200',\n '徐州': '320300',\n '常州': '320400',\n '苏州': '320500',\n '南通': '320600',\n '连云港': '320700',\n '淮安': '320800',\n '盐城': '320900',\n '扬州': '321000',\n '镇江': '321100',\n '泰州': '321200',\n '宿迁': '321300',\n // 浙江省\n '杭州': '330100',\n '宁波': '330200',\n '温州': '330300',\n '嘉兴': '330400',\n '湖州': '330500',\n '绍兴': '330600',\n '金华': '330700',\n '衢州': '330800',\n '舟山': '330900',\n '台州': '331000',\n '丽水': '331100',\n // 安徽省\n '合肥': '340100',\n '芜湖': '340200',\n '蚌埠': '340300',\n '淮南': '340400',\n '马鞍山': '340500',\n '淮北': '340600',\n '铜陵': '340700',\n '安庆': '340800',\n '黄山': '341000',\n '滁州': '341100',\n '阜阳': '341200',\n '宿州': '341300',\n '六安': '341500',\n '亳州': '341600',\n '池州': '341700',\n '宣城': '341800',\n // 福建省\n '福州': '350100',\n '厦门': '350200',\n '莆田': '350300',\n '三明': '350400',\n '泉州': '350500',\n '漳州': '350600',\n '南平': '350700',\n '龙岩': '350800',\n '宁德': '350900',\n // 江西省\n '南昌': '360100',\n '景德镇': '360200',\n '萍乡': '360300',\n '九江': '360400',\n '新余': '360500',\n '鹰潭': '360600',\n '赣州': '360700',\n '吉安': '360800',\n '宜春': '360900',\n '抚州': '361000',\n '上饶': '361100',\n // 山东省\n '济南': '370100',\n '青岛': '370200',\n '淄博': '370300',\n '枣庄': '370400',\n '东营': '370500',\n '烟台': '370600',\n '潍坊': '370700',\n '济宁': '370800',\n '泰安': '370900',\n '威海': '371000',\n '日照': '371100',\n '临沂': '371300',\n '德州': '371400',\n '聊城': '371500',\n '滨州': '371600',\n '菏泽': '371700',\n // 河南省\n '郑州': '410100',\n '开封': '410200',\n '洛阳': '410300',\n '平顶山': '410400',\n '安阳': '410500',\n '鹤壁': '410600',\n '新乡': '410700',\n '焦作': '410800',\n '濮阳': '410900',\n '许昌': '411000',\n '漯河': '411100',\n '三门峡': '411200',\n '南阳': '411300',\n '商丘': '411400',\n '信阳': '411500',\n '周口': '411600',\n '驻马店': '411700',\n // 湖北省\n '武汉': '420100',\n '黄石': '420200',\n '十堰': '420300',\n '宜昌': '420500',\n '襄阳': '420600',\n '鄂州': '420700',\n '荆门': '420800',\n '孝感': '420900',\n '荆州': '421000',\n '黄冈': '421100',\n '咸宁': '421200',\n '随州': '421300',\n '恩施土家族苗族自治州': '422800',\n // 湖南省\n '长沙': '430100',\n '株洲': '430200',\n '湘潭': '430300',\n '衡阳': '430400',\n '邵阳': '430500',\n '岳阳': '430600',\n '常德': '430700',\n '张家界': '430800',\n '益阳': '430900',\n '郴州': '431000',\n '永州': '431100',\n '怀化': '431200',\n '娄底': '431300',\n '湘西土家族苗族自治州': '433100',\n // 广东省\n '广州': '440100',\n '韶关': '440200',\n '深圳': '440300',\n '珠海': '440400',\n '汕头': '440500',\n '佛山': '440600',\n '江门': '440700',\n '湛江': '440800',\n '茂名': '440900',\n '肇庆': '441200',\n '惠州': '441300',\n '梅州': '441400',\n '汕尾': '441500',\n '河源': '441600',\n '阳江': '441700',\n '清远': '441800',\n '东莞': '441900',\n '中山': '442000',\n '潮州': '445100',\n '揭阳': '445200',\n '云浮': '445300',\n // 广西壮族自治区\n '南宁': '450100',\n '柳州': '450200',\n '桂林': '450300',\n '梧州': '450400',\n '北海': '450500',\n '防城港': '450600',\n '钦州': '450700',\n '贵港': '450800',\n '玉林': '450900',\n '百色': '451000',\n '贺州': '451100',\n '河池': '451200',\n '来宾': '451300',\n '崇左': '451400',\n // 海南省\n '海口': '460100',\n '三亚': '460200',\n '三沙': '460300',\n '儋州': '460400',\n // 四川省\n '成都': '510100',\n '自贡': '510300',\n '攀枝花': '510400',\n '泸州': '510500',\n '德阳': '510600',\n '绵阳': '510700',\n '广元': '510800',\n '遂宁': '510900',\n '内江': '511000',\n '乐山': '511100',\n '南充': '511300',\n '眉山': '511400',\n '宜宾': '511500',\n '广安': '511600',\n '达州': '511700',\n '雅安': '511800',\n '巴中': '511900',\n '资阳': '512000',\n '阿坝藏族羌族自治州': '513200',\n '甘孜藏族自治州': '513300',\n '凉山彝族自治州': '513400',\n // 贵州省\n '贵阳': '520100',\n '六盘水': '520200',\n '遵义': '520300',\n '安顺': '520400',\n '毕节': '520500',\n '铜仁': '520600',\n '黔西南布依族苗族自治州': '522300',\n '黔东南苗族侗族自治州': '522600',\n '黔南布依族苗族自治州': '522700',\n // 云南省\n '昆明': '530100',\n '曲靖': '530300',\n '玉溪': '530400',\n '保山': '530500',\n '昭通': '530600',\n '丽江': '530700',\n '普洱': '530800',\n '临沧': '530900',\n '楚雄彝族自治州': '532300',\n '红河哈尼族彝族自治州': '532500',\n '文山壮族苗族自治州': '532600',\n '西双版纳傣族自治州': '532800',\n '大理白族自治州': '532900',\n '德宏傣族景颇族自治州': '533100',\n '怒江傈僳族自治州': '533300',\n '迪庆藏族自治州': '533400',\n // 西藏自治区\n '拉萨': '540100',\n '日喀则': '540200',\n '昌都': '540300',\n '林芝': '540400',\n '山南': '540500',\n '那曲': '540600',\n '阿里地区': '542500',\n // 陕西省\n '西安': '610100',\n '铜川': '610200',\n '宝鸡': '610300',\n '咸阳': '610400',\n '渭南': '610500',\n '延安': '610600',\n '汉中': '610700',\n '榆林': '610800',\n '安康': '610900',\n '商洛': '611000',\n // 甘肃省\n '兰州': '620100',\n '嘉峪关': '620200',\n '金昌': '620300',\n '白银': '620400',\n '天水': '620500',\n '武威': '620600',\n '张掖': '620700',\n '平凉': '620800',\n '酒泉': '620900',\n '庆阳': '621000',\n '定西': '621100',\n '陇南': '621200',\n '临夏回族自治州': '622900',\n '甘南藏族自治州': '623000',\n // 青海省\n '西宁': '630100',\n '海东': '630200',\n '海北藏族自治州': '632200',\n '黄南藏族自治州': '632300',\n '海南藏族自治州': '632500',\n '果洛藏族自治州': '632600',\n '玉树藏族自治州': '632700',\n '海西蒙古族藏族自治州': '632800',\n // 宁夏回族自治区\n '银川': '640100',\n '石嘴山': '640200',\n '吴忠': '640300',\n '固原': '640400',\n '中卫': '640500',\n // 新疆维吾尔自治区\n '乌鲁木齐': '650100',\n '克拉玛依': '650200',\n '吐鲁番': '650400',\n '哈密': '650500',\n '昌吉回族自治州': '652300',\n '博尔塔拉蒙古自治州': '652700',\n '巴音郭楞蒙古自治州': '652800',\n '阿克苏地区': '652900',\n '克孜勒苏柯尔克孜自治州': '653000',\n '喀什地区': '653100',\n '和田地区': '653200',\n '伊犁哈萨克自治州': '654000',\n '塔城地区': '654200',\n '阿勒泰地区': '654300',\n};\n\n/**\n * 根据城市名获取 adcode\n * 支持模糊匹配(如 \"北京市\" -> \"北京\")\n */\nexport function getCityAdcode(cityName: string): string | null {\n // 直接匹配\n if (CITY_ADCODE_MAP[cityName]) {\n return CITY_ADCODE_MAP[cityName];\n }\n \n // 去掉 \"市\"、\"省\"、\"区\" 后缀再匹配\n const normalized = cityName.replace(/[市省区]$/, '');\n if (CITY_ADCODE_MAP[normalized]) {\n return CITY_ADCODE_MAP[normalized];\n }\n \n // 简称匹配(如 \"延边\" -> \"延边朝鲜族自治州\")\n for (const [name, code] of Object.entries(CITY_ADCODE_MAP)) {\n if (name.startsWith(cityName) || cityName.startsWith(name.slice(0, 2))) {\n return code;\n }\n }\n \n return null;\n}\n","/**\n * 天气查询工具(Vite 插件风格)\n * \n * 使用高德天气 API\n * - 稳定可靠,国内服务\n * - 支持全国 337 个地级市\n * - 中文输出\n * \n * 返回数据格式匹配 @huyooo/ai-chat-shared 的 WeatherData 类型\n */\n\nimport type { ToolPlugin } from '../../types';\nimport { tool } from '../../types';\nimport { getCityAdcode } from './city-adcodes';\n\n/** 高德天气 API 响应 - 实况天气 */\ninterface AmapWeatherLive {\n province: string;\n city: string;\n adcode: string;\n weather: string;\n temperature: string;\n winddirection: string;\n windpower: string;\n humidity: string;\n reporttime: string;\n}\n\n/** 高德天气 API 响应 */\ninterface AmapWeatherResponse {\n status: string;\n count: string;\n info: string;\n infocode: string;\n lives?: AmapWeatherLive[];\n}\n\n/** 高德天气 API Key(Web服务类型) */\nconst AMAP_KEY = '16924e39cfd78c645f0035c1bc290961';\n\nexport function getWeatherTool(): ToolPlugin {\n return tool({\n name: 'get_weather',\n description: '获取指定城市的实时天气信息。支持全国 337 个地级市,包括:北京、上海、广州、深圳、杭州、成都、武汉、西安、南京、苏州、重庆、天津等。返回温度、天气状况、湿度、风向风力等信息。',\n parameters: {\n type: 'object',\n properties: {\n city: { \n type: 'string', \n description: '城市名称,如 \"北京\"、\"上海\"、\"深圳\"、\"杭州\"' \n },\n },\n required: ['city'],\n },\n execute: async (args, context) => {\n const city = args.city as string;\n \n // 检查是否已取消\n if (context.signal?.aborted) {\n return JSON.stringify({ success: false, error: '操作已取消', cancelled: true });\n }\n \n // 获取城市 adcode\n const adcode = getCityAdcode(city);\n if (!adcode) {\n return JSON.stringify({ \n error: `不支持的城市: ${city}`,\n tip: '请输入地级市名称,如:北京、上海、广州、深圳',\n });\n }\n\n try {\n // 调用高德天气 API,传递取消信号\n const url = `https://restapi.amap.com/v3/weather/weatherInfo?key=${AMAP_KEY}&city=${adcode}&extensions=base&output=JSON`;\n const response = await fetch(url, { signal: context.signal });\n \n if (!response.ok) {\n return JSON.stringify({ error: `天气服务请求失败: ${response.status}` });\n }\n\n const data = await response.json() as AmapWeatherResponse;\n \n // 检查返回状态\n if (data.status !== '1' || data.infocode !== '10000') {\n return JSON.stringify({ error: `天气服务返回错误: ${data.info}` });\n }\n \n if (!data.lives?.length) {\n return JSON.stringify({ error: '未获取到天气数据' });\n }\n\n const live = data.lives[0];\n \n // 返回格式匹配 WeatherData 类型\n return JSON.stringify({\n city: live.city,\n temperature: parseInt(live.temperature, 10),\n condition: live.weather,\n humidity: parseInt(live.humidity, 10),\n wind: `${live.winddirection}风 ${live.windpower}级`,\n reportTime: live.reporttime,\n province: live.province,\n });\n } catch (error) {\n // 取消错误特殊处理\n if (context.signal?.aborted) {\n return JSON.stringify({ success: false, error: '操作已取消', cancelled: true });\n }\n return JSON.stringify({ \n success: false,\n error: `获取天气失败: ${error instanceof Error ? error.message : '网络错误'}`,\n });\n }\n }\n });\n}\n","import type { ToolPlugin, ToolResult } from '../../types';\nimport { tool } from '../../types';\n\nfunction getStringArg(args: Record<string, unknown>, key: string): string | null {\n const value = args[key];\n return typeof value === 'string' ? value : null;\n}\n\n/**\n * 显示 Toast 通知\n */\nexport function showToastTool(): ToolPlugin {\n return tool({\n name: 'show_toast',\n description: '在用户界面上显示一条Toast 通知消息,用于告知用户操作结果或重要提示信息,消息会在几秒后自动消失',\n parameters: {\n type: 'object',\n properties: {\n message: { type: 'string', description: '要显示给用户的通知内容' },\n },\n required: ['message'],\n },\n execute: async (args): Promise<ToolResult> => {\n const message = getStringArg(args, 'message');\n if (!message) throw new Error('参数错误:message 必须是 string');\n return {\n result: JSON.stringify({ success: true }),\n sideEffects: [{ type: 'notification', success: true, message }],\n };\n },\n });\n}\n\n\n","import type { ToolPlugin, ToolResult } from '../../types';\nimport { tool } from '../../types';\n\nfunction getStringArg(args: Record<string, unknown>, key: string): string | null {\n const value = args[key];\n return typeof value === 'string' ? value : null;\n}\n\n/**\n * 打开确认对话框\n */\nexport function openConfirmDialogTool(): ToolPlugin {\n return tool({\n name: 'open_confirm_dialog',\n description: '在用户界面上弹出一个模态确认对话框。',\n parameters: {\n type: 'object',\n properties: {\n title: { type: 'string', description: '对话框标题,简要说明确认的操作' },\n message: { type: 'string', description: '详细描述需要用户确认的内容' },\n confirmText: { type: 'string', description: '确认按钮文字,默认为\"确认\"' },\n cancelText: { type: 'string', description: '取消按钮文字,默认为\"取消\"' },\n },\n required: ['title', 'message'],\n },\n execute: async (args): Promise<ToolResult> => {\n const title = getStringArg(args, 'title');\n const message = getStringArg(args, 'message');\n if (!title) throw new Error('参数错误:title 必须是 string');\n if (!message) throw new Error('参数错误:message 必须是 string');\n\n const confirmText = getStringArg(args, 'confirmText') ?? '确认';\n const cancelText = getStringArg(args, 'cancelText') ?? '取消';\n\n return {\n result: JSON.stringify({ success: true }),\n sideEffects: [\n {\n type: 'ui:confirm_dialog',\n success: true,\n data: {\n title,\n message,\n confirmText,\n cancelText,\n },\n },\n ],\n };\n },\n });\n}\n\n\n","import type { ToolPlugin, ToolResult } from '../../types';\nimport { tool } from '../../types';\n\nfunction getStringArg(args: Record<string, unknown>, key: string): string | null {\n const value = args[key];\n return typeof value === 'string' ? value : null;\n}\n\ntype MediaType = 'image' | 'video' | 'audio';\nfunction getMediaTypeArg(args: Record<string, unknown>, key: string): MediaType | null {\n const value = args[key];\n if (value === 'image' || value === 'video' || value === 'audio') return value;\n return null;\n}\n\n/**\n * 打开文件预览(由宿主 UI 消费 ui:file_preview 副作用实现)\n */\nexport function openFilePreviewTool(): ToolPlugin {\n return tool({\n name: 'open_file_preview',\n description:\n '在用户界面上打开文件预览窗口,让用户查看指定文件的内容(宿主需处理 ui:file_preview sideEffect)。',\n parameters: {\n type: 'object',\n properties: {\n path: { type: 'string', description: '要预览的文件的完整路径' },\n mediaType: {\n type: 'string',\n description: '预览类型(必填):image/video/audio。宿主不会再根据后缀推断。',\n enum: ['image', 'video', 'audio'],\n },\n },\n required: ['path', 'mediaType'],\n },\n execute: async (args): Promise<ToolResult> => {\n const path = getStringArg(args, 'path');\n if (!path) throw new Error('参数错误:path 必须是 string');\n\n const mediaTypeValue = getMediaTypeArg(args, 'mediaType');\n if (!mediaTypeValue) throw new Error('参数错误:mediaType 必须是 \"image\" | \"video\" | \"audio\"');\n\n return {\n result: JSON.stringify({ success: true, path, mediaType: mediaTypeValue }),\n sideEffects: [\n {\n type: 'ui:file_preview',\n success: true,\n data: { path, mediaType: mediaTypeValue },\n },\n ],\n };\n },\n });\n}\n\n\n","import type { ToolPlugin, ToolResult } from '../../types';\nimport { tool } from '../../types';\n\nfunction getStringArg(args: Record<string, unknown>, key: string): string | null {\n const value = args[key];\n return typeof value === 'string' ? value : null;\n}\n\n/**\n * 跳转到指定目录(由宿主 UI 消费 ui:navigate 副作用实现)\n */\nexport function navigateToDirectoryTool(): ToolPlugin {\n return tool({\n name: 'navigate_to_directory',\n description: '控制用户界面左侧的文件浏览器跳转到指定目录,让用户可以直接看到该目录下的文件列表',\n parameters: {\n type: 'object',\n properties: {\n path: { type: 'string', description: '要跳转到的目录的完整路径' },\n },\n required: ['path'],\n },\n execute: async (args): Promise<ToolResult> => {\n const path = getStringArg(args, 'path');\n if (!path) throw new Error('参数错误:path 必须是 string');\n return {\n result: JSON.stringify({ success: true, path }),\n sideEffects: [\n {\n type: 'ui:navigate',\n success: true,\n data: { path },\n },\n ],\n };\n },\n });\n}\n\n\n","/**\n * UI 动作工具(非兼容版入口)\n *\n * 说明:\n * - 每个工具实现拆分在同目录下\n * - 该目录的 index.ts 作为唯一入口(不再保留 ../ui-actions.ts 的兼容层)\n */\n\nimport { showToastTool } from './show-toast';\nimport { openConfirmDialogTool } from './open-confirm-dialog';\nimport { openFilePreviewTool } from './open-file-preview';\nimport { navigateToDirectoryTool } from './navigate-to-directory';\n\nexport { showToastTool, openConfirmDialogTool, openFilePreviewTool, navigateToDirectoryTool };\n\n/**\n * UI 动作工具集合(用于快速注入)\n */\nexport const uiActionTools = [\n showToastTool(),\n openConfirmDialogTool(),\n openFilePreviewTool(),\n navigateToDirectoryTool(),\n];\n\n\n","/**\n * 文档搜索工具集成\n *\n * 可选依赖 @huyooo/ai-search\n * 如果未安装,工具会返回友好提示\n *\n * 注意:这个模块使用 eval + require 来避免 tsup 打包时解析依赖\n */\n\nimport type { Tool } from '../types'\n\n/**\n * 搜索工具配置\n */\nexport interface SearchToolsOptions {\n /** 搜索数据存储目录 */\n dataDir?: string\n /** 默认索引目录(首次使用时自动索引) */\n defaultDirectories?: string[]\n /** 是否在初始化时自动索引 */\n autoIndex?: boolean\n}\n\n/**\n * 搜索工具接口(来自 ai-search)\n */\ninterface AiSearchModule {\n searchPlugin: (options: {\n dataDir: string\n workspace?: string\n }) => Promise<{\n tools: Tool[]\n [key: string]: unknown\n }>\n}\n\n// 缓存\nlet aiSearchModule: AiSearchModule | null = null\n\n/**\n * 动态加载 ai-search 模块\n *\n * 使用 Function 构造器来避免 tsup/esbuild 分析依赖\n */\nasync function loadAiSearch(): Promise<AiSearchModule | null> {\n if (aiSearchModule) return aiSearchModule\n\n try {\n // 使用 Function 构造器避免静态分析\n // eslint-disable-next-line @typescript-eslint/no-implied-eval\n const dynamicRequire = new Function(\n 'moduleName',\n 'return import(moduleName)'\n ) as (name: string) => Promise<unknown>\n\n const mod = await dynamicRequire('@huyooo/ai-search')\n aiSearchModule = mod as AiSearchModule\n return aiSearchModule\n } catch {\n // 模块未安装\n return null\n }\n}\n\n/**\n * 创建文档搜索工具\n *\n * 如果 @huyooo/ai-search 未安装,返回占位工具(提示用户安装)\n *\n * @example\n * ```typescript\n * import { createDocumentSearchTools } from '@huyooo/ai-chat-core';\n *\n * const searchTools = await createDocumentSearchTools({\n * dataDir: './.search-data',\n * defaultDirectories: ['~/Documents'],\n * });\n *\n * const agent = new HybridAgent({\n * ...config,\n * tools: [...otherTools, ...searchTools],\n * });\n * ```\n */\nexport async function createDocumentSearchTools(\n options?: SearchToolsOptions\n): Promise<Tool[]> {\n const mod = await loadAiSearch()\n\n if (!mod) {\n // ai-search 未安装,返回占位工具\n return [createPlaceholderTool()]\n }\n\n const dataDir = options?.dataDir || './.search-data'\n \n // 使用新的 Vite 插件风格 API\n const plugin = await mod.searchPlugin({\n dataDir,\n // 如果配置了默认目录且自动索引,使用第一个目录作为工作空间\n workspace: options?.autoIndex && options?.defaultDirectories?.length\n ? expandPath(options.defaultDirectories[0])\n : undefined,\n })\n\n return plugin.tools\n}\n\n/**\n * 占位工具(ai-search 未安装时使用)\n */\nfunction createPlaceholderTool(): Tool {\n return {\n name: 'search_local_documents',\n description: '搜索本地文档(需要安装 @huyooo/ai-search)',\n parameters: {\n type: 'object',\n properties: {\n query: {\n type: 'string',\n description: '搜索内容',\n },\n },\n required: ['query'],\n },\n execute: async () => {\n return JSON.stringify({\n error: '文档搜索功能未启用',\n solution: '请安装 @huyooo/ai-search: npm install @huyooo/ai-search',\n })\n },\n }\n}\n\n/**\n * 展开 ~ 路径\n */\nfunction expandPath(p: string): string {\n if (p.startsWith('~')) {\n return p.replace('~', process.env.HOME || '')\n }\n return p\n}\n\n/**\n * 获取搜索插件实例(高级用法)\n */\nexport async function getDocumentSearchInstance(\n dataDir = './.search-data',\n workspace?: string\n): Promise<{ tools: Tool[]; [key: string]: unknown } | null> {\n const mod = await loadAiSearch()\n if (!mod) return null\n\n return await mod.searchPlugin({ dataDir, workspace })\n}\n"]}
1
+ {"version":3,"sources":["../src/providers/model-registry.ts","../src/types.ts","../src/events.ts","../src/tools.ts","../src/constants.ts","../src/router.ts","../src/utils/debug-logger.ts","../src/providers/orchestrator.ts","../src/providers/protocols/ark.ts","../src/providers/protocols/deepseek.ts","../src/providers/protocols/qwen.ts","../src/providers/protocols/gemini.ts","../src/providers/protocols/openai.ts","../src/providers/protocols/anthropic.ts","../src/providers/unified-adapter.ts","../src/builtin-tools/web-search.ts","../src/agent.ts","../src/builtin-tools/get-cwd.ts","../src/builtin-tools/get-platform.ts","../src/builtin-tools/execute-command.ts","../src/gemini.ts","../src/builtin-tools/analyze-image.ts","../src/builtin-tools/generate-image.ts","../src/builtin-tools/analyze-video.ts","../src/builtin-tools/weather/city-adcodes.ts","../src/builtin-tools/weather/get-weather.ts","../src/builtin-tools/ui-actions/show-toast.ts","../src/builtin-tools/ui-actions/open-confirm-dialog.ts","../src/builtin-tools/ui-actions/open-file-preview.ts","../src/builtin-tools/ui-actions/navigate-to-directory.ts","../src/builtin-tools/ui-actions/index.ts","../src/builtin-tools/search-documents.ts"],"names":["tools","result","tool","logger","toolCalls","familyConfig","getStringArg"],"mappings":"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M,QAAA;AAAA,EACN,cAAA,EAAM,QAAA;AAAA,EACN,cAAA,EAAM,QAAA;AAAA,EACN,cAAA,EAAM,QAAA;AAAA,EACN,cAAA,EAAM,QAAA;AAAA,EACN,cAAA,EAAM,QAAA;AAAA,EACN,cAAA,EAAM,QAAA;AAAA,EACN,cAAA,EAAM,QAAA;AAAA,EACN,cAAA,EAAM,QAAA;AAAA;AAAA,EAEN,cAAA,EAAM,QAAA;AAAA,EACN,cAAA,EAAM,QAAA;AAAA,EACN,cAAA,EAAM,QAAA;AAAA,EACN,cAAA,EAAM,QAAA;AAAA,EACN,oBAAA,EAAO,QAAA;AAAA,EACP,cAAA,EAAM,QAAA;AAAA,EACN,cAAA,EAAM,QAAA;AAAA,EACN,cAAA,EAAM,QAAA;AAAA,EACN,cAAA,EAAM,QAAA;AAAA,EACN,cAAA,EAAM,QAAA;AAAA,EACN,cAAA,EAAM,QAAA;AAAA,EACN,cAAA,EAAM,QAAA;AAAA,EACN,cAAA,EAAM,QAAA;AAAA,EACN,cAAA,EAAM,QAAA;AAAA,EACN,cAAA,EAAM,QAAA;AAAA,EACN,cAAA,EAAM,QAAA;AAAA;AAAA,EAEN,cAAA,EAAM,QAAA;AAAA,EACN,cAAA,EAAM,QAAA;AAAA,EACN,cAAA,EAAM,QAAA;AAAA,EACN,cAAA,EAAM,QAAA;AAAA,EACN,cAAA,EAAM,QAAA;AAAA,EACN,cAAA,EAAM,QAAA;AAAA,EACN,cAAA,EAAM,QAAA;AAAA,EACN,cAAA,EAAM,QAAA;AAAA,EACN,cAAA,EAAM,QAAA;AAAA;AAAA,EAEN,cAAA,EAAM,QAAA;AAAA,EACN,oBAAA,EAAO,QAAA;AAAA,EACP,cAAA,EAAM,QAAA;AAAA,EACN,cAAA,EAAM,QAAA;AAAA,EACN,cAAA,EAAM,QAAA;AAAA,EACN,cAAA,EAAM,QAAA;AAAA,EACN,cAAA,EAAM,QAAA;AAAA,EACN,cAAA,EAAM,QAAA;AAAA,EACN,cAAA,EAAM,QAAA;AAAA,EACN,cAAA,EAAM,QAAA;AAAA,EACN,cAAA,EAAM,QAAA;AAAA;AAAA,EAEN,cAAA,EAAM,QAAA;AAAA,EACN,cAAA,EAAM,QAAA;AAAA,EACN,cAAA,EAAM,Q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","file":"index.js","sourcesContent":["/**\n * 模型注册表\n * \n * 核心设计:Protocol + Family 分离\n * - Protocol:负责 API 通信协议(HTTP/SSE/认证)\n * - Family:负责模型行为差异(thinking格式、搜索方式、工具格式)\n * \n * 这样设计的好处:\n * 1. 同协议不同行为的模型可以复用协议层(如 ARK 上的豆包和 DeepSeek)\n * 2. 新增模型只需配置 family,无需修改 adapter 代码\n * 3. 行为差异集中管理,易于维护\n */\n\n// ==================== 模型家族定义 ====================\n\n/** 模型家族 ID */\nexport type ModelFamilyId = \n | 'doubao' // 豆包系列\n | 'deepseek' // DeepSeek 系列\n | 'qwen' // 通义千问系列\n | 'gemini' // Gemini 系列\n | 'gpt' // GPT 系列(OpenAI)\n | 'claude'; // Claude 系列(Anthropic)\n\n/** 协议类型 */\nexport type ProtocolId = \n | 'ark' // 火山引擎 Responses API(豆包)\n | 'deepseek' // DeepSeek(通过火山引擎 ARK)\n | 'qwen' // 通义千问 DashScope API\n | 'gemini' // Google Gemini API\n | 'openai' // OpenAI API(通过 OpenRouter)\n | 'anthropic'; // Anthropic API(通过 OpenRouter)\n\n/** Thinking 输出格式 */\nexport type ThinkingFormat = \n | 'reasoning' // ARK/豆包/DeepSeek: reasoning_summary_text\n | 'thinking_enabled' // Qwen: thinking 参数\n | 'thought_signature' // Gemini: 需要 thought_signature 循环\n | 'none'; // 不支持 thinking\n\n/** 搜索实现方式 */\nexport type SearchStrategy = \n | 'native_web_search' // 原生 web_search 工具(ARK)\n | 'native_enable' // 原生 enable_search 参数(Qwen)\n | 'google_search' // Google Search Grounding(Gemini)\n | 'tool_based'; // 通过 web_search 工具实现(GPT/Claude)\n\n/** 工具调用格式 */\nexport type ToolCallFormat = \n | 'responses' // ARK Responses API: function_call/function_call_output\n | 'openai' // OpenAI 兼容: tool_calls/tool\n | 'gemini'; // Gemini: functionCall/functionResponse\n\n/**\n * 模型家族配置\n * 定义同一家族模型的共同行为特征\n */\nexport interface ModelFamilyConfig {\n /** 家族 ID */\n id: ModelFamilyId;\n /** 显示名称 */\n displayName: string;\n \n // === 多模态配置 ===\n /** 是否支持图片理解 */\n supportsVision: boolean;\n\n // === Thinking 配置 ===\n /** 是否支持 thinking */\n supportsThinking: boolean;\n /** Thinking 输出格式 */\n thinkingFormat: ThinkingFormat;\n \n // === 搜索配置 ===\n /** 是否支持原生搜索 */\n supportsNativeSearch: boolean;\n /** 搜索实现方式 */\n searchStrategy: SearchStrategy;\n \n // === 工具调用配置 ===\n /** 工具调用格式 */\n toolCallFormat: ToolCallFormat;\n \n // === 默认参数 ===\n /** 默认最大输出 token */\n defaultMaxTokens?: number;\n /** 是否需要特殊处理(如 Gemini 的 thought_signature) */\n requiresSpecialHandling?: string[];\n}\n\n// ==================== 家族配置定义 ====================\n\n/** 豆包家族 */\nexport const DOUBAO_FAMILY: ModelFamilyConfig = {\n id: 'doubao',\n displayName: '豆包',\n supportsVision: true,\n supportsThinking: true,\n thinkingFormat: 'reasoning',\n supportsNativeSearch: true,\n searchStrategy: 'native_web_search',\n toolCallFormat: 'responses',\n defaultMaxTokens: 32768,\n};\n\n/** DeepSeek 家族 */\nexport const DEEPSEEK_FAMILY: ModelFamilyConfig = {\n id: 'deepseek',\n displayName: 'DeepSeek',\n supportsVision: false,\n supportsThinking: true,\n thinkingFormat: 'reasoning',\n supportsNativeSearch: true,\n searchStrategy: 'native_web_search',\n toolCallFormat: 'responses',\n defaultMaxTokens: 32768,\n};\n\n/** 通义千问家族 */\n/** Qwen 家族(使用 Tavily 统一搜索) */\nexport const QWEN_FAMILY: ModelFamilyConfig = {\n id: 'qwen',\n displayName: '通义千问',\n supportsVision: false,\n supportsThinking: true,\n thinkingFormat: 'thinking_enabled',\n supportsNativeSearch: false, // 关闭原生搜索,使用 Tavily\n searchStrategy: 'tool_based',\n toolCallFormat: 'openai',\n defaultMaxTokens: 32768,\n};\n\n/** Gemini 家族(注意:googleSearch 不能与其他工具同时使用,有工具时走 Tavily) */\nexport const GEMINI_FAMILY: ModelFamilyConfig = {\n id: 'gemini',\n displayName: 'Gemini',\n supportsVision: true,\n supportsThinking: true,\n thinkingFormat: 'thought_signature',\n supportsNativeSearch: false, // googleSearch 与其他工具冲突,统一使用 Tavily\n searchStrategy: 'tool_based',\n toolCallFormat: 'gemini',\n defaultMaxTokens: 65536,\n requiresSpecialHandling: ['thought_signature'],\n};\n\n/** GPT 家族 */\nexport const GPT_FAMILY: ModelFamilyConfig = {\n id: 'gpt',\n displayName: 'GPT',\n supportsVision: true,\n supportsThinking: true, // GPT-5.x 支持 reasoning\n thinkingFormat: 'reasoning',\n supportsNativeSearch: false,\n searchStrategy: 'tool_based',\n toolCallFormat: 'openai',\n defaultMaxTokens: 128000,\n};\n\n/** Claude 家族(使用 Vercel AI SDK / @ai-sdk/anthropic) */\nexport const CLAUDE_FAMILY: ModelFamilyConfig = {\n id: 'claude',\n displayName: 'Claude',\n supportsVision: true,\n supportsThinking: true, // 通过 Vercel AI SDK 支持 extended thinking\n thinkingFormat: 'reasoning',\n supportsNativeSearch: false,\n searchStrategy: 'tool_based',\n toolCallFormat: 'openai',\n defaultMaxTokens: 200000,\n};\n\n/** 家族配置映射 */\nexport const MODEL_FAMILIES: Record<ModelFamilyId, ModelFamilyConfig> = {\n doubao: DOUBAO_FAMILY,\n deepseek: DEEPSEEK_FAMILY,\n qwen: QWEN_FAMILY,\n gemini: GEMINI_FAMILY,\n gpt: GPT_FAMILY,\n claude: CLAUDE_FAMILY,\n};\n\n// ==================== 模型注册项 ====================\n\n/**\n * 模型注册项\n */\nexport interface ModelRegistryEntry {\n /** 模型 ID(API 调用用) */\n id: string;\n /** 显示名称 */\n displayName: string;\n /** 所属家族 */\n family: ModelFamilyId;\n /** 使用的协议 */\n protocol: ProtocolId;\n /** 是否在前端显示 */\n visible?: boolean;\n /** 是否支持图片理解(优先级高于 family.supportsVision) */\n supportsVision?: boolean;\n /** 上下文窗口大小(如 \"256K\") */\n contextWindow?: string;\n /** 价格信息(数组,分行显示) */\n pricing?: string[];\n}\n\n// ==================== 模型注册表 ====================\n\n/**\n * 全局模型注册表\n * \n * 每个模型只有一家供应商,无需分组\n */\nexport const MODEL_REGISTRY: ModelRegistryEntry[] = [\n // 豆包(价格为输入<=32k档,输出价格取决于输出长度)\n { id: 'doubao-seed-1-6-250615', displayName: '豆包 Seed 1.6', family: 'doubao', protocol: 'ark', visible: true, supportsVision: true, contextWindow: '256K', pricing: ['输入 0.8 元/百万tokens', '输出 2-8 元/百万tokens'] },\n { id: 'doubao-seed-1-8-251215', displayName: '豆包 Seed 1.8', family: 'doubao', protocol: 'ark', contextWindow: '256K', pricing: ['输入 0.8 元/百万tokens', '输出 2-8 元/百万tokens'] },\n \n // DeepSeek(价格为输入<=32k档)\n { id: 'deepseek-v3-2-251201', displayName: 'DeepSeek V3.2', family: 'deepseek', protocol: 'deepseek', visible: true, supportsVision: false, contextWindow: '128K', pricing: ['输入 2 元/百万tokens', '输出 3 元/百万tokens'] },\n \n // 通义千问\n { id: 'qwen3-vl-plus', displayName: '通义千问 3 VL', family: 'qwen', protocol: 'qwen', visible: true, supportsVision: true, contextWindow: '128K', pricing: ['输入 1 元/百万tokens', '输出 10 元/百万tokens'] },\n \n // Gemini\n { id: 'gemini-3-pro-preview', displayName: 'Gemini 3 Pro', family: 'gemini', protocol: 'gemini', visible: true, supportsVision: true, contextWindow: '1M', pricing: ['输入 1.25 元/百万tokens', '输出 10 元/百万tokens'] },\n { id: 'gemini-2.5-flash-preview-05-20', displayName: 'Gemini 2.5 Flash', family: 'gemini', protocol: 'gemini', contextWindow: '1M', pricing: ['输入 0.15 元/百万tokens', '输出 0.6 元/百万tokens'] },\n { id: 'gemini-2.5-pro-preview-05-06', displayName: 'Gemini 2.5 Pro', family: 'gemini', protocol: 'gemini', contextWindow: '1M', pricing: ['输入 1.25 元/百万tokens', '输出 10 元/百万tokens'] },\n \n // GPT(OpenRouter,美元价格按约7.2汇率换算)\n { id: 'openai/gpt-5.2', displayName: 'GPT-5.2', family: 'gpt', protocol: 'openai', visible: true, supportsVision: true, contextWindow: '400K', pricing: ['输入 12.6 元/百万tokens', '输出 100.8 元/百万tokens'] },\n \n // Claude(Vercel AI SDK,美元价格按约7.2汇率换算)\n { id: 'anthropic/claude-opus-4.5', displayName: 'Claude Opus 4.5', family: 'claude', protocol: 'anthropic', visible: true, supportsVision: true, contextWindow: '200K', pricing: ['输入 36 元/百万tokens', '输出 180 元/百万tokens'] },\n];\n\n// ==================== 查询辅助函数 ====================\n\n/**\n * 根据模型 ID 获取注册信息\n */\nexport function getModelEntry(modelId: string): ModelRegistryEntry | undefined {\n return MODEL_REGISTRY.find(m => m.id === modelId || modelId.includes(m.id));\n}\n\n/**\n * 根据模型 ID 获取家族配置\n */\nexport function getModelFamily(modelId: string): ModelFamilyConfig | undefined {\n const entry = getModelEntry(modelId);\n if (!entry) return undefined;\n return MODEL_FAMILIES[entry.family];\n}\n\n/**\n * 根据模型 ID 获取协议类型\n */\nexport function getModelProtocol(modelId: string): ProtocolId | undefined {\n const entry = getModelEntry(modelId);\n return entry?.protocol;\n}\n\n/**\n * 获取所有可见模型(用于前端显示)\n */\nexport function getVisibleModels(): ModelRegistryEntry[] {\n return MODEL_REGISTRY.filter(m => m.visible);\n}\n\n/**\n * 根据家族 ID 获取所有模型\n */\nexport function getModelsByFamily(familyId: ModelFamilyId): ModelRegistryEntry[] {\n return MODEL_REGISTRY.filter(m => m.family === familyId);\n}\n\n/**\n * 根据协议获取所有模型\n */\nexport function getModelsByProtocol(protocol: ProtocolId): ModelRegistryEntry[] {\n return MODEL_REGISTRY.filter(m => m.protocol === protocol);\n}\n\n/**\n * 检查模型是否支持 thinking\n */\nexport function modelSupportsThinking(modelId: string): boolean {\n const family = getModelFamily(modelId);\n return family?.supportsThinking ?? false;\n}\n\n/**\n * 检查模型是否支持原生搜索\n */\nexport function modelSupportsNativeSearch(modelId: string): boolean {\n const family = getModelFamily(modelId);\n return family?.supportsNativeSearch ?? false;\n}\n\n/**\n * 检查模型是否支持图片理解\n */\nexport function modelSupportsVision(modelId: string): boolean {\n const entry = getModelEntry(modelId);\n if (!entry) return false;\n if (typeof entry.supportsVision === 'boolean') return entry.supportsVision;\n const family = getModelFamily(modelId);\n return family?.supportsVision ?? false;\n}\n\n/**\n * 获取模型的搜索策略\n */\nexport function getModelSearchStrategy(modelId: string): SearchStrategy {\n const family = getModelFamily(modelId);\n return family?.searchStrategy ?? 'tool_based';\n}\n\n","/**\n * AI Chat Core 类型定义\n */\n\nimport { \n getVisibleModels, \n getModelFamily,\n getModelEntry,\n modelSupportsThinking,\n modelSupportsVision,\n modelSupportsNativeSearch,\n getModelSearchStrategy,\n type ModelRegistryEntry,\n} from './providers/model-registry';\nimport type { ProviderType } from './router';\n\n// ==================== 模式与模型 ====================\n\n/** 对话模式 */\nexport type ChatMode = 'agent' | 'ask';\n\n// 重新导出 router 和 Model Registry 类型\nexport type { ProviderType };\nexport type { ModelFamilyId, ModelFamilyConfig, ModelRegistryEntry } from './providers/model-registry';\nexport { getModelFamily, getModelEntry, modelSupportsThinking, modelSupportsNativeSearch, getModelSearchStrategy };\n\n/** 模型选项(前端显示用) */\nexport interface ModelOption {\n /** 模型 ID(发送给 API) */\n modelId: string;\n /** 显示名称 */\n displayName: string;\n /** 是否支持深度思考 */\n supportsThinking: boolean;\n /** 是否支持图片理解 */\n supportsVision: boolean;\n /** 用于模型项 hover 的特性描述(由后端定义,前端只渲染) */\n tooltip?: {\n features?: string[];\n /** 开销信息(数组,分行显示) */\n cost?: string[];\n description?: string;\n };\n}\n\n/** 生成模型 tooltip 的 features 列表 */\nfunction buildModelFeatures(entry: ModelRegistryEntry): string[] {\n const family = getModelFamily(entry.id);\n const supportsVision = modelSupportsVision(entry.id);\n const supportsThinking = family?.supportsThinking ?? false;\n const supportsNativeSearch = family?.supportsNativeSearch ?? false;\n \n const features: string[] = [];\n // 顺序:多模态 > 深度思考 > 长上下文 > 联网搜索\n if (supportsVision) features.push('多模态');\n if (supportsThinking) features.push('深度思考');\n if (entry.contextWindow) features.push(`长上下文(${entry.contextWindow})`);\n if (supportsNativeSearch) features.push('联网搜索');\n \n return features;\n}\n\n/**\n * 预定义模型列表\n */\nexport const MODELS: ModelOption[] = getVisibleModels().map(entry => {\n const family = getModelFamily(entry.id);\n const supportsThinking = family?.supportsThinking ?? false;\n const supportsVision = modelSupportsVision(entry.id);\n\n return {\n modelId: entry.id,\n displayName: entry.displayName,\n supportsThinking,\n supportsVision,\n tooltip: {\n features: buildModelFeatures(entry),\n cost: entry.pricing,\n },\n };\n});\n\n/** 根据 modelId 获取模型 */\nexport function getModelByModelId(modelId: string): ModelOption | undefined {\n return MODELS.find(m => m.modelId === modelId);\n}\n\n// ==================== 配置 ====================\n\n/** 工具批准回调函数 */\nexport type ToolApprovalCallback = (toolCall: {\n id: string;\n name: string;\n args: Record<string, unknown>;\n}) => Promise<boolean>;\n\n/** Agent 配置 */\nexport interface AgentConfig {\n /** 豆包/火山引擎 API Key (用于豆包和 DeepSeek) */\n arkApiKey: string;\n /** 豆包 API URL */\n arkApiUrl?: string;\n /** 通义千问 API Key */\n qwenApiKey?: string;\n /** 通义千问 API URL */\n qwenApiUrl?: string;\n /** OpenRouter API Key */\n openrouterApiKey?: string;\n /** OpenRouter API URL */\n openrouterApiUrl?: string;\n /** Vercel API Key(用于 Vercel AI Gateway 访问 Claude) */\n vercelApiKey?: string;\n /** Tavily API Key(用于统一 Web Search) */\n tavilyApiKey?: string;\n /** Gemini API Key (用于图片/视频,注意:中国大陆无法直接访问) */\n geminiApiKey: string;\n /** 当前工作目录(Current Working Directory) */\n cwd?: string;\n /** \n * 工具列表(Vite 插件风格)\n * \n * 支持多种形式:\n * - 单个工具:getCwdTool\n * - 工具插件:searchPlugin({ dataDir, workspace })\n * - Promise:await asyncPlugin()\n * \n * @example\n * ```typescript\n * tools: [\n * getCwdTool,\n * executeCommandTool,\n * searchPlugin({ dataDir: '/path', workspace: '/project' }),\n * ]\n * ```\n */\n tools?: ToolConfigItem[];\n /** \n * 工具批准回调(manual 模式使用)\n * 返回 true 表示批准执行,false 表示跳过\n */\n onToolApprovalRequest?: ToolApprovalCallback;\n /**\n * 动态获取自动运行配置回调\n * 每次检查工具批准时调用,获取最新配置\n */\n getAutoRunConfig?: () => Promise<AutoRunConfig | undefined>;\n}\n\n/** 深度思考模式 */\nexport type ThinkingMode = 'enabled' | 'disabled';\n\n/** 自动运行模式 */\nexport type AutoRunMode = 'run-everything' | 'manual';\n\n/** 自动运行配置 */\nexport interface AutoRunConfig {\n /** \n * 自动运行模式\n * - 'run-everything': 运行所有内容(自动执行)\n * - 'manual': 手动批准(每次执行前询问)\n */\n mode?: AutoRunMode;\n}\n\n/** 聊天消息格式(用于传递历史) */\nexport interface ChatHistoryMessage {\n role: 'user' | 'assistant' | 'system' | 'tool';\n content: string;\n}\n\n/** 聊天配置(每次聊天可变的选项) */\nexport interface ChatOptions {\n /** 对话模式 */\n mode?: ChatMode;\n /** 使用的模型 */\n model?: string;\n /** 模型提供商 */\n provider?: ProviderType;\n /** 是否启用联网搜索 */\n enableWebSearch?: boolean;\n /** \n * 深度思考模式\n * - 'enabled': 强制开启深度思考\n * - 'disabled': 强制关闭深度思考\n */\n thinkingMode?: ThinkingMode;\n /** 启用的工具名称列表(agent 模式有效,ask 模式强制禁用) */\n enabledTools?: string[];\n /** 自动运行配置 */\n autoRunConfig?: AutoRunConfig;\n /** 对话历史(从数据库加载,无状态架构) */\n history?: ChatHistoryMessage[];\n // 注意:每个 provider 内部使用自己的最优参数\n // - ARK: reasoning.effort = 'high'\n // - Qwen: thinking_budget = 38400\n // - Gemini: thinkingLevel = 'high'\n // 外部只需关心 thinkingMode 开关即可\n}\n\n// ==================== 工具相关 ====================\n\n/**\n * 副作用定义(参考 REST API 规范)\n * \n * @example\n * // 通知\n * { type: 'notification', success: true, message: '图片生成完成' }\n * \n * // 文件系统变更\n * { type: 'filesystem', success: true, data: { paths: ['/path/to/file'] } }\n * \n * // 失败\n * { type: 'notification', success: false, message: 'API 超时' }\n */\nexport interface SideEffect {\n /** 副作用类型 */\n type: string;\n /** 是否成功 */\n success: boolean;\n /** 附加数据 */\n data?: unknown;\n /** 消息(成功时为提示,失败时为错误信息) */\n message?: string;\n}\n\n/**\n * 工具执行结果(支持动态副作用)\n * \n * 工具可以返回此类型来动态声明副作用\n */\nexport interface ToolResult {\n /** 执行结果(字符串) */\n result: string;\n /** 动态副作用(覆盖静态声明) */\n sideEffects?: SideEffect[];\n}\n\n/** 工具执行上下文 */\nexport interface ToolContext {\n /** 当前工作目录(Current Working Directory) */\n cwd: string;\n /** Gemini 客户端(供多模态工具使用) */\n geminiClient?: unknown;\n /** 执行 Shell 命令(内置方法) */\n executeCommand: (\n command: string,\n cwd?: string\n ) => Promise<{ success: boolean; output?: string; error?: string }>;\n /** 中断信号(用于取消长时间操作) */\n signal?: AbortSignal;\n}\n\n/** \n * 工具接口(用户可实现此接口创建自定义工具)\n * \n * 示例:\n * ```typescript\n * const myTool: Tool = {\n * name: 'my_tool',\n * description: '我的自定义工具',\n * parameters: { type: 'object', properties: {}, required: [] },\n * sideEffects: ['filesystem'], // 声明副作用\n * resultType: 'my_result', // 结果类型(用于前端渲染)\n * execute: async (args, ctx) => '执行结果'\n * };\n * ```\n */\nexport interface Tool {\n /** 工具名称 */\n name: string;\n /** 工具描述(供 AI 理解) */\n description: string;\n /** 参数定义(JSON Schema) */\n parameters: {\n type: 'object';\n properties: Record<string, {\n type: string;\n description: string;\n enum?: string[];\n items?: { type: string };\n }>;\n required: string[];\n };\n /** \n * 静态副作用声明(可选)\n * \n * 用于通知前端该工具执行后可能产生的副作用\n * \n * @example\n * sideEffects: [{ type: 'notification', message: '图片生成完成', level: 'success' }]\n * \n * 注意:如果 execute 返回 ToolResult 带有 sideEffects,会覆盖此静态声明\n */\n sideEffects?: SideEffect[];\n /**\n * 结果类型(用于前端渲染)\n * \n * 当工具执行成功时,前端会根据此类型生成对应的 ContentPart\n * 例如:resultType: 'weather' 会生成 { type: 'weather', ...result }\n * \n * 如果不指定,工具结果仅显示在 ToolCallPart 的折叠面板中\n */\n resultType?: string;\n /** \n * 执行函数\n * \n * 返回值:\n * - string: 简单返回结果,使用静态 sideEffects\n * - ToolResult: 带动态副作用的结果,覆盖静态 sideEffects\n */\n execute: (args: Record<string, unknown>, context: ToolContext) => Promise<string | ToolResult>;\n}\n\n/** 工具执行器接口(可由使用方实现,用于自定义命令执行环境) */\nexport interface ToolExecutor {\n /** 执行 Shell 命令 */\n executeCommand(\n command: string,\n cwd?: string,\n signal?: AbortSignal,\n hooks?: {\n onStdout?: (chunk: string) => void;\n onStderr?: (chunk: string) => void;\n }\n ): Promise<{ success: boolean; output?: string; error?: string }>;\n}\n\n// ==================== 工具插件(Vite 插件风格) ====================\n\n/**\n * 工具插件实例\n * \n * 由 createXxxPlugin() 返回,可直接在 tools 数组中展开使用\n */\nexport interface ToolPlugin {\n /** 插件提供的工具数组 */\n tools: Tool[];\n /** 插件控制方法(可选,由各插件自定义) */\n [key: string]: unknown;\n}\n\n/**\n * 创建单个工具插件(辅助函数)\n * \n * @example\n * ```typescript\n * export function getCwdTool(): ToolPlugin {\n * return tool({\n * name: 'get_cwd',\n * description: '...',\n * parameters: { ... },\n * execute: async (args, context) => { ... }\n * });\n * }\n * ```\n */\nexport function tool(t: Tool): ToolPlugin {\n return { tools: [t] };\n}\n\n/**\n * 创建多个工具插件(辅助函数)\n * \n * @example\n * ```typescript\n * export function myPlugin(): ToolPlugin {\n * return tools([\n * { name: 'tool1', ... },\n * { name: 'tool2', ... },\n * ]);\n * }\n * ```\n */\nexport function tools(ts: Tool[]): ToolPlugin {\n return { tools: ts };\n}\n\n/**\n * 工具配置项(Vite 插件风格,只支持插件形式)\n * \n * @example\n * ```typescript\n * tools: [\n * getCwdTool(), // 工具插件(函数调用)\n * searchPlugin({ dataDir, workspace }), // 异步插件(返回 Promise<ToolPlugin>)\n * ]\n * ```\n */\nexport type ToolConfigItem = ToolPlugin | Promise<ToolPlugin>;\n\n/**\n * 解析工具配置,统一转换为 Tool[]\n * \n * 所有工具都必须是 ToolPlugin 形式(Vite 插件风格)\n */\nexport async function resolveTools(items: ToolConfigItem[]): Promise<Tool[]> {\n const tools: Tool[] = [];\n \n for (const item of items) {\n const resolved = await item;\n \n if ('tools' in resolved && Array.isArray(resolved.tools)) {\n // ToolPlugin\n tools.push(...resolved.tools);\n } else {\n console.warn('工具配置项必须是 ToolPlugin 形式:', resolved);\n }\n }\n \n return tools;\n}\n\n/** 工具定义(OpenAI 格式,内部使用) */\nexport interface ToolDefinition {\n type: 'function';\n function: {\n name: string;\n description: string;\n parameters: {\n type: 'object';\n properties: Record<string, {\n type: string;\n description: string;\n enum?: string[];\n items?: { type: string };\n }>;\n required: string[];\n };\n };\n}\n\n// ==================== 消息相关 ====================\n\n/** 聊天消息(内部格式) */\nexport interface ChatMessage {\n /** 消息 ID */\n id?: string;\n role: 'system' | 'user' | 'assistant' | 'tool';\n content: string;\n /** 深度思考内容 */\n reasoning_content?: string;\n tool_call_id?: string;\n tool_calls?: Array<{\n id: string;\n type: 'function';\n function: {\n name: string;\n arguments: string;\n };\n /** Gemini 模型需要的 thought_signature(用于工具调用循环) */\n thought_signature?: string;\n }>;\n}\n\n// ==================== API 特定类型 ====================\n\n/** 火山引擎 Responses API 工具定义 */\nexport interface ResponsesApiTool {\n type: 'function' | 'web_search';\n // Function 类型\n name?: string;\n description?: string;\n parameters?: Record<string, unknown>;\n // Web Search 类型\n max_keyword?: number;\n limit?: number;\n sources?: string[];\n}\n","/**\n * AI Chat 事件系统\n * \n * 模块化的事件类型定义,用于 Agent 与前端之间的通信。\n * \n * 设计原则:\n * 1. 每种事件类型有明确的数据结构\n * 2. 事件分组便于管理和扩展\n * 3. 类型安全,避免 unknown\n * 4. 统一的时间追踪(开始/结束/耗时)\n */\n\n// ==================== 基础类型 ====================\n\n/** 搜索结果项 */\nexport interface SearchResult {\n title: string;\n url: string;\n snippet: string;\n}\n\n/** 工具调用状态 */\nexport type ToolCallStatus = 'pending' | 'running' | 'success' | 'error';\n\n/** 工具调用信息(用于前端状态管理) */\nexport interface ToolCallInfo {\n id: string;\n name: string;\n args: Record<string, unknown>;\n status: ToolCallStatus;\n result?: string;\n error?: string;\n startedAt?: number;\n duration?: number;\n}\n\n/** Token 使用统计 */\nexport interface TokenUsage {\n promptTokens: number;\n completionTokens: number;\n totalTokens: number;\n /** 思考 token 数(如果有) */\n reasoningTokens?: number;\n /** 缓存命中 token 数(如果有) */\n cachedTokens?: number;\n}\n\n// ==================== 错误类型 ====================\n\n/** 错误类别 - 参考 AI SDK 设计 */\nexport type ErrorCategory = \n | 'api' // API 调用错误(网络、认证、服务端错误)\n | 'rate_limit' // 速率限制\n | 'validation' // 参数验证错误\n | 'tool' // 工具执行错误\n | 'timeout' // 超时错误\n | 'abort' // 用户取消\n | 'parse' // 解析错误(JSON、响应格式)\n | 'unknown'; // 未知错误\n\n/** 错误详情 - 结构化错误信息 */\nexport interface ErrorDetails {\n /** 错误分类 */\n category: ErrorCategory;\n /** 人类可读的错误信息 */\n message: string;\n /** 错误代码(如 'RATE_LIMIT', 'NETWORK_ERROR') */\n code?: string;\n /** HTTP 状态码(如果适用) */\n statusCode?: number;\n /** HTTP 状态文本 */\n statusText?: string;\n /** 是否可重试 */\n retryable?: boolean;\n /** 重试等待时间(秒) */\n retryAfter?: number;\n /** 原始错误信息(用于调试) */\n cause?: string;\n /** 错误发生的上下文(如模型名、工具名) */\n context?: string;\n}\n\n// ==================== 思考相关事件 ====================\n\n/** 思考开始事件 */\nexport interface ThinkingStartEvent {\n type: 'thinking_start';\n data: {\n /** 开始时间戳(毫秒) */\n startedAt: number;\n };\n}\n\n/** 思考内容增量事件 */\nexport interface ThinkingDeltaEvent {\n type: 'thinking_delta';\n data: {\n /** 增量内容 */\n content: string;\n };\n}\n\n/** 思考结束事件 */\nexport interface ThinkingEndEvent {\n type: 'thinking_end';\n data: {\n /** 结束时间戳(毫秒) */\n endedAt: number;\n /** 思考耗时(毫秒) */\n duration: number;\n };\n}\n\n/** 思考相关事件联合类型 */\nexport type ThinkingEvent = ThinkingStartEvent | ThinkingDeltaEvent | ThinkingEndEvent;\n\n// ==================== 搜索相关事件 ====================\n\n/** 搜索开始事件 */\nexport interface SearchStartEvent {\n type: 'search_start';\n data: {\n /** 搜索查询词 */\n query: string;\n /** 开始时间戳(毫秒) */\n startedAt: number;\n };\n}\n\n/** 搜索结果事件(成功完成) */\nexport interface SearchResultEvent {\n type: 'search_result';\n data: {\n /** 搜索结果列表 */\n results: SearchResult[];\n /** 结束时间戳(毫秒) */\n endedAt: number;\n /** 搜索耗时(毫秒) */\n duration: number;\n };\n}\n\n/** 搜索结束事件(失败或取消) */\nexport interface SearchEndEvent {\n type: 'search_end';\n data: {\n /** 是否成功 */\n success: boolean;\n /** 错误信息(失败时) */\n error?: string;\n /** 结束时间戳(毫秒) */\n endedAt: number;\n /** 搜索耗时(毫秒) */\n duration: number;\n };\n}\n\n/** 搜索相关事件联合类型 */\nexport type SearchEvent = SearchStartEvent | SearchResultEvent | SearchEndEvent;\n\n// ==================== 工具相关事件 ====================\n\n/** 工具调用开始事件 */\nexport interface ToolCallStartEvent {\n type: 'tool_call_start';\n data: {\n /** 工具调用 ID */\n id: string;\n /** 工具名称 */\n name: string;\n /** 工具参数 */\n args: Record<string, unknown>;\n /** 开始时间戳(毫秒) */\n startedAt: number;\n };\n}\n\n/** 副作用定义(从 types.ts 复制,避免循环依赖) */\nexport interface SideEffect {\n type: string;\n success: boolean;\n data?: unknown;\n message?: string;\n}\n\n/** 工具调用结果事件 */\nexport interface ToolCallResultEvent {\n type: 'tool_call_result';\n data: {\n /** 工具调用 ID */\n id: string;\n /** 工具名称 */\n name: string;\n /** 执行结果 */\n result: string;\n /** 是否成功 */\n success: boolean;\n /** 错误信息(失败时) */\n error?: string;\n /** 结束时间戳(毫秒) */\n endedAt: number;\n /** 执行耗时(毫秒) */\n duration: number;\n /** \n * 工具副作用\n * 前端可根据此字段处理通知、刷新文件列表等\n */\n sideEffects?: SideEffect[];\n /**\n * 结果类型(用于前端渲染)\n * \n * 当工具定义了 resultType 且执行成功时,前端会根据此类型生成对应的 ContentPart\n * 例如:resultType: 'weather' 会生成 { type: 'weather', ...result }\n */\n resultType?: string;\n };\n}\n\n/** 工具输出增量事件(用于 stdout/stderr 流式展示) */\nexport interface ToolCallOutputEvent {\n type: 'tool_call_output';\n data: {\n /** 工具调用 ID */\n id: string;\n /** 工具名称 */\n name: string;\n /** 输出流类型 */\n stream: 'stdout' | 'stderr';\n /** 输出增量内容 */\n chunk: string;\n /** 时间戳 */\n at: number;\n };\n}\n\n/** 工具执行批准请求事件(manual 模式) */\nexport interface ToolApprovalRequestEvent {\n type: 'tool_approval_request';\n data: {\n /** 工具调用 ID */\n id: string;\n /** 工具名称 */\n name: string;\n /** 工具参数 */\n args: Record<string, unknown>;\n /** 请求时间戳 */\n requestedAt: number;\n };\n}\n\n/** 工具相关事件联合类型 */\nexport type ToolEvent = ToolCallStartEvent | ToolCallResultEvent | ToolApprovalRequestEvent | ToolCallOutputEvent;\n\n// ==================== 文本相关事件 ====================\n\n/** 文本增量事件 */\nexport interface TextDeltaEvent {\n type: 'text_delta';\n data: {\n /** 增量文本 */\n content: string;\n };\n}\n\n/** 文本相关事件联合类型 */\nexport type TextEvent = TextDeltaEvent;\n\n// ==================== 媒体相关事件 ====================\n\n/** 图片事件 */\nexport interface ImageEvent {\n type: 'image';\n data: {\n /** 图片路径 */\n path?: string;\n /** Base64 编码 */\n base64?: string;\n /** MIME 类型 */\n mimeType?: string;\n };\n}\n\n/** 视频事件 */\nexport interface VideoEvent {\n type: 'video';\n data: {\n /** 视频路径 */\n path: string;\n };\n}\n\n/** 媒体相关事件联合类型 */\nexport type MediaEvent = ImageEvent | VideoEvent;\n\n// ==================== 状态事件 ====================\n\n/** 流开始事件 */\nexport interface StreamStartEvent {\n type: 'stream_start';\n data: {\n /** 请求 ID */\n requestId?: string;\n /** 使用的模型 */\n model: string;\n /** 开始时间戳 */\n startedAt: number;\n };\n}\n\n/** 完成事件 */\nexport interface DoneEvent {\n type: 'done';\n data: {\n /** 完整的最终文本 */\n text: string;\n /** Token 使用统计 */\n usage?: TokenUsage;\n /** 总耗时(毫秒) */\n duration?: number;\n };\n}\n\n/** 错误事件 - 结构化错误信息 */\nexport interface ErrorEvent {\n type: 'error';\n data: ErrorDetails;\n}\n\n/** 中止事件 - 用户主动取消 */\nexport interface AbortEvent {\n type: 'abort';\n data: {\n /** 中止原因 */\n reason?: string;\n /** 中止时间戳 */\n abortedAt: number;\n };\n}\n\n/** 状态相关事件联合类型 */\nexport type StatusEvent = StreamStartEvent | DoneEvent | ErrorEvent | AbortEvent;\n\n// ==================== 步骤追踪事件 ====================\n\n/** 步骤开始事件 */\nexport interface StepStartEvent {\n type: 'step_start';\n data: {\n /** 步骤编号(从 1 开始) */\n stepNumber: number;\n /** 步骤描述(可选) */\n description?: string;\n /** 开始时间戳 */\n startedAt: number;\n };\n}\n\n/** 步骤结束事件 */\nexport interface StepEndEvent {\n type: 'step_end';\n data: {\n /** 步骤编号 */\n stepNumber: number;\n /** 结束时间戳 */\n endedAt: number;\n /** 耗时(毫秒) */\n duration: number;\n };\n}\n\n/** 步骤相关事件联合类型 */\nexport type StepEvent = StepStartEvent | StepEndEvent;\n\n// ==================== 聚合类型 ====================\n\n/** 所有事件类型 */\nexport type ChatEvent =\n | ThinkingEvent\n | SearchEvent\n | ToolEvent\n | TextEvent\n | MediaEvent\n | StatusEvent\n | StepEvent;\n\n/** 事件类型字符串 */\nexport type ChatEventType = ChatEvent['type'];\n\n// ==================== 工具函数 ====================\n\n/**\n * 创建思考开始事件\n */\nexport function createThinkingStart(): ThinkingStartEvent {\n return {\n type: 'thinking_start',\n data: { startedAt: Date.now() }\n };\n}\n\n/**\n * 创建思考增量事件\n */\nexport function createThinkingDelta(content: string): ThinkingDeltaEvent {\n return {\n type: 'thinking_delta',\n data: { content }\n };\n}\n\n/**\n * 创建思考结束事件\n */\nexport function createThinkingEnd(startedAt: number): ThinkingEndEvent {\n const endedAt = Date.now();\n return {\n type: 'thinking_end',\n data: {\n endedAt,\n duration: endedAt - startedAt\n }\n };\n}\n\n/**\n * 创建搜索开始事件\n */\nexport function createSearchStart(query: string): SearchStartEvent {\n return {\n type: 'search_start',\n data: { query, startedAt: Date.now() }\n };\n}\n\n/**\n * 创建搜索结果事件(成功)\n */\nexport function createSearchResult(results: SearchResult[], startedAt: number): SearchResultEvent {\n const endedAt = Date.now();\n return {\n type: 'search_result',\n data: { \n results, \n endedAt,\n duration: endedAt - startedAt\n }\n };\n}\n\n/**\n * 创建搜索结束事件(失败或取消)\n */\nexport function createSearchEnd(\n success: boolean, \n startedAt: number, \n error?: string\n): SearchEndEvent {\n const endedAt = Date.now();\n return {\n type: 'search_end',\n data: { \n success, \n error,\n endedAt,\n duration: endedAt - startedAt\n }\n };\n}\n\n/**\n * 创建工具调用开始事件\n */\nexport function createToolCallStart(\n id: string,\n name: string,\n args: Record<string, unknown>\n): ToolCallStartEvent {\n return {\n type: 'tool_call_start',\n data: { id, name, args, startedAt: Date.now() }\n };\n}\n\n/**\n * 创建工具调用结果事件\n */\nexport function createToolCallResult(\n id: string,\n name: string,\n result: string,\n success: boolean,\n startedAt: number,\n error?: string,\n sideEffects?: SideEffect[],\n resultType?: string\n): ToolCallResultEvent {\n const endedAt = Date.now();\n return {\n type: 'tool_call_result',\n data: { \n id, \n name, \n result, \n success, \n error,\n endedAt,\n duration: endedAt - startedAt,\n sideEffects,\n resultType\n }\n };\n}\n\n/**\n * 创建工具输出增量事件\n */\nexport function createToolCallOutput(\n id: string,\n name: string,\n stream: 'stdout' | 'stderr',\n chunk: string\n): ToolCallOutputEvent {\n return {\n type: 'tool_call_output',\n data: {\n id,\n name,\n stream,\n chunk,\n at: Date.now(),\n },\n };\n}\n\n/**\n * 创建文本增量事件\n */\nexport function createTextDelta(content: string): TextDeltaEvent {\n return {\n type: 'text_delta',\n data: { content }\n };\n}\n\n/**\n * 创建流开始事件\n */\nexport function createStreamStart(model: string, requestId?: string): StreamStartEvent {\n return {\n type: 'stream_start',\n data: {\n model,\n requestId,\n startedAt: Date.now()\n }\n };\n}\n\n/**\n * 创建完成事件\n */\nexport function createDone(text: string, usage?: TokenUsage, duration?: number): DoneEvent {\n return {\n type: 'done',\n data: { text, usage, duration }\n };\n}\n\n/**\n * 创建错误事件(完整版)\n */\nexport function createError(details: ErrorDetails): ErrorEvent {\n return {\n type: 'error',\n data: details\n };\n}\n\n/**\n * 创建 API 错误事件\n */\nexport function createApiError(\n message: string,\n options: {\n code?: string;\n statusCode?: number;\n statusText?: string;\n retryable?: boolean;\n retryAfter?: number;\n cause?: string;\n context?: string;\n } = {}\n): ErrorEvent {\n return createError({\n category: 'api',\n message,\n ...options\n });\n}\n\n/**\n * 创建速率限制错误事件\n */\nexport function createRateLimitError(\n message: string,\n retryAfter?: number,\n context?: string\n): ErrorEvent {\n return createError({\n category: 'rate_limit',\n message,\n code: 'RATE_LIMIT',\n statusCode: 429,\n retryable: true,\n retryAfter,\n context\n });\n}\n\n/**\n * 创建工具错误事件\n */\nexport function createToolError(\n message: string,\n toolName: string,\n cause?: string\n): ErrorEvent {\n return createError({\n category: 'tool',\n message,\n code: 'TOOL_ERROR',\n context: toolName,\n cause,\n retryable: false\n });\n}\n\n/**\n * 创建超时错误事件\n */\nexport function createTimeoutError(\n message: string,\n context?: string\n): ErrorEvent {\n return createError({\n category: 'timeout',\n message,\n code: 'TIMEOUT',\n retryable: true,\n context\n });\n}\n\n/**\n * 创建解析错误事件\n */\nexport function createParseError(\n message: string,\n cause?: string\n): ErrorEvent {\n return createError({\n category: 'parse',\n message,\n code: 'PARSE_ERROR',\n cause,\n retryable: false\n });\n}\n\n/**\n * 创建中止事件\n */\nexport function createAbort(reason?: string): AbortEvent {\n return {\n type: 'abort',\n data: { \n reason,\n abortedAt: Date.now()\n }\n };\n}\n\n/**\n * 创建步骤开始事件\n */\nexport function createStepStart(stepNumber: number, description?: string): StepStartEvent {\n return {\n type: 'step_start',\n data: { stepNumber, description, startedAt: Date.now() }\n };\n}\n\n/**\n * 创建步骤结束事件\n */\nexport function createStepEnd(stepNumber: number, startedAt: number): StepEndEvent {\n const endedAt = Date.now();\n return {\n type: 'step_end',\n data: { \n stepNumber, \n endedAt,\n duration: endedAt - startedAt\n }\n };\n}\n\n/**\n * 创建图片事件\n */\nexport function createImage(options: { path?: string; base64?: string; mimeType?: string }): ImageEvent {\n return {\n type: 'image',\n data: options\n };\n}\n\n/**\n * 创建视频事件\n */\nexport function createVideo(path: string): VideoEvent {\n return {\n type: 'video',\n data: { path }\n };\n}\n\n// ==================== 类型守卫 ====================\n\n/** 检查是否为思考事件 */\nexport function isThinkingEvent(event: ChatEvent): event is ThinkingEvent {\n return event.type.startsWith('thinking_');\n}\n\n/** 检查是否为搜索事件 */\nexport function isSearchEvent(event: ChatEvent): event is SearchEvent {\n return event.type.startsWith('search_');\n}\n\n/** 检查是否为工具事件 */\nexport function isToolEvent(event: ChatEvent): event is ToolEvent {\n return event.type.startsWith('tool_');\n}\n\n/** 检查是否为文本事件 */\nexport function isTextEvent(event: ChatEvent): event is TextEvent {\n return event.type === 'text_delta';\n}\n\n/** 检查是否为媒体事件 */\nexport function isMediaEvent(event: ChatEvent): event is MediaEvent {\n return event.type === 'image' || event.type === 'video';\n}\n\n/** 检查是否为状态事件 */\nexport function isStatusEvent(event: ChatEvent): event is StatusEvent {\n return event.type === 'stream_start' || event.type === 'done' || event.type === 'error' || event.type === 'abort';\n}\n\n/** 检查是否为错误事件 */\nexport function isErrorEvent(event: ChatEvent): event is ErrorEvent {\n return event.type === 'error';\n}\n\n/** 检查是否为中止事件 */\nexport function isAbortEvent(event: ChatEvent): event is AbortEvent {\n return event.type === 'abort';\n}\n\n/** 检查是否为步骤事件 */\nexport function isStepEvent(event: ChatEvent): event is StepEvent {\n return event.type.startsWith('step_');\n}\n\n/** 检查错误是否可重试 */\nexport function isRetryableError(event: ChatEvent): boolean {\n if (event.type !== 'error') return false;\n return event.data.retryable === true;\n}\n","/**\n * 工具执行器\n */\n\nimport type { ToolExecutor } from './types';\n\n/** 危险命令黑名单 */\nconst DANGEROUS_COMMANDS = [\n 'rm -rf /', 'rm -rf ~', 'format', 'mkfs', 'dd if=',\n 'shutdown', 'reboot', 'sudo rm', 'sudo format'\n];\n\nfunction isDangerousCommand(command: string): boolean {\n const lowerCommand = command.toLowerCase().trim();\n return DANGEROUS_COMMANDS.some(dangerous => \n lowerCommand.includes(dangerous.toLowerCase())\n );\n}\n\n/**\n * 创建默认工具执行器(Node.js 环境)\n * \n * 用于执行 shell 命令,包含基本安全检查\n * 支持通过 AbortSignal 取消命令执行\n */\nexport function createDefaultToolExecutor(defaultCwd: string = process.cwd()): ToolExecutor {\n return {\n async executeCommand(command: string, cwd?: string, signal?: AbortSignal, hooks?: { onStdout?: (chunk: string) => void; onStderr?: (chunk: string) => void }) {\n // 检查是否已取消\n if (signal?.aborted) {\n return { success: false, error: '操作已取消' };\n }\n \n if (isDangerousCommand(command)) {\n return { success: false, error: '该命令被安全策略阻止' };\n }\n\n try {\n const { spawn } = await import('child_process');\n \n return new Promise((resolve) => {\n let stdout = '';\n let stderr = '';\n let killed = false;\n let killTimer: NodeJS.Timeout | null = null;\n \n const child = spawn('sh', ['-c', command], {\n cwd: cwd || defaultCwd,\n env: process.env,\n // 关键:让 sh 及其子进程处于同一进程组,便于取消/超时时“一锅端”\n // macOS/Linux: 可用负 PID kill 进程组;Windows 会忽略 detached 的语义\n detached: process.platform !== 'win32',\n });\n\n const killProcessTree = (signalName: NodeJS.Signals) => {\n if (killed) return;\n killed = true;\n try {\n if (process.platform !== 'win32' && typeof child.pid === 'number') {\n // 负 PID => 发送到该进程组(避免 sh 死了但子进程继续跑)\n process.kill(-child.pid, signalName);\n } else {\n child.kill(signalName);\n }\n } catch {\n try {\n child.kill(signalName);\n } catch {\n // ignore\n }\n }\n\n // 兜底:若 SIGTERM 不生效,短延迟后再 SIGKILL\n if (killTimer) clearTimeout(killTimer);\n killTimer = setTimeout(() => {\n try {\n if (process.platform !== 'win32' && typeof child.pid === 'number') {\n process.kill(-child.pid, 'SIGKILL');\n } else {\n child.kill('SIGKILL');\n }\n } catch {\n // ignore\n }\n }, 1500);\n };\n \n // 设置超时\n const timeout = setTimeout(() => {\n if (killed) return;\n killProcessTree('SIGTERM');\n resolve({ success: false, error: '命令执行超时(30秒)' });\n }, 30000);\n \n // 监听取消信号\n const abortHandler = () => {\n if (killed) return;\n killProcessTree('SIGTERM');\n clearTimeout(timeout);\n resolve({ success: false, error: '操作已取消' });\n };\n signal?.addEventListener('abort', abortHandler);\n \n child.stdout?.on('data', (data) => {\n const chunk = data.toString();\n stdout += chunk;\n hooks?.onStdout?.(chunk);\n });\n \n child.stderr?.on('data', (data) => {\n const chunk = data.toString();\n stderr += chunk;\n hooks?.onStderr?.(chunk);\n });\n \n child.on('close', (code) => {\n clearTimeout(timeout);\n signal?.removeEventListener('abort', abortHandler);\n if (killTimer) {\n clearTimeout(killTimer);\n killTimer = null;\n }\n \n if (killed) return;\n \n const output = stdout.trim();\n const errOutput = stderr.trim();\n \n if (code === 0) {\n resolve({ success: true, output: output || errOutput || '执行成功' });\n } else {\n // 非零退出码但有输出时,也算成功(某些命令会这样)\n if (output) {\n const warning = errOutput ? `\\n[警告: ${errOutput}]` : '';\n resolve({ success: true, output: output + warning });\n } else if (errOutput) {\n resolve({ success: false, error: errOutput });\n } else {\n resolve({ success: false, error: `命令退出码: ${code}` });\n }\n }\n });\n \n child.on('error', (err) => {\n clearTimeout(timeout);\n signal?.removeEventListener('abort', abortHandler);\n if (killTimer) {\n clearTimeout(killTimer);\n killTimer = null;\n }\n \n if (!killed) {\n resolve({ success: false, error: err.message });\n }\n });\n });\n } catch (error) {\n return { success: false, error: error instanceof Error ? error.message : String(error) };\n }\n }\n };\n}\n","/**\n * 常量定义\n * \n * 所有模型配置统一在此管理\n */\n\n// ==================== API URL ====================\nexport const DEFAULT_ARK_URL = 'https://ark.cn-beijing.volces.com/api/v3';\n// Qwen 使用 OpenAI 兼容模式以支持工具调用\nexport const DEFAULT_QWEN_URL = 'https://dashscope.aliyuncs.com/compatible-mode/v1';\nexport const DEFAULT_OPENROUTER_URL = 'https://openrouter.ai/api/v1';\n\n// ==================== 模型配置类型 ====================\ninterface ModelConfig {\n id: string;\n displayName: string;\n isOpenRouter?: boolean;\n /** 提供商名称(用于分组) */\n provider?: string;\n /** 模型描述 */\n description?: string;\n}\n\n// ==================== 豆包模型 (ARK) ====================\nexport const DOUBAO_SEED_1_8: ModelConfig = { \n id: 'doubao-seed-1-8-251215', \n displayName: '豆包 Seed 1.8',\n provider: '豆包',\n};\nexport const DOUBAO_SEED_1_6: ModelConfig = { \n id: 'doubao-seed-1-6-250615', \n displayName: '豆包 Seed 1.6',\n provider: '豆包',\n};\nexport const DOUBAO_SEED_1_6_LATEST: ModelConfig = { \n id: 'doubao-seed-1-6-251015', \n displayName: '豆包 Seed 1.6 Latest',\n provider: '豆包',\n};\nexport const DOUBAO_SEED_1_6_FLASH: ModelConfig = { \n id: 'doubao-seed-1-6-flash-250617', \n displayName: '豆包 Seed 1.6 Flash',\n provider: '豆包',\n};\n\n// ==================== DeepSeek 模型 (ARK) ====================\nexport const DEEPSEEK_V3: ModelConfig = { \n id: 'deepseek-v3-2-251201', \n displayName: 'DeepSeek V3.2',\n // 展示层显式标注:该模型通过 ARK(火山/豆包平台)托管接入\n provider: 'DeepSeek(ARK)',\n};\n\n// ==================== 通义千问模型 ====================\nexport const QWEN_MAX: ModelConfig = { id: 'qwen-max', displayName: '通义千问 Max', provider: '通义千问' };\nexport const QWEN_MAX_LATEST: ModelConfig = { id: 'qwen-max-latest', displayName: '通义千问 Max Latest', provider: '通义千问' };\nexport const QWEN_PLUS: ModelConfig = { id: 'qwen-plus', displayName: '通义千问 Plus', provider: '通义千问' };\nexport const QWEN_PLUS_LATEST: ModelConfig = { id: 'qwen-plus-latest', displayName: '通义千问 Plus Latest', provider: '通义千问' };\nexport const QWEN_TURBO: ModelConfig = { id: 'qwen-turbo', displayName: '通义千问 Turbo', provider: '通义千问' };\nexport const QWEN_TURBO_LATEST: ModelConfig = { id: 'qwen-turbo-latest', displayName: '通义千问 Turbo Latest', provider: '通义千问' };\nexport const QWEN3_235B: ModelConfig = { id: 'qwen3-235b-a22b', displayName: 'Qwen3 235B', provider: '通义千问' };\nexport const QWEN3_MAX_PREVIEW: ModelConfig = { \n id: 'qwen3-max-preview', \n displayName: '通义千问 3 Max',\n provider: '通义千问',\n};\n\n// ==================== Gemini 模型 ====================\nexport const GEMINI_2_5_FLASH: ModelConfig = { id: 'gemini-2.5-flash-preview-05-20', displayName: 'Gemini 2.5 Flash', provider: 'Gemini' };\nexport const GEMINI_2_5_PRO: ModelConfig = { id: 'gemini-2.5-pro-preview-05-06', displayName: 'Gemini 2.5 Pro', provider: 'Gemini' };\nexport const GEMINI_2_0_FLASH: ModelConfig = { id: 'gemini-2.0-flash', displayName: 'Gemini 2.0 Flash', provider: 'Gemini' };\nexport const GEMINI_2_0_FLASH_LITE: ModelConfig = { id: 'gemini-2.0-flash-lite', displayName: 'Gemini 2.0 Flash Lite', provider: 'Gemini' };\nexport const GEMINI_3_PRO: ModelConfig = { \n id: 'gemini-3-pro-preview', \n displayName: 'Gemini 3 Pro',\n provider: 'Gemini',\n};\n// 图片模型(仅 id)\nexport const GEMINI_IMAGE_MODEL = 'gemini-2.0-flash';\nexport const GEMINI_IMAGE_GEN_MODEL = 'gemini-3-pro-image-preview';\n\n// ==================== OpenRouter 模型 ====================\nexport const OR_GPT_5_1: ModelConfig = { \n id: 'openai/gpt-5.1-codex', \n displayName: 'GPT-5.1 Codex', \n isOpenRouter: true,\n provider: 'OpenAI',\n};\nexport const CLAUDE_OPUS_4_5: ModelConfig = { \n id: 'anthropic/claude-opus-4.5', \n displayName: 'Claude Opus 4.5', \n provider: 'Anthropic',\n};\n\n// ==================== 前端显示的模型列表 ====================\nexport const DISPLAY_MODELS: ModelConfig[] = [\n // 原生模型\n DOUBAO_SEED_1_6,\n DEEPSEEK_V3,\n QWEN3_MAX_PREVIEW,\n GEMINI_3_PRO,\n // OpenRouter 模型\n OR_GPT_5_1,\n // Vercel AI SDK 模型\n CLAUDE_OPUS_4_5,\n];\n\n// ==================== 默认配置 ====================\nexport const DEFAULT_MODEL = DOUBAO_SEED_1_6.id;\nexport const MAX_ITERATIONS = 10;\n\n/** agent 模式提示词 */\nexport const AGENT_MODE_PROMPT = `你是一个专业的 AI 助手。请遵循以下规则:\n- 返回的内容尽量不要使用表情符号(emoji),除非用户要求使用\n- 使用 Markdown 格式组织内容\n- 代码块使用正确的语言标识`;\n\n","/**\n * 模型路由模块\n * \n * 根据模型 ID 查询对应的 Protocol 和 Family 配置\n */\n\nimport { \n getModelEntry, \n getModelFamily,\n type ProtocolId, \n type ModelFamilyConfig,\n type ModelRegistryEntry,\n} from './providers/model-registry';\n\n/** Provider 类型 = Protocol 类型 */\nexport type ProviderType = ProtocolId;\n\n/** 路由结果 */\nexport interface RouteResult {\n /** Protocol 类型 */\n provider: ProviderType;\n /** 是否未注册(使用默认 Provider) */\n isDefault: boolean;\n /** 模型注册信息 */\n registryEntry?: ModelRegistryEntry;\n /** 模型家族配置 */\n familyConfig?: ModelFamilyConfig;\n}\n\n/** 默认 Provider(未注册模型的兜底) */\nconst DEFAULT_PROVIDER: ProviderType = 'ark';\n\n/**\n * 获取模型的 Provider\n */\nexport function routeModelToProvider(model: string): ProviderType {\n return routeModelWithDetails(model).provider;\n}\n\n/**\n * 获取模型的完整路由信息\n */\nexport function routeModelWithDetails(model: string): RouteResult {\n const registryEntry = getModelEntry(model);\n if (registryEntry) {\n return {\n provider: registryEntry.protocol,\n registryEntry,\n familyConfig: getModelFamily(model),\n isDefault: false,\n };\n }\n \n return {\n provider: DEFAULT_PROVIDER,\n isDefault: true\n };\n}\n\n/**\n * 获取默认 Provider\n */\nexport function getDefaultProvider(): ProviderType {\n return DEFAULT_PROVIDER;\n}\n\n/**\n * 检查模型是否属于指定 Provider\n */\nexport function isModelForProvider(model: string, provider: ProviderType): boolean {\n return routeModelToProvider(model) === provider;\n}\n","/**\n * 调试日志工具\n * \n * 用法:\n * - 设置环境变量 AI_CHAT_DEBUG=true 启用调试日志\n * - 设置环境变量 AI_CHAT_DEBUG_FILE=/path/to/log.jsonl 启用文件输出\n * - 或者调用 DebugLogger.enable() / DebugLogger.setLogFile()\n */\n\ntype LogLevel = 'debug' | 'info' | 'warn' | 'error';\n\ninterface LogEntry {\n timestamp: string;\n level: LogLevel;\n module: string;\n message: string;\n data?: unknown;\n}\n\n// 全局状态\nlet debugEnabled = false;\nlet logFilePath: string | null = null;\nlet logBuffer: LogEntry[] = [];\nlet flushTimer: ReturnType<typeof setTimeout> | null = null;\n\n// Node.js fs 模块(懒加载)\nlet fsModule: typeof import('fs') | null = null;\nlet fsLoadAttempted = false;\n\n/**\n * 尝试加载 fs 模块(仅 Node.js 环境)\n */\nfunction getFs(): typeof import('fs') | null {\n if (fsModule !== null) return fsModule;\n if (fsLoadAttempted) return null;\n fsLoadAttempted = true;\n \n try {\n // 尝试多种方式加载 fs 模块\n // 方式1: 检查全局 require(CommonJS 环境)\n if (typeof globalThis.require === 'function') {\n fsModule = globalThis.require('fs');\n return fsModule;\n }\n \n // 方式2: 检查 process.mainModule(旧版 Node.js)\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n const proc = process as any;\n if (typeof proc !== 'undefined' && proc.mainModule?.require) {\n fsModule = proc.mainModule.require('fs');\n return fsModule;\n }\n \n // 方式3: 使用 Function 构造动态 require(绕过打包工具)\n try {\n // eslint-disable-next-line @typescript-eslint/no-implied-eval\n const dynamicRequire = new Function('moduleName', 'return require(moduleName)');\n fsModule = dynamicRequire('fs');\n return fsModule;\n } catch {\n // 忽略\n }\n \n return null;\n } catch {\n return null;\n }\n}\n\n/**\n * 将日志缓冲区写入文件\n */\nfunction flushToFile() {\n if (!logFilePath || logBuffer.length === 0) return;\n \n const fs = getFs();\n if (!fs) return;\n \n try {\n const lines = logBuffer.map(entry => JSON.stringify(entry)).join('\\n') + '\\n';\n fs.appendFileSync(logFilePath, lines, 'utf-8');\n logBuffer = [];\n } catch (err) {\n console.error('[DebugLogger] 写入日志文件失败:', err);\n }\n}\n\n/**\n * 调度日志刷新(防抖)\n */\nfunction scheduleFlush() {\n if (flushTimer) return;\n flushTimer = setTimeout(() => {\n flushTimer = null;\n flushToFile();\n }, 100); // 100ms 后刷新\n}\n\n/**\n * 创建日志条目\n */\nfunction createEntry(level: LogLevel, module: string, message: string, data?: unknown): LogEntry {\n return {\n timestamp: new Date().toISOString(),\n level,\n module,\n message,\n ...(data !== undefined ? { data } : {}),\n };\n}\n\n/**\n * 输出日志\n */\nfunction log(level: LogLevel, module: string, message: string, data?: unknown) {\n if (!debugEnabled) return;\n \n const entry = createEntry(level, module, message, data);\n \n // 控制台输出\n const prefix = `[${entry.timestamp.slice(11, 23)}] [${module}]`;\n const consoleMethod = level === 'error' ? console.error \n : level === 'warn' ? console.warn \n : console.log;\n \n if (data !== undefined) {\n consoleMethod(`${prefix} ${message}`, typeof data === 'object' ? JSON.stringify(data) : data);\n } else {\n consoleMethod(`${prefix} ${message}`);\n }\n \n // 文件输出\n if (logFilePath) {\n logBuffer.push(entry);\n scheduleFlush();\n }\n}\n\n/**\n * 调试日志工具\n */\nexport const DebugLogger = {\n /**\n * 启用/禁用调试日志\n */\n enable(enabled = true) {\n debugEnabled = enabled;\n },\n \n /**\n * 检查是否启用\n */\n isEnabled() {\n return debugEnabled;\n },\n \n /**\n * 直接设置 fs 模块(用于 Electron 主进程等打包环境)\n */\n setFsModule(fs: typeof import('fs')) {\n fsModule = fs;\n },\n \n /**\n * 设置日志文件路径(仅 Node.js 环境有效)\n * @param path 日志文件路径,null 表示禁用文件输出\n */\n setLogFile(path: string | null) {\n // 先刷新旧日志\n flushToFile();\n logFilePath = path;\n \n // 创建新日志文件(如果指定了路径)\n if (path) {\n const fs = getFs();\n if (fs) {\n try {\n // 写入日志头\n const header = {\n type: 'session_start',\n timestamp: new Date().toISOString(),\n version: '1.0',\n };\n fs.writeFileSync(path, JSON.stringify(header) + '\\n', 'utf-8');\n console.log('[DebugLogger] 日志文件创建成功:', path);\n } catch (err) {\n console.error('[DebugLogger] 创建日志文件失败:', err);\n logFilePath = null;\n }\n } else {\n console.warn('[DebugLogger] 无法加载 fs 模块,文件日志不可用');\n logFilePath = null;\n }\n }\n },\n \n /**\n * 获取日志文件路径\n */\n getLogFile() {\n return logFilePath;\n },\n \n /**\n * 立即刷新日志到文件\n */\n flush() {\n if (flushTimer) {\n clearTimeout(flushTimer);\n flushTimer = null;\n }\n flushToFile();\n },\n \n /**\n * 创建模块专用的 logger\n */\n module(moduleName: string) {\n return {\n debug: (message: string, data?: unknown) => log('debug', moduleName, message, data),\n info: (message: string, data?: unknown) => log('info', moduleName, message, data),\n warn: (message: string, data?: unknown) => log('warn', moduleName, message, data),\n error: (message: string, data?: unknown) => log('error', moduleName, message, data),\n };\n },\n \n // 快捷方法\n debug: (module: string, message: string, data?: unknown) => log('debug', module, message, data),\n info: (module: string, message: string, data?: unknown) => log('info', module, message, data),\n warn: (module: string, message: string, data?: unknown) => log('warn', module, message, data),\n error: (module: string, message: string, data?: unknown) => log('error', module, message, data),\n};\n\n// 从环境变量初始化(Node.js 环境)\ntry {\n if (typeof process !== 'undefined' && process.env) {\n if (process.env.AI_CHAT_DEBUG === 'true') {\n debugEnabled = true;\n }\n if (process.env.AI_CHAT_DEBUG_FILE) {\n DebugLogger.setLogFile(process.env.AI_CHAT_DEBUG_FILE);\n }\n }\n} catch {\n // 浏览器环境,忽略\n}\n\n","/**\n * Chat Orchestrator\n * \n * 统一处理:\n * 1. 工具调用循环 (while iterations < MAX)\n * 2. 消息历史维护 (assistant + tool 消息)\n * 3. 事件发射 (ChatEvent)\n * 4. 错误处理\n * \n * 所有 Provider 通过此类执行,确保行为一致\n */\n\nimport type { ChatEvent } from '../events';\nimport type { ChatMessage, ToolDefinition, SideEffect, ToolResult } from '../types';\nimport type {\n ProviderAdapter,\n StandardMessage,\n StreamChunk,\n ToolCallRequest,\n OrchestratorConfig,\n OrchestratorContext,\n OrchestratorOptions,\n SearchResultItem,\n AutoRunConfig,\n} from './types';\nimport {\n createTextDelta,\n createThinkingStart,\n createThinkingDelta,\n createThinkingEnd,\n createSearchStart,\n createSearchResult,\n createSearchEnd,\n createToolCallStart,\n createToolCallOutput,\n createToolCallResult,\n createDone,\n createAbort,\n createApiError,\n} from '../events';\nimport type { ToolApprovalRequestEvent } from '../events';\nimport { DebugLogger } from '../utils';\n\n// 创建模块专用 logger\nconst logger = DebugLogger.module('Orchestrator');\n\nfunction normalizeSearchResults(items: SearchResultItem[]): SearchResultItem[] {\n const byUrl = new Map<string, SearchResultItem>();\n for (const it of items) {\n const url = String(it?.url ?? '').trim();\n if (!url) continue;\n\n const snippet = String(it?.snippet ?? '').trim();\n let title = String(it?.title ?? '').trim();\n if (!title) {\n try {\n title = new URL(url).hostname;\n } catch {\n title = url;\n }\n }\n\n const prev = byUrl.get(url);\n if (!prev) {\n byUrl.set(url, { title, url, snippet });\n continue;\n }\n if (!prev.snippet && snippet) prev.snippet = snippet;\n if (!prev.title && title) prev.title = title;\n }\n return Array.from(byUrl.values());\n}\n\n/** 默认最大迭代次数 */\nconst DEFAULT_MAX_ITERATIONS = 10;\n\n/**\n * Chat Orchestrator\n * \n * 核心职责:统一处理工具调用循环,所有 Provider 共享相同的逻辑\n */\nexport class ChatOrchestrator {\n private config: OrchestratorConfig;\n \n constructor(config: OrchestratorConfig) {\n this.config = {\n maxIterations: DEFAULT_MAX_ITERATIONS,\n ...config,\n };\n }\n\n /**\n * 执行聊天\n * \n * @param adapter Provider 适配器\n * @param message 用户消息\n * @param context Orchestrator 上下文\n * @param options 选项\n */\n async *chat(\n adapter: ProviderAdapter,\n message: string,\n context: OrchestratorContext,\n options: OrchestratorOptions\n ): AsyncGenerator<ChatEvent> {\n const startedAt = Date.now();\n const maxIterations = this.config.maxIterations ?? DEFAULT_MAX_ITERATIONS;\n \n // 构建标准化消息列表\n const messages = this.buildMessages(context, message);\n \n // 全局状态\n let iterations = 0;\n let finalText = '';\n let searchResults: SearchResultItem[] = [];\n let searchStartedAt = 0;\n let searchStarted = false;\n let searchEnded = false;\n \n // 工具调用循环\n while (iterations < maxIterations) {\n if (context.signal.aborted) {\n yield createAbort('请求已取消');\n return;\n }\n \n iterations++;\n logger.info(`======= 第 ${iterations} 轮开始 =======`);\n \n // ========== 每轮独立的状态 ==========\n let thinkingText = '';\n let thinkingStartedAt = 0;\n let thinkingStarted = false;\n let thinkingComplete = false;\n \n // ========== 调试日志:chunk 计数 ==========\n const chunkCounts: Record<string, number> = {};\n let textStartedInOrchestrator = false;\n const logChunk = (type: string) => {\n chunkCounts[type] = (chunkCounts[type] || 0) + 1;\n };\n // ==========================================\n \n try {\n const pendingToolCalls: ToolCallRequest[] = [];\n let hasToolCalls = false;\n \n // 是否启用思考(每轮都可以启用)\n // 强制转为 boolean,避免上层传入 'false' / 1 等导致逻辑误判\n const enableThinkingThisRound = options.enableThinking === true;\n // Web Search:允许在多轮中发生(模型可能在后续轮次再次检索)\n const enableSearchThisRound = options.enableSearch === true;\n \n logger.debug('调用 adapter.streamOnce', { enableThinking: enableThinkingThisRound, enableSearch: enableSearchThisRound });\n \n const stream = adapter.streamOnce(messages, context.tools, {\n model: options.model,\n enableThinking: enableThinkingThisRound,\n enableSearch: enableSearchThisRound,\n signal: context.signal,\n });\n \n for await (const chunk of stream) {\n logChunk(chunk.type);\n switch (chunk.type) {\n case 'text':\n if (chunk.text) {\n // 首次 text,记录状态\n if (!textStartedInOrchestrator) {\n textStartedInOrchestrator = true;\n logger.debug('首次收到 text', { thinkingStarted, thinkingComplete });\n }\n // 如果还在思考中,先结束思考(仅在启用 thinking 时)\n if (enableThinkingThisRound && thinkingStarted && !thinkingComplete) {\n logger.debug('text 触发 thinking_end');\n thinkingComplete = true;\n yield createThinkingEnd(thinkingStartedAt);\n }\n finalText += chunk.text;\n yield createTextDelta(chunk.text);\n }\n break;\n \n case 'thinking':\n // Gate:未启用 thinking 时,忽略所有 thinking 输出(用于统一 ask/normal 体验)\n if (!enableThinkingThisRound) break;\n if (chunk.thinking) {\n if (thinkingComplete) {\n // ⚠️ 异常:thinking_done 后还收到 thinking\n logger.warn('⚠️ thinkingComplete=true 但收到 thinking', chunk.thinking.slice(0, 30));\n logger.warn('当前状态', { textStarted: textStartedInOrchestrator, chunkCounts });\n } else if (textStartedInOrchestrator) {\n // ⚠️ 异常:text 开始后还收到 thinking\n logger.warn('⚠️ text 开始后收到 thinking', chunk.thinking.slice(0, 30));\n } else {\n // 兼容:部分 provider 的第一段 thinking 可能以换行开头(UI 使用 pre-wrap 会显示成“顶部空一行”)\n // 只在“第一段 thinking”做一次性处理,避免破坏中间格式\n let delta = chunk.thinking;\n if (!thinkingStarted) {\n delta = delta.replace(/^(?:\\r?\\n)+/, '');\n if (!delta) break; // 第一段只有换行:等待后续真正内容再开始\n }\n\n // 正常处理\n if (!thinkingStarted) {\n thinkingStarted = true;\n thinkingStartedAt = Date.now();\n logger.debug('发送 thinking_start');\n yield createThinkingStart();\n }\n thinkingText += delta;\n yield createThinkingDelta(delta);\n }\n }\n break;\n \n case 'thinking_done':\n // Gate:未启用 thinking 时,忽略 thinking_done\n if (!enableThinkingThisRound) break;\n logger.info('收到 thinking_done', { thinkingStarted, thinkingComplete });\n if (thinkingStarted && !thinkingComplete) {\n thinkingComplete = true;\n logger.debug('发送 thinking_end');\n yield createThinkingEnd(thinkingStartedAt);\n } else if (!thinkingStarted) {\n logger.warn('⚠️ 收到 thinking_done 但 thinkingStarted=false');\n }\n break;\n \n case 'tool_call':\n if (chunk.toolCall) {\n // Gate:如果当前没有任何可用工具定义,忽略模型产生的工具调用(避免 ask 模式误入工具循环)\n if (!context.tools || context.tools.length === 0) {\n logger.warn('收到 tool_call 但当前未注入工具,已忽略', { toolName: chunk.toolCall.name });\n break;\n }\n pendingToolCalls.push(chunk.toolCall);\n hasToolCalls = true;\n }\n break;\n \n case 'search_result':\n // Gate:未启用搜索时,忽略 search_result\n if (!enableSearchThisRound) break;\n if (chunk.searchResults) {\n // 首次收到搜索结果时,发送 search_start 事件\n if (!searchStarted) {\n searchStarted = true;\n searchStartedAt = Date.now();\n yield createSearchStart(message);\n }\n searchResults = normalizeSearchResults(chunk.searchResults);\n yield createSearchResult(searchResults, searchStartedAt);\n }\n break;\n \n case 'done':\n logger.info('收到 done', { finishReason: chunk.finishReason });\n logger.info(`第 ${iterations} 轮 chunk 统计`, chunkCounts);\n if (chunk.finishReason === 'tool_calls') {\n hasToolCalls = true;\n }\n break;\n \n case 'error':\n logger.error('收到 error', chunk.error);\n yield createApiError(chunk.error ?? '未知错误');\n return;\n }\n }\n \n logger.info(`第 ${iterations} 轮 for-await 循环结束`);\n logger.debug('状态', { thinkingStarted, thinkingComplete });\n \n // 确保思考状态完成(仅在启用 thinking 时)\n if (enableThinkingThisRound && thinkingStarted && !thinkingComplete) {\n logger.debug('补发 thinking_end');\n thinkingComplete = true;\n yield createThinkingEnd(thinkingStartedAt);\n }\n \n // 处理工具调用\n if (hasToolCalls && pendingToolCalls.length > 0) {\n // 1. 添加 assistant 消息(包含 tool_calls)到消息历史\n const assistantMessage: StandardMessage = {\n role: 'assistant',\n content: finalText,\n toolCalls: pendingToolCalls,\n };\n messages.push(assistantMessage);\n \n // 2. 执行工具并添加 tool 消息\n for (const toolCall of pendingToolCalls) {\n const toolStartedAt = Date.now();\n \n // 解析参数\n let args: Record<string, unknown>;\n try {\n args = JSON.parse(toolCall.arguments || '{}');\n } catch {\n // 参数解析失败,添加错误消息\n messages.push({\n role: 'tool',\n content: '参数解析错误',\n toolCallId: toolCall.id,\n });\n continue;\n }\n\n // web_search 参数兜底:\n // OpenRouter 等模型有时会发起空 arguments 的 function_call(arguments: \"\"),导致 query 缺失。\n // 为保证链路可用:当 query 缺失时,默认使用本轮用户消息作为 query。\n if (toolCall.name === 'web_search') {\n const q = typeof args.query === 'string' ? args.query : '';\n if (!q.trim()) {\n args.query = message;\n }\n }\n \n // 获取最新的自动运行配置(优先使用动态回调)\n const autoRunConfig = this.config.getAutoRunConfig \n ? await this.config.getAutoRunConfig()\n : (options.autoRunConfig || this.config.autoRunConfig);\n\n // 手动批准模式:需要用户确认\n logger.debug('检查工具批准', {\n toolName: toolCall.name,\n autoRunConfigMode: autoRunConfig?.mode,\n hasCallback: !!this.config.onToolApprovalRequest,\n });\n if (autoRunConfig?.mode === 'manual' && this.config.onToolApprovalRequest) {\n logger.info('发送工具批准请求', toolCall.name);\n // 发送批准请求事件\n const approvalRequest: ToolApprovalRequestEvent = {\n type: 'tool_approval_request',\n data: {\n id: toolCall.id,\n name: toolCall.name,\n args,\n requestedAt: Date.now(),\n },\n };\n yield approvalRequest;\n\n // 等待用户批准\n const approved = await this.config.onToolApprovalRequest({\n id: toolCall.id,\n name: toolCall.name,\n args,\n });\n\n if (!approved) {\n // 用户跳过执行\n const result = JSON.stringify({ skipped: true, message: '用户跳过了此工具' });\n if (toolCall.name === 'web_search' && enableSearchThisRound) {\n // 用 search_end 表示“跳过搜索”\n if (!searchStarted) {\n searchStarted = true;\n searchStartedAt = Date.now();\n const q = typeof args.query === 'string' ? args.query : message;\n yield createSearchStart(q);\n }\n searchEnded = true;\n yield createSearchEnd(false, searchStartedAt, '用户跳过了 web_search');\n } else {\n yield createToolCallResult(toolCall.id, toolCall.name, result, false, toolStartedAt);\n }\n messages.push({\n role: 'tool',\n content: result,\n toolCallId: toolCall.id,\n toolName: toolCall.name,\n });\n continue;\n }\n }\n\n const isWebSearchTool = toolCall.name === 'web_search';\n // web_search:以 search_* 事件展示(避免同时出现 tool_call 卡片 + search 卡片)\n if (!isWebSearchTool) {\n yield createToolCallStart(toolCall.id, toolCall.name, args);\n } else if (enableSearchThisRound) {\n if (!searchStarted) {\n searchStarted = true;\n searchStartedAt = Date.now();\n const q = typeof args.query === 'string' ? args.query : message;\n yield createSearchStart(q);\n }\n }\n \n // 执行工具\n let result: string;\n let dynamicSideEffects: SideEffect[] | undefined;\n let success = true;\n try {\n // stdout/stderr 流式输出:通过 hooks 推送到事件队列,再在等待工具完成期间持续 yield\n const eventQueue: ChatEvent[] = [];\n let wake: (() => void) | null = null;\n const notify = () => wake?.();\n const pushEvent = (ev: ChatEvent) => {\n eventQueue.push(ev);\n notify();\n };\n\n let toolDone = false;\n let toolValue: string | ToolResult | undefined;\n let toolError: unknown;\n\n const hooks = {\n toolCallId: toolCall.id,\n toolName: toolCall.name,\n onStdout: (chunk: string) => {\n if (chunk) pushEvent(createToolCallOutput(toolCall.id, toolCall.name, 'stdout', chunk));\n },\n onStderr: (chunk: string) => {\n if (chunk) pushEvent(createToolCallOutput(toolCall.id, toolCall.name, 'stderr', chunk));\n },\n };\n\n this.config.executeTool(toolCall.name, args, context.signal, hooks)\n .then((v) => {\n toolValue = v;\n toolDone = true;\n notify();\n })\n .catch((e) => {\n toolError = e;\n toolDone = true;\n notify();\n });\n\n // 在工具执行期间,把 stdout/stderr 事件不断 yield 出去\n while (!toolDone || eventQueue.length > 0) {\n while (eventQueue.length > 0) {\n const ev = eventQueue.shift();\n if (ev) yield ev;\n }\n if (toolDone) break;\n await new Promise<void>((r) => (wake = r));\n wake = null;\n }\n\n if (toolError) throw toolError;\n const executeResult = toolValue as string | ToolResult;\n // 处理返回值:可能是字符串或 ToolResult\n if (typeof executeResult === 'string') {\n result = executeResult;\n } else {\n result = executeResult.result;\n dynamicSideEffects = executeResult.sideEffects;\n }\n } catch (error) {\n success = false;\n const errorMessage = error instanceof Error ? error.message : String(error);\n result = `错误: ${errorMessage}`;\n }\n \n // 获取工具定义:用于副作用和结果类型\n const tool = this.config.tools?.get(toolCall.name);\n const sideEffects = dynamicSideEffects ?? tool?.sideEffects;\n // 成功时传递 resultType,用于前端生成对应类型的 Part\n const resultType = success ? tool?.resultType : undefined;\n \n // 发射工具结果事件(包含副作用信息和结果类型)\n if (!isWebSearchTool) {\n yield createToolCallResult(toolCall.id, toolCall.name, result, success, toolStartedAt, undefined, sideEffects, resultType);\n } else if (enableSearchThisRound) {\n // web_search:解析工具结果并产出 search_result / search_end\n let parsedResults: SearchResultItem[] = [];\n let parseError: string | undefined;\n try {\n const obj = JSON.parse(result || '{}') as any;\n const arr = Array.isArray(obj?.results) ? obj.results : [];\n parsedResults = arr\n .map((r: any) => ({\n title: typeof r?.title === 'string' ? r.title : '',\n url: typeof r?.url === 'string' ? r.url : '',\n snippet: typeof r?.snippet === 'string' ? r.snippet : '',\n }))\n .filter((r: SearchResultItem) => !!r.url);\n if (typeof obj?.error === 'string' && obj.error) {\n parseError = obj.error;\n success = false;\n }\n } catch {\n parseError = 'web_search 返回结果解析失败';\n success = false;\n }\n\n if (parsedResults.length > 0) {\n searchResults = normalizeSearchResults(parsedResults);\n yield createSearchResult(searchResults, searchStartedAt);\n }\n searchEnded = true;\n yield createSearchEnd(success, searchStartedAt, parseError);\n }\n \n // 添加 tool 消息到历史\n messages.push({\n role: 'tool',\n content: result,\n toolCallId: toolCall.id,\n toolName: toolCall.name, // Gemini 需要工具名称\n });\n \n // 工具执行后检查取消信号:如果用户在工具执行过程中取消,立即终止\n if (context.signal.aborted) {\n yield createAbort('请求已取消');\n return;\n }\n }\n \n // 清空累积文本,进入下一轮\n finalText = '';\n continue;\n }\n \n // 没有工具调用,响应完成\n break;\n \n } catch (error) {\n if (context.signal.aborted) {\n // 取消请求,前端负责保存消息到数据库\n yield createAbort('请求已取消');\n } else {\n yield createApiError(error instanceof Error ? error.message : String(error));\n }\n return;\n }\n }\n \n // 确保搜索状态完成\n if (searchStarted && !searchEnded) {\n yield createSearchEnd(true, searchStartedAt);\n }\n \n // 注意:不再更新 context.history\n // 无状态架构:前端负责保存消息到数据库,下次请求时重新构建历史\n \n // 发射完成事件\n const duration = Date.now() - startedAt;\n yield createDone(finalText, undefined, duration);\n }\n \n /**\n * 构建标准化消息列表\n */\n private buildMessages(context: OrchestratorContext, message: string): StandardMessage[] {\n const messages: StandardMessage[] = [];\n \n // 系统提示\n if (context.systemPrompt) {\n messages.push({\n role: 'system',\n content: context.systemPrompt,\n });\n }\n \n // 历史消息\n for (const msg of context.history) {\n const standardMsg: StandardMessage = {\n role: msg.role as 'user' | 'assistant',\n content: msg.content,\n };\n \n // 处理工具调用\n if (msg.tool_calls) {\n standardMsg.toolCalls = msg.tool_calls.map(tc => ({\n id: tc.id,\n name: tc.function.name,\n arguments: tc.function.arguments,\n // 保留 thought_signature(Gemini 模型需要)\n thought_signature: tc.thought_signature,\n }));\n }\n \n messages.push(standardMsg);\n }\n \n // 当前用户消息\n messages.push({\n role: 'user',\n content: message,\n images: context.images,\n });\n \n return messages;\n }\n}\n\n/**\n * 创建 Orchestrator 实例\n */\nexport function createOrchestrator(config: OrchestratorConfig): ChatOrchestrator {\n return new ChatOrchestrator(config);\n}\n","/**\n * ARK Protocol(火山引擎 Responses API)\n * \n * 只负责:\n * - HTTP 请求发送\n * - SSE 流解析\n * - 原始事件产出\n */\n\nimport type {\n Protocol,\n ProtocolConfig,\n ProtocolMessage,\n ProtocolToolDefinition,\n ProtocolRequestOptions,\n RawEvent,\n RawToolCall,\n RawSearchResult,\n} from './types';\nimport { DEFAULT_ARK_URL } from '../../constants';\nimport { DebugLogger } from '../../utils';\n\nconst logger = DebugLogger.module('ArkProtocol');\n\n/**\n * ARK Protocol 实现\n */\nexport class ArkProtocol implements Protocol {\n readonly name = 'ark';\n \n private apiKey: string;\n private apiUrl: string;\n \n constructor(config: ProtocolConfig) {\n this.apiKey = config.apiKey;\n this.apiUrl = config.apiUrl ?? DEFAULT_ARK_URL;\n }\n \n /**\n * 发送请求并返回原始事件流\n */\n async *stream(\n messages: ProtocolMessage[],\n tools: ProtocolToolDefinition[],\n options: ProtocolRequestOptions\n ): AsyncGenerator<RawEvent> {\n // 构建请求体\n const requestBody = this.buildRequestBody(messages, tools, options);\n \n logger.debug('发送 ARK 请求', {\n url: `${this.apiUrl}/responses`,\n model: options.model,\n enableSearch: options.enableSearch,\n enableThinking: options.enableThinking,\n toolsCount: tools.length,\n });\n \n // 发送请求\n const response = await fetch(`${this.apiUrl}/responses`, {\n method: 'POST',\n headers: {\n 'Authorization': `Bearer ${this.apiKey}`,\n 'Content-Type': 'application/json',\n },\n body: JSON.stringify(requestBody),\n signal: options.signal,\n });\n \n if (!response.ok) {\n const errorText = await response.text();\n logger.error('ARK API 错误', { status: response.status, body: errorText.slice(0, 500) });\n yield { type: 'error', error: `ARK API 错误: ${response.status} - ${errorText}` };\n return;\n }\n \n const reader = response.body?.getReader();\n if (!reader) {\n yield { type: 'error', error: '无法获取响应流' };\n return;\n }\n \n // 解析 SSE 流\n yield* this.parseSSE(reader);\n }\n \n /**\n * 构建请求体\n */\n private buildRequestBody(\n messages: ProtocolMessage[],\n tools: ProtocolToolDefinition[],\n options: ProtocolRequestOptions\n ): Record<string, unknown> {\n const input = this.convertMessages(messages);\n \n const body: Record<string, unknown> = {\n model: options.model,\n stream: true,\n max_output_tokens: options.familyConfig.defaultMaxTokens ?? 32768,\n input,\n };\n \n // 构建工具列表\n const apiTools: unknown[] = [];\n \n // 添加联网搜索工具\n if (options.enableSearch) {\n apiTools.push({ type: 'web_search', max_keyword: 5, limit: 20 });\n }\n \n // 添加函数调用工具\n for (const t of tools) {\n apiTools.push({\n type: 'function',\n name: t.name,\n description: t.description,\n parameters: t.parameters,\n });\n }\n \n if (apiTools.length > 0) {\n body.tools = apiTools;\n }\n \n // 启用 thinking\n if (options.enableThinking) {\n body.thinking = { type: 'enabled' };\n }\n \n return body;\n }\n \n /**\n * 转换消息格式\n */\n private convertMessages(messages: ProtocolMessage[]): unknown[] {\n const input: unknown[] = [];\n \n for (const msg of messages) {\n switch (msg.role) {\n case 'system':\n input.push({ role: 'system', content: msg.content });\n break;\n \n case 'user': {\n // ARK API 要求 input_text 必须有内容,当只有图片时提供默认提示\n const textContent = msg.content || (msg.images?.length ? '请分析这张图片' : '');\n const content: unknown[] = [{ type: 'input_text', text: textContent }];\n if (msg.images?.length) {\n for (const img of msg.images) {\n content.push({\n type: 'input_image',\n image_url: img.startsWith('data:') ? img : `data:image/jpeg;base64,${img}`,\n });\n }\n }\n input.push({ role: 'user', content });\n break;\n }\n \n case 'assistant':\n if (msg.toolCalls?.length) {\n for (const tc of msg.toolCalls) {\n input.push({\n type: 'function_call',\n call_id: tc.id,\n name: tc.name,\n arguments: tc.arguments,\n });\n }\n } else {\n input.push({\n role: 'developer',\n content: `[上一轮AI回复]: ${msg.content}`,\n });\n }\n break;\n \n case 'tool':\n input.push({\n type: 'function_call_output',\n call_id: msg.toolCallId,\n output: msg.content,\n });\n break;\n }\n }\n \n return input;\n }\n \n /**\n * 解析 SSE 流\n */\n private async *parseSSE(reader: ReadableStreamDefaultReader<Uint8Array>): AsyncGenerator<RawEvent> {\n const decoder = new TextDecoder();\n let buffer = '';\n const pendingToolCalls = new Map<string, RawToolCall>();\n let currentFunctionCallId: string | null = null;\n const searchResults: RawSearchResult[] = [];\n let streamDone = false;\n let thinkingDone = false;\n let textStarted = false;\n \n while (true) {\n const { done, value } = await reader.read();\n if (done) break;\n \n buffer += decoder.decode(value, { stream: true });\n const lines = buffer.split('\\n');\n buffer = lines.pop() || '';\n \n for (const line of lines) {\n if (streamDone) continue;\n if (!line.startsWith('data:')) continue;\n \n const data = line.slice(5).trim();\n if (data === '[DONE]') {\n streamDone = true;\n \n // 输出工具调用\n if (pendingToolCalls.size > 0) {\n for (const tc of pendingToolCalls.values()) {\n yield { type: 'tool_call_done', toolCall: tc };\n }\n yield { type: 'done', finishReason: 'tool_calls' };\n } else {\n yield { type: 'done', finishReason: 'stop' };\n }\n return;\n }\n \n try {\n const event = JSON.parse(data);\n \n switch (event.type) {\n case 'response.output_item.added': {\n const item = event.item;\n if (item?.type === 'function_call' && item.call_id) {\n currentFunctionCallId = item.call_id;\n pendingToolCalls.set(item.call_id, {\n id: item.call_id,\n name: item.name || '',\n arguments: item.arguments || '',\n });\n yield { type: 'tool_call_start', toolCall: { id: item.call_id, name: item.name || '' } };\n }\n break;\n }\n \n case 'response.function_call_arguments.delta': {\n if (currentFunctionCallId) {\n const call = pendingToolCalls.get(currentFunctionCallId);\n if (call) {\n call.arguments += event.delta || '';\n yield { type: 'tool_call_delta', toolCall: { id: currentFunctionCallId, arguments: event.delta || '' } };\n }\n }\n break;\n }\n \n case 'response.function_call_arguments.done':\n case 'response.output_item.done': {\n const item = event.item;\n if (item?.type === 'function_call' && item.call_id) {\n const existing = pendingToolCalls.get(item.call_id);\n pendingToolCalls.set(item.call_id, {\n id: item.call_id,\n name: item.name || existing?.name || '',\n arguments: item.arguments || existing?.arguments || '{}',\n });\n }\n break;\n }\n \n case 'response.output_text.annotation.added': {\n const annotation = event.annotation;\n if (annotation?.url) {\n const exists = searchResults.some(r => r.url === annotation.url);\n if (!exists) {\n searchResults.push({\n title: annotation.title || annotation.text || '',\n url: annotation.url,\n snippet: annotation.summary || annotation.snippet || '',\n });\n yield { type: 'search_result', searchResults: [...searchResults] };\n }\n }\n break;\n }\n \n case 'response.output_text.delta':\n if (event.delta) {\n // 首次收到 text 时,结束 thinking\n if (!textStarted) {\n textStarted = true;\n if (!thinkingDone) {\n thinkingDone = true;\n yield { type: 'thinking_done' };\n }\n }\n yield { type: 'text_delta', delta: event.delta };\n }\n break;\n \n case 'response.reasoning_summary_text.delta':\n if (event.delta && !thinkingDone) {\n yield { type: 'thinking_delta', delta: event.delta };\n }\n break;\n }\n } catch {\n // 忽略解析错误\n }\n }\n }\n \n // 兜底处理\n if (!streamDone) {\n if (pendingToolCalls.size > 0) {\n for (const tc of pendingToolCalls.values()) {\n yield { type: 'tool_call_done', toolCall: tc };\n }\n yield { type: 'done', finishReason: 'tool_calls' };\n } else {\n yield { type: 'done', finishReason: 'stop' };\n }\n }\n }\n}\n\n/**\n * 创建 ARK Protocol\n */\nexport function createArkProtocol(config: ProtocolConfig): ArkProtocol {\n return new ArkProtocol(config);\n}\n\n","/**\n * DeepSeek Protocol(通过火山引擎 ARK API 访问)\n * \n * 特点:\n * - 支持 reasoning(深度思考)\n * - 支持 web_search 原生搜索\n * - 与豆包共用 ARK API,但行为可能有差异\n */\n\nimport type {\n Protocol,\n ProtocolConfig,\n ProtocolMessage,\n ProtocolToolDefinition,\n ProtocolRequestOptions,\n RawEvent,\n RawToolCall,\n RawSearchResult,\n} from './types';\nimport { DEFAULT_ARK_URL } from '../../constants';\nimport { DebugLogger } from '../../utils';\n\nconst logger = DebugLogger.module('DeepSeekProtocol');\n\n/**\n * DeepSeek Protocol 实现\n */\nexport class DeepSeekProtocol implements Protocol {\n readonly name = 'deepseek';\n \n private apiKey: string;\n private apiUrl: string;\n \n constructor(config: ProtocolConfig) {\n this.apiKey = config.apiKey;\n this.apiUrl = config.apiUrl ?? DEFAULT_ARK_URL;\n }\n \n async *stream(\n messages: ProtocolMessage[],\n tools: ProtocolToolDefinition[],\n options: ProtocolRequestOptions\n ): AsyncGenerator<RawEvent> {\n const requestBody = this.buildRequestBody(messages, tools, options);\n const url = `${this.apiUrl}/responses`;\n \n logger.debug('发送 DeepSeek 请求', {\n url,\n model: options.model,\n enableSearch: options.enableSearch,\n enableThinking: options.enableThinking,\n toolsCount: tools.length,\n });\n \n const response = await fetch(url, {\n method: 'POST',\n headers: {\n 'Authorization': `Bearer ${this.apiKey}`,\n 'Content-Type': 'application/json',\n },\n body: JSON.stringify(requestBody),\n signal: options.signal,\n });\n \n if (!response.ok) {\n const errorText = await response.text();\n logger.error('DeepSeek API 错误', { status: response.status, body: errorText.slice(0, 500) });\n yield { type: 'error', error: `DeepSeek API 错误: ${response.status} - ${errorText}` };\n return;\n }\n \n const reader = response.body?.getReader();\n if (!reader) {\n yield { type: 'error', error: '无法获取响应流' };\n return;\n }\n \n yield* this.parseSSE(reader, options.enableThinking);\n }\n \n /**\n * 构建请求体(DeepSeek 专用)\n */\n private buildRequestBody(\n messages: ProtocolMessage[],\n tools: ProtocolToolDefinition[],\n options: ProtocolRequestOptions\n ): Record<string, unknown> {\n const input = this.convertMessages(messages);\n \n const body: Record<string, unknown> = {\n model: options.model,\n stream: true,\n max_output_tokens: options.familyConfig.defaultMaxTokens ?? 32768,\n input,\n };\n \n // 构建工具列表\n const apiTools: unknown[] = [];\n \n // DeepSeek 支持 web_search\n if (options.enableSearch) {\n apiTools.push({ type: 'web_search', max_keyword: 5, limit: 20 });\n }\n \n // 添加函数调用工具\n for (const t of tools) {\n apiTools.push({\n type: 'function',\n name: t.name,\n description: t.description,\n parameters: t.parameters,\n });\n }\n \n if (apiTools.length > 0) {\n body.tools = apiTools;\n }\n \n // DeepSeek 启用 thinking(深度思考模式)\n if (options.enableThinking) {\n body.thinking = { type: 'enabled' };\n }\n \n return body;\n }\n \n private convertMessages(messages: ProtocolMessage[]): unknown[] {\n const input: unknown[] = [];\n \n for (const msg of messages) {\n switch (msg.role) {\n case 'system':\n input.push({ role: 'system', content: msg.content });\n break;\n \n case 'user': {\n // 当只有图片没有文字时提供默认提示\n const textContent = msg.content || (msg.images?.length ? '请分析这张图片' : '');\n const content: unknown[] = [{ type: 'input_text', text: textContent }];\n if (msg.images?.length) {\n for (const img of msg.images) {\n content.push({\n type: 'input_image',\n image_url: img.startsWith('data:') ? img : `data:image/jpeg;base64,${img}`,\n });\n }\n }\n input.push({ role: 'user', content });\n break;\n }\n \n case 'assistant':\n if (msg.toolCalls?.length) {\n for (const tc of msg.toolCalls) {\n input.push({\n type: 'function_call',\n call_id: tc.id,\n name: tc.name,\n arguments: tc.arguments,\n });\n }\n } else {\n input.push({\n role: 'developer',\n content: `[上一轮AI回复]: ${msg.content}`,\n });\n }\n break;\n \n case 'tool':\n input.push({\n type: 'function_call_output',\n call_id: msg.toolCallId,\n output: msg.content,\n });\n break;\n }\n }\n \n return input;\n }\n \n /**\n * 解析 SSE 流(DeepSeek 专用)\n */\n private async *parseSSE(\n reader: ReadableStreamDefaultReader<Uint8Array>,\n enableThinking: boolean\n ): AsyncGenerator<RawEvent> {\n const decoder = new TextDecoder();\n let buffer = '';\n const pendingToolCalls = new Map<string, RawToolCall>();\n let currentFunctionCallId: string | null = null;\n const searchResults: RawSearchResult[] = [];\n let streamDone = false;\n let thinkingDone = false;\n let textStarted = false;\n \n while (true) {\n const { done, value } = await reader.read();\n if (done) break;\n \n buffer += decoder.decode(value, { stream: true });\n const lines = buffer.split('\\n');\n buffer = lines.pop() || '';\n \n for (const line of lines) {\n if (streamDone) continue;\n if (!line.startsWith('data:')) continue;\n \n const data = line.slice(5).trim();\n if (data === '[DONE]') {\n streamDone = true;\n \n if (pendingToolCalls.size > 0) {\n for (const tc of pendingToolCalls.values()) {\n yield { type: 'tool_call_done', toolCall: tc };\n }\n yield { type: 'done', finishReason: 'tool_calls' };\n } else {\n yield { type: 'done', finishReason: 'stop' };\n }\n return;\n }\n \n try {\n const event = JSON.parse(data);\n \n switch (event.type) {\n case 'response.output_item.added': {\n const item = event.item;\n if (item?.type === 'function_call' && item.call_id) {\n currentFunctionCallId = item.call_id;\n pendingToolCalls.set(item.call_id, {\n id: item.call_id,\n name: item.name || '',\n arguments: item.arguments || '',\n });\n yield { type: 'tool_call_start', toolCall: { id: item.call_id, name: item.name || '' } };\n }\n break;\n }\n \n case 'response.function_call_arguments.delta': {\n if (currentFunctionCallId) {\n const call = pendingToolCalls.get(currentFunctionCallId);\n if (call) {\n call.arguments += event.delta || '';\n yield { type: 'tool_call_delta', toolCall: { id: currentFunctionCallId, arguments: event.delta || '' } };\n }\n }\n break;\n }\n \n case 'response.function_call_arguments.done':\n case 'response.output_item.done': {\n const item = event.item;\n if (item?.type === 'function_call' && item.call_id) {\n const existing = pendingToolCalls.get(item.call_id);\n pendingToolCalls.set(item.call_id, {\n id: item.call_id,\n name: item.name || existing?.name || '',\n arguments: item.arguments || existing?.arguments || '{}',\n });\n }\n break;\n }\n \n case 'response.output_text.annotation.added': {\n const annotation = event.annotation;\n if (annotation?.url) {\n const exists = searchResults.some(r => r.url === annotation.url);\n if (!exists) {\n searchResults.push({\n title: annotation.title || annotation.text || '',\n url: annotation.url,\n snippet: annotation.summary || annotation.snippet || '',\n });\n yield { type: 'search_result', searchResults: [...searchResults] };\n }\n }\n break;\n }\n \n case 'response.output_text.delta':\n if (event.delta) {\n if (!textStarted) {\n textStarted = true;\n if (enableThinking && !thinkingDone) {\n thinkingDone = true;\n yield { type: 'thinking_done' };\n }\n }\n yield { type: 'text_delta', delta: event.delta };\n }\n break;\n \n // DeepSeek 支持 reasoning(深度思考)\n case 'response.reasoning_summary_text.delta':\n if (enableThinking && event.delta && !thinkingDone) {\n yield { type: 'thinking_delta', delta: event.delta };\n }\n break;\n }\n } catch {\n // 忽略解析错误\n }\n }\n }\n \n // 兜底\n if (!streamDone) {\n if (pendingToolCalls.size > 0) {\n for (const tc of pendingToolCalls.values()) {\n yield { type: 'tool_call_done', toolCall: tc };\n }\n yield { type: 'done', finishReason: 'tool_calls' };\n } else {\n yield { type: 'done', finishReason: 'stop' };\n }\n }\n }\n}\n\nexport function createDeepSeekProtocol(config: ProtocolConfig): DeepSeekProtocol {\n return new DeepSeekProtocol(config);\n}\n\n","/**\n * Qwen Protocol(通义千问 OpenAI 兼容模式 API)\n * \n * 使用 OpenAI 兼容端点以支持工具调用:\n * https://dashscope.aliyuncs.com/compatible-mode/v1/chat/completions\n */\n\nimport type {\n Protocol,\n ProtocolConfig,\n ProtocolMessage,\n ProtocolToolDefinition,\n ProtocolRequestOptions,\n RawEvent,\n RawToolCall,\n} from './types';\nimport { DebugLogger } from '../../utils';\n\nconst logger = DebugLogger.module('QwenProtocol');\n\n// OpenAI 兼容模式端点\nconst DEFAULT_QWEN_COMPATIBLE_URL = 'https://dashscope.aliyuncs.com/compatible-mode/v1';\n\n/**\n * Qwen Protocol 实现(OpenAI 兼容模式)\n */\nexport class QwenProtocol implements Protocol {\n readonly name = 'qwen';\n \n private apiKey: string;\n private apiUrl: string;\n \n constructor(config: ProtocolConfig) {\n this.apiKey = config.apiKey;\n // 使用兼容模式端点\n this.apiUrl = config.apiUrl ?? DEFAULT_QWEN_COMPATIBLE_URL;\n }\n \n /**\n * 发送请求并返回原始事件流\n */\n async *stream(\n messages: ProtocolMessage[],\n tools: ProtocolToolDefinition[],\n options: ProtocolRequestOptions\n ): AsyncGenerator<RawEvent> {\n const requestBody = this.buildRequestBody(messages, tools, options);\n const url = `${this.apiUrl}/chat/completions`;\n \n logger.debug('发送 Qwen 请求(兼容模式)', {\n url,\n model: options.model,\n enableThinking: options.enableThinking,\n toolsCount: tools.length,\n });\n \n const response = await fetch(url, {\n method: 'POST',\n headers: {\n 'Authorization': `Bearer ${this.apiKey}`,\n 'Content-Type': 'application/json',\n },\n body: JSON.stringify(requestBody),\n signal: options.signal,\n });\n \n if (!response.ok) {\n const errorText = await response.text();\n logger.error('Qwen API 错误', { status: response.status, body: errorText.slice(0, 500) });\n yield { type: 'error', error: `Qwen API 错误: ${response.status} - ${errorText}` };\n return;\n }\n \n const reader = response.body?.getReader();\n if (!reader) {\n yield { type: 'error', error: '无法获取响应流' };\n return;\n }\n \n yield* this.parseSSE(reader, options.enableThinking);\n }\n \n /**\n * 构建请求体(OpenAI 格式)\n */\n private buildRequestBody(\n messages: ProtocolMessage[],\n tools: ProtocolToolDefinition[],\n options: ProtocolRequestOptions\n ): Record<string, unknown> {\n const convertedMessages = this.convertMessages(messages);\n \n const body: Record<string, unknown> = {\n model: options.model,\n messages: convertedMessages,\n stream: true,\n };\n \n // 启用 thinking(Qwen 直接在请求体中设置)\n if (options.enableThinking) {\n body.enable_thinking = true;\n body.thinking_budget = 38400;\n }\n \n // 注意:Qwen 搜索通过 Tavily web_search 工具实现(tool_based 策略)\n // 不使用原生 enable_search 参数,保持与其他 Provider 一致\n \n // 添加工具\n if (tools.length > 0) {\n body.tools = tools.map(t => ({\n type: 'function',\n function: {\n name: t.name,\n description: t.description,\n parameters: t.parameters,\n },\n }));\n }\n \n return body;\n }\n \n /**\n * 转换消息格式(OpenAI 标准格式)\n */\n private convertMessages(messages: ProtocolMessage[]): unknown[] {\n const result: unknown[] = [];\n \n for (const msg of messages) {\n switch (msg.role) {\n case 'system':\n result.push({ role: 'system', content: msg.content });\n break;\n \n case 'user': {\n // 当只有图片没有文字时提供默认提示\n const textContent = msg.content || (msg.images?.length ? '请分析这张图片' : '');\n if (msg.images?.length) {\n const content: unknown[] = [{ type: 'text', text: textContent }];\n for (const img of msg.images) {\n content.push({\n type: 'image_url',\n image_url: { url: img.startsWith('data:') ? img : `data:image/jpeg;base64,${img}` },\n });\n }\n result.push({ role: 'user', content });\n } else {\n result.push({ role: 'user', content: textContent });\n }\n break;\n }\n \n case 'assistant':\n if (msg.toolCalls?.length) {\n result.push({\n role: 'assistant',\n content: msg.content || null,\n tool_calls: msg.toolCalls.map(tc => ({\n id: tc.id,\n type: 'function',\n function: { name: tc.name, arguments: tc.arguments },\n })),\n });\n } else {\n result.push({ role: 'assistant', content: msg.content });\n }\n break;\n \n case 'tool':\n result.push({\n role: 'tool',\n tool_call_id: msg.toolCallId,\n content: msg.content,\n });\n break;\n }\n }\n \n return result;\n }\n \n /**\n * 解析 SSE 流(OpenAI 格式)\n */\n private async *parseSSE(\n reader: ReadableStreamDefaultReader<Uint8Array>,\n enableThinking: boolean\n ): AsyncGenerator<RawEvent> {\n const decoder = new TextDecoder();\n let buffer = '';\n const toolCallsMap = new Map<number, RawToolCall>();\n let textStarted = false;\n let thinkingDone = false;\n \n while (true) {\n const { done, value } = await reader.read();\n if (done) break;\n \n buffer += decoder.decode(value, { stream: true });\n const lines = buffer.split('\\n');\n buffer = lines.pop() || '';\n \n for (const line of lines) {\n if (!line.startsWith('data:')) continue;\n \n const data = line.slice(5).trim();\n if (!data || data === '[DONE]') {\n if (data === '[DONE]') {\n // 输出工具调用\n const toolCalls = Array.from(toolCallsMap.values());\n if (toolCalls.length > 0) {\n for (const tc of toolCalls) {\n yield { type: 'tool_call_done', toolCall: tc };\n }\n yield { type: 'done', finishReason: 'tool_calls' };\n } else {\n yield { type: 'done', finishReason: 'stop' };\n }\n return;\n }\n continue;\n }\n \n try {\n const json = JSON.parse(data);\n const choice = json.choices?.[0];\n if (!choice) continue;\n \n const delta = choice.delta;\n if (!delta) continue;\n \n // 处理 reasoning_content(Qwen 的思考输出)\n if (enableThinking && delta.reasoning_content && !thinkingDone) {\n yield { type: 'thinking_delta', delta: delta.reasoning_content };\n }\n \n // 处理文本\n if (delta.content) {\n // 第一次收到 content 时,结束 thinking\n if (enableThinking && !textStarted && !thinkingDone) {\n thinkingDone = true;\n yield { type: 'thinking_done' };\n }\n textStarted = true;\n yield { type: 'text_delta', delta: delta.content };\n }\n \n // 处理工具调用\n if (delta.tool_calls?.length) {\n for (const tc of delta.tool_calls) {\n const index = tc.index ?? 0;\n const existing = toolCallsMap.get(index);\n \n if (existing) {\n // 累积 arguments\n if (tc.function?.arguments) {\n existing.arguments += tc.function.arguments;\n }\n } else {\n // 新工具调用\n toolCallsMap.set(index, {\n id: tc.id || `call_${index}`,\n name: tc.function?.name || '',\n arguments: tc.function?.arguments || '',\n });\n yield { \n type: 'tool_call_start', \n toolCall: { id: tc.id || `call_${index}`, name: tc.function?.name || '' } \n };\n }\n }\n }\n \n // 检查 finish_reason\n if (choice.finish_reason) {\n const toolCalls = Array.from(toolCallsMap.values());\n if (toolCalls.length > 0) {\n for (const tc of toolCalls) {\n yield { type: 'tool_call_done', toolCall: tc };\n }\n yield { type: 'done', finishReason: 'tool_calls' };\n } else {\n yield { type: 'done', finishReason: choice.finish_reason };\n }\n return;\n }\n } catch {\n // 忽略解析错误\n }\n }\n }\n \n // 兜底\n const toolCalls = Array.from(toolCallsMap.values());\n if (toolCalls.length > 0) {\n for (const tc of toolCalls) {\n yield { type: 'tool_call_done', toolCall: tc };\n }\n yield { type: 'done', finishReason: 'tool_calls' };\n } else {\n yield { type: 'done', finishReason: 'stop' };\n }\n }\n}\n\n/**\n * 创建 Qwen Protocol\n */\nexport function createQwenProtocol(config: ProtocolConfig): QwenProtocol {\n return new QwenProtocol(config);\n}\n","/**\n * Gemini Protocol(Google Gemini API)\n * \n * 只负责:\n * - HTTP 请求发送\n * - SSE 流解析\n * - 原始事件产出\n */\n\nimport type {\n Protocol,\n ProtocolConfig,\n ProtocolMessage,\n ProtocolToolDefinition,\n ProtocolRequestOptions,\n RawEvent,\n RawToolCall,\n RawSearchResult,\n} from './types';\nimport { DebugLogger } from '../../utils';\n\nconst logger = DebugLogger.module('GeminiProtocol');\n\nconst DEFAULT_GEMINI_URL = 'https://generativelanguage.googleapis.com/v1beta';\n\n/**\n * Gemini Protocol 实现\n */\nexport class GeminiProtocol implements Protocol {\n readonly name = 'gemini';\n \n private apiKey: string;\n private apiUrl: string;\n \n constructor(config: ProtocolConfig) {\n this.apiKey = config.apiKey;\n this.apiUrl = config.apiUrl ?? DEFAULT_GEMINI_URL;\n }\n \n /**\n * 发送请求并返回原始事件流\n */\n async *stream(\n messages: ProtocolMessage[],\n tools: ProtocolToolDefinition[],\n options: ProtocolRequestOptions\n ): AsyncGenerator<RawEvent> {\n const requestBody = this.buildRequestBody(messages, tools, options);\n const url = `${this.apiUrl}/models/${options.model}:streamGenerateContent?key=${this.apiKey}&alt=sse`;\n \n logger.debug('发送 Gemini 请求', {\n url: url.replace(this.apiKey, '***'),\n model: options.model,\n enableSearch: options.enableSearch,\n enableThinking: options.enableThinking,\n toolsCount: tools.length,\n });\n \n const response = await fetch(url, {\n method: 'POST',\n headers: { 'Content-Type': 'application/json' },\n body: JSON.stringify(requestBody),\n signal: options.signal,\n });\n \n if (!response.ok) {\n const errorText = await response.text();\n logger.error('Gemini API 错误', { status: response.status, body: errorText.slice(0, 500) });\n yield { type: 'error', error: `Gemini API 错误: ${response.status} - ${errorText}` };\n return;\n }\n \n const reader = response.body?.getReader();\n if (!reader) {\n yield { type: 'error', error: '无法获取响应流' };\n return;\n }\n \n yield* this.parseSSE(reader);\n }\n \n /**\n * 构建请求体\n */\n private buildRequestBody(\n messages: ProtocolMessage[],\n tools: ProtocolToolDefinition[],\n options: ProtocolRequestOptions\n ): Record<string, unknown> {\n const { systemInstruction, contents } = this.convertMessages(messages);\n \n const body: Record<string, unknown> = {\n contents,\n generationConfig: {\n maxOutputTokens: options.familyConfig.defaultMaxTokens ?? 65536,\n },\n };\n \n if (systemInstruction) {\n body.systemInstruction = systemInstruction;\n }\n \n // 启用 thinking(需要 includeThoughts 才能输出思考内容)\n if (options.enableThinking) {\n (body.generationConfig as Record<string, unknown>).thinkingConfig = {\n thinkingBudget: 24576,\n includeThoughts: true,\n };\n }\n \n // 构建工具\n // 注意:Gemini 的 googleSearch 工具不能与其他函数调用工具同时使用\n // 因此:如果有其他工具,则通过 web_search 工具(Tavily)进行搜索\n // 如果没有其他工具,可以使用原生 googleSearch\n const geminiTools: unknown[] = [];\n \n // 添加函数调用工具\n if (tools.length > 0) {\n geminiTools.push({\n functionDeclarations: tools.map(t => ({\n name: t.name,\n description: t.description,\n parameters: t.parameters,\n })),\n });\n }\n // 仅在没有其他工具时使用原生 Google Search\n else if (options.enableSearch) {\n geminiTools.push({ googleSearch: {} });\n }\n \n if (geminiTools.length > 0) {\n body.tools = geminiTools;\n }\n \n return body;\n }\n \n /**\n * 转换消息格式\n */\n private convertMessages(messages: ProtocolMessage[]): { \n systemInstruction?: { parts: { text: string }[] };\n contents: unknown[];\n } {\n let systemInstruction: { parts: { text: string }[] } | undefined;\n const contents: unknown[] = [];\n \n for (const msg of messages) {\n switch (msg.role) {\n case 'system':\n systemInstruction = { parts: [{ text: msg.content }] };\n break;\n \n case 'user': {\n // 当只有图片没有文字时提供默认提示\n const textContent = msg.content || (msg.images?.length ? '请分析这张图片' : '');\n const parts: unknown[] = [{ text: textContent }];\n if (msg.images?.length) {\n for (const img of msg.images) {\n if (img.startsWith('data:')) {\n const match = img.match(/^data:([^;]+);base64,(.+)$/);\n if (match) {\n parts.push({\n inlineData: { mimeType: match[1], data: match[2] },\n });\n }\n } else {\n parts.push({\n inlineData: { mimeType: 'image/jpeg', data: img },\n });\n }\n }\n }\n contents.push({ role: 'user', parts });\n break;\n }\n \n case 'assistant':\n if (msg.toolCalls?.length) {\n const parts: unknown[] = [];\n for (const tc of msg.toolCalls) {\n const funcPart: Record<string, unknown> = {\n functionCall: {\n name: tc.name,\n args: JSON.parse(tc.arguments || '{}'),\n },\n };\n // 添加 thoughtSignature(如果有)\n if (tc.thoughtSignature) {\n funcPart.thoughtSignature = tc.thoughtSignature;\n }\n parts.push(funcPart);\n }\n contents.push({ role: 'model', parts });\n } else {\n contents.push({ role: 'model', parts: [{ text: msg.content }] });\n }\n break;\n \n case 'tool':\n contents.push({\n role: 'user',\n parts: [{\n functionResponse: {\n name: msg.toolName || 'unknown',\n response: { result: msg.content },\n },\n }],\n });\n break;\n }\n }\n \n return { systemInstruction, contents };\n }\n \n /**\n * 解析 SSE 流\n */\n private async *parseSSE(reader: ReadableStreamDefaultReader<Uint8Array>): AsyncGenerator<RawEvent> {\n const decoder = new TextDecoder();\n let buffer = '';\n const pendingToolCalls = new Map<string, RawToolCall>();\n let textStarted = false;\n let toolCallIndex = 0;\n \n while (true) {\n const { done, value } = await reader.read();\n if (done) break;\n \n buffer += decoder.decode(value, { stream: true });\n const lines = buffer.split('\\n');\n buffer = lines.pop() || '';\n \n for (const line of lines) {\n if (!line.startsWith('data:')) continue;\n \n const data = line.slice(5).trim();\n if (!data) continue;\n \n try {\n const json = JSON.parse(data);\n const candidate = json.candidates?.[0];\n if (!candidate?.content?.parts) continue;\n \n for (const part of candidate.content.parts) {\n // 处理文本(根据 thought 标志区分思考和回复)\n if (part.text) {\n if (part.thought === true) {\n // 思考内容\n yield { type: 'thinking_delta', delta: part.text };\n } else {\n // 正常回复\n if (!textStarted) {\n textStarted = true;\n yield { type: 'thinking_done' };\n }\n yield { type: 'text_delta', delta: part.text };\n }\n }\n \n // 处理函数调用\n if (part.functionCall) {\n const callId = `gemini-${toolCallIndex++}`;\n const toolCall: RawToolCall = {\n id: callId,\n name: part.functionCall.name,\n arguments: JSON.stringify(part.functionCall.args || {}),\n };\n // 捕获 thoughtSignature\n if (part.thoughtSignature) {\n toolCall.thoughtSignature = part.thoughtSignature;\n }\n pendingToolCalls.set(callId, toolCall);\n yield { type: 'tool_call_start', toolCall: { id: callId, name: toolCall.name } };\n yield { type: 'tool_call_done', toolCall };\n }\n }\n \n // 处理 grounding metadata(搜索结果)\n const groundingMeta = candidate.groundingMetadata;\n if (groundingMeta?.groundingChunks?.length) {\n const searchResults: RawSearchResult[] = [];\n for (const chunk of groundingMeta.groundingChunks) {\n if (chunk.web?.uri) {\n searchResults.push({\n title: chunk.web.title || '',\n url: chunk.web.uri,\n snippet: '',\n });\n }\n }\n if (searchResults.length > 0) {\n yield { type: 'search_result', searchResults };\n }\n }\n \n // 检查是否结束\n if (candidate.finishReason) {\n if (pendingToolCalls.size > 0) {\n yield { type: 'done', finishReason: 'tool_calls' };\n } else {\n yield { type: 'done', finishReason: 'stop' };\n }\n return;\n }\n } catch {\n // 忽略解析错误\n }\n }\n }\n \n // 兜底\n if (pendingToolCalls.size > 0) {\n yield { type: 'done', finishReason: 'tool_calls' };\n } else {\n yield { type: 'done', finishReason: 'stop' };\n }\n }\n}\n\n/**\n * 创建 Gemini Protocol\n */\nexport function createGeminiProtocol(config: ProtocolConfig): GeminiProtocol {\n return new GeminiProtocol(config);\n}\n\n","/**\n * OpenAI Protocol(通过 OpenRouter 访问 OpenAI/GPT 模型)\n * \n * 特点:\n * - GPT-5.x 支持 reasoning(思考模式)\n * - 支持工具调用\n */\n\nimport type {\n Protocol,\n ProtocolConfig,\n ProtocolMessage,\n ProtocolToolDefinition,\n ProtocolRequestOptions,\n RawEvent,\n RawToolCall,\n RawSearchResult,\n} from './types';\nimport { DEFAULT_OPENROUTER_URL } from '../../constants';\nimport { DebugLogger } from '../../utils';\n\nconst logger = DebugLogger.module('OpenAIProtocol');\n\n/**\n * OpenAI Protocol 实现(通过 OpenRouter)\n */\nexport class OpenAIProtocol implements Protocol {\n readonly name = 'openai';\n \n private apiKey: string;\n private apiUrl: string;\n \n constructor(config: ProtocolConfig) {\n this.apiKey = config.apiKey;\n this.apiUrl = config.apiUrl ?? DEFAULT_OPENROUTER_URL;\n }\n \n async *stream(\n messages: ProtocolMessage[],\n tools: ProtocolToolDefinition[],\n options: ProtocolRequestOptions\n ): AsyncGenerator<RawEvent> {\n const requestBody = this.buildRequestBody(messages, tools, options);\n const url = `${this.apiUrl}/responses`;\n \n logger.debug('发送 OpenAI 请求', {\n url,\n model: options.model,\n toolsCount: tools.length,\n });\n \n const response = await fetch(url, {\n method: 'POST',\n headers: {\n 'Authorization': `Bearer ${this.apiKey}`,\n 'Content-Type': 'application/json',\n 'HTTP-Referer': 'https://ai-chat.local',\n 'X-Title': 'AI Chat',\n },\n body: JSON.stringify(requestBody),\n signal: options.signal,\n });\n \n if (!response.ok) {\n const errorText = await response.text();\n logger.error('OpenAI API 错误', { status: response.status, body: errorText.slice(0, 500) });\n yield { type: 'error', error: `OpenAI API 错误: ${response.status} - ${errorText}` };\n return;\n }\n \n const reader = response.body?.getReader();\n if (!reader) {\n yield { type: 'error', error: '无法获取响应流' };\n return;\n }\n \n yield* this.parseSSE(reader, options.enableThinking);\n }\n \n /**\n * 构建请求体(OpenAI/GPT 专用)\n */\n private buildRequestBody(\n messages: ProtocolMessage[],\n tools: ProtocolToolDefinition[],\n options: ProtocolRequestOptions\n ): Record<string, unknown> {\n const input = this.convertMessages(messages);\n \n const body: Record<string, unknown> = {\n model: options.model,\n stream: true,\n input,\n };\n \n // GPT-5.x 支持 reasoning\n if (options.enableThinking) {\n body.reasoning = { effort: 'high' };\n }\n \n // 构建工具列表\n if (tools.length > 0) {\n body.tools = tools.map(t => ({\n type: 'function',\n name: t.name,\n description: t.description,\n parameters: t.parameters,\n }));\n }\n \n return body;\n }\n \n private convertMessages(messages: ProtocolMessage[]): unknown[] {\n const input: unknown[] = [];\n \n for (const msg of messages) {\n switch (msg.role) {\n case 'system':\n input.push({ role: 'system', content: msg.content });\n break;\n \n case 'user': {\n // 当只有图片没有文字时提供默认提示\n const textContent = msg.content || (msg.images?.length ? '请分析这张图片' : '');\n const content: unknown[] = [{ type: 'input_text', text: textContent }];\n if (msg.images?.length) {\n for (const img of msg.images) {\n content.push({\n type: 'input_image',\n image_url: img.startsWith('data:') ? img : `data:image/jpeg;base64,${img}`,\n detail: 'auto',\n });\n }\n }\n input.push({ role: 'user', content });\n break;\n }\n \n case 'assistant':\n if (msg.toolCalls?.length) {\n for (const tc of msg.toolCalls) {\n input.push({\n type: 'function_call',\n call_id: tc.id,\n name: tc.name,\n arguments: tc.arguments,\n });\n }\n } else {\n input.push({\n role: 'developer',\n content: `[上一轮AI回复]: ${msg.content}`,\n });\n }\n break;\n \n case 'tool':\n input.push({\n type: 'function_call_output',\n call_id: msg.toolCallId,\n output: msg.content,\n });\n break;\n }\n }\n \n return input;\n }\n \n /**\n * 解析 SSE 流(OpenAI/GPT 专用)\n */\n private async *parseSSE(\n reader: ReadableStreamDefaultReader<Uint8Array>,\n enableThinking: boolean\n ): AsyncGenerator<RawEvent> {\n const decoder = new TextDecoder();\n let buffer = '';\n const pendingToolCalls = new Map<string, RawToolCall>();\n let currentFunctionCallId: string | null = null;\n const searchResults: RawSearchResult[] = [];\n let streamDone = false;\n let thinkingDone = false;\n let textStarted = false;\n \n while (true) {\n const { done, value } = await reader.read();\n if (done) break;\n \n buffer += decoder.decode(value, { stream: true });\n const lines = buffer.split('\\n');\n buffer = lines.pop() || '';\n \n for (const line of lines) {\n if (streamDone) continue;\n if (!line.startsWith('data:')) continue;\n \n const data = line.slice(5).trim();\n if (data === '[DONE]') {\n streamDone = true;\n \n if (pendingToolCalls.size > 0) {\n for (const tc of pendingToolCalls.values()) {\n yield { type: 'tool_call_done', toolCall: tc };\n }\n yield { type: 'done', finishReason: 'tool_calls' };\n } else {\n yield { type: 'done', finishReason: 'stop' };\n }\n return;\n }\n \n try {\n const event = JSON.parse(data);\n logger.debug('SSE 事件', { type: event.type, event: JSON.stringify(event).slice(0, 200) });\n \n switch (event.type) {\n // ========== Responses API 格式 ==========\n case 'response.output_item.added': {\n const item = event.item;\n // 兼容 call_id 和 id 两种格式\n const callId = item?.call_id || item?.id;\n if (item?.type === 'function_call' && callId) {\n currentFunctionCallId = callId;\n // 兼容多种参数格式:arguments 可能是字符串或对象,也可能叫 input\n let args = item.arguments || item.input || '';\n if (typeof args === 'object') {\n args = JSON.stringify(args);\n }\n pendingToolCalls.set(callId, {\n id: callId,\n name: item.name || item.function?.name || '',\n arguments: args,\n });\n logger.debug('工具调用开始', { id: callId, name: item.name, args: args.slice(0, 100) });\n yield { type: 'tool_call_start', toolCall: { id: callId, name: item.name || item.function?.name || '' } };\n }\n break;\n }\n \n case 'response.function_call_arguments.delta': {\n const delta = event.delta as string | undefined;\n if (currentFunctionCallId && delta) {\n const call = pendingToolCalls.get(currentFunctionCallId);\n if (call) {\n call.arguments += delta;\n yield { type: 'tool_call_delta', toolCall: { id: currentFunctionCallId, arguments: delta } };\n }\n }\n break;\n }\n \n case 'response.function_call_arguments.done': {\n // 兼容 item_id 和 call_id\n const callId = event.item_id || event.call_id || currentFunctionCallId;\n if (callId) {\n const existing = pendingToolCalls.get(callId);\n if (existing) {\n // 如果 event 中有完整的 arguments,使用它\n if (event.arguments) {\n existing.arguments = event.arguments;\n }\n try {\n JSON.parse(existing.arguments);\n } catch {\n logger.warn('工具参数解析失败,使用空对象', { args: existing.arguments.slice(0, 100) });\n existing.arguments = '{}';\n }\n }\n }\n break;\n }\n \n case 'response.output_item.done': {\n const item = event.item;\n const callId = item?.call_id || item?.id;\n if (item?.type === 'function_call' && callId) {\n const existing = pendingToolCalls.get(callId);\n // 兼容多种参数格式\n let args = item.arguments || item.input || existing?.arguments || '{}';\n if (typeof args === 'object') {\n args = JSON.stringify(args);\n }\n pendingToolCalls.set(callId, {\n id: callId,\n name: item.name || item.function?.name || existing?.name || '',\n arguments: args,\n });\n logger.debug('工具调用完成', { id: callId, name: item.name, args: args.slice(0, 100) });\n }\n break;\n }\n \n case 'response.output_text.annotation.added': {\n const annotation = event.annotation;\n if (annotation?.url) {\n const exists = searchResults.some(r => r.url === annotation.url);\n if (!exists) {\n searchResults.push({\n title: annotation.title || annotation.text || '',\n url: annotation.url,\n snippet: annotation.summary || annotation.snippet || '',\n });\n yield { type: 'search_result', searchResults: [...searchResults] };\n }\n }\n break;\n }\n \n case 'response.output_text.delta':\n if (event.delta) {\n // 首次收到 text 时,结束 thinking\n if (!textStarted) {\n textStarted = true;\n if (enableThinking && !thinkingDone) {\n thinkingDone = true;\n yield { type: 'thinking_done' };\n }\n }\n yield { type: 'text_delta', delta: event.delta };\n }\n break;\n \n // GPT-5.x 支持 reasoning\n case 'response.reasoning_summary_text.delta':\n if (enableThinking && event.delta && !thinkingDone) {\n yield { type: 'thinking_delta', delta: event.delta };\n }\n break;\n \n // response.completed 事件(包含完整的工具调用参数)\n case 'response.completed': {\n const response = event.response;\n if (response?.output?.length) {\n for (const item of response.output) {\n if (item.type === 'function_call' && item.call_id) {\n const existing = pendingToolCalls.get(item.call_id);\n // 从 response.completed 中获取完整参数\n let args = item.arguments || existing?.arguments || '{}';\n if (typeof args === 'object') {\n args = JSON.stringify(args);\n }\n pendingToolCalls.set(item.call_id, {\n id: item.call_id,\n name: item.name || existing?.name || '',\n arguments: args,\n });\n logger.debug('response.completed: 更新工具参数', { id: item.call_id, args: args.slice(0, 100) });\n }\n }\n }\n \n streamDone = true;\n if (pendingToolCalls.size > 0) {\n for (const tc of pendingToolCalls.values()) {\n logger.debug('response.completed: 发出 tool_call_done', tc);\n yield { type: 'tool_call_done', toolCall: tc };\n }\n yield { type: 'done', finishReason: 'tool_calls' };\n } else {\n yield { type: 'done', finishReason: 'stop' };\n }\n return;\n }\n }\n } catch (e) {\n logger.warn('SSE 解析错误', { line: line.slice(0, 100), error: String(e) });\n }\n }\n }\n \n // 兜底\n if (!streamDone) {\n logger.debug('流结束,执行兜底逻辑', { pendingToolCalls: pendingToolCalls.size });\n if (pendingToolCalls.size > 0) {\n for (const tc of pendingToolCalls.values()) {\n yield { type: 'tool_call_done', toolCall: tc };\n }\n yield { type: 'done', finishReason: 'tool_calls' };\n } else {\n yield { type: 'done', finishReason: 'stop' };\n }\n }\n }\n}\n\nexport function createOpenAIProtocol(config: ProtocolConfig): OpenAIProtocol {\n return new OpenAIProtocol(config);\n}\n\n","/**\n * Anthropic Protocol(通过 Vercel AI Gateway)\n * \n * 特点:\n * - 使用 Vercel AI SDK 的 createGateway\n * - 支持 extended thinking\n * - 支持工具调用\n * - 自动处理流式输出\n * \n * 参考: https://vercel.com/docs/ai-gateway\n */\n\nimport { streamText, createGateway, tool } from 'ai';\nimport { z } from 'zod';\nimport type {\n Protocol,\n ProtocolConfig,\n ProtocolMessage,\n ProtocolToolDefinition,\n ProtocolRequestOptions,\n RawEvent,\n} from './types';\nimport { DebugLogger } from '../../utils';\n\nconst logger = DebugLogger.module('AnthropicProtocol');\n\n/** Gateway 类型 */\ntype GatewayFunction = ReturnType<typeof createGateway>;\n\n/** AI SDK 消息类型 */\ntype CoreMessage = Parameters<typeof streamText>[0]['messages'] extends infer M \n ? M extends readonly (infer T)[] ? T : never \n : never;\n\n/**\n * Anthropic Protocol 实现(通过 Vercel AI Gateway)\n */\nexport class AnthropicProtocol implements Protocol {\n readonly name = 'anthropic';\n \n private gateway: GatewayFunction;\n \n constructor(config: ProtocolConfig) {\n // 创建 Vercel AI Gateway 客户端\n this.gateway = createGateway({\n apiKey: config.apiKey,\n });\n }\n \n async *stream(\n messages: ProtocolMessage[],\n tools: ProtocolToolDefinition[],\n options: ProtocolRequestOptions\n ): AsyncGenerator<RawEvent> {\n logger.debug('使用 Vercel AI Gateway 调用 Claude', {\n model: options.model,\n enableThinking: options.enableThinking,\n toolsCount: tools.length,\n });\n \n try {\n // 转换消息格式(简化版:只处理 user/assistant 文本消息)\n const sdkMessages = this.convertMessages(messages);\n \n // 构建 streamText 参数\n const streamParams: Parameters<typeof streamText>[0] = {\n model: this.gateway(options.model),\n messages: sdkMessages,\n maxOutputTokens: options.familyConfig.defaultMaxTokens,\n abortSignal: options.signal,\n };\n \n // 添加工具(如果有)\n if (tools.length > 0) {\n streamParams.tools = this.convertTools(tools);\n }\n \n // 添加 thinking 配置\n if (options.enableThinking) {\n streamParams.providerOptions = {\n anthropic: {\n thinking: {\n type: 'enabled',\n budgetTokens: 10000,\n },\n },\n };\n }\n \n logger.debug('发送请求到 Vercel AI Gateway', { \n model: options.model,\n messagesCount: sdkMessages.length,\n toolsCount: tools.length,\n enableThinking: options.enableThinking,\n });\n \n // 调用 streamText\n const result = streamText(streamParams);\n \n // 处理流式响应\n yield* this.parseStream(result);\n \n } catch (error: unknown) {\n const errorMessage = error instanceof Error ? error.message : 'Unknown error';\n logger.error('Vercel AI Gateway 错误', { error: errorMessage });\n yield { type: 'error', error: errorMessage };\n }\n }\n \n /**\n * 转换消息格式(ProtocolMessage → AI SDK CoreMessage)\n * 简化版:主要处理文本消息,工具调用通过历史上下文传递\n */\n private convertMessages(messages: ProtocolMessage[]): CoreMessage[] {\n const result: CoreMessage[] = [];\n \n for (const msg of messages) {\n switch (msg.role) {\n case 'system':\n result.push({ role: 'system', content: msg.content });\n break;\n \n case 'user': {\n // 当只有图片没有文字时提供默认提示\n const textContent = msg.content || (msg.images?.length ? '请分析这张图片' : '');\n if (msg.images?.length) {\n // 多模态消息\n const content: Array<{ type: 'text'; text: string } | { type: 'image'; image: string }> = [\n { type: 'text', text: textContent }\n ];\n for (const img of msg.images) {\n content.push({\n type: 'image',\n image: img.startsWith('data:') ? img : `data:image/jpeg;base64,${img}`,\n });\n }\n result.push({ role: 'user', content });\n } else {\n result.push({ role: 'user', content: textContent });\n }\n break;\n }\n \n case 'assistant':\n // 简化处理:只保留文本内容,工具调用信息暂时忽略\n // AI SDK 6.x 的工具调用格式较复杂,需要完整的 tool-call/tool-result 对\n if (msg.content) {\n result.push({ role: 'assistant', content: msg.content });\n }\n break;\n \n case 'tool':\n // 工具结果作为用户消息传递(简化处理)\n result.push({ \n role: 'user', \n content: `[工具 ${msg.toolName || 'unknown'} 返回结果]: ${msg.content}` \n });\n break;\n }\n }\n \n return result;\n }\n \n /**\n * 转换工具格式(ProtocolToolDefinition → AI SDK tools)\n * 注意:Vercel Gateway 对工具格式有特殊要求,这里使用标准格式\n */\n private convertTools(tools: ProtocolToolDefinition[]): NonNullable<Parameters<typeof streamText>[0]['tools']> {\n const result: NonNullable<Parameters<typeof streamText>[0]['tools']> = {};\n \n for (const t of tools) {\n // 将 JSON Schema 转换为 zod schema\n const zodSchema = this.jsonSchemaToZod(t.parameters);\n // 使用类型断言绕过复杂的泛型类型问题\n (result as Record<string, unknown>)[t.name] = tool({\n description: t.description,\n inputSchema: zodSchema,\n });\n }\n \n return result;\n }\n \n /**\n * 将 JSON Schema 转换为 Zod Schema\n */\n private jsonSchemaToZod(schema: ProtocolToolDefinition['parameters']): z.ZodType {\n const shape: Record<string, z.ZodTypeAny> = {};\n \n for (const [key, prop] of Object.entries(schema.properties)) {\n let zodType: z.ZodTypeAny;\n \n switch (prop.type) {\n case 'string':\n zodType = prop.enum ? z.enum(prop.enum as [string, ...string[]]) : z.string();\n break;\n case 'number':\n case 'integer':\n zodType = z.number();\n break;\n case 'boolean':\n zodType = z.boolean();\n break;\n case 'array':\n zodType = z.array(z.string()); // 简化处理\n break;\n default:\n zodType = z.unknown();\n }\n \n // 添加描述\n if (prop.description) {\n zodType = zodType.describe(prop.description);\n }\n \n // 处理可选性\n if (!schema.required.includes(key)) {\n zodType = zodType.optional();\n }\n \n shape[key] = zodType;\n }\n \n return z.object(shape);\n }\n \n /**\n * 解析 AI SDK 流式响应\n */\n private async *parseStream(\n result: ReturnType<typeof streamText>\n ): AsyncGenerator<RawEvent> {\n const toolCalls = new Map<string, { id: string; name: string; arguments: string }>();\n let hasThinking = false;\n let thinkingDone = false;\n \n try {\n for await (const part of result.fullStream) {\n switch (part.type) {\n case 'reasoning-delta':\n // 处理思考内容(AI SDK 6.x 使用 text 属性)\n if ('text' in part && part.text) {\n hasThinking = true;\n yield { type: 'thinking_delta', delta: part.text };\n }\n break;\n \n case 'reasoning-end':\n // 思考结束\n if (hasThinking && !thinkingDone) {\n thinkingDone = true;\n yield { type: 'thinking_done' };\n }\n break;\n \n case 'text-delta':\n // 处理文本内容\n // 如果有 thinking 但还没发送 thinking_done,先发送\n if (hasThinking && !thinkingDone) {\n thinkingDone = true;\n yield { type: 'thinking_done' };\n }\n if ('text' in part && part.text) {\n yield { type: 'text_delta', delta: part.text };\n }\n break;\n \n case 'tool-call':\n // 处理工具调用\n if ('toolCallId' in part && 'toolName' in part) {\n const toolCallId = part.toolCallId;\n const toolName = part.toolName;\n const input = 'input' in part ? part.input : null;\n const args = input ? (typeof input === 'string' ? input : JSON.stringify(input)) : '{}';\n \n // 发送开始事件\n yield {\n type: 'tool_call_start',\n toolCall: { id: toolCallId, name: toolName },\n };\n \n // 保存工具调用信息\n toolCalls.set(toolCallId, {\n id: toolCallId,\n name: toolName,\n arguments: args,\n });\n \n // 发送完成事件\n yield {\n type: 'tool_call_done',\n toolCall: {\n id: toolCallId,\n name: toolName,\n arguments: args,\n },\n };\n }\n break;\n \n case 'finish':\n // 处理完成\n const finishReason = toolCalls.size > 0 ? 'tool_calls' :\n ('finishReason' in part && part.finishReason === 'stop') ? 'stop' :\n ('finishReason' in part && part.finishReason === 'length') ? 'length' : 'stop';\n \n yield { type: 'done', finishReason };\n return;\n }\n }\n \n // 流结束但没有 finish 事件\n yield { type: 'done', finishReason: 'stop' };\n \n } catch (error: unknown) {\n const errorMessage = error instanceof Error ? error.message : 'Stream error';\n logger.error('流式处理错误', { error: errorMessage });\n yield { type: 'error', error: errorMessage };\n }\n }\n}\n\nexport function createAnthropicProtocol(config: ProtocolConfig): AnthropicProtocol {\n return new AnthropicProtocol(config);\n}\n","/**\n * UnifiedAdapter - 统一适配器\n * \n * 组合 Protocol + FamilyConfig,产出标准 StreamChunk\n * \n * 设计原则:\n * 1. Protocol 只负责 HTTP/SSE 通信,产出 RawEvent\n * 2. UnifiedAdapter 根据 FamilyConfig 将 RawEvent 转换为 StreamChunk\n * 3. 所有模型都使用同一个 UnifiedAdapter,行为差异由 FamilyConfig 决定\n * 4. 实现 ProviderAdapter 接口,可与现有 Orchestrator 无缝集成\n */\n\nimport type {\n Protocol,\n ProtocolMessage,\n ProtocolToolDefinition,\n RawEvent,\n} from './protocols';\nimport {\n createArkProtocol,\n createDeepSeekProtocol,\n createQwenProtocol,\n createGeminiProtocol,\n createOpenAIProtocol,\n createAnthropicProtocol,\n} from './protocols';\nimport {\n getModelFamily,\n getModelProtocol,\n getVisibleModels,\n type ModelFamilyConfig,\n type ProtocolId,\n} from './model-registry';\nimport type { \n ProviderAdapter,\n StreamChunk, \n ToolCallRequest, \n SearchResultItem,\n StandardMessage,\n SimpleToolDefinition,\n StreamOnceOptions,\n} from './types';\nimport { DebugLogger } from '../utils';\n\nconst logger = DebugLogger.module('UnifiedAdapter');\n\n// ==================== 配置类型 ====================\n\n/**\n * UnifiedAdapter 配置\n */\nexport interface UnifiedAdapterConfig {\n /** ARK API Key(豆包/DeepSeek) */\n arkApiKey?: string;\n arkApiUrl?: string;\n \n /** Qwen API Key(通义千问) */\n qwenApiKey?: string;\n qwenApiUrl?: string;\n \n /** Gemini API Key */\n geminiApiKey?: string;\n geminiApiUrl?: string;\n \n /** OpenRouter API Key */\n openrouterApiKey?: string;\n openrouterApiUrl?: string;\n \n /** Vercel API Key(用于 Vercel AI Gateway 访问 Claude) */\n vercelApiKey?: string;\n}\n\n/**\n * 流式调用选项\n */\nexport interface StreamOptions {\n /** 模型 ID */\n model: string;\n /** 是否启用 thinking */\n enableThinking?: boolean;\n /** 是否启用搜索 */\n enableSearch?: boolean;\n /** 中断信号 */\n signal: AbortSignal;\n}\n\n// ==================== UnifiedAdapter ====================\n\n/**\n * 统一适配器\n * \n * 实现 ProviderAdapter 接口,根据模型自动选择 Protocol,并根据 FamilyConfig 转换事件\n */\nexport class UnifiedAdapter implements ProviderAdapter {\n readonly name = 'unified';\n \n /** 支持的模型列表(从 Registry 获取) */\n get supportedModels(): string[] {\n return getVisibleModels().map(m => m.id);\n }\n \n private protocols: Map<ProtocolId, Protocol> = new Map();\n \n constructor(config: UnifiedAdapterConfig) {\n // 初始化各 Protocol\n if (config.arkApiKey) {\n // 豆包(ARK 原生)\n this.protocols.set('ark', createArkProtocol({\n apiKey: config.arkApiKey,\n apiUrl: config.arkApiUrl,\n }));\n // DeepSeek(通过 ARK,但独立 Protocol)\n this.protocols.set('deepseek', createDeepSeekProtocol({\n apiKey: config.arkApiKey,\n apiUrl: config.arkApiUrl,\n }));\n }\n \n if (config.qwenApiKey) {\n this.protocols.set('qwen', createQwenProtocol({\n apiKey: config.qwenApiKey,\n apiUrl: config.qwenApiUrl,\n }));\n }\n \n if (config.geminiApiKey) {\n this.protocols.set('gemini', createGeminiProtocol({\n apiKey: config.geminiApiKey,\n apiUrl: config.geminiApiUrl,\n }));\n }\n \n // OpenAI 通过 OpenRouter 访问\n if (config.openrouterApiKey) {\n this.protocols.set('openai', createOpenAIProtocol({\n apiKey: config.openrouterApiKey,\n apiUrl: config.openrouterApiUrl,\n }));\n }\n \n // Anthropic 使用 Vercel AI SDK\n if (config.vercelApiKey) {\n this.protocols.set('anthropic', createAnthropicProtocol({\n apiKey: config.vercelApiKey,\n }));\n }\n }\n \n /**\n * 检查是否支持指定模型\n */\n supportsModel(model: string): boolean {\n const protocol = getModelProtocol(model);\n return protocol ? this.protocols.has(protocol) : false;\n }\n \n /**\n * 获取模型的家族配置\n */\n getModelFamilyConfig(model: string): ModelFamilyConfig | undefined {\n return getModelFamily(model);\n }\n \n /**\n * 实现 ProviderAdapter.streamOnce 接口\n * \n * @param messages 标准消息列表\n * @param tools 工具定义\n * @param options 调用选项\n * @returns 标准 StreamChunk 流\n */\n async *streamOnce(\n messages: StandardMessage[],\n tools: SimpleToolDefinition[],\n options: StreamOnceOptions\n ): AsyncGenerator<StreamChunk> {\n const { model, enableThinking = false, enableSearch = false, signal } = options;\n \n // 转换消息格式(StandardMessage → ProtocolMessage)\n const protocolMessages: ProtocolMessage[] = messages.map(m => ({\n role: m.role,\n content: m.content,\n images: m.images,\n toolCalls: m.toolCalls?.map(tc => ({\n id: tc.id,\n name: tc.name,\n arguments: tc.arguments,\n thoughtSignature: tc.thought_signature,\n })),\n toolCallId: m.toolCallId,\n toolName: m.toolName,\n }));\n \n // 转换工具格式(SimpleToolDefinition → ProtocolToolDefinition)\n const protocolTools: ProtocolToolDefinition[] = tools;\n \n yield* this.stream(protocolMessages, protocolTools, {\n model,\n enableThinking,\n enableSearch,\n signal,\n });\n }\n \n /**\n * 流式调用(内部方法)\n */\n private async *stream(\n messages: ProtocolMessage[],\n tools: ProtocolToolDefinition[],\n options: StreamOptions\n ): AsyncGenerator<StreamChunk> {\n const { model, enableThinking = false, enableSearch = false, signal } = options;\n \n // 获取模型配置\n const protocolId = getModelProtocol(model);\n const familyConfig = getModelFamily(model);\n \n if (!protocolId) {\n yield { type: 'error', error: `未知模型: ${model}` };\n return;\n }\n \n if (!familyConfig) {\n yield { type: 'error', error: `模型 ${model} 缺少家族配置` };\n return;\n }\n \n const protocol = this.protocols.get(protocolId);\n if (!protocol) {\n yield { type: 'error', error: `Protocol ${protocolId} 未配置` };\n return;\n }\n \n logger.debug('开始流式调用', {\n model,\n protocol: protocolId,\n family: familyConfig.id,\n enableThinking,\n enableSearch,\n });\n \n // 调用 Protocol 获取原始事件流\n const rawStream = protocol.stream(messages, tools, {\n model,\n familyConfig,\n enableThinking,\n enableSearch,\n signal,\n });\n \n // 转换为标准 StreamChunk\n yield* this.transformEvents(rawStream, familyConfig, enableThinking, enableSearch);\n }\n \n /**\n * 将 RawEvent 转换为 StreamChunk\n * \n * 根据 FamilyConfig 处理行为差异\n */\n private async *transformEvents(\n rawStream: AsyncGenerator<RawEvent>,\n familyConfig: ModelFamilyConfig,\n enableThinking: boolean,\n enableSearch: boolean\n ): AsyncGenerator<StreamChunk> {\n // 状态跟踪\n let thinkingBuffer = '';\n let thinkingStarted = false;\n \n for await (const event of rawStream) {\n switch (event.type) {\n // ========== Thinking 处理 ==========\n case 'thinking_delta':\n // 只有启用 thinking 且家族支持时才输出\n if (enableThinking && familyConfig.supportsThinking && event.delta) {\n // 去除开头的换行\n let delta = event.delta;\n if (!thinkingStarted) {\n delta = delta.replace(/^\\n+/, '');\n if (delta) thinkingStarted = true;\n }\n if (delta) {\n thinkingBuffer += delta;\n yield { type: 'thinking', thinking: delta };\n }\n }\n break;\n \n case 'thinking_done':\n if (enableThinking && familyConfig.supportsThinking) {\n yield { type: 'thinking_done' };\n }\n break;\n \n // ========== 文本处理 ==========\n case 'text_delta':\n if (event.delta) {\n yield { type: 'text', text: event.delta };\n }\n break;\n \n // ========== 工具调用处理 ==========\n case 'tool_call_done':\n if (event.toolCall) {\n const toolCall: ToolCallRequest = {\n id: event.toolCall.id || '',\n name: event.toolCall.name || '',\n arguments: event.toolCall.arguments || '{}',\n };\n // 保留 Gemini 的 thoughtSignature\n if (event.toolCall.thoughtSignature) {\n toolCall.thought_signature = event.toolCall.thoughtSignature;\n }\n yield { type: 'tool_call', toolCall };\n }\n break;\n \n // ========== 搜索结果处理 ==========\n case 'search_result':\n if (enableSearch && event.searchResults) {\n const searchResults: SearchResultItem[] = event.searchResults.map(r => ({\n title: r.title,\n url: r.url,\n snippet: r.snippet,\n }));\n yield { type: 'search_result', searchResults };\n }\n break;\n \n // ========== 完成处理 ==========\n case 'done':\n yield {\n type: 'done',\n finishReason: event.finishReason || 'stop',\n };\n break;\n \n // ========== 错误处理 ==========\n case 'error':\n yield { type: 'error', error: event.error || '未知错误' };\n break;\n \n // 忽略其他事件(如 tool_call_start, tool_call_delta)\n default:\n break;\n }\n }\n }\n}\n\n/**\n * 创建 UnifiedAdapter\n */\nexport function createUnifiedAdapter(config: UnifiedAdapterConfig): UnifiedAdapter {\n return new UnifiedAdapter(config);\n}\n\n","/**\n * Web Search 工具(内部集成):使用 Tavily API 实现\n *\n * 说明:\n * - 该工具用于“非模型原生搜索”的 provider(例如 Qwen / OpenRouter)\n * - 由模型通过 tool calling 主动调用(而不是 adapter 直接请求 Tavily)\n * - 返回内容用于 Orchestrator 统一产出 search_* 事件 + 注入消息历史供模型下一轮使用\n */\n\nimport type { Tool } from '../types';\n\nexport function createWebSearchTool(tavilyApiKey: string): Tool {\n return {\n name: 'web_search',\n description:\n '联网搜索工具。输入 query(搜索关键词/问题),返回搜索结果列表(title/url/snippet)。用于获取实时信息与可引用来源。',\n parameters: {\n type: 'object',\n properties: {\n query: { type: 'string', description: '搜索关键词或问题(必填)' },\n max_results: { type: 'number', description: '最大返回结果数(可选,默认 5)' },\n },\n required: ['query'],\n },\n // 结果类型:让前端/调试可识别(不强依赖)\n resultType: 'search_results',\n execute: async (args, ctx) => {\n const query = typeof args.query === 'string' ? args.query : '';\n const maxResults = typeof args.max_results === 'number' && Number.isFinite(args.max_results)\n ? Math.max(1, Math.min(10, Math.floor(args.max_results)))\n : 5;\n\n if (!query.trim()) {\n return JSON.stringify({ query: '', results: [], error: '缺少 query' });\n }\n if (!tavilyApiKey) {\n return JSON.stringify({ query, results: [], error: '缺少 Tavily API Key' });\n }\n\n const resp = await fetch('https://api.tavily.com/search', {\n method: 'POST',\n headers: {\n Authorization: `Bearer ${tavilyApiKey}`,\n 'Content-Type': 'application/json',\n },\n body: JSON.stringify({\n query,\n max_results: maxResults,\n search_depth: 'basic',\n include_answer: false,\n include_raw_content: false,\n }),\n signal: ctx.signal,\n });\n\n if (!resp.ok) {\n const t = await resp.text().catch(() => '');\n return JSON.stringify({ query, results: [], error: `Tavily /search 错误: ${resp.status} ${t}`.trim() });\n }\n\n const data: unknown = await resp.json().catch(() => null);\n\n // 映射为我们标准字段:title/url/snippet,其中 snippet 使用 Tavily 的 content(不做压缩/截断)\n const results: Array<{ title: string; url: string; snippet: string }> = [];\n const arr = (data && typeof data === 'object' && Array.isArray((data as any).results)) ? (data as any).results : [];\n for (const r of arr) {\n const url = typeof r?.url === 'string' ? r.url : '';\n if (!url) continue;\n const title = typeof r?.title === 'string' ? r.title : '';\n const snippet = typeof r?.content === 'string' ? r.content : '';\n results.push({ title, url, snippet });\n }\n\n return JSON.stringify({ query, results });\n },\n };\n}\n\n\n","/**\n * HybridAgent - 混合 AI Agent\n * \n * 新架构(Protocol + Family 分离):\n * - UnifiedAdapter: 统一适配器,组合 Protocol + FamilyConfig\n * - ChatOrchestrator: 统一处理工具调用循环、消息历史、事件发射\n * - HybridAgent: 协调者,负责初始化和路由\n * \n * 设计优势:\n * 1. Protocol 只负责 HTTP/SSE 通信\n * 2. FamilyConfig 统一管理行为差异\n * 3. 新增模型只需在 Registry 配置,无需修改代码\n */\n\nimport { GoogleGenAI } from '@google/genai';\nimport type { \n AgentConfig, \n ToolExecutor,\n ChatOptions,\n ThinkingMode,\n Tool,\n ToolContext,\n ToolResult,\n ToolConfigItem,\n} from './types';\nimport { resolveTools, MODELS } from './types';\nimport type { ChatEvent } from './events';\nimport { createApiError } from './events';\nimport { createDefaultToolExecutor } from './tools';\nimport { DEFAULT_ARK_URL, DEFAULT_QWEN_URL, DEFAULT_OPENROUTER_URL, DEFAULT_MODEL, AGENT_MODE_PROMPT } from './constants';\nimport { routeModelToProvider, routeModelWithDetails, type ProviderType, type RouteResult } from './router';\nimport { getModelFamily, modelSupportsNativeSearch, type ModelFamilyConfig } from './providers/model-registry';\n\n// 新架构导入\nimport type { OrchestratorContext, SimpleToolDefinition, ToolExecutionHooks } from './providers/types';\nimport { ChatOrchestrator } from './providers/orchestrator';\nimport { UnifiedAdapter } from './providers/unified-adapter';\nimport { createWebSearchTool } from './builtin-tools/web-search';\n\n/** 运行时配置(API Keys 和 URLs) */\nexport interface RuntimeConfig {\n arkApiKey: string;\n arkApiUrl: string;\n qwenApiKey: string;\n qwenApiUrl: string;\n openrouterApiKey: string;\n openrouterApiUrl: string;\n vercelApiKey: string;\n tavilyApiKey: string;\n geminiApiKey: string;\n cwd: string;\n}\n\n/**\n * 混合 Agent 类\n * \n * 职责:\n * 1. 管理 UnifiedAdapter(统一适配器)\n * 2. 使用 ChatOrchestrator 统一处理工具调用\n * 3. 管理工具注册\n */\nexport class HybridAgent {\n private config: RuntimeConfig;\n private adapter: UnifiedAdapter;\n private orchestrator: ChatOrchestrator;\n private geminiClient: GoogleGenAI;\n private toolExecutor: ToolExecutor;\n private abortController: AbortController | null = null;\n \n /** 已注册的工具 */\n private tools: Map<string, Tool> = new Map();\n \n /** 工具配置(用于异步初始化) */\n private toolConfig: ToolConfigItem[] | undefined;\n\n constructor(config: AgentConfig, toolExecutor?: ToolExecutor) {\n this.config = {\n arkApiKey: config.arkApiKey,\n arkApiUrl: config.arkApiUrl || DEFAULT_ARK_URL,\n qwenApiKey: config.qwenApiKey || '',\n qwenApiUrl: config.qwenApiUrl || DEFAULT_QWEN_URL,\n openrouterApiKey: config.openrouterApiKey || '',\n openrouterApiUrl: config.openrouterApiUrl || DEFAULT_OPENROUTER_URL,\n vercelApiKey: config.vercelApiKey || '',\n tavilyApiKey: config.tavilyApiKey || '',\n geminiApiKey: config.geminiApiKey,\n cwd: config.cwd || process.cwd(),\n };\n\n this.geminiClient = new GoogleGenAI({ apiKey: this.config.geminiApiKey });\n this.toolExecutor = toolExecutor || createDefaultToolExecutor(this.config.cwd);\n\n // 保存工具配置(用于异步初始化)\n this.toolConfig = config.tools;\n this.tools = new Map();\n \n // 初始化 UnifiedAdapter(统一适配器)\n this.adapter = new UnifiedAdapter({\n arkApiKey: this.config.arkApiKey,\n arkApiUrl: this.config.arkApiUrl,\n qwenApiKey: this.config.qwenApiKey,\n qwenApiUrl: this.config.qwenApiUrl,\n geminiApiKey: this.config.geminiApiKey,\n openrouterApiKey: this.config.openrouterApiKey,\n openrouterApiUrl: this.config.openrouterApiUrl,\n vercelApiKey: this.config.vercelApiKey,\n });\n \n // 初始化 Orchestrator\n this.orchestrator = new ChatOrchestrator({\n maxIterations: 10,\n executeTool: this.executeTool.bind(this),\n tools: this.tools,\n onToolApprovalRequest: config.onToolApprovalRequest,\n getAutoRunConfig: config.getAutoRunConfig,\n });\n }\n\n /** 异步初始化工具(在第一次 chat 前调用) */\n private async asyncInit(): Promise<void> {\n if (this.toolConfig && this.tools.size === 0) {\n const resolvedTools = await resolveTools(this.toolConfig);\n for (const tool of resolvedTools) {\n this.tools.set(tool.name, tool);\n }\n }\n\n // 内置 Web Search(Tavily):仅在配置了 tavilyApiKey 且未被用户覆盖时注册\n if (this.config.tavilyApiKey && !this.tools.has('web_search')) {\n this.tools.set('web_search', createWebSearchTool(this.config.tavilyApiKey));\n }\n }\n\n /** 获取模型的家族配置 */\n getModelFamilyConfig(model: string): ModelFamilyConfig | undefined {\n return getModelFamily(model);\n }\n \n /** \n * 判断模型提供商(兼容旧接口)\n */\n private getModelProvider(model: string): ProviderType {\n return routeModelToProvider(model);\n }\n \n /**\n * 调试:获取模型路由信息\n */\n getModelRouteInfo(model: string): RouteResult & { available: boolean; familyConfig?: ModelFamilyConfig } {\n const result = routeModelWithDetails(model);\n return {\n ...result,\n available: this.adapter.supportsModel(model),\n familyConfig: getModelFamily(model),\n };\n }\n\n /** 构建系统提示词 */\n private buildSystemPrompt(options: ChatOptions): string {\n const model = options.model || DEFAULT_MODEL;\n const familyConfig = getModelFamily(model);\n\n // Agent 和 Ask 模式使用默认提示词\n let prompt = AGENT_MODE_PROMPT;\n\n // Web Search(工具方式):仅对\"不支持原生搜索\"的模型提示使用 web_search\n if (options.enableWebSearch && familyConfig && !modelSupportsNativeSearch(model)) {\n prompt += '\\n\\n【联网搜索】当用户问题需要实时信息/最新事实/可引用来源时,请先调用 web_search 工具获取结果,然后基于返回的 title/url/snippet 作答,并在回答中给出来源链接。';\n }\n\n return prompt;\n }\n\n /** 获取默认深度思考模式 */\n private getDefaultThinkingMode(): ThinkingMode {\n return 'disabled';\n }\n\n /** 创建工具执行上下文 */\n private createToolContext(signal?: AbortSignal, hooks?: ToolExecutionHooks): ToolContext {\n return {\n cwd: this.config.cwd,\n geminiClient: this.geminiClient,\n executeCommand: (command: string, cwd?: string) =>\n this.toolExecutor.executeCommand(command, cwd || this.config.cwd, signal, {\n onStdout: hooks?.onStdout,\n onStderr: hooks?.onStderr,\n }),\n signal,\n };\n }\n\n /** 执行工具 */\n private async executeTool(\n name: string,\n args: Record<string, unknown>,\n signal?: AbortSignal,\n hooks?: ToolExecutionHooks\n ): Promise<string | ToolResult> {\n const tool = this.tools.get(name);\n if (!tool) {\n return `未知工具: ${name}`;\n }\n return await tool.execute(args, this.createToolContext(signal, hooks));\n }\n\n /** 获取工具定义列表 */\n private getToolDefinitions(enabledTools?: string[], forceInclude?: string[]): SimpleToolDefinition[] {\n const allTools = Array.from(this.tools.values());\n let selected = enabledTools !== undefined\n ? allTools.filter(t => enabledTools.includes(t.name))\n : allTools;\n\n // 强制包含指定工具(用于 enableWebSearch 这类\"功能开关\")\n if (forceInclude?.length) {\n for (const name of forceInclude) {\n if (!selected.some(t => t.name === name)) {\n const t = this.tools.get(name);\n if (t) selected = [...selected, t];\n }\n }\n }\n\n return selected.map(tool => ({\n name: tool.name,\n description: tool.description,\n parameters: tool.parameters\n }));\n }\n \n /** 获取所有工具列表(用于设置面板) */\n public getAllTools(): Array<{ name: string; description: string }> {\n return Array.from(this.tools.values()).map(tool => ({\n name: tool.name,\n description: tool.description\n }));\n }\n\n /**\n * 聊天入口\n * \n * 使用 ChatOrchestrator 统一处理所有 Provider 的工具调用循环\n */\n async *chat(\n message: string, \n options: ChatOptions = {},\n images?: string[]\n ): AsyncGenerator<ChatEvent> {\n // 异步初始化工具(如果还没初始化)\n await this.asyncInit();\n \n this.abortController = new AbortController();\n const signal = this.abortController.signal;\n\n const model = options.model || DEFAULT_MODEL;\n\n // 检查模型是否支持\n if (!this.adapter.supportsModel(model)) {\n const familyConfig = getModelFamily(model);\n if (!familyConfig) {\n yield createApiError(`未知模型: ${model}`, { code: 'MODEL_NOT_SUPPORTED' });\n } else {\n yield createApiError(`模型 ${model} 缺少 API Key 配置`, { code: 'MISSING_API_KEY' });\n }\n return;\n }\n \n // 获取模型家族配置\n const familyConfig = getModelFamily(model);\n \n // 统一 thinkingMode\n const rawThinkingMode = options.thinkingMode ?? this.getDefaultThinkingMode();\n const thinkingMode: ThinkingMode = rawThinkingMode === 'enabled' ? 'enabled' : 'disabled';\n const systemPrompt = this.buildSystemPrompt(options);\n\n // ask 模式:强制\"纯文本回答\"\n const isAskMode = options.mode === 'ask';\n const enableSearch = !isAskMode && !!options.enableWebSearch;\n \n // 对于不支持原生搜索的模型,需要强制包含 web_search 工具\n const forceInclude = enableSearch && familyConfig && !modelSupportsNativeSearch(model)\n ? ['web_search']\n : undefined;\n \n const tools = isAskMode ? [] : this.getToolDefinitions(options.enabledTools, forceInclude);\n \n // 只有家族支持 thinking 且用户启用时才真正启用\n const enableThinking = !isAskMode && thinkingMode === 'enabled' && (familyConfig?.supportsThinking ?? false);\n\n // 使用传入的历史\n const history = options.history || [];\n\n // 构建 Orchestrator 上下文\n const context: OrchestratorContext = {\n systemPrompt,\n history,\n tools,\n signal,\n images,\n };\n \n try {\n // 使用 Orchestrator + UnifiedAdapter\n yield* this.orchestrator.chat(this.adapter, message, context, {\n model,\n enableThinking,\n enableSearch,\n autoRunConfig: options.autoRunConfig,\n });\n } finally {\n this.abortController = null;\n }\n }\n\n /** 中断当前请求 */\n abort(): void {\n if (this.abortController) {\n this.abortController.abort();\n }\n }\n\n /** 设置当前工作目录 */\n setCwd(dir: string): void {\n this.config.cwd = dir;\n }\n\n /** 获取当前配置 */\n getConfig(): RuntimeConfig {\n return { ...this.config };\n }\n\n /** 获取所有支持的模型 */\n getSupportedModels() {\n return MODELS;\n }\n}\n","/**\n * 获取当前工作目录工具(Vite 插件风格)\n */\nimport type { ToolPlugin } from '../types';\nimport { tool } from '../types';\n\nexport function getCwdTool(): ToolPlugin {\n return tool({\n name: 'get_cwd',\n description: '获取用户当前工作目录的绝对路径。当你需要知道用户在哪个目录下工作时使用。',\n parameters: {\n type: 'object',\n properties: {},\n required: []\n },\n execute: async (_args, context) => {\n return JSON.stringify({ cwd: context.cwd });\n }\n });\n}\n","/**\n * 获取平台信息工具(Vite 插件风格)\n */\nimport type { ToolPlugin } from '../types';\nimport { tool } from '../types';\n\nexport function getPlatformTool(): ToolPlugin {\n return tool({\n name: 'get_platform',\n description: '获取操作系统信息(macOS/Windows/Linux)。当你需要确定使用哪种命令语法时调用(如 ls vs dir)。',\n parameters: {\n type: 'object',\n properties: {},\n required: []\n },\n execute: async () => {\n // 动态导入 os 模块,避免前端构建时打包\n const os = await import('os');\n const platform = os.default.platform(); // 'darwin' | 'win32' | 'linux'\n const platformName = platform === 'darwin' ? 'macOS' : platform === 'win32' ? 'Windows' : 'Linux';\n const shell = platform === 'win32' ? 'powershell' : 'bash/zsh';\n const pathSeparator = platform === 'win32' ? '\\\\' : '/';\n \n return JSON.stringify({\n platform,\n platformName,\n shell,\n pathSeparator,\n });\n }\n });\n}\n","/**\n * 执行命令工具(Vite 插件风格)\n */\nimport type { ToolPlugin } from '../types';\nimport { tool } from '../types';\n\nexport function executeCommandTool(): ToolPlugin {\n return tool({\n name: 'execute_command',\n description: '执行 shell 命令。执行前建议先用 get_cwd 获取当前目录、get_platform 获取系统类型,以确保使用正确的路径和命令语法。',\n parameters: {\n type: 'object',\n properties: {\n command: { type: 'string', description: '要执行的命令' },\n cwd: { type: 'string', description: '执行命令的目录(不传则使用用户当前工作目录)' }\n },\n required: ['command']\n },\n execute: async (args, context) => {\n const cwd = (args.cwd as string | undefined) || context.cwd;\n const result = await context.executeCommand(args.command as string, cwd);\n \n if (result.success) {\n return result.output || '执行成功';\n }\n \n // 检查是否是取消操作\n if (result.error === '操作已取消') {\n return JSON.stringify({ success: false, error: '操作已取消', cancelled: true });\n }\n \n return `错误: ${result.error}`;\n }\n });\n}\n","/**\n * Gemini 媒体处理模块\n * \n * 负责图片分析、图片生成、视频分析\n */\n\nimport type { GoogleGenAI } from '@google/genai';\nimport { GEMINI_IMAGE_MODEL, GEMINI_IMAGE_GEN_MODEL } from './constants';\n\n/** 获取图片 MIME 类型 */\nfunction getMimeType(ext: string): string {\n const types: Record<string, string> = {\n '.jpg': 'image/jpeg',\n '.jpeg': 'image/jpeg',\n '.png': 'image/png',\n '.gif': 'image/gif',\n '.webp': 'image/webp'\n };\n return types[ext] || 'image/jpeg';\n}\n\n/** 获取视频 MIME 类型 */\nfunction getVideoMimeType(ext: string): string {\n const types: Record<string, string> = {\n '.mp4': 'video/mp4',\n '.mov': 'video/quicktime',\n '.avi': 'video/x-msvideo',\n '.webm': 'video/webm'\n };\n return types[ext] || 'video/mp4';\n}\n\n/**\n * 分析图片\n */\nexport async function analyzeImage(\n geminiClient: GoogleGenAI,\n imagePath: string, \n question?: string,\n signal?: AbortSignal\n): Promise<string> {\n try {\n if (signal?.aborted) {\n return JSON.stringify({ success: false, error: '操作已取消', cancelled: true });\n }\n \n const fs = await import('fs/promises');\n const path = await import('path');\n \n const imageData = await fs.readFile(imagePath);\n const base64 = imageData.toString('base64');\n const ext = path.extname(imagePath).toLowerCase();\n const mimeType = getMimeType(ext);\n\n const response = await geminiClient.models.generateContent({\n model: GEMINI_IMAGE_MODEL,\n contents: [{\n role: 'user',\n parts: [\n { text: question || '请详细描述这张图片的内容' },\n { inlineData: { mimeType, data: base64 } }\n ]\n }],\n config: { abortSignal: signal }\n });\n\n return response.text || '无法分析图片';\n } catch (error) {\n if (signal?.aborted) return JSON.stringify({ success: false, error: '操作已取消', cancelled: true });\n return `图片分析失败: ${error}`;\n }\n}\n\n/**\n * 生成图片\n */\nexport async function generateImage(\n geminiClient: GoogleGenAI,\n cwd: string,\n prompt: string, \n outputPath?: string,\n signal?: AbortSignal\n): Promise<string> {\n try {\n // 检查是否已取消\n if (signal?.aborted) {\n return JSON.stringify({ success: false, error: '操作已取消' });\n }\n \n const response = await geminiClient.models.generateContent({\n model: GEMINI_IMAGE_GEN_MODEL,\n contents: [{ role: 'user', parts: [{ text: prompt }] }],\n config: { abortSignal: signal }\n });\n\n for (const part of response.candidates?.[0]?.content?.parts || []) {\n if (part.inlineData) {\n const imageData = Buffer.from(part.inlineData.data as string, 'base64');\n \n // 根据 mimeType 确定文件扩展名\n const mimeType = part.inlineData.mimeType || 'image/png';\n const ext = mimeType === 'image/jpeg' ? '.jpg' : \n mimeType === 'image/webp' ? '.webp' : '.png';\n \n const fs = await import('fs/promises');\n const savePath = outputPath || `${cwd}/generated_${Date.now()}${ext}`;\n await fs.writeFile(savePath, imageData);\n \n // 返回简洁的 JSON 结果(业界标准格式)\n return JSON.stringify({\n success: true,\n path: savePath,\n format: mimeType\n });\n }\n }\n\n return JSON.stringify({ success: false, error: '图片生成失败' });\n } catch (error) {\n // 取消错误特殊处理\n if (signal?.aborted) {\n return JSON.stringify({ success: false, error: '操作已取消', cancelled: true });\n }\n return JSON.stringify({ success: false, error: `图片生成失败: ${error}` });\n }\n}\n\n/**\n * 分析视频\n */\nexport async function analyzeVideo(\n geminiClient: GoogleGenAI,\n videoPath: string, \n question?: string,\n signal?: AbortSignal\n): Promise<string> {\n try {\n if (signal?.aborted) {\n return JSON.stringify({ success: false, error: '操作已取消', cancelled: true });\n }\n \n const fs = await import('fs/promises');\n const path = await import('path');\n \n const videoData = await fs.readFile(videoPath);\n const base64 = videoData.toString('base64');\n const ext = path.extname(videoPath).toLowerCase();\n const mimeType = getVideoMimeType(ext);\n\n const response = await geminiClient.models.generateContent({\n model: GEMINI_IMAGE_MODEL,\n contents: [{\n role: 'user',\n parts: [\n { text: question || '请详细描述这个视频的内容' },\n { inlineData: { mimeType, data: base64 } }\n ]\n }],\n config: { abortSignal: signal }\n });\n\n return response.text || '无法分析视频';\n } catch (error) {\n if (signal?.aborted) return JSON.stringify({ success: false, error: '操作已取消', cancelled: true });\n return `视频分析失败: ${error}`;\n }\n}\n\n","/**\n * 分析图片工具(Vite 插件风格)\n */\nimport type { ToolPlugin } from '../types';\nimport { tool } from '../types';\nimport type { GoogleGenAI } from '@google/genai';\nimport { analyzeImage } from '../gemini';\n\nexport function analyzeImageTool(): ToolPlugin {\n return tool({\n name: 'analyze_image',\n description: '分析图片内容(识别物体、场景、文字等)',\n parameters: {\n type: 'object',\n properties: {\n imagePath: { type: 'string', description: '图片文件路径' },\n question: { type: 'string', description: '关于图片的问题(可选)' }\n },\n required: ['imagePath']\n },\n execute: async (args, context) => {\n if (!context.geminiClient) {\n return '错误: 未配置 Gemini API Key,无法使用图片分析功能';\n }\n return await analyzeImage(\n context.geminiClient as GoogleGenAI,\n args.imagePath as string,\n args.question as string | undefined,\n context.signal\n );\n }\n });\n}\n","/**\n * 生成图片工具(Vite 插件风格)\n */\nimport type { ToolPlugin } from '../types';\nimport { tool } from '../types';\nimport type { GoogleGenAI } from '@google/genai';\nimport { generateImage } from '../gemini';\n\nexport function generateImageTool(): ToolPlugin {\n return tool({\n name: 'generate_image',\n description: '根据文字描述生成图片并保存到本地。返回保存路径。',\n parameters: {\n type: 'object',\n properties: {\n prompt: { type: 'string', description: '图片描述,使用详细的英文描述效果更好' },\n outputPath: { type: 'string', description: '保存路径(可选)' }\n },\n required: ['prompt']\n },\n // 图片生成完成后通知用户\n sideEffects: [{ type: 'notification', success: true, message: '🎨 图片生成完成' }],\n execute: async (args, context) => {\n if (!context.geminiClient) {\n return '错误: 未配置 Gemini API Key,无法使用图片生成功能';\n }\n return await generateImage(\n context.geminiClient as GoogleGenAI,\n context.cwd,\n args.prompt as string,\n args.outputPath as string | undefined,\n context.signal\n );\n }\n });\n}\n","/**\n * 分析视频工具(Vite 插件风格)\n */\nimport type { ToolPlugin } from '../types';\nimport { tool } from '../types';\nimport type { GoogleGenAI } from '@google/genai';\nimport { analyzeVideo } from '../gemini';\n\nexport function analyzeVideoTool(): ToolPlugin {\n return tool({\n name: 'analyze_video',\n description: '分析视频内容(识别场景、动作、物体等)',\n parameters: {\n type: 'object',\n properties: {\n videoPath: { type: 'string', description: '视频文件路径' },\n question: { type: 'string', description: '关于视频的问题(可选)' }\n },\n required: ['videoPath']\n },\n execute: async (args, context) => {\n if (!context.geminiClient) {\n return '错误: 未配置 Gemini API Key,无法使用视频分析功能';\n }\n return await analyzeVideo(\n context.geminiClient as GoogleGenAI,\n args.videoPath as string,\n args.question as string | undefined,\n context.signal\n );\n }\n });\n}\n","/**\n * 全国 337 个地级市 adcode 映射\n * 数据来源:高德开放平台城市编码表\n * https://lbs.amap.com/api/webservice/download\n */\n\nexport const CITY_ADCODE_MAP: Record<string, string> = {\n // 直辖市\n '北京': '110000',\n '天津': '120000',\n '上海': '310000',\n '重庆': '500000',\n // 河北省\n '石家庄': '130100',\n '唐山': '130200',\n '秦皇岛': '130300',\n '邯郸': '130400',\n '邢台': '130500',\n '保定': '130600',\n '张家口': '130700',\n '承德': '130800',\n '沧州': '130900',\n '廊坊': '131000',\n '衡水': '131100',\n // 山西省\n '太原': '140100',\n '大同': '140200',\n '阳泉': '140300',\n '长治': '140400',\n '晋城': '140500',\n '朔州': '140600',\n '晋中': '140700',\n '运城': '140800',\n '忻州': '140900',\n '临汾': '141000',\n '吕梁': '141100',\n // 内蒙古自治区\n '呼和浩特': '150100',\n '包头': '150200',\n '乌海': '150300',\n '赤峰': '150400',\n '通辽': '150500',\n '鄂尔多斯': '150600',\n '呼伦贝尔': '150700',\n '巴彦淖尔': '150800',\n '乌兰察布': '150900',\n '兴安盟': '152200',\n '锡林郭勒盟': '152500',\n '阿拉善盟': '152900',\n // 辽宁省\n '沈阳': '210100',\n '大连': '210200',\n '鞍山': '210300',\n '抚顺': '210400',\n '本溪': '210500',\n '丹东': '210600',\n '锦州': '210700',\n '营口': '210800',\n '阜新': '210900',\n '辽阳': '211000',\n '盘锦': '211100',\n '铁岭': '211200',\n '朝阳': '211300',\n '葫芦岛': '211400',\n // 吉林省\n '长春': '220100',\n '吉林': '220200',\n '四平': '220300',\n '辽源': '220400',\n '通化': '220500',\n '白山': '220600',\n '松原': '220700',\n '白城': '220800',\n '延边朝鲜族自治州': '222400',\n // 黑龙江省\n '哈尔滨': '230100',\n '齐齐哈尔': '230200',\n '鸡西': '230300',\n '鹤岗': '230400',\n '双鸭山': '230500',\n '大庆': '230600',\n '伊春': '230700',\n '佳木斯': '230800',\n '七台河': '230900',\n '牡丹江': '231000',\n '黑河': '231100',\n '绥化': '231200',\n '大兴安岭地区': '232700',\n // 江苏省\n '南京': '320100',\n '无锡': '320200',\n '徐州': '320300',\n '常州': '320400',\n '苏州': '320500',\n '南通': '320600',\n '连云港': '320700',\n '淮安': '320800',\n '盐城': '320900',\n '扬州': '321000',\n '镇江': '321100',\n '泰州': '321200',\n '宿迁': '321300',\n // 浙江省\n '杭州': '330100',\n '宁波': '330200',\n '温州': '330300',\n '嘉兴': '330400',\n '湖州': '330500',\n '绍兴': '330600',\n '金华': '330700',\n '衢州': '330800',\n '舟山': '330900',\n '台州': '331000',\n '丽水': '331100',\n // 安徽省\n '合肥': '340100',\n '芜湖': '340200',\n '蚌埠': '340300',\n '淮南': '340400',\n '马鞍山': '340500',\n '淮北': '340600',\n '铜陵': '340700',\n '安庆': '340800',\n '黄山': '341000',\n '滁州': '341100',\n '阜阳': '341200',\n '宿州': '341300',\n '六安': '341500',\n '亳州': '341600',\n '池州': '341700',\n '宣城': '341800',\n // 福建省\n '福州': '350100',\n '厦门': '350200',\n '莆田': '350300',\n '三明': '350400',\n '泉州': '350500',\n '漳州': '350600',\n '南平': '350700',\n '龙岩': '350800',\n '宁德': '350900',\n // 江西省\n '南昌': '360100',\n '景德镇': '360200',\n '萍乡': '360300',\n '九江': '360400',\n '新余': '360500',\n '鹰潭': '360600',\n '赣州': '360700',\n '吉安': '360800',\n '宜春': '360900',\n '抚州': '361000',\n '上饶': '361100',\n // 山东省\n '济南': '370100',\n '青岛': '370200',\n '淄博': '370300',\n '枣庄': '370400',\n '东营': '370500',\n '烟台': '370600',\n '潍坊': '370700',\n '济宁': '370800',\n '泰安': '370900',\n '威海': '371000',\n '日照': '371100',\n '临沂': '371300',\n '德州': '371400',\n '聊城': '371500',\n '滨州': '371600',\n '菏泽': '371700',\n // 河南省\n '郑州': '410100',\n '开封': '410200',\n '洛阳': '410300',\n '平顶山': '410400',\n '安阳': '410500',\n '鹤壁': '410600',\n '新乡': '410700',\n '焦作': '410800',\n '濮阳': '410900',\n '许昌': '411000',\n '漯河': '411100',\n '三门峡': '411200',\n '南阳': '411300',\n '商丘': '411400',\n '信阳': '411500',\n '周口': '411600',\n '驻马店': '411700',\n // 湖北省\n '武汉': '420100',\n '黄石': '420200',\n '十堰': '420300',\n '宜昌': '420500',\n '襄阳': '420600',\n '鄂州': '420700',\n '荆门': '420800',\n '孝感': '420900',\n '荆州': '421000',\n '黄冈': '421100',\n '咸宁': '421200',\n '随州': '421300',\n '恩施土家族苗族自治州': '422800',\n // 湖南省\n '长沙': '430100',\n '株洲': '430200',\n '湘潭': '430300',\n '衡阳': '430400',\n '邵阳': '430500',\n '岳阳': '430600',\n '常德': '430700',\n '张家界': '430800',\n '益阳': '430900',\n '郴州': '431000',\n '永州': '431100',\n '怀化': '431200',\n '娄底': '431300',\n '湘西土家族苗族自治州': '433100',\n // 广东省\n '广州': '440100',\n '韶关': '440200',\n '深圳': '440300',\n '珠海': '440400',\n '汕头': '440500',\n '佛山': '440600',\n '江门': '440700',\n '湛江': '440800',\n '茂名': '440900',\n '肇庆': '441200',\n '惠州': '441300',\n '梅州': '441400',\n '汕尾': '441500',\n '河源': '441600',\n '阳江': '441700',\n '清远': '441800',\n '东莞': '441900',\n '中山': '442000',\n '潮州': '445100',\n '揭阳': '445200',\n '云浮': '445300',\n // 广西壮族自治区\n '南宁': '450100',\n '柳州': '450200',\n '桂林': '450300',\n '梧州': '450400',\n '北海': '450500',\n '防城港': '450600',\n '钦州': '450700',\n '贵港': '450800',\n '玉林': '450900',\n '百色': '451000',\n '贺州': '451100',\n '河池': '451200',\n '来宾': '451300',\n '崇左': '451400',\n // 海南省\n '海口': '460100',\n '三亚': '460200',\n '三沙': '460300',\n '儋州': '460400',\n // 四川省\n '成都': '510100',\n '自贡': '510300',\n '攀枝花': '510400',\n '泸州': '510500',\n '德阳': '510600',\n '绵阳': '510700',\n '广元': '510800',\n '遂宁': '510900',\n '内江': '511000',\n '乐山': '511100',\n '南充': '511300',\n '眉山': '511400',\n '宜宾': '511500',\n '广安': '511600',\n '达州': '511700',\n '雅安': '511800',\n '巴中': '511900',\n '资阳': '512000',\n '阿坝藏族羌族自治州': '513200',\n '甘孜藏族自治州': '513300',\n '凉山彝族自治州': '513400',\n // 贵州省\n '贵阳': '520100',\n '六盘水': '520200',\n '遵义': '520300',\n '安顺': '520400',\n '毕节': '520500',\n '铜仁': '520600',\n '黔西南布依族苗族自治州': '522300',\n '黔东南苗族侗族自治州': '522600',\n '黔南布依族苗族自治州': '522700',\n // 云南省\n '昆明': '530100',\n '曲靖': '530300',\n '玉溪': '530400',\n '保山': '530500',\n '昭通': '530600',\n '丽江': '530700',\n '普洱': '530800',\n '临沧': '530900',\n '楚雄彝族自治州': '532300',\n '红河哈尼族彝族自治州': '532500',\n '文山壮族苗族自治州': '532600',\n '西双版纳傣族自治州': '532800',\n '大理白族自治州': '532900',\n '德宏傣族景颇族自治州': '533100',\n '怒江傈僳族自治州': '533300',\n '迪庆藏族自治州': '533400',\n // 西藏自治区\n '拉萨': '540100',\n '日喀则': '540200',\n '昌都': '540300',\n '林芝': '540400',\n '山南': '540500',\n '那曲': '540600',\n '阿里地区': '542500',\n // 陕西省\n '西安': '610100',\n '铜川': '610200',\n '宝鸡': '610300',\n '咸阳': '610400',\n '渭南': '610500',\n '延安': '610600',\n '汉中': '610700',\n '榆林': '610800',\n '安康': '610900',\n '商洛': '611000',\n // 甘肃省\n '兰州': '620100',\n '嘉峪关': '620200',\n '金昌': '620300',\n '白银': '620400',\n '天水': '620500',\n '武威': '620600',\n '张掖': '620700',\n '平凉': '620800',\n '酒泉': '620900',\n '庆阳': '621000',\n '定西': '621100',\n '陇南': '621200',\n '临夏回族自治州': '622900',\n '甘南藏族自治州': '623000',\n // 青海省\n '西宁': '630100',\n '海东': '630200',\n '海北藏族自治州': '632200',\n '黄南藏族自治州': '632300',\n '海南藏族自治州': '632500',\n '果洛藏族自治州': '632600',\n '玉树藏族自治州': '632700',\n '海西蒙古族藏族自治州': '632800',\n // 宁夏回族自治区\n '银川': '640100',\n '石嘴山': '640200',\n '吴忠': '640300',\n '固原': '640400',\n '中卫': '640500',\n // 新疆维吾尔自治区\n '乌鲁木齐': '650100',\n '克拉玛依': '650200',\n '吐鲁番': '650400',\n '哈密': '650500',\n '昌吉回族自治州': '652300',\n '博尔塔拉蒙古自治州': '652700',\n '巴音郭楞蒙古自治州': '652800',\n '阿克苏地区': '652900',\n '克孜勒苏柯尔克孜自治州': '653000',\n '喀什地区': '653100',\n '和田地区': '653200',\n '伊犁哈萨克自治州': '654000',\n '塔城地区': '654200',\n '阿勒泰地区': '654300',\n};\n\n/**\n * 根据城市名获取 adcode\n * 支持模糊匹配(如 \"北京市\" -> \"北京\")\n */\nexport function getCityAdcode(cityName: string): string | null {\n // 直接匹配\n if (CITY_ADCODE_MAP[cityName]) {\n return CITY_ADCODE_MAP[cityName];\n }\n \n // 去掉 \"市\"、\"省\"、\"区\" 后缀再匹配\n const normalized = cityName.replace(/[市省区]$/, '');\n if (CITY_ADCODE_MAP[normalized]) {\n return CITY_ADCODE_MAP[normalized];\n }\n \n // 简称匹配(如 \"延边\" -> \"延边朝鲜族自治州\")\n for (const [name, code] of Object.entries(CITY_ADCODE_MAP)) {\n if (name.startsWith(cityName) || cityName.startsWith(name.slice(0, 2))) {\n return code;\n }\n }\n \n return null;\n}\n","/**\n * 天气查询工具(Vite 插件风格)\n * \n * 使用高德天气 API\n * - 稳定可靠,国内服务\n * - 支持全国 337 个地级市\n * - 中文输出\n * \n * 返回数据格式匹配 @huyooo/ai-chat-shared 的 WeatherData 类型\n */\n\nimport type { ToolPlugin } from '../../types';\nimport { tool } from '../../types';\nimport { getCityAdcode } from './city-adcodes';\n\n/** 高德天气 API 响应 - 实况天气 */\ninterface AmapWeatherLive {\n province: string;\n city: string;\n adcode: string;\n weather: string;\n temperature: string;\n winddirection: string;\n windpower: string;\n humidity: string;\n reporttime: string;\n}\n\n/** 高德天气 API 响应 */\ninterface AmapWeatherResponse {\n status: string;\n count: string;\n info: string;\n infocode: string;\n lives?: AmapWeatherLive[];\n}\n\n/** 高德天气 API Key(Web服务类型) */\nconst AMAP_KEY = '16924e39cfd78c645f0035c1bc290961';\n\nexport function getWeatherTool(): ToolPlugin {\n return tool({\n name: 'get_weather',\n description: '获取指定城市的实时天气信息。支持全国 337 个地级市,包括:北京、上海、广州、深圳、杭州、成都、武汉、西安、南京、苏州、重庆、天津等。返回温度、天气状况、湿度、风向风力等信息。\\n\\n注意:工具结果会以可视化卡片形式自动显示给用户。\\n- 请不要在回复中用列表/表格重复展示卡片里已有字段(城市、温度、天气、湿度、风力、时间等)。\\n- 你只需要给出一句到三句\"结论/建议\"(如穿衣、防晒、出行提醒)。\\n- 只有用户明确追问具体数值时,再补充数据。',\n // 结果类型:前端会生成 { type: 'weather', ...result } 的 Part\n resultType: 'weather',\n parameters: {\n type: 'object',\n properties: {\n city: { \n type: 'string', \n description: '城市名称,如 \"北京\"、\"上海\"、\"深圳\"、\"杭州\"' \n },\n },\n required: ['city'],\n },\n execute: async (args, context) => {\n const city = args.city as string;\n \n // 检查是否已取消\n if (context.signal?.aborted) {\n return JSON.stringify({ success: false, error: '操作已取消', cancelled: true });\n }\n \n // 获取城市 adcode\n const adcode = getCityAdcode(city);\n if (!adcode) {\n return JSON.stringify({ \n error: `不支持的城市: ${city}`,\n tip: '请输入地级市名称,如:北京、上海、广州、深圳',\n });\n }\n\n try {\n // 调用高德天气 API,传递取消信号\n const url = `https://restapi.amap.com/v3/weather/weatherInfo?key=${AMAP_KEY}&city=${adcode}&extensions=base&output=JSON`;\n const response = await fetch(url, { signal: context.signal });\n \n if (!response.ok) {\n return JSON.stringify({ error: `天气服务请求失败: ${response.status}` });\n }\n\n const data = await response.json() as AmapWeatherResponse;\n \n // 检查返回状态\n if (data.status !== '1' || data.infocode !== '10000') {\n return JSON.stringify({ error: `天气服务返回错误: ${data.info}` });\n }\n \n if (!data.lives?.length) {\n return JSON.stringify({ error: '未获取到天气数据' });\n }\n\n const live = data.lives[0];\n \n // 返回格式匹配 WeatherData 类型\n return JSON.stringify({\n city: live.city,\n temperature: parseInt(live.temperature, 10),\n condition: live.weather,\n humidity: parseInt(live.humidity, 10),\n wind: `${live.winddirection}风 ${live.windpower}级`,\n reportTime: live.reporttime,\n province: live.province,\n });\n } catch (error) {\n // 取消错误特殊处理\n if (context.signal?.aborted) {\n return JSON.stringify({ success: false, error: '操作已取消', cancelled: true });\n }\n return JSON.stringify({ \n success: false,\n error: `获取天气失败: ${error instanceof Error ? error.message : '网络错误'}`,\n });\n }\n }\n });\n}\n","import type { ToolPlugin, ToolResult } from '../../types';\nimport { tool } from '../../types';\n\nfunction getStringArg(args: Record<string, unknown>, key: string): string | null {\n const value = args[key];\n return typeof value === 'string' ? value : null;\n}\n\n/**\n * 显示 Toast 通知\n */\nexport function showToastTool(): ToolPlugin {\n return tool({\n name: 'show_toast',\n description: '在用户界面上显示一条Toast 通知消息,用于告知用户操作结果或重要提示信息,消息会在几秒后自动消失',\n parameters: {\n type: 'object',\n properties: {\n message: { type: 'string', description: '要显示给用户的通知内容' },\n },\n required: ['message'],\n },\n execute: async (args): Promise<ToolResult> => {\n const message = getStringArg(args, 'message');\n if (!message) throw new Error('参数错误:message 必须是 string');\n return {\n result: JSON.stringify({ success: true }),\n sideEffects: [{ type: 'notification', success: true, message }],\n };\n },\n });\n}\n\n\n","import type { ToolPlugin, ToolResult } from '../../types';\nimport { tool } from '../../types';\n\nfunction getStringArg(args: Record<string, unknown>, key: string): string | null {\n const value = args[key];\n return typeof value === 'string' ? value : null;\n}\n\n/**\n * 打开确认对话框\n */\nexport function openConfirmDialogTool(): ToolPlugin {\n return tool({\n name: 'open_confirm_dialog',\n description: '在用户界面上弹出一个模态确认对话框。',\n parameters: {\n type: 'object',\n properties: {\n title: { type: 'string', description: '对话框标题,简要说明确认的操作' },\n message: { type: 'string', description: '详细描述需要用户确认的内容' },\n confirmText: { type: 'string', description: '确认按钮文字,默认为\"确认\"' },\n cancelText: { type: 'string', description: '取消按钮文字,默认为\"取消\"' },\n },\n required: ['title', 'message'],\n },\n execute: async (args): Promise<ToolResult> => {\n const title = getStringArg(args, 'title');\n const message = getStringArg(args, 'message');\n if (!title) throw new Error('参数错误:title 必须是 string');\n if (!message) throw new Error('参数错误:message 必须是 string');\n\n const confirmText = getStringArg(args, 'confirmText') ?? '确认';\n const cancelText = getStringArg(args, 'cancelText') ?? '取消';\n\n return {\n result: JSON.stringify({ success: true }),\n sideEffects: [\n {\n type: 'ui:confirm_dialog',\n success: true,\n data: {\n title,\n message,\n confirmText,\n cancelText,\n },\n },\n ],\n };\n },\n });\n}\n\n\n","import type { ToolPlugin, ToolResult } from '../../types';\nimport { tool } from '../../types';\n\nfunction getStringArg(args: Record<string, unknown>, key: string): string | null {\n const value = args[key];\n return typeof value === 'string' ? value : null;\n}\n\ntype MediaType = 'image' | 'video' | 'audio';\nfunction getMediaTypeArg(args: Record<string, unknown>, key: string): MediaType | null {\n const value = args[key];\n if (value === 'image' || value === 'video' || value === 'audio') return value;\n return null;\n}\n\n/**\n * 打开文件预览(由宿主 UI 消费 ui:file_preview 副作用实现)\n */\nexport function openFilePreviewTool(): ToolPlugin {\n return tool({\n name: 'open_file_preview',\n description:\n '在用户界面上打开文件预览窗口,让用户查看指定文件的内容(宿主需处理 ui:file_preview sideEffect)。',\n parameters: {\n type: 'object',\n properties: {\n path: { type: 'string', description: '要预览的文件的完整路径' },\n mediaType: {\n type: 'string',\n description: '预览类型(必填):image/video/audio。宿主不会再根据后缀推断。',\n enum: ['image', 'video', 'audio'],\n },\n },\n required: ['path', 'mediaType'],\n },\n execute: async (args): Promise<ToolResult> => {\n const path = getStringArg(args, 'path');\n if (!path) throw new Error('参数错误:path 必须是 string');\n\n const mediaTypeValue = getMediaTypeArg(args, 'mediaType');\n if (!mediaTypeValue) throw new Error('参数错误:mediaType 必须是 \"image\" | \"video\" | \"audio\"');\n\n return {\n result: JSON.stringify({ success: true, path, mediaType: mediaTypeValue }),\n sideEffects: [\n {\n type: 'ui:file_preview',\n success: true,\n data: { path, mediaType: mediaTypeValue },\n },\n ],\n };\n },\n });\n}\n\n\n","import type { ToolPlugin, ToolResult } from '../../types';\nimport { tool } from '../../types';\n\nfunction getStringArg(args: Record<string, unknown>, key: string): string | null {\n const value = args[key];\n return typeof value === 'string' ? value : null;\n}\n\n/**\n * 跳转到指定目录(由宿主 UI 消费 ui:navigate 副作用实现)\n */\nexport function navigateToDirectoryTool(): ToolPlugin {\n return tool({\n name: 'navigate_to_directory',\n description: '控制用户界面左侧的文件浏览器跳转到指定目录,让用户可以直接看到该目录下的文件列表',\n parameters: {\n type: 'object',\n properties: {\n path: { type: 'string', description: '要跳转到的目录的完整路径' },\n },\n required: ['path'],\n },\n execute: async (args): Promise<ToolResult> => {\n const path = getStringArg(args, 'path');\n if (!path) throw new Error('参数错误:path 必须是 string');\n return {\n result: JSON.stringify({ success: true, path }),\n sideEffects: [\n {\n type: 'ui:navigate',\n success: true,\n data: { path },\n },\n ],\n };\n },\n });\n}\n\n\n","/**\n * UI 动作工具(非兼容版入口)\n *\n * 说明:\n * - 每个工具实现拆分在同目录下\n * - 该目录的 index.ts 作为唯一入口(不再保留 ../ui-actions.ts 的兼容层)\n */\n\nimport { showToastTool } from './show-toast';\nimport { openConfirmDialogTool } from './open-confirm-dialog';\nimport { openFilePreviewTool } from './open-file-preview';\nimport { navigateToDirectoryTool } from './navigate-to-directory';\n\nexport { showToastTool, openConfirmDialogTool, openFilePreviewTool, navigateToDirectoryTool };\n\n/**\n * UI 动作工具集合(用于快速注入)\n */\nexport const uiActionTools = [\n showToastTool(),\n openConfirmDialogTool(),\n openFilePreviewTool(),\n navigateToDirectoryTool(),\n];\n\n\n","/**\n * 文档搜索工具集成\n *\n * 可选依赖 @huyooo/ai-search\n * 如果未安装,工具会返回友好提示\n *\n * 注意:这个模块使用 eval + require 来避免 tsup 打包时解析依赖\n */\n\nimport type { Tool } from '../types'\n\n/**\n * 搜索工具配置\n */\nexport interface SearchToolsOptions {\n /** 搜索数据存储目录 */\n dataDir?: string\n /** 默认索引目录(首次使用时自动索引) */\n defaultDirectories?: string[]\n /** 是否在初始化时自动索引 */\n autoIndex?: boolean\n}\n\n/**\n * 搜索工具接口(来自 ai-search)\n */\ninterface AiSearchModule {\n searchPlugin: (options: {\n dataDir: string\n workspace?: string\n }) => Promise<{\n tools: Tool[]\n [key: string]: unknown\n }>\n}\n\n// 缓存\nlet aiSearchModule: AiSearchModule | null = null\n\n/**\n * 动态加载 ai-search 模块\n *\n * 使用 Function 构造器来避免 tsup/esbuild 分析依赖\n */\nasync function loadAiSearch(): Promise<AiSearchModule | null> {\n if (aiSearchModule) return aiSearchModule\n\n try {\n // 使用 Function 构造器避免静态分析\n // eslint-disable-next-line @typescript-eslint/no-implied-eval\n const dynamicRequire = new Function(\n 'moduleName',\n 'return import(moduleName)'\n ) as (name: string) => Promise<unknown>\n\n const mod = await dynamicRequire('@huyooo/ai-search')\n aiSearchModule = mod as AiSearchModule\n return aiSearchModule\n } catch {\n // 模块未安装\n return null\n }\n}\n\n/**\n * 创建文档搜索工具\n *\n * 如果 @huyooo/ai-search 未安装,返回占位工具(提示用户安装)\n *\n * @example\n * ```typescript\n * import { createDocumentSearchTools } from '@huyooo/ai-chat-core';\n *\n * const searchTools = await createDocumentSearchTools({\n * dataDir: './.search-data',\n * defaultDirectories: ['~/Documents'],\n * });\n *\n * const agent = new HybridAgent({\n * ...config,\n * tools: [...otherTools, ...searchTools],\n * });\n * ```\n */\nexport async function createDocumentSearchTools(\n options?: SearchToolsOptions\n): Promise<Tool[]> {\n const mod = await loadAiSearch()\n\n if (!mod) {\n // ai-search 未安装,返回占位工具\n return [createPlaceholderTool()]\n }\n\n const dataDir = options?.dataDir || './.search-data'\n \n // 使用新的 Vite 插件风格 API\n const plugin = await mod.searchPlugin({\n dataDir,\n // 如果配置了默认目录且自动索引,使用第一个目录作为工作空间\n workspace: options?.autoIndex && options?.defaultDirectories?.length\n ? expandPath(options.defaultDirectories[0])\n : undefined,\n })\n\n return plugin.tools\n}\n\n/**\n * 占位工具(ai-search 未安装时使用)\n */\nfunction createPlaceholderTool(): Tool {\n return {\n name: 'search_local_documents',\n description: '搜索本地文档(需要安装 @huyooo/ai-search)',\n parameters: {\n type: 'object',\n properties: {\n query: {\n type: 'string',\n description: '搜索内容',\n },\n },\n required: ['query'],\n },\n execute: async () => {\n return JSON.stringify({\n error: '文档搜索功能未启用',\n solution: '请安装 @huyooo/ai-search: npm install @huyooo/ai-search',\n })\n },\n }\n}\n\n/**\n * 展开 ~ 路径\n */\nfunction expandPath(p: string): string {\n if (p.startsWith('~')) {\n return p.replace('~', process.env.HOME || '')\n }\n return p\n}\n\n/**\n * 获取搜索插件实例(高级用法)\n */\nexport async function getDocumentSearchInstance(\n dataDir = './.search-data',\n workspace?: string\n): Promise<{ tools: Tool[]; [key: string]: unknown } | null> {\n const mod = await loadAiSearch()\n if (!mod) return null\n\n return await mod.searchPlugin({ dataDir, workspace })\n}\n"]}