引导与纠偏¶
用户在 Agent 工作期间补充要求,例如“改用中文回答”,可以通过 steer() 交给当前任务,不必重新开始。
运行中补充要求¶
下面的例子在 Agent 开始查询课程时追加要求,模拟应用收到用户输入。
完成模型配置,运行 python examples/runtime/steering_run.py:
import asyncio
import os
import bumblehive
from bumblehive.observability import TOOL_CALL_STARTED, AgentEvent
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"],
agent_instructions="回答课程问题前,先调用 get_course_info 查询,不要猜测。",
skill_names=[],
tool_names=["get_course_info"],
)
async with bumblehive.from_config(config) as runtime:
@runtime.tools.tool(description="查询 Python 入门课的时间和地点。")
def get_course_info() -> str:
info = "Python 入门:周一 10:00,教学楼 A101。"
print("工具结果:", info)
return info
steered = False
def on_event(event: AgentEvent) -> None:
nonlocal steered
if event.kind == TOOL_CALL_STARTED and not steered:
steered = True
print("模型开始调用工具,追加引导。")
# 工具继续执行;引导会追加在工具结果之后。
run.steer("改用中文,只说两句话。")
run = runtime.run(
"查询 Python 入门课的时间和地点,用英文回答。", hooks=on_event
)
result = await run
if result.error is not None:
print(f"运行失败:{result.error.message}")
else:
print("最终回答:", result.final_content)
if __name__ == "__main__":
asyncio.run(main())
run = runtime.run(...)保存本次运行对象。run.steer(...)把新要求送入当前运行。- 例子用工具开始事件触发输入,便于直接观察效果;实际应用可以在用户提交消息时调用同一方法。
运行效果¶
模型开始调用工具,追加引导。
工具结果:Python 入门:周一 10:00,教学楼 A101。
最终回答:…改用中文回答课程时间和地点…
追加要求不会中断正在执行的模型请求或工具。它会在下一次请求模型前加入对话;工具调用期间收到的要求会放在这批工具结果之后。
接入用户输入¶
在已经创建的 runtime 中,可以让任务运行的同时接收界面消息:
run = runtime.run("分析项目")
task = asyncio.create_task(run)
# 接到用户输入后,在同一事件循环中调用:
run.steer("重点看安装和启动步骤。")
result = await task
流式输出使用 stream.steer(text),用法相同,见流式引导示例。
运行已经结束时,steer() 会抛出 RuntimeError。这时用同一份会话历史开始下一轮。后台工具提供了完整的结果回传示例;运行对象的细节见 API 参考。