cc01845acf
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).
79 lines
3.0 KiB
Markdown
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`.
|