python 之 autogen-core《三》主题与订阅
主题定义了广播消息的范围。本质上,代理运行时通过其广播 API 实现了发布-订阅模型:发布消息时必须指定主题。这是对代理 ID 的间接处理。
主题由两个部分组成:主题类型和主题来源。
Topic = (Topic Type, Topic Source)
单租户,单主题
整个应用只有一个租户和一个主题。这是最简单的场景
按代理类型分别创建订阅,这些订阅用同一种主题类型。发布时,主题类型和主题源都保持一致。
用上面的类型订阅,所有消息都用主题源“default”,主题固定是(“default”,“default”)。发往这个主题的消息,会传给所有上述类型的代理,具体送到这些代理ID:
# Type-based Subscriptions for single-tenant, single topic scenario
TypeSubscription(topic_type="default", agent_type="triage_agent")
TypeSubscription(topic_type="default", agent_type="coder_agent")
TypeSubscription(topic_type="default", agent_type="reviewer_agent")
如果具有该 ID 的代理不存在,则运行时将创建它
# The agent IDs created based on the topic source
AgentID("triage_agent", "default")
AgentID("coder_agent", "default")
AgentID("reviewer_agent", "default")
单租户,多主题
这里只有一个租户,但想让不同代理处理不同主题(就像分成一个个孤岛,各管各的)。
做法是:按代理类型分别创建订阅,每个订阅用不同的主题类型。
要是想让多个代理类型处理同一个主题,就把同一个主题类型分给它们。
发布消息时,所有消息的主题源保持一样。
# Type-based Subscriptions for single-tenant, multiple topics scenario
TypeSubscription(topic_type="triage", agent_type="triage_agent")
TypeSubscription(topic_type="coding", agent_type="coder_agent")
TypeSubscription(topic_type="coding", agent_type="reviewer_agent")
用上面的类型订阅:
发往(“triage”,“default”)主题的消息,只会传给“triage_agent”类型的代理;
发往(“coding”,“default”)主题的消息,会传给“coder_agent”和“reviewer_agent”类型的代理。
多租户
单租户时,主题源固定(比如“default”),代码里写死;多租户时,主题源要根据数据来定。
多租户的一个典型情况是:需要同一类型的多个代理实例。
比如,用不同实例处理不同用户会话,保证数据私密;
或者把繁重工作分给多个同类型实例,让它们一起处理。
处于多租户场景的一个典型迹象是,您需要同一代理类型的多个实例。
例如,您可能希望使用不同的代理实例来处理不同的用户会话,以保持私有数据隔离;
或者,您可能希望将繁重的工作负载分散到同一代理类型的多个实例上,并让它们同时处理
如果您想要有专门的代理实例来处理特定的 GitHub 问题,您需要将主题源设置为该问题的唯一标识符
例如,假设有一个基于类型的代理类型订阅 triage_agent
:
TypeSubscription(topic_type="github_issues", agent_type="triage_agent")
消息发到主题(github_issues,github.com/microsoft/autogen/issues/1),就传给ID是(triage_agent,github.com/microsoft/autogen/issues/1)的代理;
发到主题(github_issues,github.com/microsoft/autogen/issues/9),就传给ID是(triage_agent,github.com/microsoft/autogen/issues/9)的代理
请注意,代理 ID 依赖于数据,如果不存在,运行时将创建代理的新实例。
为了支持每个租户的多个主题,您可以使用不同的主题类型,就像单租户、多主题场景一样。