Observação
O acesso a essa página exige autorização. Você pode tentar entrar ou alterar diretórios.
O acesso a essa página exige autorização. Você pode tentar alterar os diretórios.
AgentSession é o contêiner de estado de conversa usado em rodadas de execução do agente.
O que AgentSession contém
| Campo | Propósito |
|---|---|
StateBag |
Contêiner de estado arbitrário para esta sessão |
O C# AgentSession é uma classe base abstrata. Implementações concretas (criadas via CreateSessionAsync()) podem adicionar um estado adicional, por exemplo, uma ID para armazenamento de histórico de chat remoto, quando o histórico gerenciado pelo serviço é usado.
| Campo | Propósito |
|---|---|
session_id |
Identificador exclusivo local para esta sessão |
service_session_id |
Identificador de sessão de serviço remoto, como uma ID de conversa ou resposta, quando o histórico gerenciado pelo serviço é usado |
state |
Dicionário mutável compartilhado com provedores de contexto/histórico |
| Campo | Propósito |
|---|---|
agent.Session |
Contêiner de estado chave-valor vinculado a uma conversa |
As sessões fornecem armazenamento de chave-valor tipado:
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")
Escopo do ID da sessão do serviço
Quando o histórico gerenciado pelo serviço é usado, uma sessão pode conter um identificador de sessão emitido pelo serviço. Por exemplo, o OpenAI Responses pode usar um ID de resposta resp_* como previous_response_id, e a API OpenAI Conversations pode usar um ID de conversa conv_* como a conversa.
Por padrão, a OpenAI restringe esses IDs à chave de API ou ao projeto associado. Isso geralmente é suficiente quando essa chave ou projeto já corresponde ao limite do aplicativo, como um aplicativo de usuário único ou uma chave/projeto separado por locatário. O padrão de hospedagem arriscado consiste em usar uma chave ou projeto de suporte para vários usuários finais, ecoando IDs brutos do lado do serviço para os clientes e aceitando esses IDs de volta sem verificar a propriedade. Em aplicativos hospedados ou multiusuários que reutilizam uma chave de backup ou projeto, não tratam service_session_id, previous_response_idou conversation/conversation_id como limites de autorização do usuário final. Armazene IDs do lado do serviço no armazenamento confiável do aplicativo, mapeie IDs de sessão visíveis para o cliente para esses IDs do lado do serviço e verifique o usuário ou locatário autenticado antes de retomar uma conversa.
Padrão de uso interno
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()
Criando uma sessão a partir de uma ID de conversa de serviço existente
Criar uma nova sessão de uma ID de conversa existente varia de acordo com o tipo de agente. Aqui estão alguns exemplos.
Ao usar ChatClientAgent
AgentSession session = await chatClientAgent.CreateSessionAsync(conversationId);
Ao usar um A2AAgent
AgentSession session = await a2aAgent.CreateSessionAsync(contextId, taskId);
Use isso quando o serviço de suporte já tiver o estado da conversa.
session = agent.get_session(service_session_id="<service-conversation-id>")
response = await agent.run("Continue this conversation.", session=session)
Em aplicativos hospedados, resolva <service-conversation-id> do armazenamento pertencente ao aplicativo após verificar o usuário ou locatário atual. Evite aceitar IDs brutos do lado do serviço de um cliente, a menos que você primeiro verifique se o chamador é o proprietário da conversa.
Serialização e restauração
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()
Dica
Consulte o exemplo de conversa persistente para obter um exemplo completo.
Importante
As sessões são específicas para o agente/serviço. Reutilização de uma sessão com uma configuração ou provedor de agente diferente pode levar a um contexto inválido. Se a sessão serializada contiver uma ID de sessão do lado do serviço, restaure-a apenas para o usuário ou locatário do aplicativo que possui essa ID.