--- title: Plenitude Negra Plena emoji: 🧁 colorFrom: purple colorTo: pink sdk: gradio sdk_version: 6.29.1 python_version: "3.12" app_file: app.py pinned: false --- # Plenitude — cĂ©rebro da Negra Plena API FastAPI da assistente **Plenitude**, atendimento da pastelaria **Negra Plena**. Criada pela **Softedge**. O conector WhatsApp (Node, Railway) envia `POST /api/escutar` e recebe `{ "texto": "..." }`. `app.py` serve a API (`main.py`) com uvicorn na porta 7860 e mostra uma interface Gradio de teste em `/`. ## GPU ativada A anotação @spaces.GPU estĂĄ configurada para suportar inferĂȘncia rĂĄpida. ## Hierarquia de provedores (fallback) 1. Llama local (ZeroGPU) → 2. Cerebras → 3. OpenRouter → 4. Groq → 5. DeepSeek → 6. Mistral → 7. Gemini. Cada nĂ­vel que falha cai para o seguinte; `AI_PROVIDER` força um especĂ­fico primeiro. Provedores sem chave sĂŁo saltados. Cerebras tem free tier generoso (1M tokens/dia, sem cartĂŁo; contexto 8K no free): cria a chave em cloud.cerebras.ai e define `CEREBRAS_API_KEY`. Modelos OpenRouter com `:free` tambĂ©m valem como degrau gratuito. Quota ZeroGPU esgotada? O local entra em pausa atĂ© ao reset (lĂȘ o "Try again in" do erro) e o fallback fica imediato — sem esperar o scheduler recusar. O Llama local (`local_llm.py`, `NousResearch/Meta-Llama-3-8B-Instruct` por defeito, LoRA opcional via `LORA_ADAPTER_PATH` — pasta local ou id do Hub, ex. `user/meu-lora`, com download automĂĄtico e confirmação de adaptadores ativos no log) Ă© carregado uma vez e corre no `@spaces.GPU`; se o download falhar (ex. repo gated sem licença + `HF_TOKEN`), cai para as APIs externas. Vars: `LOCAL_MODEL_ID`, `LORA_ADAPTER_PATH`, `HF_TOKEN`. ### Download dos pesos (onde e como confirmar) - Os pesos **nĂŁo** vĂŁo embutidos na imagem Docker (8B em bf16 ≈ 16GB). - No arranque, `app.py` faz o prĂ©-aquecimento: baixa uma vez para o cache do disco (`~/.cache/huggingface`) e os arranques seguintes reutilizam. - Confirme no log do container: `[llama] a carregar ...` → `[llama] modelo pronto.` Se aparecer `[llama] indisponĂ­vel (...)`, leia o motivo (ex. repo gated). - Modelo gated (ex. Meta Llama): aceite a licença na pĂĄgina do modelo no Hub e defina o Secret `HF_TOKEN` com uma conta que tenha acesso. Sem isto, o Llama fica inativo e o bot responde via APIs externas (Groq etc.). - Para prĂ©-baixar na build Docker (opt-in), ver bloco comentado no `Dockerfile`. ## Aprendizado (v1, log local JSONL) - Cada resposta do `/escutar` Ă© registada em `data/conversas.jsonl` e devolve um `mensagem_id`. - Avalie com `POST /api/feedback` (`{"mensagem_id": "...", "nota": "boa"|"ma"}`); casos `"ma"` nunca voltam como exemplo, `"boa"` tem prioridade. - Perguntas parecidas com casos anteriores entram no prompt como exemplos (few-shot). - O ficheiro contĂ©m nĂșmeros de clientes: nunca vai para git e perde-se em factory rebuild. - Vars: `DATA_DIR` (`./data`), `LEARNING_MAX_LINHAS` (2000), `LEARNING_TOP_K` (2). ## Endpoints - `GET /` — interface Gradio de teste - `GET /health` e `GET /api/health` - `POST /api/escutar` ou `POST /escutar` - `POST /api/feedback` ou `POST /feedback` - `GET /docs` — OpenAPI