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

Saídas previstas

Reduza a latência quando já souber grande parte do conteúdo que o modelo vai retornar.

Saídas previstas permitem obter respostas mais rápidas da API chat completions quando você já conhece muitos dos tokens de saída. Isso é mais comum quando você precisa gerar novamente um arquivo de texto ou de código com pequenas alterações. Para fornecer sua previsão, use o parâmetro de requisição prediction da API chat completions.

As saídas previstas estão disponíveis nas versões mais recentes dos modelos gpt-4o, gpt-4o-mini, gpt-4.1, gpt-4.1-mini e gpt-4.1-nano. Veja como usá-las para reduzir a latência nos seus aplicativos.

Exemplo de refatoração de código

As saídas previstas são especialmente úteis para gerar novamente documentos de texto e arquivos de código com pequenas alterações. Suponha que você queira que o modelo GPT-4o refatore um trecho de código JavaScript e renomeie a propriedade username da classe User para email.

class User {
  firstName = "";
  lastName = "";
  username = "";
}

export default User;

Apenas a linha 4 do exemplo acima vai mudar. Se você usar o conteúdo atual do arquivo de código como previsão, poderá gerar o arquivo inteiro novamente com menor latência. Em arquivos maiores, o tempo economizado aumenta rapidamente.

No exemplo a seguir, usamos o parâmetro prediction nos nossos SDKs para indicar que a saída final do modelo deve ser muito parecida com o código original. O próprio conteúdo do arquivo serve como texto da previsão.

Refatore uma classe JavaScript com uma saída prevista
import OpenAI from "openai";

const code = `
class User {
  firstName = "";
  lastName = "";
  username = "";
}

export default User;
`.trim();

const openai = new OpenAI();

const refactorPrompt = `
Replace the "username" property with an "email" property. Respond only
with code, and with no markdown formatting.
`;

const completion = await openai.chat.completions.create({
  model: "gpt-4.1",
  messages: [
    {
      role: "user",
      content: refactorPrompt,
    },
    {
      role: "user",
      content: code,
    },
  ],
  store: true,
  prediction: {
    type: "content",
    content: code,
  },
});

// Inspect returned data
console.log(completion);
console.log(completion.choices[0].message.content);

Além do código refatorado, a resposta do modelo inclui dados de uso. Veja a versão abreviada da resposta, sem o campo choices.

{
  "id": "chatcmpl-xxx",
  "object": "chat.completion",
  "created": 1786652188,
  "model": "gpt-4.1-2025-04-14",
  "usage": {
    "prompt_tokens": 59,
    "completion_tokens": 24,
    "total_tokens": 83,
    "prompt_tokens_details": { "cached_tokens": 0, "audio_tokens": 0 },
    "completion_tokens_details": {
      "reasoning_tokens": 0,
      "audio_tokens": 0,
      "accepted_prediction_tokens": 14,
      "rejected_prediction_tokens": 2
    }
  },
  "system_fingerprint": "fp_6ddb4f7408"
}

Observe os campos accepted_prediction_tokens e rejected_prediction_tokens no objeto usage. Neste exemplo, o modelo usou 14 tokens da previsão para acelerar a resposta e rejeitou 2.

A API cobra pelos tokens rejeitados a mesma tarifa que cobra pelos demais tokens de saída que gera. Por isso, usar saídas previstas pode aumentar o custo das requisições.

Exemplo com streaming

As saídas previstas reduzem ainda mais a latência quando você recebe as respostas da API por streaming. O exemplo a seguir mostra a mesma refatoração de código, desta vez com streaming nos SDKs da OpenAI.

Saídas previstas com streaming
import OpenAI from "openai";

const code = `
class User {
  firstName = "";
  lastName = "";
  username = "";
}

export default User;
`.trim();

const openai = new OpenAI();

const refactorPrompt = `
Replace the "username" property with an "email" property. Respond only
with code, and with no markdown formatting.
`;

const completion = await openai.chat.completions.create({
  model: "gpt-4.1",
  messages: [
    {
      role: "user",
      content: refactorPrompt,
    },
    {
      role: "user",
      content: code,
    },
  ],
  store: true,
  prediction: {
    type: "content",
    content: code,
  },
  stream: true,
});

// Inspect returned data
for await (const chunk of completion) {
  process.stdout.write(chunk.choices[0]?.delta?.content || "");
}

Posição do texto previsto na resposta

O texto que você fornece como previsão pode aparecer em qualquer parte da resposta gerada e ainda assim reduzir a latência. Suponha que o texto previsto seja o código do servidor simples em Hono mostrado a seguir.

import { serve } from "@hono/node-server";
import { serveStatic } from "@hono/node-server/serve-static";
import { Hono } from "hono";

const app = new Hono();

app.get("/api", (c) => {
  return c.text("Hello Hono!");
});

// You will need to build the client code first: `pnpm run ui:build`.
app.use(
  "/*",
  serveStatic({
    rewriteRequestPath: (path) => `./dist${path}`,
  })
);

const port = 3000;
console.log(`Server is running on port ${port}`);

serve({
  fetch: app.fetch,
  port,
});

Você pode pedir ao modelo que gere o arquivo novamente com um prompt como este:

Adicione a este aplicativo uma rota GET que responda com
o texto "hello world". Gere novamente o arquivo inteiro
do aplicativo com essa rota incluída, sem acrescentar
nenhuma formatação em Markdown.

A resposta ao prompt poderia ser semelhante a esta:

import { serve } from "@hono/node-server";
import { serveStatic } from "@hono/node-server/serve-static";
import { Hono } from "hono";

const app = new Hono();

app.get("/api", (c) => {
  return c.text("Hello Hono!");
});

app.get("/hello", (c) => {
  return c.text("hello world");
});

// You will need to build the client code first: `pnpm run ui:build`.
app.use(
  "/*",
  serveStatic({
    rewriteRequestPath: (path) => `./dist${path}`,
  })
);

const port = 3000;
console.log(`Server is running on port ${port}`);

serve({
  fetch: app.fetch,
  port,
});

Mesmo com trechos do texto previsto antes e depois do novo conteúdo na resposta, a versão abreviada da resposta do modelo, sem o campo choices, ainda mostraria tokens aceitos da previsão.

{
  "id": "chatcmpl-xxx",
  "object": "chat.completion",
  "created": 1731014771,
  "model": "gpt-4o-2024-08-06",
  "usage": {
    "prompt_tokens": 203,
    "completion_tokens": 159,
    "total_tokens": 362,
    "prompt_tokens_details": { "cached_tokens": 0, "audio_tokens": 0 },
    "completion_tokens_details": {
      "reasoning_tokens": 0,
      "audio_tokens": 0,
      "accepted_prediction_tokens": 60,
      "rejected_prediction_tokens": 0
    }
  },
  "system_fingerprint": "fp_9ee9e968ea"
}

Desta vez, o modelo usou todo o conteúdo do arquivo previsto na resposta final e, por isso, não rejeitou nenhum token da previsão. Boa! 🔥

Limitações

Ao usar saídas previstas, leve em conta os seguintes fatores e limitações.

  • Apenas as famílias de modelos GPT-4o, GPT-4o-mini, GPT-4.1, GPT-4.1-mini e GPT-4.1-nano oferecem suporte a saídas previstas.
  • A API cobra a tarifa de tokens de saída mesmo pelos tokens que você fornece na previsão e que ficam de fora da resposta final. Consulte a propriedade rejected_prediction_tokens do objeto usage para saber quantos tokens ficaram de fora.
  • Ao usar saídas previstas, aplicam-se as seguintes restrições aos parâmetros da API:
    • n: a API não aceita valores maiores que 1
    • logprobs: sem suporte
    • presence_penalty: a API não aceita valores maiores que 0
    • frequency_penalty: a API não aceita valores maiores que 0
    • audio: as saídas previstas são incompatíveis com entradas e saídas de áudio
    • modalities: a API aceita apenas a modalidade text
    • max_completion_tokens: sem suporte
    • tools: as saídas previstas ainda não oferecem suporte à chamada de função