# Instrucciones para Claude Code — mi IA en Runpod

Este archivo acompaña un tutorial para macOS/Linux, dirigido a personas sin conocimientos previos y a programadores con experiencia. El usuario dirige el recorrido con prompts; Claude ejecuta los pasos técnicos. El usuario es principiante: explica una idea por vez y verifica cada acción. Trabaja solo con el pod que creemos para esta carpeta. No programes tareas, no envíes feedback o notificaciones y no cambies otros recursos.

## Interacción del curso

El espectador dirige con prompts, no copia comandos de diagnóstico ni configuración línea por línea. Ejecuta tú las comprobaciones, instalación de herramientas, configuración MCP y petición de API. Explica el propósito y pide solo autorizaciones necesarias. Requisito previo: Claude Code ya instalado y autenticado; si no existe, la guía inicial oficial debe resolverse antes de este flujo. No afirmar que puedes instalarte antes de estar disponible.

Tras leer estas instrucciones desde la carpeta con los tres archivos, revisa el sistema e instala herramientas faltantes con la autorización necesaria. Si se pide conectar Runpod, usa el endpoint oficial https://mcp.getrunpod.io/ y la configuración compatible del CLI instalado; consulta ayuda cuando haga falta. Comando de configuración para que ejecutes tú: claude mcp add --transport http runpod --scope user https://mcp.getrunpod.io/. Guía al usuario solo para OAuth y cuenta; si el MCP requiere nueva conversación, indícalo y comprueba después la conexión. No pedirle que copie comandos que puedes ejecutar.

## Herramientas

Locales: Terminal, curl, OpenSSH (ssh, ssh-keygen, scp), Claude Code autenticado, MCP oficial Runpod remoto. No requiere Node/npm para ese MCP. Comprueba herramientas con command -v; si falta una, identifica la distribución Linux y da la instrucción correspondiente. No ejecutes sudo sin explicar la instalación que se necesita.

Remotas: imagen oficial ollama/ollama, Ollama, Python3, FFmpeg, ffprobe y openssh-server. Los tres archivos del curso son INSTRUCCIONES.md, chat_server.py y demo_tools.py. El chat propio está en chat_server.py; demo_tools.py implementa la herramienta de FFmpeg con Python estándar. Deben estar juntos en la carpeta local. Es una demo para uso personal por túnel SSH.

## Antes de gastar

1. Consulta pods existentes y tarifas actuales con el MCP oficial. Verifica la cuenta antes de OAuth.
2. Ruta objetivo pendiente de validación completa: una GPU Secure con al menos 24 GB de VRAM y disco de red estándar en el MISMO centro de datos. Ejemplo de tarifa consultada: RTX 4090 en EU-RO-1 a US$0.89/h; no garantiza stock ni precio futuro. La evidencia previa de texto, código y FFmpeg corresponde a A40 con disco local; no atribuirle pruebas de chat ni reapertura con disco de red.
3. Propón un solo pod llamado mi-ia-ollama, contenedor de 20 GB y disco de red estándar de 20 GB montado en /workspace. Consulta capacidad compatible GPU+disco en el mismo centro de datos. Muestra GPU, RAM y vCPU asignadas, tarifa GPU, contenedor y disco persistente. No crear hasta que el usuario acepte la cotización concreta. No sustituir GPU ni subir costo silenciosamente. Si se creó un disco y falla la creación del pod, informa su ID y elimina ese disco nuevo si no contiene datos que deban conservarse.
4. Solo el pod y su disco de red identificados. No clusters, endpoints serverless, planes de ahorro, plantillas permanentes ni otros recursos. No tocar recursos existentes ajenos. Registrar inmediatamente cada ID creado.

## Preparación

- Genera en esta carpeta privada una llave ed25519 exclusiva si no existe, sin sobrescribir otras. Permisos600 para privada y700 para su carpeta. No imprimir clave privada, no subirla, no guardarla en Git. Solo la pública entra al pod.
- Usa create-pod del MCP; describe-tool para esquema actual. Imagen ollama/ollama:latest; registra digest/versión observada. Una GPU elegida, cloud SECURE, contenedor 20 GB, networkVolumeId del disco estándar de 20 GB y su mismo dataCenterId, montaje en /workspace, puerto 22/tcp,entrypoint[/bin/bash,-lc],cmd una lista con un solo comando completo. Conserva los modelos en/workspace/models.
- Env OLLAMA_HOST=127.0.0.1:11434,OLLAMA_MODELS=/workspace/models,OLLAMA_CONTEXT_LENGTH=65536,OLLAMA_NUM_PARALLEL=1. La capacidad máxima del modelo NO obliga a usarla.
- Arranque repetible: set -e; export DEBIAN_FRONTEND=noninteractive; apt-get update; instalar openssh-server,ffmpeg,python3,curl,ca-certificates; crear/run/sshd,/root/.ssh,/workspace/models; authorized_keys con pública exclusiva,permisos700/600; ssh-keygen -A; sshd con PermitRootLogin=prohibit-password,PasswordAuthentication=no,KbdInteractiveAuthentication=no.
- Incrusta el contenido EXACTO de chat_server.py como base64 en el comando para escribir/workspace/chat_server.py. No es un secreto. Lee el archivo local y codifícalo; no inventar contenido ni pedir al usuario que copie el bloque gigante.
- Copia también el contenido exacto de demo_tools.py a /workspace/demo_tools.py mediante transferencia protegida o base64 leído del archivo local. No inventes su contenido.
- Ejecuta python3 /workspace/chat_server.py en segundo plano; ollama serve en segundo plano; espera/api/tags; ollama pull qwen3.5:9b; wait al PID de ollama serve. No usar systemd dentro del contenedor. Bootstrap se repetirá al crear un nuevo pod con el mismo disco; archivos y modelos viven en el disco de red. La descarga debe reutilizar los modelos existentes. No dejar datos que se quieran conservar solo en el disco temporal del contenedor.
- Guarda IDs de pod y disco de red, centro de datos, GPU y configuración NO SECRETA en ESTADO-POD.md. Registra qué pruebas se ejecutaron y cuáles faltan; no certificar la ruta completa por una creación exitosa. Si create da timeout, lista pods antes de reintentar para evitar duplicados.

## Comprobar y abrir

- Consulta estado y conexión con get-pod. RUNNING no basta: espera acceso SSH y verifica ollama --version,ollama list,ollama ps después de una pregunta,nvidia-smi,ffmpeg -version. La RAM del host de free -h no necesariamente es la asignada: revisa dato Runpod/límite del contenedor.
- Usa IP y puerto devueltos en ese momento. La primera host key se registra en known_hosts exclusivo de esta carpeta; explica y verifica el destino. No uses StrictHostKeyChecking=no.
- Comprueba puertos locales11435 y8085 libres. Túnel:

```bash
ssh -N -L 127.0.0.1:11435:127.0.0.1:11434 -L 127.0.0.1:8085:127.0.0.1:8080 -i RUTA_CLAVE -p PUERTO root@IP
```

- No exponer11434/http ni8080/http públicamente. Chat en http://127.0.0.1:8085; API en http://127.0.0.1:11435/api/chat. Esto permite apps en ESTA computadora. Otras computadoras necesitan su conexión protegida o un gateway autenticado, fuera de esta demo.
- Abre chat, comprueba estado listo y una pregunta real. Si falla, diagnostica pod→sshd→túnel→Ollama→modelo, sin crear otro pod por reflejo.
- Ejecuta tú una petición desde una app distinta del chat usando curl; el espectador solo la solicita con un prompt. Guarda respuesta real. No incluir claves en comandos compartidos.

## Pruebas

- Texto frío y caliente: medir duración completa por separado; no confundir con primer token.
- Imagen propia conocida con tres figuras grandes; comparar respuesta con contenido. El modelo puede equivocarse. No mostrar un resultado de maqueta como si fuera una respuesta real.
- Código pequeño: genera función y ejecuta casos. No basta con escribir código.
- Herramienta de video: ejecuta python3 /workspace/demo_tools.py en el pod y confirma que el modelo pide una función; un ejecutor autorizado corre FFmpeg en el pod; ffprobe y reproducción verifican resultado. FFmpeg edita/compone; no afirmar que genera escenas realistas por IA.

## Cerrar el cómputo y volver

- Antes de eliminar el pod, verifica que modelos, chat y archivos necesarios estén en /workspace, en el disco de red correcto. Informa que el disco temporal del contenedor se pierde.
- Elimina solo el ID del pod guardado con delete-pod, conservando el disco de red. Consulta hasta confirmar ausencia del pod; verifica que el disco permanece y muestra su tarifa. No usar stop/start del mismo pod como ruta enseñada.
- Para volver: consulta GPU compatible disponible en el mismo centro de datos del disco. Muestra una cotización nueva; tras aceptación crea un pod con el mismo networkVolumeId y bootstrap. No cambiar región ni borrar el disco si falta capacidad; informa alternativas antes de actuar.
- Revalida conexión, descarga conservada, GPU, chat y API. Actualiza ID/IP/puerto en ESTADO-POD.md y reconstruye el túnel. Las llaves host del contenedor pueden cambiar: verifica identidad y destino antes de actualizar solo esa entrada en known_hosts privado. No desactives la verificación global.
- No afirmar que este ciclo está validado hasta ejecutar y registrar creación, cierre de cómputo, nueva creación con mismo disco y pruebas del servicio.

## Eliminar definitivamente

- Descarga los archivos elegidos antes de eliminar. Explica que borrar el disco de red borra los modelos y archivos guardados en él.
- Elimina solo los IDs de pod y disco de red guardados para esta demo. El disco de red requiere eliminación separada después de quitar el pod que lo usa.
- Consulta pods y volúmenes de red para verificar la ausencia de ambos IDs. No tocar recursos ajenos. Cierra el túnel local y registra evidencia sin secretos en ESTADO-POD.md.

## Ejemplo de costo, sujeto a cotización

RTX 4090 Secure EU-RO-1 a US$0.89/h, 90 h/mes: US$80.10 GPU + aproximadamente US$0.25 por contenedor de 20 GB durante esas horas + US$1.40 por disco de red estándar de 20 GB conservado un mes = US$81.75/mes, sin impuestos ni Claude. Este ejemplo supone que se elimina el pod al terminar cada sesión, conservando solo el disco de red. Incluye en las horas facturadas preparación, descargas y esperas con pod encendido. Consulta las tarifas actuales antes de aceptar.
