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ámetro | Tipo | Descripción |
|---|---|---|
| model | string | Obligatorio. id de modelo de /v1/models con type text |
| messages | object[] | Obligatorio. Cada elemento {role, content}; role es system, user o assistant. Máximo 64 por petición |
| stream | boolean | Opcional. true pasa a deltas por SSE; por defecto false devuelve la respuesta de una vez |
| temperature | number | Opcional. Se pasa tal cual al modelo |
| top_p | number | Opcional. Se pasa tal cual |
| max_tokens | integer | Opcional. Se pasa tal cual |
| stop | string|string[] | Opcional. Se pasa tal cual |
| presence_penalty / frequency_penalty | number | Opcional. 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
}| Campo | Descripción |
|---|---|
| choices[0].message.content | El texto de la respuesta |
| choices[0].finish_reason | stop si terminó con normalidad, length si alcanzó max_tokens |
| usage | Conteo de tokens. El texto se cobra por token, así que esta es la base del cobro |
| credits | Cré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.

