Documentación
Crush
Crush es el agente de programación para terminal de Charm, no la shell de Rust con el mismo nombre. Su configuración es Bash, así que dirigirlo a otro endpoint requiere añadir un proveedor con un tipo, una URL base y una clave.
La configuración de Crush es Bash — un único `provider add kunavo --type openai-compat --base-url "https://api.kunavo.com/v1"` en un crushrc coloca el agente de terminal de Charm sobre Claude y GPT.
# A crushrc is Bash, not a settings file. Everything here is executed.
provider add kunavo \
--type openai-compat \
--base-url "https://api.kunavo.com/v1" \
--api-key "${KUNAVO_API_KEY:?set KUNAVO_API_KEY}"
model add kunavo/claude-sonnet-5 \
--name "Claude Sonnet 5" \
--context-window 1000000 \
--default-max-tokens 32000 \
--price-input 1.4 \
--price-output 7
model add kunavo/claude-haiku-4-5 \
--name "Claude Haiku 4.5" \
--context-window 200000 \
--default-max-tokens 16000 \
--price-input 0.7 \
--price-output 3.5
model large kunavo/claude-sonnet-5
model small kunavo/claude-haiku-4-5/v1. El ejemplo compatible con OpenAI de la propia documentación de Crush es --base-url "https://api.deepseek.com/v1" y el compatible con Anthropic termina igual; por tanto, el sufijo es una convención del cliente, no una suposición. Si lo omites, el fallo será un 404 y no un error de autenticación.--type openai-compat, no openai. El README establece la diferencia: openai se usa para enviar solicitudes a través de OpenAI mediante un proxy o enrutamiento, mientras que openai-compat se usa para proveedores que no son OpenAI y tienen API compatibles con OpenAI. Kunavo es el segundo caso.crushrc es un script Bash con comandos integrados de Crush, y Crush advierte que es código de confianza: se ejecuta en una shell completa. Esa también es su ventaja: --api-key "$(op read ...)" mantiene la clave fuera del archivo. El antiguo crush.json todavía se carga, pero el README lo marca como obsoleto; por eso, parte de crushrc.sk-kn-) y añade crédito desde $10; las llamadas se pagan con ese saldo y las llamadas fallidas no se facturan. El panel se abre entonces en la configuración de Crush.Paso a paso
- Crea una clave en
/app/keysy cópiala: se muestra una sola vez. Expórtala comoKUNAVO_API_KEYo léela desde un gestor de contraseñas directamente en la configuración. - Coloca el bloque anterior en
~/.config/crush/crushrc. Crush lee./.crushrc, luego./crushrcy después el archivo global, así que un proyecto puede prevalecer sobre la configuración de la máquina; además, un repositorio que hayas clonado puede incluir uno. - Inicia
crushy pulsactrl+lpara abrir el selector de modelos. Las líneasmodel largeymodel smallanteriores ya fijan ambas opciones, así que el selector sirve para cambiar de modelo y no para configurarlo. - Si prefieres no registrar los ids manualmente: el descubrimiento automático se ejecuta cuando la lista de modelos de un proveedor
openai-compatestá vacía o cuando pasas--discover-models true. Kunavo responde aGET /v1/models, así que la lista se completa automáticamente y tus propios camposmodel addprevalecen en caso de conflicto. - Ejecuta una tarea acotada y luego consulta el cargo que tu cuenta registró en
/app/billing. La cifra que aparece en la terminal es un cálculo basado en los números de--price-*que introdujiste; el registro de cargos es la factura.
Comprobado con La sección Custom Providers de Crush el 21 de septiembre de 2026. La configuración de terceros puede cambiar; si el nombre de un campo ya no coincide con lo que ves, esa página es la autoridad, no esta.
Verifica antes de depurar el cliente
Una solicitud determina si el fallo está en el endpoint, la clave o el archivo de configuración. Si devuelve JSON, la misma URL base y la misma clave funcionan en Crush.
# Settles whether a failure is the endpoint, the key, or the client.
curl -sS https://api.kunavo.com/v1/models \
-H "Authorization: Bearer sk-kn-..."Qué ID de modelo introducir en el campo
Todos los modelos de texto están disponibles mediante un ID de modelo; la lista activa está en GET /v1/models, y el catálogo con precios está en la página de modelos. Las tarifas son USD por 1M de tokens, entrada / salida.
| ID de modelo | Entrada / salida de Kunavo | Dónde encaja en Crush |
|---|---|---|
claude-sonnet-5 | $1.40 / $7.00 | la opción de modelo large: el modelo de programación y edición de uso diario |
claude-haiku-4-5 | $0.70 / $3.50 | la opción de modelo small, que Crush usa constantemente para títulos y resúmenes |
claude-opus-5 | $3.50 / $17.50 | cambia a la opción de modelo large para una refactorización en la que un plan equivocado sería costoso |
gpt-5-6-terra | $0.70 / $4.20 | una segunda familia con la misma clave, a solo un model add de distancia |
Preguntas frecuentes
¿Cómo añado un proveedor de API personalizado a la CLI Crush?
Escríbelo en un crushrc, que es Bash con funciones integradas de Crush. Una línea registra el endpoint — provider add kunavo --type openai-compat --base-url "https://api.kunavo.com/v1" --api-key "$KUNAVO_API_KEY" — y un model add por ID registra lo que quieres llamar, con el nombre para mostrar, la ventana de contexto y los precios por millón que Crush usa para su estimación en pantalla. Crush lee ./.crushrc, luego ./crushrc y después ~/.config/crush/crushrc, así que el mismo bloque funciona por proyecto o por máquina.
¿La URL base de Crush debe terminar en /v1?
Sí. Los ejemplos de proveedor personalizado de Crush incluyen el sufijo para ambos tipos: https://api.deepseek.com/v1 para el caso compatible con OpenAI y https://api.anthropic.com/v1 para el compatible con Anthropic. Para una clave de Kunavo, el valor es https://api.kunavo.com/v1. Es lo contrario de Claude Code, donde ANTHROPIC_BASE_URL recibe un origen sin ruta porque ese cliente añade la ruta por sí mismo: misma pasarela, dos formatos, y la ausencia de /v1 produce un 404 en lugar de un 401.
¿Debo usar --type openai o --type openai-compat?
openai-compat, para cualquier pasarela de terceros. El README de Crush reserva openai para enviar o enrutar solicitudes a través del propio OpenAI y dirige a los proveedores que no son OpenAI y tienen API compatibles con OpenAI a openai-compat. El tipo también determina comportamientos más allá del formato de transmisión: la detección automática de modelos se ejecuta para un proveedor openai-compat cuya lista de modelos esté vacía. Crush también admite --type anthropic para endpoints compatibles con Anthropic; este requiere --extra-header anthropic-version 2023-06-01.
¿crush.json sigue siendo el lugar adecuado para esta configuración?
No. crush.json es el formato original y la documentación de Crush ahora lo describe como obsoleto y sin nuevas funciones; el formato actual es crushrc. Ten en cuenta que ambos se ejecutan en lugar de analizarse: un crushrc se ejecuta en un shell completo y cualquier $(...) dentro de crush.json se expande al cargarlo. Por eso la documentación advierte que no se inicie Crush en un directorio cuya configuración no se haya leído, y por eso funciona extraer una clave de un gestor de contraseñas desde la configuración.
¿Por qué el costo que muestra Crush difiere de lo que me cobraron?
Porque son dos cifras distintas que provienen de fuentes diferentes. La estimación en pantalla de un proveedor registrado manualmente es el cálculo aritmético de los valores --price-input y --price-output que escribiste en model add; para los proveedores integrados, proviene de Catwalk, el catálogo externo de proveedores de Crush. Ninguno consulta tu cuenta. Un error tipográfico en una opción --price-* produce una lectura incorrecta, no un cargo incorrecto. Compara el resultado con el registro en /app/billing.
¿Puede Crush usar modelos Claude o GPT mediante un proveedor personalizado?
Sí, y nada en Crush lo restringe. Charm Hyper es el proveedor oficial al que te guía la configuración inicial, pero un proveedor personalizado es una opción documentada de primera clase, sin restricciones de plan, y el ID del modelo se resuelve en el endpoint, no en el cliente. Por tanto, un ID de Claude en un proveedor openai-compat es la combinación prevista: el tipo indica el protocolo de transmisión, no el proveedor.