Ir al contenido

Compatible con OpenAI

Una API compatible con OpenAI, lista para usar

Mantén el SDK de OpenAI y el código que ya tienes. Cambia tres valores (la URL base, la clave y el modelo) y tus chat completions corren en dos modelos sin censura que no guardan nada. Abajo: el cambio en Python, JavaScript y curl, y una lista exacta de lo que se admite.

Revisado el 29 de octubre de 2026

valores que cambiar en tu código
3
campos opcionales de solicitud que se pasan
15
rutas, incluidos los chat completions
4
para probar con sk-nokeep-test
$0

Los tres valores

URL base
https://nokeep.ai/v1
Clave de API
sk-nokeep-test (free) or your sk-nokeep-… key
Modelo
deepseek-v4.1-flash-uncensored

Los SDK oficiales de OpenAI leen la URL base y la clave del entorno, así que en muchos proyectos el cambio no requiere tocar código:

Shell
export OPENAI_BASE_URL="https://nokeep.ai/v1"
export OPENAI_API_KEY="sk-nokeep-…"

Luego cambia el nombre del modelo donde lo llamas. Todo lo demás se queda igual.

En Python, JavaScript y curl

import os
from openai import OpenAI

client = OpenAI(
    base_url="https://nokeep.ai/v1",
    api_key=os.environ["NOKEEP_API_KEY"],
)

reply = client.chat.completions.create(
    model="deepseek-v4.1-flash-uncensored",
    messages=[{"role": "user", "content": "Write a haiku about moving house."}],
)
print(reply.choices[0].message.content)

El streaming, las herramientas, la salida JSON y las imágenes funcionan igual que en el formato de OpenAI. Las bibliotecas y frameworks construidos sobre el SDK de OpenAI usan la misma URL base y la misma clave. Prueba la llamada aquí primero:

Pruébalo aquí, gratis

Esto envía una petición real a la API con la clave de prueba. Responde una línea fija y no cuesta nada.

Lo que se admite

FunciónCompatible
POST /v1/chat/completions, completo o en streamingSí, ambos modelos
GET /v1/models y GET /v1/models/{id}Sí, con longitud de contexto, respuesta más larga y precio por token
Roles: system, developer, user, assistant, toolSí
Llamadas a herramientas: tools, tool_choiceSí. En GLM, tool_choice acepta solo auto o none.
reasoning_effortDeepSeek: none, low, high, max. GLM: low, high.
Imágenes como partes image_url, enlaces o data URLsdeepseek-v4.1-flash-uncensored, hasta 10 por solicitud
response_format, temperature, top_p, stop, seed, penalizacionesdeepseek-v4.1-flash-uncensored
stream_options.include_usage, max_tokens, max_completion_tokensSí
Entrada en caché en usage.prompt_tokens_details.cached_tokensSí, se cobra al precio en caché

Cada campo, modelo por modelo: Chat completions.

Lo que no se admite

No admitidoLo que recibes
Otros endpoints: embeddings, imágenes, audio, archivos, batch, moderaciones, las APIs de Responses y Assistants, completions heredados404 not_found, que nombra las cuatro rutas que hay
n distinto de 1400 unsupported_n
Un reasoning_effort que el modelo no acepta400 invalid_reasoning_effort, que nombra los que sí acepta
Una función con nombre o required como tool_choice en glm-5.3-flash-uncensored400 unsupported_tool_choice
Imágenes a glm-5.3-flash-uncensored; partes de audio o video a cualquiera de los dos modelos400 unsupported_input, que nombra el modelo que lee imágenes
Más de 10 imágenes, o más de 2,000 mensajes400 too_many_images, 400 invalid_messages
Campos que ninguno de los dos modelos acepta, como logprobs, logit_bias, user o storeSe descartan, y se nombran en el encabezado x-nokeep-ignored

Nada de lo no admitido se adivina ni se cambia en silencio: una solicitud se rechaza con un código, o sus campos no usados se nombran en un encabezado. Cada código y su solución: Errores.

Pequeñas diferencias que conviene saber

  • usage.nokeep_credits indica lo que costó la llamada, y los encabezados x-nokeep-credits y x-nokeep-balance lo indican en una respuesta completa.
  • La facturación es con créditos prepagados: 1,000 son $1, desde $5, y nunca caducan. Una llamada rechazada no cuesta nada.
  • Límite de frecuencia: 120 solicitudes por minuto por clave. Un 429 incluye Retry-After.
  • El host de GLM puede estar ocupado en horas pico; una llamada ocupada responde 503 busy con Retry-After: 5 y no cuesta nada.

Preguntas

¿Necesito cambiar mi código para cambiar de API?

Solo la URL base, la clave y el nombre del modelo. Con los SDK oficiales, las dos primeras pueden venir de OPENAI_BASE_URL y OPENAI_API_KEY en el entorno.

¿Funciona con apps que aceptan un endpoint personalizado de OpenAI?

Sí. Cualquier app con una opción de endpoint compatible con OpenAI o personalizado funciona. Guías: SillyTavern, Open WebUI, y agentes de programación en la página de agentes de programación.

¿Qué modelos de OpenAI puedo llamar?

Ninguno: el formato es el de OpenAI, pero los modelos son deepseek-v4.1-flash-uncensored y glm-5.3-flash-uncensored. GET /v1/models lista todos los ids.

¿Hay un endpoint de embeddings?

Todavía no. La API sirve chat completions, la lista de modelos y una ruta de estado. Las rutas nuevas aparecerán en el registro de cambios.

¿Qué pasa con los campos que no admiten?

Se descartan y se nombran en el encabezado x-nokeep-ignored, para que veas exactamente qué no se usó. Los valores que cambiarían el sentido de una solicitud, como n mayor que 1, se rechazan con un 400.