A orientação durante o turno permite que os usuários adicionem requisitos ou mudem de direção sem esperar que uma resposta termine.
A orientação durante o turno está disponível com o GPT-6 Astra (gpt-6-astra) por meio de uma
conexão WebSocket com a Responses API. O GPT-5.6 e os modelos anteriores não
oferecem suporte à orientação durante o turno.
A orientação durante o turno não reescreve saídas já enviadas ao seu aplicativo, não desfaz ações anteriores nem cancela ferramentas cuja execução já começou.
Para saber como configurar a conexão e entender o comportamento geral do transporte, consulte Modo WebSocket. Para as definições exatas dos eventos, consulte a referência de eventos WebSocket da Responses API.
Envie uma mensagem de orientação
Inicie uma resposta com response.create. Depois de receber o evento response.created dessa resposta, envie response.steer pela mesma conexão, usando o ID da resposta como previous_response_id:
{
"type": "response.steer",
"previous_response_id": "resp_1",
"input": "Keep the scope small enough for one developer to finish in two weeks."
}
O evento aceita apenas type, previous_response_id e input. Defina input como uma string ou um array não vazio de mensagens do usuário com tipos de conteúdo compatíveis.
A API confirma a inclusão da entrada na fila com response.steer.accepted:
{
"type": "response.steer.accepted",
"sequence_number": 4,
"steer": {
"id": "steer_0123456789abcdef0123456789abcdef",
"previous_response_id": "resp_1"
}
}
A aceitação significa que a entrada está na fila, não que o modelo já agiu com base nela. A API cria automaticamente uma nova resposta com sua atualização, a menos que precise de um resultado de ferramenta ou aprovação do seu aplicativo.
Antes de criar essa continuação automática, o servidor conclui o item de saída atual e qualquer trabalho de ferramenta hospedada que já esteja em execução. Continue lendo os eventos para receber a resposta com sua atualização; não envie outro response.create.
Se a orientação interromper a resposta original, ela termina com response.incomplete e incomplete_details.reason: "steered". Se a resposta original terminar normalmente antes disso, ela mantém o status de concluída e ainda pode ter uma continuação com a orientação.
As continuações automáticas herdam as configurações da solicitação original. Os limites de tokens e de chamadas de ferramentas se aplicam separadamente a cada resposta.
Execute um exemplo completo
O SDK do .NET não oferece um cliente WebSocket para Responses, por isso não há uma versão deste exemplo com o SDK de C#.
import asyncio
from openai import AsyncOpenAI
async def main():
client = AsyncOpenAI()
initial_response_id = None
successor_response_id = None
async with client.responses.connect() as connection, asyncio.timeout(120):
await connection.response.create(
model="gpt-6-astra",
reasoning={"effort": "medium"},
input="Draft a project plan for building a task-tracking app.",
)
async for event in connection:
if event.type == "response.created":
if initial_response_id is None:
initial_response_id = event.response.id
# Simulate a user adding instructions while the response runs.
await connection.response.steer(
previous_response_id=initial_response_id,
input="Keep the scope small enough for one developer to finish in two weeks.",
)
else:
successor_response_id = event.response.id
elif event.type in {"response.steer.failed", "response.failed", "error"}:
raise RuntimeError(event.to_json())
elif event.type == "response.incomplete":
response = event.response
if (
response.id != initial_response_id
or response.incomplete_details is None
or response.incomplete_details.reason != "steered"
):
raise RuntimeError(event.to_json())
elif (
event.type == "response.completed"
and event.response.id == successor_response_id
):
print(event.response.output_text)
return
# Acceptance only queues the input. Keep reading past the first response.
raise RuntimeError("Connection closed before the steered response finished.")
asyncio.run(main())O exemplo envia a atualização após o primeiro evento response.created. No seu aplicativo, envie-a quando um usuário fornecer uma atualização. Use o ID da continuação para enviar novas orientações assim que o evento response.created dela chegar.
Retorne resultados de ferramentas ou aprovação
Se a resposta precisar de um resultado de ferramenta do cliente ou de aprovação, a API mantém a orientação na fila. Continue seu fluxo normal de ferramentas ou aprovação na mesma conexão.
Por exemplo, a resposta original pode terminar com uma chamada a get_project_status. Os payloads a seguir mostram apenas os campos relevantes:
{
"type": "response.completed",
"response": {
"id": "resp_1",
"status": "completed",
"output": [
{
"type": "function_call",
"call_id": "call_project",
"name": "get_project_status",
"arguments": "{\"project\":\"task-tracker\"}"
}
]
}
}
Depois que a resposta original termina, a API envia response.steer.pending para uma orientação aceita que ainda precisa de entrada. O campo required_input desse evento identifica os resultados de ferramentas ou as aprovações de que a API precisa antes de aplicar a atualização:
{
"type": "response.steer.pending",
"sequence_number": 12,
"steer": {
"id": "steer_0123456789abcdef0123456789abcdef",
"previous_response_id": "resp_1"
},
"reason": "waiting_for_required_input",
"required_input": [
{
"type": "function_call_output",
"call_id": "call_project",
"name": "get_project_status"
}
]
}
Retorne a entrada necessária com response.create pela mesma conexão, definindo previous_response_id como resp_1. Não repita a orientação aceita. Um response.create explícito usa suas próprias ferramentas, instruções e demais configurações.
Os comentários neste exemplo em JSONC mostram onde o servidor adiciona a atualização que está na fila:
{
"type": "response.create",
"model": "gpt-6-astra",
"previous_response_id": "resp_1",
"input": [
// The server implicitly prepends your accepted steer here:
// "Keep the scope small enough for one developer to finish in two weeks."
{
"type": "function_call_output",
"call_id": "call_project",
"output": "Design is complete. Development has not started.",
},
{
"role": "user",
"content": "Show me the updated plan before starting any work.",
},
],
}
Você não precisa esperar por response.steer.pending para retornar resultados de ferramentas. Se o servidor já tiver recebido um response.create correspondente, poderá prosseguir sem enviar essa notificação antes.
Trate falhas e desconexões
response.steer.failed significa que a API não aplicou a entrada por meio da orientação e não a aplicará automaticamente depois. O evento retorna os valores originais de input e previous_response_id dentro de steer, com um objeto error que descreve a falha.
Acompanhe os envios aceitos por steer.id. Uma falha posterior usa o mesmo ID.
Códigos de erro comuns:
invalid_input: Use apenas os campos de evento compatíveis e mensagens do usuário como entrada.steering_not_supported: O modelo, os parâmetros da solicitação ou ambos podem ser incompatíveis com a orientação durante o turno.response_not_found: A resposta de destino ainda precisa estar disponível na mesma conexão WebSocket.too_many_pending_steers: Há entradas de orientação pendentes demais. Retorne os resultados de ferramentas ou as aprovações necessários usandoresponse.create; caso contrário, aguarde a continuação automática antes de enviar mais entradas. Não reenvie orientações já aceitas.
As entradas de orientação na fila existem apenas na conexão atual; elas não são armazenadas com a resposta original. Registre as entradas de orientação que você envia e compare-as com os eventos e o histórico de respostas antes de reenviá-las. Não presuma que as orientações pendentes foram preservadas após a desconexão. Consulte as orientações de recuperação de WebSocket.