Context.tool_loop_agent() 内部构造 ProviderRequest 时没有传 extra_user_content_parts,插件通过这个入口起子代理时,没有地方放「不该写进对话历史」的内容。
补一个参数透传即可,ToolLoopAgentRunner 本身是支持的:
async def tool_loop_agent(
self,
*,
...
extra_user_content_parts: list[ContentPart] | None = None, # 新增
...
) -> LLMResponse:
...
request = ProviderRequest(
...
extra_user_content_parts=extra_user_content_parts or [], # 新增
)
为什么需要
插件用 tool_loop_agent() 起子代理时,常要带一些「每轮现算、但不该沉淀进历史」的东西,比如时间、检索回来的线索、临时状态。现在三条路都不好走:
- 拼进
prompt:跟用户消息混成一条,还会被写进历史,下一轮又当上下文读回来
- 拼进
system_prompt:归属清楚,但 system 每轮变会让前缀缓存失效,长会话开销明显上升
- 自己写一套 tool loop:成本远超收益,上游一改行为就漂
extra_user_content_parts 就是干这个的——mark_as_temp() 让它不落历史,跟 user message 也分得开。主流程 astr_main_agent.py 已经用得不少,子代理这条路缺的只是一个入口。
#10134 给插件和子代理的 tool loop 补了系统层指导,说明「tool loop 需要额外上下文」这个需求是成立的。只是那份内容固定,放 system_prompt 就够;每轮都变的得另走一条。
版本
v4.27.4。当前 master 上同样如此,git log -S "extra_user_content_parts" -- astrbot/core/star/context.py 结果为空。
检查清单
Context.tool_loop_agent()内部构造ProviderRequest时没有传extra_user_content_parts,插件通过这个入口起子代理时,没有地方放「不该写进对话历史」的内容。补一个参数透传即可,
ToolLoopAgentRunner本身是支持的:为什么需要
插件用
tool_loop_agent()起子代理时,常要带一些「每轮现算、但不该沉淀进历史」的东西,比如时间、检索回来的线索、临时状态。现在三条路都不好走:prompt:跟用户消息混成一条,还会被写进历史,下一轮又当上下文读回来system_prompt:归属清楚,但 system 每轮变会让前缀缓存失效,长会话开销明显上升extra_user_content_parts就是干这个的——mark_as_temp()让它不落历史,跟 user message 也分得开。主流程astr_main_agent.py已经用得不少,子代理这条路缺的只是一个入口。#10134给插件和子代理的 tool loop 补了系统层指导,说明「tool loop 需要额外上下文」这个需求是成立的。只是那份内容固定,放system_prompt就够;每轮都变的得另走一条。版本
v4.27.4。当前 master 上同样如此,
git log -S "extra_user_content_parts" -- astrbot/core/star/context.py结果为空。检查清单
tool_loop_agent的结果无此诉求)