CI License: MIT Python 3.12+ FastAPI Tests Docker 100% Local
Un RAG que corre 100% en local con tu RX 9070 XT de 16 GB: ingerí videos de YouTube (idealmente de CBUM y su equipo), y luego preguntale por rutinas, técnica, volumen, y el porqué de cada cosa. Cada respuesta cita el video y el minuto exacto de donde salió la información.
YouTube ──▶ yt-dlp ──▶ Whisper (transcripción) ──▶ chunks con timestamp
│
chat ◀── Qwen3-14B (llama.cpp Vulkan) ◀── retrieval ◀── embeddings + store local
Chat Inicial Chat Respuesta Biblioteca
- La RX 9070 XT (RDNA4) tiene soporte ROCm flojo en Windows. El backend Vulkan de llama.cpp es la opción probada: corre ~20-29% más rápido que ROCm, funciona nativo en Windows y usa toda la GPU.
- Qwen3-14B Q4_K_M (~9.3 GB): cabe holgado en 16 GB junto a la caché KV de 8K de contexto, razona muy bien el "porqué", y habla español e inglés excelente (ideal: vos preguntás en español, el contenido de los videos está en inglés).
- nomic-embed-text-v1.5 para embeddings: chico, rápido y excelente calidad.
- Todo el stack (transcripción, embeddings, LLM, store) es local. No sale ni un byte a la nube.
| Requisito | Cómo verificarlo / instalarlo |
|---|---|
| Python 3.10+ | python --version |
| ffmpeg | winget install Gyan.FFmpeg (necesario para extraer audio) |
| GPU AMD con driver reciente + Vulkan | vulkaninfo --summary |
llama-server (Vulkan build) |
Descargá llama-bXXXX-bin-win-vulkan-x64.zip de llama.cpp releases, extraé llama-server.exe a scripts/ o agregalo al PATH |
scripts\setup.bat REM crea venv e instala dependencias scripts\download_models.bat REM baja Qwen3-14B + nomic-embed (~10 GB) scripts\start_engine.bat REM arranca 2 instancias de llama-server (Vulkan) venv\Scripts\python -m uvicorn backend.main:app --port 8000
Abrí http://127.0.0.1:8000 🚀
Linux: scripts/start_engine.sh reemplaza al .bat de arranque (instalá
llama.cpp con -DGGML_VULKAN=ON).
-
Añadí contenido: pegá la URL de un video, una playlist, un canal o una búsqueda (por ejemplo
https://www.youtube.com/results?search_query=chris+bumstead). Para canales/playlists/búsquedas elegí cuántos videos procesar (por defecto 5). La ingestión descarga el audio, transcribe con Whisper, fragmenta con timestamps y genera embeddings — todo en el background, con barra de progreso en la sidebar.Nota: el handle
@cbumtiene un quirk del lado de YouTube/yt-dlp (la tab de videos no se expone). Usá la URL de búsqueda, el canal por ID (/channel/UC4514FwdRy5gI6CdC9GPb0w/videos) o videos sueltos. Si YouTube responde 403 al descargar:venv\Scripts\python -m pip install -U yt-dlp. -
Preguntá cosas como:
- "Dame una rutina de push de 4 días como la de CBUM"
- "¿Por qué prefiere poco volumen pero mucha intensidad?"
- "Explica la técnica del press inclinado con mancuernas"
-
Cada respuesta muestra chips de fuente con el minuto exacto — clickeá y se abre YouTube justo en ese momento del video.
Editalo en config.json y scripts/start_engine.bat:
| Modelo | VRAM aprox. | Para qué |
|---|---|---|
Qwen3-14B-Q4_K_M (default) |
~11 GB | Mejor razonamiento y español |
Qwen3-8B-Q4_K_M |
~6 GB | Más velocidad y contexto, casi tan bueno |
gemma-3-12b Q4 |
~8 GB | Alternativa sólida |
Transcripción: cambiá whisper_model en config.json (small = más rápido,
large-v3 = más preciso). La transcripción corre en CPU (faster-whisper); para
acelerarla con la GPU se puede usar whisper.cpp con Vulkan.
| Clave | Default | Qué hace |
|---|---|---|
enable_thinking |
false |
Qwen3 razona antes de responder por defecto. Con false responde directo (más rápido, ideal para coach); con true da respuestas más elaboradas pero más lentas |
whisper_model |
medium |
Tamaño de Whisper para transcribir (tiny es ~5x más rápido, ideal para probar; medium/large-v3 para producción) |
top_k |
8 |
Fragmentos recuperados por pregunta |
chunk_chars |
900 |
Tamaño de cada fragmento del transcript |
Nota: si re-ingestás videos cambiando whisper_model, los nuevos reemplazan a
los viejos en la biblioteca (no se duplican).
backend/
main.py FastAPI: chat RAG (SSE streaming), ingestión, health, UI
llm.py Cliente OpenAI-compatible (funciona con llama.cpp u Ollama)
store.py Vector store local (numpy + JSON, sin dependencias nativas)
ingest.py yt-dlp → audio → Whisper → chunks → embeddings
transcribe.py faster-whisper (fallback openai-whisper)
prompts.py System prompt + armado de contexto con citas
web/ UI vanilla JS/CSS premium (sin build, sin CDN, fuentes locales)
scripts/
start_engine.bat / .sh llama-server chat (:8080) + embeddings (:8081)
mock_engine.py Motor simulado para probar la app sin GPU
data/ Audio, caché de Whisper, biblioteca vectorial (generado)
- "Motor sin conexión" en la UI → no está corriendo
llama-server, o apuntan a otros puertos. Revisáscripts/start_engine.batyconfig.json. - Errores de Vulkan al cargar → actualizá el driver de AMD (Adrenalin) y usá el build Vulkan más reciente de llama.cpp.
- Muy lento transcribiendo → usá
whisper_model: "small"enconfig.json. - Querés probar la UI antes de bajar 10 GB →
venv\Scripts\python scripts/mock_engine.pyy listo (respuestas simuladas). Ojo: los videos ingeridos con el mock quedan con embeddings falsos; borralos y re-ingestalos cuando corras el motor real. - Ollama en vez de llama.cpp → apuntá
chat_urlyembed_urla tu Ollama (http://127.0.0.1:11434/v1) y usá los nombres de modelo que tengas (qwen3:14b,nomic-embed-text).
Ver DEPLOY.md para guías de deploy (Local, Docker, Railway).
IronMind puede equivocarse o alucinar. Es una herramienta de apoyo: contrastá siempre con las fuentes citadas y con profesionales. No es consejo médico.
- 100% local — Ningún dato sale de tu máquina
- Sin dependencias cloud — Todo corre en tu GPU
- Configuración segura — Secrets en
.env(nunca en código) - Datos en disco — Biblioteca almacenada localmente
Ver SECURITY.md para más detalles.
cd backend
python -m pytest -vVer CONTRIBUTING.md para guías de desarrollo.
MIT © 2026 Alejo Fernandez — ver LICENSE.