Definir um agente é apenas a etapa de configuração. Para entender como ele funciona em tempo de execução, é preciso saber o que acontece em cada execução, como a conversa continua no turno seguinte e como o fluxo se comporta quando precisa aguardar uma aprovação ou a conclusão de uma chamada de ferramenta.
O ciclo do agente
Cada execução do SDK corresponde a um turno do aplicativo. O executor repete o ciclo até encontrar uma condição de parada.
- Chama o modelo do agente atual com os dados de entrada já preparados.
- Examina a saída do modelo.
- Se o modelo gerou chamadas de ferramentas, executa as chamadas e continua o ciclo.
- Se o modelo transferiu o controle para outro especialista, troca de agente e continua o ciclo.
- Se o modelo gerou uma resposta final e não há mais chamadas de ferramentas a executar, retorna um resultado.
Esse ciclo é o conceito central do SDK. É nele que se baseiam as ferramentas, as transferências entre agentes, as aprovações e a transmissão de eventos.
Escolha uma estratégia para a conversa
Há quatro formas comuns de levar o estado da conversa para o turno seguinte.
| Estratégia | Onde o estado é mantido | Quando usar | O que passar no turno seguinte |
|---|---|---|---|
result.history |
No seu aplicativo | Em ciclos de chat simples ou quando você precisa de controle máximo | O histórico pronto para ser reenviado |
session |
No seu armazenamento, com o SDK | Para manter o estado do chat entre turnos, retomar execuções e controlar o armazenamento | A mesma sessão |
conversationId |
Na API Conversations da OpenAI | Para compartilhar o estado gerenciado pelo servidor entre processos de trabalho ou serviços | O mesmo ID da conversa e apenas o novo turno |
previousResponseId |
Na API Responses da OpenAI | Para continuar de uma resposta para a seguinte com o mínimo de sobrecarga e deixar o servidor gerenciar o estado | O ID da última resposta e apenas o novo turno |
Na maioria dos aplicativos, escolha uma estratégia por conversa. Reenviar o histórico local e usar o estado gerenciado pelo servidor pode duplicar o contexto, a menos que você concilie explicitamente as duas camadas.
import { Agent, MemorySession, run } from "@openai/agents";
const agent = new Agent({
name: "Tour guide",
instructions: "Answer with compact travel facts.",
});
const session = new MemorySession();
const firstTurn = await run(agent, "What city is the Golden Gate Bridge in?", {
session,
});
console.log(firstTurn.finalOutput);
const secondTurn = await run(agent, "What state is it in?", { session });
console.log(secondTurn.finalOutput);As sessões são a melhor opção por padrão quando você precisa de memória persistente, de fluxos de aprovação que possam ser retomados ou de armazenamento controlado pelo seu aplicativo.
import { Agent, run } from "@openai/agents";
import OpenAI from "openai";
const agent = new Agent({
name: "Assistant",
instructions: "Reply very concisely.",
});
const client = new OpenAI();
const { id: conversationId } = await client.conversations.create({});
const first = await run(agent, "What city is the Golden Gate Bridge in?", {
conversationId,
});
console.log(first.finalOutput);
const second = await run(agent, "What state is it in?", {
conversationId,
});
console.log(second.finalOutput);Use conversationId quando vários sistemas precisarem compartilhar uma conversa identificada por nome. Use previousResponseId
Receba eventos à medida que a execução avança
A transmissão de eventos usa o mesmo ciclo do agente e as mesmas estratégias de estado. A única diferença é que você consome os eventos enquanto a execução ainda está em andamento.
import { Agent, run } from "@openai/agents";
const agent = new Agent({
name: "Planet guide",
instructions: "Answer with short facts.",
});
const stream = await run(agent, "Give me three short facts about Saturn.", {
stream: true,
});
for await (const event of stream) {
if (
event.type === "raw_model_stream_event" &&
event.data.type === "output_text_delta"
) {
process.stdout.write(event.data.delta);
}
}
await stream.completed;
console.log("\nFinal:", stream.finalOutput);Siga estas três regras na prática.
- Aguarde o fim da transmissão antes de considerar a execução encerrada.
- Se a execução pausar para aprovação, resolva as interrupções em
interruptionse retome a execução a partir destate, sem iniciar um novo turno do usuário. - Se você cancelar a transmissão no meio de um turno e quiser continuá-lo depois, retome o turno inacabado a partir de
state.
Diferencie pausas e falhas
Duas situações merecem atenção quando a execução sai do fluxo normal.
- Falhas de execução ou validação, por exemplo, quando a execução atinge o limite de turnos, uma regra de proteção gera uma exceção ou uma ferramenta retorna um erro.
- Pausas esperadas, como pedidos de aprovação humana, em que a execução é interrompida de propósito e deve ser retomada depois a partir do mesmo estado.
Ao processar uma aprovação, retome a execução pausada em vez de iniciar um novo turno. Assim, a contagem de turnos, o histórico e os IDs de continuação gerenciados pelo servidor permanecem consistentes.
Próximos passos
Depois de entender o ciclo de execução, escolha o guia que trata da próxima parte do fluxo que você precisa definir.
Saiba quais dados do resultado seu aplicativo deve levar para o turno seguinte.
Defina como vários especialistas atuam no mesmo ciclo de execução.
Adicione validações e pausas para aprovação sem interromper a continuidade do turno.