Files
llm_cli/app.md
T
agent cc01845acf feat: llm_cli — CLI autocontenida para chatear con Claude
Un solo archivo (llm.py) que habla directo con la API de Anthropic Messages
usando el token OAuth que Claude Code guarda en ~/.claude/.credentials.json.
Sin servidor, sin arranque: chat interactivo con memoria, one-shot, pipe, y
bucle de tools propias (run_tool_loop). Empaqueta standalone la logica del
grupo claude-direct del registry para poder distribuirla (basta llm.py +
README.md, el receptor solo necesita httpx + Claude Code logueado).
2026-06-05 00:15:52 +02:00

79 lines
3.0 KiB
Markdown

---
name: llm_cli
lang: py
domain: core
version: 1.0.0
description: "CLI minima y autocontenida para chatear con Claude desde la terminal usando el token OAuth que Claude Code guarda en la maquina. Un solo archivo (llm.py), sin servidor ni dependencias mas alla de httpx. Chat interactivo con memoria, one-shot, pipe, y bucle de tools propias. Pensada para distribuir: se copia y se ejecuta."
tags: [cli, claude, llm, anthropic, oauth, chat, standalone, distributable]
uses_functions: []
uses_types: []
framework: ""
entry_point: "llm.py"
dir_path: "apps/llm_cli"
icon:
phosphor: "terminal-window"
accent: "#a855f7"
e2e_checks:
- id: imports
cmd: "python3 -c 'import llm; assert callable(llm.stream_messages) and callable(llm.run_tool_loop)'"
timeout_s: 15
- id: help
cmd: "python3 llm.py --help"
expect_stdout_contains: "interactive chat"
timeout_s: 15
---
# llm_cli
CLI autocontenida para chatear con Claude desde la terminal. Empaqueta en un solo archivo
(`llm.py`) la logica del grupo de funciones `claude-direct` del registry, para poder copiarla y
distribuirla sin necesidad del registry.
## Que es
`llm.py` habla directamente con la API de Anthropic Messages usando el token OAuth que Claude Code
guarda en `~/.claude/.credentials.json`. No lanza ningun proceso claude ni mantiene servidor:
arranque instantaneo, respuesta en streaming.
Es una **version standalone** (codigo copiado, no importado) de las funciones del registry
`load_claude_oauth_token_py_core`, `stream_anthropic_messages_py_core` y
`run_claude_tool_loop_py_core`. Por eso `uses_functions` esta vacio: la app no depende del registry
en runtime — todo vive en `llm.py` para que sea distribuible.
## Uso
```bash
pip install httpx
python3 llm.py # chat interactivo (con memoria)
python3 llm.py "que es Go en una frase" # one-shot
echo "resume esto: ..." | python3 llm.py # pipe
python3 llm.py --model claude-opus-4-8 "..." # elegir modelo
```
Comandos del chat: `/model <id>`, `/system <texto>`, `/reset`, `/exit`.
## Tools propias
`llm.run_tool_loop(messages, tools, dispatch, ...)` corre un bucle agentico donde el usuario define
sus tools (definiciones Anthropic) y el `dispatch` que las ejecuta. Ver `README.md` para el ejemplo
completo.
## Distribuir
Para enviarsela a alguien: basta `llm.py` + `README.md`. El receptor instala `httpx`, tiene Claude
Code logueado, y ejecuta `python3 llm.py`. Nada mas.
## Requisitos
- Python 3.9+, `httpx`.
- Claude Code instalado y con sesion iniciada (provee `~/.claude/.credentials.json`).
## Gotchas
- **Rate limits**: el plan limita la frecuencia; en rafagas se reciben `HTTP 429`. Espacia las
llamadas o usa `claude-haiku-4-5-20251001` (mas cuota) para uso frecuente.
- **Token expirado**: normalmente Claude Code lo refresca en background. Si la CLI lleva mucho
cerrada, abrela una vez para refrescar el token.
- **Modelo**: `claude-opus-4-8` es valido; ids con sufijo de fecha inexistente dan `404`.