ARTICLE DETAIL

资讯详情

深耕网站建设与运营推广的一线实战洞察。

Agent-Reach 实战:用 CLI 为 AI Agent 打造执行触达层

Agent-Reach 实战:用 CLI 为 AI Agent 打造执行触达层 1. 从命令行到智能体Agent-Reach 到底在解决什么问题第一次看到 Agent-Reach 这个名字我下意识把它拆成了两半Agent 和 Reach。Agent 是智能体Reach 是触达、延伸、够得着。合在一起它想做的事情其实很直白——让 AI Agent 的手伸得更长一点能真正碰到那些原本碰不到的地方。过去一年我一直在折腾各种 AI Agent 的落地场景从最开始的 LangChain 拼装到后来用 Coze 搭工作流再到最近半年频繁接触各类 CLI 形态的 Agent 工具。踩过的坑不算少最大的感受是大部分 Agent 框架都在教你“怎么让模型思考”但很少有人认真解决“怎么让模型干活”。思考是大脑的事干活是手脚的事。Agent-Reach 瞄准的恰恰是后者——它是一套以 CLI 为核心交互形态的 Agent 触达层让智能体能够通过命令行接口去操作外部系统、调用本地工具、串联起完整的任务链路。说白了你可以把它理解成给 AI Agent 装了一双能伸进操作系统里的手。模型负责决策Agent-Reach 负责执行。它不跟你抢大脑的活它专心把手脚练灵活。这篇文章适合谁看如果你已经在用 Coze、Dify 这类平台搭过简单的 Agent但发现一旦涉及本地文件操作、系统命令调用、多步骤任务编排就卡住了那 Agent-Reach 这类 CLI 形态的方案值得你花时间研究。如果你是完全的新手也没关系我会从最基础的概念讲起把每个环节的“为什么”说清楚。如果你是有经验的开发者可以直接跳到实操部分那里有我踩过的坑和验证过的配置。核心关键词先摆出来Agent-Reach、CLI、AI Agent。这三个词贯穿全文也是理解这套方案的三把钥匙。CLI 是它的骨架AI Agent 是它的灵魂Agent-Reach 是两者结合后的具体产物。接下来我会从设计思路、核心细节、实操过程、问题排查四个维度把这套东西拆开揉碎讲一遍。2. 整体设计思路为什么是 CLI 而不是 GUI2.1 CLI 作为 Agent 触达层的天然优势很多人第一次接触 Agent-Reach 这类工具时会问为什么不做个图形界面拖拖拽拽多直观非要敲命令不是倒退吗这个问题我一开始也想不通直到自己动手搭了几个 Agent 项目之后才明白。GUI 是给人用的CLI 是给程序用的。AI Agent 本质上是一段程序它不需要按钮和输入框它需要的是确定性的输入输出接口。你给 GUI 一个点击操作背后可能触发十几个不确定的事件你给 CLI 一条命令返回的就是标准输出和退出码干净利落。CLI 对 Agent 来说有三个不可替代的好处。第一是可组合性一条命令的输出可以管道传给下一条命令Agent 可以把复杂任务拆成命令链每一步的结果都能被捕获和判断。第二是可追溯性每条命令执行了什么、返回了什么日志里清清楚楚出问题了好排查。第三是低资源开销不需要渲染界面不需要维护窗口状态Agent 可以把全部算力用在决策上。Agent-Reach 的设计哲学就建立在这三点之上。它不试图做一个大而全的平台而是做一个轻量的触达层把 CLI 的能力封装成 Agent 可以理解和调用的形式。你可以把它想象成一个翻译官一边是 AI Agent 的决策语言一边是操作系统的命令语言它负责把前者翻译成后者再把执行结果翻译回去。2.2 Agent-Reach 的架构分层从架构上看Agent-Reach 大致分成三层。最底层是命令执行层负责实际调用系统命令、脚本、外部程序这一层要处理权限、超时、错误捕获这些脏活累活。中间是能力抽象层把零散的命令封装成有语义的能力单元比如“读取文件”“发送请求”“执行脚本”Agent 不需要知道具体命令怎么写只需要知道有哪些能力可用。最上面是决策对接层把能力清单暴露给 AI Agent让模型根据任务目标选择合适的能力组合。这个分层的好处是解耦。命令执行层可以换今天用 bash明天换 PowerShell上层不用动。能力抽象层可以扩展今天支持文件操作明天加数据库查询Agent 的能力边界就拓宽了。决策对接层可以适配不同的模型和框架不管是 Coze 还是 LangChain都能接进来。我实测下来这种分层设计最大的价值在于调试友好。当 Agent 执行出错时你可以逐层排查是命令本身写错了还是能力封装有问题还是模型选错了能力。如果是一坨黑盒你只能猜分层之后问题定位时间能缩短一半以上。2.3 与主流 Agent 框架的定位差异市面上主流的 AI Agent 框架比如 LangChain、AutoGPT、Coze它们的重心在决策链上——怎么让模型更好地规划任务、怎么管理记忆、怎么处理多轮对话。Agent-Reach 不跟它们竞争它更像是这些框架的执行插件。打个比方LangChain 是大脑Agent-Reach 是手。大脑负责想手负责做。你可以用 LangChain 规划一个“整理下载文件夹”的任务然后通过 Agent-Reach 去实际执行文件分类、重命名、移动这些操作。两者配合才是一个完整的智能体。这种定位差异决定了 Agent-Reach 的使用方式它不要求你放弃现有的 Agent 框架而是作为一个补充层接入。你可以在 Coze 里搭好工作流把最后一步的执行动作交给 Agent-Reach也可以在本地用 Python 写个简单的调度器调用 Agent-Reach 的接口来完成系统级操作。提示如果你现在的 Agent 项目卡在“只能聊天不能干活”的阶段Agent-Reach 这类执行层工具就是突破口。不要试图让模型直接生成 shell 命令去执行那样既危险又不可控正确的做法是通过能力抽象层来约束执行范围。3. 核心细节解析Agent-Reach 的关键组件与实操要点3.1 命令执行层的安全边界设计让 AI Agent 执行系统命令第一反应应该是“安全吗”。我见过太多人直接让模型生成 shell 命令然后eval执行结果模型一个手抖生成了rm -rf哭都来不及。Agent-Reach 在命令执行层做了几道防线这些设计值得每个做 Agent 执行层的人参考。第一道防线是白名单机制。不是所有命令都能执行只有预先注册过的命令才允许通过。比如你注册了ls、cat、mkdir这几个命令Agent 就只能用这几个想执行rm会被直接拦截。白名单的粒度可以细到参数级别比如mkdir只允许在特定目录下创建文件夹。第二道防线是沙箱隔离。命令执行在一个受限的环境里文件系统的访问范围被限制在指定目录内网络访问也可以按需开关。这样即使 Agent 决策失误破坏范围也是可控的。第三道防线是执行审计。每条命令的执行时间、执行者、参数、返回值、退出码都记录在案。出问题的时候可以回溯也方便分析 Agent 的行为模式优化能力抽象层的设计。我自己的做法是在白名单基础上再加一层参数校验。比如文件路径参数必须匹配预设的正则模式URL 参数必须是指定的域名范围。这层校验用简单的规则引擎就能实现但能挡掉大部分意外情况。3.2 能力抽象层的封装粒度能力抽象层的设计是个技术活封得太粗Agent 不好用封得太细Agent 选择困难。我试过几种粒度最后总结出一个原则按任务语义封装不按命令语法封装。举个例子“读取一个文本文件的内容”是一个任务语义对应到命令可能是cat file.txt也可能是head -n 100 file.txt还可能是python -c print(open(file.txt).read())。Agent 不需要知道这些细节它只需要知道有一个叫read_file的能力传入文件路径返回文件内容。具体用什么命令实现是能力抽象层的事。再比如“发送一个 HTTP 请求”对应到命令可能是curl也可能是wget还可能是 Python 的requests库。封装成http_request能力之后Agent 只需要关心 URL、方法、请求体这些语义参数不用管底层用什么工具。这种封装方式的好处是Agent 的决策空间被压缩了。如果暴露给 Agent 的是原始命令它要在几百个命令和无数参数组合里做选择很容易选错。封装成几十个语义能力之后选择范围小了决策准确率自然就上去了。我实测过同样的任务用语义能力封装的 Agent 成功率比直接用原始命令的高出三成左右。3.3 决策对接层的协议设计决策对接层要解决的核心问题是怎么让 AI Agent 知道有哪些能力可用以及怎么调用这些能力。目前主流的做法有两种一种是函数调用Function Calling一种是提示词描述。函数调用是现在大模型普遍支持的能力你把能力定义成 JSON Schema 格式的函数签名模型在需要的时候会自动生成调用参数。这种方式的好处是结构化程度高参数校验方便模型的理解准确率也高。缺点是依赖模型本身的能力有些小模型对函数调用的支持不好。提示词描述是把能力清单写进系统提示词里让模型按照约定的格式输出调用指令。这种方式兼容性好什么模型都能用但准确率依赖提示词的质量需要反复调试。Agent-Reach 两种方式都支持我的建议是如果你的模型支持函数调用优先用函数调用如果不支持或者支持得不好再用提示词描述兜底。两种方式可以混用核心能力用函数调用保证准确率边缘能力用提示词描述补充灵活性。注意不管用哪种方式能力描述都要写得具体且无歧义。不要写“处理文件”要写“读取指定路径的文本文件并返回其内容路径必须是绝对路径且文件大小不超过 1MB”。描述越具体模型选错的概率越低。3.4 与 Rust 生态的结合考量最近 Rust 在 AI Agent 领域的存在感越来越强Agent-Reach 这类工具用 Rust 实现也有其道理。Rust 的零成本抽象和内存安全特性对于需要长时间稳定运行的 Agent 执行层来说很合适。命令执行涉及大量的字符串处理和进程管理Rust 在这方面的性能和安全性都比脚本语言有优势。不过 Rust 的学习曲线确实陡如果你只是想快速验证一个 Agent 想法用 Python 或 Node.js 可能更实际。我的建议是原型阶段用脚本语言快速迭代生产阶段如果对性能和稳定性有要求再考虑用 Rust 重写核心模块。Agent-Reach 本身是语言无关的设计你可以用任何语言实现它的分层架构。如果你决定用 Rust有几个 crate 值得关注std::process用于命令执行serde用于能力定义的序列化tokio用于异步任务管理。这些组合起来能搭出一个相当扎实的执行层。4. 实操过程从零搭建一个 Agent-Reach 执行环境4.1 环境准备与依赖安装先说一下我的实操环境一台普通的 Linux 开发机Ubuntu 22.04Python 3.11Node.js 20。Agent-Reach 本身不挑环境但为了演示方便我用 Python 来实现能力抽象层和决策对接层用 bash 来做命令执行层。第一步是创建工作目录和虚拟环境。这一步没什么好说的但有个细节要注意工作目录的路径不要有空格和中文不然后面命令拼接的时候容易出问题。我踩过这个坑一个带空格的路径让我排查了半小时。mkdir -p ~/agent-reach-demo cd ~/agent-reach-demo python3 -m venv venv source venv/bin/activate pip install fastapi uvicorn pydantic这里装 FastAPI 是为了后面暴露 HTTP 接口给 Agent 调用pydantic 用来做参数校验。如果你不需要 HTTP 接口只做本地调用这两个可以不装。第二步是创建目录结构。我习惯把不同层级的代码分开放这样调试的时候一目了然。mkdir -p commands capabilities api logs touch commands/executor.sh touch capabilities/registry.py touch api/server.pycommands/executor.sh是命令执行层的入口capabilities/registry.py是能力注册中心api/server.py是对外暴露的接口。logs目录用来存执行日志。4.2 命令执行层的实现与参数计算命令执行层的核心是一个 bash 脚本它接收命令名称和参数校验后执行返回结果。先看代码#!/bin/bash # commands/executor.sh ALLOWED_COMMANDS(ls cat mkdir echo date wc) LOG_FILE../logs/execution.log log() { echo [$(date %Y-%m-%d %H:%M:%S)] $1 $LOG_FILE } validate_command() { local cmd$1 for allowed in ${ALLOWED_COMMANDS[]}; do if [ $cmd $allowed ]; then return 0 fi done return 1 } execute() { local cmd$1 shift local args($) if ! validate_command $cmd; then log REJECTED: $cmd ${args[*]} echo ERROR: command not allowed exit 1 fi log EXECUTING: $cmd ${args[*]} local output output$($cmd ${args[]} 21) local exit_code$? log RESULT: exit_code$exit_code output${output:0:200} echo $output exit $exit_code } execute $这个脚本的逻辑很直白定义白名单校验命令执行记录日志。有几个细节值得展开说。白名单的选择。我选了ls、cat、mkdir、echo、date、wc这几个命令覆盖了查看目录、读文件、建目录、输出、看时间、统计这几个基础能力。实际项目中你可以按需增减但原则是只放必要的不放方便的。比如rm很方便但风险太高除非你有完善的回收站机制否则不要放。日志的截断。output${output:0:200}这行把输出截断到 200 字符防止日志文件被大输出撑爆。实际调试的时候可以调大生产环境建议保持小值需要完整输出的时候再单独处理。退出码的传递。exit $exit_code把命令的退出码原样返回这样上层调用者可以根据退出码判断执行成功还是失败。这是 Unix 哲学的基本实践但很多人在封装命令的时候会忽略。参数计算方面主要是超时控制。命令执行不能无限等待必须设一个超时。我一般设 30 秒对于大部分文件操作和简单命令足够了。超时可以用timeout命令实现output$(timeout 30 $cmd ${args[]} 21)如果命令在 30 秒内没执行完会被强制终止退出码是 124。上层可以根据这个退出码判断是超时还是其他错误。4.3 能力抽象层的注册与调用能力抽象层用 Python 实现核心是一个注册表把命令封装成有语义的能力。先看代码# capabilities/registry.py import subprocess import os from typing import Any class CapabilityRegistry: def __init__(self, executor_path: str): self.executor_path executor_path self.capabilities {} self._register_defaults() def _register_defaults(self): self.register( namelist_directory, description列出指定目录下的文件和文件夹, parameters{ path: {type: string, description: 目录的绝对路径} }, handlerself._list_directory ) self.register( nameread_file, description读取指定文本文件的内容文件大小不超过1MB, parameters{ path: {type: string, description: 文件的绝对路径} }, handlerself._read_file ) self.register( namecreate_directory, description在指定路径创建目录, parameters{ path: {type: string, description: 要创建的目录绝对路径} }, handlerself._create_directory ) def register(self, name: str, description: str, parameters: dict, handler): self.capabilities[name] { name: name, description: description, parameters: parameters, handler: handler } def get_capability_list(self) - list: return [ { name: cap[name], description: cap[description], parameters: cap[parameters] } for cap in self.capabilities.values() ] def invoke(self, name: str, arguments: dict) - Any: if name not in self.capabilities: return {success: False, error: f未知能力: {name}} cap self.capabilities[name] try: result cap[handler](**arguments) return {success: True, result: result} except Exception as e: return {success: False, error: str(e)} def _run_command(self, cmd: str, args: list) - str: full_args [self.executor_path, cmd] args result subprocess.run( full_args, capture_outputTrue, textTrue, timeout35 ) if result.returncode ! 0: raise RuntimeError(f命令执行失败: {result.stderr}) return result.stdout def _list_directory(self, path: str) - str: if not os.path.isabs(path): raise ValueError(路径必须是绝对路径) return self._run_command(ls, [-la, path]) def _read_file(self, path: str) - str: if not os.path.isabs(path): raise ValueError(路径必须是绝对路径) if os.path.getsize(path) 1024 * 1024: raise ValueError(文件大小超过1MB限制) return self._run_command(cat, [path]) def _create_directory(self, path: str) - str: if not os.path.isabs(path): raise ValueError(路径必须是绝对路径) return self._run_command(mkdir, [-p, path])这段代码有几个设计点值得说。能力描述的结构化。每个能力都有 name、description、parameters 三个字段这个结构可以直接转成函数调用的 JSON Schema也可以直接拼进提示词里。description 写得越具体模型选对的概率越高。参数校验前置。在调用命令之前先在 Python 层做校验比如路径必须是绝对路径、文件大小不能超过 1MB。这些校验比在 bash 里做更方便错误信息也更友好。异常处理。invoke方法用 try-except 包住所有执行逻辑任何异常都转成结构化的错误返回不会让 Agent 拿到一个未捕获的异常。这一点很重要Agent 需要的是可预期的结果不是崩溃。超时设置。subprocess.run的 timeout 设成 35 秒比 bash 脚本里的 30 秒多 5 秒留出缓冲。这样如果 bash 层超时了Python 层还能正常捕获到错误。4.4 决策对接层的接口暴露决策对接层要把能力清单暴露给 AI Agent我用 FastAPI 做一个简单的 HTTP 接口# api/server.py from fastapi import FastAPI, HTTPException from pydantic import BaseModel from capabilities.registry import CapabilityRegistry import os app FastAPI(titleAgent-Reach API) executor_path os.path.join(os.path.dirname(__file__), .., commands, executor.sh) registry CapabilityRegistry(executor_path) class InvokeRequest(BaseModel): capability: str arguments: dict app.get(/capabilities) def list_capabilities(): return {capabilities: registry.get_capability_list()} app.post(/invoke) def invoke_capability(request: InvokeRequest): result registry.invoke(request.capability, request.arguments) if not result[success]: raise HTTPException(status_code400, detailresult[error]) return result这个接口有两个端点GET /capabilities返回能力清单POST /invoke执行指定能力。Agent 先拉取能力清单了解自己有哪些能力可用然后根据任务选择能力并调用。启动服务uvicorn api.server:app --host 127.0.0.1 --port 8000测试一下curl http://127.0.0.1:8000/capabilities应该能看到三个能力的 JSON 描述。再测试调用curl -X POST http://127.0.0.1:8000/invoke \ -H Content-Type: application/json \ -d {capability: list_directory, arguments: {path: /tmp}}如果返回了/tmp目录的内容说明整条链路通了。4.5 与 AI Agent 的对接实战现在到了最关键的一步让 AI Agent 真正用起来。我用一个简单的 Python 脚本来模拟 Agent 的决策过程实际项目中你可以换成任何支持函数调用的模型。# agent_demo.py import requests import json API_BASE http://127.0.0.1:8000 def get_capabilities(): resp requests.get(f{API_BASE}/capabilities) return resp.json()[capabilities] def invoke(capability, arguments): resp requests.post( f{API_BASE}/invoke, json{capability: capability, arguments: arguments} ) return resp.json() def build_system_prompt(capabilities): prompt 你可以使用以下能力来完成任务\n\n for cap in capabilities: prompt f- {cap[name]}: {cap[description]}\n prompt f 参数: {json.dumps(cap[parameters], ensure_asciiFalse)}\n prompt \n请根据用户任务选择合适的能カ并输出调用参数。 return prompt if __name__ __main__: caps get_capabilities() print(可用能力) for cap in caps: print(f - {cap[name]}: {cap[description]}) system_prompt build_system_prompt(caps) print(\n系统提示词) print(system_prompt) result invoke(list_directory, {path: /tmp}) print(\n调用结果) print(result)这个脚本做了三件事拉取能力清单、构建系统提示词、调用一个能力做测试。实际对接模型的时候把系统提示词传给模型模型返回的调用指令解析后传给invoke函数即可。提示系统提示词里一定要把能力描述和参数格式写清楚。我试过偷懒只写能力名不写参数结果模型经常传错参数格式。多花五分钟写清楚描述能省下半小时的调试时间。5. 常见问题与排查技巧实录5.1 命令执行失败的排查路径Agent-Reach 跑起来之后最常见的问题就是命令执行失败。我整理了一个排查路径按顺序走一遍基本能定位到问题。排查步骤检查内容常见问题解决方法1命令是否在白名单命令未注册添加到 ALLOWED_COMMANDS2参数格式是否正确路径含空格、参数缺失加引号、补参数3权限是否足够无权限访问目标路径调整文件权限或换路径4是否超时命令执行超过30秒优化命令或调大超时5日志是否有记录日志文件不可写检查日志目录权限这个表我贴在显示器边上出问题的时候按顺序过一遍大部分情况三步之内就能找到原因。有个坑特别隐蔽路径里的波浪号~不会自动展开。在 bash 里cd ~能回家目录但在脚本里传给命令的~会被当成普通字符。解决办法是在 Python 层用os.path.expanduser展开或者要求 Agent 传绝对路径。我选择后者因为绝对路径更明确不容易出歧义。5.2 能力选择错误的优化方法Agent 选错能力是另一个高频问题。比如让它读文件它去列目录让它建目录它去读文件。这种错误通常不是模型笨而是能力描述不够清晰。优化方法有三个层次。第一层是改描述把能力描述写得更具体加上使用场景和限制条件。比如“读取文件”改成“读取指定路径的文本文件内容适用于查看配置文件、日志、代码等文本内容不适用于二进制文件”。第二层是加示例在能力描述里附上一两个调用示例让模型有参照。示例不用多一两个就够关键是覆盖典型场景。第三层是减数量如果能力太多导致模型选择困难可以按场景分组每次只暴露当前场景相关的能力。比如文件操作场景只暴露文件相关能力网络操作场景只暴露网络相关能力。这样模型的决策空间小了准确率自然上去。我实测过三层优化做完能力选择准确率能从六成提到九成以上。代价是前期要多花时间写描述和示例但这是一次性投入后面长期受益。5.3 并发场景下的稳定性问题AI Agent 扛并发是个热门话题Agent-Reach 作为执行层并发压力最终会落到它身上。我做过简单的压测单进程的 FastAPI 在并发 50 左右开始出现超时主要瓶颈在命令执行的阻塞上。解决办法有几个。最直接的是加进程用uvicorn --workers 4启动多个 worker每个 worker 独立处理请求。但要注意命令执行层如果有共享状态比如写同一个日志文件多进程会有竞争问题需要加锁或者改成异步写日志。另一个办法是异步化命令执行把subprocess.run换成asyncio.create_subprocess_exec这样命令执行不阻塞事件循环单进程也能扛更高的并发。代价是代码复杂度上升需要处理异步的超时和取消。还有一个思路是任务队列把执行请求丢进队列后台 worker 慢慢消费前端只返回任务 ID结果通过轮询或回调获取。这种方式适合执行时间长的任务短任务反而增加了延迟。我的建议是并发量在 100 以下加 worker 就够了100 到 1000考虑异步化1000 以上上任务队列。不要一上来就搞最复杂的方案按需演进。5.4 日志与审计的实操心得日志这东西平时觉得没用出问题的时候就是救命稻草。我在 Agent-Reach 的日志上踩过几个坑分享出来帮你省时间。第一个坑是日志级别混乱。一开始我把所有信息都写进一个文件结果调试的时候被淹没在噪音里。后来改成分级ERROR 单独一个文件INFO 一个文件DEBUG 只在需要的时候开。这样排查问题的时候直接看 ERROR 文件效率高很多。第二个坑是日志没有轮转。跑了一周之后日志文件几个 G打开都费劲。后来加了 logrotate按天切割保留最近 7 天。配置很简单# /etc/logrotate.d/agent-reach /path/to/logs/*.log { daily rotate 7 compress missingok notifempty }第三个坑是敏感信息泄露。日志里记录了完整的命令和参数如果参数里有密钥或者个人信息就泄露了。解决办法是在记录之前做脱敏把敏感字段替换成***。这个要在能力抽象层做因为只有那一层知道哪些参数是敏感的。注意日志的写入不要用同步方式高并发下会成为瓶颈。可以用 Python 的logging.handlers.QueueHandler做异步写或者直接写到标准输出让容器运行时去收集。6. 从 Agent-Reach 延伸出去的几个方向Agent-Reach 这套东西跑通之后我发现它的扩展性比想象中好。几个方向值得继续折腾。第一个方向是能力市场的概念。现在能力是写死在代码里的如果做成插件式每个人都可以贡献自己的能力包Agent 的能力边界就能快速扩展。想象一下有人做了“操作 Excel”的能力包有人做了“调用 GitLab API”的能力包有人做了“发送小红书消息”的能力包Agent 装上就能用。这个生态一旦起来Agent 能干的活就多了。第二个方向是执行过程的可视化。现在 Agent 执行了什么命令、返回了什么结果只有日志里能看到。如果做一个实时的执行面板把命令流、输出流、错误流都展示出来调试和演示都会方便很多。这个用 WebSocket 推送到前端就能实现技术难度不大。第三个方向是与工作流引擎的结合。Agent-Reach 负责单步执行工作流引擎负责多步编排。两者结合就能实现复杂的自动化任务。比如“每天早上检查服务器状态异常就发通知正常就生成报告”这种任务用工作流引擎编排每一步的执行交给 Agent-Reach。第四个方向是安全沙箱的强化。现在的沙箱只是白名单加路径限制如果要做生产级的安全还需要考虑资源限制CPU、内存、磁盘、网络隔离、系统调用过滤。这些可以用容器技术来实现把每个命令执行放在独立的容器里用完即销毁。我个人最看好第一个方向。Agent 的能力边界不应该由框架开发者决定而应该由使用者按需扩展。Agent-Reach 提供了一个执行层的骨架能力包就是血肉骨架加血肉才是一个完整的智能体。最后分享一个小技巧在能力抽象层加一个dry_run参数让 Agent 可以先模拟执行看看效果确认无误再真正执行。这个参数在调试阶段特别有用能避免很多误操作。实现方式也简单在 handler 里判断dry_run为真时只返回将要执行的命令不实际调用。这个小小的设计能省下不少“手滑”的代价。
返回列表