diff --git a/src/mastra/agents/multi-function-agent.ts b/src/mastra/agents/multi-function-agent.ts index 0a0cd1d..cc43d11 100644 --- a/src/mastra/agents/multi-function-agent.ts +++ b/src/mastra/agents/multi-function-agent.ts @@ -4,6 +4,7 @@ import { cabinetTool, shopTool, dynamicInfoTool, + codeExecutorTool, } from "../tools"; import { createDeepSeek } from '@ai-sdk/deepseek'; import { createOpenAI } from '@ai-sdk/openai'; @@ -14,15 +15,19 @@ import { LibSQLStore } from "@mastra/libsql"; // const deepseek = createDeepSeek({ // apiKey: 'sk-8603b08e1125422ca6238c8b4a1a40d8', // }); -const deepseek = createDeepSeek({ +const mimimo = createDeepSeek({ baseURL: 'https://api.xiaomimimo.com/v1', apiKey: 'sk-cr54p8d2k20nppdzzwyfir4b4znxoh1py6ccxpkc8qt1ahij' }); +/* const minimax = createDeepSeek({ + baseURL: 'https://api.minimaxi.com/v1', + apiKey: 'eyJhbGciOiJSUzI1NiIsInR5cCI6IkpXVCJ9.eyJHcm91cE5hbWUiOiLmtbfonrrnlKjmiLdfMzk5OTkzOTAwNzMxMjk3ODAwIiwiVXNlck5hbWUiOiLmtbfonrrnlKjmiLdfMzk5OTkzOTAwNzMxMjk3ODAwIiwiQWNjb3VudCI6IiIsIlN1YmplY3RJRCI6IjE5NDM1NTIyOTIzNDcxOTE1MzgiLCJQaG9uZSI6IjE3NjkxMjMxOTI0IiwiR3JvdXBJRCI6IjE5NDM1NTIyOTIzNDI5OTcyMzQiLCJQYWdlTmFtZSI6IiIsIk1haWwiOiIiLCJDcmVhdGVUaW1lIjoiMjAyNS0xMC0yOCAwOTozNjozNiIsIlRva2VuVHlwZSI6MSwiaXNzIjoibWluaW1heCJ9.SBjpp3BoIhxPLgEjUxnTZvjFMlAQLeP_PNHc2sFvmNrjus3xb6oK8SAQAD2MfjgOaMmBRlNWONcdlSAwChcseRm_b4y6n4_-3alrwjstebETh4EblIXASFNNbLk0JC5Ha2ICIKdvkN4vLnLJwq-zNNvyPnCSqxeKVJQyOuwFkoFrtJThw0Wj_z7DMBo9edanzW_kPSwh15jBbzs289hOjFkv8ZFmpxh80-bNMEBqOJ3Af_zDPOR_Se-hr1z1TNL_aaociFyfyYXMrjRibmK49BifJeZdQ6q6EsSZg-z2rywXycsVOebW85a1sTslVEFrZjkYDb4CfbdudPg3k4Rcvw' +}); */ -const openai = createOpenAI({ - baseURL: 'https://api.xiaomimimo.com/v1', - apiKey: 'sk-cr54p8d2k20nppdzzwyfir4b4znxoh1py6ccxpkc8qt1ahij' -}); +// const openai = createOpenAI({ +// baseURL: 'https://api.xiaomimimo.com/v1', +// apiKey: 'sk-cr54p8d2k20nppdzzwyfir4b4znxoh1py6ccxpkc8qt1ahij' +// }); // 创建一个基本内存实例 const memory = new Memory({ @@ -45,6 +50,13 @@ export const multiFunctionAgent = new Agent({ 2. **柜机查询**:使用柜机工具查询智能柜信息,支持查询柜机详情。 3. **门店查询**:使用门店工具查询门店相关信息,支持查询门店列表、模式列表。 4. **借还动态查询**:使用借还动态工具查询商品借还记录,支持按商品ID、格口ID、状态、动态类型筛选,可查询借出和归还记录。 +5. **代码执行**:使用代码执行工具运行 JavaScript 代码(同步执行)。对大段信息或数据进行处理时请不要直接输出,而应通过代码执行工具进行处理。 + - 输入参数: + - code: 要执行的 JavaScript 代码(必须以 return 语句返回结果) + - context: 可选,上下文数据对象 + - 示例: + - code: "return a + b", context: {a: 10, b: 20} → 返回 30 + - code: "return data.filter(x => x > 5)", context: {data: [1,3,7,9]} → 返回 [7, 9] 各个概念层级关系如下: - 模式(mode):表示门店和智能柜的运行模式,(0-支付模式 1-审批模式 2-借还模式 3-会员模式 4-耗材模式 5-暂存模式)。 @@ -54,6 +66,9 @@ export const multiFunctionAgent = new Agent({ - 格口(cell):表示智能柜中的一个具体位置,每个格口都有唯一的ID和名称,属于某个智能柜,格口中可以存放商品,也可以用于租赁或暂存个人物品。 - 商品(goods):表示具体的商品实体,每个商品都有唯一的ID和名称、价格、库存数量等信息。 +业务概念: +- 格口是否已被占用:格口(cell)的usageStatus(1-空闲 2-占用)。 + 请始终礼貌、乐于助人。如果用户询问超出你能力范围的事情,请礼貌解释你能做什么。 你可以记住之前的对话和用户偏好。 当用户分享关于他们自己的信息时,请确认并记住它以供将来参考。 @@ -65,12 +80,14 @@ export const multiFunctionAgent = new Agent({ // model: deepseek('deepseek-chat'), // model: deepseek('deepseek-reasoner'), // model: openai.chat('mimo-v2-flash'), - model: deepseek.chat('mimo-v2-flash'), + model: mimimo.chat('mimo-v2-flash'), + // model: minimax.chat('MiniMax-M2.1'), memory: memory, tools: { goodsTool, cabinetTool, shopTool, dynamicInfoTool, + codeExecutorTool, }, }); \ No newline at end of file diff --git a/src/mastra/tools/code-executor-tool.ts b/src/mastra/tools/code-executor-tool.ts new file mode 100644 index 0000000..1841b3d --- /dev/null +++ b/src/mastra/tools/code-executor-tool.ts @@ -0,0 +1,46 @@ +import { createTool } from "@mastra/core/tools"; +import { z } from "zod"; + +export const codeExecutorTool = createTool({ + id: "code-executor", + description: + "执行 JavaScript 代码(同步),支持传入上下文数据。代码必须使用 return 语句返回结果。", + inputSchema: z.object({ + code: z.string().describe("要执行的 JavaScript 代码,必须使用 return 语句返回结果"), + context: z + .record(z.string(), z.any()) + .optional() + .describe("执行上下文数据,以键值对形式传入,可在代码中使用对应的变量名"), + }), + outputSchema: z.object({ + success: z.boolean().describe("是否执行成功"), + result: z.any().optional().describe("代码执行结果(返回值)"), + error: z.string().optional().describe("错误信息(执行失败时)"), + executionTime: z.number().describe("执行耗时(毫秒)"), + }), + execute: async ({ context }) => { + console.log("代码执行参数:", context); + const startTime = Date.now(); + const { code, context: contextData } = context; + + try { + // 创建函数并执行 + const fn = new Function('context', code); + const result = fn(contextData); + + console.log("代码执行结果:", result); + return { + success: true, + result, + executionTime: Date.now() - startTime, + }; + } catch (error: any) { + console.error("代码执行错误:", error); + return { + success: false, + error: error.message || "执行失败", + executionTime: Date.now() - startTime, + }; + } + }, +}); diff --git a/src/mastra/tools/index.ts b/src/mastra/tools/index.ts index 2dea60d..186200e 100644 --- a/src/mastra/tools/index.ts +++ b/src/mastra/tools/index.ts @@ -2,3 +2,4 @@ export { goodsTool } from "./goods-tool"; export { cabinetTool } from "./cabinet-tool"; export { shopTool } from "./shop-tool"; export { dynamicInfoTool } from "./dynamic-info-tool"; +export { codeExecutorTool } from "./code-executor-tool";