跳转至

审批:执行前征求同意

当 Agent 要写文件或执行需要用户确认的操作时,用 approval_handler 决定是否允许执行。审批发生在工具参数校验之后、实际执行之前。

让用户批准一次写入

完成模型配置,从仓库根目录运行:

python examples/runtime/tool_approval.py
import asyncio
import os
from pathlib import Path

import bumblehive
async def main() -> None:
    workspace = Path(__file__).resolve().parent
    print(f"工作目录:{workspace}")

    async def approve_tool(
        request: bumblehive.ToolApprovalRequest,
    ) -> bumblehive.ToolApprovalDecision:
        print(f"工具:{request.name}\n参数:{dict(request.arguments)}")
        answer = await asyncio.to_thread(input, "允许执行?[y/N] ")
        if answer.strip().lower() in {"y", "yes"}:
            print("已批准")
            return bumblehive.ToolApprovalDecision.approve()
        print("已拒绝")
        return bumblehive.ToolApprovalDecision.reject("用户拒绝写入,请勿重试。")

    config = bumblehive.RuntimeArguments(
        model=os.environ["BUMBLEHIVE_MODEL"],
        api_key=os.environ["BUMBLEHIVE_API_KEY"],
        base_url=os.environ["BUMBLEHIVE_BASE_URL"],
        workspace=workspace,
        skill_names=[],
        tool_names=["write_file"],
    )

    async with bumblehive.from_config(config) as runtime:
        result = await runtime.run(
            "请调用 write_file 创建 approval-demo.txt,内容为 hello。"
            "如果调用被拒绝,不要重试,直接说明文件未创建。",
            approval_handler=approve_tool,
        )
        print(result.error.message if result.error else result.final_content)


if __name__ == "__main__":
    asyncio.run(main())

approve_tool() 收到工具名称和参数,等待用户输入,再返回 approve() 或 reject()。把它传给 runtime.run() 的 approval_handler 即可启用。

运行效果

工作目录:…/examples/runtime
工具:write_file
参数:{'path': 'approval-demo.txt', 'content': 'hello'}
允许执行?[y/N] y
已批准
…模型说明文件已经写入…

输入 y 或 yes 后,工具会写入 approval-demo.txt,可能覆盖同名文件。回车或输入其他内容会拒绝,本次写入不执行,拒绝原因会交回模型。模型的具体措辞可能不同。

只对部分操作询问

如果还开放了只读工具,可以在回调开头自动放行它们,其余操作继续询问:

if request.name in {"read_file", "list_dir", "find_files", "grep"}:
    return bumblehive.ToolApprovalDecision.approve()

工具的可用范围由 tool_names 决定,详见工具调用。未传 approval_handler 时不会自动询问。

接入自己的界面时,把 input() 换成等待用户选择的异步函数,仍然返回同一种审批决定。完整组合见文件助手。

审批接口参考 · 文件路径与工作目录