Thema und Abonnement#
Es gibt zwei Möglichkeiten für die Laufzeitumgebung, Nachrichten zu liefern: Direktnachrichten oder Rundfunk. Direktnachrichten sind Eins-zu-eins: Der Absender muss die Agenten-ID des Empfängers angeben. Auf der anderen Seite ist Rundfunk Eins-zu-viele und der Absender gibt keine Agenten-IDs der Empfänger an.
Viele Szenarien eignen sich für den Rundfunk. Beispielsweise wissen Agenten in ereignisgesteuerten Workflows nicht immer, wer ihre Nachrichten bearbeiten wird, und ein Workflow kann aus Agenten ohne gegenseitige Abhängigkeiten bestehen. Dieser Abschnitt konzentriert sich auf die Kernkonzepte im Rundfunk: Thema und Abonnement.
Thema#
Ein Thema definiert den Geltungsbereich einer Rundfunknachricht. Im Wesentlichen implementiert die Agentenlaufzeit ein Publish-Subscribe-Modell über ihre Rundfunk-API: Beim Veröffentlichen einer Nachricht muss das Thema angegeben werden. Es ist eine Indirektion über Agenten-IDs.
Ein Thema besteht aus zwei Komponenten: Thema-Typ und Thema-Quelle.
Hinweis
Thema = (Thema-Typ, Thema-Quelle)
Ähnlich wie bei der Agenten-ID, die ebenfalls zwei Komponenten hat, wird der Thema-Typ normalerweise durch Anwendungscode definiert, um den Typ der Nachrichten zu kennzeichnen, für die das Thema bestimmt ist. Beispielsweise kann ein GitHub-Agent "GitHub_Issues" als Thema-Typ verwenden, wenn Nachrichten über neue Issues veröffentlicht werden.
Die Thema-Quelle ist die eindeutige Kennung für ein Thema innerhalb eines Thema-Typs. Sie wird typischerweise durch Anwendungsdaten definiert. Zum Beispiel kann der GitHub-Agent "github.com/{repo_name}/issues/{issue_number}" als Thema-Quelle verwenden, um das Thema eindeutig zu identifizieren. Die Thema-Quelle ermöglicht es dem Herausgeber, den Geltungsbereich von Nachrichten zu begrenzen und Silos zu erstellen.
Thema-IDs können in Zeichenfolgen umgewandelt und daraus konvertiert werden. Das Format dieser Zeichenfolge ist
Hinweis
Themen_Typ/Themen_Quelle
Typen gelten als gültig, wenn sie in UTF8 vorliegen und nur alphanumerische Buchstaben (a-z) und (0-9) oder Unterstriche (_) enthalten. Ein gültiger Bezeichner darf nicht mit einer Zahl beginnen oder Leerzeichen enthalten. Quellen gelten als gültig, wenn sie in UTF8 vorliegen und nur Zeichen zwischen (einschließlich) ASCII 32 (Leerzeichen) und 126 (~) enthalten.
Abonnement#
Ein Abonnement ordnet Themen Agenten-IDs zu.
Das obige Diagramm zeigt die Beziehung zwischen Thema und Abonnement. Eine Agentenlaufzeitumgebung verfolgt die Abonnements und verwendet sie, um Nachrichten an Agenten zu liefern.
Wenn ein Thema kein Abonnement hat, werden Nachrichten, die für dieses Thema veröffentlicht werden, an keinen Agenten geliefert. Wenn ein Thema viele Abonnements hat, werden Nachrichten allen Abonnements folgend nur einmal an jeden Empfängeragenten geliefert. Anwendungen können mithilfe der API der Agentenlaufzeitumgebung Abonnements hinzufügen oder entfernen.
Typenbasierte Abonnements#
Ein typenbasiertes Abonnement ordnet einen Thema-Typ einem Agenten-Typ zu (siehe Agenten-ID). Es deklariert eine unbegrenzte Zuordnung von Themen zu Agenten-IDs, ohne die genauen Thema-Quellen und Agenten-Schlüssel zu kennen. Der Mechanismus ist einfach: Jedes Thema, das dem Thema-Typ des typenbasierten Abonnements entspricht, wird einer Agenten-ID mit dem Agenten-Typ des Abonnements und dem Agenten-Schlüssel, der dem Wert der Thema-Quelle zugewiesen ist, zugeordnet. Für die Python-API verwenden Sie TypeSubscription.
Hinweis
Typenbasierte Abonnements = Thema-Typ –> Agenten-Typ
Im Allgemeinen ist das typenbasierte Abonnement die bevorzugte Methode zur Deklaration von Abonnements. Es ist portabel und datenunabhängig: Entwickler müssen keinen Anwendungscode schreiben, der von spezifischen Agenten-IDs abhängt.
Szenarien für typenbasierte Abonnements#
Typenbasierte Abonnements können in vielen Szenarien angewendet werden, wenn die genauen Thema- oder Agenten-IDs datenabhängig sind. Die Szenarien können nach zwei Überlegungen aufgeteilt werden: (1) ob es sich um Single-Tenant oder Multi-Tenant handelt und (2) ob es sich um ein einzelnes Thema oder mehrere Themen pro Tenant handelt. Ein Tenant bezieht sich typischerweise auf eine Gruppe von Agenten, die eine bestimmte Benutzersitzung oder eine bestimmte Anfrage bearbeiten.
Single-Tenant, Einzelnes Thema#
In diesem Szenario gibt es nur einen Tenant und ein Thema für die gesamte Anwendung. Es ist das einfachste Szenario und kann in vielen Fällen wie einem Befehlszeilentool oder einer Einzelbenutzeranwendung verwendet werden.
Um ein typenbasiertes Abonnement für dieses Szenario anzuwenden, erstellen Sie ein typenbasiertes Abonnement für jeden Agenten-Typ und verwenden Sie denselben Thema-Typ für alle typenbasierten Abonnements. Wenn Sie veröffentlichen, verwenden Sie immer dasselbe Thema, d. h. denselben Thema-Typ und dieselbe Thema-Quelle.
Angenommen, es gibt drei Agenten-Typen: "triage_agent", "coder_agent" und "reviewer_agent", und der Thema-Typ ist "default", erstellen Sie die folgenden typenbasierten Abonnements
# 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")
Mit den obigen typenbasierten Abonnements verwenden Sie dieselbe Thema-Quelle "default" für alle Nachrichten. Das Thema ist also immer ("default", "default"). Eine Nachricht, die für dieses Thema veröffentlicht wird, wird an alle Agenten aller oben genannten Typen geliefert. Insbesondere wird die Nachricht an die folgenden Agenten-IDs gesendet
# The agent IDs created based on the topic source
AgentID("triage_agent", "default")
AgentID("coder_agent", "default")
AgentID("reviewer_agent", "default")
Die folgende Abbildung zeigt, wie typenbasierte Abonnements in diesem Beispiel funktionieren.
Wenn der Agent mit der ID nicht existiert, wird er von der Laufzeitumgebung erstellt.
Single-Tenant, Mehrere Themen#
In diesem Szenario gibt es nur einen Tenant, aber Sie möchten steuern, welcher Agent welches Thema bearbeitet. Dies ist nützlich, wenn Sie Silos erstellen möchten und unterschiedliche Agenten haben, die sich auf die Bearbeitung verschiedener Themen spezialisiert haben.
Um ein typenbasiertes Abonnement für dieses Szenario anzuwenden, erstellen Sie ein typenbasiertes Abonnement für jeden Agenten-Typ, aber mit unterschiedlichen Thema-Typen. Sie können denselben Thema-Typ mehreren Agenten-Typen zuordnen, wenn diese Agenten-Typen ein gemeinsames Thema teilen sollen. Für die Thema-Quelle verwenden Sie beim Veröffentlichen immer noch denselben Wert für alle Nachrichten.
Wenn wir das obige Beispiel mit denselben Agenten-Typen fortsetzen, erstellen wir die folgenden typenbasierten Abonnements
# 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")
Mit den obigen typenbasierten Abonnements wird jede Nachricht, die für das Thema ("triage", "default") veröffentlicht wird, an den Agenten mit dem Typ "triage_agent" geliefert, und jede Nachricht, die für das Thema ("coding", "default") veröffentlicht wird, wird an die Agenten mit den Typen "coder_agent" und "reviewer_agent" geliefert.
Die folgende Abbildung zeigt, wie typenbasierte Abonnements in diesem Beispiel funktionieren.
Multi-Tenant-Szenarien#
In Single-Tenant-Szenarien ist die Thema-Quelle immer dieselbe (z. B. "default") – sie ist fest im Anwendungscode verankert. Wenn man zu Multi-Tenant-Szenarien übergeht, wird die Thema-Quelle datenabhängig.
Hinweis
Ein gutes Indiz dafür, dass Sie sich in einem Multi-Tenant-Szenario befinden, ist, dass Sie mehrere Instanzen desselben Agenten-Typs benötigen. Zum Beispiel möchten Sie möglicherweise unterschiedliche Agenteninstanzen haben, um verschiedene Benutzersitzungen zu bearbeiten, um private Daten zu isolieren, oder Sie möchten eine hohe Arbeitslast auf mehrere Instanzen desselben Agenten-Typs verteilen und sie gleichzeitig daran arbeiten lassen.
Wenn wir das obige Beispiel fortsetzen und dedizierte Instanzen von Agenten benötigen, um ein bestimmtes GitHub-Issue zu bearbeiten, müssen Sie die Thema-Quelle als eindeutige Kennung für das Issue festlegen.
Zum Beispiel gibt es eine typenbasierte Zuordnung für den Agententyp "triage_agent"
TypeSubscription(topic_type="github_issues", agent_type="triage_agent")
Wenn eine Nachricht für das Thema ("github_issues", "github.com/microsoft/autogen/issues/1") veröffentlicht wird, liefert die Laufzeitumgebung die Nachricht an den Agenten mit der ID ("triage_agent", "github.com/microsoft/autogen/issues/1"). Wenn eine Nachricht für das Thema ("github_issues", "github.com/microsoft/autogen/issues/9") veröffentlicht wird, liefert die Laufzeitumgebung die Nachricht an den Agenten mit der ID ("triage_agent", "github.com/microsoft/autogen/issues/9").
Die folgende Abbildung zeigt, wie typenbasierte Abonnements in diesem Beispiel funktionieren.
Beachten Sie, dass die Agenten-ID datenabhängig ist und die Laufzeitumgebung eine neue Instanz des Agenten erstellt, falls diese nicht existiert.
Um mehrere Themen pro Tenant zu unterstützen, können Sie unterschiedliche Thema-Typen verwenden, genau wie im Szenario "Single-Tenant, mehrere Themen".