File size: 3,129 Bytes
9a1014e
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
---
title: Agent API
emoji: 🤖
colorFrom: green
colorTo: green
sdk: docker
pinned: false
---

# Modelos principales
ollama pull llama3.2:3b
ollama pull llava:7b
ollama pull nomic-embed-text    

## Modelo Qwen3-4B-Instruct GGUF local

Al construir la imagen, Docker descarga el GGUF desde
`AlbertiTechnology/qwen3-4b-instruct-gguf` y deja una copia local dentro de la
imagen. Docker ejecuta automaticamente:

```powershell
python download_model.py --download-only --repo AlbertiTechnology/qwen3-4b-instruct-gguf --local-dir MODELS/qwen3-4b-instruct-gguf
```

El modelo queda almacenado en
`/home/user/app/MODELS/qwen3-4b-instruct-gguf/model.gguf` dentro de la imagen y
la app lo ejecuta localmente mediante llama.cpp.

Esta descarga no requiere un token durante el build porque el repositorio es
publico.

## Contexto documental (Chroma)

El agente consulta la coleccion `document_context` de `chroma_db_docs`. Durante
el build de Docker, la base se reconstruye automaticamente usando solamente los
PDF y archivos de metadata ubicados en `documentos/ASTM`.

Para reconstruirla manualmente fuera de Docker, ejecute:

```powershell
venv\Scripts\python.exe index_documents_to_chroma.py --documents-dir "documentos/ASTM" --reset-collection
```

## Despliegue en Hugging Face Spaces

El contenedor ejecuta automaticamente `start_hf.py`. En cada arranque:

1. valida `DATABASE_URL`;
2. valida el modelo local `MODELS/qwen3-4b-instruct-gguf/model.gguf`;
3. valida la base Chroma y comprueba que `document_context` no este vacia;
4. inicia FastAPI/Uvicorn en el puerto `7860`.

Los reinicios del contenedor reutilizan la base creada dentro de la imagen. Cada
nuevo build vuelve a generarla desde `documentos/ASTM`.

Configure en **Settings > Variables and secrets** del Space:

- `DATABASE_URL`: conexion PostgreSQL usada para conversaciones y mensajes.

Los logs del Space muestran el proceso completo sin imprimir secrets:

```text
[2026-07-10T12:00:00Z] [BOOT:START] Starting Hugging Face Space initialization.
[2026-07-10T12:00:00Z] [BOOT:ENV] Required secrets are present (values are not printed).
[2026-07-10T12:00:00Z] [BOOT:CHROMA] Using build-generated document_context collection (119 chunks).
[2026-07-10T12:00:00Z] [BOOT:MODEL] Local Qwen model is available at /home/user/app/MODELS/qwen3-4b-instruct-gguf.
[2026-07-10T12:01:00Z] [BOOT:API] Starting Agent API on 0.0.0.0:7860...
```

Si falta un secret o la base Chroma empaquetada no es valida, el despliegue se
detiene con un mensaje `[BOOT:ERROR]` visible en **Logs**. La API no arranca con
una base incompleta.

## Lanzar el chat del agente

Inicie la API desde la raiz del proyecto:

```powershell
venv\Scripts\python.exe -m uvicorn main:app --host 0.0.0.0 --port 8011 --reload
```

Abra el frontend de chat en `http://127.0.0.1:8011/` (o en
`http://127.0.0.1:8011/ui`). Se usa el puerto 8011 porque en este entorno los
puertos 8000 y 8010 ya estan ocupados por otras instancias.

La API queda disponible mediante `POST http://127.0.0.1:8011/chat` y por
WebSocket en `ws://127.0.0.1:8011/ws/chat`. La documentacion interactiva se
abre en `http://127.0.0.1:8011/docs`.