Ao orientar uma resposta em andamento, o usuário pode acrescentar requisitos ou mudar de direção sem esperar que a resposta termine.
Os modelos da família GPT-6 permitem orientar respostas em andamento por uma conexão WebSocket com a Responses API. O GPT-5.6 e os modelos anteriores não oferecem esse recurso.
Uma nova orientação não altera a saída já enviada ao aplicativo, não desfaz ações anteriores nem cancela a execução de ferramentas que já foram acionadas.
O exemplo em Java requer a versão 17 ou posterior do Java. Para saber como configurar a conexão e como funciona o transporte de dados, consulte o modo WebSocket. Para ver a definição exata de cada evento, 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 e use o ID da resposta como valor de 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 os campos type, previous_response_id e input. Use como valor de input uma string ou um array não vazio de mensagens do usuário com tipos de conteúdo compatíveis.
A API confirma que a entrada foi adicionada à fila com response.steer.accepted:
{
"type": "response.steer.accepted",
"sequence_number": 4,
"steer": {
"id": "steer_0123456789abcdef0123456789abcdef",
"previous_response_id": "resp_1"
}
}
A confirmação indica apenas que a entrada está na fila. O modelo pode ainda não ter agido com base nela. A API cria automaticamente uma nova resposta com a atualização, a menos que precise receber do aplicativo o resultado de uma ferramenta ou uma aprovação.
Antes de criar essa continuação automática, o servidor conclui o item de saída atual e aguarda a conclusão de qualquer tarefa já em execução nas ferramentas hospedadas. Continue lendo os eventos para receber a resposta com a atualização. Não envie outro response.create.
Se a orientação interromper a resposta original, a resposta terminará com response.incomplete e incomplete_details.reason: "steered". Se a resposta original terminar normalmente antes disso, ela manterá o status de concluída e ainda poderá ter uma continuação com a nova 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 inclui um cliente WebSocket para a Responses API. Por isso, este exemplo não tem uma versão que use o SDK em 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:
await connection.response.create(
model="gpt-6-astra",
store=False,
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.")
async def run():
await asyncio.wait_for(main(), timeout=120)
asyncio.run(run())O exemplo envia a atualização após o primeiro evento response.created. No seu aplicativo, envie a atualização quando o usuário a fornecer. Depois de receber o evento response.created da continuação, use o ID dessa continuação para enviar novas orientações.
Retorne resultados de ferramentas ou uma aprovação
Se a resposta precisar do resultado de uma ferramenta do cliente ou de uma aprovação, a API manterá a orientação na fila. Siga o fluxo habitual de execução de ferramentas ou de aprovação na mesma conexão.
Por exemplo, a resposta original pode terminar com uma chamada a get_project_status. Os exemplos 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 a orientação aceita que ainda depende de dados adicionais. O campo required_input desse evento indica quais resultados de ferramentas ou aprovações a API precisa receber para 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 os dados solicitados com response.create pela mesma conexão e defina previous_response_id como resp_1. Não repita a orientação já aceita. Uma chamada explícita a response.create usa suas próprias ferramentas, instruções e demais configurações.
Os comentários neste exemplo em JSONC mostram onde o servidor insere 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ê pode retornar os resultados das ferramentas sem esperar pelo evento response.steer.pending. Se o servidor já tiver recebido o response.create correspondente, poderá prosseguir sem enviar essa notificação antes.
Trate falhas e desconexões
response.steer.failed indica que a API não aplicou a entrada como orientação e não a aplicará automaticamente mais tarde. O evento retorna os valores originais de input e previous_response_id dentro de steer, com um objeto error que descreve a falha.
Use steer.id para acompanhar cada orientação aceita. Se ocorrer uma falha depois, o evento de falha usará o mesmo ID.
Códigos de erro comuns:
invalid_input: Use apenas os campos aceitos pelo evento e envie somente mensagens do usuário como entrada.steering_not_supported: O modelo, os parâmetros da solicitação ou ambos podem ser incompatíveis com o envio de orientações.response_not_found: A resposta à qual se destina a orientação precisa continuar disponível na mesma conexão WebSocket.too_many_pending_steers: Há orientações demais na fila. Retorne os resultados de ferramentas ou as aprovações solicitadas usandoresponse.create. Se não houver nada a retornar, aguarde a continuação automática antes de enviar mais orientações. Não reenvie orientações já aceitas.
As orientações na fila existem apenas na conexão atual. Elas não ficam armazenadas com a resposta original. Registre as orientações que enviar e compare esses registros com os eventos e o histórico de respostas antes de reenviá-las. Após uma desconexão, não presuma que as orientações pendentes continuam na fila. Consulte as orientações para recuperar uma conexão WebSocket.