BotSpace / plan.md
profgabrielramos's picture
Upload folder using huggingface_hub
1a0b19c verified
# Plano Validado (Context7): HF Spaces + HF CLI + Jobs
Este plano foi corrigido com base nas boas praticas documentadas no Hugging Face Hub/CLI via Context7.
## 1) Arquitetura recomendada
- `Space (Docker)`: roda o bot Discord e serve consultas RAG.
- `HF Job`: reconstrói o indice FAISS sob demanda ou por agendamento.
- `Dataset repo (Hub)`: armazena os artefatos versionados do indice (`faiss.index`, `meta.json`, `manifest.json`).
Motivo: o acoplamento direto de volume entre Space e Job nao deve ser assumido. Para integracao confiavel entre componentes, use artefato no Hub.
## 2) Persistencia correta no Space
No Space, habilite Persistent Storage em `Settings > Hardware`.
Use os caminhos abaixo:
- `HF_HOME=/data/.huggingface`
- `LOCAL_STORAGE_DIR=/data/storage`
Observacao:
- `/data` e o caminho de volume persistente em Spaces.
- qualquer dado fora de `/data` pode ser efemero.
## 3) Fluxo operacional (producao)
### 3.1 Build de indice (Job)
1. Job baixa os documentos (repo/dataset/origem definida).
2. Job gera `faiss.index` + `meta.json`.
3. Job publica artefatos no dataset de indices (com commit e tag/revisao).
4. Job atualiza `manifest.json` com `revision`, `created_at`, `embed_model`, `num_chunks`.
### 3.2 Consumo no Space
1. Bot inicia.
2. Bot baixa o ultimo artefato aprovado do dataset.
3. Bot salva localmente em `/data/storage` para cache quente.
4. Bot consulta `manifest.json` periodicamente e faz hot-reload quando `revision` muda.
Resultado:
- sem depender de restart para atualizar base;
- rollback simples por revisao/tag do dataset.
### 3.3 Envio de `@docs_rag` para estrutura HF
Padrao recomendado: separar fonte documental e artefato de indice.
- Dataset 1 (fonte): `<org-ou-user>/rag-docs`
- Dataset 2 (indice): `<org-ou-user>/rag-index`
Estrutura no Hub:
- `rag-docs/docs_rag/...` (originais .pdf/.doc/.docx/.rtf)
- `rag-index/artifacts/faiss.index`
- `rag-index/artifacts/meta.json`
- `rag-index/artifacts/manifest.json`
Comandos para publicar `./docs_rag`:
```bash
# criar dataset de documentos (uma vez)
hf repo create <org-ou-user>/rag-docs --repo-type dataset --private
# upload completo da pasta local docs_rag para /docs_rag no dataset
hf upload <org-ou-user>/rag-docs ./docs_rag docs_rag --repo-type dataset --commit-message "docs: carga inicial"
```
Incremental (atualizacoes futuras):
```bash
hf upload <org-ou-user>/rag-docs ./docs_rag docs_rag --repo-type dataset --commit-message "docs: update <timestamp>"
```
Upload otimizado (filtro e higiene):
```bash
hf upload <org-ou-user>/rag-docs ./docs_rag docs_rag \
--repo-type dataset \
--commit-message "docs: update <timestamp>" \
--exclude "**/.DS_Store" \
--exclude "**/Thumbs.db" \
--exclude "**/~$*" \
--exclude "**/*.tmp" \
--exclude "**/*.log" \
--exclude "**/__pycache__/**"
```
Upload otimizado com whitelist de extensoes (recomendado):
```bash
hf upload <org-ou-user>/rag-docs ./docs_rag docs_rag \
--repo-type dataset \
--commit-message "docs: update <timestamp>" \
--include "**/*.pdf" \
--include "**/*.doc" \
--include "**/*.docx" \
--include "**/*.rtf" \
--exclude "**/.DS_Store" \
--exclude "**/Thumbs.db" \
--exclude "**/~$*"
```
Opcional para acervo muito grande (lote por pasta):
```bash
hf upload <org-ou-user>/rag-docs ./docs_rag/legislacao_grifada_e_anotada_atualiz_em_01_01_2026 docs_rag/legislacao_grifada_e_anotada_atualiz_em_01_01_2026 --repo-type dataset --commit-message "docs: lote legislacao"
hf upload <org-ou-user>/rag-docs ./docs_rag/sumulas_tse_stj_stf_e_tnu_atualiz_01_01_2026_2 docs_rag/sumulas_tse_stj_stf_e_tnu_atualiz_01_01_2026_2 --repo-type dataset --commit-message "docs: lote sumulas"
```
Observacoes operacionais:
- o Job deve ler da pasta `docs_rag/` no dataset de documentos.
- o Job publica o resultado no dataset de indice (`rag-index`).
- o Space nunca depende diretamente do filesystem do Job.
## 4) Comandos HF CLI (baseline)
## 4.1 Autenticacao e diagnostico
```bash
hf auth whoami
hf env
```
## 4.2 Criar repo de artefatos (dataset)
```bash
hf repo create <org-ou-user>/rag-index --repo-type dataset --private
```
## 4.3 Upload de artefatos do indice
```bash
hf upload <org-ou-user>/rag-index ./artifacts . --repo-type dataset --commit-message "reindex: <timestamp>"
```
## 4.4 Rodar Job manual
```bash
hf jobs run python:3.12 python ingest_job.py
```
## 4.5 Agendar Job
Use os comandos de agendamento de jobs (`hf jobs scheduled ...`) para periodicidade (ex.: diario).
## 5) Variaveis e segredos
### 5.1 Space (Variables)
- `HF_HOME=/data/.huggingface`
- `LOCAL_STORAGE_DIR=/data/storage`
- `INDEX_REPO_ID=<org-ou-user>/rag-index`
- `INDEX_REPO_TYPE=dataset`
- `INDEX_POLL_SECONDS=60`
### 5.2 Space/Job (Secrets)
- `HF_TOKEN` (escopo minimo necessario)
- `OPENROUTER_API_KEY`
- `DISCORD_TOKEN`
Regra:
- nunca commitar token no repo;
- sempre usar Secrets do Space/Job.
## 6) Checklist de robustez
- validar autenticacao antes de operacoes: `hf auth whoami`.
- validar ambiente com `hf env`.
- publicar indice com metadados (`manifest.json`).
- fazer pinagem por revisao para reproducibilidade.
- manter estrategia de rollback (tag da ultima versao estavel).
- registrar logs de reindex e troca de revisao no bot.
## 7) Custo e desempenho
- Space CPU pequeno atende bem para consulta RAG leve.
- Reindex em Job CPU normalmente e suficiente.
- `/data` reduz redownload ao manter cache com `HF_HOME`.
- separar inferencia (OpenRouter) da indexacao reduz custo total.
## 8) Criticos corrigidos neste plano
- removida suposicao de persistencia em `storage/` fora de `/data`.
- removida suposicao de compartilhamento direto de volume entre Space e Job.
- adicionada camada de artefato versionado no Hub para sincronizacao segura.
- adicionadas operacoes minimas de CLI para auditoria e rollback.