@huyooo/ai-chat-core 0.1.0
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.cjs +1563 -0
- package/dist/index.cjs.map +1 -0
- package/dist/index.d.cts +496 -0
- package/dist/index.d.ts +496 -0
- package/dist/index.js +1554 -0
- package/dist/index.js.map +1 -0
- package/package.json +45 -0
|
@@ -0,0 +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"]}
|
package/package.json
ADDED
|
@@ -0,0 +1,45 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "@huyooo/ai-chat-core",
|
|
3
|
+
"version": "0.1.0",
|
|
4
|
+
"description": "AI Chat Core - HybridAgent with Doubao + Gemini",
|
|
5
|
+
"type": "module",
|
|
6
|
+
"main": "./dist/index.cjs",
|
|
7
|
+
"module": "./dist/index.js",
|
|
8
|
+
"types": "./dist/index.d.ts",
|
|
9
|
+
"exports": {
|
|
10
|
+
".": {
|
|
11
|
+
"types": "./dist/index.d.ts",
|
|
12
|
+
"import": "./dist/index.js",
|
|
13
|
+
"require": "./dist/index.cjs"
|
|
14
|
+
}
|
|
15
|
+
},
|
|
16
|
+
"files": [
|
|
17
|
+
"dist"
|
|
18
|
+
],
|
|
19
|
+
"scripts": {
|
|
20
|
+
"build": "tsup",
|
|
21
|
+
"dev": "tsup --watch",
|
|
22
|
+
"typecheck": "tsc --noEmit",
|
|
23
|
+
"clean": "rm -rf dist"
|
|
24
|
+
},
|
|
25
|
+
"dependencies": {
|
|
26
|
+
"@google/genai": "^1.0.0"
|
|
27
|
+
},
|
|
28
|
+
"devDependencies": {
|
|
29
|
+
"@types/node": "^22.0.0",
|
|
30
|
+
"tsup": "^8.0.0",
|
|
31
|
+
"typescript": "^5.0.0"
|
|
32
|
+
},
|
|
33
|
+
"keywords": [
|
|
34
|
+
"ai",
|
|
35
|
+
"chat",
|
|
36
|
+
"agent",
|
|
37
|
+
"doubao",
|
|
38
|
+
"gemini"
|
|
39
|
+
],
|
|
40
|
+
"author": "huyooo",
|
|
41
|
+
"license": "MIT",
|
|
42
|
+
"publishConfig": {
|
|
43
|
+
"access": "public"
|
|
44
|
+
}
|
|
45
|
+
}
|