gogo-agent

多智能体之间的上下文传递方式

在一个多智能体项目中,多个智能体之间的参数传递肯定不是单一手段,如果是单一手段,那这个项目也没啥必要学习了。 在我们的项目中,主要用到了以下这些手段在多智能体之间传递上下文。 1. Agent as Tool(主要的编排层交接方式)…

TL;DR

在一个多智能体项目中,多个智能体之间的参数传递肯定不是单一手段,如果是单一手段,那这个项目也没啥必要学习了。 在我们的项目中,主要用到了以下这些手段在多智能体之间传递上下文。 1. Agent as Tool(主要的编排层交接方式)…

在一个多智能体项目中,多个智能体之间的参数传递肯定不是单一手段,如果是单一手段,那这个项目也没啥必要学习了。 在我们的项目中,主要用到了以下这些手段在多智能体之间传递上下文。 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
  1. 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);
  1. Hook 在 Agent 边界注入/裁剪参数。比如我们的DynamicTimeInjectionHook 在每轮推理前往消息里插入 SYSTEM 时间 Msg;再比如BookingPersistenceHook(PostActing) 读取刚执行的工具调用入参和结果,结合 AgentSessionContext 落库;还有 FlightApiKeyHook/TuniuApiKeyHook/RghUserIsolationHook 注入 per-user 密钥与隔离。 6.通过中间文件/存储传输。
上下文工程——利用中间文件减少token消耗

... LLMentor

版本提示

模型、框架与接口会持续变化。涉及版本号、参数与生产配置时,请在实践前对照对应官方文档。

LLMentor系统化学习大模型应用工程

内容来自个人课程知识库备份,并经过结构化整理。技术版本持续演进,生产使用前请结合官方文档验证。