Ciclope API

API pública para integrar los modelos de Ciclope en tus propios proyectos.

Base URL

https://ciclope.xstar.es

Autenticación

Incluye tu API key en la cabecera Authorization:

Authorization: Bearer ck_TU_API_KEY

POST/api/v1/chat

Envía mensajes a un modelo Ciclope y recibe la respuesta.

Body (JSON)

{
  "model": "ciclope2",
  "messages": [
    { "role": "user", "content": "Hola, ¿cómo estás?" }
  ],
  "stream": false   // opcional, true para streaming en tiempo real
}

Modelos disponibles

ModeloParámetrosUso recomendado
ciclope11.2BRespuestas rápidas y simples
ciclope1.53.2BEquilibrio velocidad/calidad
ciclope28BTareas complejas
ciclope2.58B Q4_K_MMáxima calidad

Respuesta (sin streaming)

{
  "id": "ciclope-1234567890",
  "model": "ciclope1.5",        // modelo que pediste
  "model_used": "ciclope2",     // modelo que respondió (puede ser superior si escaló)
  "escalated": true,            // true si el sistema escaló a un modelo más potente
  "message": {
    "role": "assistant",
    "content": "¡Hola! Estoy bien, gracias por preguntar..."
  },
  "usage": {
    "input_tokens": 12,
    "output_tokens": 48,
    "total_tokens": 60
  }
}

Respuesta con stream: true (SSE)

Cuando stream: true, la respuesta es un flujo text/event-stream. Cada evento contiene un token:

data: {"id":"ciclope-123","model":"ciclope2","delta":{"role":"assistant","content":"¡"},"done":false}

data: {"id":"ciclope-123","model":"ciclope2","delta":{"role":"assistant","content":"Hola"},"done":false}

data: {"id":"ciclope-123","model":"ciclope2","delta":{"role":"assistant","content":"!"},"done":true}

data: [DONE]

Ejemplo streaming en tiempo real

const response = await fetch("https://ciclope.xstar.es/api/v1/chat", {
  method: "POST",
  headers: {
    "Content-Type": "application/json",
    "Authorization": "Bearer ck_TU_API_KEY"
  },
  body: JSON.stringify({
    model: "ciclope2",
    messages: [{ role: "user", content: "Cuéntame un chiste" }],
    stream: true
  })
})

const reader = response.body.getReader()
const decoder = new TextDecoder()

while (true) {
  const { done, value } = await reader.read()
  if (done) break
  const lines = decoder.decode(value).split("\n")
  for (const line of lines) {
    if (!line.startsWith("data: ")) continue
    const raw = line.slice(6)
    if (raw === "[DONE]") break
    const chunk = JSON.parse(raw)
    process.stdout.write(chunk.delta.content) // imprime token a token
  }
}

Ejemplo sin streaming

fetch("https://ciclope.xstar.es/api/v1/chat", {
  method: "POST",
  headers: {
    "Content-Type": "application/json",
    "Authorization": "Bearer ck_TU_API_KEY"
  },
  body: JSON.stringify({
    model: "ciclope2",
    messages: [
      { role: "user", content: "Explícame qué es la fotosíntesis" }
    ]
  })
})
.then(res => res.json())
.then(data => console.log(data.message.content))

Códigos de error

CódigoDescripción
401API key inválida, inactiva o cabecera ausente
400Campos requeridos ausentes o modelo inválido
429Límite diario de tokens alcanzado
503Modelo no disponible (Ollama no responde)
502Error de comunicación con el servidor de modelos

Ciclope API — ciclope.xstar.es