Sitzung

AgentSession ist der Unterhaltungszustandscontainer, der über Agentendurchläufe hinweg verwendet wird.

Was AgentSession enthält

Feld Purpose
StateBag Beliebiger Statuscontainer für diese Sitzung

C# AgentSession ist eine abstrakte Basisklasse. Konkrete Implementierungen (erstellt über CreateSessionAsync()) können zusätzlichen Zustand hinzufügen, z. B. eine ID für den Speicher des Remotechatverlaufs, wenn der vom Dienst verwaltete Verlauf verwendet wird.

Feld Purpose
session_id Lokaler eindeutiger Bezeichner für diese Sitzung
service_session_id Kennung einer Remote-Dienstsitzung, z. B. eine Konversations- oder Antwort-ID, wenn ein dienstseitig verwalteter Verlauf verwendet wird
state Für Kontext-/Verlaufsanbieter freigegebenes änderbares Wörterbuch
Feld Purpose
agent.Session Schlüsselwertstatuscontainer, der an eine Unterhaltung gebunden ist

Sitzungen bieten typgesteuerten Schlüsselwertspeicher:

type UserPrefs struct {
    Theme    string `json:"theme"`
    Language string `json:"language"`
}

session.Set("user_prefs", UserPrefs{Theme: "dark", Language: "en"})

var prefs UserPrefs
session.Get("user_prefs", &prefs)

session.Delete("user_prefs")

Gültigkeitsbereich der Dienst-Sitzungs-ID

Wenn der vom Dienst verwaltete Verlauf verwendet wird, kann eine Sitzung einen vom Dienst ausgestellten Sitzungsbezeichner enthalten. OpenAI Responses können beispielsweise eine resp_* Response-ID als previous_response_id verwenden, und die OpenAI Conversations API kann eine conv_* Konversations-ID als Konversation verwenden.

OpenAI ordnet diese IDs standardmäßig dem zugrunde liegenden API-Schlüssel oder dem Projekt zu. Dies reicht normalerweise aus, wenn dieser Schlüssel oder Projekt bereits der Anwendungsgrenze entspricht, z. B. einer Einzelbenutzer-App oder einem separaten Schlüssel/Projekt pro Mandant. Das riskobehaftete Hosting-Muster verwendet einen gemeinsamen zugrunde liegenden Schlüssel oder ein Projekt für mehrere Endnutzer, gibt unveränderte serverseitige IDs an Clients zurück und nimmt diese IDs anschließend wieder entgegen, ohne ihre Zugehörigkeit zu prüfen. In gehosteten Apps oder Apps mit mehreren Benutzern, die einen zugrunde liegenden Schlüssel oder ein Projekt wiederverwenden, sollten service_session_id, previous_response_id oder conversation/conversation_id nicht als Autorisierungsgrenzen für Endbenutzer behandelt werden. Speichern Sie serverseitige IDs im vertrauenswürdigen Anwendungsspeicher, ordnen Sie für den Client sichtbare Sitzungs-IDs diesen serverseitigen IDs zu und überprüfen Sie den authentifizierten Benutzer oder Mandanten, bevor Sie eine Konversation wiederaufnehmen.

Integriertes Verwendungsmuster

AgentSession session = await agent.CreateSessionAsync();

var first = await agent.RunAsync("My name is Alice.", session);
var second = await agent.RunAsync("What is my name?", session);
session = agent.create_session()

first = await agent.run("My name is Alice.", session=session)
second = await agent.run("What is my name?", session=session)
session, err := a.CreateSession(ctx)
if err != nil {
    panic(err)
}

resp, _ := a.RunText(ctx, "Hello!", agent.WithSession(session)).Collect()
resp, _ = a.RunText(ctx, "Follow-up question.", agent.WithSession(session)).Collect()

Verwenden von Sitzungen mit dem Nutzungs-Agent

Der Nutzungs-Agent verwendet den oben AgentSession beschriebenen Lebenszyklus. Verwenden Sie eine Sitzung wiederverwenden, sodass chatverlaufs- und sitzungsgestützte Funktionen wie Todos, Betriebsmodus, Dateispeicher, Toolgenehmigungen und Hintergrundaufgabenstatus verbunden bleiben. Serialisieren Sie die Sitzung, wenn dieser Zustand einen Prozessneustart überleben muss.

Der Standardwert von HarnessAgent ist InMemoryChatHistoryProvider. Ersetzen Sie ihn über den Zeitpunkt, an HarnessAgentOptions.ChatHistoryProvider dem der Verlauf einen anderen Speicher verwenden muss. AsHarnessAgent(options) ist Kurzhand für die Konstruktion new HarnessAgent(chatClient, options).

HarnessAgent agent = chatClient.AsHarnessAgent();
AgentSession session = await agent.CreateSessionAsync();

await agent.RunAsync("Plan the migration.", session);
await agent.RunAsync("Continue with the next step.", session);

var serialized = await agent.SerializeSessionAsync(session);
AgentSession resumed = await agent.DeserializeSessionAsync(serialized);

Die Nutzungsfunktion behält den lokalen Chatverlauf nach jedem Modellaufruf in einer Toolanrufschleife bei, nicht nur nach der Ausführung des äußeren Agents. Übergeben Sie die gleiche Sitzung weiter, um den In-Loop-Verlauf und den Status der Standardkontextanbieter beizubehalten.

create_harness_agent history_provider standardmäßig auf InMemoryHistoryProvider(). Übergeben Sie einen benutzerdefinierten HistoryProviderhistory_provider= Durchlauf, wenn der Verlauf einen anderen Speicher verwenden muss.

agent = create_harness_agent(client)
session = agent.create_session()

await agent.run("Plan the migration.", session=session)
await agent.run("Continue with the next step.", session=session)

serialized = session.to_dict()
resumed = AgentSession.from_dict(serialized)

Die Verwendung erfordert persistenz pro Dienstaufrufverlauf, sodass der konfigurierte Verlaufsanbieter jeden Modellaufruf in einer Toolschleife speichert. Eine Sitzung ist auch von der standardmäßigen Middleware für die Toolgenehmigung erforderlich. sie wiederzuverwenden und wiederherzustellen, um den Genehmigungs- und Kontextanbieterstatus beizubehalten.

Der Nutzungs-Agent ist derzeit nicht im Go SDK verfügbar. Verwenden Sie das oben gezeigte normale Sitzungsmuster.

Erstellen einer Sitzung aus einer vorhandenen Service-Gesprächs-ID

Erstellen einer neuen Sitzung aus einer vorhandenen Unterhaltungs-ID variiert je nach Agenttyp. Im Folgenden finden Sie einige Beispiele hierfür.

Bei der Verwendung von ChatClientAgent

AgentSession session = await chatClientAgent.CreateSessionAsync(conversationId);

Bei Verwendung einer A2AAgent

AgentSession session = await a2aAgent.CreateSessionAsync(contextId, taskId);

Verwenden Sie dies, wenn der unterstützende Dienst bereits über einen Gesprächszustand verfügt.

session = agent.get_session(service_session_id="<service-conversation-id>")
response = await agent.run("Continue this conversation.", session=session)

Lösen Sie in gehosteten Apps <service-conversation-id> im anwendungseigenen Speicher auf, nachdem der aktuelle Benutzer oder Mandant überprüft wurde. Akzeptieren Sie keine rohen serverseitigen IDs von einem Client, es sei denn, Sie verifizieren zuvor, dass dem Aufrufer die Konversation gehört.

Serialisierung und Wiederherstellung

var serialized = agent.SerializeSession(session);
AgentSession resumed = await agent.DeserializeSessionAsync(serialized);
serialized = session.to_dict()
resumed = AgentSession.from_dict(serialized)
data, err := json.Marshal(session)
if err != nil {
    panic(err)
}

// Save to disk, database, etc.
if err := os.WriteFile("session.json", data, 0o644); err != nil {
    panic(err)
}

// Later, restore the session.
loaded, err := os.ReadFile("session.json")
if err != nil {
    panic(err)
}

var resumedSession agent.Session
if err := json.Unmarshal(loaded, &resumedSession); err != nil {
    panic(err)
}

resp, _ := a.RunText(ctx, "Continue from where we left off.", agent.WithSession(&resumedSession)).Collect()

Tip

Siehe das Beispiel für eine persistente Unterhaltung für ein vollständiges Beispiel.

Important

Sitzungen sind agent-/dienstspezifisch. Das Erneute Verwenden einer Sitzung mit einer anderen Agentkonfiguration oder einem anderen Anbieter kann zu ungültigem Kontext führen. Wenn die serialisierte Sitzung eine dienstseitige Sitzungs-ID enthält, stellen Sie sie nur für den Anwendungsbenutzer oder Mandanten wieder her, der diese ID besitzt.

Nächste Schritte