Antes y después
Aquí tienes un cliente de OpenAI típico en Python:
import os
from openai import OpenAI
client = OpenAI(api_key=os.environ["OPENAI_API_KEY"])
r = client.chat.completions.create(
model="your-current-model",
messages=[{"role": "user", "content": "Draft a tense dialogue between two rivals."}],
)
Y el mismo cliente apuntando hacia la alternativa sin filtros:
import os
from openai import OpenAI
client = OpenAI(
base_url="https://api.chatgptunfiltered.com/v1",
api_key=os.environ["UNFILTERED_API_KEY"],
)
r = client.chat.completions.create(
model="uncensored",
messages=[{"role": "user", "content": "Draft a tense dialogue between two rivals."}],
)
Dos líneas cambiadas en el constructor, y la cadena del modelo cambiada en la llamada. El formato de los mensajes, el objeto de respuesta y la forma en que lees r.choices[0].message.content permanecen como antes. La alternativa es un modelo diferente gestionado por un proveedor independiente. No es ChatGPT ni una API oficial de OpenAI ni de nadie más.
Cambiar solo con variables de entorno
Las versiones recientes de los SDK oficiales de Python y Node leen OPENAI_BASE_URL y OPENAI_API_KEY cuando creas un cliente sin argumentos. Eso significa que el código de la aplicación puede permanecer sin cambios:
export OPENAI_BASE_URL="https://api.chatgptunfiltered.com/v1"
export OPENAI_API_KEY="YOUR_KEY"
python app.py
Aún debes asegurarte de que el código pase model="uncensored". Si el nombre del modelo está codificado en muchos lugares, extrae primero el valor a una configuración. Ese pequeño refactor hace que cualquier cambio futuro sea igual de barato, en cualquier dirección.
La misma idea funciona en Node:
import OpenAI from "openai";
const client = new OpenAI({
baseURL: "https://api.chatgptunfiltered.com/v1",
apiKey: process.env.UNFILTERED_API_KEY,
});
const r = await client.chat.completions.create({
model: "uncensored",
messages: [{ role: "user", content: "Give me five villain names." }],
});
console.log(r.choices[0].message.content);Frameworks y el formato de respuestas
Las bibliotecas que envuelven el cliente de OpenAI suelen exponer una configuración de URL base. En el adaptador de chat de LangChain para OpenAI se ve así:
from langchain_openai import ChatOpenAI
llm = ChatOpenAI(
model="uncensored",
base_url="https://api.chatgptunfiltered.com/v1",
api_key="YOUR_KEY",
)
print(llm.invoke("Name three moods for a chase scene.").content)
Si usas el formato Responses más nuevo, POST /v1/responses es compatible además de POST /v1/chat/completions. GET /v1/models lista el modelo, lo cual es una verificación rápida de que tu clave y URL son correctos.
Diferencias a esperar
| Área | Lo que notarás |
|---|---|
| Disposición a responder | Responde sin rechazos de contenido para uso adulto lícito. Los prompts que un modelo con filtros rechazaría normalmente obtendrán una respuesta. |
| Redacción y estilo | Modelo diferente, voz diferente. El tono, la longitud y los hábitos de formato no coincidirán con tu modelo anterior. |
| Elección del modelo | Un modelo, ID uncensored. Sin niveles que elegir. |
| Alcance | Solo texto: sin generación de imágenes, audio o video, sin embeddings, sin ajuste fino. |
| Contexto | 100.000 tokens, prompt más respuesta. max_tokens es opcional. |
| Límites | Clave completa: 8 simultáneas, 300 por minuto. Clave de prueba: 2 simultáneas, 60 por minuto. Cuerpo hasta 8 MB. |
| Errores | HTTP 429 con código rate_limited o concurrency; la sobrecarga temporal devuelve 429 con Retry-After: 5. |
Son compatibles el streaming, las llamadas a funciones y el modo JSON, así como temperature, top_p, stop, seed y las penalizaciones. Los encabezados de respuesta incluyen X-Request-Id, X-Balance-USD, X-RateLimit-Limit-Requests y X-RateLimit-Limit-Concurrency. La documentación tiene los detalles.
Dos diferencias adicionales merecen una línea. Primero, un modelo diferente puede contar tokens de manera diferente, por lo que los conteos para el mismo texto pueden diferir de lo que reporta tu proveedor anterior; usa los números de uso en las respuestas, no tus propias estimaciones. Segundo, las funciones que dependen de herramientas alojadas por un proveedor, como búsqueda web integrada o almacenamiento de archivos en el lado del proveedor, no forman parte de este servicio. Las llamadas a funciones: defines funciones y tu código las ejecuta.
Un script de paridad para tus propios prompts
En lugar de inspeccionar visualmente un puñado de salidas, ejecuta tu conjunto de prompts a través del nuevo endpoint en un bucle y guarda todo lo que necesites revisar.
import csv, json
with open("prompts.json", encoding="utf-8") as f:
prompts = json.load(f) # a list of strings
with open("results.csv", "w", newline="", encoding="utf-8") as out:
w = csv.writer(out)
w.writerow(["prompt", "reply", "in_tokens", "out_tokens"])
for p in prompts:
r = client.chat.completions.create(
model="uncensored",
temperature=0.7,
messages=[{"role": "user", "content": p}],
)
w.writerow([p, r.choices[0].message.content, r.usage.prompt_tokens, r.usage.completion_tokens])
Abre el CSV y revisa una columna a la vez. Las columnas de tokens te dan una previsión de coste para el mismo tráfico: multiplica las sumas por $0,15 y $0,50 por 1M. Una clave de prueba permite 60 peticiones por minuto y 2 a la vez, así que un conjunto de unos cientos de prompts termina en minutos si mantienes el bucle secuencial.
Una breve lista de verificación de migración
- Consigue una clave. En la página de clave de API, regístrate con Google o correo electrónico y reclama el crédito de prueba de $0,50. Dura 7 días y no requiere tarjeta.
- Mueve el nombre del modelo y la URL a la configuración. Un solo lugar, lee desde el entorno.
- Reproduce tus prompts de prueba. Usa de 20 a 50 ejemplos reales, incluyendo los que tu modelo anterior rechazó, y lee los resultados.
- Ajusta el prompt del sistema. Elimina el texto que solo existía para convencer a un modelo con filtros de que respondiera. Mantén lo que describe el rol, la audiencia y el formato.
- Añade un manejador de 429. Espera 5 segundos y reintenta. Limita la concurrencia para que coincida con tu clave.
- Revisa el uso. Vigila
X-Balance-USDen las respuestas mientras ejecutas tráfico real.
Un auxiliar de reintento que cubre el paso 5:
import time
from openai import RateLimitError
def create_with_retry(**kwargs):
for _ in range(4):
try:
return client.chat.completions.create(**kwargs)
except RateLimitError:
time.sleep(5)
raise RuntimeError("rate limited after 4 tries")
Mantén las salidas guardadas del modelo antiguo durante unas semanas. Si un usuario se queja de que algo se siente raro después del cambio, puedes comparar contra lo que habría dicho el modelo antiguo y ver si la diferencia es el prompt, el modelo o la entrada.
Despliegue sin riesgos
No cambies todo a la vez. Pon la elección del proveedor detrás de la configuración para que puedas mover un porcentaje del tráfico y revertir en segundos.
import os, random
from openai import OpenAI
old = OpenAI(api_key=os.environ["OPENAI_API_KEY"])
new = OpenAI(base_url="https://api.chatgptunfiltered.com/v1", api_key=os.environ["UNFILTERED_API_KEY"])
SHARE = float(os.environ.get("NEW_SHARE", "0.05"))
def pick():
if random.random() < SHARE:
return new, "uncensored"
return old, os.environ["OLD_MODEL"]
Empieza con un 5%, vigila tu tasa de errores, los conteos de 429 y la retroalimentación del usuario durante unos días, luego aumentala. Establece NEW_SHARE a 0 para revertir. Elegir por usuario o por función es mejor que elegir por petición cuando las conversaciones deben permanecer en un modelo, ya que cambiar de modelo a mitad del chat cambia la voz.
Qué cuesta y cuándo quedarse
La tarifa es de $0,15 por 1M de tokens de entrada y $0,50 por 1M de tokens de salida, desde el crédito prepago. Una petición con 1.500 tokens de entrada y 400 de salida cuesta 1.500 x $0,15 / 1M = $0,000225, más 400 x $0,50 / 1M = $0,0002, es decir $0,000425, o $0,425 por 1.000 peticiones. Para otros proveedores, revisa sus páginas de precios actuales; las tarifas cambian y una comparación de memoria se desactualiza rápidamente. Las recargas son montos enteros desde $20 hasta $500, pagados en cripto, con bonificaciones desde $50. Detalles en precios.
Quedarse con tu proveedor actual es la decisión correcta si necesitas imágenes o embeddings, si tu audiencia necesita moderación estricta, o si un modelo específico del proveedor es un requisito indispensable. Para información de fondo sobre qué es esta clase de modelos, lee entendiendo los modelos de ChatGPT sin censura. El límite estricto nunca cambia: está prohibido el contenido sexual que involucre a menores de edad.
También es válido ejecutar ambos proveedores lado a lado. Muchos equipos enrutan las solicitudes habituales a un modelo y las solicitudes que siguen generando denegaciones a otro. Como ambos hablan el mismo formato, ese enrutamiento son unas pocas líneas de código y una regla para saber cuándo usar cada uno.
