Documentación

Chat de texto

POST /v1/chat/completions

Llama a un modelo de texto. A diferencia de imagen y vídeo, este endpoint es síncrono: una ida y vuelta y tienes la respuesta, sin sondeo. La petición y la respuesta siguen chat/completions de OpenAI, streaming incluido, así que cualquier SDK de OpenAI funciona cambiando la URL base.

Parámetros

ParámetroTipoDescripción
modelstringObligatorio. id de modelo de /v1/models con type text
messagesobject[]Obligatorio. Cada elemento {role, content}; role es system, user o assistant. Máximo 64 por petición
streambooleanOpcional. true pasa a deltas por SSE; por defecto false devuelve la respuesta de una vez
temperaturenumberOpcional. Se pasa tal cual al modelo
top_pnumberOpcional. Se pasa tal cual
max_tokensintegerOpcional. Se pasa tal cual
stopstring|string[]Opcional. Se pasa tal cual
presence_penalty / frequency_penaltynumberOpcional. Se pasa tal cual
model es obligatorio y no tiene valor por defecto: los modelos de texto varían mucho en tono, longitud y precio, así que elegir uno en silencio sería tomar por ti una decisión que nunca has visto.

Petición

bash
curl https://open.pikpikgo.com/v1/chat/completions \
  -H "Authorization: Bearer $PIKPIK_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{
    "model": "text-fast-1",
    "messages": [
      { "role": "system", "content": "Eres un guionista especializado en microdramas." },
      { "role": "user", "content": "Dame la apertura de un corto de misterio urbano, en tres frases como mucho." }
    ]
  }'

Respuesta

json
{
  "id": "chatcmpl-2608102214300000123456",
  "object": "chat.completion",
  "created": 1786372470,
  "model": "text-fast-1",
  "choices": [
    {
      "index": 0,
      "message": { "role": "assistant", "content": "A medianoche el ascensor se detiene en el piso 13, pero el edificio solo tiene doce." },
      "finish_reason": "stop"
    }
  ],
  "usage": { "prompt_tokens": 38, "completion_tokens": 126, "total_tokens": 164 },
  "credits": 4
}
CampoDescripción
choices[0].message.contentEl texto de la respuesta
choices[0].finish_reasonstop si terminó con normalidad, length si alcanzó max_tokens
usageConteo de tokens. El texto se cobra por token, así que esta es la base del cobro
creditsCréditos realmente descontados (no es un campo de OpenAI)
El texto se cobra por token, no por llamada: créditos = tokens de entrada × precio de entrada + tokens de salida × precio de salida, redondeado hacia arriba y con un mínimo de 1 por llamada. Los precios se indican por millón de tokens en la página de tarifas.

Respuesta en streaming

Con stream: true la respuesta pasa a text/event-stream y llega como fotogramas chat.completion.chunk: el primero declara el role, el contenido va delta a delta, luego un fotograma con finish_reason y por último uno con choices vacío más usage y credits, cerrado con data: [DONE].

bash
curl -N https://open.pikpikgo.com/v1/chat/completions \
  -H "Authorization: Bearer $PIKPIK_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{
    "model": "text-fast-1",
    "messages": [
      { "role": "user", "content": "Dame la apertura de un corto de misterio urbano, en tres frases como mucho." }
    ],
    "stream": true
  }'
text
data: {"id":"chatcmpl-2608102214300000123456","object":"chat.completion.chunk","created":1786372470,"model":"text-fast-1","choices":[{"index":0,"delta":{"role":"assistant"},"finish_reason":null}]}

data: {"id":"chatcmpl-2608102214300000123456","object":"chat.completion.chunk","created":1786372470,"model":"text-fast-1","choices":[{"index":0,"delta":{"content":"A medi"},"finish_reason":null}]}

data: {"id":"chatcmpl-2608102214300000123456","object":"chat.completion.chunk","created":1786372470,"model":"text-fast-1","choices":[{"index":0,"delta":{},"finish_reason":"stop"}]}

data: {"id":"chatcmpl-2608102214300000123456","object":"chat.completion.chunk","created":1786372470,"model":"text-fast-1","choices":[],"usage":{"prompt_tokens":38,"completion_tokens":126,"total_tokens":164},"credits":4}

data: [DONE]

Con el SDK oficial de OpenAI no tienes que analizar el SSE a mano:

javascript
import OpenAI from 'openai'

const client = new OpenAI({
  apiKey: process.env.PIKPIK_API_KEY,
  baseURL: 'https://open.pikpikgo.com/v1',
})

// Streaming: deltas fotograma a fotograma; el último trae usage y los créditos
const stream = await client.chat.completions.create({
  model: 'text-fast-1',
  messages: [{ role: 'user', content: 'Dame la apertura de un corto de misterio urbano, en tres frases como mucho.' }],
  stream: true,
})

for await (const chunk of stream) {
  process.stdout.write(chunk.choices[0]?.delta?.content || '')
}
En streaming el cobro se basa en el usage del último fotograma; si el origen no lo devuelve, se cobra el mínimo de 1 crédito. Además, en cuanto empiezan a fluir los fotogramas el estado HTTP ya es 200: un fallo a mitad no puede convertirse en 4xx/5xx. Llega como un fotograma {"error": {...}} dentro del stream, seguido del [DONE] habitual; tenlo en cuenta al leer.