【声明】本博客所有内容均为个人业余时间创作,所述技术案例均来自公开开源项目(如Github,Apache基金会),不涉及任何企业机密或未公开技术,如有侵权请联系删除

背景

上篇 blog
【Agent】【OpenCode】用户对话提示词(addtionalProperties 属性)
继续补充分析了 addtionalProperties 关键词,提到了 OpenCode 设置成 false,是为了确保 OpenCode 前端界面只接收它能理解的参数,防止 AI 传一些前端不支持的参数导致程序崩溃,强迫 AI 传给工具的数据是纯净完全符合预期的,此外,addtionalProperties 关键字也是 JSON Schema 标准中的内容,专门用于控制对象中未在 properties 里明确定义的属性是否合法,其值除了可以是布尔值,还可以是一个子 Schema,用来定义额外属性必须符合的格式,然后继续分析了作为单个问题的完整数据结构,接着继续分析了下一个工具 bash,OpenCode 定义的 bash 工具和在终端里直接输入 bash 命令本质上是一回事,但这里的 bash 工具在安全性和便利性上做了很多包装,可以理解为一个带着安全校验和导航功能的 Bash,并对比了 bash 工具和终端 Bash 的区别,下面继续分析

OpenCode

下面来继续分析 bash 工具

在这里插入图片描述

这里规定了 AI 在后台执行终端命令时,必须遵守的规则

  • 基础能力:OpenCode 可以执行 Bash 命令,并且是在一个持久会话中运行,就像打开一个终端窗口一直没关,上一个命令设置了某个环境变量,下一个命令依然能生效,状态是连贯的
  • 工作目录:所有命令默认在 ${directory}(也就是当前项目的根目录)下运行,如果需要在别的文件夹运行命令,就必须使用工具的 workdir 选项填好路径来指定,此外,这里的提示词明确强调,禁止使用 cd ... && command 这种写法
  • 职责边界:专门用来执行终端操作,比如 git(代码管理),npm(安装依赖),docker(容器操作),禁止用 Bash 命令来读写,编辑,或查找文件内容,文件的增删查改有专门的文件工具去处理,这里的 Bash 工具只负责发号施令跑程序

对于普通终端来说,一旦关掉窗口,或者断开 SSH 连接,当前会话和里面的环境变量,运行状态就没了,而上面提到了 OpenCode 执行 Bash 命令是在一个持久会话中运行,能做到关掉终端不丢失状态,这会涉及到一些进程管理和会话保持的技术,下面来分析下做这种持久化会话的一些大体方向

  • 在后台维护一个常驻的 Shell 进程:Agent 程序在启动时,可以通过代码(比如 subprocess 模块)创建一个真实的,长期存活的 Shell 进程(比如 /bin/bash),这个 Shell 进程会一直在后台默默运行,不退出

在这里插入图片描述

可以看到,OpenCode 并没有每次执行命令都临时开一个一次性的 Shell,而是统一维护一个或数个常驻的后台 Shell 进程,当远端 AI 模型需要执行命令时,OpenCode 就可以把命令源源不断地投喂给这个已经存在的 Shell 进程的标准输入 stdin,然后读取它的标准输出 stdout,而因为是同一个 Bash 进程在干活,所以比如 AI 上一次设置的环境变量,下一次命令在执行时依然能读取到

  • 守护进程与超时控制:为了防止这个常驻的 Shell 变成僵尸进程,或者无限期占用服务器资源,可以将其作为守护进程(Daemon)来管理,并加上超时(Timeout)机制

在这里插入图片描述

从安全角度,OpenCode 主程序会监控这个 Shell 进程,如果长时间没有接收到远端 AI 模型新的命令,主程序就可以把它安全关闭,而如果 OpenCode 意外退出了,也可以设置自动清零掉这些后台 Shell


OK,本篇先到这里,如有疑问,欢迎评论区留言讨论,祝各位功力大涨,技术更上一层楼!!!更多内容见下篇 blog
【Agent】【OpenCode】bash 工具提示词(持久化)(二)

Logo

有“AI”的1024 = 2048,欢迎大家加入2048 AI社区

更多推荐