在一个多智能体项目中,多个智能体之间的参数传递肯定不是单一手段,如果是单一手段,那这个项目也没啥必要学习了。 在我们的项目中,主要用到了以下这些手段在多智能体之间传递上下文。 1. Agent-as-Tool(主要的编排层交接方式) MasterAgent 把每个子 Agent 用 SubAgentProvider + SubAgentConfig 注册成 Toolkit 里的工具,跨边界的数据就是一次工具调用的 JSON {message, session_id}。注意这里不传 POJO,父 Agent 的 LLM 把意图序列化成自然语言 message 字符串传下去。
// MasterAgent.java:87
toolkit.registration()
.subAgent((SubAgentProvider<ReActAgent>) () -> context.getBean("itineraryManageAgent", ReActAgent.class),
SubAgentConfig.builder()
.toolName("itinerary_manage_agent")
.description("...参数:message(任务描述),可选 session_id(继续会话)。")
.forwardEvents(false).build())
.apply();
ItineraryPlanAgent 又用同样方式把 ItineraryReviewAgent 注册为工具(ItineraryPlanAgent.java:92),形成嵌套的 agent-as-tool。 2. 共享可变的会话对象 AgentSessionContext 一个请求内所有 Agent/Tool 共享同一个 AgentSessionContext(含 travelPolicy/travelPreference/travelOrderId 等可变字段),通过 TransmittableThreadLocal 自动向 Reactor 的 boundedElastic 线程传播,并经 ToolExecutionContext 注入到工具。
✅使用TTL实现多智能体之间的上下文传递
在我们的项目中,有一些参数,需要全局传递,比如userId,从用户一进来就确定了,我们需要在多个智能体之间传递、并且在tools、hook中也可能需要用到,那么如何实现这个参数的传递呢。 gogo-agent 用 Transmittable LLMentor
// BaseSubAgent.java:128 / MasterAgent.java:78
ToolExecutionContext.builder().register(sessionCtx).build()
比我们项目中:TravelOrderWriteTools 写入 travelOrderId,之后 BookingAgent 的 BookingPersistenceHook.java:169 再读出来关联预订记录。工具方法里声明一个无注解的 AgentSessionContext 参数,框架就自动注入,对 LLM 透明。 3. Redis 共享存储 ItineraryPlanStore(大 payload 的 producer→consumer 交接) 为避免庞大方案 JSON 挤爆上下文,Planner 把结果写到 Redis(key planner:result:{userId},24h TTL),Review Agent 再读回来。两个 Agent 靠同一个 userId(来自机制 2)在同一个 key 上会合。
itineraryPlanStore.save(userId, resultJson); // ItineraryPlannerTool.java:180
content = itineraryPlanStore.load(userId); // ItineraryReviewTools.java:87
- Msg 列表 + SYSTEM 消息注入(Pipeline → Agent) AgentPipelineService 把上游结果(改写后的问题 + 意图 JSON)作为额外的 SYSTEM Msg 拼在用户消息前面,再 agent.call(List
)。.call(List ) 本身就是最底层的 Agent 间传递动词。
// AgentPipelineService.buildMasterInput 366-385
messages.add(rewriteContext); // "问题改写结果:..."
messages.add(intentContext); // "意图识别结果:..."
messages.addAll(originalMessages);
- Hook 在 Agent 边界注入/裁剪参数。比如我们的DynamicTimeInjectionHook 在每轮推理前往消息里插入 SYSTEM 时间 Msg;再比如BookingPersistenceHook(PostActing) 读取刚执行的工具调用入参和结果,结合 AgentSessionContext 落库;还有 FlightApiKeyHook/TuniuApiKeyHook/RghUserIsolationHook 注入 per-user 密钥与隔离。 6.通过中间文件/存储传输。
上下文工程——利用中间文件减少token消耗
... LLMentor