For the complete documentation index, see llms.txt. Markdown versions of documentation pages are available by appending .md to the page URL.
Navegação principal
Theme

Como orientar uma resposta em andamento

Envie atualizações do usuário enquanto a resposta está em andamento.

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#.

Atualize um plano de projeto enquanto ele está sendo gerado
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 usando response.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.