For the complete documentation index, see llms.txt. Markdown versions of documentation pages are available by appending .md to the page URL.
Navegación principal

Resultados predichos

Reduce la latencia de las respuestas del modelo cuando gran parte de la respuesta se conoce de antemano.

Los resultados predichos te permiten acelerar las respuestas de la API de Chat Completions cuando muchos de los tokens de salida se conocen de antemano. Esto suele ocurrir cuando regeneras un archivo de texto o código con pequeñas modificaciones. Puedes proporcionar tu predicción mediante el parámetro de solicitud prediction de Chat Completions.

Los resultados predichos ya están disponibles con los modelos más recientes gpt-4o, gpt-4o-mini, gpt-4.1, gpt-4.1-mini y gpt-4.1-nano. Sigue leyendo para aprender a usar los resultados predichos para reducir la latencia en tus aplicaciones.

Ejemplo de refactorización de código

Los resultados predichos son especialmente útiles para regenerar documentos de texto y archivos de código con pequeñas modificaciones. Supongamos que quieres que el modelo GPT-4o refactorice un fragmento de código JavaScript y cambie la propiedad username de la clase User por email:

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

export default User;

La mayor parte del archivo permanecerá sin cambios, salvo la línea 4 que se muestra arriba. Si usas el texto actual del archivo de código como predicción, puedes regenerar todo el archivo con menor latencia. Este ahorro de tiempo se acumula rápidamente en los archivos más grandes.

A continuación se muestra un ejemplo de cómo usar el parámetro prediction en nuestros SDK para predecir que la salida final del modelo será muy similar a nuestro archivo de código original, que usamos como texto de predicción.

Refactoriza una clase de JavaScript con un resultado predicho
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);

Además del código refactorizado, una respuesta abreviada del modelo sin el campo choices contiene datos de uso como estos:

{
  "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"
}

Observa tanto accepted_prediction_tokens como rejected_prediction_tokens en el objeto usage. En este ejemplo, se usaron 14 tokens de la predicción para acelerar la respuesta y se rechazaron 2.

Ten en cuenta que los tokens rechazados se siguen facturando igual que los demás tokens de completado generados por la API, por lo que los resultados predichos pueden aumentar los costos de tus solicitudes.

Ejemplo de streaming

La reducción de latencia que ofrecen los resultados predichos es aún mayor cuando usas streaming para las respuestas de la API. Aquí tienes un ejemplo del mismo caso de uso de refactorización de código, pero con streaming en los SDK de OpenAI.

Resultados predichos con 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 || "");
}

Posición del texto predicho en la respuesta

Cuando proporcionas texto de predicción, este puede aparecer en cualquier parte de la respuesta generada y aun así reducir su latencia. Supongamos que tu texto predicho es el servidor sencillo de Hono que se muestra a continuación:

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,
});

Podrías pedirle al modelo que regenere el archivo con un prompt como este:

Add a get route to this application that responds with
the text "hello world". Generate the entire application
file again with this route added, and with no other
markdown formatting.

La respuesta al prompt podría ser similar 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,
});

Una respuesta abreviada del modelo sin el campo choices seguiría mostrando tokens de predicción aceptados, aunque el texto de predicción apareciera tanto antes como después del contenido nuevo agregado a la respuesta:

{
  "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"
}

Esta vez no hubo tokens de predicción rechazados porque se usó todo el contenido del archivo que predijimos en la respuesta final. ¡Genial! 🔥

Limitaciones

Al usar resultados predichos, debes considerar los siguientes factores y limitaciones.

  • Los resultados predichos solo son compatibles con las series de modelos GPT-4o, GPT-4o-mini, GPT-4.1, GPT-4.1-mini y GPT-4.1-nano.
  • Cuando proporcionas una predicción, los tokens proporcionados que no formen parte del completado final se siguen cobrando a las tarifas de los tokens de completado. Consulta la propiedad rejected_prediction_tokens del objeto usage para ver cuántos tokens no se usan en la respuesta final.
  • Los siguientes parámetros de la API no se admiten al usar resultados predichos:
    • n: no se admiten valores mayores que 1
    • logprobs: no se admite
    • presence_penalty: no se admiten valores mayores que 0
    • frequency_penalty: no se admiten valores mayores que 0
    • audio: los resultados predichos no son compatibles con las entradas y salidas de audio
    • modalities: solo se admiten modalidades text
    • max_completion_tokens: no se admite
    • tools: actualmente, la llamada a funciones no es compatible con los resultados predichos