O que é Open Responses?

Open Responses é uma especificação OpenAPI sob licença Apache 2.0, baseada na API Responses da OpenAI, para chamar qualquer provedor de modelos em um único formato. A OpenAI contribuiu com ela para a Agentic AI Foundation em 22 de outubro de 2026. O que ela define, quem a implementa e como...

INEZA Felin-Michel

INEZA Felin-Michel

2 novembro 2026

O que é Open Responses?

Apidog para empresas

Implantação local

SSO & RBAC

Conforme SOC 2

Explorar Apidog Enterprise

O Open Responses é uma especificação aberta, publicada como um documento OpenAPI 3.1, que descreve um único formato de requisição e resposta para chamar modelos de linguagem entre provedores. Ele é baseado na OpenAI Responses API: você envia model, input e tools opcionais para POST /v1/responses, e recebe de volta itens tipados e eventos de streaming semânticos em vez de um formato específico de provedor. A OpenAI lançou o Open Responses em 2026-01-15, ele é licenciado sob Apache 2.0, e em 2026-10-22 a OpenAI o contribuiu para a Agentic AI Foundation (AAIF), o órgão da Linux Foundation que também hospeda o MCP.

Esse último passo é a notícia: a especificação agora tem um estatuto técnico, um comitê diretivo e um lar neutro. Este post cobre o que ela define, quem a implementa, o que a mudança para a AAIF altera e como verificar se um endpoint do qual você depende está em conformidade. Se você é novo na API subjacente, comece com como usar a OpenAI Responses API.

O que o Open Responses define

A especificação descreve o problema de forma clara: os provedores convergiram para os mesmos blocos de construção (mensagens, chamadas de ferramentas, streaming, entrada multimodal), mas cada um os codifica de forma diferente. O Open Responses escolhe uma codificação e a documenta.

O documento OpenAPI atual está na versão 2026-04-24 e cobre uma superfície pequena:

Operação O que faz
POST /responses (createResponse) Cria uma resposta, com ou sem streaming
WebSocket em /responses O mesmo modelo de resposta sobre um socket persistente (adicionado em 2026-04-24)
POST /responses/compact (compactResponse) Retorna uma janela de entrada compactada para conversas longas

O corpo da requisição aceita os campos que você esperaria se já usou a API da OpenAI: model, input, instructions, tools, tool_choice, stream, store, previous_response_id, reasoning, text, truncation, temperature, top_p, max_output_tokens, prompt_cache_key e mais alguns. O objeto de resposta (ResponseResource) carrega id, status, output, usage, error e um eco das configurações que você enviou. O documento define 108 schemas no total, a maioria deles tipos de item e de evento de streaming.

Três ideias sustentam o design.

Itens são a unidade de contexto

Tudo o que o modelo lê ou produz é um item: uma message, um function_call, um function_call_output, um item de reasoning. Os itens são bidirecionais, então a saída de um turno pode ser realimentada diretamente como entrada do próximo. Cada tipo de item é discriminado pelo seu campo type e tem seu próprio schema.

Os itens também são máquinas de estado: cada um passa de in_progress para completed ou incomplete (o orçamento de tokens acabou), e um item incomplete deve ser o último emitido, com a resposta inteira marcada como incompleta. Um status não diz nada sobre se o servidor armazenou o item; a persistência é uma preocupação separada.

Streaming são eventos semânticos, não deltas brutos

Quando você define stream: true, o servidor deve responder com Content-Type: text/event-stream e uma sequência de eventos definida. Um item de saída abre com response.output_item.added; o texto dentro dele chega como response.content_part.added, depois eventos repetidos response.output_text.delta, então response.output_text.done e response.content_part.done; o item fecha com response.output_item.done. O stream deve terminar com um evento terminal: response.completed, response.failed ou response.incomplete. Um [DONE] ao final é opcional, e os clientes devem lidar com um stream que termina sem ele.

Diagram of the Open Responses streaming event order: output_item.added, content_part.added, output_text.delta repeated, output_text.done, content_part.done, output_item.done, then a terminal completed, failed or incomplete event

Isso importa principalmente para o código do cliente: se dois provedores emitem os mesmos eventos na mesma ordem, um único parser SSE funciona para ambos. Nosso guia de testes de SSE mostra como inspecionar esses streams evento por evento.

Um núcleo estável com extensões com namespace

Os provedores podem adicionar seus próprios tipos de item, ferramentas e eventos de streaming, mas devem prefixá-los com um slug do provedor. O próprio exemplo da especificação é openai:web_search_call. Um cliente que não reconhece um tipo prefixado pode ignorá-lo sem quebrar. É assim que a especificação permanece portátil enquanto ferramentas hospedadas, como busca na web ou busca em arquivos, continuam sendo recursos do provedor.

O restante do contrato

Mais algumas regras vale a pena conhecer antes de construir sobre a especificação:

A revisão de 2026-04-24 (changelog) adicionou o transporte WebSocket: cada turno começa com uma mensagem response.create, uma conexão processa uma resposta por vez, as conexões têm limite de 60 minutos (código de erro websocket_connection_limit_reached), e continuações com store: false vivem na memória local da conexão, falhando com previous_response_not_found quando esse estado se perde. A mesma revisão adicionou /responses/compact, um campo opcional phase nas mensagens do assistente (commentary ou final_answer) e tornou logprobs opcional.

Open Responses vs Chat Completions

O Chat Completions ainda é a interface de LLM mais amplamente copiada. A diferença está na forma: o Chat Completions retorna choices contendo uma mensagem, com as chamadas de ferramentas embutidas nela, enquanto o modelo Responses retorna uma lista plana de itens tipados. Um passo de raciocínio, três chamadas de ferramentas e uma mensagem final se tornam objetos separados e ordenados, com status próprio, o que se adapta melhor a loops de agentes.

Side-by-side diagram: Chat Completions nests content and three tool_calls inside choices[0].message, while Open Responses returns a flat output list of reasoning, three function_call items and a message, each with a status

Comparamos os três formatos dominantes lado a lado, com requisições reais, em Chat Completions vs Anthropic Messages vs Responses API. Se você está escolhendo entre as próprias superfícies da OpenAI, o comparativo Agents API vs Responses API vs Agents SDK cobre onde o Responses se encaixa.

Quem implementa

A lista de apoiadores inclui AWS Bedrock, Databricks, Hugging Face, LM Studio, Nvidia, Ollama, OpenRouter, Red Hat, Vercel e vLLM, ao lado da OpenAI. Anthropic e Google não estão entre os apoiadores nomeados; ambos ainda oferecem seus próprios formatos nativos.

“Suporta” cobre uma ampla variedade, então verifique os detalhes do runtime que você usa:

Para dar uma ideia de escala, o API Evangelist fez um levantamento de base em 13 de setembro: de 120 provedores que alegam compatibilidade com a OpenAI e publicam um documento OpenAPI legível, 26 declaram POST /responses, contra 105 que declaram POST /chat/completions. O objetivo do levantamento é medir se a governança neutra move esse número.

O que a mudança para a Agentic AI Foundation altera

A AAIF anunciou o Open Responses em 2026-10-22 na AGNTCon + MCPCon North America em San Jose, junto com três outros novos projetos: Agent Skills (da Anthropic), OpenEnv (da Hugging Face) e OpenSandbox (da Alibaba). Isso leva a AAIF a 10 projetos hospedados em seu primeiro ano, ao lado de MCP, do protocolo Agent2Agent, do AGENTS.md, do goose, do agentgateway e do Agent Router. Se você está tentando entender como tudo isso se encaixa, nosso explicador MCP vs A2A é um bom começo.

O que muda:

O que não muda:

Verifique um endpoint com os testes de aceitação

O projeto traz seus próprios testes de aceitação. A página de conformidade executa 10 testes no navegador contra qualquer URL base, modelo e chave: resposta de texto básica, streaming, prompt de sistema, chamada de ferramentas, entrada de imagem, histórico de múltiplos turnos, rótulos de phase do assistente, o endpoint de compactação e um teste negativo para uma requisição de compactação sem model. Mais sete testes de WebSocket (turnos sequenciais, continuação com store: false, recuperação de reconexão, despejo de cache após uma continuação falha) são executados apenas pela CLI:

git clone https://github.com/openresponses/openresponses
cd openresponses && bun install
bun run test:compliance --base-url http://localhost:11434/v1 --api-key ollama

Cada requisição HTTP e cada turno de WebSocket tem um prazo de 30 segundos, e um timeout reprova apenas aquele teste. Espere que um runtime sem estado, como o Ollama, falhe nos testes de continuação por design.

Deixe seu agente de código testá-lo com o Apidog CLI

Os testes de aceitação dizem se um servidor segue a especificação hoje. Eles não monitoram o endpoint que seu app chama a cada deploy, atualização do Ollama ou troca de provedor. Para isso, importe a especificação em um projeto Apidog e deixe seu agente de código escrever e executar testes de regressão contra ela com o Apidog CLI.

Instale a CLI e a skill do agente uma vez:

npm install -g apidog-cli@latest
apidog auth login --with-token <YOUR_TOKEN>
npx -y skills add https://apidog.com   # pick your agent when prompted

Depois dê ao Claude Code, Codex ou Cursor um prompt:

Download https://www.openresponses.org/openapi/openapi.json and import it into
Apidog project <id>. Create an environment "local-ollama" with base URL
http://localhost:11434/v1. Add test cases for POST /responses: one that expects 200,
status "completed" and an output item of type "message"; one with stream: true that
expects text/event-stream ending in response.completed; one without "model" that
expects a 4xx error with an error.type field. Run them and summarize any failures.

O agente lê os schemas, valida seus payloads antes de escrever qualquer coisa e executa os casos:

curl -sLO https://www.openresponses.org/openapi/openapi.json
apidog import --project <id> --format openapi --file ./openapi.json
apidog environment create local-ollama --project <id> --base-url http://localhost:11434/v1
apidog cli-schema get test-case-create
apidog cli-schema validate test-case-create --file case.json
apidog test-case create --project <id> --file case.json
apidog run --test-case <caseId> --project <id> -e <envId> -r cli,json

A entrada servers da especificação aponta para https://api.openai.com/v1, então adicione um ambiente por provedor e execute os mesmos casos contra cada um: essa é a promessa de portabilidade, testada. Coloque a linha apidog run ... -r junit no seu pipeline para que uma atualização de runtime que remova um campo quebre o build (guia de CI/CD); Apidog CLI no Claude Code cobre a configuração do agente em detalhes.

FAQ

O Open Responses é o mesmo que a OpenAI Responses API? Não. O Open Responses é uma especificação derivada dela. A Responses API da OpenAI é uma implementação com recursos extras exclusivos da OpenAI; Ollama, LM Studio e vLLM são outras.

Quem é o dono do Open Responses agora? Desde 2026-10-22, é um projeto da Agentic AI Foundation sob a Linux Foundation, operado como uma série da LF Projects com um Comitê Diretivo Técnico. É licenciado sob Apache 2.0.

A Anthropic suporta o Open Responses? A Anthropic não está entre os apoiadores nomeados. Ela contribuiu com o Agent Skills para a AAIF no mesmo dia, mas a interface nativa do Claude ainda é a Messages API.

Onde está o arquivo da especificação? Em https://www.openresponses.org/openapi/openapi.json, com lançamentos datados no repositório do GitHub.

Próximo passo

Escolha o endpoint que seu produto mais chama, execute os testes de aceitação do navegador contra ele e importe a especificação no Apidog para que seu agente possa manter essas verificações rodando a cada deploy. Baixe o Apidog para começar.

Pratique o design de API no Apidog

Descubra uma forma mais fácil de construir e usar APIs