HarmonyOS掌上记账APP开发实践第88篇:DevEco Code AI Agent中如何实现自定义工具 自定义工具创建 LLM 可在 DevEco Code 中调用的工具。自定义工具是你创建的函数LLM 可以在对话过程中调用它们。它们与 deveco 的内置工具如read、write和bash协同工作。创建工具工具以TypeScript或JavaScript文件的形式定义。不过工具定义可以调用任何语言编写的脚本——TypeScript 或 JavaScript 仅用于工具定义本身。位置工具可以在以下位置定义本地定义将工具文件放在项目的.deveco/tools/目录中。全局定义将工具文件放在~/.config/deveco/tools/中。结构创建工具最简单的方式是使用tool()辅助函数它提供类型安全和参数校验。import { tool } from deveco/deveco-code-plugin export default tool({ description: Query the project database, args: { query: tool.schema.string().describe(SQL query to execute), }, async execute(args) { // Your database logic here return Executed query: ${args.query} }, })文件名即为工具名称。上面的示例创建了一个名为database的工具。单文件多工具你也可以从单个文件中导出多个工具。每个导出都会成为一个独立的工具命名格式为filename_exportnameimport { tool } from deveco/deveco-code-plugin export const add tool({ description: Add two numbers, args: { a: tool.schema.number().describe(First number), b: tool.schema.number().describe(Second number), }, async execute(args) { return args.a args.b }, }) export const multiply tool({ description: Multiply two numbers, args: { a: tool.schema.number().describe(First number), b: tool.schema.number().describe(Second number), }, async execute(args) { return args.a * args.b }, })这会创建两个工具math_add和math_multiply。与内置工具的名称冲突自定义工具通过工具名称进行索引。如果自定义工具使用了与内置工具相同的名称则优先使用自定义工具。例如这个文件取代了内置的bash工具import { tool } from deveco/deveco-code-plugin export default tool({ description: Restricted bash wrapper, args: { command: tool.schema.string(), }, async execute(args) { return blocked: ${args.command} }, })Note除非你有意替换内置工具否则最好用独特的名字。如果你想禁用内置工具但不想覆盖它使用 权限.参数你可以使用tool.schema即 Zod来定义参数类型。args: { query: tool.schema.string().describe(SQL query to execute) }你也可以直接导入 Zod 并返回一个普通对象import { z } from zod export default { description: Tool description, args: { param: z.string().describe(Parameter description), }, async execute(args, context) { // Tool implementation return result }, }上下文工具会接收当前会话的上下文信息import { tool } from deveco/deveco-code-plugin export default tool({ description: Get project information, args: {}, async execute(args, context) { // Access context information const { agent, sessionID, messageID, directory, worktree } context return Agent: ${agent}, Session: ${sessionID}, Message: ${messageID}, Directory: ${directory}, Worktree: ${worktree} }, })使用context.directory获取会话的工作目录。使用context.worktree获取 git worktree 根目录。示例用 Python 编写工具你可以使用任何语言编写工具。以下示例展示了如何用 Python 实现两数相加。首先创建一个 Python 脚本作为工具import sys a int(sys.argv[1]) b int(sys.argv[2]) print(a b)然后创建调用该脚本的工具定义import { tool } from deveco/deveco-code-plugin import path from path export default tool({ description: Add two numbers using Python, args: { a: tool.schema.number().describe(First number), b: tool.schema.number().describe(Second number), }, async execute(args, context) { const script path.join(context.worktree, .deveco/tools/add.py) const result await Bun.$python3 ${script} ${args.a} ${args.b}.text() return result.trim() }, })这里我们使用 Bun.$ 工具函数来运行 Python 脚本。

本月热点