my-ai-chat-framework 1.1.0 → 2.7.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/README.md +218 -406
- package/dist/my-ai-chat-framework.browser.es.js +1284 -2904
- package/dist/my-ai-chat-framework.browser.es.js.map +1 -1
- package/dist/my-ai-chat-framework.browser.umd.js +1310 -2917
- package/dist/my-ai-chat-framework.browser.umd.js.map +1 -1
- package/dist/my-ai-chat-framework.node.cjs.js +1296 -1654
- package/dist/my-ai-chat-framework.node.cjs.js.map +1 -1
- package/package.json +18 -35
- package/src/adapters/openai.js +280 -0
- package/src/core/ChatService.js +298 -0
- package/src/core/Errors.js +60 -0
- package/src/core/EventEmitter.js +51 -126
- package/src/core/MessageStore.js +112 -0
- package/src/core/SystemPromptStore.js +118 -0
- package/src/index.js +11 -540
- package/src/plugins/model-registry.js +187 -0
- package/src/plugins/tool-calling.js +213 -0
- package/src/utils/MessageFormatter.js +204 -0
- package/src/utils/typeCheck.js +12 -0
- package/src/utils/url.js +18 -0
- package/README_ZH.md +0 -545
- package/src/config/defaults.js +0 -25
- package/src/core/ApiClient.js +0 -316
- package/src/core/ConfigManager.js +0 -173
- package/src/core/MessageFormatter.js +0 -136
- package/src/core/Messages.js +0 -589
- package/src/core/RequestBuilder.js +0 -99
- package/src/core/ToolManager.js +0 -175
- package/src/utils/index.js +0 -21
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"my-ai-chat-framework.browser.es.js","sources":["../src/core/MessageFormatter.js","../src/core/Messages.js","../src/core/EventEmitter.js","../src/core/ToolManager.js","../src/core/RequestBuilder.js","../node_modules/.pnpm/axios@0.21.4/node_modules/axios/lib/helpers/bind.js","../node_modules/.pnpm/axios@0.21.4/node_modules/axios/lib/utils.js","../node_modules/.pnpm/axios@0.21.4/node_modules/axios/lib/helpers/buildURL.js","../node_modules/.pnpm/axios@0.21.4/node_modules/axios/lib/core/InterceptorManager.js","../node_modules/.pnpm/axios@0.21.4/node_modules/axios/lib/helpers/normalizeHeaderName.js","../node_modules/.pnpm/axios@0.21.4/node_modules/axios/lib/core/enhanceError.js","../node_modules/.pnpm/axios@0.21.4/node_modules/axios/lib/core/createError.js","../node_modules/.pnpm/axios@0.21.4/node_modules/axios/lib/core/settle.js","../node_modules/.pnpm/axios@0.21.4/node_modules/axios/lib/helpers/cookies.js","../node_modules/.pnpm/axios@0.21.4/node_modules/axios/lib/helpers/isAbsoluteURL.js","../node_modules/.pnpm/axios@0.21.4/node_modules/axios/lib/helpers/combineURLs.js","../node_modules/.pnpm/axios@0.21.4/node_modules/axios/lib/core/buildFullPath.js","../node_modules/.pnpm/axios@0.21.4/node_modules/axios/lib/helpers/parseHeaders.js","../node_modules/.pnpm/axios@0.21.4/node_modules/axios/lib/helpers/isURLSameOrigin.js","../node_modules/.pnpm/axios@0.21.4/node_modules/axios/lib/adapters/xhr.js","../node_modules/.pnpm/axios@0.21.4/node_modules/axios/lib/defaults.js","../node_modules/.pnpm/axios@0.21.4/node_modules/axios/lib/core/transformData.js","../node_modules/.pnpm/axios@0.21.4/node_modules/axios/lib/cancel/isCancel.js","../node_modules/.pnpm/axios@0.21.4/node_modules/axios/lib/core/dispatchRequest.js","../node_modules/.pnpm/axios@0.21.4/node_modules/axios/lib/core/mergeConfig.js","../node_modules/.pnpm/axios@0.21.4/node_modules/axios/lib/helpers/validator.js","../node_modules/.pnpm/axios@0.21.4/node_modules/axios/lib/core/Axios.js","../node_modules/.pnpm/axios@0.21.4/node_modules/axios/lib/cancel/Cancel.js","../node_modules/.pnpm/axios@0.21.4/node_modules/axios/lib/cancel/CancelToken.js","../node_modules/.pnpm/axios@0.21.4/node_modules/axios/lib/helpers/spread.js","../node_modules/.pnpm/axios@0.21.4/node_modules/axios/lib/helpers/isAxiosError.js","../node_modules/.pnpm/axios@0.21.4/node_modules/axios/lib/axios.js","../node_modules/.pnpm/axios@0.21.4/node_modules/axios/index.js","../src/core/ApiClient.js","../src/core/ConfigManager.js","../src/config/defaults.js","../src/index.js"],"sourcesContent":["/**\r\n * 消息格式转换器\r\n * 负责将Messages的状态转换为不同格式\r\n */\r\nclass MessageFormatter {\r\n /**\r\n * 将消息转换为标准格式(不再过滤自定义元数据,只确保必需字段)\r\n */\r\n static toStandardFormat(message) {\r\n const { role, content } = message;\r\n const standardMessage = { role, content };\r\n \r\n // 复制所有其他字段(包括自定义字段)\r\n for (const [key, value] of Object.entries(message)) {\r\n if (key !== 'role' && key !== 'content' && value !== undefined) {\r\n standardMessage[key] = value;\r\n }\r\n }\r\n \r\n return standardMessage;\r\n }\r\n\r\n /**\r\n * 批量转换消息为标准格式\r\n */\r\n static batchToStandardFormat(messages) {\r\n return messages.map(msg => this.toStandardFormat(msg));\r\n }\r\n\r\n /**\r\n * 从Messages实例获取格式化后的消息数组\r\n */\r\n static formatMessages(messagesInstance, baseRounds, cycleRounds) {\r\n // 使用新的方法名\r\n const systems = messagesInstance.getEnabledSystemPrompts();\r\n \r\n // 添加提示系统\r\n const hintSystem = {\r\n role: 'system',\r\n content: `你的名字||标题是:${messagesInstance.getName() || '未知'}`\r\n };\r\n systems.unshift(hintSystem);\r\n \r\n // 使用新的方法名\r\n const recentMessages = messagesInstance.getRecentMessages(baseRounds, cycleRounds);\r\n return [...systems, ...recentMessages];\r\n }\r\n\r\n /**\r\n * 构造工具参数\r\n */\r\n static constructParameters(array) {\r\n let paramsArray = [];\r\n\r\n if (Array.isArray(array)) {\r\n paramsArray = array;\r\n } else if (typeof array === 'object' && array !== null) {\r\n paramsArray = [array];\r\n } else {\r\n throw new Error('[系统提示异常] 检测到无效的参数格式');\r\n }\r\n\r\n const parameters = {};\r\n\r\n for (let i = 0; i < paramsArray.length; i++) {\r\n const param = paramsArray[i];\r\n\r\n if (!param?.name?.trim()) {\r\n throw new Error(`[系统提示异常] 检测到空参数名称 位置: 第 ${i + 1} 个参数`);\r\n }\r\n\r\n if (!param?.type?.trim()) {\r\n throw new Error(`[系统提示异常] 检测到空参数类型 位置: 参数 \"${param.name}\"`);\r\n }\r\n\r\n if (!param?.description?.trim()) {\r\n throw new Error(`[系统提示异常] 检测到空参数描述 位置: 参数 \"${param.name}\"`);\r\n }\r\n\r\n parameters[param.name] = {\r\n type: param.type,\r\n description: param.description,\r\n };\r\n }\r\n\r\n return {\r\n type: 'object',\r\n properties: parameters,\r\n required: Object.keys(parameters),\r\n };\r\n }\r\n\r\n /**\r\n * 构造工具定义\r\n */\r\n static constructTool({ name, description, parameters }) {\r\n if (!name?.trim()) {\r\n throw new Error('[系统提示异常] 检测到空工具名称');\r\n }\r\n if (!description?.trim()) {\r\n throw new Error('[系统提示异常] 检测到空工具描述');\r\n }\r\n\r\n let processedParameters;\r\n try {\r\n processedParameters = this.constructParameters(parameters);\r\n } catch (error) {\r\n throw new Error(`[系统提示异常] 工具参数验证失败 工具名称: ${name} 错误详情: ${error.message}`);\r\n }\r\n\r\n return {\r\n type: 'function',\r\n function: {\r\n name,\r\n description,\r\n parameters: processedParameters,\r\n },\r\n };\r\n }\r\n\r\n /**\r\n * 过滤消息以供API使用(只移除空content的消息,保留所有字段)\r\n */\r\n static filterForAPI(messages) {\r\n return messages.filter(msg => {\r\n // tool消息可以没有content\r\n if (msg.role === 'tool') {\r\n return true;\r\n }\r\n // 其他消息必须有非空content\r\n return msg.content !== '' && msg.content !== undefined && msg.content !== null;\r\n });\r\n }\r\n}\r\n\r\nexport default MessageFormatter;","import MessageFormatter from './MessageFormatter.js';\n\nclass Messages {\n constructor() {\n this.messages = [];\n this.systemPrompts = [];\n this.tools = [];\n this.metadata = {\n name: '',\n createdAt: new Date(),\n lastModified: new Date()\n };\n }\n\n // ========== 核心消息方法 ==========\n\n /**\n * 添加消息(通用方法)\n * @param {string} role - 角色:user/assistant/system/tool\n * @param {string} content - 消息内容(允许空字符串)\n * @param {object} metadata - 额外元数据\n * @returns {number} 新消息的索引\n */\n addMessage(role, content, metadata = {}) {\n // 验证角色\n const validRoles = ['user', 'assistant', 'system', 'tool'];\n if (!validRoles.includes(role)) {\n throw new Error(`无效的角色: ${role},有效值: ${validRoles.join(', ')}`);\n }\n \n // 特殊处理:tool消息可以没有content(但必须有tool_call_id)\n if (role === 'tool') {\n // tool消息必须有tool_call_id\n if (!metadata.tool_call_id) {\n throw new Error('tool消息必须包含tool_call_id');\n }\n // tool消息的content可以为空\n } else {\n // 其他消息:允许空字符串,但不允许undefined/null\n if (content === undefined || content === null) {\n throw new Error('消息内容不能为undefined或null');\n }\n if (typeof content !== 'string') {\n throw new Error('消息内容必须是字符串');\n }\n }\n \n // 创建消息对象\n const message = {\n role,\n content: content ? content.trim() : '', // 允许空字符串\n timestamp: new Date()\n };\n \n // 合并元数据(过滤掉undefined和null)\n if (metadata && typeof metadata === 'object') {\n for (const [key, value] of Object.entries(metadata)) {\n if (value !== undefined && value !== null) {\n message[key] = value;\n }\n }\n }\n \n return this.messages.push(message) - 1;\n }\n\n /**\n * 添加用户消息(便捷方法)\n */\n addUserMessage(content, metadata = {}) {\n return this.addMessage('user', content, metadata);\n }\n\n /**\n * 添加助手消息(便捷方法)\n */\n addAssistantMessage(content, metadata = {}) {\n return this.addMessage('assistant', content, metadata);\n }\n\n /**\n * 添加系统消息(便捷方法)\n */\n addSystemMessage(content, metadata = {}) {\n return this.addMessage('system', content, metadata);\n }\n\n /**\n * 添加工具消息(便捷方法)\n */\n addToolMessage(content, toolCallId, metadata = {}) {\n if (!toolCallId || typeof toolCallId !== 'string') {\n throw new Error('tool_call_id不能为空');\n }\n \n return this.addMessage('tool', content, {\n tool_call_id: toolCallId,\n ...metadata\n });\n }\n\n /**\n * 批量添加消息\n */\n addMessages(messagesArray) {\n if (!Array.isArray(messagesArray)) {\n throw new Error('参数必须是数组');\n }\n \n const indices = [];\n for (const msg of messagesArray) {\n if (!msg.role || !msg.content) {\n throw new Error('消息必须包含role和content属性');\n }\n \n const { role, content, ...metadata } = msg;\n const index = this.addMessage(role, content, metadata);\n indices.push(index);\n }\n \n return indices;\n }\n\n // ========== 消息查询 ==========\n\n /**\n * 获取所有消息\n */\n getMessages() {\n return [...this.messages];\n }\n\n /**\n * 按角色获取消息\n */\n getMessagesByRole(role) {\n const validRoles = ['user', 'assistant', 'system', 'tool'];\n if (!validRoles.includes(role)) {\n throw new Error(`无效的角色: ${role}`);\n }\n return this.messages.filter(msg => msg.role === role);\n }\n\n /**\n * 获取最后一条消息\n */\n getLastMessage() {\n return this.messages.length > 0 \n ? { ...this.messages[this.messages.length - 1] }\n : null;\n }\n\n /**\n * 获取最后一条用户消息\n */\n getLastUserMessage() {\n for (let i = this.messages.length - 1; i >= 0; i--) {\n if (this.messages[i].role === 'user') {\n return { ...this.messages[i] };\n }\n }\n return null;\n }\n\n /**\n * 获取最后一条助手消息\n */\n getLastAssistantMessage() {\n for (let i = this.messages.length - 1; i >= 0; i--) {\n if (this.messages[i].role === 'assistant') {\n return { ...this.messages[i] };\n }\n }\n return null;\n }\n\n /**\n * 获取消息数量\n */\n getMessageCount() {\n return this.messages.length;\n }\n\n // ========== 消息修改 ==========\n\n /**\n * 更新消息内容(允许空字符串)\n */\n updateMessage(index, content) {\n if (!Number.isInteger(index) || index < 0 || index >= this.messages.length) {\n throw new Error(`无效的消息索引: ${index}`);\n }\n \n if (typeof content !== 'string') {\n throw new Error('消息内容必须是字符串');\n }\n \n this.messages[index].content = content;\n this.messages[index].lastModified = new Date();\n return this;\n }\n\n /**\n * 更新最后一条消息\n */\n updateLastMessage(content) {\n if (this.messages.length === 0) {\n throw new Error('没有消息可以修改');\n }\n return this.updateMessage(this.messages.length - 1, content);\n }\n\n /**\n * 设置消息字段\n */\n setMessageField(index, field, value) {\n if (!Number.isInteger(index) || index < 0 || index >= this.messages.length) {\n throw new Error(`无效的消息索引: ${index}`);\n }\n \n this.messages[index][field] = value;\n this.messages[index].lastModified = new Date();\n return this;\n }\n\n /**\n * 批量设置消息字段\n */\n setMessageFields(index, fields) {\n if (!Number.isInteger(index) || index < 0 || index >= this.messages.length) {\n throw new Error(`无效的消息索引: ${index}`);\n }\n \n for (const [field, value] of Object.entries(fields)) {\n if (value !== undefined && value !== null) {\n this.messages[index][field] = value;\n }\n }\n \n this.messages[index].lastModified = new Date();\n return this;\n }\n\n /**\n * 批量更新最后一条消息的字段\n */\n updateLastMessageFields(fields) {\n if (this.messages.length === 0) {\n throw new Error('没有消息可以修改');\n }\n return this.setMessageFields(this.messages.length - 1, fields);\n }\n\n // ========== 消息删除 ==========\n\n /**\n * 删除消息\n */\n removeMessage(index) {\n if (!Number.isInteger(index) || index < 0 || index >= this.messages.length) {\n throw new Error(`无效的消息索引: ${index}`);\n }\n \n return this.messages.splice(index, 1)[0];\n }\n\n /**\n * 删除最后一条消息\n */\n removeLastMessage() {\n if (this.messages.length === 0) {\n throw new Error('没有消息可以删除');\n }\n return this.removeMessage(this.messages.length - 1);\n }\n\n /**\n * 撤回到上一条助手消息\n */\n undoToAssistant() {\n if (this.messages.length === 0) {\n return [];\n }\n \n // 找到最后一条助手消息的位置\n let lastAssistantIndex = -1;\n for (let i = this.messages.length - 1; i >= 0; i--) {\n if (this.messages[i].role === 'assistant') {\n lastAssistantIndex = i;\n break;\n }\n }\n \n if (lastAssistantIndex >= 0) {\n // 删除该助手消息之后的所有消息\n return this.messages.splice(lastAssistantIndex + 1);\n } else {\n // 没有助手消息,清空所有\n const removed = [...this.messages];\n this.messages = [];\n return removed;\n }\n }\n\n /**\n * 是否可以撤回\n */\n canUndo() {\n return this.messages.some(msg => msg.role === 'assistant');\n }\n\n /**\n * 清空所有消息\n */\n clearMessages() {\n const removed = [...this.messages];\n this.messages = [];\n this.metadata.lastModified = new Date();\n return removed;\n }\n\n // ========== 系统提示管理 ==========\n\n /**\n * 添加系统提示\n */\n addSystemPrompt(content, enabled = true) {\n if (typeof content !== 'string' || !content.trim()) {\n throw new Error('系统提示内容不能为空');\n }\n \n const prompt = {\n role: 'system',\n content: content.trim(),\n enabled: Boolean(enabled),\n createdAt: new Date()\n };\n \n return this.systemPrompts.push(prompt) - 1;\n }\n\n /**\n * 获取启用的系统提示\n */\n getEnabledSystemPrompts() {\n return this.systemPrompts\n .filter(prompt => prompt.enabled)\n .map(prompt => ({ role: prompt.role, content: prompt.content }));\n }\n\n /**\n * 切换系统提示状态\n */\n toggleSystemPrompt(index) {\n if (!Number.isInteger(index) || index < 0 || index >= this.systemPrompts.length) {\n throw new Error(`无效的系统提示索引: ${index}`);\n }\n \n this.systemPrompts[index].enabled = !this.systemPrompts[index].enabled;\n return this;\n }\n\n /**\n * 更新系统提示内容\n */\n updateSystemPrompt(index, content) {\n if (!Number.isInteger(index) || index < 0 || index >= this.systemPrompts.length) {\n throw new Error(`无效的系统提示索引: ${index}`);\n }\n \n if (typeof content !== 'string' || !content.trim()) {\n throw new Error('系统提示内容不能为空');\n }\n \n this.systemPrompts[index].content = content.trim();\n this.systemPrompts[index].lastModified = new Date();\n return this;\n }\n\n /**\n * 删除系统提示\n */\n removeSystemPrompt(index) {\n if (!Number.isInteger(index) || index < 0 || index >= this.systemPrompts.length) {\n throw new Error(`无效的系统提示索引: ${index}`);\n }\n \n return this.systemPrompts.splice(index, 1)[0];\n }\n\n // ========== 工具管理 ==========\n\n /**\n * 添加工具\n */\n addTool(toolDefinition) {\n if (typeof toolDefinition === 'object' && toolDefinition !== null) {\n // 如果已经是格式化好的工具对象\n if (!toolDefinition.type || toolDefinition.type !== 'function') {\n throw new Error(`无效的工具类型,期望: 'function',实际: '${toolDefinition.type || 'undefined'}'`);\n }\n if (!toolDefinition.function?.name?.trim()) {\n throw new Error('工具名称不能为空');\n }\n return this.tools.push(toolDefinition) - 1;\n }\n\n // 如果是工具定义对象,使用MessageFormatter构造\n if (toolDefinition.name && toolDefinition.description && toolDefinition.parameters) {\n const constructedTool = MessageFormatter.constructTool(toolDefinition);\n return this.tools.push(constructedTool) - 1;\n }\n\n throw new Error('无效的工具格式');\n }\n\n /**\n * 从定义添加工具\n */\n addToolFromDefinition(name, description, parameters) {\n const tool = MessageFormatter.constructTool({ name, description, parameters });\n return this.tools.push(tool) - 1;\n }\n\n /**\n * 获取所有工具\n */\n getTools() {\n return [...this.tools];\n }\n\n /**\n * 删除工具\n */\n removeTool(index) {\n if (!Number.isInteger(index) || index < 0 || index >= this.tools.length) {\n throw new Error(`无效的工具索引: ${index}`);\n }\n \n return this.tools.splice(index, 1)[0];\n }\n\n /**\n * 清空所有工具\n */\n clearTools() {\n const removed = [...this.tools];\n this.tools = [];\n return removed;\n }\n\n // ========== 元数据管理 ==========\n\n setName(name) {\n if (typeof name !== 'string' || !name.trim()) {\n throw new Error('名称不能为空');\n }\n this.metadata.name = name.trim();\n this.metadata.lastModified = new Date();\n return this;\n }\n\n getName() {\n return this.metadata.name;\n }\n\n // ========== 兼容性方法 ==========\n\n /**\n * 获取最近的消息(兼容旧方法)\n */\n getRecentMessages(baseRounds, cycleRounds) {\n const messages = this.messages.map(item => {\n // 使用MessageFormatter.toStandardFormat来确保一致性\n return MessageFormatter.toStandardFormat(item);\n });\n \n const msgTotal = messages.length;\n const totalRounds = msgTotal / 2;\n\n if (!baseRounds || isNaN(baseRounds) || baseRounds <= 0) {\n return messages;\n }\n\n const maxCycleRoundMultiple = cycleRounds > 0\n ? Math.floor(totalRounds / cycleRounds) * cycleRounds\n : 0;\n const actualRounds = baseRounds + (totalRounds - maxCycleRoundMultiple);\n const actualMsgCount = actualRounds * 2;\n const n = Math.max(msgTotal - actualMsgCount, 0);\n\n return messages.slice(n);\n }\n\n /**\n * 获取所有格式化消息(兼容旧方法)\n */\n getMessagesFormatted(baseRounds, cycleRounds) {\n const systems = this.getEnabledSystemPrompts();\n const hintSystem = {\n role: 'system',\n content: `你的名字||标题是:${this.metadata.name || '未知'}`\n };\n systems.unshift(hintSystem);\n \n const recentMessages = this.getRecentMessages(baseRounds, cycleRounds);\n return [...systems, ...recentMessages];\n }\n\n // ========== 导入导出 ==========\n\n export() {\n return {\n __format_version: 2,\n exportedAt: new Date().toISOString(),\n metadata: { ...this.metadata },\n payload: {\n messages: JSON.parse(JSON.stringify(this.messages)),\n systemPrompts: JSON.parse(JSON.stringify(this.systemPrompts)),\n tools: JSON.parse(JSON.stringify(this.tools))\n }\n };\n }\n\n import(data) {\n const obj = typeof data === 'string' ? JSON.parse(data) : data;\n const parsed = Messages.parseCompatible(obj);\n \n this.messages = parsed.messages || [];\n this.systemPrompts = parsed.systemPrompts || [];\n this.tools = parsed.tools || [];\n this.metadata = parsed.metadata || { \n name: '', \n createdAt: new Date(), \n lastModified: new Date() \n };\n \n this.metadata.lastModified = new Date();\n return this;\n }\n\n static parseCompatible(obj) {\n // 处理新格式(v2)\n if (obj?.__format_version === 2 && obj.payload) {\n return {\n messages: obj.payload.messages || [],\n systemPrompts: obj.payload.systemPrompts || [],\n tools: obj.payload.tools || [],\n metadata: obj.metadata || { \n name: '', \n createdAt: new Date(), \n lastModified: new Date() \n }\n };\n }\n \n // 处理旧格式(v1)\n if (obj?.__format_version === 1 && obj.payload) {\n return {\n messages: obj.payload.messages || [],\n systemPrompts: obj.payload.systems || [],\n tools: obj.payload.tools || [],\n metadata: { \n name: obj.payload.hintData?.name || '',\n createdAt: new Date(),\n lastModified: new Date()\n }\n };\n }\n\n // 处理更旧的格式\n if (obj?.messages && Array.isArray(obj.messages)) {\n return {\n messages: obj.messages || [],\n systemPrompts: obj.systems || [],\n tools: obj.tools || [],\n metadata: { \n name: obj.hintData?.name || '',\n createdAt: new Date(),\n lastModified: new Date()\n }\n };\n }\n\n throw new Error('无法识别的聊天数据格式');\n }\n}\n\nexport default Messages;","/**\r\n * 简单的事件发射器类\r\n * 实现观察者模式,允许对象监听和触发事件\r\n */\r\nclass EventEmitter {\r\n constructor() {\r\n //存储事件和对应的回调数组\r\n //结构: \r\n // { 'event_name': [ callback1, callback2 ] }\r\n this.events = {}\r\n }\r\n\r\n /**\r\n * 监听事件\r\n * @param {string} eventName - 要注册的事件名称\r\n * @param {Function} callback - 事件触发时执行的回调函数\r\n */\r\n //实现一个监听事件的方法\r\n on(eventName, callback) {\r\n //1.如果没有事件数组,先创建\r\n if (!this.events[eventName]) {\r\n this.events[eventName] = []\r\n }\r\n\r\n //2.给数组添加(push)事件\r\n this.events[eventName].push(callback)\r\n\r\n //返回一个取消键听得函数(方便实用)\r\n return () => this.off(eventName, callback)\r\n }\r\n\r\n /**\r\n * 触发事件\r\n * @param {string} eventName --要触发的事件名称\r\n * @param {any} data --传递给回调函数的数据\r\n */\r\n emit(eventName, data) {\r\n //获取这个事件的所有回调函数\r\n const callbacks = this.events[eventName]\r\n\r\n //仅在有回调函数时调用他们,否则提前退出(可以这么写吧?少一层嵌套)\r\n if (!callbacks) return\r\n\r\n //使用slice()创建副本,放置在循环中修改数组导致问题\r\n const callbakesCopy = callbacks.slice()\r\n\r\n for (let i = 0; i < callbakesCopy.length; i++) {\r\n try {\r\n //执行回调函数,并传入数据\r\n callbakesCopy[i](data)\r\n } catch (error) {\r\n // 如果某个回调出错,不影响其他回调\r\n console.error(`事件 ${eventName} 的回调函数执行出错:`, error)\r\n }\r\n }\r\n }\r\n\r\n /**\r\n * 取消监听事件\r\n * @param {string} eventName --要取消的事件名称\r\n * @param {Function} callback --要移除的回调函数\r\n */\r\n off(eventName, callback) {\r\n const callbacks = this.events[eventName]\r\n\r\n //判断一下防止报错\r\n if (!callbacks) return\r\n\r\n //过滤掉要移除的回调函数\r\n this.events[eventName] = callbacks.filter(item => item !== callback)\r\n\r\n // 如果这个事件没有监听器了,删除这个事件\r\n if (this.events[eventName].length === 0) {\r\n delete this.events[eventName]\r\n }\r\n }\r\n\r\n /**\r\n * 只监听一次事件(触发后自动取消)\r\n * @param {string} eventName - 事件名称\r\n * @param {Function} callback - 回调函数\r\n */\r\n once(evenName, callback) {\r\n // 创建一个包装函数,执行完成后自动取消\r\n const onceCallback = (data) => {\r\n //先取消监听\r\n this.off(evenName, onceCallback)\r\n //在执行原回调\r\n callback(data)\r\n }\r\n\r\n //监听包装后的函数\r\n this.on(evenName, onceCallback)\r\n\r\n //返回取消函数\r\n return () => this.off(evenName, onceCallback)\r\n }\r\n\r\n /**\r\n * 移除某个事件的所有监听器\r\n * @param {string} eventName - 事件名称\r\n */\r\n removeAllListeners(eventName) {\r\n if (eventName) {\r\n // 移除指定事件的所有监听器\r\n delete this.events[eventName]\r\n } else {\r\n // 如果没有指定事件名,移除所有事件的监听器\r\n this.events = {}\r\n }\r\n }\r\n\r\n /**\r\n * 获取某个事件的所有监听器数量\r\n * @param {string} eventName - 事件名称\r\n * @returns {number} 监听器数量\r\n */\r\n listenerCount(eventName) {\r\n const callbacks = this.events[eventName]\r\n return callbacks ? callbacks.length : 0\r\n }\r\n\r\n}\r\n\r\n//导出EventEmiter类\r\nexport default EventEmitter","import EventEmitter from './EventEmitter'\r\n/**\r\n * 工具管理器\r\n * 负责注册、管理和执行工具\r\n*/\r\nclass ToolManager extends EventEmitter {\r\n constructor() {\r\n super()\r\n this.tools = new Map() // 工具名 -> 工具函数\r\n }\r\n /**\r\n * 注册工具\r\n * @param {string} name - 工具名称\r\n * @param {object} toolDefinition - 工具定义(包含描述和参数信息)\r\n * @param {Function} executor - 工具执行函数,接受参数对象并返回结果\r\n */\r\n registerTool(name, toolDefinition, executor) {\r\n // 判断是否已经注册过同名工具\r\n if (this.tools.has(name)) {\r\n throw new Error(`[系统提示异常] 工具 \"${name}\" 已经注册过了`);\r\n }\r\n\r\n //在工具管理器中注册工具的函数\r\n this.tools.set(name, {\r\n definition: toolDefinition,\r\n executor: executor\r\n })\r\n // 触发工具注册事件,供外部监听\r\n this.emit('tool-registered', { name, definition: toolDefinition })\r\n // 返回this以支持链式调用\r\n return this\r\n }\r\n\r\n /**\r\n * 执行工具调用\r\n * @param {object} toolCall - 工具调用信息,包含工具名称和参数\r\n * @returns {Promise<any>} - 工具执行结果\r\n */\r\n async executeToolCall(toolCall) {\r\n const { id, function: func } = toolCall;\r\n const { name, arguments: argsStr } = func;\r\n \r\n if (!this.tools.has(name)) {\r\n throw new Error(`未找到工具: ${name}`);\r\n }\r\n \r\n const tool = this.tools.get(name);\r\n \r\n try {\r\n // 解析参数\r\n const args = JSON.parse(argsStr);\r\n \r\n // 触发事件:开始执行工具\r\n this.emit('tool-execute-start', { name, args });\r\n \r\n // 执行工具\r\n const result = await tool.executor(args);\r\n \r\n // 触发事件:工具执行成功\r\n this.emit('tool-execute-success', { name, args, result });\r\n \r\n // 确保返回正确的格式\r\n return {\r\n tool_call_id: id, // 必须包含tool_call_id\r\n name,\r\n result: JSON.stringify(result),\r\n success: true\r\n };\r\n } catch (error) {\r\n // 触发事件:工具执行失败\r\n this.emit('tool-execute-error', { name, error });\r\n \r\n // 即使失败也要返回tool_call_id\r\n return {\r\n tool_call_id: id,\r\n name,\r\n error: error.message,\r\n success: false\r\n };\r\n }\r\n }\r\n\r\n /**\r\n * 获取所有工具定义(用于发送给AI)\r\n */\r\n getToolDefinitions() {\r\n const definitions = [];\r\n for (const [name, tool] of this.tools) {\r\n definitions.push(tool.definition);\r\n }\r\n return definitions;\r\n }\r\n\r\n /**\r\n * 检查是否有工具\r\n */\r\n hasTools() {\r\n return this.tools.size > 0;\r\n }\r\n\r\n /**\r\n * 批量执行工具调用\r\n * @param {Array} toolCalls - 工具调用数组\r\n * @returns {Promise<Array>} - 所有工具的执行结果\r\n */\r\n async executeToolCalls(toolCalls) {\r\n if (!Array.isArray(toolCalls)) {\r\n throw new Error('toolCalls必须是数组');\r\n }\r\n \r\n const results = [];\r\n \r\n // 并行执行所有工具调用\r\n const promises = toolCalls.map(async (toolCall) => {\r\n try {\r\n const result = await this.executeToolCall(toolCall);\r\n return result;\r\n } catch (error) {\r\n // 某个工具失败,返回错误信息\r\n return {\r\n tool_call_id: toolCall.id,\r\n name: toolCall.function.name,\r\n error: error.message,\r\n success: false\r\n };\r\n }\r\n });\r\n \r\n // 等待所有工具执行完成\r\n const settledResults = await Promise.allSettled(promises);\r\n \r\n // 处理结果\r\n for (const settled of settledResults) {\r\n if (settled.status === 'fulfilled') {\r\n results.push(settled.value);\r\n } else {\r\n // 理论上不会到这里,因为错误已经在上面捕获了\r\n results.push({\r\n error: settled.reason.message,\r\n success: false\r\n });\r\n }\r\n }\r\n \r\n return results;\r\n }\r\n \r\n /**\r\n * 串行执行工具调用(如果需要顺序执行)\r\n */\r\n async executeToolCallsSequentially(toolCalls) {\r\n const results = [];\r\n \r\n for (const toolCall of toolCalls) {\r\n try {\r\n const result = await this.executeToolCall(toolCall);\r\n results.push(result);\r\n } catch (error) {\r\n // 某个工具失败,可以选择停止或继续\r\n results.push({\r\n tool_call_id: toolCall.id,\r\n name: toolCall.function.name,\r\n error: error.message,\r\n success: false\r\n });\r\n // 可以选择继续执行下一个工具\r\n // 或者抛出错误停止执行:throw error;\r\n }\r\n }\r\n \r\n return results;\r\n }\r\n}\r\n\r\nexport default ToolManager","import MessageFormatter from './MessageFormatter.js';\r\nimport ToolManager from './ToolManager.js';\r\nimport EventEmitter from './EventEmitter.js';\r\n\r\n/**\r\n * 请求构建器\r\n * 负责构建符合不同API规范的请求体\r\n */\r\nclass RequestBuilder {\r\n constructor(model, messagesInstance, config = {}) {\r\n this.model = model;\r\n this.messages = messagesInstance;\r\n this.config = {\r\n // temperature: 0.7,\r\n // max_tokens: 2000,\r\n // stream: false, // 默认关闭流式传输\r\n ...config\r\n };\r\n this.toolManager = null; // 可选的ToolManager引用\r\n }\r\n\r\n /**\r\n * 设置ToolManager引用\r\n */\r\n setToolManager(toolManager) {\r\n this.toolManager = toolManager;\r\n return this;\r\n }\r\n\r\n /**\r\n * 构建OpenAI兼容格式的请求体\r\n */\r\n buildOpenAIFormat(baseRounds, cycleRounds) {\r\n // 使用新的MessageFormatter方法\r\n const formattedMessages = MessageFormatter.formatMessages(\r\n this.messages, \r\n baseRounds, \r\n cycleRounds\r\n );\r\n \r\n // 过滤掉空content的消息(除了tool消息)\r\n const filteredMessages = MessageFormatter.filterForAPI(formattedMessages);\r\n \r\n const request = {\r\n model: this.model,\r\n messages: filteredMessages,\r\n ...this.config\r\n };\r\n\r\n // 优先从ToolManager获取工具定义,其次从Messages获取\r\n let tools = [];\r\n if (this.toolManager && this.toolManager.hasTools()) {\r\n tools = this.toolManager.getToolDefinitions();\r\n } else {\r\n tools = this.messages.getTools();\r\n }\r\n \r\n if (tools && tools.length > 0) {\r\n request.tools = tools;\r\n request.tool_choice = 'auto';\r\n }\r\n\r\n return request;\r\n }\r\n\r\n /**\r\n * 构建请求体并返回JSON字符串\r\n */\r\n toJSON(baseRounds, cycleRounds) {\r\n const request = this.buildOpenAIFormat(baseRounds, cycleRounds);\r\n return JSON.stringify(request);\r\n }\r\n\r\n /**\r\n * 构建请求体并返回对象\r\n */\r\n toObject(baseRounds, cycleRounds) {\r\n return this.buildOpenAIFormat(baseRounds, cycleRounds);\r\n }\r\n\r\n /**\r\n * 设置配置项\r\n */\r\n setConfig(key, value) {\r\n this.config[key] = value;\r\n return this; // 支持链式调用\r\n }\r\n\r\n /**\r\n * 批量设置配置项\r\n */\r\n setConfigs(configs) {\r\n Object.assign(this.config, configs);\r\n return this;\r\n }\r\n}\r\n\r\nexport default RequestBuilder;\r\n\r\n","'use strict';\n\nmodule.exports = function bind(fn, thisArg) {\n return function wrap() {\n var args = new Array(arguments.length);\n for (var i = 0; i < args.length; i++) {\n args[i] = arguments[i];\n }\n return fn.apply(thisArg, args);\n };\n};\n","'use strict';\n\nvar bind = require('./helpers/bind');\n\n// utils is a library of generic helper functions non-specific to axios\n\nvar toString = Object.prototype.toString;\n\n/**\n * Determine if a value is an Array\n *\n * @param {Object} val The value to test\n * @returns {boolean} True if value is an Array, otherwise false\n */\nfunction isArray(val) {\n return toString.call(val) === '[object Array]';\n}\n\n/**\n * Determine if a value is undefined\n *\n * @param {Object} val The value to test\n * @returns {boolean} True if the value is undefined, otherwise false\n */\nfunction isUndefined(val) {\n return typeof val === 'undefined';\n}\n\n/**\n * Determine if a value is a Buffer\n *\n * @param {Object} val The value to test\n * @returns {boolean} True if value is a Buffer, otherwise false\n */\nfunction isBuffer(val) {\n return val !== null && !isUndefined(val) && val.constructor !== null && !isUndefined(val.constructor)\n && typeof val.constructor.isBuffer === 'function' && val.constructor.isBuffer(val);\n}\n\n/**\n * Determine if a value is an ArrayBuffer\n *\n * @param {Object} val The value to test\n * @returns {boolean} True if value is an ArrayBuffer, otherwise false\n */\nfunction isArrayBuffer(val) {\n return toString.call(val) === '[object ArrayBuffer]';\n}\n\n/**\n * Determine if a value is a FormData\n *\n * @param {Object} val The value to test\n * @returns {boolean} True if value is an FormData, otherwise false\n */\nfunction isFormData(val) {\n return (typeof FormData !== 'undefined') && (val instanceof FormData);\n}\n\n/**\n * Determine if a value is a view on an ArrayBuffer\n *\n * @param {Object} val The value to test\n * @returns {boolean} True if value is a view on an ArrayBuffer, otherwise false\n */\nfunction isArrayBufferView(val) {\n var result;\n if ((typeof ArrayBuffer !== 'undefined') && (ArrayBuffer.isView)) {\n result = ArrayBuffer.isView(val);\n } else {\n result = (val) && (val.buffer) && (val.buffer instanceof ArrayBuffer);\n }\n return result;\n}\n\n/**\n * Determine if a value is a String\n *\n * @param {Object} val The value to test\n * @returns {boolean} True if value is a String, otherwise false\n */\nfunction isString(val) {\n return typeof val === 'string';\n}\n\n/**\n * Determine if a value is a Number\n *\n * @param {Object} val The value to test\n * @returns {boolean} True if value is a Number, otherwise false\n */\nfunction isNumber(val) {\n return typeof val === 'number';\n}\n\n/**\n * Determine if a value is an Object\n *\n * @param {Object} val The value to test\n * @returns {boolean} True if value is an Object, otherwise false\n */\nfunction isObject(val) {\n return val !== null && typeof val === 'object';\n}\n\n/**\n * Determine if a value is a plain Object\n *\n * @param {Object} val The value to test\n * @return {boolean} True if value is a plain Object, otherwise false\n */\nfunction isPlainObject(val) {\n if (toString.call(val) !== '[object Object]') {\n return false;\n }\n\n var prototype = Object.getPrototypeOf(val);\n return prototype === null || prototype === Object.prototype;\n}\n\n/**\n * Determine if a value is a Date\n *\n * @param {Object} val The value to test\n * @returns {boolean} True if value is a Date, otherwise false\n */\nfunction isDate(val) {\n return toString.call(val) === '[object Date]';\n}\n\n/**\n * Determine if a value is a File\n *\n * @param {Object} val The value to test\n * @returns {boolean} True if value is a File, otherwise false\n */\nfunction isFile(val) {\n return toString.call(val) === '[object File]';\n}\n\n/**\n * Determine if a value is a Blob\n *\n * @param {Object} val The value to test\n * @returns {boolean} True if value is a Blob, otherwise false\n */\nfunction isBlob(val) {\n return toString.call(val) === '[object Blob]';\n}\n\n/**\n * Determine if a value is a Function\n *\n * @param {Object} val The value to test\n * @returns {boolean} True if value is a Function, otherwise false\n */\nfunction isFunction(val) {\n return toString.call(val) === '[object Function]';\n}\n\n/**\n * Determine if a value is a Stream\n *\n * @param {Object} val The value to test\n * @returns {boolean} True if value is a Stream, otherwise false\n */\nfunction isStream(val) {\n return isObject(val) && isFunction(val.pipe);\n}\n\n/**\n * Determine if a value is a URLSearchParams object\n *\n * @param {Object} val The value to test\n * @returns {boolean} True if value is a URLSearchParams object, otherwise false\n */\nfunction isURLSearchParams(val) {\n return typeof URLSearchParams !== 'undefined' && val instanceof URLSearchParams;\n}\n\n/**\n * Trim excess whitespace off the beginning and end of a string\n *\n * @param {String} str The String to trim\n * @returns {String} The String freed of excess whitespace\n */\nfunction trim(str) {\n return str.trim ? str.trim() : str.replace(/^\\s+|\\s+$/g, '');\n}\n\n/**\n * Determine if we're running in a standard browser environment\n *\n * This allows axios to run in a web worker, and react-native.\n * Both environments support XMLHttpRequest, but not fully standard globals.\n *\n * web workers:\n * typeof window -> undefined\n * typeof document -> undefined\n *\n * react-native:\n * navigator.product -> 'ReactNative'\n * nativescript\n * navigator.product -> 'NativeScript' or 'NS'\n */\nfunction isStandardBrowserEnv() {\n if (typeof navigator !== 'undefined' && (navigator.product === 'ReactNative' ||\n navigator.product === 'NativeScript' ||\n navigator.product === 'NS')) {\n return false;\n }\n return (\n typeof window !== 'undefined' &&\n typeof document !== 'undefined'\n );\n}\n\n/**\n * Iterate over an Array or an Object invoking a function for each item.\n *\n * If `obj` is an Array callback will be called passing\n * the value, index, and complete array for each item.\n *\n * If 'obj' is an Object callback will be called passing\n * the value, key, and complete object for each property.\n *\n * @param {Object|Array} obj The object to iterate\n * @param {Function} fn The callback to invoke for each item\n */\nfunction forEach(obj, fn) {\n // Don't bother if no value provided\n if (obj === null || typeof obj === 'undefined') {\n return;\n }\n\n // Force an array if not already something iterable\n if (typeof obj !== 'object') {\n /*eslint no-param-reassign:0*/\n obj = [obj];\n }\n\n if (isArray(obj)) {\n // Iterate over array values\n for (var i = 0, l = obj.length; i < l; i++) {\n fn.call(null, obj[i], i, obj);\n }\n } else {\n // Iterate over object keys\n for (var key in obj) {\n if (Object.prototype.hasOwnProperty.call(obj, key)) {\n fn.call(null, obj[key], key, obj);\n }\n }\n }\n}\n\n/**\n * Accepts varargs expecting each argument to be an object, then\n * immutably merges the properties of each object and returns result.\n *\n * When multiple objects contain the same key the later object in\n * the arguments list will take precedence.\n *\n * Example:\n *\n * ```js\n * var result = merge({foo: 123}, {foo: 456});\n * console.log(result.foo); // outputs 456\n * ```\n *\n * @param {Object} obj1 Object to merge\n * @returns {Object} Result of all merge properties\n */\nfunction merge(/* obj1, obj2, obj3, ... */) {\n var result = {};\n function assignValue(val, key) {\n if (isPlainObject(result[key]) && isPlainObject(val)) {\n result[key] = merge(result[key], val);\n } else if (isPlainObject(val)) {\n result[key] = merge({}, val);\n } else if (isArray(val)) {\n result[key] = val.slice();\n } else {\n result[key] = val;\n }\n }\n\n for (var i = 0, l = arguments.length; i < l; i++) {\n forEach(arguments[i], assignValue);\n }\n return result;\n}\n\n/**\n * Extends object a by mutably adding to it the properties of object b.\n *\n * @param {Object} a The object to be extended\n * @param {Object} b The object to copy properties from\n * @param {Object} thisArg The object to bind function to\n * @return {Object} The resulting value of object a\n */\nfunction extend(a, b, thisArg) {\n forEach(b, function assignValue(val, key) {\n if (thisArg && typeof val === 'function') {\n a[key] = bind(val, thisArg);\n } else {\n a[key] = val;\n }\n });\n return a;\n}\n\n/**\n * Remove byte order marker. This catches EF BB BF (the UTF-8 BOM)\n *\n * @param {string} content with BOM\n * @return {string} content value without BOM\n */\nfunction stripBOM(content) {\n if (content.charCodeAt(0) === 0xFEFF) {\n content = content.slice(1);\n }\n return content;\n}\n\nmodule.exports = {\n isArray: isArray,\n isArrayBuffer: isArrayBuffer,\n isBuffer: isBuffer,\n isFormData: isFormData,\n isArrayBufferView: isArrayBufferView,\n isString: isString,\n isNumber: isNumber,\n isObject: isObject,\n isPlainObject: isPlainObject,\n isUndefined: isUndefined,\n isDate: isDate,\n isFile: isFile,\n isBlob: isBlob,\n isFunction: isFunction,\n isStream: isStream,\n isURLSearchParams: isURLSearchParams,\n isStandardBrowserEnv: isStandardBrowserEnv,\n forEach: forEach,\n merge: merge,\n extend: extend,\n trim: trim,\n stripBOM: stripBOM\n};\n","'use strict';\n\nvar utils = require('./../utils');\n\nfunction encode(val) {\n return encodeURIComponent(val).\n replace(/%3A/gi, ':').\n replace(/%24/g, '$').\n replace(/%2C/gi, ',').\n replace(/%20/g, '+').\n replace(/%5B/gi, '[').\n replace(/%5D/gi, ']');\n}\n\n/**\n * Build a URL by appending params to the end\n *\n * @param {string} url The base of the url (e.g., http://www.google.com)\n * @param {object} [params] The params to be appended\n * @returns {string} The formatted url\n */\nmodule.exports = function buildURL(url, params, paramsSerializer) {\n /*eslint no-param-reassign:0*/\n if (!params) {\n return url;\n }\n\n var serializedParams;\n if (paramsSerializer) {\n serializedParams = paramsSerializer(params);\n } else if (utils.isURLSearchParams(params)) {\n serializedParams = params.toString();\n } else {\n var parts = [];\n\n utils.forEach(params, function serialize(val, key) {\n if (val === null || typeof val === 'undefined') {\n return;\n }\n\n if (utils.isArray(val)) {\n key = key + '[]';\n } else {\n val = [val];\n }\n\n utils.forEach(val, function parseValue(v) {\n if (utils.isDate(v)) {\n v = v.toISOString();\n } else if (utils.isObject(v)) {\n v = JSON.stringify(v);\n }\n parts.push(encode(key) + '=' + encode(v));\n });\n });\n\n serializedParams = parts.join('&');\n }\n\n if (serializedParams) {\n var hashmarkIndex = url.indexOf('#');\n if (hashmarkIndex !== -1) {\n url = url.slice(0, hashmarkIndex);\n }\n\n url += (url.indexOf('?') === -1 ? '?' : '&') + serializedParams;\n }\n\n return url;\n};\n","'use strict';\n\nvar utils = require('./../utils');\n\nfunction InterceptorManager() {\n this.handlers = [];\n}\n\n/**\n * Add a new interceptor to the stack\n *\n * @param {Function} fulfilled The function to handle `then` for a `Promise`\n * @param {Function} rejected The function to handle `reject` for a `Promise`\n *\n * @return {Number} An ID used to remove interceptor later\n */\nInterceptorManager.prototype.use = function use(fulfilled, rejected, options) {\n this.handlers.push({\n fulfilled: fulfilled,\n rejected: rejected,\n synchronous: options ? options.synchronous : false,\n runWhen: options ? options.runWhen : null\n });\n return this.handlers.length - 1;\n};\n\n/**\n * Remove an interceptor from the stack\n *\n * @param {Number} id The ID that was returned by `use`\n */\nInterceptorManager.prototype.eject = function eject(id) {\n if (this.handlers[id]) {\n this.handlers[id] = null;\n }\n};\n\n/**\n * Iterate over all the registered interceptors\n *\n * This method is particularly useful for skipping over any\n * interceptors that may have become `null` calling `eject`.\n *\n * @param {Function} fn The function to call for each interceptor\n */\nInterceptorManager.prototype.forEach = function forEach(fn) {\n utils.forEach(this.handlers, function forEachHandler(h) {\n if (h !== null) {\n fn(h);\n }\n });\n};\n\nmodule.exports = InterceptorManager;\n","'use strict';\n\nvar utils = require('../utils');\n\nmodule.exports = function normalizeHeaderName(headers, normalizedName) {\n utils.forEach(headers, function processHeader(value, name) {\n if (name !== normalizedName && name.toUpperCase() === normalizedName.toUpperCase()) {\n headers[normalizedName] = value;\n delete headers[name];\n }\n });\n};\n","'use strict';\n\n/**\n * Update an Error with the specified config, error code, and response.\n *\n * @param {Error} error The error to update.\n * @param {Object} config The config.\n * @param {string} [code] The error code (for example, 'ECONNABORTED').\n * @param {Object} [request] The request.\n * @param {Object} [response] The response.\n * @returns {Error} The error.\n */\nmodule.exports = function enhanceError(error, config, code, request, response) {\n error.config = config;\n if (code) {\n error.code = code;\n }\n\n error.request = request;\n error.response = response;\n error.isAxiosError = true;\n\n error.toJSON = function toJSON() {\n return {\n // Standard\n message: this.message,\n name: this.name,\n // Microsoft\n description: this.description,\n number: this.number,\n // Mozilla\n fileName: this.fileName,\n lineNumber: this.lineNumber,\n columnNumber: this.columnNumber,\n stack: this.stack,\n // Axios\n config: this.config,\n code: this.code\n };\n };\n return error;\n};\n","'use strict';\n\nvar enhanceError = require('./enhanceError');\n\n/**\n * Create an Error with the specified message, config, error code, request and response.\n *\n * @param {string} message The error message.\n * @param {Object} config The config.\n * @param {string} [code] The error code (for example, 'ECONNABORTED').\n * @param {Object} [request] The request.\n * @param {Object} [response] The response.\n * @returns {Error} The created error.\n */\nmodule.exports = function createError(message, config, code, request, response) {\n var error = new Error(message);\n return enhanceError(error, config, code, request, response);\n};\n","'use strict';\n\nvar createError = require('./createError');\n\n/**\n * Resolve or reject a Promise based on response status.\n *\n * @param {Function} resolve A function that resolves the promise.\n * @param {Function} reject A function that rejects the promise.\n * @param {object} response The response.\n */\nmodule.exports = function settle(resolve, reject, response) {\n var validateStatus = response.config.validateStatus;\n if (!response.status || !validateStatus || validateStatus(response.status)) {\n resolve(response);\n } else {\n reject(createError(\n 'Request failed with status code ' + response.status,\n response.config,\n null,\n response.request,\n response\n ));\n }\n};\n","'use strict';\n\nvar utils = require('./../utils');\n\nmodule.exports = (\n utils.isStandardBrowserEnv() ?\n\n // Standard browser envs support document.cookie\n (function standardBrowserEnv() {\n return {\n write: function write(name, value, expires, path, domain, secure) {\n var cookie = [];\n cookie.push(name + '=' + encodeURIComponent(value));\n\n if (utils.isNumber(expires)) {\n cookie.push('expires=' + new Date(expires).toGMTString());\n }\n\n if (utils.isString(path)) {\n cookie.push('path=' + path);\n }\n\n if (utils.isString(domain)) {\n cookie.push('domain=' + domain);\n }\n\n if (secure === true) {\n cookie.push('secure');\n }\n\n document.cookie = cookie.join('; ');\n },\n\n read: function read(name) {\n var match = document.cookie.match(new RegExp('(^|;\\\\s*)(' + name + ')=([^;]*)'));\n return (match ? decodeURIComponent(match[3]) : null);\n },\n\n remove: function remove(name) {\n this.write(name, '', Date.now() - 86400000);\n }\n };\n })() :\n\n // Non standard browser env (web workers, react-native) lack needed support.\n (function nonStandardBrowserEnv() {\n return {\n write: function write() {},\n read: function read() { return null; },\n remove: function remove() {}\n };\n })()\n);\n","'use strict';\n\n/**\n * Determines whether the specified URL is absolute\n *\n * @param {string} url The URL to test\n * @returns {boolean} True if the specified URL is absolute, otherwise false\n */\nmodule.exports = function isAbsoluteURL(url) {\n // A URL is considered absolute if it begins with \"<scheme>://\" or \"//\" (protocol-relative URL).\n // RFC 3986 defines scheme name as a sequence of characters beginning with a letter and followed\n // by any combination of letters, digits, plus, period, or hyphen.\n return /^([a-z][a-z\\d\\+\\-\\.]*:)?\\/\\//i.test(url);\n};\n","'use strict';\n\n/**\n * Creates a new URL by combining the specified URLs\n *\n * @param {string} baseURL The base URL\n * @param {string} relativeURL The relative URL\n * @returns {string} The combined URL\n */\nmodule.exports = function combineURLs(baseURL, relativeURL) {\n return relativeURL\n ? baseURL.replace(/\\/+$/, '') + '/' + relativeURL.replace(/^\\/+/, '')\n : baseURL;\n};\n","'use strict';\n\nvar isAbsoluteURL = require('../helpers/isAbsoluteURL');\nvar combineURLs = require('../helpers/combineURLs');\n\n/**\n * Creates a new URL by combining the baseURL with the requestedURL,\n * only when the requestedURL is not already an absolute URL.\n * If the requestURL is absolute, this function returns the requestedURL untouched.\n *\n * @param {string} baseURL The base URL\n * @param {string} requestedURL Absolute or relative URL to combine\n * @returns {string} The combined full path\n */\nmodule.exports = function buildFullPath(baseURL, requestedURL) {\n if (baseURL && !isAbsoluteURL(requestedURL)) {\n return combineURLs(baseURL, requestedURL);\n }\n return requestedURL;\n};\n","'use strict';\n\nvar utils = require('./../utils');\n\n// Headers whose duplicates are ignored by node\n// c.f. https://nodejs.org/api/http.html#http_message_headers\nvar ignoreDuplicateOf = [\n 'age', 'authorization', 'content-length', 'content-type', 'etag',\n 'expires', 'from', 'host', 'if-modified-since', 'if-unmodified-since',\n 'last-modified', 'location', 'max-forwards', 'proxy-authorization',\n 'referer', 'retry-after', 'user-agent'\n];\n\n/**\n * Parse headers into an object\n *\n * ```\n * Date: Wed, 27 Aug 2014 08:58:49 GMT\n * Content-Type: application/json\n * Connection: keep-alive\n * Transfer-Encoding: chunked\n * ```\n *\n * @param {String} headers Headers needing to be parsed\n * @returns {Object} Headers parsed into an object\n */\nmodule.exports = function parseHeaders(headers) {\n var parsed = {};\n var key;\n var val;\n var i;\n\n if (!headers) { return parsed; }\n\n utils.forEach(headers.split('\\n'), function parser(line) {\n i = line.indexOf(':');\n key = utils.trim(line.substr(0, i)).toLowerCase();\n val = utils.trim(line.substr(i + 1));\n\n if (key) {\n if (parsed[key] && ignoreDuplicateOf.indexOf(key) >= 0) {\n return;\n }\n if (key === 'set-cookie') {\n parsed[key] = (parsed[key] ? parsed[key] : []).concat([val]);\n } else {\n parsed[key] = parsed[key] ? parsed[key] + ', ' + val : val;\n }\n }\n });\n\n return parsed;\n};\n","'use strict';\n\nvar utils = require('./../utils');\n\nmodule.exports = (\n utils.isStandardBrowserEnv() ?\n\n // Standard browser envs have full support of the APIs needed to test\n // whether the request URL is of the same origin as current location.\n (function standardBrowserEnv() {\n var msie = /(msie|trident)/i.test(navigator.userAgent);\n var urlParsingNode = document.createElement('a');\n var originURL;\n\n /**\n * Parse a URL to discover it's components\n *\n * @param {String} url The URL to be parsed\n * @returns {Object}\n */\n function resolveURL(url) {\n var href = url;\n\n if (msie) {\n // IE needs attribute set twice to normalize properties\n urlParsingNode.setAttribute('href', href);\n href = urlParsingNode.href;\n }\n\n urlParsingNode.setAttribute('href', href);\n\n // urlParsingNode provides the UrlUtils interface - http://url.spec.whatwg.org/#urlutils\n return {\n href: urlParsingNode.href,\n protocol: urlParsingNode.protocol ? urlParsingNode.protocol.replace(/:$/, '') : '',\n host: urlParsingNode.host,\n search: urlParsingNode.search ? urlParsingNode.search.replace(/^\\?/, '') : '',\n hash: urlParsingNode.hash ? urlParsingNode.hash.replace(/^#/, '') : '',\n hostname: urlParsingNode.hostname,\n port: urlParsingNode.port,\n pathname: (urlParsingNode.pathname.charAt(0) === '/') ?\n urlParsingNode.pathname :\n '/' + urlParsingNode.pathname\n };\n }\n\n originURL = resolveURL(window.location.href);\n\n /**\n * Determine if a URL shares the same origin as the current location\n *\n * @param {String} requestURL The URL to test\n * @returns {boolean} True if URL shares the same origin, otherwise false\n */\n return function isURLSameOrigin(requestURL) {\n var parsed = (utils.isString(requestURL)) ? resolveURL(requestURL) : requestURL;\n return (parsed.protocol === originURL.protocol &&\n parsed.host === originURL.host);\n };\n })() :\n\n // Non standard browser envs (web workers, react-native) lack needed support.\n (function nonStandardBrowserEnv() {\n return function isURLSameOrigin() {\n return true;\n };\n })()\n);\n","'use strict';\n\nvar utils = require('./../utils');\nvar settle = require('./../core/settle');\nvar cookies = require('./../helpers/cookies');\nvar buildURL = require('./../helpers/buildURL');\nvar buildFullPath = require('../core/buildFullPath');\nvar parseHeaders = require('./../helpers/parseHeaders');\nvar isURLSameOrigin = require('./../helpers/isURLSameOrigin');\nvar createError = require('../core/createError');\n\nmodule.exports = function xhrAdapter(config) {\n return new Promise(function dispatchXhrRequest(resolve, reject) {\n var requestData = config.data;\n var requestHeaders = config.headers;\n var responseType = config.responseType;\n\n if (utils.isFormData(requestData)) {\n delete requestHeaders['Content-Type']; // Let the browser set it\n }\n\n var request = new XMLHttpRequest();\n\n // HTTP basic authentication\n if (config.auth) {\n var username = config.auth.username || '';\n var password = config.auth.password ? unescape(encodeURIComponent(config.auth.password)) : '';\n requestHeaders.Authorization = 'Basic ' + btoa(username + ':' + password);\n }\n\n var fullPath = buildFullPath(config.baseURL, config.url);\n request.open(config.method.toUpperCase(), buildURL(fullPath, config.params, config.paramsSerializer), true);\n\n // Set the request timeout in MS\n request.timeout = config.timeout;\n\n function onloadend() {\n if (!request) {\n return;\n }\n // Prepare the response\n var responseHeaders = 'getAllResponseHeaders' in request ? parseHeaders(request.getAllResponseHeaders()) : null;\n var responseData = !responseType || responseType === 'text' || responseType === 'json' ?\n request.responseText : request.response;\n var response = {\n data: responseData,\n status: request.status,\n statusText: request.statusText,\n headers: responseHeaders,\n config: config,\n request: request\n };\n\n settle(resolve, reject, response);\n\n // Clean up request\n request = null;\n }\n\n if ('onloadend' in request) {\n // Use onloadend if available\n request.onloadend = onloadend;\n } else {\n // Listen for ready state to emulate onloadend\n request.onreadystatechange = function handleLoad() {\n if (!request || request.readyState !== 4) {\n return;\n }\n\n // The request errored out and we didn't get a response, this will be\n // handled by onerror instead\n // With one exception: request that using file: protocol, most browsers\n // will return status as 0 even though it's a successful request\n if (request.status === 0 && !(request.responseURL && request.responseURL.indexOf('file:') === 0)) {\n return;\n }\n // readystate handler is calling before onerror or ontimeout handlers,\n // so we should call onloadend on the next 'tick'\n setTimeout(onloadend);\n };\n }\n\n // Handle browser request cancellation (as opposed to a manual cancellation)\n request.onabort = function handleAbort() {\n if (!request) {\n return;\n }\n\n reject(createError('Request aborted', config, 'ECONNABORTED', request));\n\n // Clean up request\n request = null;\n };\n\n // Handle low level network errors\n request.onerror = function handleError() {\n // Real errors are hidden from us by the browser\n // onerror should only fire if it's a network error\n reject(createError('Network Error', config, null, request));\n\n // Clean up request\n request = null;\n };\n\n // Handle timeout\n request.ontimeout = function handleTimeout() {\n var timeoutErrorMessage = 'timeout of ' + config.timeout + 'ms exceeded';\n if (config.timeoutErrorMessage) {\n timeoutErrorMessage = config.timeoutErrorMessage;\n }\n reject(createError(\n timeoutErrorMessage,\n config,\n config.transitional && config.transitional.clarifyTimeoutError ? 'ETIMEDOUT' : 'ECONNABORTED',\n request));\n\n // Clean up request\n request = null;\n };\n\n // Add xsrf header\n // This is only done if running in a standard browser environment.\n // Specifically not if we're in a web worker, or react-native.\n if (utils.isStandardBrowserEnv()) {\n // Add xsrf header\n var xsrfValue = (config.withCredentials || isURLSameOrigin(fullPath)) && config.xsrfCookieName ?\n cookies.read(config.xsrfCookieName) :\n undefined;\n\n if (xsrfValue) {\n requestHeaders[config.xsrfHeaderName] = xsrfValue;\n }\n }\n\n // Add headers to the request\n if ('setRequestHeader' in request) {\n utils.forEach(requestHeaders, function setRequestHeader(val, key) {\n if (typeof requestData === 'undefined' && key.toLowerCase() === 'content-type') {\n // Remove Content-Type if data is undefined\n delete requestHeaders[key];\n } else {\n // Otherwise add header to the request\n request.setRequestHeader(key, val);\n }\n });\n }\n\n // Add withCredentials to request if needed\n if (!utils.isUndefined(config.withCredentials)) {\n request.withCredentials = !!config.withCredentials;\n }\n\n // Add responseType to request if needed\n if (responseType && responseType !== 'json') {\n request.responseType = config.responseType;\n }\n\n // Handle progress if needed\n if (typeof config.onDownloadProgress === 'function') {\n request.addEventListener('progress', config.onDownloadProgress);\n }\n\n // Not all browsers support upload events\n if (typeof config.onUploadProgress === 'function' && request.upload) {\n request.upload.addEventListener('progress', config.onUploadProgress);\n }\n\n if (config.cancelToken) {\n // Handle cancellation\n config.cancelToken.promise.then(function onCanceled(cancel) {\n if (!request) {\n return;\n }\n\n request.abort();\n reject(cancel);\n // Clean up request\n request = null;\n });\n }\n\n if (!requestData) {\n requestData = null;\n }\n\n // Send the request\n request.send(requestData);\n });\n};\n","'use strict';\n\nvar utils = require('./utils');\nvar normalizeHeaderName = require('./helpers/normalizeHeaderName');\nvar enhanceError = require('./core/enhanceError');\n\nvar DEFAULT_CONTENT_TYPE = {\n 'Content-Type': 'application/x-www-form-urlencoded'\n};\n\nfunction setContentTypeIfUnset(headers, value) {\n if (!utils.isUndefined(headers) && utils.isUndefined(headers['Content-Type'])) {\n headers['Content-Type'] = value;\n }\n}\n\nfunction getDefaultAdapter() {\n var adapter;\n if (typeof XMLHttpRequest !== 'undefined') {\n // For browsers use XHR adapter\n adapter = require('./adapters/xhr');\n } else if (typeof process !== 'undefined' && Object.prototype.toString.call(process) === '[object process]') {\n // For node use HTTP adapter\n adapter = require('./adapters/http');\n }\n return adapter;\n}\n\nfunction stringifySafely(rawValue, parser, encoder) {\n if (utils.isString(rawValue)) {\n try {\n (parser || JSON.parse)(rawValue);\n return utils.trim(rawValue);\n } catch (e) {\n if (e.name !== 'SyntaxError') {\n throw e;\n }\n }\n }\n\n return (encoder || JSON.stringify)(rawValue);\n}\n\nvar defaults = {\n\n transitional: {\n silentJSONParsing: true,\n forcedJSONParsing: true,\n clarifyTimeoutError: false\n },\n\n adapter: getDefaultAdapter(),\n\n transformRequest: [function transformRequest(data, headers) {\n normalizeHeaderName(headers, 'Accept');\n normalizeHeaderName(headers, 'Content-Type');\n\n if (utils.isFormData(data) ||\n utils.isArrayBuffer(data) ||\n utils.isBuffer(data) ||\n utils.isStream(data) ||\n utils.isFile(data) ||\n utils.isBlob(data)\n ) {\n return data;\n }\n if (utils.isArrayBufferView(data)) {\n return data.buffer;\n }\n if (utils.isURLSearchParams(data)) {\n setContentTypeIfUnset(headers, 'application/x-www-form-urlencoded;charset=utf-8');\n return data.toString();\n }\n if (utils.isObject(data) || (headers && headers['Content-Type'] === 'application/json')) {\n setContentTypeIfUnset(headers, 'application/json');\n return stringifySafely(data);\n }\n return data;\n }],\n\n transformResponse: [function transformResponse(data) {\n var transitional = this.transitional;\n var silentJSONParsing = transitional && transitional.silentJSONParsing;\n var forcedJSONParsing = transitional && transitional.forcedJSONParsing;\n var strictJSONParsing = !silentJSONParsing && this.responseType === 'json';\n\n if (strictJSONParsing || (forcedJSONParsing && utils.isString(data) && data.length)) {\n try {\n return JSON.parse(data);\n } catch (e) {\n if (strictJSONParsing) {\n if (e.name === 'SyntaxError') {\n throw enhanceError(e, this, 'E_JSON_PARSE');\n }\n throw e;\n }\n }\n }\n\n return data;\n }],\n\n /**\n * A timeout in milliseconds to abort a request. If set to 0 (default) a\n * timeout is not created.\n */\n timeout: 0,\n\n xsrfCookieName: 'XSRF-TOKEN',\n xsrfHeaderName: 'X-XSRF-TOKEN',\n\n maxContentLength: -1,\n maxBodyLength: -1,\n\n validateStatus: function validateStatus(status) {\n return status >= 200 && status < 300;\n }\n};\n\ndefaults.headers = {\n common: {\n 'Accept': 'application/json, text/plain, */*'\n }\n};\n\nutils.forEach(['delete', 'get', 'head'], function forEachMethodNoData(method) {\n defaults.headers[method] = {};\n});\n\nutils.forEach(['post', 'put', 'patch'], function forEachMethodWithData(method) {\n defaults.headers[method] = utils.merge(DEFAULT_CONTENT_TYPE);\n});\n\nmodule.exports = defaults;\n","'use strict';\n\nvar utils = require('./../utils');\nvar defaults = require('./../defaults');\n\n/**\n * Transform the data for a request or a response\n *\n * @param {Object|String} data The data to be transformed\n * @param {Array} headers The headers for the request or response\n * @param {Array|Function} fns A single function or Array of functions\n * @returns {*} The resulting transformed data\n */\nmodule.exports = function transformData(data, headers, fns) {\n var context = this || defaults;\n /*eslint no-param-reassign:0*/\n utils.forEach(fns, function transform(fn) {\n data = fn.call(context, data, headers);\n });\n\n return data;\n};\n","'use strict';\n\nmodule.exports = function isCancel(value) {\n return !!(value && value.__CANCEL__);\n};\n","'use strict';\n\nvar utils = require('./../utils');\nvar transformData = require('./transformData');\nvar isCancel = require('../cancel/isCancel');\nvar defaults = require('../defaults');\n\n/**\n * Throws a `Cancel` if cancellation has been requested.\n */\nfunction throwIfCancellationRequested(config) {\n if (config.cancelToken) {\n config.cancelToken.throwIfRequested();\n }\n}\n\n/**\n * Dispatch a request to the server using the configured adapter.\n *\n * @param {object} config The config that is to be used for the request\n * @returns {Promise} The Promise to be fulfilled\n */\nmodule.exports = function dispatchRequest(config) {\n throwIfCancellationRequested(config);\n\n // Ensure headers exist\n config.headers = config.headers || {};\n\n // Transform request data\n config.data = transformData.call(\n config,\n config.data,\n config.headers,\n config.transformRequest\n );\n\n // Flatten headers\n config.headers = utils.merge(\n config.headers.common || {},\n config.headers[config.method] || {},\n config.headers\n );\n\n utils.forEach(\n ['delete', 'get', 'head', 'post', 'put', 'patch', 'common'],\n function cleanHeaderConfig(method) {\n delete config.headers[method];\n }\n );\n\n var adapter = config.adapter || defaults.adapter;\n\n return adapter(config).then(function onAdapterResolution(response) {\n throwIfCancellationRequested(config);\n\n // Transform response data\n response.data = transformData.call(\n config,\n response.data,\n response.headers,\n config.transformResponse\n );\n\n return response;\n }, function onAdapterRejection(reason) {\n if (!isCancel(reason)) {\n throwIfCancellationRequested(config);\n\n // Transform response data\n if (reason && reason.response) {\n reason.response.data = transformData.call(\n config,\n reason.response.data,\n reason.response.headers,\n config.transformResponse\n );\n }\n }\n\n return Promise.reject(reason);\n });\n};\n","'use strict';\n\nvar utils = require('../utils');\n\n/**\n * Config-specific merge-function which creates a new config-object\n * by merging two configuration objects together.\n *\n * @param {Object} config1\n * @param {Object} config2\n * @returns {Object} New object resulting from merging config2 to config1\n */\nmodule.exports = function mergeConfig(config1, config2) {\n // eslint-disable-next-line no-param-reassign\n config2 = config2 || {};\n var config = {};\n\n var valueFromConfig2Keys = ['url', 'method', 'data'];\n var mergeDeepPropertiesKeys = ['headers', 'auth', 'proxy', 'params'];\n var defaultToConfig2Keys = [\n 'baseURL', 'transformRequest', 'transformResponse', 'paramsSerializer',\n 'timeout', 'timeoutMessage', 'withCredentials', 'adapter', 'responseType', 'xsrfCookieName',\n 'xsrfHeaderName', 'onUploadProgress', 'onDownloadProgress', 'decompress',\n 'maxContentLength', 'maxBodyLength', 'maxRedirects', 'transport', 'httpAgent',\n 'httpsAgent', 'cancelToken', 'socketPath', 'responseEncoding'\n ];\n var directMergeKeys = ['validateStatus'];\n\n function getMergedValue(target, source) {\n if (utils.isPlainObject(target) && utils.isPlainObject(source)) {\n return utils.merge(target, source);\n } else if (utils.isPlainObject(source)) {\n return utils.merge({}, source);\n } else if (utils.isArray(source)) {\n return source.slice();\n }\n return source;\n }\n\n function mergeDeepProperties(prop) {\n if (!utils.isUndefined(config2[prop])) {\n config[prop] = getMergedValue(config1[prop], config2[prop]);\n } else if (!utils.isUndefined(config1[prop])) {\n config[prop] = getMergedValue(undefined, config1[prop]);\n }\n }\n\n utils.forEach(valueFromConfig2Keys, function valueFromConfig2(prop) {\n if (!utils.isUndefined(config2[prop])) {\n config[prop] = getMergedValue(undefined, config2[prop]);\n }\n });\n\n utils.forEach(mergeDeepPropertiesKeys, mergeDeepProperties);\n\n utils.forEach(defaultToConfig2Keys, function defaultToConfig2(prop) {\n if (!utils.isUndefined(config2[prop])) {\n config[prop] = getMergedValue(undefined, config2[prop]);\n } else if (!utils.isUndefined(config1[prop])) {\n config[prop] = getMergedValue(undefined, config1[prop]);\n }\n });\n\n utils.forEach(directMergeKeys, function merge(prop) {\n if (prop in config2) {\n config[prop] = getMergedValue(config1[prop], config2[prop]);\n } else if (prop in config1) {\n config[prop] = getMergedValue(undefined, config1[prop]);\n }\n });\n\n var axiosKeys = valueFromConfig2Keys\n .concat(mergeDeepPropertiesKeys)\n .concat(defaultToConfig2Keys)\n .concat(directMergeKeys);\n\n var otherKeys = Object\n .keys(config1)\n .concat(Object.keys(config2))\n .filter(function filterAxiosKeys(key) {\n return axiosKeys.indexOf(key) === -1;\n });\n\n utils.forEach(otherKeys, mergeDeepProperties);\n\n return config;\n};\n","'use strict';\n\nvar pkg = require('./../../package.json');\n\nvar validators = {};\n\n// eslint-disable-next-line func-names\n['object', 'boolean', 'number', 'function', 'string', 'symbol'].forEach(function(type, i) {\n validators[type] = function validator(thing) {\n return typeof thing === type || 'a' + (i < 1 ? 'n ' : ' ') + type;\n };\n});\n\nvar deprecatedWarnings = {};\nvar currentVerArr = pkg.version.split('.');\n\n/**\n * Compare package versions\n * @param {string} version\n * @param {string?} thanVersion\n * @returns {boolean}\n */\nfunction isOlderVersion(version, thanVersion) {\n var pkgVersionArr = thanVersion ? thanVersion.split('.') : currentVerArr;\n var destVer = version.split('.');\n for (var i = 0; i < 3; i++) {\n if (pkgVersionArr[i] > destVer[i]) {\n return true;\n } else if (pkgVersionArr[i] < destVer[i]) {\n return false;\n }\n }\n return false;\n}\n\n/**\n * Transitional option validator\n * @param {function|boolean?} validator\n * @param {string?} version\n * @param {string} message\n * @returns {function}\n */\nvalidators.transitional = function transitional(validator, version, message) {\n var isDeprecated = version && isOlderVersion(version);\n\n function formatMessage(opt, desc) {\n return '[Axios v' + pkg.version + '] Transitional option \\'' + opt + '\\'' + desc + (message ? '. ' + message : '');\n }\n\n // eslint-disable-next-line func-names\n return function(value, opt, opts) {\n if (validator === false) {\n throw new Error(formatMessage(opt, ' has been removed in ' + version));\n }\n\n if (isDeprecated && !deprecatedWarnings[opt]) {\n deprecatedWarnings[opt] = true;\n // eslint-disable-next-line no-console\n console.warn(\n formatMessage(\n opt,\n ' has been deprecated since v' + version + ' and will be removed in the near future'\n )\n );\n }\n\n return validator ? validator(value, opt, opts) : true;\n };\n};\n\n/**\n * Assert object's properties type\n * @param {object} options\n * @param {object} schema\n * @param {boolean?} allowUnknown\n */\n\nfunction assertOptions(options, schema, allowUnknown) {\n if (typeof options !== 'object') {\n throw new TypeError('options must be an object');\n }\n var keys = Object.keys(options);\n var i = keys.length;\n while (i-- > 0) {\n var opt = keys[i];\n var validator = schema[opt];\n if (validator) {\n var value = options[opt];\n var result = value === undefined || validator(value, opt, options);\n if (result !== true) {\n throw new TypeError('option ' + opt + ' must be ' + result);\n }\n continue;\n }\n if (allowUnknown !== true) {\n throw Error('Unknown option ' + opt);\n }\n }\n}\n\nmodule.exports = {\n isOlderVersion: isOlderVersion,\n assertOptions: assertOptions,\n validators: validators\n};\n","'use strict';\n\nvar utils = require('./../utils');\nvar buildURL = require('../helpers/buildURL');\nvar InterceptorManager = require('./InterceptorManager');\nvar dispatchRequest = require('./dispatchRequest');\nvar mergeConfig = require('./mergeConfig');\nvar validator = require('../helpers/validator');\n\nvar validators = validator.validators;\n/**\n * Create a new instance of Axios\n *\n * @param {Object} instanceConfig The default config for the instance\n */\nfunction Axios(instanceConfig) {\n this.defaults = instanceConfig;\n this.interceptors = {\n request: new InterceptorManager(),\n response: new InterceptorManager()\n };\n}\n\n/**\n * Dispatch a request\n *\n * @param {Object} config The config specific for this request (merged with this.defaults)\n */\nAxios.prototype.request = function request(config) {\n /*eslint no-param-reassign:0*/\n // Allow for axios('example/url'[, config]) a la fetch API\n if (typeof config === 'string') {\n config = arguments[1] || {};\n config.url = arguments[0];\n } else {\n config = config || {};\n }\n\n config = mergeConfig(this.defaults, config);\n\n // Set config.method\n if (config.method) {\n config.method = config.method.toLowerCase();\n } else if (this.defaults.method) {\n config.method = this.defaults.method.toLowerCase();\n } else {\n config.method = 'get';\n }\n\n var transitional = config.transitional;\n\n if (transitional !== undefined) {\n validator.assertOptions(transitional, {\n silentJSONParsing: validators.transitional(validators.boolean, '1.0.0'),\n forcedJSONParsing: validators.transitional(validators.boolean, '1.0.0'),\n clarifyTimeoutError: validators.transitional(validators.boolean, '1.0.0')\n }, false);\n }\n\n // filter out skipped interceptors\n var requestInterceptorChain = [];\n var synchronousRequestInterceptors = true;\n this.interceptors.request.forEach(function unshiftRequestInterceptors(interceptor) {\n if (typeof interceptor.runWhen === 'function' && interceptor.runWhen(config) === false) {\n return;\n }\n\n synchronousRequestInterceptors = synchronousRequestInterceptors && interceptor.synchronous;\n\n requestInterceptorChain.unshift(interceptor.fulfilled, interceptor.rejected);\n });\n\n var responseInterceptorChain = [];\n this.interceptors.response.forEach(function pushResponseInterceptors(interceptor) {\n responseInterceptorChain.push(interceptor.fulfilled, interceptor.rejected);\n });\n\n var promise;\n\n if (!synchronousRequestInterceptors) {\n var chain = [dispatchRequest, undefined];\n\n Array.prototype.unshift.apply(chain, requestInterceptorChain);\n chain = chain.concat(responseInterceptorChain);\n\n promise = Promise.resolve(config);\n while (chain.length) {\n promise = promise.then(chain.shift(), chain.shift());\n }\n\n return promise;\n }\n\n\n var newConfig = config;\n while (requestInterceptorChain.length) {\n var onFulfilled = requestInterceptorChain.shift();\n var onRejected = requestInterceptorChain.shift();\n try {\n newConfig = onFulfilled(newConfig);\n } catch (error) {\n onRejected(error);\n break;\n }\n }\n\n try {\n promise = dispatchRequest(newConfig);\n } catch (error) {\n return Promise.reject(error);\n }\n\n while (responseInterceptorChain.length) {\n promise = promise.then(responseInterceptorChain.shift(), responseInterceptorChain.shift());\n }\n\n return promise;\n};\n\nAxios.prototype.getUri = function getUri(config) {\n config = mergeConfig(this.defaults, config);\n return buildURL(config.url, config.params, config.paramsSerializer).replace(/^\\?/, '');\n};\n\n// Provide aliases for supported request methods\nutils.forEach(['delete', 'get', 'head', 'options'], function forEachMethodNoData(method) {\n /*eslint func-names:0*/\n Axios.prototype[method] = function(url, config) {\n return this.request(mergeConfig(config || {}, {\n method: method,\n url: url,\n data: (config || {}).data\n }));\n };\n});\n\nutils.forEach(['post', 'put', 'patch'], function forEachMethodWithData(method) {\n /*eslint func-names:0*/\n Axios.prototype[method] = function(url, data, config) {\n return this.request(mergeConfig(config || {}, {\n method: method,\n url: url,\n data: data\n }));\n };\n});\n\nmodule.exports = Axios;\n","'use strict';\n\n/**\n * A `Cancel` is an object that is thrown when an operation is canceled.\n *\n * @class\n * @param {string=} message The message.\n */\nfunction Cancel(message) {\n this.message = message;\n}\n\nCancel.prototype.toString = function toString() {\n return 'Cancel' + (this.message ? ': ' + this.message : '');\n};\n\nCancel.prototype.__CANCEL__ = true;\n\nmodule.exports = Cancel;\n","'use strict';\n\nvar Cancel = require('./Cancel');\n\n/**\n * A `CancelToken` is an object that can be used to request cancellation of an operation.\n *\n * @class\n * @param {Function} executor The executor function.\n */\nfunction CancelToken(executor) {\n if (typeof executor !== 'function') {\n throw new TypeError('executor must be a function.');\n }\n\n var resolvePromise;\n this.promise = new Promise(function promiseExecutor(resolve) {\n resolvePromise = resolve;\n });\n\n var token = this;\n executor(function cancel(message) {\n if (token.reason) {\n // Cancellation has already been requested\n return;\n }\n\n token.reason = new Cancel(message);\n resolvePromise(token.reason);\n });\n}\n\n/**\n * Throws a `Cancel` if cancellation has been requested.\n */\nCancelToken.prototype.throwIfRequested = function throwIfRequested() {\n if (this.reason) {\n throw this.reason;\n }\n};\n\n/**\n * Returns an object that contains a new `CancelToken` and a function that, when called,\n * cancels the `CancelToken`.\n */\nCancelToken.source = function source() {\n var cancel;\n var token = new CancelToken(function executor(c) {\n cancel = c;\n });\n return {\n token: token,\n cancel: cancel\n };\n};\n\nmodule.exports = CancelToken;\n","'use strict';\n\n/**\n * Syntactic sugar for invoking a function and expanding an array for arguments.\n *\n * Common use case would be to use `Function.prototype.apply`.\n *\n * ```js\n * function f(x, y, z) {}\n * var args = [1, 2, 3];\n * f.apply(null, args);\n * ```\n *\n * With `spread` this example can be re-written.\n *\n * ```js\n * spread(function(x, y, z) {})([1, 2, 3]);\n * ```\n *\n * @param {Function} callback\n * @returns {Function}\n */\nmodule.exports = function spread(callback) {\n return function wrap(arr) {\n return callback.apply(null, arr);\n };\n};\n","'use strict';\n\n/**\n * Determines whether the payload is an error thrown by Axios\n *\n * @param {*} payload The value to test\n * @returns {boolean} True if the payload is an error thrown by Axios, otherwise false\n */\nmodule.exports = function isAxiosError(payload) {\n return (typeof payload === 'object') && (payload.isAxiosError === true);\n};\n","'use strict';\n\nvar utils = require('./utils');\nvar bind = require('./helpers/bind');\nvar Axios = require('./core/Axios');\nvar mergeConfig = require('./core/mergeConfig');\nvar defaults = require('./defaults');\n\n/**\n * Create an instance of Axios\n *\n * @param {Object} defaultConfig The default config for the instance\n * @return {Axios} A new instance of Axios\n */\nfunction createInstance(defaultConfig) {\n var context = new Axios(defaultConfig);\n var instance = bind(Axios.prototype.request, context);\n\n // Copy axios.prototype to instance\n utils.extend(instance, Axios.prototype, context);\n\n // Copy context to instance\n utils.extend(instance, context);\n\n return instance;\n}\n\n// Create the default instance to be exported\nvar axios = createInstance(defaults);\n\n// Expose Axios class to allow class inheritance\naxios.Axios = Axios;\n\n// Factory for creating new instances\naxios.create = function create(instanceConfig) {\n return createInstance(mergeConfig(axios.defaults, instanceConfig));\n};\n\n// Expose Cancel & CancelToken\naxios.Cancel = require('./cancel/Cancel');\naxios.CancelToken = require('./cancel/CancelToken');\naxios.isCancel = require('./cancel/isCancel');\n\n// Expose all/spread\naxios.all = function all(promises) {\n return Promise.all(promises);\n};\naxios.spread = require('./helpers/spread');\n\n// Expose isAxiosError\naxios.isAxiosError = require('./helpers/isAxiosError');\n\nmodule.exports = axios;\n\n// Allow use of default import syntax in TypeScript\nmodule.exports.default = axios;\n","module.exports = require('./lib/axios');","import axios from 'axios';\nimport EventEmitter from './EventEmitter.js';\n\n/**\n * API客户端(使用axios)\n * 支持浏览器和Node.js环境\n */\nclass ApiClient extends EventEmitter {\n constructor(apiKey, apiUrl = 'https://api.deepseek.com/v1/chat/completions') {\n super();\n this.apiKey = apiKey;\n this.url = apiUrl;\n this.isGenerating = false;\n this.cancelTokenSource = null;\n \n // 创建axios实例\n this.axiosInstance = axios.create({\n baseURL: apiUrl,\n headers: {\n 'Authorization': `Bearer ${apiKey}`,\n 'Content-Type': 'application/json'\n },\n timeout: 30000 // 30秒超时\n });\n }\n\n setApiKey(apiKey) {\n if (!apiKey || typeof apiKey !== 'string') {\n throw new Error('无效的API Key');\n }\n this.apiKey = apiKey;\n this.axiosInstance.defaults.headers['Authorization'] = `Bearer ${apiKey}`;\n }\n\n setApiUrl(apiUrl) {\n if (!apiUrl || typeof apiUrl !== 'string') {\n throw new Error('无效的API URL');\n }\n this.url = apiUrl;\n this.axiosInstance.defaults.baseURL = apiUrl;\n }\n\n async send(body) {\n this.isGenerating = true;\n this.cancelTokenSource = axios.CancelToken.source();\n \n try {\n // 触发事件:开始发送\n this.emit('request-start', { body });\n \n const requestBody = this._buildRequestBody(body);\n const response = await this.axiosInstance.post('', requestBody, {\n cancelToken: this.cancelTokenSource.token\n });\n \n // 触发事件:请求成功\n this.emit('request-success', { response: response.data });\n \n return response.data;\n } catch (error) {\n if (axios.isCancel(error)) {\n const cancelError = new Error('请求被中断');\n cancelError.name = 'CancelError';\n // 触发事件:请求被取消\n this.emit('request-cancel', { error: cancelError });\n throw cancelError;\n }\n \n // 触发事件:请求失败\n this.emit('request-error', { error });\n throw this._handleAxiosError(error);\n } finally {\n this.isGenerating = false;\n this.cancelTokenSource = null;\n }\n }\n\n async strSend(body, onProgress, onDone) {\n this.isGenerating = true;\n this.cancelTokenSource = axios.CancelToken.source();\n \n try {\n // 防错机制:确保回调函数存在\n const safeOnProgress = typeof onProgress === 'function' ? onProgress : () => {};\n const safeOnDone = typeof onDone === 'function' ? onDone : () => {};\n \n // 触发事件:开始流式请求\n this.emit('stream-start', { body });\n \n const requestBody = this._buildRequestBody(body);\n const response = await fetch(this.url, {\n method: 'POST',\n headers: {\n 'Content-Type': 'application/json',\n 'Authorization': `Bearer ${this.apiKey}`,\n 'Accept': 'text/event-stream'\n },\n body: requestBody,\n signal: this.cancelTokenSource.token ? \n new AbortController().signal : undefined\n });\n\n if (!response.ok) {\n throw new Error(`HTTP错误: ${response.status}`);\n }\n\n const reader = response.body.getReader();\n const decoder = new TextDecoder();\n let buffer = '';\n const message = {\n // 基础信息(符合Messages格式)\n role: 'assistant',\n content: '',\n reasoning_content: '',\n timestamp: new Date(),\n \n // 工具调用\n tool_calls: [],\n \n // 流式元数据\n streamMetadata: {\n chunkCount: 0,\n firstChunkTime: Date.now(),\n lastChunkTime: null,\n isStreaming: true\n }\n };\n\n while (true) {\n const { done, value } = await reader.read();\n if (done) break;\n\n buffer += decoder.decode(value, { stream: true });\n let lines = buffer.split(/(\\r?\\n){2,}/);\n buffer = lines.pop() || '';\n\n for (let rawChunk of lines) {\n const cleanChunk = rawChunk.trim().replace(/^data: /, '');\n if (!cleanChunk) continue;\n if (cleanChunk === '[DONE]') {\n // 触发事件:流式传输完成\n this.emit('stream-done', { message });\n safeOnDone({ ...message });\n return;\n }\n \n try {\n const obj = JSON.parse(cleanChunk);\n console.log('🔍 收到流式chunk:', obj);\n \n // 更新流式元数据\n message.streamMetadata.chunkCount++;\n message.streamMetadata.lastChunkTime = Date.now();\n \n // 收集内容\n if (obj.choices?.[0]?.delta?.content) {\n message.content += obj.choices[0].delta.content;\n }\n if (obj.choices?.[0]?.delta?.reasoning_content) {\n message.reasoning_content += obj.choices[0].delta.reasoning_content;\n }\n \n // 收集工具调用\n if (obj.choices?.[0]?.delta?.tool_calls) {\n const deltaToolCalls = obj.choices[0].delta.tool_calls;\n deltaToolCalls.forEach(toolCall => {\n const index = toolCall.index || 0;\n \n // 确保数组存在\n if (!message.tool_calls) message.tool_calls = [];\n \n // 初始化或更新\n if (!message.tool_calls[index]) {\n message.tool_calls[index] = {\n id: '',\n type: 'function',\n function: { name: '', arguments: '' }\n };\n }\n \n // 只更新非空字段\n if (toolCall.id) message.tool_calls[index].id = toolCall.id;\n if (toolCall.type) message.tool_calls[index].type = toolCall.type;\n if (toolCall.function?.name) {\n message.tool_calls[index].function.name += toolCall.function.name;\n }\n if (toolCall.function?.arguments) {\n message.tool_calls[index].function.arguments += toolCall.function.arguments;\n }\n });\n }\n \n // 触发事件:收到流式数据块(发送符合Messages格式的数据)\n this.emit('stream-chunk', { \n chunk: obj, \n message: { ...message } // 发送副本\n });\n safeOnProgress({ ...message });\n } catch (e) {\n console.error('🔍 解析chunk错误:', e, '原始数据:', cleanChunk);\n }\n }\n\n if (!this.isGenerating) {\n break;\n }\n }\n \n // 标记流式结束\n message.streamMetadata.isStreaming = false;\n message.streamMetadata.completedAt = new Date();\n \n // 触发事件:流式传输完成\n this.emit('stream-done', { message: { ...message } });\n safeOnDone({ ...message });\n \n } catch (error) {\n if (error.name === 'AbortError' || axios.isCancel(error)) {\n const cancelError = new Error('请求被中断');\n cancelError.name = 'CancelError';\n // 触发事件:流式请求被取消\n this.emit('stream-cancel', { error: cancelError });\n throw cancelError;\n }\n \n // 触发事件:流式请求失败\n this.emit('stream-error', { error });\n throw error;\n } finally {\n this.isGenerating = false;\n this.cancelTokenSource = null;\n }\n }\n\n interrupt() {\n if (this.isGenerating && this.cancelTokenSource) {\n this.cancelTokenSource.cancel('用户中断请求');\n this.isGenerating = false;\n }\n }\n\n _buildRequestBody(body) {\n if (typeof body?.toJSON === 'function') {\n return body.toJSON();\n } else if (typeof body === 'object' && body !== null) {\n return JSON.stringify(body);\n } else if (typeof body === 'string') {\n try {\n JSON.parse(body);\n return body;\n } catch {\n throw new Error('字符串不是有效的JSON格式');\n }\n } else {\n throw new Error('无效的请求体类型,应传入对象或JSON字符串');\n }\n }\n\n _handleAxiosError(error) {\n if (error.response) {\n // 服务器返回错误状态码\n const status = error.response.status;\n const data = error.response.data;\n \n let message = `API错误 ${status}`;\n if (data?.error?.message) {\n message += `: ${data.error.message}`;\n }\n \n return new Error(message);\n } else if (error.request) {\n // 请求发送但无响应\n return new Error('网络错误:无法连接到API服务器');\n } else {\n // 其他错误\n return error;\n }\n }\n\n static parseCompatible(obj) {\n // 保持原有方法不变\n if (obj?.__format_version === 1 && obj.payload) {\n return {\n messages: obj.payload.messages || [],\n systems: obj.payload.systems || [],\n hintData: obj.payload.hintData || { \n name: '', \n toolState: { \n currentTime: '同步失败', \n currentTime_TS: 0 \n }\n },\n tools: obj.payload.tools || []\n };\n }\n\n if (obj?.messages && Array.isArray(obj.messages)) {\n return {\n messages: obj.messages || [],\n systems: obj.systems || [],\n hintData: obj.hintData || { \n name: '', \n toolState: { \n currentTime: '同步失败', \n currentTime_TS: 0 \n }\n },\n tools: obj.tools || []\n };\n }\n\n throw new Error('无法识别的聊天数据格式');\n }\n}\n\nexport default ApiClient;","\r\n/**\r\n * 智能配置管理器\r\n * 支持配置变更自动回调\r\n*/\r\nimport EventEmitter from './EventEmitter.js';\r\n\r\nclass ConfigManager extends EventEmitter {\r\n constructor(defaultConfig = {}) {\r\n super();\r\n \r\n // 深拷贝默认配置\r\n this._config = JSON.parse(JSON.stringify(defaultConfig));\r\n \r\n // 存储配置处理器\r\n this._handlers = new Map(); // key -> handler function\r\n \r\n // 创建代理,监听配置变更\r\n this.config = this._createProxy(this._config);\r\n }\r\n\r\n /**\r\n * 创建配置代理\r\n */\r\n _createProxy(target, path = '') {\r\n return new Proxy(target, {\r\n set: (obj, prop, value) => {\r\n const oldValue = obj[prop];\r\n const fullPath = path ? `${path}.${prop}` : prop;\r\n \r\n // 如果是对象,递归创建代理\r\n if (value && typeof value === 'object' && !Array.isArray(value)) {\r\n value = this._createProxy(value, fullPath);\r\n }\r\n \r\n // 设置新值\r\n obj[prop] = value;\r\n \r\n // 触发变更事件\r\n this._triggerChange(fullPath, oldValue, value);\r\n \r\n return true;\r\n },\r\n \r\n deleteProperty: (obj, prop) => {\r\n const oldValue = obj[prop];\r\n const fullPath = path ? `${path}.${prop}` : prop;\r\n \r\n delete obj[prop];\r\n \r\n // 触发删除事件\r\n this.emit('config-deleted', {\r\n path: fullPath,\r\n oldValue,\r\n timestamp: new Date()\r\n });\r\n \r\n return true;\r\n }\r\n });\r\n }\r\n\r\n /**\r\n * 注册配置处理器\r\n */\r\n registerHandler(path, handler) {\r\n if (!this._handlers.has(path)) {\r\n this._handlers.set(path, []);\r\n }\r\n this._handlers.get(path).push(handler);\r\n return this;\r\n }\r\n\r\n /**\r\n * 移除配置处理器\r\n */\r\n removeHandler(path, handler) {\r\n const handlers = this._handlers.get(path);\r\n if (handlers) {\r\n const index = handlers.indexOf(handler);\r\n if (index > -1) {\r\n handlers.splice(index, 1);\r\n }\r\n }\r\n return this;\r\n }\r\n\r\n /**\r\n * 触发配置变更\r\n */\r\n _triggerChange(path, oldValue, newValue) {\r\n // 触发通用变更事件\r\n this.emit('config-changed', {\r\n path,\r\n oldValue,\r\n newValue,\r\n timestamp: new Date()\r\n });\r\n \r\n // 触发特定路径事件\r\n this.emit(`config-changed:${path}`, {\r\n oldValue,\r\n newValue,\r\n timestamp: new Date()\r\n });\r\n \r\n // 执行注册的处理器\r\n const handlers = this._handlers.get(path);\r\n if (handlers) {\r\n handlers.forEach(handler => {\r\n try {\r\n handler(newValue, oldValue, path);\r\n } catch (error) {\r\n console.error(`配置处理器执行失败 (${path}):`, error);\r\n }\r\n });\r\n }\r\n \r\n // 触发父级路径的处理器(支持通配符)\r\n const pathParts = path.split('.');\r\n for (let i = pathParts.length - 1; i >= 0; i--) {\r\n const parentPath = pathParts.slice(0, i).join('.');\r\n const wildcardPath = parentPath ? `${parentPath}.*` : '*';\r\n \r\n const parentHandlers = this._handlers.get(wildcardPath);\r\n if (parentHandlers) {\r\n parentHandlers.forEach(handler => {\r\n try {\r\n handler(newValue, oldValue, path);\r\n } catch (error) {\r\n console.error(`通配符处理器执行失败 (${wildcardPath}):`, error);\r\n }\r\n });\r\n }\r\n }\r\n }\r\n\r\n /**\r\n * 获取配置快照(非代理版本)\r\n */\r\n getSnapshot() {\r\n return JSON.parse(JSON.stringify(this._config));\r\n }\r\n\r\n /**\r\n * 批量更新配置\r\n */\r\n update(newConfig) {\r\n Object.keys(newConfig).forEach(key => {\r\n this.config[key] = newConfig[key];\r\n });\r\n return this;\r\n }\r\n\r\n /**\r\n * 重置为默认值\r\n */\r\n reset() {\r\n const oldConfig = this.getSnapshot();\r\n this._config = JSON.parse(JSON.stringify(this._defaultConfig));\r\n this.config = this._createProxy(this._config);\r\n \r\n this.emit('config-reset', {\r\n oldConfig,\r\n newConfig: this.getSnapshot(),\r\n timestamp: new Date()\r\n });\r\n \r\n return this;\r\n }\r\n}\r\n\r\nexport default ConfigManager;\r\n","/**\r\n * 默认配置\r\n */\r\n\r\nconst defaultConfig = {\r\n api: {\r\n key: '',\r\n url: 'https://api.deepseek.com/v1/chat/completions',\r\n timeout: 30000\r\n },\r\n model: {\r\n name: 'deepseek-chat',\r\n temperature: 0.7,\r\n // maxTokens: 2000,\r\n stream: false,\r\n reasoningEffort: 'medium'\r\n },\r\n conversation: {\r\n baseRounds: 10,\r\n cycleRounds: 5\r\n },\r\n debug: false\r\n};\r\n\r\nexport default defaultConfig;","// 这是 AI 聊天框架的入口文件\r\n// 导出所有核心组件供外部使用\r\n\r\nimport Messages from './core/Messages.js';\r\nimport RequestBuilder from './core/RequestBuilder.js';\r\nimport ApiClient from './core/ApiClient.js';\r\nimport EventEmitter from './core/EventEmitter.js';\r\nimport MessageFormatter from './core/MessageFormatter.js';\r\nimport ToolManager from './core/ToolManager.js';\r\nimport ConfigManager from './core/ConfigManager.js';\r\nimport defaultConfig from './config/defaults.js'; // 默认配置\r\n\r\n// 导出所有核心类\r\nexport { Messages, RequestBuilder, ApiClient, EventEmitter, MessageFormatter, ToolManager };\r\n\r\n// ChatService类,继承EventEmitter\r\nclass ChatService extends EventEmitter {\r\n constructor(options = {}) {\r\n super();\r\n \r\n // 配置:是否自动添加消息(默认启用)\r\n this.autoAddMessages = options.autoAddMessages ?? true;\r\n \r\n // 创建配置管理器\r\n this.configManager = new ConfigManager({\r\n ...defaultConfig,\r\n ...options\r\n });\r\n \r\n // 初始化组件\r\n this.messages = new Messages();\r\n this.apiClient = new ApiClient(\r\n this.configManager.config.api.key,\r\n this.configManager.config.api.url\r\n );\r\n this.requestBuilder = new RequestBuilder(\r\n this.configManager.config.model.name,\r\n this.messages,\r\n {\r\n temperature: this.configManager.config.model.temperature,\r\n max_tokens: this.configManager.config.model.maxTokens,\r\n stream: this.configManager.config.model.stream,\r\n reasoning_effort: this.configManager.config.model.reasoningEffort\r\n }\r\n );\r\n this.toolManager = new ToolManager();\r\n \r\n // 设置配置变更处理器\r\n this._setupConfigHandlers();\r\n \r\n this._setupDefaultListeners();\r\n }\r\n\r\n /**\r\n * 设置配置变更处理器\r\n */\r\n _setupConfigHandlers() {\r\n // API Key 变更\r\n this.configManager.registerHandler('api.key', (newValue) => {\r\n this.apiClient.setApiKey(newValue);\r\n });\r\n \r\n // API URL 变更\r\n this.configManager.registerHandler('api.url', (newValue) => {\r\n this.apiClient.setApiUrl(newValue);\r\n });\r\n \r\n // 模型名称变更\r\n this.configManager.registerHandler('model.name', (newValue) => {\r\n this.requestBuilder.model = newValue;\r\n });\r\n \r\n // 温度变更\r\n this.configManager.registerHandler('model.temperature', (newValue) => {\r\n this.requestBuilder.config.temperature = newValue;\r\n });\r\n \r\n // 流式模式变更\r\n this.configManager.registerHandler('model.stream', (newValue) => {\r\n this.requestBuilder.config.stream = newValue;\r\n });\r\n \r\n // 调试模式变更\r\n this.configManager.registerHandler('debug', (newValue) => {\r\n if (newValue) {\r\n console.log('🔧 调试模式已启用');\r\n }\r\n });\r\n \r\n // 监听所有配置变更\r\n this.configManager.on('config-changed', (data) => {\r\n this.emit('service-config-changed', data);\r\n });\r\n }\r\n\r\n /**\r\n * 便捷方法:快速设置 API\r\n */\r\n setApi(key, url) {\r\n this.configManager.update({\r\n api: { key, url }\r\n });\r\n return this;\r\n }\r\n\r\n /**\r\n * 便捷方法:快速设置模型\r\n */\r\n setModel(name, temperature = 0.7) {\r\n this.configManager.update({\r\n model: { name, temperature }\r\n });\r\n return this;\r\n }\r\n\r\n _setupDefaultListeners() {\r\n // 监听API客户端的事件\r\n this.apiClient.on('request-start', (data) => {\r\n this.emit('request-start', data);\r\n });\r\n \r\n this.apiClient.on('request-success', (data) => {\r\n this.emit('request-success', data);\r\n });\r\n \r\n this.apiClient.on('request-error', (data) => {\r\n this.emit('request-error', data);\r\n });\r\n \r\n this.apiClient.on('stream-chunk', (data) => {\r\n this.emit('stream-chunk', data);\r\n });\r\n\r\n // 监听工具管理器的事件\r\n this.toolManager.on('tool-execute-start', (data) => {\r\n this.emit('tool-execute-start', data);\r\n });\r\n \r\n this.toolManager.on('tool-execute-success', (data) => {\r\n this.emit('tool-execute-success', data);\r\n });\r\n \r\n this.toolManager.on('tool-execute-error', (data) => {\r\n this.emit('tool-execute-error', data);\r\n });\r\n }\r\n\r\n /**\r\n * 注册工具\r\n */\r\n registerTool(name, definition, executor) {\r\n // 1. 在ToolManager中注册\r\n this.toolManager.registerTool(name, definition, executor);\r\n \r\n // 2. 在Messages中添加工具定义(用于发送给AI)\r\n this.messages.addTool(definition);\r\n \r\n return this; // 支持链式调用\r\n }\r\n\r\n /**\r\n * 发送消息(支持工具调用)\r\n */\r\n async send(userMessage, options = {}) {\r\n try {\r\n // 触发事件:开始发送(符合Messages格式)\r\n this.emit('sending', { \r\n role: 'user', \r\n content: userMessage,\r\n timestamp: new Date(),\r\n eventType: 'sending'\r\n });\r\n \r\n // 添加用户消息\r\n this.messages.addUserMessage(userMessage);\r\n \r\n // 构建请求体(会自动包含工具定义)\r\n // 注意:这里需要确保RequestBuilder的配置正确\r\n const requestBody = this.requestBuilder.toJSON(\r\n options.baseRounds, \r\n options.cycleRounds\r\n );\r\n \r\n // 发送请求\r\n const response = await this.apiClient.send(requestBody);\r\n const aiMessage = response.choices[0].message;\r\n \r\n // 检查是否有工具调用\r\n if (aiMessage.tool_calls && aiMessage.tool_calls.length > 0) {\r\n // 处理工具调用\r\n return await this._handleToolCalls(aiMessage);\r\n } else {\r\n // 普通回复\r\n const eventData = await this._handleNormalResponse(aiMessage);\r\n return eventData.content;\r\n }\r\n } catch (error) {\r\n this.emit('error', {\r\n error: error,\r\n message: userMessage,\r\n timestamp: new Date()\r\n });\r\n throw error;\r\n }\r\n }\r\n\r\n /**\r\n * 处理工具调用(支持循环调用)\r\n */\r\n async _handleToolCalls(aiMessage, maxIterations = 5) {\r\n let iteration = 0;\r\n let currentMessage = aiMessage;\r\n \r\n // 循环处理工具调用,直到没有工具调用或达到最大迭代次数\r\n while (iteration < maxIterations) {\r\n iteration++;\r\n \r\n // 1. 添加助手消息(包含工具调用和思考内容)\r\n this.messages.addAssistantMessage(currentMessage.content || '', {\r\n tool_calls: currentMessage.tool_calls,\r\n reasoning_content: currentMessage.reasoning_content || '' // ✅ 新增:保存思考内容\r\n });\r\n \r\n // 触发事件:AI请求工具调用\r\n this.emit('tool-call-requested', {\r\n tool_calls: currentMessage.tool_calls,\r\n reasoning_content: currentMessage.reasoning_content, // ✅ 新增:包含思考内容\r\n timestamp: new Date(),\r\n iteration: iteration\r\n });\r\n \r\n // 2. 执行工具\r\n const toolResults = await this.toolManager.executeToolCalls(currentMessage.tool_calls);\r\n \r\n // 3. 添加工具结果消息\r\n for (const result of toolResults) {\r\n this.messages.addToolMessage(\r\n result.result || result.error || '', \r\n result.tool_call_id\r\n );\r\n }\r\n \r\n // 4. 再次发送请求,获取AI对工具结果的响应\r\n const requestBody = this.requestBuilder.toJSON();\r\n \r\n const response = await this.apiClient.send(requestBody);\r\n currentMessage = response.choices[0].message;\r\n \r\n // 5. 检查AI是否还有新的工具调用请求\r\n if (!currentMessage.tool_calls || currentMessage.tool_calls.length === 0) {\r\n // 没有更多工具调用,结束循环\r\n break;\r\n }\r\n }\r\n \r\n // 6. 添加最终助手消息 - 使用统一方法处理\r\n const eventData = await this._handleAssistantResponse(currentMessage, { \r\n toolIterations: iteration \r\n });\r\n \r\n return eventData.content;\r\n }\r\n\r\n /**\r\n * 处理助手回复(统一方法,用于普通和流式请求)\r\n */\r\n async _handleAssistantResponse(aiMessage, options = {}) {\r\n const { isStreaming = false, toolIterations = 0, skipAddMessage = false } = options;\r\n \r\n // 根据配置决定是否添加消息\r\n const shouldAddMessage = this.autoAddMessages && !skipAddMessage;\r\n \r\n if (shouldAddMessage) {\r\n // 添加助手消息,处理空内容\r\n this.messages.addAssistantMessage(aiMessage.content || '', {\r\n reasoning_content: aiMessage.reasoning_content\r\n });\r\n }\r\n \r\n // 统一的事件数据结构(直接使用Messages格式)\r\n const eventData = {\r\n // 基础字段(Messages格式)\r\n role: 'assistant',\r\n content: aiMessage.content || '',\r\n timestamp: new Date(),\r\n \r\n // 扩展字段\r\n ...(aiMessage.reasoning_content && { reasoning_content: aiMessage.reasoning_content }),\r\n ...(aiMessage.tool_calls && { tool_calls: aiMessage.tool_calls }),\r\n ...(aiMessage.tool_call_id && { tool_call_id: aiMessage.tool_call_id }),\r\n \r\n // 框架元数据\r\n isStreaming,\r\n toolIterations,\r\n eventType: isStreaming ? 'stream-complete' : 'response-complete',\r\n \r\n // 保留原始响应(只有普通请求有)\r\n ...(isStreaming ? {} : {\r\n response: { choices: [{ message: aiMessage }] }\r\n })\r\n };\r\n \r\n // 统一使用 'message' 事件\r\n this.emit('message', eventData);\r\n \r\n return eventData;\r\n }\r\n\r\n /**\r\n * 处理普通回复\r\n */\r\n async _handleNormalResponse(aiMessage) {\r\n return await this._handleAssistantResponse(aiMessage);\r\n }\r\n\r\n /**\r\n * 流式发送消息(支持工具调用)\r\n */\r\n async stream(userMessage, onProgress, onDone, options = {}) {\r\n try {\r\n // 触发事件:开始发送(符合Messages格式)\r\n this.emit('sending', { \r\n role: 'user', \r\n content: userMessage,\r\n timestamp: new Date(),\r\n eventType: 'sending'\r\n });\r\n \r\n // 添加用户消息\r\n this.messages.addUserMessage(userMessage);\r\n \r\n // 构建请求体 - 关键:设置stream: true\r\n const requestBuilder = new RequestBuilder(this.requestBuilder.model, this.messages, {\r\n ...this.requestBuilder.config,\r\n stream: true // ✅ 必须设置为true!\r\n });\r\n \r\n const requestBody = requestBuilder.toJSON(\r\n options.baseRounds, \r\n options.cycleRounds\r\n );\r\n \r\n // 流式发送 - 使用可选的回调函数\r\n const response = await this.apiClient.strSend(\r\n requestBody,\r\n // 如果 onProgress 是函数就调用,否则用空函数\r\n typeof onProgress === 'function' \r\n ? (chunk) => {\r\n this.emit('stream-progress', chunk);\r\n onProgress(chunk);\r\n }\r\n : (chunk) => {\r\n this.emit('stream-progress', chunk);\r\n },\r\n typeof onDone === 'function'\r\n ? async (finalMessage) => {\r\n // 流式完成回调\r\n if (finalMessage.tool_calls && finalMessage.tool_calls.length > 0) {\r\n // 处理流式中的工具调用\r\n await this._handleStreamToolCalls(finalMessage, onProgress, onDone);\r\n } else {\r\n // 普通流式回复 - 使用统一方法处理(跳过添加消息,因为用户可能已经手动添加了)\r\n const eventData = await this._handleAssistantResponse(finalMessage, { \r\n isStreaming: true, \r\n skipAddMessage: true \r\n });\r\n onDone(eventData);\r\n }\r\n }\r\n : async (finalMessage) => {\r\n // 只触发事件,不调用回调\r\n if (finalMessage.tool_calls && finalMessage.tool_calls.length > 0) {\r\n await this._handleStreamToolCalls(finalMessage);\r\n } else {\r\n await this._handleAssistantResponse(finalMessage, { \r\n isStreaming: true, \r\n skipAddMessage: true \r\n });\r\n }\r\n }\r\n );\r\n \r\n return response;\r\n } catch (error) {\r\n this.emit('error', {\r\n error: error,\r\n message: userMessage,\r\n timestamp: new Date()\r\n });\r\n throw error;\r\n }\r\n }\r\n\r\n /**\r\n * 处理流式传输中的工具调用(支持循环调用)\r\n */\r\n async _handleStreamToolCalls(aiMessage, onProgress, onDone, maxIterations = 5) {\r\n let iteration = 0;\r\n let currentMessage = aiMessage;\r\n \r\n // 循环处理工具调用\r\n while (iteration < maxIterations) {\r\n iteration++;\r\n \r\n // 1. 添加助手消息(包含工具调用和思考内容)\r\n this.messages.addAssistantMessage(currentMessage.content || '', {\r\n tool_calls: currentMessage.tool_calls,\r\n reasoning_content: currentMessage.reasoning_content || '' // ✅ 新增:保存思考内容\r\n });\r\n \r\n // 触发事件:AI请求工具调用\r\n this.emit('tool-call-requested', {\r\n tool_calls: currentMessage.tool_calls,\r\n reasoning_content: currentMessage.reasoning_content, // ✅ 新增:包含思考内容\r\n timestamp: new Date(),\r\n iteration: iteration\r\n });\r\n \r\n // 2. 执行工具\r\n const toolResults = await this.toolManager.executeToolCalls(currentMessage.tool_calls);\r\n \r\n // 3. 添加工具结果消息\r\n for (const result of toolResults) {\r\n this.messages.addToolMessage(result.result || result.error, result.tool_call_id);\r\n }\r\n \r\n // 4. 再次发送流式请求(包含工具结果)\r\n const requestBody = this.requestBuilder.toJSON();\r\n \r\n // 使用Promise包装流式请求,等待完成\r\n await new Promise((resolve, reject) => {\r\n this.apiClient.strSend(\r\n requestBody,\r\n typeof onProgress === 'function'\r\n ? (chunk) => {\r\n this.emit('stream-progress', chunk);\r\n onProgress(chunk);\r\n }\r\n : (chunk) => {\r\n this.emit('stream-progress', chunk);\r\n },\r\n (finalMessage) => {\r\n currentMessage = finalMessage;\r\n \r\n // 检查是否还有工具调用\r\n if (!currentMessage.tool_calls || currentMessage.tool_calls.length === 0) {\r\n // 没有更多工具调用,结束循环\r\n resolve();\r\n } else {\r\n // 还有工具调用,继续循环\r\n resolve();\r\n }\r\n }\r\n ).catch(reject);\r\n });\r\n \r\n // 如果没有工具调用了,跳出循环\r\n if (!currentMessage.tool_calls || currentMessage.tool_calls.length === 0) {\r\n break;\r\n }\r\n }\r\n \r\n // 添加最终助手消息 - 使用统一方法处理(跳过添加消息)\r\n const eventData = await this._handleAssistantResponse(currentMessage, { \r\n isStreaming: true,\r\n toolIterations: iteration,\r\n skipAddMessage: true \r\n });\r\n \r\n // 如果有 onDone 回调就调用\r\n if (typeof onDone === 'function') {\r\n onDone(eventData);\r\n }\r\n }\r\n\r\n /**\r\n * 撤回消息\r\n */\r\n undo() {\r\n const removed = this.messages.undoToAssistant();\r\n if (removed.length > 0) {\r\n this.emit('undo', {\r\n removedMessages: removed,\r\n timestamp: new Date()\r\n });\r\n }\r\n return removed;\r\n }\r\n\r\n /**\r\n * 清空消息\r\n */\r\n clear() {\r\n const removed = this.messages.clearMessages();\r\n this.emit('clear', {\r\n removedMessages: removed,\r\n timestamp: new Date()\r\n });\r\n return removed;\r\n }\r\n\r\n /**\r\n * 导出对话数据\r\n */\r\n export() {\r\n const data = this.messages.export();\r\n this.emit('export', {\r\n data: data,\r\n timestamp: new Date()\r\n });\r\n return data;\r\n }\r\n\r\n /**\r\n * 导入对话数据\r\n */\r\n import(data) {\r\n this.messages.import(data);\r\n this.emit('import', {\r\n data: data,\r\n timestamp: new Date()\r\n });\r\n return this;\r\n }\r\n}\r\n\r\n// 导出 ChatService\r\nexport { ChatService };\r\n\r\n// 导出默认对象\r\nexport default {\r\n Messages,\r\n RequestBuilder,\r\n ApiClient,\r\n EventEmitter,\r\n MessageFormatter,\r\n ToolManager,\r\n ChatService,\r\n defaultConfig\r\n};"],"names":["index","bind","require$$0","utils","buildURL","normalizeHeaderName","enhanceError","createError","settle","isAbsoluteURL","combineURLs","require$$1","buildFullPath","parseHeaders","isURLSameOrigin","cookies","require$$2","require$$3","require$$4","require$$5","require$$6","require$$7","transformData","isCancel","dispatchRequest","mergeConfig","validator","version","spread","isAxiosError","defaultConfig","axios","require$$8","require$$9","axiosModule"],"mappings":"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","x_google_ignoreList":[5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31,32]}
|
|
1
|
+
{"version":3,"file":"my-ai-chat-framework.browser.es.js","names":[],"sources":["../src/core/EventEmitter.js","../src/core/MessageStore.js","../src/core/SystemPromptStore.js","../src/core/Errors.js","../src/core/ChatService.js","../src/utils/url.js","../src/utils/typeCheck.js","../src/utils/MessageFormatter.js","../src/adapters/openai.js","../src/plugins/tool-calling.js","../src/plugins/model-registry.js"],"sourcesContent":["/**\n * 极简事件发射器\n * 支持同步/异步事件,handler 返回 Promise 时自动 await\n */\nexport class EventEmitter {\n constructor() {\n this._events = new Map();\n }\n\n on(event, handler) {\n if (!this._events.has(event)) this._events.set(event, []);\n this._events.get(event).push(handler);\n return () => this.off(event, handler);\n }\n\n off(event, handler) {\n if (!this._events.has(event)) return;\n const handlers = this._events.get(event).filter(h => h !== handler);\n if (handlers.length) this._events.set(event, handlers);\n else this._events.delete(event);\n }\n\n /**\n * 同步触发事件\n */\n emit(event, data) {\n if (!this._events.has(event)) return;\n for (const handler of this._events.get(event)) {\n try {\n handler(data);\n } catch (err) {\n console.error(`事件 ${event} 处理出错:`, err);\n }\n }\n }\n\n /**\n * 异步触发事件,逐个 await handler\n * handler 返回 Promise 时自动等待\n */\n async emitAsync(event, data) {\n if (!this._events.has(event)) return;\n for (const handler of this._events.get(event)) {\n try {\n await handler(data);\n } catch (err) {\n console.error(`事件 ${event} 处理出错:`, err);\n }\n }\n }\n}\n","/**\n * 消息存储 - 极简实现\n * 每条消息格式:\n * {\n * id?: string,\n * role: 'user'|'assistant'|'system'|'tool',\n * content: string,\n * images?: Array<string>, // 图片引用(URL / id),框架不存储图片数据\n * _ephemeral?: boolean, // 临时消息:仅底部连续时参与请求,续写后转正\n * _complete?: boolean, // 流式是否完成(false=未完成/中断)\n * prefix?: boolean, // 前缀续写标记\n * toolCalls?: Array,\n * toolCallId?: string,\n * timestamp?: number,\n * metadata?: any\n * }\n */\nexport class MessageStore {\n constructor() {\n this._messages = [];\n this._idCounter = 0;\n }\n\n add(message) {\n const msg = {\n id: message.id || `msg_${Date.now()}_${++this._idCounter}`,\n timestamp: message.timestamp || Date.now(),\n ...message\n };\n this._messages.push(msg);\n return msg;\n }\n\n addUser(content, metadata = {}) {\n return this.add({ role: 'user', content, metadata });\n }\n\n addAssistant(content, metadata = {}) {\n return this.add({ role: 'assistant', content, metadata });\n }\n\n addSystem(content, metadata = {}) {\n return this.add({ role: 'system', content, metadata });\n }\n\n addTool(content, toolCallId, metadata = {}) {\n return this.add({ role: 'tool', content, toolCallId, metadata });\n }\n\n /**\n * 快速添加一次性的、带续写标记的 assistant 消息\n * 适用于思维链引导、临时注入等场景\n * @param {string} content — 引导内容\n * @param {Object} [options] — { reasoningContent, prefix }\n * @returns {Object} 添加的消息\n */\n addOnceAssistant(content, options = {}) {\n return this.add({\n role: 'assistant',\n content,\n reasoningContent: options.reasoningContent,\n prefix: options.prefix !== false, // 默认开启续写\n _ephemeral: true\n });\n }\n\n getLast() {\n return this._messages[this._messages.length - 1] || null;\n }\n\n getAll() {\n return [...this._messages];\n }\n\n clear() {\n this._messages = [];\n }\n\n // 撤回最后一条助手消息及其后的所有消息(用于工具调用循环)\n undoToLastAssistant() {\n let lastAssistantIndex = -1;\n for (let i = this._messages.length - 1; i >= 0; i--) {\n if (this._messages[i].role === 'assistant') {\n lastAssistantIndex = i;\n break;\n }\n }\n if (lastAssistantIndex >= 0) {\n const removed = this._messages.splice(lastAssistantIndex + 1);\n return removed;\n }\n return [];\n }\n\n /**\n * 更新消息:按 id 查找并合并 changes,不新增消息\n * @param {string} id — 消息 id\n * @param {Object} changes — 要合并的字段\n * @returns {Object|null} 更新后的消息,未找到返回 null\n */\n update(id, changes) {\n for (const msg of this._messages) {\n if (msg.id === id) {\n Object.assign(msg, changes);\n // 更新 timestamp 便于排查\n msg.timestamp = changes.timestamp || Date.now();\n return msg;\n }\n }\n return null;\n }\n}\n","/**\r\n * SystemPromptStore — 系统提示词存储\r\n * \r\n * 职责:管理多条 system prompt 的增删改查与开关\r\n * 与 MessageStore 分离,因为 system prompt 是\"AI 行为准则\",不是对话事件\r\n * \r\n * 每条记录格式:\r\n * {\r\n * id: string,\r\n * content: string,\r\n * enabled: boolean,\r\n * timestamp: number\r\n * }\r\n */\r\n\r\nexport class SystemPromptStore {\r\n constructor() {\r\n this._prompts = [];\r\n this._idCounter = 0;\r\n }\r\n\r\n /**\r\n * 添加一条 system prompt\r\n * @param {string} content — 提示词内容\r\n * @param {boolean} [enabled=true] — 是否启用\r\n * @returns {Object} 添加的记录\r\n */\r\n add(content, enabled = true) {\r\n if (!content || typeof content !== 'string' || !content.trim()) {\r\n throw new Error('[SystemPromptStore] content 必须是非空字符串');\r\n }\r\n const record = {\r\n id: `sys_${Date.now()}_${++this._idCounter}`,\r\n content: content.trim(),\r\n enabled: Boolean(enabled),\r\n timestamp: Date.now()\r\n };\r\n this._prompts.push(record);\r\n return record;\r\n }\r\n\r\n /**\r\n * 删除指定索引的 system prompt\r\n * @param {number} index\r\n * @returns {Object} 被删除的记录\r\n */\r\n remove(index) {\r\n if (index < 0 || index >= this._prompts.length) {\r\n throw new Error(`[SystemPromptStore] 索引越界: ${index}`);\r\n }\r\n return this._prompts.splice(index, 1)[0];\r\n }\r\n\r\n /**\r\n * 切换指定索引的启用/禁用状态\r\n * @param {number} index\r\n * @returns {boolean} 切换后的状态\r\n */\r\n toggle(index) {\r\n if (index < 0 || index >= this._prompts.length) {\r\n throw new Error(`[SystemPromptStore] 索引越界: ${index}`);\r\n }\r\n this._prompts[index].enabled = !this._prompts[index].enabled;\r\n return this._prompts[index].enabled;\r\n }\r\n\r\n /**\r\n * 更新指定索引的 content\r\n * @param {number} index\r\n * @param {string} content\r\n */\r\n update(index, content) {\r\n if (index < 0 || index >= this._prompts.length) {\r\n throw new Error(`[SystemPromptStore] 索引越界: ${index}`);\r\n }\r\n if (!content || typeof content !== 'string' || !content.trim()) {\r\n throw new Error('[SystemPromptStore] content 必须是非空字符串');\r\n }\r\n this._prompts[index].content = content.trim();\r\n this._prompts[index].timestamp = Date.now();\r\n }\r\n\r\n /**\r\n * 清空并用一条 content 替换(便捷方法,常用于 config.system = '...')\r\n * @param {string} content\r\n */\r\n set(content) {\r\n this._prompts = [];\r\n if (content && typeof content === 'string' && content.trim()) {\r\n this.add(content, true);\r\n }\r\n }\r\n\r\n /**\r\n * 按 enabled 筛选后,转为适配器可用的格式\r\n * @returns {Array<{role:'system', content:string}>}\r\n */\r\n getEnabled() {\r\n return this._prompts\r\n .filter(p => p.enabled)\r\n .map(p => ({ role: 'system', content: p.content }));\r\n }\r\n\r\n /**\r\n * 返回所有记录(含 enabled 状态,用于 UI 展示)\r\n * @returns {Array}\r\n */\r\n getAll() {\r\n return [...this._prompts];\r\n }\r\n\r\n /**\r\n * 清空所有 system prompt\r\n */\r\n clear() {\r\n this._prompts = [];\r\n }\r\n}\r\n","/**\r\n * 自定义错误类\r\n * 用于区分不同类型的错误,方便用户通过 `error.name` 或 `instanceof` 处理\r\n */\r\n\r\n// API 错误 (如 401 认证失败、400 参数错误、429 限流等)\r\nexport class APIError extends Error {\r\n /**\r\n * @param {string} message - 错误消息(通常来自 API 响应)\r\n * @param {number} statusCode - HTTP 状态码\r\n * @param {any} originalError - 原始错误对象或相关信息\r\n * @param {string} responseText - 原始响应文本(如果有)\r\n */\r\n constructor(message, statusCode, originalError, responseText) {\r\n super(message)\r\n this.name = 'APIError'\r\n this.statusCode = statusCode\r\n this.originalError = originalError\r\n this.responseText = responseText\r\n }\r\n}\r\n\r\n// 网络错误 (fetch 失败、连接超时等)\r\nexport class NetworkError extends Error {\r\n /**\r\n * @param {string} message - 错误消息\r\n * @param {any} originalError - 原始错误对象或相关信息\r\n */\r\n constructor(message, originalError) {\r\n super(message)\r\n this.name = 'NetworkError'\r\n this.originalError = originalError\r\n }\r\n}\r\n\r\n// 配置错误 (缺少必要配置项、配置项类型错误等)\r\nexport class ConfigurationError extends Error {\r\n /**\r\n * @param {string} message - 错误消息\r\n */\r\n constructor(message) {\r\n super(message)\r\n this.name = 'ConfigurationError'\r\n }\r\n}\r\n\r\n// 解析错误 (解析 API 响应失败、响应格式不正确,不符合预期等)\r\nexport class ParsingError extends Error {\r\n /**\r\n * @param {string} message - 错误消息\r\n * @param {any} originalError - 原始错误对象或相关信息 \r\n * @param {string} responseText - 原始响应文本(如果有)\r\n **/\r\n constructor(message, originalError, responseText) {\r\n super(message)\r\n this.name = 'ParsingError'\r\n this.originalError = originalError\r\n this.responseText = responseText\r\n }\r\n}","import { EventEmitter } from './EventEmitter.js';\r\nimport { MessageStore } from './MessageStore.js';\r\nimport { SystemPromptStore } from './SystemPromptStore.js';\r\nimport { ConfigurationError, NetworkError } from './Errors.js';\r\n\r\nexport class ChatService extends EventEmitter {\r\n constructor(config = {}) {\r\n super();\r\n this.config = { ...config };\r\n this.messages = new MessageStore();\r\n this.systemPrompts = new SystemPromptStore();\r\n this._adapter = null;\r\n this._abortController = null;\r\n this._isGenerating = false;\r\n this._hooks = new EventEmitter();\r\n this._processResponse = null;\r\n\r\n const model = this.config.model || this.config.modelParams?.model;\r\n if (!model || typeof model !== 'string' || !model.trim()) {\r\n throw new ConfigurationError('缺少 model 配置');\r\n }\r\n\r\n const temperature = this.config.modelParams?.temperature ?? this.config.temperature;\r\n if (temperature !== undefined && (typeof temperature !== 'number' || temperature < 0 || temperature > 2)) {\r\n throw new ConfigurationError(`temperature 必须在 0-2 之间,当前值: ${temperature}`);\r\n }\r\n\r\n const maxTokens = this.config.modelParams?.maxTokens ?? this.config.maxTokens;\r\n if (maxTokens !== undefined && (typeof maxTokens !== 'number' || maxTokens < 1 || !Number.isInteger(maxTokens))) {\r\n throw new ConfigurationError(`maxTokens 必须为正整数,当前值: ${maxTokens}`);\r\n }\r\n\r\n if (typeof config.system === 'string' && config.system.trim()) {\r\n this.systemPrompts.set(config.system);\r\n }\r\n }\r\n\r\n use(plugin) {\r\n plugin.install(this);\r\n return this;\r\n }\r\n\r\n setAdapter(adapter) {\r\n this._adapter = adapter;\r\n }\r\n\r\n abort() {\r\n if (this._abortController) this._abortController.abort();\r\n }\r\n\r\n get isGenerating() { return this._isGenerating; }\r\n\r\n async continueLast() {\r\n const target = this._prepareContinue();\r\n this.messages.update(target.id, { prefix: true });\r\n try {\r\n await this._request({ addUser: false, isStream: false, mergeToEntry: target.id });\r\n this.messages.update(target.id, {\r\n _complete: true, prefix: undefined, _ephemeral: undefined\r\n });\r\n return target;\r\n } catch (err) {\r\n this.messages.update(target.id, { prefix: undefined });\r\n throw err;\r\n }\r\n }\r\n\r\n async continueLastStream(onProgress, onDone) {\r\n const target = this._prepareContinue();\r\n console.log('[DEBUG] continueLastStream target.id:', target.id);\r\n this.messages.update(target.id, { prefix: true });\r\n const baseLen = (target.content || '').length;\r\n\r\n try {\r\n await this._request({\r\n addUser: false, isStream: true, mergeToEntry: target.id,\r\n onProgress: (chunk) => {\r\n if (onProgress) {\r\n onProgress({ ...chunk, content: (chunk.content || '').slice(baseLen) });\r\n }\r\n },\r\n onDone: (final) => { if (onDone) onDone(final); }\r\n });\r\n this.messages.update(target.id, {\r\n _complete: true, prefix: undefined, _ephemeral: undefined\r\n });\r\n return target;\r\n } catch (err) {\r\n this.messages.update(target.id, { prefix: undefined });\r\n throw err;\r\n }\r\n }\r\n\r\n _prepareContinue() {\r\n const msgs = this.messages.getAll();\r\n const last = msgs[msgs.length - 1];\r\n if (last && (last.role === 'assistant' || last._ephemeral)) return last;\r\n throw new Error('最后一条消息不是 assistant,无法续写');\r\n }\r\n\r\n updateConfig(partial) {\r\n Object.assign(this.config, partial);\r\n if (typeof partial.system === 'string') this.systemPrompts.set(partial.system);\r\n this.emit('config-updated', { changes: partial, timestamp: Date.now() });\r\n }\r\n\r\n // ========== 编排角色 ==========\r\n async _request(options) {\r\n let { userInput, addUser = true, isStream = false, onProgress, onDone, mergeToEntry } = options;\r\n\r\n this.emit('sending', { addUser, userInput, timestamp: Date.now() });\r\n this._addUserMessage(userInput, addUser);\r\n\r\n // 发送前钩子:在 adapter 转换 messages 之前执行,可修改 messages/config\r\n await this._hooks.emitAsync('beforeRequest', {\r\n messages: this.messages,\r\n config: this.config,\r\n options\r\n });\r\n\r\n // 自动续写:启用 autoContinue 时,检测底部是否有 prefix 标记的消息,自动设为续写目标\r\n // 用于 ephemeral 注入场景:注入一条带 prefix 的引导消息后,自动合并结果回原消息\r\n // 不启用时 prefix 仅透传给 API,结果仍作为新消息追加\r\n if (this.config.ephemeralContinue && !mergeToEntry) {\r\n const msgs = this.messages.getAll();\r\n const last = msgs[msgs.length - 1];\r\n if (last && last.prefix && (last.role === 'assistant' || last._ephemeral)) {\r\n mergeToEntry = last.id;\r\n }\r\n }\r\n\r\n const body = this._adapter.buildRequest(\r\n this.messages.getAll(), this.config, this.systemPrompts.getEnabled()\r\n );\r\n\r\n const retryCfg = this.config.retry || {};\r\n try {\r\n return await this._withRetry(body, {\r\n isStream, onProgress, onDone, mergeToEntry,\r\n maxRetries: retryCfg.maxRetries ?? 0,\r\n retryDelay: retryCfg.retryDelay ?? 1000\r\n });\r\n } catch (error) {\r\n this.emit('error', { error, timestamp: Date.now() });\r\n throw error;\r\n }\r\n }\r\n\r\n _addUserMessage(userInput, addUser) {\r\n if (addUser && userInput !== undefined) {\r\n const msg = typeof userInput === 'string'\r\n ? { role: 'user', content: userInput }\r\n : { role: 'user', ...userInput };\r\n this.messages.add(msg);\r\n }\r\n }\r\n\r\n /** retry 循环,占位消息只 push 一次 */\r\n async _withRetry(body, { isStream, onProgress, onDone, mergeToEntry, maxRetries, retryDelay }) {\r\n let lastError = null;\r\n const adapterOptions = { signal: this._abortController?.signal };\r\n\r\n let placeholder = null;\r\n let base = null;\r\n if (isStream) {\r\n if (mergeToEntry) {\r\n placeholder = this.messages.getAll().find(m => m.id === mergeToEntry);\r\n if (placeholder) base = { content: placeholder.content || '', reasoning: placeholder.reasoningContent || '' };\r\n }\r\n if (!placeholder) {\r\n placeholder = this.messages.add({ role: 'assistant', content: '', _complete: false });\r\n }\r\n }\r\n\r\n for (let attempt = 0; attempt <= maxRetries; attempt++) {\r\n if (attempt > 0) {\r\n this.emit('retry', { attempt, maxRetries, lastError, timestamp: Date.now() });\r\n await new Promise(r => setTimeout(r, retryDelay));\r\n }\r\n try {\r\n this._isGenerating = true;\r\n if (isStream) {\r\n return await this._stream(body, adapterOptions, { placeholder, base, mergeToEntry, onProgress, onDone });\r\n } else {\r\n const resp = await this._adapter.send(body, this.config, adapterOptions);\r\n let result = this._handleResult(this._adapter.parseResponse(resp), mergeToEntry);\r\n // 响应后处理钩子(tool-calling 用),仅非续写时\r\n if (this._processResponse && !mergeToEntry) {\r\n result = await this._processResponse(result, { isStream: false });\r\n }\r\n return result;\r\n }\r\n } catch (error) {\r\n lastError = error;\r\n if (error.name === 'AbortError' || this._abortController?.signal.aborted) {\r\n this._isGenerating = false; throw error;\r\n }\r\n if (error instanceof NetworkError && attempt < maxRetries) continue;\r\n this._isGenerating = false; throw error;\r\n }\r\n }\r\n this._isGenerating = false;\r\n throw lastError;\r\n }\r\n\r\n /** 流式:ChatService 维护占位,adapter 只管解析 */\r\n async _stream(body, adapterOptions, { placeholder, base, mergeToEntry, onProgress, onDone }) {\r\n let finalMsg = null;\r\n\r\n await this._adapter.stream(body, this.config,\r\n (snap) => {\r\n placeholder.content = snap.content || '';\r\n if (snap.reasoningContent) placeholder.reasoningContent = snap.reasoningContent;\r\n if (snap.toolCalls) placeholder.toolCalls = [...snap.toolCalls];\r\n this.emit('stream-progress', snap);\r\n if (onProgress) onProgress(snap);\r\n },\r\n async (final) => {\r\n finalMsg = final;\r\n\r\n if (this._processResponse && !mergeToEntry) {\r\n finalMsg = await this._processResponse(finalMsg, {\r\n isStream: true, onProgress, onDone\r\n });\r\n }\r\n\r\n if (mergeToEntry && base) {\r\n const newContent = base.content + (final.content || '');\r\n const changes = { content: newContent, _complete: true };\r\n if (final.reasoningContent) changes.reasoningContent = base.reasoning + final.reasoningContent;\r\n if (final.toolCalls) changes.toolCalls = final.toolCalls;\r\n this.messages.update(mergeToEntry, changes);\r\n const updated = this.messages.getAll().find(m => m.id === mergeToEntry);\r\n this.emit('message', updated);\r\n if (onDone) onDone(updated);\r\n } else {\r\n placeholder._complete = true;\r\n this.emit('message', finalMsg);\r\n if (onDone) onDone(finalMsg);\r\n }\r\n },\r\n adapterOptions\r\n );\r\n return mergeToEntry || finalMsg;\r\n }\r\n\r\n /** 非流式结果落位 */\r\n _handleResult(assistantMsg, mergeToEntry) {\r\n if (mergeToEntry) {\r\n const entry = this.messages.getAll().find(m => m.id === mergeToEntry);\r\n if (!entry) {\r\n this.messages.add(assistantMsg);\r\n this.emit('message', assistantMsg);\r\n return assistantMsg;\r\n }\r\n const changes = {\r\n content: (entry.content || '') + (assistantMsg.content || ''),\r\n _complete: true\r\n };\r\n if (assistantMsg.reasoningContent) {\r\n changes.reasoningContent = (entry.reasoningContent || '') + assistantMsg.reasoningContent;\r\n }\r\n if (assistantMsg.toolCalls) changes.toolCalls = assistantMsg.toolCalls;\r\n this.messages.update(mergeToEntry, changes);\r\n const updated = this.messages.getAll().find(m => m.id === mergeToEntry);\r\n this.emit('message', updated);\r\n return updated;\r\n }\r\n this.messages.add(assistantMsg);\r\n this.emit('message', assistantMsg);\r\n return assistantMsg;\r\n }\r\n\r\n // ========== 公共 API ==========\r\n async send(userInput) {\r\n this._abortController = new AbortController();\r\n try { return await this._request({ userInput, addUser: true, isStream: false }); }\r\n finally { this._abortController = null; this._isGenerating = false; }\r\n }\r\n\r\n async stream(userInput, onProgress, onDone) {\r\n this._abortController = new AbortController();\r\n try { return await this._request({ userInput, addUser: true, isStream: true, onProgress, onDone }); }\r\n finally { this._abortController = null; this._isGenerating = false; }\r\n }\r\n\r\n async sendExisting() {\r\n this._abortController = new AbortController();\r\n try { return await this._request({ addUser: false, isStream: false }); }\r\n finally { this._abortController = null; this._isGenerating = false; }\r\n }\r\n\r\n async sendExistingStream(onProgress, onDone) {\r\n this._abortController = new AbortController();\r\n try { return await this._request({ addUser: false, isStream: true, onProgress, onDone }); }\r\n finally { this._abortController = null; this._isGenerating = false; }\r\n }\r\n}","/**\r\n * URL 工具函数\r\n */\r\n\r\n/**\r\n * 拼接 baseUrl 和 path\r\n * 注意:path 应以 '/' 开头,否则会替换 baseUrl 的最后一段\r\n * @param {string} baseUrl - 基础 URL(如 https://api.deepseek.com)\r\n * @param {string} path - 路径(如 /v1/chat/completions)\r\n * @returns {string} 完整的 URL\r\n */\r\nexport function joinUrl(baseUrl, path) {\r\n // 移除 baseUrl 末尾的斜杠(如果有)\r\n const base = baseUrl.replace(/\\/$/, '');\r\n // 确保 path 以斜杠开头\r\n const p = path.startsWith('/') ? path : '/' + path;\r\n return base + p;\r\n}","/**\r\n * 类型判断工具\r\n */\r\n\r\n/**\r\n * 判断一个值是否为字符串\r\n * @param {any} value - 要检查的值\r\n * @returns {boolean} 如果是字符串则返回 true\r\n */\r\nexport function isString(value) {\r\n return typeof value === 'string';\r\n}","/**\r\n * MessageFormatter — 可注册的消息格式转换器\r\n *\r\n * 职责:\r\n * 1. 内置 OpenA I兼容格式的转换逻辑\r\n * 2. 支持 register(name, fn) 注册自定义格式(如 Anthropic、Gemini 等)\r\n * 3. 统一处理 capabilities 过滤(reasoning、vision 等)\r\n * 4. 所有适配器通过此工具获取 API 消息数组,消除重复代码\r\n *\r\n * 用法:\r\n * import { MessageFormatter } from 'my-ai-chat-framework';\r\n *\r\n * // 使用内置格式\r\n * const msgs = MessageFormatter.format({\r\n * messages, systemPrompts, capabilities, resolveImage\r\n * }); // 默认 'openai'\r\n *\r\n * // 注册自定义格式\r\n * MessageFormatter.register('anthropic', ({ messages, systemPrompts, capabilities }) => {\r\n * // 返回 Anthropic 格式的消息数组\r\n * });\r\n */\r\n\r\nimport { isString } from './typeCheck.js';\r\n\r\n// ====== 内置格式 ======\r\n\r\nconst IS_URL = /^https?:\\/\\//i;\r\n\r\nfunction defaultResolveImage(imageId) {\r\n if (IS_URL.test(imageId)) return { url: imageId };\r\n return null;\r\n}\r\n\r\nfunction buildMultimodalContent(textContent, images, resolveImage) {\r\n const content = [{ type: 'text', text: textContent }];\r\n for (const ref of images) {\r\n const resolved = resolveImage(ref);\r\n if (!resolved) continue;\r\n if (resolved.url) {\r\n content.push({ type: 'image_url', image_url: { url: resolved.url } });\r\n } else if (resolved.data) {\r\n const mime = resolved.mimeType || 'image/png';\r\n content.push({ type: 'image_url', image_url: { url: `data:${mime};base64,${resolved.data}` } });\r\n }\r\n }\r\n return content;\r\n}\r\n\r\n/** OpenAI 兼容格式 */\r\nfunction toOpenAI({ messages, systemPrompts, capabilities, resolveImage }) {\r\n const rImg = typeof resolveImage === 'function' ? resolveImage : defaultResolveImage;\r\n const result = [];\r\n\r\n // 1) system 置顶\r\n for (const sp of systemPrompts) {\r\n if (sp?.content && isString(sp.content) && sp.content.trim()) {\r\n result.push({ role: 'system', content: sp.content.trim() });\r\n }\r\n }\r\n\r\n // 2) 识别底部连续 ephemeral(只保留这些临时消息,其他 ephemeral 忽略)\r\n let ephemEnd = messages.length;\r\n for (let i = messages.length - 1; i >= 0; i--) {\r\n if (messages[i]._ephemeral) ephemEnd = i;\r\n else break;\r\n }\r\n\r\n // 3) 过滤 + 字段映射\r\n for (let i = 0; i < messages.length; i++) {\r\n const msg = messages[i];\r\n\r\n // ephemeral 消息:仅底部连续的保留,其余跳过\r\n if (msg._ephemeral) {\r\n if (i < ephemEnd) continue;\r\n // 底部 ephemeral 按原始 role 处理,不加 _ephemeral 标记\r\n }\r\n\r\n // 非底部 ephemeral 的正常消息仍保留原有过滤\r\n if (msg.role === 'system' && !msg._ephemeral) continue;\r\n\r\n if (msg.role === 'tool') {\r\n result.push({ role: 'tool', content: msg.content || '', tool_call_id: msg.toolCallId });\r\n continue;\r\n }\r\n\r\n if (msg.role === 'assistant' && msg.toolCalls?.length) {\r\n const entry = { role: 'assistant', content: msg.content || '', tool_calls: msg.toolCalls };\r\n if (msg.prefix) entry.prefix = true;\r\n if (capabilities?.reasoning && msg.reasoningContent) {\r\n entry.reasoning_content = msg.reasoningContent;\r\n }\r\n result.push(entry);\r\n continue;\r\n }\r\n\r\n // 常规消息\r\n const hasText = msg.content && isString(msg.content) && msg.content.trim();\r\n const hasImages = msg.images && Array.isArray(msg.images) && msg.images.length > 0;\r\n if (!hasText && !hasImages) {\r\n if (msg.role === 'assistant' && msg.prefix) {\r\n const prefixEntry = { role: 'assistant', content: '', prefix: true };\r\n if (capabilities?.reasoning && msg.reasoningContent) {\r\n prefixEntry.reasoning_content = msg.reasoningContent;\r\n }\r\n result.push(prefixEntry);\r\n }\r\n continue;\r\n }\r\n\r\n const entry = { role: msg.role };\r\n\r\n if (hasImages) {\r\n if (!capabilities?.vision) {\r\n throw new Error(\r\n '[MessageFormatter] 消息包含图片但模型不支持视觉(capabilities.vision=false)。' +\r\n '请切换模型或移除图片。'\r\n );\r\n }\r\n entry.content = buildMultimodalContent(msg.content || '', msg.images, rImg);\r\n } else {\r\n entry.content = msg.content;\r\n }\r\n\r\n if (msg.prefix) entry.prefix = true;\r\n // 常规 assistant 不回传 reasoningContent——API 自己会重新推理\r\n result.push(entry);\r\n }\r\n\r\n return result;\r\n}\r\n\r\n// ====== 格式化器 ======\r\n\r\nexport const MessageFormatter = {\r\n _formats: new Map([\r\n ['openai', toOpenAI]\r\n ]),\r\n\r\n /**\r\n * 注册自定义格式\r\n * @param {string} name — 格式名称(如 'anthropic', 'gemini')\r\n * @param {Function} fn — 转换函数,接收 { messages, systemPrompts, capabilities, resolveImage },返回消息数组\r\n */\r\n register(name, fn) {\r\n if (!name || typeof name !== 'string' || !name.trim()) {\r\n throw new Error('[MessageFormatter] 格式名称必须是非空字符串');\r\n }\r\n if (typeof fn !== 'function') {\r\n throw new Error('[MessageFormatter] 转换函数必须是 function');\r\n }\r\n this._formats.set(name.trim(), fn);\r\n },\r\n\r\n /**\r\n * 移除自定义格式(内置格式不可移除)\r\n * @param {string} name\r\n */\r\n unregister(name) {\r\n if (name === 'openai') {\r\n throw new Error('[MessageFormatter] 内置格式 \"openai\" 不可移除');\r\n }\r\n this._formats.delete(name);\r\n },\r\n\r\n /**\r\n * 列出所有已注册的格式名称\r\n * @returns {Array<string>}\r\n */\r\n listFormats() {\r\n return [...this._formats.keys()];\r\n },\r\n\r\n /**\r\n * 按指定格式转换消息\r\n * @param {Object} options\r\n * @param {Array} options.messages — 内部消息列表\r\n * @param {Array} [options.systemPrompts=[]] — 启用的 system prompt\r\n * @param {Object} [options.capabilities={}] — 模型能力标签\r\n * @param {Function} [options.resolveImage] — 图片解析钩子\r\n * @param {string} [options.format='openai'] — 目标格式名称\r\n * @returns {Array<Object>}\r\n */\r\n format(options = {}) {\r\n const formatName = options.format || 'openai';\r\n const fn = this._formats.get(formatName);\r\n if (!fn) {\r\n throw new Error(\r\n `[MessageFormatter] 未知格式 \"${formatName}\"。可用格式: ${[...this._formats.keys()].join(', ')}`\r\n );\r\n }\r\n return fn({\r\n messages: options.messages || [],\r\n systemPrompts: options.systemPrompts || [],\r\n capabilities: options.capabilities || {},\r\n resolveImage: options.resolveImage\r\n });\r\n }\r\n};\r\n\r\n// 向后兼容:保留 assembleMessages 函数\r\nexport function assembleMessages(options = {}) {\r\n return MessageFormatter.format({ ...options, format: 'openai' });\r\n}\r\n","/**\n * OpenAI 兼容 API 适配器\n * 支持 DeepSeek 等完全兼容 OpenAI 接口的服务\n */\n\nimport { joinUrl } from \"../utils/url.js\";\nimport { isString } from \"../utils/typeCheck.js\";\nimport { APIError, NetworkError, ParsingError } from '../core/Errors.js';\nimport { MessageFormatter } from '../utils/MessageFormatter.js';\n\nexport const openaiAdapter = {\n name: 'openai',\n\n install(chatService) {\n chatService.setAdapter(this);\n },\n\n /**\n * 构建 OpenAI 格式的请求体\n * @param {Array} messages - 内部消息列表\n * @param {Object} config - 完整配置对象\n * @param {Array} [systemPrompts=[]] - 启用的 system prompt 列表\n * @returns {Object} 请求体\n */\n buildRequest(messages, config, systemPrompts = []) {\n const model = config.model || config.modelParams?.model;\n if (!model) {\n throw new Error('Missing required config: model (either at top level or in modelParams)');\n }\n\n const temperature = config.modelParams?.temperature ?? config.temperature ?? 0.7;\n const maxTokens = config.modelParams?.maxTokens ?? config.maxTokens ?? 2000;\n const reasoningEffort = config.modelParams?.reasoningEffort ?? config.reasoningEffort;\n\n // 用 MessageFormatter 统一处理:system 置顶、消息过滤、字段映射、图片解析\n // format 由 config.messageFormat 指定(默认 'openai')\n const apiMessages = MessageFormatter.format({\n messages,\n systemPrompts,\n capabilities: config.capabilities || {},\n resolveImage: config.resolveImage,\n format: config.messageFormat\n });\n\n const requestBody = {\n model,\n messages: apiMessages,\n temperature,\n max_tokens: maxTokens,\n stream: false\n };\n\n if (config.tools && Array.isArray(config.tools) && config.tools.length > 0) {\n requestBody.tools = config.tools;\n requestBody.tool_choice = 'auto';\n }\n\n if (reasoningEffort && model === 'deepseek-reasoner') {\n requestBody.reasoning_effort = reasoningEffort;\n }\n\n return requestBody;\n },\n\n /**\n * 处理URL相关配置,将其转换为完整请求URL\n * @param {Object} config - 配置参数\n * @returns {String} 实际请求地址\n */\n _getUrl(config) {\n config = config || {};\n const { apiUrl, baseUrl, path } = config;\n // 默认 path 没有 v1 因为 baseUrl 一般包括版本号\n const defaultPath = '/chat/completions';\n\n if (apiUrl && isString(apiUrl)) {\n return apiUrl;\n }\n\n if (baseUrl && isString(baseUrl)) {\n const finalPath = (path && isString(path)) ? path : defaultPath;\n return joinUrl(baseUrl, finalPath);\n }\n\n return 'https://api.openai.com/v1/chat/completions';\n },\n\n /**\n * 非流式发送\n * @param {Object} requestBody\n * @param {Object} config\n * @param {Object} [options] — { signal, headers: {...} }\n */\n async send(requestBody, config, options = {}) {\n try {\n const url = this._getUrl(config);\n\n const headers = {\n 'Content-Type': 'application/json',\n 'Authorization': `Bearer ${config.apiKey}`,\n ...(config.headers || {}),\n ...(options.headers || {})\n };\n\n const response = await fetch(url, {\n method: 'POST',\n headers,\n body: JSON.stringify(requestBody),\n signal: options.signal\n });\n\n if (!response.ok) {\n await this.handleErrorResponse(response);\n }\n\n const data = await response.json();\n return data;\n\n } catch (error) {\n if (error instanceof APIError) throw error;\n if (error.name === 'AbortError') throw error;\n\n if (error.name === 'TypeError' && error.message.includes('fetch')) {\n throw new NetworkError(`Request failed: ${error.message}`, error);\n }\n\n throw error;\n }\n },\n\n /**\n * 解析 API 响应为内部消息格式\n */\n parseResponse(apiResponse) {\n // 检查响应结构是否有效\n if (!apiResponse || !apiResponse.choices || !apiResponse.choices[0] || !apiResponse.choices[0].message) {\n throw new ParsingError('Invalid API response: missing choices or message', apiResponse, JSON.stringify(apiResponse));\n }\n // 将 API 响应转换为内部消息格式\n const msg = apiResponse.choices[0].message;\n const internal = {\n role: msg.role,\n content: msg.content || '',\n };\n if (msg.tool_calls) internal.toolCalls = msg.tool_calls;\n if (msg.reasoning_content) internal.reasoningContent = msg.reasoning_content;\n return internal;\n },\n\n /**\n * 流式发送\n * @param {Object} requestBody\n * @param {Object} config\n * @param {Function} onProgress — 接收累积快照 { content, reasoningContent, toolCalls }\n * @param {Function} onDone — 接收最终消息对象\n * @param {Object} [options] — { signal, headers: {...} }\n */\n async stream(requestBody, config, onProgress, onDone, options = {}) {\n const streamBody = { ...requestBody, stream: true };\n const url = this._getUrl(config);\n let response;\n\n const headers = {\n 'Content-Type': 'application/json',\n 'Authorization': `Bearer ${config.apiKey}`,\n 'Accept': 'text/event-stream',\n ...(config.headers || {}),\n ...(options.headers || {})\n };\n\n try {\n response = await fetch(url, {\n method: 'POST',\n headers,\n body: JSON.stringify(streamBody),\n signal: options.signal\n });\n\n } catch (error) {\n if (error.name === 'AbortError') throw error;\n\n if (error.name === 'TypeError' && error.message.includes('fetch')) {\n throw new NetworkError(`Stream request failed: ${error.message}`, error);\n }\n\n throw error;\n }\n\n // 处理非 2xx 响应\n if (!response.ok) {\n await this.handleErrorResponse(response);\n }\n\n // 解析流式响应\n const reader = response.body.getReader();\n const decoder = new TextDecoder();\n let buffer = '';\n let accumulated = { role: 'assistant', content: '', reasoningContent: '' };\n let reachedDone = false; // 是否收到 [DONE]\n\n while (true) {\n // 用户调用 abort() 后 signal.aborted 为 true,跳出循环\n if (options.signal?.aborted) break;\n\n const { done, value } = await reader.read();\n if (done) break;\n buffer += decoder.decode(value, { stream: true });\n const lines = buffer.split(/\\n\\n/);\n buffer = lines.pop();\n\n for (const line of lines) {\n const dataLine = line.replace(/^data: /, '').trim();\n if (!dataLine) continue;\n if (dataLine === '[DONE]') { reachedDone = true; break; }\n try {\n const chunk = JSON.parse(dataLine);\n const delta = chunk.choices?.[0]?.delta;\n if (!delta) continue;\n\n if (delta.content) accumulated.content += delta.content;\n if (delta.tool_calls) {\n if (!accumulated.toolCalls) accumulated.toolCalls = [];\n for (const toolCallDelta of delta.tool_calls) {\n const index = toolCallDelta.index;\n if (!accumulated.toolCalls[index]) {\n accumulated.toolCalls[index] = {\n id: '',\n type: 'function',\n function: { name: '', arguments: '' }\n };\n }\n if (toolCallDelta.id) accumulated.toolCalls[index].id = toolCallDelta.id;\n if (toolCallDelta.type) accumulated.toolCalls[index].type = toolCallDelta.type;\n if (toolCallDelta.function?.name) {\n accumulated.toolCalls[index].function.name += toolCallDelta.function.name;\n }\n if (toolCallDelta.function?.arguments) {\n accumulated.toolCalls[index].function.arguments += toolCallDelta.function.arguments;\n }\n }\n }\n if (delta.reasoning_content) accumulated.reasoningContent += delta.reasoning_content;\n\n // 传出累积快照,ChatService 自行处理占位消息更新\n onProgress({ ...accumulated });\n } catch (e) {\n console.warn('stream parsing failed :', e, dataLine);\n }\n }\n }\n\n const finalMessage = {\n role: 'assistant',\n content: accumulated.content,\n toolCalls: accumulated.toolCalls,\n reasoningContent: accumulated.reasoningContent\n };\n onDone(finalMessage);\n },\n\n /**\n * 处理对话请求的非 2xx 响应,抛出 APIError,包含状态码、错误消息和原始响应文本\n * @param {Response} response - fetch API 的 Response 对象\n * @returns {Promise<never>} 抛出错误 \n */\n async handleErrorResponse(response) {\n let errorText = await response.text();\n let errorMessage = `HTTP ${response.status}`;\n // 尝试从响应体中解析 JSON 格式的错误信息\n try {\n const errorJson = JSON.parse(errorText);\n errorMessage = errorJson.error?.message || errorJson.message || errorText.slice(0, 200);\n } catch (e) {\n // 如果解析失败,使用原始文本(已截断)\n errorMessage = errorText.length > 200 ? errorText.slice(0, 200) + '...' : errorText;\n }\n throw new APIError(errorMessage, response.status, null, errorText);\n }\n\n};","/**\n * 工具调用插件\n * 功能:拦截助手消息中的 tool_calls,执行对应的工具,将结果作为 tool 消息加入对话,\n * 然后自动继续对话(通过 sendExisting / sendExistingStream),直到没有新的工具调用。\n * \n * 设计要点:\n * - 支持普通请求和流式请求(通过 isStream 标志区分)\n * - 支持多次工具调用循环(maxIterations 防止无限循环)\n * - 串行执行工具(可后续升级为并行)\n * - 工具执行失败时,仍然返回错误信息给 AI,而不是中断整个流程\n * - 触发 tool-error 事件,方便用户监听工具执行异常\n */\nexport const toolCallingPlugin = {\n name: 'tool-calling',\n maxIterations: 5, // 最大工具调用循环次数,防止无限循环(例如 AI 反复请求同一工具)\n\n /**\n * 安装插件,覆盖 ChatService 的 registerTool、send、stream 方法\n * @param {ChatService} chatService - ChatService 实例\n */\n install(chatService) {\n this.chatService = chatService;\n this._tools = new Map(); // 存储工具名 -> { executor, description }\n\n // 初始化 config.tools 数组(用于存放 OpenAI 格式的工具定义)\n if (!chatService.config.tools) {\n chatService.config.tools = [];\n }\n\n /**\n * 注册工具\n * @param {string} name - 工具名称(唯一标识)\n * @param {string} description - 工具描述(告诉 AI 何时调用)\n * @param {Function} executor - 异步执行函数,接收参数对象,返回结果(字符串或对象)\n * @param {Object} parameters - JSON Schema 参数定义(可选,默认为空对象)\n * @returns {ChatService} 返回 chatService 实例,支持链式调用\n */\n chatService.registerTool = (name, description, executor, parameters = {}) => {\n // 保存执行器\n this._tools.set(name, { executor, description });\n\n // 构建 OpenAI 兼容的工具定义\n const toolDefinition = {\n type: 'function',\n function: {\n name,\n description,\n parameters: {\n type: 'object',\n properties: parameters,\n required: Object.keys(parameters).filter(key => parameters[key]?.required)\n }\n }\n };\n // 避免重复添加相同工具\n const existing = chatService.config.tools.find(t => t.function.name === name);\n if (!existing) {\n chatService.config.tools.push(toolDefinition);\n }\n return chatService;\n };\n\n // 注册响应后处理钩子,不再覆盖 send/stream\n chatService._processResponse = async (response, { isStream, onProgress, onDone }) => {\n return this._handleWithTools(response, isStream, onProgress, onDone);\n };\n },\n\n /**\n * 核心处理逻辑:检查响应 → 执行工具 → 继续请求 → 循环\n * @param {Object} initialResponse - 初始 AI 响应\n * @param {boolean} isStream - 是否流式\n * @param {Function} onProgress - 流式进度回调\n * @param {Function} onDone - 流式完成回调\n * @returns {Promise<Object>} 最终 AI 响应\n */\n async _handleWithTools(initialResponse, isStream, onProgress, onDone) {\n const self = this;\n const chat = this.chatService;\n let iteration = 0;\n\n /**\n * 递归处理工具调用\n * @param {Object} initialResponse - 初始 AI 响应(可能是第一次请求的响应)\n * @returns {Promise<Object>} 最终 AI 响应(不含 tool_calls)\n */\n async function processResponse(initialResponse) {\n let lastResponse = initialResponse;\n while (iteration < self.maxIterations) {\n // 检查 AI 返回的消息中是否包含工具调用请求\n const toolCalls = lastResponse?.toolCalls;\n if (!toolCalls || toolCalls.length === 0) break;\n\n iteration++;\n // 并行执行所有工具调用(彼此独立,不会因一个失败而阻塞其他)\n const toolResults = await Promise.all(\n toolCalls.map(async (call) => {\n const toolName = call.function?.name;\n\n // 解析参数(JSON.parse 可能失败,需单独 try/catch)\n let args;\n try {\n args = JSON.parse(call.function?.arguments || '{}');\n } catch (parseErr) {\n chat.emit('tool-error', {\n toolName: toolName || 'unknown',\n error: parseErr,\n toolCallId: call.id,\n stage: 'parse',\n timestamp: Date.now()\n });\n return {\n tool_call_id: call.id,\n error: `参数解析失败: ${parseErr.message}`,\n success: false\n };\n }\n\n const tool = self._tools.get(toolName);\n if (!tool) {\n chat.emit('tool-error', {\n toolName,\n error: new Error(`Tool not registered: ${toolName}`),\n toolCallId: call.id,\n stage: 'lookup',\n timestamp: Date.now()\n });\n return {\n tool_call_id: call.id,\n error: `工具 ${toolName} 未注册`,\n success: false\n };\n }\n\n try {\n // 工具执行超时控制\n const toolTimeout = chat.config.toolTimeout;\n let execPromise = tool.executor(args);\n if (toolTimeout && typeof toolTimeout === 'number' && toolTimeout > 0) {\n const timeoutErr = new Error(`工具 ${toolName} 执行超时 (${toolTimeout}ms)`);\n timeoutErr.name = 'ToolTimeoutError';\n const timeoutPromise = new Promise((_, reject) =>\n setTimeout(() => reject(timeoutErr), toolTimeout)\n );\n execPromise = Promise.race([execPromise, timeoutPromise]);\n }\n\n const result = await execPromise;\n chat.emit('tool-success', {\n toolName,\n result,\n toolCallId: call.id,\n timestamp: Date.now()\n });\n return {\n tool_call_id: call.id,\n content: typeof result === 'string' ? result : JSON.stringify(result),\n success: true\n };\n } catch (err) {\n const stage = err.name === 'ToolTimeoutError' ? 'timeout' : 'execute';\n chat.emit('tool-error', {\n toolName,\n error: err,\n toolCallId: call.id,\n stage,\n timestamp: Date.now()\n });\n return {\n tool_call_id: call.id,\n error: err.message,\n success: false\n };\n }\n })\n );\n\n // 将工具执行结果作为 tool 消息添加到对话历史\n for (const tr of toolResults) {\n // 注意:addTool 的第二个参数是 tool_call_id\n // 如果工具执行失败且没有内容,则传递错误信息作为 content\n const content = tr.success ? tr.content : (tr.error || '工具执行失败');\n chat.messages.addTool(content, tr.tool_call_id);\n }\n\n // 再次请求 AI,获取基于工具结果的回复\n if (isStream) {\n // 流式继续:使用 sendExistingStream\n await new Promise((resolve) => {\n chat.sendExistingStream(\n (chunk) => {\n if (onProgress) onProgress(chunk);\n lastResponse = chunk;\n },\n (final) => {\n lastResponse = final;\n resolve();\n }\n );\n });\n } else {\n // 非流式继续:使用 sendExisting\n lastResponse = await chat.sendExisting();\n }\n }\n return lastResponse;\n }\n\n // 初始响应已由 ChatService 发出,直接进入工具调用循环\n const final = await processResponse(initialResponse);\n return final;\n }\n};","/**\r\n * model-registry 插件\r\n * \r\n * 职责:\r\n * 1. 内置常用模型的能力标签表(model → capabilities 映射)\r\n * 2. 安装时自动根据 config.model 查表,写入 config.capabilities\r\n * 3. 监听 config-updated 事件,切换模型时自动同步能力\r\n * 4. 提供 chat.registerModel(),允许用户追加/覆盖自定义模型\r\n * \r\n * 能力标签字段(全部可选,缺失视为 false / 未知):\r\n * {\r\n * reasoning: boolean — 是否返回 reasoning_content(思维链)\r\n * vision: boolean — 是否支持图片输入\r\n * toolCalling: boolean — 是否支持 function calling\r\n * streaming: boolean — 是否支持流式传输\r\n * maxInputTokens: number — 最大输入 token 数\r\n * maxOutputTokens: number — 最大输出 token 数\r\n * }\r\n * \r\n * 使用:\r\n * chat.use(modelRegistryPlugin);\r\n * // config.capabilities 现在已自动填充\r\n * chat.registerModel('my-custom-model', { toolCalling: true });\r\n */\r\n\r\n// ====== 内置模型能力表 ======\r\n// 数据来源:各厂商官方文档(2026-05 快照),用户可通过 registerModel() 覆盖\r\nconst BUILTIN_MODELS = {\r\n // ---- DeepSeek ----\r\n 'deepseek-chat': {\r\n reasoning: false,\r\n vision: false,\r\n toolCalling: true,\r\n streaming: true,\r\n maxInputTokens: 128000,\r\n maxOutputTokens: 8192\r\n },\r\n 'deepseek-reasoner': {\r\n reasoning: true,\r\n vision: false,\r\n toolCalling: true,\r\n streaming: true,\r\n maxInputTokens: 128000,\r\n maxOutputTokens: 8192\r\n },\r\n\r\n // ---- OpenAI ----\r\n 'gpt-4o': {\r\n reasoning: false,\r\n vision: true,\r\n toolCalling: true,\r\n streaming: true,\r\n maxInputTokens: 128000,\r\n maxOutputTokens: 16384\r\n },\r\n 'gpt-4o-mini': {\r\n reasoning: false,\r\n vision: true,\r\n toolCalling: true,\r\n streaming: true,\r\n maxInputTokens: 128000,\r\n maxOutputTokens: 16384\r\n },\r\n 'gpt-3.5-turbo': {\r\n reasoning: false,\r\n vision: false,\r\n toolCalling: true,\r\n streaming: true,\r\n maxInputTokens: 16385,\r\n maxOutputTokens: 4096\r\n },\r\n 'o1': {\r\n reasoning: true,\r\n vision: false,\r\n toolCalling: false,\r\n streaming: false,\r\n maxInputTokens: 200000,\r\n maxOutputTokens: 100000\r\n },\r\n 'o3-mini': {\r\n reasoning: true,\r\n vision: false,\r\n toolCalling: true,\r\n streaming: true,\r\n maxInputTokens: 200000,\r\n maxOutputTokens: 100000\r\n },\r\n\r\n // ---- Anthropic ----\r\n 'claude-3.5-sonnet': {\r\n reasoning: false,\r\n vision: true,\r\n toolCalling: true,\r\n streaming: true,\r\n maxInputTokens: 200000,\r\n maxOutputTokens: 8192\r\n },\r\n 'claude-3.5-haiku': {\r\n reasoning: false,\r\n vision: true,\r\n toolCalling: true,\r\n streaming: true,\r\n maxInputTokens: 200000,\r\n maxOutputTokens: 8192\r\n }\r\n};\r\n\r\nconst DEFAULT_CAPABILITIES = {\r\n streaming: true,\r\n toolCalling: false,\r\n reasoning: false,\r\n vision: false\r\n};\r\n\r\nexport const modelRegistryPlugin = {\r\n name: 'model-registry',\r\n\r\n install(chatService) {\r\n this.chat = chatService;\r\n // 合并内置表 + 用户通过 registerModel 追加的\r\n this._registry = new Map(Object.entries(BUILTIN_MODELS));\r\n\r\n /**\r\n * 注册/覆盖一个模型的能力标签\r\n * @param {string} name — 模型名称\r\n * @param {Object} capabilities — 能力标签对象(部分字段即可,未提供的取默认值)\r\n * @returns {ChatService}\r\n */\r\n chatService.registerModel = (name, capabilities = {}) => {\r\n if (!name || typeof name !== 'string' || !name.trim()) {\r\n throw new Error('[model-registry] 模型名称必须是非空字符串');\r\n }\r\n const merged = { ...DEFAULT_CAPABILITIES, ...capabilities };\r\n this._registry.set(name.trim(), merged);\r\n // 如果注册的模型与当前使用的模型同名,立即同步\r\n if (chatService.config.model === name.trim()) {\r\n this._syncCapabilities();\r\n }\r\n return chatService;\r\n };\r\n\r\n /**\r\n * 列出所有已注册的模型名称\r\n * @returns {Array<string>}\r\n */\r\n chatService.listModels = () => {\r\n return [...this._registry.keys()];\r\n };\r\n\r\n // 安装时立即同步一次\r\n this._syncCapabilities();\r\n\r\n // 监听配置变更:model 变了就重新同步\r\n chatService.on('config-updated', ({ changes }) => {\r\n if ('model' in changes) {\r\n this._syncCapabilities();\r\n }\r\n // 如果用户手动改了 capabilities,用 merge 保留未指定的字段\r\n if ('capabilities' in changes && !('model' in changes)) {\r\n const current = this._lookupCapabilities();\r\n if (current) {\r\n chatService.config.capabilities = { ...current, ...changes.capabilities };\r\n }\r\n }\r\n });\r\n },\r\n\r\n // ---- 内部方法 ----\r\n\r\n /** 查表获取模型能力,未注册返回 null */\r\n _lookupCapabilities() {\r\n const model = this.chat.config.model;\r\n if (!model) return null;\r\n return this._registry.get(model) || null;\r\n },\r\n\r\n /** 将查到的能力写入 config.capabilities */\r\n _syncCapabilities() {\r\n const caps = this._lookupCapabilities();\r\n if (caps) {\r\n // 若用户已手动设了 capabilities,用模型的合并(用户值优先?还是模型优先?)\r\n // 策略:模型优先,因为换了模型能力应该重置\r\n this.chat.config.capabilities = { ...caps };\r\n }\r\n // 未注册的模型:不清除已有 capabilities,保留用户手动设的值\r\n }\r\n};\r\n"],"mappings":"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"}
|