Demo didáctica de un agente de código construido desde cero con Gemini 3.5 Flash. Sin LangChain, sin LlamaIndex, sin frameworks: solo el SDK oficial google-genai y un bucle agéntico hecho a mano.
Pensado como material del curso de agentes para que los estudiantes vean cuáles son los componentes mínimos de un agente y cómo se conectan entre sí.
Es un agente de terminal que conversa contigo en español y puede:
- Listar directorios
- Leer archivos
- Crear / sobrescribir archivos
- Ejecutar scripts de Python
- Instalar paquetes con
pip - Abrir HTML/JS en el navegador (Chromium nativo, con fallback a Chrome de Windows en WSL)
Tú escribes una petición y el modelo decide qué herramientas usar, las encadena, y al final te responde en texto plano.
Cualquier agente que veas en el mundo real (Claude Code, Cursor, AutoGPT…) tiene estas mismas piezas. Aquí están una por archivo para que se vean claras:
| # | Componente | Archivo | Qué es |
|---|---|---|---|
| 1 | Herramientas | tools.py |
Funciones de Python que tocan el mundo (archivos, subprocesos, navegador). |
| 2 | Esquemas | schemas.py |
JSON Schema que describe cada herramienta. Es lo único del agente que ve el LLM. |
| 3 | Registro | schemas.py |
Mapa "nombre" → función Python. |
| 4 | System Prompt | agent.py |
Instrucciones permanentes: personalidad, reglas, contexto. |
| 5 | Bucle agéntico | agent.py |
El corazón: llama al LLM, ejecuta tools, retroalimenta, repite. |
| 6 | Memoria + REPL | jose_code.py |
Historial de la conversación + interfaz de terminal. |
jose_code.py ← entry point: memoria + REPL
│
├─ agent.py ← [4] system prompt + [5] bucle agéntico
│ │
│ └─ schemas.py ← [2] esquemas JSON + [3] registro
│ │
│ └─ tools.py ← [1] funciones que tocan el mundo
│
└─ ui.py ← colores, banner, /help
Es lo que distingue a un agente de un chat normal. Cuando le mandas una petición:
usuario escribe
│
▼
┌────────────────┐
│ append a │
│ history │
└────┬───────────┘
▼
┌────────────────────────────┐
│ llamar al LLM con: │ ◄─────┐
│ · system_prompt │ │
│ · tool declarations │ │ (volvemos aquí
│ · TODO el history │ │ después de
└────┬───────────────────────┘ │ ejecutar tools)
▼ │
¿el LLM pidió funciones? │
│ │ │
│ no │ sí │
▼ ▼ │
return ejecutar cada función │
texto → guardar resultados ──────┘
El código está en run_agent() dentro de agent.py, bien comentado paso a paso.
Necesitas Python 3.10+ y una API key de Google AI Studio.
# 1. Clona el repo
git clone https://github.com/joseIronMaker/jose-code.git
cd jose-code
# 2. Crea un venv (recomendado)
python3 -m venv .venv
source .venv/bin/activate # en Windows: .venv\Scripts\activate
# 3. Instala las dependencias
pip install google-genai python-dotenv
# 4. Configura tu API key
cp .env.example .env
# edita .env y pega tu GEMINI_API_KEY
# 5. Corre el agente
python jose_code.pyjose › instala cowsay y haz un script vaca.py que use cowsay para decir "hola jose"
→ pip_install({'packages': 'cowsay'})
OK: cowsay instalado
→ edit_file({'path': 'vaca.py', 'content': '...'})
OK: escritos 39 caracteres en vaca.py
→ run_python({'path': 'vaca.py'})
(exit=0)
_________
| hola jose |
=========
\
\
^__^
(oo)\_______
(__)\ )\/\
||----w |
|| ||
jose_code › Instalé cowsay, creé vaca.py y lo ejecuté.
El agente decidió solo que necesitaba instalar el paquete, escribir el script, y luego correrlo — tú nada más le dijiste el objetivo final.
| Comando | Qué hace |
|---|---|
/help |
muestra la ayuda |
/clear |
borra el historial de la conversación (amnesia voluntaria) |
salir |
termina (también Ctrl+C o Ctrl+D) |
- Modelo:
gemini-3.5-flashvíagoogle-genai - Configuración:
python-dotenvpara cargar.env - Función calling: nativo de Gemini, sin abstraction layer
No hay LangChain, ni LangGraph, ni LlamaIndex, ni pydantic-ai, ni nada que esconda el flujo. La idea es ver el agente "desnudo".
Material del curso de agentes. Úsalo, modifícalo, rómpelo y arréglalo.