ViniciusKhan/analytical_force
<!-- O bloco acima é o metadata do Hugging Face Spaces. Não remova ao publicar no HF. -->
<div align="center">
<img src="https://capsule-render.vercel.app/api?type=waving&color=0:2563eb,100:4f46e5&height=210§ion=header&text=Analytical-Force&fontSize=54&fontColor=ffffff&fontAlignY=36&desc=Salesforce%20%E2%86%92%20IA%20%E2%86%92%20Diagn%C3%B3stico%20executivo%20di%C3%A1rio&descSize=18&descAlignY=56" width="100%" alt="Analytical-Force"/>
<img src="https://readme-typing-svg.demolab.com?font=Segoe+UI&weight=600&size=22&duration=3200&pause=700&color=2563EB¢er=true&vCenter=true&width=720&lines=Python+calcula.;IA+interpreta.;Turso+armazena.;Salesforce+fornece+os+dados." alt="typing" />
<br/><br/>
<!-- Badges dinâmicos: ajuste o caminho do repositório se o seu for diferente. -->
</div>
<div align="center">
🤖 Transforma dados do Salesforce em diagnóstico executivo diário, alertas de risco e ações recomendadas — com IA, banco Turso e entrega por e-mail e ClickUp.
</div>
Princípio central · Python calcula · IA interpreta · Turso armazena · Salesforce fornece os dados. A IA nunca calcula indicadores — recebe um JSON com métricas prontas e produz a narrativa. O Salesforce opera em modo somente leitura.
🧭 Índice
<table> <tr> <td>
</td> <td>
</td> <td>
</td> </tr> </table>
✨ Recursos
🏗️ Arquitetura
flowchart LR
SF[("☁️ Salesforce<br/>somente leitura")] -->|OAuth + SOQL| EX[Extratores<br/>pandas]
EX --> MET[Motor de métricas]
MET --> RISK[Motor de risco]
MET --> TURSO[("🗄️ Turso / libSQL")]
RISK --> TURSO
MET --> PB[Prompt Builder] --> IA{{"🤖 IA"}}
IA --> REP[Relatório Markdown]
MET --> REP
RISK --> REP
REP --> ENT[Entrega]
ENT --> FILE[📄 Arquivo]
ENT --> MAIL[📧 Gmail API]
ENT --> CU[✅ ClickUp]
FRONT[["🖥️ Front-end"]] <-->|REST| API[["🌐 API FastAPI"]] --> AG[Agente] --> EX🔄 Fluxo diário
sequenceDiagram
participant F as Front / Agendador
participant API as API
participant AG as Agente
participant SF as Salesforce
participant T as Turso
participant IA as IA
F->>API: POST /run (data)
API->>AG: executar(dia)
AG->>SF: OAuth + SOQL (leads, opps, tasks, satisfação, cancelamentos)
SF-->>AG: DataFrames
AG->>AG: métricas + comparações + riscos
AG->>T: salva métricas, alertas, relatório, snapshots
AG->>IA: prompt (JSON de métricas)
IA-->>AG: narrativa executiva
AG-->>API: relatório + alertas + destaques
API-->>F: JSON (KPIs, links, relatório)🧰 Stack
<div align="center">
<img height="44" src="https://cdn.simpleicons.org/python/3776AB" alt="Python" title="Python"/> <img height="44" src="https://cdn.simpleicons.org/fastapi/009688" alt="FastAPI" title="FastAPI"/> <img height="34" src="https://upload.wikimedia.org/wikipedia/commons/f/f9/Salesforce.com_logo.svg" alt="Salesforce" title="Salesforce"/> <img height="44" src="https://cdn.simpleicons.org/turso/4FF8D2" alt="Turso" title="Turso"/> <img height="44" src="https://cdn.simpleicons.org/huggingface/FFD21E" alt="Hugging Face" title="Hugging Face"/> <img height="44" src="https://cdn.simpleicons.org/pandas/150458" alt="pandas" title="pandas"/> <img height="44" src="https://cdn.simpleicons.org/clickup/7B68EE" alt="ClickUp" title="ClickUp"/> <img height="44" src="https://cdn.simpleicons.org/gmail/EA4335" alt="Gmail" title="Gmail"/> <img height="44" src="https://cdn.simpleicons.org/docker/2496ED" alt="Docker" title="Docker"/>
</div>
📁 Estrutura do projeto
analytical-force/
├── api.py # API FastAPI (deploy online)
├── main.py # CLI
├── frontend.html # Painel web multi-tela (single-file)
├── Dockerfile # Imagem para HF Spaces
├── requirements.txt # Deps (local) · requirements-hf.txt (Space)
├── .env.example # Modelo de variáveis (sem segredos)
├── scripts/ # test_salesforce_oauth · test_gmail_oauth · clean_db
└── src/
├── config/ database/ salesforce/ analytics/
├── models/ agent/ delivery/ utils/⚙️ Configuração (.env)
Copie .env.example → .env. Nunca faça commit do .env.
Lista completa e comentada em `.env.example`.
🧩 Guia de replicação
<details> <summary><b><img src="https://upload.wikimedia.org/wikipedia/commons/f/f9/Salesforce.com_logo.svg" height="14"/> 1. Salesforce (OAuth Refresh Token)</b></summary>
- Setup → App Manager → New Connected App.
- Ative Enable OAuth Settings. Callback:
https://login.salesforce.com/services/oauth2/callback. - Scopes: `api` e `refresh_token, offline_access`.
- Copie Consumer Key (
CLIENT_ID) e Consumer Secret (CLIENT_SECRET). - Gere o Refresh Token (fluxo OAuth) e preencha o
.env. - Valide:
python scripts/test_salesforce_oauth.py
💡 Use um usuário de integração somente leitura. O agente só faz SELECT (SOQL).</details>
<details> <summary><b><img src="https://cdn.simpleicons.org/turso/4FF8D2" height="14"/> 2. Turso (banco)</b></summary>
turso db create analytical-force
turso db show analytical-force --url # -> TURSO_DATABASE_URL
turso db tokens create analytical-force # -> TURSO_AUTH_TOKENAs tabelas são criadas automaticamente (migrations idempotentes) na 1ª execução. </details>
<details> <summary><b><img src="https://cdn.simpleicons.org/huggingface/FFD21E" height="14"/> 3. IA — Hugging Face Inference</b></summary>
- Token em huggingface.co/settings/tokens com permissão Make calls to Inference Providers.
- No
.env:MODEL_PROVIDER=hf_inference,HF_INFERENCE_MODEL=Qwen/Qwen2.5-7B-Instruct,HF_TOKEN=....
Alternativas:ollama(local),transformers(CPU) outemplate(sem IA, instantâneo).
</details>
<details> <summary><b><img src="https://cdn.simpleicons.org/gmail/EA4335" height="14"/> 4. Gmail API (e-mail)</b></summary>
O HF Spaces bloqueia SMTP — por isso o e-mail online usa a Gmail API (HTTP).
- Google Cloud Console → ative a Gmail API.
- Tela de consentimento (External) → adicione seu e-mail em Test users.
- Credencial OAuth Client (Web) com redirect
https://developers.google.com/oauthplayground. - No OAuth Playground, autorize
https://www.googleapis.com/auth/gmail.sende gere o refresh token. .env:GMAIL_CLIENT_ID/SECRET/REFRESH_TOKEN+GMAIL_SENDER+REPORT_RECIPIENT_EMAIL.- Valide:
python scripts/test_gmail_oauth.py</details>
<details> <summary><b><img src="https://cdn.simpleicons.org/clickup/7B68EE" height="14"/> 5. ClickUp (tarefas)</b></summary>
- ClickUp → Settings → Apps → API Token (
pk_...). - List ID pela URL:
app.clickup.com/.../li/<LIST_ID>. .env:CLICKUP_API_TOKEN,CLICKUP_LIST_ID,CLICKUP_ASSIGNEE_ID,ENABLE_CLICKUP_AUTO_CREATE=true. </details>
▶️ Como rodar (local)
python -m venv .venv && source .venv/bin/activate # Windows: .venv\Scripts\activate
pip install -r requirements.txt
cp .env.example .env # preencha
python main.py --check # valida configuração
python main.py --date 2026-06-22 # executa o pipeline
uvicorn api:app --port 7860 # API + Swagger em /docsAbra o `frontend.html` e aponte para a URL da API (aba Configuração).
🚀 Deploy online (Hugging Face Spaces)
Space tipo Docker (build leve). Em Settings → Variables and secrets:
🌐 API
Header X-API-Key quando APP_API_TOKEN está definido.
🖥️ Front-end
frontend.html é um painel multi-tela (single-file): barra lateral, seletor de dia que lê o banco por GET /day, tema claro/escuro, KPIs animados, filtro de alertas, gráfico de severidade, Registros do dia com links ao Salesforce, Tendências (histórico do Turso) e relatório em abas.
🗄️ Banco de dados
Tabelas (Turso/libSQL): agent_runs, daily_metrics, daily_alerts, daily_reports, salesforce_snapshots, object_mapping, agent_config. Gravações idempotentes por dia. Manutenção: python scripts/clean_db.py --snapshots.
🔒 Segurança
- Sem segredos no código (apenas
.env/ Secrets do Space). - Salesforce somente leitura (apenas
SELECT). - Logs mascaram senhas/tokens ·
/runprotegível porAPP_API_TOKEN.
👨💻 Desenvolvedor
<div align="center">
<img src="https://avatars.githubusercontent.com/u/66964047?s=400&u=ef769a81cacd810da6761e08129a1860dd11e36c&v=4" width="110" height="110" style="border-radius:50%" alt="Vinicius de Souza Santos"/>
Vinicius de Souza Santos
Criador e desenvolvedor do Analytical-Force
 
</div>
<img src="https://capsule-render.vercel.app/api?type=waving&color=0:4f46e5,100:2563eb&height=110§ion=footer" width="100%" alt=""/>
<div align="center"><sub>Feito com Python · Salesforce · Turso · Hugging Face · © Vinicius de Souza Santos</sub></div>
