Documentación

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.

~/.config/crush/crushrc
# 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
La URL base conserva el sufijo /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.
Usa --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.
Un 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.
Kunavo no ha probado Crush en tiempo de ejecución; tampoco ha probado este cliente ni ningún otro de estas páginas. Lo que se comprueba aquí es la configuración documentada por Crush comparada con el endpoint que publica Kunavo; una guía de configuración no es un resultado de prueba. Ejecuta una tarea acotada antes de convertirlo en tu herramienta de uso diario.
¿Aún no tienes una clave? Crea una cuenta de Kunavo, genera una clave (empieza por 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

  1. Crea una clave en /app/keys y cópiala: se muestra una sola vez. Expórtala como KUNAVO_API_KEY o léela desde un gestor de contraseñas directamente en la configuración.
  2. Coloca el bloque anterior en ~/.config/crush/crushrc. Crush lee ./.crushrc, luego ./crushrc y 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.
  3. Inicia crush y pulsa ctrl+l para abrir el selector de modelos. Las líneas model large y model small anteriores ya fijan ambas opciones, así que el selector sirve para cambiar de modelo y no para configurarlo.
  4. Si prefieres no registrar los ids manualmente: el descubrimiento automático se ejecuta cuando la lista de modelos de un proveedor openai-compat está vacía o cuando pasas --discover-models true. Kunavo responde a GET /v1/models, así que la lista se completa automáticamente y tus propios campos model add prevalecen en caso de conflicto.
  5. 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.

Esta es la versión breve. El tutorial completo —elección del modelo, coste de una sesión real y modos de fallo— está en Crush y OpenCode.

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 modeloEntrada / salida de KunavoDónde encaja en Crush
claude-sonnet-5$1.40 / $7.00la opción de modelo large: el modelo de programación y edición de uso diario
claude-haiku-4-5$0.70 / $3.50la opción de modelo small, que Crush usa constantemente para títulos y resúmenes
claude-opus-5$3.50 / $17.50cambia 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.20una segunda familia con la misma clave, a solo un model add de distancia
La facturación es por token desde un saldo prepago, sin cuota mensual; consulta facturación. Con contexto repetido —que constituye la mayor parte de lo que envía un editor o cliente de chat—, la caché de indicaciones cambia más la factura que la elección del modelo.

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.