文件操作与命令执行¶
内置工具覆盖文件读写、搜索、补丁和命令执行。创建 Runtime 时显式指定工作目录与工具列表,让相对路径有明确起点。
让 Agent 阅读文件¶
完成模型配置,运行 python examples/runtime/files.py:
import asyncio
import os
from pathlib import Path
import bumblehive
async def main() -> None:
config = bumblehive.RuntimeArguments(
model=os.environ["BUMBLEHIVE_MODEL"],
api_key=os.environ["BUMBLEHIVE_API_KEY"],
base_url=os.environ["BUMBLEHIVE_BASE_URL"],
skill_names=[],
workspace=Path(__file__).resolve().parent,
tool_names=["list_dir", "read_file"],
)
async with bumblehive.from_config(config) as runtime:
result = await runtime.run("读取 basic.py,用中文概括它做了什么。")
print(result.error.message if result.error else result.final_content)
if __name__ == "__main__":
asyncio.run(main())
workspace 指向示例目录,tool_names 开放读取工具。运行后,Agent 应概括 basic.py 的配置、调用和输出流程。
常用内置工具¶
| 任务 | 工具 | 典型输入 |
|---|---|---|
| 阅读文件 | read_file |
path |
| 写入文件 | write_file |
path、content |
| 替换文本 | edit_file |
path、替换前后的文本 |
| 应用补丁 | apply_patch |
补丁内容 |
| 列出和查找文件 | list_dir、find_files |
目录或匹配模式 |
| 搜索内容 | grep |
搜索词与范围 |
| 执行命令 | exec |
command、working_dir |
| 跟进命令 | write_stdin |
session_id、输入或轮询选项 |
| 查看命令会话 | list_exec_sessions |
当前会话范围 |
Runtime 会注册内置工具,但是否向模型开放取决于 tool_names。修改文件或执行命令时可以接入人工审批。
直接验证文件工具¶
不调用模型也可以执行工具。这个完整示例在临时目录中写入、读取并列出文件,退出后自动清理:
examples/tools/builtins.py
import asyncio
from pathlib import Path
from tempfile import TemporaryDirectory
from bumblehive.protocols import ToolCall
from bumblehive.tools import ToolManager
async def main() -> None:
with TemporaryDirectory() as directory:
root = Path(directory)
workspace = root / "workspace"
output = root / "output"
workspace.mkdir()
output.mkdir()
tools = ToolManager()
tools.register_builtin_tools()
written, read, listed = await tools.execute_many(
[
ToolCall(
id="write",
name="write_file",
arguments={
"path": str(output / "notes.txt"),
"content": "hello",
},
),
ToolCall(
id="read",
name="read_file",
arguments={"path": str(output / "notes.txt")},
),
ToolCall(
id="list",
name="list_dir",
arguments={"path": str(output)},
),
],
workspace=workspace,
)
print("Written:", written.content)
print("Read:", read.content)
print("Listed:", listed.content)
if __name__ == "__main__":
asyncio.run(main())
从仓库根目录执行 python examples/tools/builtins.py,检查读取结果是否包含 hello。
持续运行的命令¶
exec 省略 yield_time_ms 时等待命令结束;传入后,未完成的命令可返回 session_id。后续将该 ID 交给 write_stdin:
| 操作 | write_stdin 参数 |
|---|---|
| 查看新增输出 | session_id 与空 chars |
| 发送输入 | session_id 与 chars |
| 发送 EOF | close_stdin=True |
| 停止进程 | terminate=True |
默认命令超时为 60 秒。关闭 Runtime 会清理其管理的执行会话;应用应及时释放不再需要的资源。
路径与工作目录¶
文件工具的 path 接受绝对路径和相对于 workspace 的路径。Shell 的 working_dir 省略时使用 workspace,也可以指定其他目录。
工作目录是路径解析起点,不是文件或进程沙箱;相对路径可以包含 ..。需要用户决定是否执行时,接入审批。Shell 命令还会检查自身的 deny_patterns 规则,匹配时拒绝执行。
子进程的 PATH 优先包含当前 Python 解释器目录,再继承父进程中的有效绝对路径。