Compare commits
2 Commits
9d83163dbb
...
4fb3f87dc3
| Author | SHA1 | Date |
|---|---|---|
|
|
4fb3f87dc3 | |
|
|
f0b39f7f1d |
3
.env
3
.env
|
|
@ -6,9 +6,6 @@ WEBUI_SECRET_KEY=76c7fc044f9e8d6e5eb60b67c82832b67e84739da4827ce1fa7c101ae1a055d
|
||||||
DOMAIN=suite.onboardbi.com.br
|
DOMAIN=suite.onboardbi.com.br
|
||||||
OLLAMA_BASE_URL=http://ollama-ia1upsekrad96at5hq97e4qa:11434
|
OLLAMA_BASE_URL=http://ollama-ia1upsekrad96at5hq97e4qa:11434
|
||||||
|
|
||||||
LLMFIT_BASE_URL=http://llmfit:8000
|
|
||||||
LLMFIT_API_KEY=key-arcadia
|
|
||||||
|
|
||||||
# ── Superset BI ───────────────────────────────────────────────
|
# ── Superset BI ───────────────────────────────────────────────
|
||||||
SUPERSET_SECRET_KEY=421274b5ba360778a5398d528116a45ea962d1197e3dfc99f36a372ff1025a63
|
SUPERSET_SECRET_KEY=421274b5ba360778a5398d528116a45ea962d1197e3dfc99f36a372ff1025a63
|
||||||
SUPERSET_ADMIN_USERNAME=admin
|
SUPERSET_ADMIN_USERNAME=admin
|
||||||
|
|
|
||||||
|
|
@ -49,13 +49,8 @@ AI_INTEGRATIONS_OPENAI_API_KEY=arcadia-internal
|
||||||
# Se Ollama está em outro servidor: OLLAMA_BASE_URL=http://IP_DO_SERVIDOR:11434
|
# Se Ollama está em outro servidor: OLLAMA_BASE_URL=http://IP_DO_SERVIDOR:11434
|
||||||
OLLAMA_BASE_URL=http://localhost:11434
|
OLLAMA_BASE_URL=http://localhost:11434
|
||||||
|
|
||||||
# ── IA — LLMFit (modelos fine-tuned locais — habilitar quando disponível) ─────
|
|
||||||
# LLMFit turbocharge: modelos treinados com dados do seu negócio
|
|
||||||
# Deixe vazio para desabilitar (LiteLLM cai para Ollama automaticamente)
|
|
||||||
LLMFIT_BASE_URL=
|
|
||||||
|
|
||||||
# ── IA — Providers externos (opt-in — soberania: dados não saem sem configurar)
|
# ── IA — Providers externos (opt-in — soberania: dados não saem sem configurar)
|
||||||
# Deixe vazio para operação 100% soberana (apenas Ollama + LLMFit)
|
# Deixe vazio para operação 100% soberana (apenas Ollama)
|
||||||
OPENAI_API_KEY=
|
OPENAI_API_KEY=
|
||||||
ANTHROPIC_API_KEY=
|
ANTHROPIC_API_KEY=
|
||||||
GROQ_API_KEY=
|
GROQ_API_KEY=
|
||||||
|
|
|
||||||
10
CLAUDE.md
10
CLAUDE.md
|
|
@ -20,7 +20,7 @@ server/
|
||||||
client/ # 66 páginas React
|
client/ # 66 páginas React
|
||||||
shared/schema.ts # Schema do banco (7317 linhas, Drizzle ORM)
|
shared/schema.ts # Schema do banco (7317 linhas, Drizzle ORM)
|
||||||
docker/
|
docker/
|
||||||
litellm-config.yaml # Roteamento de LLMs (TIER 1: LLMFit, TIER 2: Ollama, TIER 3: externos)
|
litellm-config.yaml # Roteamento de LLMs (TIER 1: Ollama local, TIER 2: externos)
|
||||||
```
|
```
|
||||||
|
|
||||||
## Arquitetura de IA
|
## Arquitetura de IA
|
||||||
|
|
@ -29,9 +29,8 @@ Manus / Agents / Embeddings
|
||||||
│ AI_INTEGRATIONS_OPENAI_BASE_URL
|
│ AI_INTEGRATIONS_OPENAI_BASE_URL
|
||||||
▼
|
▼
|
||||||
LiteLLM :4000 (gateway unificado, loga tudo no banco)
|
LiteLLM :4000 (gateway unificado, loga tudo no banco)
|
||||||
├──► LLMFit (TIER 1 — fine-tuned, soberano) [slot pronto, comentado]
|
├──► Ollama :11434 (TIER 1 — local, padrão)
|
||||||
├──► Ollama :11434 (TIER 2 — local, padrão)
|
└──► OpenAI/Anthropic/Groq (TIER 2 — opt-in, só se API key configurada)
|
||||||
└──► OpenAI/Anthropic/Groq (TIER 3 — opt-in, só se API key configurada)
|
|
||||||
```
|
```
|
||||||
|
|
||||||
**Variáveis chave do Manus:**
|
**Variáveis chave do Manus:**
|
||||||
|
|
@ -96,11 +95,11 @@ arcadia-prod-{contabil,bi,automation,fisco,embeddings}-1 Python services
|
||||||
- ✅ Docker dev + prod, LiteLLM gateway
|
- ✅ Docker dev + prod, LiteLLM gateway
|
||||||
|
|
||||||
## O que ainda falta
|
## O que ainda falta
|
||||||
- ❌ LLMFit: slot pronto em `litellm-config.yaml`, só habilitar quando disponível
|
|
||||||
- ❌ Testes automatizados / CI-CD
|
- ❌ Testes automatizados / CI-CD
|
||||||
- ❌ Monitoramento (APM, Sentry, métricas)
|
- ❌ Monitoramento (APM, Sentry, métricas)
|
||||||
- ❌ Multi-tenancy completo
|
- ❌ Multi-tenancy completo
|
||||||
- ❌ Rate limiting em todos os endpoints (parcial)
|
- ❌ Rate limiting em todos os endpoints (parcial)
|
||||||
|
- ❌ Fine-tuning de modelos locais (dados do Arcádia)
|
||||||
|
|
||||||
## Comandos úteis
|
## Comandos úteis
|
||||||
```bash
|
```bash
|
||||||
|
|
@ -122,7 +121,6 @@ npm run build
|
||||||
```
|
```
|
||||||
SESSION_SECRET, SSO_SECRET # gerar strings seguras em prod
|
SESSION_SECRET, SSO_SECRET # gerar strings seguras em prod
|
||||||
AI_INTEGRATIONS_OPENAI_BASE_URL # aponta para LiteLLM
|
AI_INTEGRATIONS_OPENAI_BASE_URL # aponta para LiteLLM
|
||||||
LLMFIT_BASE_URL # LLMFit quando disponível
|
|
||||||
OLLAMA_BASE_URL # Ollama host ou container
|
OLLAMA_BASE_URL # Ollama host ou container
|
||||||
OPENAI_API_KEY # opcional (soberania: deixar vazio)
|
OPENAI_API_KEY # opcional (soberania: deixar vazio)
|
||||||
```
|
```
|
||||||
|
|
|
||||||
|
|
@ -122,7 +122,6 @@ AUTOMATION_PYTHON_URL=http://automation:8005
|
||||||
OPENAI_API_KEY=
|
OPENAI_API_KEY=
|
||||||
ANTHROPIC_API_KEY=
|
ANTHROPIC_API_KEY=
|
||||||
GROQ_API_KEY=
|
GROQ_API_KEY=
|
||||||
LLMFIT_BASE_URL= # habilitar quando LLMFit estiver disponível
|
|
||||||
```
|
```
|
||||||
|
|
||||||
### Superset — profile `bi`
|
### Superset — profile `bi`
|
||||||
|
|
@ -256,12 +255,11 @@ Configure backups automáticos no Coolify em **Project → Backups**.
|
||||||
|
|
||||||
## Stack de IA (LiteLLM + Ollama)
|
## Stack de IA (LiteLLM + Ollama)
|
||||||
|
|
||||||
### Três tiers configurados em `docker/litellm-config.yaml`
|
### Dois tiers configurados em `docker/litellm-config.yaml`
|
||||||
|
|
||||||
```
|
```
|
||||||
TIER 1 — LLMFit (fine-tuned, soberano) → slot pronto, habilitar via LLMFIT_BASE_URL
|
TIER 1 — Ollama (local, padrão) → llama3.3, qwen2.5-coder, nomic-embed-text
|
||||||
TIER 2 — Ollama (local, padrão) → llama3.3, qwen2.5-coder, nomic-embed-text
|
TIER 2 — Externos (opt-in) → OpenAI, Anthropic, Groq (apenas se API key definida)
|
||||||
TIER 3 — Externos (opt-in) → OpenAI, Anthropic, Groq (apenas se API key definida)
|
|
||||||
```
|
```
|
||||||
|
|
||||||
### Baixar modelos Ollama após o primeiro deploy
|
### Baixar modelos Ollama após o primeiro deploy
|
||||||
|
|
@ -272,12 +270,6 @@ docker exec arcadia-ollama ollama pull qwen2.5-coder:7b
|
||||||
docker exec arcadia-ollama ollama pull nomic-embed-text
|
docker exec arcadia-ollama ollama pull nomic-embed-text
|
||||||
```
|
```
|
||||||
|
|
||||||
### Habilitar LLMFit (quando disponível)
|
|
||||||
|
|
||||||
1. Defina `LLMFIT_BASE_URL=http://seu-llmfit:porta`
|
|
||||||
2. Descomente o bloco TIER 1 em `docker/litellm-config.yaml`
|
|
||||||
3. Redeploy do serviço `litellm`
|
|
||||||
|
|
||||||
---
|
---
|
||||||
|
|
||||||
## Pós-deploy
|
## Pós-deploy
|
||||||
|
|
|
||||||
|
|
@ -1,6 +1,6 @@
|
||||||
# Integração de IA — Ollama + LLMFit no Servidor
|
# Integração de IA — Ollama no Servidor
|
||||||
|
|
||||||
Guia para conectar o Arcádia Suite às IAs locais em produção.
|
Guia para conectar o Arcádia Suite à IA local em produção.
|
||||||
|
|
||||||
---
|
---
|
||||||
|
|
||||||
|
|
@ -13,11 +13,11 @@ Arcádia Suite (Manus, Agents, Embeddings)
|
||||||
▼
|
▼
|
||||||
LiteLLM (porta 4000) — gateway único
|
LiteLLM (porta 4000) — gateway único
|
||||||
│
|
│
|
||||||
├──► LLMFit (seus modelos fine-tuned) [TIER 1 — prioridade]
|
├──► Ollama (modelos open source locais) [TIER 1 — padrão]
|
||||||
└──► Ollama (modelos open source locais) [TIER 2 — padrão/fallback]
|
└──► OpenAI/Anthropic/Groq (opt-in) [TIER 2 — externo]
|
||||||
```
|
```
|
||||||
|
|
||||||
Nenhum serviço do Arcádia chama Ollama ou LLMFit diretamente.
|
Nenhum serviço do Arcádia chama Ollama diretamente.
|
||||||
Tudo passa pelo LiteLLM — que roteia, loga e faz fallback automaticamente.
|
Tudo passa pelo LiteLLM — que roteia, loga e faz fallback automaticamente.
|
||||||
|
|
||||||
---
|
---
|
||||||
|
|
@ -89,66 +89,6 @@ docker exec -it $(docker ps -qf "name=ollama") ollama pull deepseek-r1:7b
|
||||||
|
|
||||||
---
|
---
|
||||||
|
|
||||||
## Configuração do LLMFit
|
|
||||||
|
|
||||||
### 1. Pré-requisito
|
|
||||||
|
|
||||||
O LLMFit deve expor uma API compatível com OpenAI (formato `/v1/chat/completions`).
|
|
||||||
Verifique se está respondendo:
|
|
||||||
```bash
|
|
||||||
curl http://IP_DO_LLMFIT:PORTA/v1/models
|
|
||||||
```
|
|
||||||
|
|
||||||
### 2. Configurar variável no Coolify
|
|
||||||
|
|
||||||
```
|
|
||||||
LLMFIT_BASE_URL=http://IP_DO_LLMFIT:PORTA
|
|
||||||
```
|
|
||||||
|
|
||||||
### 3. Ativar no LiteLLM config
|
|
||||||
|
|
||||||
Edite `docker/litellm-config.yaml` e **descomente** o bloco TIER 1:
|
|
||||||
|
|
||||||
```yaml
|
|
||||||
model_list:
|
|
||||||
|
|
||||||
# TIER 1 — LLMFit (fine-tuned, prioridade máxima)
|
|
||||||
- model_name: arcadia-finetuned
|
|
||||||
litellm_params:
|
|
||||||
model: openai/NOME_DO_SEU_MODELO # substitua pelo nome real
|
|
||||||
api_base: os.environ/LLMFIT_BASE_URL
|
|
||||||
api_key: llmfit-internal
|
|
||||||
|
|
||||||
# Modelo de embeddings fine-tuned (se disponível)
|
|
||||||
- model_name: arcadia-embed
|
|
||||||
litellm_params:
|
|
||||||
model: openai/NOME_DO_MODELO_EMBED
|
|
||||||
api_base: os.environ/LLMFIT_BASE_URL
|
|
||||||
api_key: llmfit-internal
|
|
||||||
```
|
|
||||||
|
|
||||||
### 4. Definir LLMFit como modelo padrão do Arcádia
|
|
||||||
|
|
||||||
No mesmo arquivo, atualize o `arcadia-default`:
|
|
||||||
|
|
||||||
```yaml
|
|
||||||
- model_name: arcadia-default
|
|
||||||
litellm_params:
|
|
||||||
model: openai/NOME_DO_SEU_MODELO
|
|
||||||
api_base: os.environ/LLMFIT_BASE_URL
|
|
||||||
api_key: llmfit-internal
|
|
||||||
model_info:
|
|
||||||
fallbacks: ["llama3.3"] # cai para Ollama se LLMFit falhar
|
|
||||||
```
|
|
||||||
|
|
||||||
### 5. Reiniciar o LiteLLM para aplicar
|
|
||||||
|
|
||||||
```bash
|
|
||||||
docker compose -f docker-compose.prod.yml restart litellm
|
|
||||||
```
|
|
||||||
|
|
||||||
---
|
|
||||||
|
|
||||||
## Variáveis de ambiente — resumo completo
|
## Variáveis de ambiente — resumo completo
|
||||||
|
|
||||||
Configure todas no Coolify antes do deploy:
|
Configure todas no Coolify antes do deploy:
|
||||||
|
|
@ -174,9 +114,6 @@ AI_INTEGRATIONS_OPENAI_API_KEY=${LITELLM_API_KEY}
|
||||||
# Ollama em container: http://ollama:11434
|
# Ollama em container: http://ollama:11434
|
||||||
OLLAMA_BASE_URL=http://host-gateway:11434
|
OLLAMA_BASE_URL=http://host-gateway:11434
|
||||||
|
|
||||||
# ── LLMFit (deixar vazio até estar disponível) ────────────────────────────────
|
|
||||||
LLMFIT_BASE_URL=
|
|
||||||
|
|
||||||
# ── Providers externos (deixar vazio para soberania total) ───────────────────
|
# ── Providers externos (deixar vazio para soberania total) ───────────────────
|
||||||
OPENAI_API_KEY=
|
OPENAI_API_KEY=
|
||||||
ANTHROPIC_API_KEY=
|
ANTHROPIC_API_KEY=
|
||||||
|
|
@ -202,7 +139,7 @@ curl http://localhost:4000/v1/chat/completions \
|
||||||
### 2. Testar Manus via interface
|
### 2. Testar Manus via interface
|
||||||
|
|
||||||
Acesse `https://seudominio.com.br` → abra o Manus → envie uma mensagem simples.
|
Acesse `https://seudominio.com.br` → abra o Manus → envie uma mensagem simples.
|
||||||
O Manus deve responder via Ollama (ou LLMFit se configurado).
|
O Manus deve responder via Ollama.
|
||||||
|
|
||||||
### 3. Ver logs em tempo real
|
### 3. Ver logs em tempo real
|
||||||
|
|
||||||
|
|
@ -253,10 +190,6 @@ docker exec $(docker ps -qf "name=ollama") ollama pull nomic-embed-text
|
||||||
→ O modelo referenciado em `litellm-config.yaml` não foi baixado no Ollama.
|
→ O modelo referenciado em `litellm-config.yaml` não foi baixado no Ollama.
|
||||||
→ Execute `ollama pull NOME_DO_MODELO`
|
→ Execute `ollama pull NOME_DO_MODELO`
|
||||||
|
|
||||||
**LLMFit não está sendo chamado**
|
|
||||||
→ Confirme que `LLMFIT_BASE_URL` está definido e o serviço está respondendo.
|
|
||||||
→ Reinicie o LiteLLM após alterar o config: `docker compose restart litellm`
|
|
||||||
|
|
||||||
**Ollama no host não é alcançado de dentro do Docker**
|
**Ollama no host não é alcançado de dentro do Docker**
|
||||||
→ Tente `OLLAMA_BASE_URL=http://172.17.0.1:11434` (IP padrão do docker0)
|
→ Tente `OLLAMA_BASE_URL=http://172.17.0.1:11434` (IP padrão do docker0)
|
||||||
→ Ou use o IP real da interface de rede: `ip addr show` para descobrir
|
→ Ou use o IP real da interface de rede: `ip addr show` para descobrir
|
||||||
|
|
|
||||||
|
|
@ -283,7 +283,7 @@ services:
|
||||||
- arcadia-internal
|
- arcadia-internal
|
||||||
|
|
||||||
# ── LiteLLM (gateway unificado de LLM — soberania dos dados) ─────────────────
|
# ── LiteLLM (gateway unificado de LLM — soberania dos dados) ─────────────────
|
||||||
# Roteia: LLMFit (fine-tuned) → Ollama (local) → externo (opt-in)
|
# Roteia: Ollama (local) → externo (opt-in)
|
||||||
litellm:
|
litellm:
|
||||||
image: ghcr.io/berriai/litellm:main-latest
|
image: ghcr.io/berriai/litellm:main-latest
|
||||||
restart: always
|
restart: always
|
||||||
|
|
@ -297,9 +297,6 @@ services:
|
||||||
# Ollama: se instalado no host use http://host-gateway:11434
|
# Ollama: se instalado no host use http://host-gateway:11434
|
||||||
# Se usar container Docker, mantém http://ollama:11434
|
# Se usar container Docker, mantém http://ollama:11434
|
||||||
OLLAMA_BASE_URL: ${OLLAMA_BASE_URL:-http://ollama:11434}
|
OLLAMA_BASE_URL: ${OLLAMA_BASE_URL:-http://ollama:11434}
|
||||||
# LLMFit: URL do serviço de modelos fine-tuned
|
|
||||||
LLMFIT_BASE_URL: ${LLMFIT_BASE_URL:-}
|
|
||||||
LLMFIT_API_KEY: ${LLMFIT_API_KEY:-}
|
|
||||||
# Providers externos opcionais (soberania: só habilitados se configurados)
|
# Providers externos opcionais (soberania: só habilitados se configurados)
|
||||||
ANTHROPIC_API_KEY: ${ANTHROPIC_API_KEY:-}
|
ANTHROPIC_API_KEY: ${ANTHROPIC_API_KEY:-}
|
||||||
GROQ_API_KEY: ${GROQ_API_KEY:-}
|
GROQ_API_KEY: ${GROQ_API_KEY:-}
|
||||||
|
|
@ -322,7 +319,7 @@ services:
|
||||||
networks:
|
networks:
|
||||||
- arcadia-internal
|
- arcadia-internal
|
||||||
|
|
||||||
# ── Open WebUI (interface para Ollama + LLMFit) ───────────────────────────────
|
# ── Open WebUI (interface para Ollama) ───────────────────────────────
|
||||||
open-webui:
|
open-webui:
|
||||||
image: ghcr.io/open-webui/open-webui:main
|
image: ghcr.io/open-webui/open-webui:main
|
||||||
restart: always
|
restart: always
|
||||||
|
|
|
||||||
|
|
@ -1,237 +0,0 @@
|
||||||
# ─── Arcádia Suite — Produção (Coolify) ───────────────────────────────────────
|
|
||||||
# Este arquivo é usado pelo Coolify para deploy automático.
|
|
||||||
# NÃO inclui volumes de código-fonte — só artefatos de build.
|
|
||||||
# Configurar no Coolify: Environment Variables para todas as vars ${...}
|
|
||||||
|
|
||||||
name: arcadia-prod
|
|
||||||
|
|
||||||
services:
|
|
||||||
|
|
||||||
# ── Banco de dados com pgvector ─────────────────────────────────────────────
|
|
||||||
db:
|
|
||||||
image: pgvector/pgvector:pg16
|
|
||||||
restart: always
|
|
||||||
environment:
|
|
||||||
POSTGRES_DB: ${PGDATABASE:-arcadia}
|
|
||||||
POSTGRES_USER: ${PGUSER:-arcadia}
|
|
||||||
POSTGRES_PASSWORD: ${PGPASSWORD}
|
|
||||||
volumes:
|
|
||||||
- pgdata:/var/lib/postgresql/data
|
|
||||||
- ./docker/init-pgvector.sql:/docker-entrypoint-initdb.d/01-pgvector.sql
|
|
||||||
healthcheck:
|
|
||||||
test: ["CMD-SHELL", "pg_isready -U ${PGUSER:-arcadia}"]
|
|
||||||
interval: 10s
|
|
||||||
timeout: 5s
|
|
||||||
retries: 10
|
|
||||||
networks:
|
|
||||||
- arcadia-internal
|
|
||||||
|
|
||||||
# ── Redis ────────────────────────────────────────────────────────────────────
|
|
||||||
redis:
|
|
||||||
image: redis:7-alpine
|
|
||||||
restart: always
|
|
||||||
command: redis-server --maxmemory 256mb --maxmemory-policy allkeys-lru
|
|
||||||
volumes:
|
|
||||||
- redis_data:/data
|
|
||||||
networks:
|
|
||||||
- arcadia-internal
|
|
||||||
|
|
||||||
# ── App principal ─────────────────────────────────────────────────────────
|
|
||||||
app:
|
|
||||||
build:
|
|
||||||
context: .
|
|
||||||
dockerfile: Dockerfile
|
|
||||||
restart: always
|
|
||||||
environment:
|
|
||||||
NODE_ENV: production
|
|
||||||
PORT: 5000
|
|
||||||
DATABASE_URL: postgresql://${PGUSER:-arcadia}:${PGPASSWORD}@db:5432/${PGDATABASE:-arcadia}
|
|
||||||
REDIS_URL: redis://redis:6379
|
|
||||||
DOCKER_MODE: "true"
|
|
||||||
CONTABIL_PYTHON_URL: http://contabil:8003
|
|
||||||
BI_PYTHON_URL: http://bi:8004
|
|
||||||
AUTOMATION_PYTHON_URL: http://automation:8005
|
|
||||||
FISCO_PYTHON_URL: http://fisco:8002
|
|
||||||
PYTHON_SERVICE_URL: http://embeddings:8001
|
|
||||||
SESSION_SECRET: ${SESSION_SECRET}
|
|
||||||
SSO_SECRET: ${SSO_SECRET}
|
|
||||||
OPENAI_API_KEY: ${OPENAI_API_KEY:-}
|
|
||||||
LITELLM_BASE_URL: http://litellm:4000
|
|
||||||
LITELLM_API_KEY: ${LITELLM_API_KEY}
|
|
||||||
OLLAMA_BASE_URL: ${OLLAMA_BASE_URL:-http://ollama:11434}
|
|
||||||
# ── Manus Agent — aponta para LiteLLM como gateway unificado ──────────
|
|
||||||
# LiteLLM roteia para Ollama (local), LLMFit (fine-tuned) ou externo
|
|
||||||
AI_INTEGRATIONS_OPENAI_BASE_URL: http://litellm:4000/v1
|
|
||||||
AI_INTEGRATIONS_OPENAI_API_KEY: ${LITELLM_API_KEY}
|
|
||||||
ports:
|
|
||||||
- "5000:5000"
|
|
||||||
depends_on:
|
|
||||||
db:
|
|
||||||
condition: service_healthy
|
|
||||||
redis:
|
|
||||||
condition: service_started
|
|
||||||
networks:
|
|
||||||
- arcadia-internal
|
|
||||||
- arcadia-public
|
|
||||||
labels:
|
|
||||||
- "traefik.enable=true"
|
|
||||||
- "traefik.http.routers.arcadia.rule=Host(`${DOMAIN}`)"
|
|
||||||
- "traefik.http.routers.arcadia.tls=true"
|
|
||||||
- "traefik.http.routers.arcadia.tls.certresolver=letsencrypt"
|
|
||||||
|
|
||||||
# ── Microserviços Python ─────────────────────────────────────────────────────
|
|
||||||
contabil:
|
|
||||||
build:
|
|
||||||
context: .
|
|
||||||
dockerfile: Dockerfile.python
|
|
||||||
restart: always
|
|
||||||
environment:
|
|
||||||
SERVICE_NAME: contabil
|
|
||||||
SERVICE_PORT: 8003
|
|
||||||
CONTABIL_PORT: 8003
|
|
||||||
DATABASE_URL: postgresql://${PGUSER:-arcadia}:${PGPASSWORD}@db:5432/${PGDATABASE:-arcadia}
|
|
||||||
depends_on:
|
|
||||||
db:
|
|
||||||
condition: service_healthy
|
|
||||||
networks:
|
|
||||||
- arcadia-internal
|
|
||||||
|
|
||||||
bi:
|
|
||||||
build:
|
|
||||||
context: .
|
|
||||||
dockerfile: Dockerfile.python
|
|
||||||
restart: always
|
|
||||||
environment:
|
|
||||||
SERVICE_NAME: bi
|
|
||||||
SERVICE_PORT: 8004
|
|
||||||
BI_PORT: 8004
|
|
||||||
DATABASE_URL: postgresql://${PGUSER:-arcadia}:${PGPASSWORD}@db:5432/${PGDATABASE:-arcadia}
|
|
||||||
depends_on:
|
|
||||||
db:
|
|
||||||
condition: service_healthy
|
|
||||||
networks:
|
|
||||||
- arcadia-internal
|
|
||||||
|
|
||||||
automation:
|
|
||||||
build:
|
|
||||||
context: .
|
|
||||||
dockerfile: Dockerfile.python
|
|
||||||
restart: always
|
|
||||||
environment:
|
|
||||||
SERVICE_NAME: automation
|
|
||||||
SERVICE_PORT: 8005
|
|
||||||
AUTOMATION_PORT: 8005
|
|
||||||
DATABASE_URL: postgresql://${PGUSER:-arcadia}:${PGPASSWORD}@db:5432/${PGDATABASE:-arcadia}
|
|
||||||
depends_on:
|
|
||||||
db:
|
|
||||||
condition: service_healthy
|
|
||||||
networks:
|
|
||||||
- arcadia-internal
|
|
||||||
|
|
||||||
fisco:
|
|
||||||
build:
|
|
||||||
context: .
|
|
||||||
dockerfile: Dockerfile.python
|
|
||||||
restart: always
|
|
||||||
environment:
|
|
||||||
SERVICE_NAME: fisco
|
|
||||||
SERVICE_PORT: 8002
|
|
||||||
FISCO_PORT: 8002
|
|
||||||
DATABASE_URL: postgresql://${PGUSER:-arcadia}:${PGPASSWORD}@db:5432/${PGDATABASE:-arcadia}
|
|
||||||
depends_on:
|
|
||||||
db:
|
|
||||||
condition: service_healthy
|
|
||||||
networks:
|
|
||||||
- arcadia-internal
|
|
||||||
|
|
||||||
embeddings:
|
|
||||||
build:
|
|
||||||
context: .
|
|
||||||
dockerfile: Dockerfile.python
|
|
||||||
restart: always
|
|
||||||
environment:
|
|
||||||
SERVICE_NAME: embeddings
|
|
||||||
SERVICE_PORT: 8001
|
|
||||||
DATABASE_URL: postgresql://${PGUSER:-arcadia}:${PGPASSWORD}@db:5432/${PGDATABASE:-arcadia}
|
|
||||||
depends_on:
|
|
||||||
db:
|
|
||||||
condition: service_healthy
|
|
||||||
networks:
|
|
||||||
- arcadia-internal
|
|
||||||
|
|
||||||
# ── LiteLLM (gateway unificado de LLM — soberania dos dados) ─────────────────
|
|
||||||
# Roteia: LLMFit (fine-tuned) → Ollama (local) → externo (opt-in)
|
|
||||||
litellm:
|
|
||||||
image: ghcr.io/berriai/litellm:main-latest
|
|
||||||
restart: always
|
|
||||||
volumes:
|
|
||||||
- ./docker/litellm-config.yaml:/app/config.yaml
|
|
||||||
command: ["--config", "/app/config.yaml", "--port", "4000"]
|
|
||||||
environment:
|
|
||||||
OPENAI_API_KEY: ${OPENAI_API_KEY:-}
|
|
||||||
LITELLM_MASTER_KEY: ${LITELLM_API_KEY}
|
|
||||||
DATABASE_URL: postgresql://${PGUSER:-arcadia}:${PGPASSWORD}@db:5432/${PGDATABASE:-arcadia}
|
|
||||||
# Ollama: se instalado no host use http://host-gateway:11434
|
|
||||||
# Se usar container Docker, mantém http://ollama:11434
|
|
||||||
OLLAMA_BASE_URL: ${OLLAMA_BASE_URL:-http://ollama:11434}
|
|
||||||
# LLMFit: URL do serviço de modelos fine-tuned
|
|
||||||
LLMFIT_BASE_URL: ${LLMFIT_BASE_URL:-}
|
|
||||||
# Providers externos opcionais (soberania: só habilitados se configurados)
|
|
||||||
ANTHROPIC_API_KEY: ${ANTHROPIC_API_KEY:-}
|
|
||||||
GROQ_API_KEY: ${GROQ_API_KEY:-}
|
|
||||||
depends_on:
|
|
||||||
db:
|
|
||||||
condition: service_healthy
|
|
||||||
networks:
|
|
||||||
- arcadia-internal
|
|
||||||
|
|
||||||
# ── Ollama (LLMs locais — soberania total) ────────────────────────────────────
|
|
||||||
# OPÇÃO A (padrão): Ollama como container Docker
|
|
||||||
# OPÇÃO B: Ollama no host → comente este serviço e defina
|
|
||||||
# OLLAMA_BASE_URL=http://host-gateway:11434 nas env vars
|
|
||||||
ollama:
|
|
||||||
image: ollama/ollama:latest
|
|
||||||
restart: always
|
|
||||||
volumes:
|
|
||||||
- ollama_models:/root/.ollama
|
|
||||||
networks:
|
|
||||||
- arcadia-internal
|
|
||||||
# Remova 'profiles: [ai]' para ativar por padrão no deploy
|
|
||||||
profiles: [ai]
|
|
||||||
|
|
||||||
# ── Open WebUI (interface para Ollama + LLMFit) ───────────────────────────────
|
|
||||||
open-webui:
|
|
||||||
image: ghcr.io/open-webui/open-webui:main
|
|
||||||
restart: always
|
|
||||||
environment:
|
|
||||||
# Pode apontar para LiteLLM para ter acesso a todos os modelos via WebUI
|
|
||||||
OLLAMA_BASE_URL: ${OLLAMA_BASE_URL:-http://ollama:11434}
|
|
||||||
OPENAI_API_BASE_URL: http://litellm:4000/v1
|
|
||||||
OPENAI_API_KEY: ${LITELLM_API_KEY}
|
|
||||||
WEBUI_SECRET_KEY: ${WEBUI_SECRET_KEY}
|
|
||||||
volumes:
|
|
||||||
- open_webui_data:/app/backend/data
|
|
||||||
depends_on:
|
|
||||||
- litellm
|
|
||||||
networks:
|
|
||||||
- arcadia-internal
|
|
||||||
- arcadia-public
|
|
||||||
labels:
|
|
||||||
- "traefik.enable=true"
|
|
||||||
- "traefik.http.routers.webui.rule=Host(`ai.${DOMAIN}`)"
|
|
||||||
- "traefik.http.routers.webui.tls=true"
|
|
||||||
- "traefik.http.routers.webui.tls.certresolver=letsencrypt"
|
|
||||||
- "traefik.http.services.webui.loadbalancer.server.port=8080"
|
|
||||||
profiles: [ai]
|
|
||||||
|
|
||||||
networks:
|
|
||||||
arcadia-internal:
|
|
||||||
driver: bridge
|
|
||||||
arcadia-public:
|
|
||||||
driver: bridge
|
|
||||||
|
|
||||||
volumes:
|
|
||||||
pgdata:
|
|
||||||
redis_data:
|
|
||||||
ollama_models:
|
|
||||||
open_webui_data:
|
|
||||||
|
|
@ -3,29 +3,15 @@
|
||||||
#
|
#
|
||||||
# ESTRATÉGIA DE SOBERANIA DOS DADOS:
|
# ESTRATÉGIA DE SOBERANIA DOS DADOS:
|
||||||
# ┌─────────────────────────────────────────────────────────────────────────┐
|
# ┌─────────────────────────────────────────────────────────────────────────┐
|
||||||
# │ TIER 1 (soberania total): LLMFit — modelos fine-tuned locais │
|
# │ TIER 1 (soberania total): Ollama — modelos open source no servidor │
|
||||||
# │ TIER 2 (soberania total): Ollama — modelos open source no servidor │
|
# │ TIER 2 (opt-in): Providers externos — só com configuração explícita │
|
||||||
# │ TIER 3 (opt-in): Providers externos — só com configuração explícita │
|
|
||||||
# └─────────────────────────────────────────────────────────────────────────┘
|
# └─────────────────────────────────────────────────────────────────────────┘
|
||||||
# O Manus, Autonomous Agents e todos os serviços chamam APENAS este proxy.
|
# O Manus, Autonomous Agents e todos os serviços chamam APENAS este proxy.
|
||||||
# Nunca chamam APIs externas diretamente.
|
# Nunca chamam APIs externas diretamente.
|
||||||
|
|
||||||
model_list:
|
model_list:
|
||||||
|
|
||||||
# ── TIER 1: LLMFit (modelos fine-tuned locais — máxima soberania) ────────────
|
# ── TIER 1: Ollama (LLMs locais — soberania total) ───────────────────────────
|
||||||
- model_name: arcadia-finetuned
|
|
||||||
litellm_params:
|
|
||||||
model: openai/llama3.2:3b
|
|
||||||
api_base: os.environ/LLMFIT_BASE_URL
|
|
||||||
api_key: os.environ/LLMFIT_API_KEY
|
|
||||||
|
|
||||||
- model_name: arcadia-embed
|
|
||||||
litellm_params:
|
|
||||||
model: openai/nomic-embed-text:latest
|
|
||||||
api_base: os.environ/LLMFIT_BASE_URL
|
|
||||||
api_key: os.environ/LLMFIT_API_KEY
|
|
||||||
|
|
||||||
# ── TIER 2: Ollama (LLMs locais — soberania total) ───────────────────────────
|
|
||||||
- model_name: llama3.2
|
- model_name: llama3.2
|
||||||
litellm_params:
|
litellm_params:
|
||||||
model: ollama/llama3.2:3b
|
model: ollama/llama3.2:3b
|
||||||
|
|
@ -42,7 +28,7 @@ model_list:
|
||||||
model: ollama/nomic-embed-text
|
model: ollama/nomic-embed-text
|
||||||
api_base: os.environ/OLLAMA_BASE_URL
|
api_base: os.environ/OLLAMA_BASE_URL
|
||||||
|
|
||||||
# ── TIER 3: OpenAI (opt-in — só ativo se OPENAI_API_KEY configurado) ─────────
|
# ── TIER 2: OpenAI (opt-in — só ativo se OPENAI_API_KEY configurado) ─────────
|
||||||
- model_name: gpt-4o
|
- model_name: gpt-4o
|
||||||
litellm_params:
|
litellm_params:
|
||||||
model: openai/gpt-4o
|
model: openai/gpt-4o
|
||||||
|
|
@ -53,34 +39,30 @@ model_list:
|
||||||
model: openai/gpt-4o-mini
|
model: openai/gpt-4o-mini
|
||||||
api_key: os.environ/OPENAI_API_KEY
|
api_key: os.environ/OPENAI_API_KEY
|
||||||
|
|
||||||
# ── TIER 3: Anthropic (opt-in — descomente para habilitar) ───────────────────
|
# ── TIER 2: Anthropic (opt-in — descomente para habilitar) ───────────────────
|
||||||
# - model_name: claude-sonnet
|
# - model_name: claude-sonnet
|
||||||
# litellm_params:
|
# litellm_params:
|
||||||
# model: anthropic/claude-sonnet-4-6
|
# model: anthropic/claude-sonnet-4-6
|
||||||
# api_key: os.environ/ANTHROPIC_API_KEY
|
# api_key: os.environ/ANTHROPIC_API_KEY
|
||||||
|
|
||||||
# ── TIER 3: Groq (opt-in — inferência rápida sem dados persistidos) ──────────
|
# ── TIER 2: Groq (opt-in — inferência rápida sem dados persistidos) ──────────
|
||||||
# - model_name: groq-llama
|
# - model_name: groq-llama
|
||||||
# litellm_params:
|
# litellm_params:
|
||||||
# model: groq/llama-3.3-70b-versatile
|
# model: groq/llama-3.3-70b-versatile
|
||||||
# api_key: os.environ/GROQ_API_KEY
|
# api_key: os.environ/GROQ_API_KEY
|
||||||
|
|
||||||
# ── Modelo padrão do Arcádia (Manus usa este) ─────────────────────────────────
|
# ── Modelo padrão do Arcádia (Manus usa este) ─────────────────────────────────
|
||||||
# Prioridade: LLMFit (TIER 1) → Ollama (TIER 2 — fallback)
|
|
||||||
- model_name: arcadia-default
|
- model_name: arcadia-default
|
||||||
litellm_params:
|
litellm_params:
|
||||||
model: openai/llama3.2:3b
|
model: ollama/llama3.2:3b
|
||||||
api_base: os.environ/LLMFIT_BASE_URL
|
api_base: os.environ/OLLAMA_BASE_URL
|
||||||
api_key: os.environ/LLMFIT_API_KEY
|
|
||||||
|
|
||||||
router_settings:
|
router_settings:
|
||||||
routing_strategy: least-busy
|
routing_strategy: least-busy
|
||||||
fallbacks:
|
fallbacks:
|
||||||
- {"gpt-4o": ["llama3.2"]}
|
- {"gpt-4o": ["llama3.2"]}
|
||||||
- {"gpt-4o-mini": ["llama3.2"]}
|
- {"gpt-4o-mini": ["llama3.2"]}
|
||||||
- {"arcadia-default": ["llama3.2"]}
|
- {"arcadia-default": ["llama3.2"]}
|
||||||
- {"arcadia-finetuned": ["llama3.2"]}
|
|
||||||
- {"arcadia-embed": ["nomic-embed-text"]}
|
|
||||||
|
|
||||||
litellm_settings:
|
litellm_settings:
|
||||||
drop_params: true
|
drop_params: true
|
||||||
|
|
|
||||||
|
|
@ -55,7 +55,7 @@ async function buildAll() {
|
||||||
define: {
|
define: {
|
||||||
"process.env.NODE_ENV": '"production"',
|
"process.env.NODE_ENV": '"production"',
|
||||||
},
|
},
|
||||||
minify: true,
|
minify: false,
|
||||||
external: externals,
|
external: externals,
|
||||||
logLevel: "info",
|
logLevel: "info",
|
||||||
});
|
});
|
||||||
|
|
|
||||||
|
|
@ -0,0 +1,39 @@
|
||||||
|
# MiroFlow /analyze Endpoint
|
||||||
|
|
||||||
|
## Como funciona
|
||||||
|
|
||||||
|
O botão "Analisar" no BiWorkspace (tab Científico) chama `POST /api/miroflow/analyze`.
|
||||||
|
|
||||||
|
O handler vive em `engine-proxy.ts` e chama diretamente o Ollama com o model `deepseek-r1:14b` (fallback: `llama3.2:3b`).
|
||||||
|
|
||||||
|
## Fluxo
|
||||||
|
|
||||||
|
```
|
||||||
|
BiWorkspace → POST /api/miroflow/analyze
|
||||||
|
→ engine-proxy.ts (Node, host)
|
||||||
|
→ ollama-ia1upsekrad96at5hq97e4qa:11434/api/chat
|
||||||
|
→ deepseek-r1:14b
|
||||||
|
← { result, model, execution_id, duration_ms }
|
||||||
|
← resposta ao frontend
|
||||||
|
```
|
||||||
|
|
||||||
|
## Agentes disponíveis
|
||||||
|
|
||||||
|
| Agent | System prompt |
|
||||||
|
|-------|--------------|
|
||||||
|
| `statistician` | Análise estatística e descritiva |
|
||||||
|
| `fiscal_auditor` | Compliance tributário brasileiro |
|
||||||
|
| `researcher` | Correlações e inteligência de negócios |
|
||||||
|
|
||||||
|
## Infraestrutura
|
||||||
|
|
||||||
|
- O container `ollama-ia1upsekrad96at5hq97e4qa` precisa estar na rede `arcadia-prod_arcadia-internal`.
|
||||||
|
- Comando para reconectar se necessário:
|
||||||
|
```bash
|
||||||
|
docker network connect arcadia-prod_arcadia-internal ollama-ia1upsekrad96at5hq97e4qa
|
||||||
|
```
|
||||||
|
- Tempo médio de resposta: ~2-3 min (deepseek-r1:14b).
|
||||||
|
|
||||||
|
## Variável de ambiente
|
||||||
|
|
||||||
|
`OLLAMA_BASE_URL` sobrescreve o hostname padrão do Ollama.
|
||||||
|
|
@ -1 +1 @@
|
||||||
Subproject commit 9d180f1eeb5e301c440ad7ce8b12c14222779040
|
Subproject commit fe1a7397fbb5a3eee145feb2fac94f620ef43f3e
|
||||||
Loading…
Reference in New Issue