@huyooo/ai-chat-core 0.1.6 → 0.1.8

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/types.ts","../src/tools.ts","../src/constants.ts","../src/providers/ark.ts","../src/providers/qwen.ts","../src/providers/gemini.ts","../src/providers/openrouter.ts","../src/gemini.ts","../src/agent.ts"],"names":["MODEL_CAPABILITIES","DEFAULT_CAPABILITIES","GoogleGenAI"],"mappings":"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","file":"index.js","sourcesContent":["/**\n * AI Chat Core 类型定义\n */\n\n// ==================== 模式与模型 ====================\n\n/** 对话模式 */\nexport type ChatMode = 'agent' | 'plan' | 'ask';\n\n/** 可用模型 */\nexport type ModelProvider = 'doubao' | 'deepseek' | 'qwen' | 'gemini' | 'openrouter';\n\n/** 模型配置 */\nexport interface ModelConfig {\n provider: ModelProvider;\n model: string;\n displayName: string;\n supportsTools: boolean;\n supportsWebSearch: boolean;\n /** 支持的深度思考模式 */\n supportedThinkingModes: ThinkingMode[];\n}\n\n/** 预定义模型列表 */\nexport const AVAILABLE_MODELS: ModelConfig[] = [\n {\n provider: 'doubao',\n model: 'doubao-seed-1-6-251015',\n displayName: '豆包 Seed',\n supportsTools: true,\n supportsWebSearch: true,\n supportedThinkingModes: ['enabled', 'disabled']\n },\n {\n provider: 'deepseek',\n model: 'deepseek-v3-1-terminus',\n displayName: 'DeepSeek V3',\n supportsTools: true,\n supportsWebSearch: true,\n // 注意:火山引擎托管的 DeepSeek V3.1 不支持 auto 模式\n supportedThinkingModes: ['enabled', 'disabled']\n },\n // 通义千问 - 混合思考模式(默认不开启)\n {\n provider: 'qwen',\n model: 'qwen3-max-preview',\n displayName: '通义千问 Max',\n supportsTools: true,\n supportsWebSearch: true,\n supportedThinkingModes: ['enabled', 'disabled']\n },\n {\n provider: 'qwen',\n model: 'qwen-plus',\n displayName: '通义千问 Plus',\n supportsTools: true,\n supportsWebSearch: true,\n supportedThinkingModes: ['enabled', 'disabled']\n },\n // Gemini 3 - Google 最新推理模型\n {\n provider: 'gemini',\n model: 'gemini-3-pro-preview',\n displayName: 'Gemini 3 Pro',\n supportsTools: true,\n supportsWebSearch: true, // 支持 Google Search grounding\n supportedThinkingModes: ['enabled', 'disabled'] // thinking_level: high/low\n },\n // OpenRouter - Claude Opus 4.5\n {\n provider: 'openrouter',\n model: 'anthropic/claude-opus-4.5',\n displayName: 'Claude Opus 4.5',\n supportsTools: true,\n supportsWebSearch: true, // 通过 :online 后缀或 plugins 支持\n supportedThinkingModes: ['enabled', 'disabled'] // Claude 扩展思考\n }\n];\n\n// ==================== 配置 ====================\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 /** 工作目录 */\n workingDir?: string;\n}\n\n/** 深度思考模式 */\nexport type ThinkingMode = 'enabled' | 'disabled';\n\n/** 聊天配置(每次聊天可变的选项) */\nexport interface ChatOptions {\n /** 对话模式 */\n mode?: ChatMode;\n /** 使用的模型 */\n model?: string;\n /** 模型提供商 */\n provider?: ModelProvider;\n /** 是否启用联网搜索 */\n enableWebSearch?: boolean;\n /** \n * 深度思考模式\n * - 'enabled': 强制开启深度思考\n * - 'disabled': 强制关闭深度思考\n */\n thinkingMode?: ThinkingMode;\n /** 深度思考预算(token 数,仅 enabled 时有效) */\n thinkingBudget?: number;\n}\n\n// ==================== 进度事件 ====================\n\n/** 聊天进度事件类型 */\nexport type ChatProgressType = \n | 'thinking' // 思考中\n | 'search_start' // 开始搜索\n | 'search_result' // 搜索结果\n | 'tool_call' // 调用工具\n | 'tool_result' // 工具结果\n | 'text' // 文本输出\n | 'text_delta' // 流式文本增量\n | 'image' // 图片输出\n | 'video' // 视频输出\n | 'done' // 完成\n | 'error'; // 错误\n\n/** 聊天进度事件 */\nexport interface ChatProgress {\n type: ChatProgressType;\n data: unknown;\n}\n\n/** 工具调用进度 */\nexport interface ToolCallProgress {\n type: 'tool_call';\n data: {\n name: string;\n args: Record<string, unknown>;\n };\n}\n\n/** 工具结果进度 */\nexport interface ToolResultProgress {\n type: 'tool_result';\n data: {\n name: string;\n result: string;\n };\n}\n\n/** 搜索开始进度 */\nexport interface SearchStartProgress {\n type: 'search_start';\n data: {\n query: string;\n };\n}\n\n/** 搜索结果进度 */\nexport interface SearchResultProgress {\n type: 'search_result';\n data: {\n results: Array<{\n title: string;\n url: string;\n snippet: string;\n }>;\n };\n}\n\n/** 文本进度 */\nexport interface TextProgress {\n type: 'text';\n data: string;\n}\n\n/** 流式文本增量 */\nexport interface TextDeltaProgress {\n type: 'text_delta';\n data: string;\n}\n\n/** 思考进度 */\nexport interface ThinkingProgress {\n type: 'thinking';\n data: {\n content: string;\n isComplete?: boolean;\n };\n}\n\n/** 图片进度 */\nexport interface ImageProgress {\n type: 'image';\n data: {\n path?: string;\n base64?: string;\n };\n}\n\n// ==================== 工具相关 ====================\n\n/** 工具执行器接口(可由使用方实现) */\nexport interface ToolExecutor {\n /** 执行 Shell 命令 */\n executeCommand(command: string, workingDir?: string): Promise<{ success: boolean; output?: string; error?: string }>;\n /** 读取文件 */\n readFile?(path: string): Promise<Buffer>;\n /** 写入文件 */\n writeFile?(path: string, data: Buffer): Promise<void>;\n /** 读取目录 */\n readDirectory?(path: string): Promise<string[]>;\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(豆包 Responses API 需要) */\n id?: string;\n role: 'system' | 'user' | 'assistant' | 'tool';\n content: string;\n /** 深度思考内容(DeepSeek 思考模式下需要回传) */\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/** DeepSeek Responses API 消息格式 */\nexport interface DeepSeekMessage {\n role: 'user' | 'assistant';\n content: Array<{\n type: 'input_text' | 'output_text';\n text: string;\n }>;\n}\n\n/** DeepSeek / 火山引擎 Responses API 工具定义 */\nexport interface DeepSeekTool {\n type: 'function' | 'web_search';\n function?: {\n name: string;\n description: string;\n parameters: Record<string, unknown>;\n };\n // web_search 工具参数\n max_keyword?: number; // 最大并行搜索关键词数量 [1, 50]\n limit?: number; // 单轮搜索最大召回条数 [1, 50],默认10\n sources?: string[]; // 附加内容源: 'toutiao', 'douyin', 'moji'\n}\n","/**\n * 工具定义和默认执行器\n */\n\nimport type { ToolDefinition, ToolExecutor } from './types';\n\n// 默认工作目录\nconst DEFAULT_WORKING_DIR = process.cwd();\n\n/**\n * 创建工具定义\n */\nexport function createToolDefinitions(workingDir: string = DEFAULT_WORKING_DIR): ToolDefinition[] {\n return [\n {\n type: 'function',\n function: {\n name: 'execute_command',\n description: `执行 shell 命令来完成文件管理任务。支持:ls、find、cat、head、tail、du、file 等命令。默认工作目录:${workingDir}`,\n parameters: {\n type: 'object',\n properties: {\n command: { type: 'string', description: '要执行的 shell 命令' },\n workingDir: { type: 'string', description: '工作目录(可选)' }\n },\n required: ['command']\n }\n }\n },\n {\n type: 'function',\n function: {\n name: 'analyze_image',\n description: `分析图片内容。可以识别图片中的物体、场景、文字、人物等。支持的图片格式:jpg、jpeg、png、gif、webp`,\n parameters: {\n type: 'object',\n properties: {\n imagePath: { type: 'string', description: '图片文件的完整路径' },\n question: { type: 'string', description: '关于图片的问题(可选)' }\n },\n required: ['imagePath']\n }\n }\n },\n {\n type: 'function',\n function: {\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 },\n {\n type: 'function',\n function: {\n name: 'analyze_video',\n description: `分析视频内容。可以识别视频中的场景、动作、物体等。支持的视频格式:mp4、mov、avi、webm`,\n parameters: {\n type: 'object',\n properties: {\n videoPath: { type: 'string', description: '视频文件的完整路径' },\n question: { type: 'string', description: '关于视频的问题(可选)' }\n },\n required: ['videoPath']\n }\n }\n }\n ];\n}\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 */\nexport function createDefaultToolExecutor(workingDir: string = DEFAULT_WORKING_DIR): ToolExecutor {\n return {\n async executeCommand(command: string, cwd?: string) {\n if (isDangerousCommand(command)) {\n return { success: false, error: '该命令被安全策略阻止' };\n }\n\n try {\n const { exec } = await import('child_process');\n const { promisify } = await import('util');\n const execAsync = promisify(exec);\n\n const { stdout, stderr } = await execAsync(command, {\n cwd: cwd || workingDir,\n timeout: 30000,\n maxBuffer: 1024 * 1024 * 10,\n shell: '/bin/sh'\n });\n\n return { success: true, output: (stdout || stderr || '').trim() };\n } catch (error) {\n return { success: false, error: String(error) };\n }\n },\n\n async readFile(path: string) {\n const fs = await import('fs/promises');\n return fs.readFile(path);\n },\n\n async writeFile(path: string, data: Buffer) {\n const fs = await import('fs/promises');\n await fs.writeFile(path, data);\n },\n\n async readDirectory(path: string) {\n const fs = await import('fs/promises');\n return fs.readdir(path);\n }\n };\n}\n\n","/**\n * 常量定义\n */\n\n// API 默认配置\nexport const DEFAULT_ARK_URL = 'https://ark.cn-beijing.volces.com/api/v3';\n// 通义千问使用 DashScope 原生协议以支持搜索引用\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';\nexport const DEFAULT_MODEL = 'doubao-seed-1-6-251015';\nexport const GEMINI_IMAGE_MODEL = 'gemini-2.0-flash';\nexport const GEMINI_IMAGE_GEN_MODEL = 'gemini-3-pro-image-preview';\nexport const MAX_ITERATIONS = 10;\n\n/** 模式对应的系统提示词 */\nexport const MODE_PROMPTS: Record<string, string> = {\n agent: `你可以使用工具完成任务。直接调用工具,完成后简洁总结结果。`,\n\n plan: `分析需求并制定执行计划,以 Markdown 格式输出,等待确认后执行。`,\n\n ask: `直接回答问题,不知道就说不知道。`\n};\n\n","/**\n * ARK Provider (火山引擎)\n * \n * 统一使用 Responses API,支持:\n * - 函数调用 Function Calling\n * - 联网搜索 Web Search\n * - 深度思考 Thinking\n * - 上下文缓存 Caching\n * \n * 支持模型:豆包 (doubao-*), DeepSeek (deepseek-*)\n */\n\nimport type { ChatProgress, ChatMessage, ChatOptions, ThinkingMode } from '../types';\nimport type { ChatProvider, ChatContext, ModelCapabilities } from './base';\nimport { createToolDefinitions } from '../tools';\nimport { MAX_ITERATIONS, DEFAULT_ARK_URL } from '../constants';\n\n/** ARK Provider 配置 */\nexport interface ArkProviderConfig {\n apiKey: string;\n apiUrl?: string;\n /** 是否启用上下文缓存 */\n enableCaching?: boolean;\n}\n\n/** 支持的模型 */\nconst ARK_MODELS = [\n 'doubao-seed-1-6-251015',\n 'deepseek-v3-1-terminus'\n];\n\n/** 模型能力映射 */\nconst MODEL_CAPABILITIES: Record<string, ModelCapabilities> = {\n 'doubao-seed-1-6-251015': {\n supportsTools: true,\n supportsWebSearch: true,\n supportsThinking: true,\n supportedThinkingModes: ['enabled', 'disabled']\n },\n 'deepseek-v3-1-terminus': {\n supportsTools: true,\n supportsWebSearch: true,\n supportsThinking: true,\n supportedThinkingModes: ['enabled', 'disabled']\n }\n};\n\n/** 默认能力 */\nconst DEFAULT_CAPABILITIES: ModelCapabilities = {\n supportsTools: true,\n supportsWebSearch: true,\n supportsThinking: true,\n supportedThinkingModes: ['enabled', 'disabled']\n};\n\n/** 判断是否为 DeepSeek 模型 */\nfunction isDeepSeekModel(model: string): boolean {\n return model.toLowerCase().startsWith('deepseek');\n}\n\n/** Responses API 工具定义格式 */\ninterface ResponsesApiTool {\n type: 'function' | 'web_search';\n // Function 类型\n name?: string;\n description?: string;\n parameters?: unknown;\n // Web Search 类型\n max_keyword?: number;\n limit?: number;\n}\n\n/** 转换工具定义为 Responses API 格式 */\nfunction convertToResponsesApiTools(tools: unknown[]): ResponsesApiTool[] {\n return tools.map((tool: unknown) => {\n const t = tool as { type: string; function: { name: string; description: string; parameters: unknown } };\n return {\n type: 'function' as const,\n name: t.function.name,\n description: t.function.description,\n parameters: t.function.parameters\n };\n });\n}\n\n/** 转换消息为 Responses API 输入格式 */\nfunction convertToResponsesApiInput(\n systemPrompt: string,\n history: ChatMessage[],\n message: string\n): unknown[] {\n const input: unknown[] = [];\n \n // 系统提示词\n input.push({\n role: 'system',\n content: systemPrompt\n });\n \n // 历史消息\n for (const msg of history) {\n if (msg.role === 'user') {\n input.push({\n role: 'user',\n content: [{ type: 'input_text', text: msg.content }]\n });\n } else if (msg.role === 'assistant') {\n // 豆包 Responses API 不直接支持 assistant 角色\n // 将 assistant 回复转换为 developer 角色的上下文提示\n input.push({\n role: 'developer',\n content: `[上一轮AI回复]: ${msg.content}`\n });\n }\n }\n \n // 当前用户消息\n input.push({\n role: 'user',\n content: [{ type: 'input_text', text: message }]\n });\n \n return input;\n}\n\n/**\n * ARK Provider 实现\n * \n * 统一使用 Responses API\n */\nexport class ArkProvider implements ChatProvider {\n readonly name = 'ark';\n readonly supportedModels = ARK_MODELS;\n \n private apiKey: string;\n private apiUrl: string;\n private enableCaching: boolean;\n\n constructor(config: ArkProviderConfig) {\n this.apiKey = config.apiKey;\n this.apiUrl = config.apiUrl || DEFAULT_ARK_URL;\n this.enableCaching = config.enableCaching ?? false;\n }\n\n supportsModel(model: string): boolean {\n return ARK_MODELS.includes(model) || \n model.startsWith('doubao-') || \n model.startsWith('deepseek-');\n }\n\n getModelCapabilities(model: string): ModelCapabilities {\n return MODEL_CAPABILITIES[model] || DEFAULT_CAPABILITIES;\n }\n\n /**\n * 聊天入口 - 统一使用 Responses API\n */\n async *chat(\n message: string,\n model: string,\n options: ChatOptions,\n context: ChatContext\n ): AsyncGenerator<ChatProgress> {\n // isDeepSeekModel 用于特定模型的特殊处理(如有需要)\n // const isDeepSeek = isDeepSeekModel(model);\n const showThinking = options.thinkingMode === 'enabled';\n const enableWebSearch = options.enableWebSearch === true;\n \n if (showThinking) {\n yield { type: 'thinking', data: { content: '正在思考...', isComplete: false } };\n }\n\n // 不再提前发送 search_start,等模型真正开始搜索时再发送\n let searchStarted = false;\n\n // 准备工具\n const tools: ResponsesApiTool[] = [];\n \n // 添加联网搜索工具\n if (enableWebSearch) {\n tools.push({\n type: 'web_search',\n max_keyword: 5,\n limit: 20\n });\n }\n \n // 添加函数调用工具(非 ask 模式)\n if (options.mode !== 'ask') {\n const functionTools = createToolDefinitions(context.workingDir);\n tools.push(...convertToResponsesApiTools(functionTools));\n }\n\n // 准备输入\n const input = convertToResponsesApiInput(context.systemPrompt, context.history, message);\n\n let iterations = 0;\n let finalText = '';\n let thinkingComplete = !showThinking;\n let searchComplete = !enableWebSearch;\n let searchResults: Array<{ title: string; url: string; snippet: string }> = [];\n let hasExecutedTools = false;\n\n // 用于累积函数调用参数\n const pendingFunctionCalls = new Map<string, { name: string; arguments: string }>();\n \n while (iterations < MAX_ITERATIONS) {\n if (context.signal.aborted) {\n yield { type: 'error', data: '请求已取消' };\n return;\n }\n\n iterations++;\n\n try {\n // 构建请求\n const requestBody: Record<string, unknown> = {\n model,\n stream: true,\n max_output_tokens: 32768,\n input\n };\n\n if (tools.length > 0) {\n requestBody.tools = tools;\n }\n\n // 深度思考配置\n // 工具调用后禁用思考避免循环(所有模型通用)\n // 原因:深度思考会导致模型\"忘记\"已执行的工具,重新思考并再次调用\n const effectiveThinkingMode = hasExecutedTools \n ? 'disabled' \n : options.thinkingMode;\n \n if (effectiveThinkingMode) {\n const thinkingConfig: Record<string, unknown> = {\n type: effectiveThinkingMode\n };\n if (effectiveThinkingMode === 'enabled' && options.thinkingBudget) {\n thinkingConfig.budget_tokens = options.thinkingBudget;\n }\n requestBody.thinking = thinkingConfig;\n }\n\n // 上下文缓存\n if (this.enableCaching) {\n requestBody.caching = { 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: context.signal\n });\n\n if (!response.ok) {\n const errorText = await response.text();\n throw new Error(`Responses API 错误: ${response.status} - ${errorText}`);\n }\n\n const reader = response.body?.getReader();\n if (!reader) {\n throw new Error('无法获取响应流');\n }\n\n const decoder = new TextDecoder();\n let buffer = '';\n let currentFunctionCallId: string | null = null;\n let needsFunctionExecution = false;\n\n while (true) {\n if (context.signal.aborted) {\n reader.cancel();\n yield { type: 'error', data: '请求已取消' };\n return;\n }\n\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 === '[DONE]') continue;\n\n try {\n const event = JSON.parse(data);\n \n // 处理不同事件类型\n switch (event.type) {\n // 添加输出项\n case 'response.output_item.added': {\n const item = event.item;\n if (item?.type === 'web_search_call') {\n // 模型真正开始搜索时才发送 search_start\n if (!searchStarted) {\n searchStarted = true;\n yield { \n type: 'search_start', \n data: { query: item.query || message } \n };\n }\n } else if (item?.type === 'function_call') {\n // 函数调用开始\n const callId = item.id || `call_${Date.now()}`;\n currentFunctionCallId = callId;\n pendingFunctionCalls.set(callId, {\n name: item.name || '',\n arguments: ''\n });\n }\n break;\n }\n \n // 函数名称\n case 'response.function_call.name': {\n if (currentFunctionCallId) {\n const call = pendingFunctionCalls.get(currentFunctionCallId);\n if (call) {\n call.name = event.name || call.name;\n }\n }\n break;\n }\n \n // 函数参数增量\n case 'response.function_call_arguments.delta': {\n if (currentFunctionCallId) {\n const call = pendingFunctionCalls.get(currentFunctionCallId);\n if (call) {\n call.arguments += event.delta || '';\n }\n }\n break;\n }\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.name) {\n // 确保函数调用信息完整\n const callId = item.id || currentFunctionCallId || `call_${Date.now()}`;\n pendingFunctionCalls.set(callId, {\n name: item.name,\n arguments: item.arguments || pendingFunctionCalls.get(callId)?.arguments || '{}'\n });\n needsFunctionExecution = true;\n }\n // 搜索完成时,item 可能包含搜索关键词\n if (item?.type === 'web_search_call' && item.action?.query) {\n // 可以在这里更新搜索查询,但引用还在文本中\n }\n break;\n }\n \n // 搜索进行中(官方事件类型)\n case 'response.web_search_call.in_progress': {\n // 搜索正在进行,可用于状态更新\n break;\n }\n \n // 搜索完成(官方事件类型)\n case 'response.web_search_call.completed': {\n // 搜索已完成,但引用在后续文本中\n // 不在这里发送结果,等 response.done 时统一发送\n break;\n }\n \n // 搜索引用(流式收集,最后统一发送)\n case 'response.output_text.annotation.added': {\n const annotation = event.annotation;\n // 支持多种可能的类型名称\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 console.log('[ARK] 收集到搜索引用:', annotation.url);\n }\n }\n break;\n }\n \n // 文本输出增量\n case 'response.output_text.delta': {\n // 文本开始输出,意味着思考完成\n if (!thinkingComplete) {\n thinkingComplete = true;\n yield { type: 'thinking', data: { content: '', isComplete: true } };\n }\n // 注意:搜索结果在 response.done 时发送,因为 url_citation 可能在文本输出期间交错到达\n const delta = event.delta || '';\n finalText += delta;\n yield { type: 'text_delta', data: delta };\n break;\n }\n \n // 深度思考内容增量\n case 'response.reasoning_summary_text.delta': {\n yield { \n type: 'thinking', \n data: { content: event.delta || '', isComplete: false } \n };\n break;\n }\n \n // 深度思考完成\n case 'response.reasoning_summary_text.done': {\n thinkingComplete = true;\n yield { \n type: 'thinking', \n data: { content: '', isComplete: true } \n };\n break;\n }\n \n // 响应完成\n case 'response.done': {\n // 只有真正开始过搜索才发送搜索结果\n if (searchStarted && !searchComplete) {\n searchComplete = true;\n console.log('[ARK] 发送搜索结果:', searchResults.length, '条');\n yield { type: 'search_result', data: { results: searchResults, isComplete: true } };\n }\n break;\n }\n \n default: {\n // 调试:记录未处理的事件类型(可用于发现新事件)\n if (event.type && !event.type.startsWith('response.created') && \n !event.type.startsWith('rate_limits')) {\n // console.log('[ARK] 未处理事件:', event.type, JSON.stringify(event).slice(0, 200));\n }\n }\n }\n } catch {\n // 忽略解析错误\n }\n }\n }\n\n // 执行函数调用\n if (needsFunctionExecution && pendingFunctionCalls.size > 0) {\n for (const [callId, call] of pendingFunctionCalls) {\n if (!call.name) continue;\n\n let args: Record<string, unknown>;\n try {\n args = JSON.parse(call.arguments || '{}');\n } catch {\n yield { type: 'error', data: `工具参数解析失败: ${call.arguments}` };\n // 添加错误结果到输入\n input.push({\n type: 'function_call_output',\n call_id: callId,\n output: '参数解析错误'\n });\n continue;\n }\n\n yield { type: 'tool_call', data: { name: call.name, args } };\n\n const result = await context.executeTool(call.name, args);\n\n yield { type: 'tool_result', data: { name: call.name, result } };\n\n // 添加函数结果到输入(用于下一轮)\n input.push({\n type: 'function_call_output',\n call_id: callId,\n output: result\n });\n\n hasExecutedTools = true;\n }\n\n // 清空待执行的函数调用\n pendingFunctionCalls.clear();\n \n // 继续下一轮(让模型处理函数结果)\n continue;\n }\n\n // 无函数调用,结束循环\n break;\n\n } catch (error) {\n if (context.signal.aborted) {\n yield { type: 'error', data: '请求已取消' };\n } else {\n yield { type: 'error', data: String(error) };\n }\n break;\n }\n }\n\n // 确保状态完成\n if (!thinkingComplete) {\n yield { type: 'thinking', data: { content: '', isComplete: true } };\n }\n \n // 只有真正开始过搜索才需要发送搜索结果\n if (searchStarted && !searchComplete) {\n yield { type: 'search_result', data: { results: searchResults, isComplete: true } };\n }\n\n // 更新对话历史\n context.history.push({ role: 'user', content: message });\n context.history.push({ role: 'assistant', content: finalText || '完成' });\n\n yield { type: 'text', data: finalText };\n yield { type: 'done', data: finalText };\n }\n}\n","/**\n * Qwen Provider (通义千问)\n * \n * 使用 DashScope 原生协议以获得完整功能:\n * - 联网搜索引用 (search_info)\n * - 角标标注 (enable_citation)\n * - 深度思考 (enable_thinking)\n */\n\nimport type { ChatProgress, ChatMessage, ChatOptions } from '../types';\nimport type { ChatProvider, ChatContext, ModelCapabilities } from './base';\nimport { createToolDefinitions } from '../tools';\nimport { MAX_ITERATIONS, DEFAULT_QWEN_NATIVE_URL } from '../constants';\n\n/** Qwen Provider 配置 */\nexport interface QwenProviderConfig {\n apiKey: string;\n apiUrl?: string;\n}\n\n/** 支持的模型 */\nconst QWEN_MODELS = [\n 'qwen3-max-preview',\n 'qwen-plus'\n];\n\n/** 模型能力映射 */\nconst MODEL_CAPABILITIES: Record<string, ModelCapabilities> = {\n 'qwen3-max-preview': {\n supportsTools: true,\n supportsWebSearch: true,\n supportsThinking: true,\n supportedThinkingModes: ['enabled', 'disabled']\n },\n 'qwen-plus': {\n supportsTools: true,\n supportsWebSearch: true,\n supportsThinking: true,\n supportedThinkingModes: ['enabled', 'disabled']\n }\n};\n\n/** 默认能力 */\nconst DEFAULT_CAPABILITIES: ModelCapabilities = {\n supportsTools: true,\n supportsWebSearch: true,\n supportsThinking: true,\n supportedThinkingModes: ['enabled', 'disabled']\n};\n\n/** 搜索结果项 */\ninterface SearchResultItem {\n index: number;\n title: string;\n url: string;\n snippet?: string;\n}\n\n/** DashScope 流式事件 */\ninterface DashScopeStreamEvent {\n output: {\n choices?: Array<{\n message: {\n content?: string;\n reasoning_content?: string;\n tool_calls?: Array<{\n id?: string;\n index?: number;\n type: string;\n function: {\n name: string;\n arguments: string;\n };\n }>;\n };\n finish_reason?: string;\n }>;\n search_info?: {\n search_results: SearchResultItem[];\n };\n };\n}\n\n/**\n * Qwen Provider 实现\n */\nexport class QwenProvider implements ChatProvider {\n readonly name = 'qwen';\n readonly supportedModels = QWEN_MODELS;\n \n private apiKey: string;\n private apiUrl: string;\n\n constructor(config: QwenProviderConfig) {\n this.apiKey = config.apiKey;\n this.apiUrl = config.apiUrl || DEFAULT_QWEN_NATIVE_URL;\n }\n\n supportsModel(model: string): boolean {\n return QWEN_MODELS.includes(model) || model.startsWith('qwen');\n }\n\n getModelCapabilities(model: string): ModelCapabilities {\n return MODEL_CAPABILITIES[model] || DEFAULT_CAPABILITIES;\n }\n\n async *chat(\n message: string,\n model: string,\n options: ChatOptions,\n context: ChatContext\n ): AsyncGenerator<ChatProgress> {\n const showThinking = options.thinkingMode === 'enabled';\n const enableSearch = options.enableWebSearch === true;\n\n if (showThinking) {\n yield { type: 'thinking', data: { content: '正在思考...', isComplete: false } };\n }\n\n if (enableSearch) {\n yield { type: 'search_start', data: { query: message } };\n }\n\n // 准备工具\n const tools = options.mode === 'ask' \n ? [] \n : createToolDefinitions(context.workingDir).map(t => ({\n type: 'function',\n function: {\n name: t.function.name,\n description: t.function.description,\n parameters: t.function.parameters\n }\n }));\n\n // 准备消息\n const messages: ChatMessage[] = [\n { role: 'system', content: context.systemPrompt },\n ...context.history,\n { role: 'user', content: message }\n ];\n\n let iterations = 0;\n let finalText = '';\n let thinkingContent = '';\n let thinkingComplete = !showThinking;\n let searchComplete = !enableSearch;\n let searchResults: SearchResultItem[] = [];\n let hasExecutedTools = false;\n\n while (iterations < MAX_ITERATIONS) {\n if (context.signal.aborted) {\n yield { type: 'error', data: '请求已取消' };\n return;\n }\n\n iterations++;\n\n try {\n const toolCallsMap = new Map<number, { id: string; name: string; arguments: string }>();\n\n // 工具调用后禁用深度思考避免循环(与 ARK 保持一致)\n const effectiveEnableThinking = hasExecutedTools ? false : showThinking;\n \n for await (const event of this.callDashScopeStream(\n model, \n messages, \n tools,\n { enableSearch, enableThinking: effectiveEnableThinking, thinkingBudget: options.thinkingBudget },\n context.signal\n )) {\n const choice = event.output?.choices?.[0];\n \n // 处理搜索结果\n if (event.output?.search_info?.search_results && !searchComplete) {\n searchResults = event.output.search_info.search_results;\n searchComplete = true;\n yield { \n type: 'search_result', \n data: { \n results: searchResults.map(r => ({\n title: r.title,\n url: r.url,\n snippet: r.snippet || ''\n })),\n isComplete: true \n } \n };\n }\n\n if (!choice) continue;\n\n const msg = choice.message;\n\n // 处理思考过程\n if (msg.reasoning_content && !thinkingComplete) {\n thinkingContent += msg.reasoning_content;\n yield { type: 'thinking', data: { content: msg.reasoning_content, isComplete: false } };\n }\n\n // 处理文本内容\n if (msg.content) {\n if (!thinkingComplete) {\n thinkingComplete = true;\n yield { type: 'thinking', data: { content: '', isComplete: true } };\n }\n finalText += msg.content;\n yield { type: 'text_delta', data: msg.content };\n }\n\n // 处理工具调用(流式累积参数)\n if (msg.tool_calls?.length) {\n for (const tc of msg.tool_calls) {\n const index = tc.index ?? 0;\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()}_${index}`,\n name: tc.function?.name || '',\n arguments: tc.function?.arguments || ''\n });\n }\n }\n }\n\n if (choice.finish_reason === 'stop' || choice.finish_reason === 'length' || choice.finish_reason === 'tool_calls') {\n break;\n }\n }\n \n const currentToolCalls = Array.from(toolCallsMap.values()).filter(tc => tc.name);\n\n if (!thinkingComplete) {\n thinkingComplete = true;\n yield { type: 'thinking', data: { content: '', isComplete: true } };\n }\n\n // 执行工具调用\n if (currentToolCalls.length > 0) {\n messages.push({\n role: 'assistant',\n content: finalText || '',\n tool_calls: currentToolCalls.map(tc => ({\n id: tc.id,\n type: 'function' as const,\n function: {\n name: tc.name,\n arguments: tc.arguments\n }\n }))\n });\n\n for (const tc of currentToolCalls) {\n const name = tc.name;\n let args: Record<string, unknown>;\n \n try {\n args = JSON.parse(tc.arguments);\n } catch {\n yield { type: 'error', data: `工具参数解析失败: ${tc.arguments}` };\n messages.push({\n role: 'tool',\n tool_call_id: tc.id,\n content: `参数解析错误`\n });\n continue;\n }\n\n yield { type: 'tool_call', data: { name, args } };\n\n const result = await context.executeTool(name, args);\n yield { type: 'tool_result', data: { name, result } };\n\n messages.push({\n role: 'tool',\n tool_call_id: tc.id,\n content: result\n });\n \n hasExecutedTools = true;\n }\n\n finalText = '';\n continue;\n }\n\n break;\n\n } catch (error) {\n if (context.signal.aborted) {\n yield { type: 'error', data: '请求已取消' };\n } else {\n yield { type: 'error', data: String(error) };\n }\n break;\n }\n }\n\n if (!searchComplete) {\n yield { type: 'search_result', data: { results: [], isComplete: true } };\n }\n\n // 更新对话历史\n context.history.push({ role: 'user', content: message });\n context.history.push({ \n role: 'assistant', \n content: finalText || '完成',\n reasoning_content: thinkingContent || undefined\n });\n\n yield { type: 'text', data: finalText };\n yield { type: 'done', data: finalText };\n }\n\n /** 调用 DashScope API (流式) */\n private async *callDashScopeStream(\n model: string,\n messages: ChatMessage[],\n tools: unknown[],\n options: {\n enableSearch: boolean;\n enableThinking: boolean;\n thinkingBudget?: number;\n },\n signal: AbortSignal\n ): AsyncGenerator<DashScopeStreamEvent> {\n // 转换消息格式\n const formattedMessages = messages.map(m => {\n const msg: Record<string, unknown> = {\n role: m.role,\n content: m.content\n };\n if (m.tool_call_id) {\n msg.tool_call_id = m.tool_call_id;\n }\n if (m.tool_calls?.length) {\n msg.tool_calls = m.tool_calls;\n }\n return msg;\n });\n\n const requestBody: Record<string, unknown> = {\n model,\n input: { messages: formattedMessages },\n parameters: {\n result_format: 'message',\n incremental_output: true,\n max_tokens: 32768\n }\n };\n\n const params = requestBody.parameters as Record<string, unknown>;\n\n // 深度思考\n if (options.enableThinking) {\n params.enable_thinking = true;\n if (options.thinkingBudget) {\n params.thinking_budget = options.thinkingBudget;\n }\n }\n\n // 联网搜索\n if (options.enableSearch) {\n params.enable_search = true;\n params.search_options = {\n enable_source: true,\n enable_citation: true,\n search_strategy: 'turbo'\n };\n }\n\n // 工具定义\n if (tools.length > 0) {\n params.tools = tools;\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\n });\n\n if (!response.ok) {\n const errorText = await response.text();\n throw new Error(`DashScope API 错误: ${response.status} - ${errorText}`);\n }\n\n const reader = response.body?.getReader();\n if (!reader) {\n throw new Error('无法获取响应流');\n }\n\n const decoder = new TextDecoder();\n let buffer = '';\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:')) {\n const data = line.slice(5).trim();\n if (data && data !== '[DONE]') {\n try {\n yield JSON.parse(data) as DashScopeStreamEvent;\n } catch {\n // 忽略解析错误\n }\n }\n }\n }\n }\n }\n}\n\n","/**\n * Gemini 3 Provider (Google)\n * \n * 使用 @google/genai SDK\n * \n * Gemini 3 新特性:\n * - thinking_level: 'low' | 'high' (控制推理深度,替代旧的 thinking_budget)\n * - thoughtSignature (维持推理上下文,必须返回给模型)\n * - includeThoughts (返回思考摘要)\n * \n * 限制:\n * - Google Search + 自定义 Function Calling 仍然不兼容\n * - 内置工具可组合:google_search + url_context + code_execution\n * \n * 参考:https://ai.google.dev/docs/gemini-3\n */\n\nimport type { GoogleGenAI } from '@google/genai';\nimport type { ChatProgress, ChatMessage, ChatOptions } from '../types';\nimport type { ChatProvider, ChatContext, ModelCapabilities } from './base';\nimport { createToolDefinitions } from '../tools';\nimport { MAX_ITERATIONS } from '../constants';\n\n/** Gemini Provider 配置 */\nexport interface GeminiProviderConfig {\n apiKey: string;\n}\n\n/** 支持的模型 */\nconst GEMINI_MODELS = [\n 'gemini-3-pro-preview'\n];\n\n/** 模型能力映射 */\nconst MODEL_CAPABILITIES: Record<string, ModelCapabilities> = {\n 'gemini-3-pro-preview': {\n supportsTools: true,\n supportsWebSearch: true,\n supportsThinking: true,\n supportedThinkingModes: ['enabled', 'disabled']\n }\n};\n\n/** 默认能力 */\nconst DEFAULT_CAPABILITIES: ModelCapabilities = {\n supportsTools: true,\n supportsWebSearch: true,\n supportsThinking: true,\n supportedThinkingModes: ['enabled', 'disabled']\n};\n\n/** Gemini groundingMetadata 类型 */\ninterface GroundingMetadata {\n webSearchQueries?: string[];\n groundingChunks?: Array<{\n web?: {\n uri: string;\n title: string;\n };\n }>;\n groundingSupports?: Array<{\n segment: {\n startIndex: number;\n endIndex: number;\n text: string;\n };\n groundingChunkIndices: number[];\n }>;\n}\n\n/**\n * Gemini Provider 实现\n */\nexport class GeminiProvider implements ChatProvider {\n readonly name = 'gemini';\n readonly supportedModels = GEMINI_MODELS;\n \n private geminiClient: GoogleGenAI | null = null;\n private apiKey: string;\n\n constructor(config: GeminiProviderConfig) {\n this.apiKey = config.apiKey;\n }\n\n /** 懒加载 Gemini 客户端 */\n private async getClient(): Promise<GoogleGenAI> {\n if (!this.geminiClient) {\n const { GoogleGenAI } = await import('@google/genai');\n this.geminiClient = new GoogleGenAI({ apiKey: this.apiKey });\n }\n return this.geminiClient;\n }\n\n supportsModel(model: string): boolean {\n return GEMINI_MODELS.includes(model) || model.startsWith('gemini-');\n }\n\n getModelCapabilities(model: string): ModelCapabilities {\n return MODEL_CAPABILITIES[model] || DEFAULT_CAPABILITIES;\n }\n\n async *chat(\n message: string,\n model: string,\n options: ChatOptions,\n context: ChatContext\n ): AsyncGenerator<ChatProgress> {\n const geminiClient = await this.getClient();\n \n const showThinking = options.thinkingMode === 'enabled';\n \n // 准备工具\n const tools = options.mode === 'ask' \n ? [] \n : createToolDefinitions(context.workingDir);\n \n // Gemini 限制:Google Search 和自定义 Function Calling 不能同时使用\n // 在 agent 模式(有工具)时优先使用工具,禁用搜索\n const enableWebSearch = options.enableWebSearch === true && tools.length === 0;\n \n if (showThinking) {\n yield { type: 'thinking', data: { content: '正在思考...', isComplete: false } };\n }\n\n if (enableWebSearch) {\n yield { type: 'search_start', data: { query: message } };\n }\n\n // 转换消息格式为 Gemini 格式\n const geminiMessages = [\n { role: 'user', parts: [{ text: context.systemPrompt }] },\n { role: 'model', parts: [{ text: '好的,我会按照你的指示行事。' }] },\n ...this.convertToGeminiMessages(context.history),\n { role: 'user', parts: [{ text: message }] }\n ];\n\n let iterations = 0;\n let finalText = '';\n let thinkingComplete = !showThinking;\n let searchComplete = !enableWebSearch;\n\n while (iterations < MAX_ITERATIONS) {\n if (context.signal.aborted) {\n yield { type: 'error', data: '请求已取消' };\n return;\n }\n\n iterations++;\n\n try {\n // 构建请求配置\n const generateConfig: Record<string, unknown> = {\n thinkingConfig: {\n thinkingLevel: options.thinkingMode === 'enabled' ? 'high' : 'low',\n // 启用思考摘要返回(Gemini 3 支持)\n includeThoughts: showThinking\n }\n };\n\n // Gemini 限制:Google Search 和自定义 Function Calling 互斥\n // 优先级:有工具时使用工具,否则使用搜索\n if (tools.length > 0) {\n // Agent 模式:使用 Function Calling\n generateConfig.tools = [{\n functionDeclarations: this.convertToGeminiFunctions(tools)\n }];\n } else if (enableWebSearch) {\n // Ask 模式(无工具):使用 Google Search\n generateConfig.tools = [{ googleSearch: {} }];\n }\n\n const response = await geminiClient.models.generateContent({\n model,\n contents: geminiMessages,\n config: generateConfig\n });\n \n const candidate = response.candidates?.[0];\n if (!candidate) {\n yield { type: 'error', data: '无响应' };\n break;\n }\n\n // 解析 groundingMetadata 获取搜索引用\n const rawCandidate = (response as unknown as { candidates: Array<{ groundingMetadata?: GroundingMetadata }> }).candidates?.[0];\n const groundingMetadata = rawCandidate?.groundingMetadata;\n if (groundingMetadata && !searchComplete) {\n searchComplete = true;\n \n const searchResults = (groundingMetadata.groundingChunks || [])\n .filter(chunk => chunk.web)\n .map(chunk => ({\n url: chunk.web!.uri,\n title: chunk.web!.title,\n snippet: ''\n }));\n \n yield { \n type: 'search_result', \n data: { \n results: searchResults,\n queries: groundingMetadata.webSearchQueries,\n isComplete: true \n } \n };\n }\n\n const parts = candidate.content?.parts || [];\n let hasToolCall = false;\n\n for (const part of parts) {\n // 扩展 part 类型以包含 thought 字段\n const extendedPart = part as typeof part & { thought?: boolean };\n \n // 处理思考摘要(Gemini 3 的 includeThoughts 返回)\n if (extendedPart.thought && part.text) {\n yield { type: 'thinking', data: { content: part.text, isComplete: false } };\n continue;\n }\n \n // 处理文本响应(非思考内容)\n if (part.text && !extendedPart.thought) {\n if (!thinkingComplete) {\n thinkingComplete = true;\n yield { type: 'thinking', data: { content: '', isComplete: true } };\n }\n finalText += part.text;\n yield { type: 'text_delta', data: part.text };\n }\n\n // 处理 Function Call(顺序执行)\n if (part.functionCall && part.functionCall.name) {\n hasToolCall = true;\n const name = part.functionCall.name;\n const args = (part.functionCall.args || {}) as Record<string, unknown>;\n const thoughtSignature = (part as unknown as { thoughtSignature?: string }).thoughtSignature;\n\n yield { type: 'tool_call', data: { name, args } };\n\n const result = await context.executeTool(name, args);\n yield { type: 'tool_result', data: { name, result } };\n\n // 添加工具响应到消息历史(包含 thoughtSignature)\n const modelPart: Record<string, unknown> = { functionCall: { name, args } };\n if (thoughtSignature) {\n modelPart.thoughtSignature = thoughtSignature;\n }\n \n geminiMessages.push({\n role: 'model',\n parts: [modelPart as unknown as { text: string }]\n });\n geminiMessages.push({\n role: 'user', \n parts: [{ functionResponse: { name, response: { result } } } as unknown as { text: string }]\n });\n }\n }\n\n if (!hasToolCall) {\n break;\n }\n } catch (error) {\n if (context.signal.aborted) {\n yield { type: 'error', data: '请求已取消' };\n } else {\n yield { type: 'error', data: String(error) };\n }\n break;\n }\n }\n\n if (!thinkingComplete) {\n yield { type: 'thinking', data: { content: '', isComplete: true } };\n }\n \n if (!searchComplete) {\n yield { type: 'search_result', data: { results: [], isComplete: true } };\n }\n\n // 更新对话历史\n context.history.push({ role: 'user', content: message });\n context.history.push({ role: 'assistant', content: finalText || '完成' });\n\n yield { type: 'text', data: finalText };\n yield { type: 'done', data: finalText };\n }\n\n /** 转换消息格式为 Gemini 格式 */\n private convertToGeminiMessages(messages: ChatMessage[]) {\n return messages.map(msg => ({\n role: msg.role === 'assistant' ? 'model' : msg.role,\n parts: [{ text: msg.content as string }]\n }));\n }\n\n /** 转换工具定义为 Gemini functionDeclarations 格式 */\n private convertToGeminiFunctions(tools: unknown[]) {\n return tools.map((tool: unknown) => {\n const t = tool as { type: string; function: { name: string; description: string; parameters: unknown } };\n return {\n name: t.function.name,\n description: t.function.description,\n parameters: t.function.parameters\n };\n });\n }\n}\n\n","/**\n * OpenRouter Provider\n * \n * 使用 OpenAI 兼容格式,支持多种模型:\n * - Claude (anthropic/claude-*)\n * - GPT (openai/gpt-*)\n * - Gemini (google/gemini-*)\n * \n * 特性:\n * - Web Search 插件支持\n * - URL 引用 annotations\n * - Extended Thinking (reasoning) 支持\n */\n\nimport type { ChatProgress, ChatMessage, ChatOptions } from '../types';\nimport type { ChatProvider, ChatContext, ModelCapabilities } from './base';\nimport { createToolDefinitions } from '../tools';\nimport { MAX_ITERATIONS, DEFAULT_OPENROUTER_URL } from '../constants';\n\n/** OpenRouter Provider 配置 */\nexport interface OpenRouterProviderConfig {\n apiKey: string;\n apiUrl?: string;\n}\n\n/** 支持的模型 */\nconst OPENROUTER_MODELS = [\n 'anthropic/claude-opus-4.5'\n];\n\n/** 模型能力映射 */\nconst MODEL_CAPABILITIES: Record<string, ModelCapabilities> = {\n 'anthropic/claude-opus-4.5': {\n supportsTools: true,\n supportsWebSearch: true,\n supportsThinking: true,\n supportedThinkingModes: ['enabled', 'disabled']\n }\n};\n\n/** 默认能力 */\nconst DEFAULT_CAPABILITIES: ModelCapabilities = {\n supportsTools: true,\n supportsWebSearch: true,\n supportsThinking: false,\n supportedThinkingModes: ['disabled']\n};\n\n/** OpenRouter URL 引用注释 */\ninterface UrlCitation {\n url: string;\n title?: string;\n content?: string;\n start_index?: number;\n end_index?: number;\n}\n\n/** OpenRouter 消息注释 */\ninterface MessageAnnotation {\n type: 'url_citation';\n url_citation: UrlCitation;\n}\n\n/** 扩展的消息类型 */\ninterface ExtendedMessage {\n role: string;\n content: string;\n reasoning?: string; // OpenRouter 返回的是字符串格式\n reasoning_details?: Array<{\n format: string;\n type: string;\n text: string;\n signature?: string;\n }>;\n tool_calls?: Array<{\n id: string;\n type: string;\n function: {\n name: string;\n arguments: string;\n };\n }>;\n annotations?: MessageAnnotation[];\n}\n\n/** OpenRouter 响应类型 */\ninterface OpenRouterResponse {\n choices?: Array<{\n message: ExtendedMessage;\n finish_reason: string;\n }>;\n}\n\n/**\n * OpenRouter Provider 实现\n */\nexport class OpenRouterProvider implements ChatProvider {\n readonly name = 'openrouter';\n readonly supportedModels = OPENROUTER_MODELS;\n \n private apiKey: string;\n private apiUrl: string;\n\n constructor(config: OpenRouterProviderConfig) {\n this.apiKey = config.apiKey;\n this.apiUrl = config.apiUrl || DEFAULT_OPENROUTER_URL;\n }\n\n supportsModel(model: string): boolean {\n return OPENROUTER_MODELS.includes(model) || \n model.includes('/'); // OpenRouter 模型格式: provider/model\n }\n\n getModelCapabilities(model: string): ModelCapabilities {\n return MODEL_CAPABILITIES[model] || DEFAULT_CAPABILITIES;\n }\n\n /** 检查模型是否支持 Extended Thinking */\n private supportsThinking(model: string): boolean {\n return model.includes('claude-opus-4.5') || model === 'anthropic/claude-opus-4.5';\n }\n\n async *chat(\n message: string,\n model: string,\n options: ChatOptions,\n context: ChatContext\n ): AsyncGenerator<ChatProgress> {\n const enableThinking = options.thinkingMode === 'enabled' && this.supportsThinking(model);\n const enableWebSearch = options.enableWebSearch === true;\n \n if (enableThinking) {\n yield { type: 'thinking', data: { content: '', isComplete: false } };\n }\n\n if (enableWebSearch) {\n yield { type: 'search_start', data: { query: message } };\n }\n\n // 准备工具\n const tools = options.mode === 'ask' \n ? [] \n : createToolDefinitions(context.workingDir);\n\n // 准备消息\n const messages: ChatMessage[] = [\n { role: 'system', content: context.systemPrompt },\n ...context.history,\n { role: 'user', content: message }\n ];\n\n let iterations = 0;\n let finalText = '';\n let thinkingContent = '';\n let thinkingComplete = !enableThinking;\n let searchComplete = !enableWebSearch;\n\n while (iterations < MAX_ITERATIONS) {\n if (context.signal.aborted) {\n yield { type: 'error', data: '请求已取消' };\n return;\n }\n\n iterations++;\n\n try {\n const response = await this.callOpenRouter(\n model, \n messages, \n tools, \n enableWebSearch,\n enableThinking,\n context.signal\n );\n \n const choice = response.choices?.[0];\n if (!choice) {\n yield { type: 'error', data: '无响应' };\n break;\n }\n\n const responseMessage = choice.message;\n const finishReason = choice.finish_reason;\n\n // 处理 reasoning 内容(OpenRouter Extended Thinking)\n // OpenRouter 返回的 reasoning 是字符串格式\n if (responseMessage.reasoning && !thinkingComplete) {\n thinkingContent = responseMessage.reasoning;\n yield { type: 'thinking', data: { content: responseMessage.reasoning, isComplete: false } };\n }\n\n // 标记思考完成\n if (enableThinking && !thinkingComplete && responseMessage.content) {\n thinkingComplete = true;\n yield { type: 'thinking', data: { content: '', isComplete: true } };\n }\n \n // 解析 annotations 获取搜索结果引用\n if (enableWebSearch && !searchComplete && responseMessage.annotations?.length) {\n searchComplete = true;\n const searchResults = responseMessage.annotations\n .filter(a => a.type === 'url_citation')\n .map(a => ({\n url: a.url_citation.url,\n title: a.url_citation.title || '',\n snippet: a.url_citation.content || ''\n }));\n \n yield { \n type: 'search_result', \n data: { \n results: searchResults,\n isComplete: true \n } \n };\n } else if (enableWebSearch && !searchComplete && iterations === 1) {\n searchComplete = true;\n yield { type: 'search_result', data: { results: [], isComplete: true } };\n }\n\n // 有工具调用\n if (finishReason === 'tool_calls' && responseMessage.tool_calls?.length) {\n messages.push(responseMessage as ChatMessage);\n\n for (const toolCall of responseMessage.tool_calls) {\n const name = toolCall.function.name;\n \n let args: Record<string, unknown>;\n try {\n args = JSON.parse(toolCall.function.arguments);\n } catch {\n yield { type: 'error', data: `工具参数解析失败` };\n messages.push({\n role: 'tool',\n tool_call_id: toolCall.id,\n content: `参数解析错误: ${toolCall.function.arguments}`\n });\n continue;\n }\n\n yield { type: 'tool_call', data: { name, args } };\n\n const result = await context.executeTool(name, args);\n yield { type: 'tool_result', data: { name, result } };\n\n messages.push({\n role: 'tool',\n tool_call_id: toolCall.id,\n content: result\n });\n }\n\n if (responseMessage.content) {\n finalText += responseMessage.content + '\\n';\n yield { type: 'text_delta', data: responseMessage.content };\n }\n \n continue;\n }\n\n // 正常文本响应\n if (responseMessage.content || finishReason === 'stop' || finishReason === 'end_turn') {\n if (responseMessage.content) {\n finalText += responseMessage.content;\n yield { type: 'text_delta', data: responseMessage.content };\n }\n break;\n }\n\n break;\n } catch (error) {\n if (context.signal.aborted) {\n yield { type: 'error', data: '请求已取消' };\n } else {\n yield { type: 'error', data: String(error) };\n }\n break;\n }\n }\n\n if (!thinkingComplete) {\n yield { type: 'thinking', data: { content: '', isComplete: true } };\n }\n \n if (!searchComplete) {\n yield { type: 'search_result', data: { results: [], isComplete: true } };\n }\n\n // 更新对话历史\n context.history.push({ role: 'user', content: message });\n context.history.push({ \n role: 'assistant', \n content: finalText || '完成',\n reasoning_content: thinkingContent || undefined\n });\n\n yield { type: 'text', data: finalText };\n yield { type: 'done', data: finalText };\n }\n\n /** 调用 OpenRouter API */\n private async callOpenRouter(\n model: string,\n messages: ChatMessage[],\n tools: unknown[],\n enableWebSearch: boolean,\n enableThinking: boolean,\n signal: AbortSignal\n ): Promise<OpenRouterResponse> {\n const requestBody: Record<string, unknown> = {\n model,\n messages,\n max_tokens: 32768\n };\n\n // 添加 Extended Thinking 参数(OpenRouter 使用 reasoning)\n if (enableThinking && this.supportsThinking(model)) {\n requestBody.reasoning = {\n effort: 'high',\n exclude: false // 包含推理过程\n };\n }\n\n if (tools.length > 0) {\n requestBody.tools = tools;\n }\n\n if (enableWebSearch) {\n requestBody.plugins = [\n {\n id: 'web',\n max_results: 5\n }\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://github.com/huyooo/ai-chat',\n 'X-Title': 'AI Chat Agent'\n },\n body: JSON.stringify(requestBody),\n signal\n });\n\n if (!response.ok) {\n const errorText = await response.text();\n throw new Error(`OpenRouter API 错误: ${response.status} - ${errorText}`);\n }\n\n return response.json() as Promise<OpenRouterResponse>;\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): Promise<string> {\n try {\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 });\n\n return response.text || '无法分析图片';\n } catch (error) {\n return `图片分析失败: ${error}`;\n }\n}\n\n/**\n * 生成图片\n */\nexport async function generateImage(\n geminiClient: GoogleGenAI,\n workingDir: string,\n prompt: string, \n outputPath?: string\n): Promise<string> {\n try {\n const response = await geminiClient.models.generateContent({\n model: GEMINI_IMAGE_GEN_MODEL,\n contents: [{ role: 'user', parts: [{ text: prompt }] }]\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 if (outputPath) {\n const fs = await import('fs/promises');\n await fs.writeFile(outputPath, imageData);\n return `图片已生成并保存到: ${outputPath}`;\n } else {\n const savePath = `${workingDir}/generated_${Date.now()}${ext}`;\n const fs = await import('fs/promises');\n await fs.writeFile(savePath, imageData);\n return `图片已生成并保存到: ${savePath}`;\n }\n }\n }\n\n return '图片生成失败';\n } catch (error) {\n return `图片生成失败: ${error}`;\n }\n}\n\n/**\n * 分析视频\n */\nexport async function analyzeVideo(\n geminiClient: GoogleGenAI,\n videoPath: string, \n question?: string\n): Promise<string> {\n try {\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 });\n\n return response.text || '无法分析视频';\n } catch (error) {\n return `视频分析失败: ${error}`;\n }\n}\n\n","/**\n * HybridAgent - 混合 AI Agent\n * \n * 使用 Provider 模式支持多模型:\n * - ARK (豆包/DeepSeek) - 火山引擎\n * - Qwen (通义千问) - DashScope\n * - Gemini - Google AI\n * - OpenRouter - Claude 等\n * \n * 架构说明:\n * - ChatProvider: 统一的模型接口\n * - ChatContext: 聊天上下文(历史、工具执行器等)\n * - Agent: 协调者,负责路由和上下文管理\n */\n\nimport { GoogleGenAI } from '@google/genai';\nimport type { \n AgentConfig, \n ChatProgress, \n ToolExecutor,\n ChatMessage,\n ChatOptions,\n ThinkingMode\n} from './types';\nimport { AVAILABLE_MODELS } from './types';\nimport { createDefaultToolExecutor } from './tools';\nimport { DEFAULT_ARK_URL, DEFAULT_QWEN_NATIVE_URL, DEFAULT_OPENROUTER_URL, DEFAULT_MODEL, MODE_PROMPTS } from './constants';\nimport type { ChatProvider, ChatContext } from './providers/base';\nimport { ArkProvider } from './providers/ark';\nimport { QwenProvider } from './providers/qwen';\nimport { GeminiProvider } from './providers/gemini';\nimport { OpenRouterProvider } from './providers/openrouter';\nimport { analyzeImage, generateImage, analyzeVideo } from './gemini';\n\n/** 内部完整配置 */\ninterface InternalConfig {\n arkApiKey: string;\n arkApiUrl: string;\n qwenApiKey: string;\n qwenApiUrl: string;\n openrouterApiKey: string;\n openrouterApiUrl: string;\n geminiApiKey: string;\n workingDir: string;\n}\n\n/**\n * 混合 Agent 类\n * \n * 职责:\n * 1. 管理多个 Provider\n * 2. 路由请求到正确的 Provider\n * 3. 管理对话历史和上下文\n * 4. 处理工具执行\n */\nexport class HybridAgent {\n private config: InternalConfig;\n private providers: Map<string, ChatProvider> = new Map();\n private geminiClient: GoogleGenAI;\n private toolExecutor: ToolExecutor;\n private conversationHistory: ChatMessage[] = [];\n private abortController: AbortController | null = null;\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 workingDir: config.workingDir || process.cwd(),\n };\n\n this.geminiClient = new GoogleGenAI({ apiKey: this.config.geminiApiKey });\n this.toolExecutor = toolExecutor || createDefaultToolExecutor(this.config.workingDir);\n\n // 初始化 Providers\n this.initializeProviders();\n }\n\n /**\n * 初始化所有 Provider\n */\n private initializeProviders(): void {\n // ARK Provider (豆包/DeepSeek)\n if (this.config.arkApiKey) {\n this.providers.set('ark', new ArkProvider({\n apiKey: this.config.arkApiKey,\n apiUrl: this.config.arkApiUrl\n }));\n }\n\n // Qwen Provider (通义千问)\n if (this.config.qwenApiKey) {\n this.providers.set('qwen', new QwenProvider({\n apiKey: this.config.qwenApiKey,\n apiUrl: this.config.qwenApiUrl\n }));\n }\n\n // Gemini Provider\n if (this.config.geminiApiKey) {\n this.providers.set('gemini', new GeminiProvider({\n apiKey: this.config.geminiApiKey\n }));\n }\n\n // OpenRouter Provider\n if (this.config.openrouterApiKey) {\n this.providers.set('openrouter', new OpenRouterProvider({\n apiKey: this.config.openrouterApiKey,\n apiUrl: this.config.openrouterApiUrl\n }));\n }\n }\n \n /**\n * 判断模型提供商\n */\n private getModelProvider(model: string): 'ark' | 'qwen' | 'gemini' | 'openrouter' {\n const lowerModel = model.toLowerCase();\n if (lowerModel.startsWith('qwen')) {\n return 'qwen';\n }\n if (lowerModel.startsWith('gemini')) {\n return 'gemini';\n }\n // OpenRouter 模型格式: provider/model (如 anthropic/claude-opus-4.5)\n if (lowerModel.includes('/')) {\n return 'openrouter';\n }\n return 'ark'; // 豆包和 DeepSeek 都使用火山引擎 ARK\n }\n\n /**\n * 获取 Provider\n */\n private getProvider(model: string): ChatProvider | undefined {\n const providerName = this.getModelProvider(model);\n return this.providers.get(providerName);\n }\n\n /**\n * 构建系统提示词\n */\n private buildSystemPrompt(options: ChatOptions): string {\n const modePrompt = MODE_PROMPTS[options.mode || 'agent'];\n \n const toolsInfo = options.mode === 'ask' ? '' : `\n可用工具:\n1. execute_command - 执行 Shell 命令\n2. analyze_image - 分析图片内容\n3. generate_image - 生成图片\n4. analyze_video - 分析视频内容`;\n\n return `${modePrompt}\n\n当前工作目录:${this.config.workingDir}\n${toolsInfo}`;\n }\n\n /**\n * 获取默认深度思考模式(统一为 disabled)\n */\n private getDefaultThinkingMode(): ThinkingMode {\n return 'disabled';\n }\n\n /**\n * 执行工具\n */\n private async executeTool(name: string, args: Record<string, unknown>): Promise<string> {\n switch (name) {\n case 'execute_command': {\n const result = await this.toolExecutor.executeCommand(\n args.command as string,\n args.workingDir as string | undefined\n );\n return result.success ? (result.output || '执行成功') : `错误: ${result.error}`;\n }\n\n case 'analyze_image':\n return await analyzeImage(\n this.geminiClient,\n args.imagePath as string,\n args.question as string | undefined\n );\n\n case 'generate_image':\n return await generateImage(\n this.geminiClient,\n this.config.workingDir,\n args.prompt as string,\n args.outputPath as string | undefined\n );\n\n case 'analyze_video':\n return await analyzeVideo(\n this.geminiClient,\n args.videoPath as string,\n args.question as string | undefined\n );\n\n default:\n return `未知工具: ${name}`;\n }\n }\n\n /**\n * 聊天入口\n * \n * 使用 Provider 模式路由请求到对应的模型提供商\n */\n async *chat(\n message: string, \n options: ChatOptions = {},\n images?: string[]\n ): AsyncGenerator<ChatProgress> {\n // 创建新的 AbortController\n this.abortController = new AbortController();\n const signal = this.abortController.signal;\n\n // 确定使用的模型\n const model = options.model || DEFAULT_MODEL;\n \n // 获取 Provider\n const provider = this.getProvider(model);\n if (!provider) {\n const providerName = this.getModelProvider(model);\n yield { type: 'error', data: `缺少 ${providerName} Provider 的 API Key` };\n return;\n }\n \n // 确定深度思考模式(如果未指定,统一默认关闭)\n const thinkingMode = options.thinkingMode ?? this.getDefaultThinkingMode();\n const optionsWithThinking = { ...options, thinkingMode };\n\n // 系统提示词\n const systemPrompt = this.buildSystemPrompt(optionsWithThinking);\n\n // 构建聊天上下文\n const context: ChatContext = {\n history: this.conversationHistory,\n systemPrompt,\n workingDir: this.config.workingDir,\n executeTool: this.executeTool.bind(this),\n signal\n };\n \n try {\n // 使用 Provider 处理聊天\n yield* provider.chat(message, model, optionsWithThinking, context);\n } finally {\n this.abortController = null;\n }\n }\n\n /**\n * 中断当前请求\n */\n abort(): void {\n if (this.abortController) {\n this.abortController.abort();\n }\n }\n\n /**\n * 清空对话历史\n */\n clearHistory(): void {\n this.conversationHistory = [];\n }\n\n /**\n * 获取对话历史\n */\n getHistory(): ChatMessage[] {\n return [...this.conversationHistory];\n }\n\n /**\n * 设置工作目录\n */\n setWorkingDir(dir: string): void {\n this.config.workingDir = dir;\n }\n\n /**\n * 获取当前配置\n */\n getConfig(): Required<AgentConfig> {\n return { ...this.config };\n }\n\n /**\n * 获取模型能力\n */\n getModelCapabilities(model: string) {\n const provider = this.getProvider(model);\n return provider?.getModelCapabilities(model);\n }\n\n /**\n * 获取所有支持的模型\n */\n getSupportedModels() {\n return AVAILABLE_MODELS;\n }\n}\n"]}
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.ts","../src/builtin-tools/search-documents.ts"],"names":["tools","result","tool","GoogleGenAI"],"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","/**\n * UI 动作工具(Vite 插件风格)\n * \n * 将前端 UI 事件封装成 AI 可调用的工具\n * 前端通过监听 onToolComplete 的 sideEffects 来执行相应的 UI 操作\n */\nimport type { ToolResult, ToolPlugin } from '../types';\nimport { tool } from '../types';\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 = args.message as string;\n return {\n result: JSON.stringify({ success: true }),\n sideEffects: [{ type: 'notification', success: true, message }]\n };\n }\n });\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 return {\n result: JSON.stringify({ success: true }),\n sideEffects: [{\n type: 'ui:confirm_dialog',\n success: true,\n data: {\n title: args.title,\n message: args.message,\n confirmText: args.confirmText || '确认',\n cancelText: args.cancelText || '取消',\n }\n }]\n };\n }\n });\n}\n\n/**\n * 打开文件预览\n */\nexport function openFilePreviewTool(): ToolPlugin {\n return tool({\n name: 'open_file_preview',\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 return {\n result: JSON.stringify({ success: true, path: args.path }),\n sideEffects: [{\n type: 'ui:file_preview',\n success: true,\n data: { path: args.path }\n }]\n };\n }\n });\n}\n\n/**\n * 跳转到指定目录\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 return {\n result: JSON.stringify({ success: true, path: args.path }),\n sideEffects: [{\n type: 'ui:navigate',\n success: true,\n data: { path: args.path }\n }]\n };\n }\n });\n}\n\n/**\n * 所有 UI 动作工具(已废弃,使用函数形式)\n * @deprecated 使用 showToastTool() 等函数形式\n */\nexport const uiActionTools = [\n showToastTool(),\n openConfirmDialogTool(),\n openFilePreviewTool(),\n navigateToDirectoryTool(),\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"]}