diff --git a/.env.example b/.env.example index 2dc1a7d..656b051 100644 --- a/.env.example +++ b/.env.example @@ -33,14 +33,33 @@ PYTHON_SERVICE_URL=http://localhost:8001 # Deixe vazio se usar apenas Ollama (soberania total) OPENAI_API_KEY= -# ── IA — LiteLLM (proxy unificado) ─────────────────────────────────────────── +# ── IA — LiteLLM (gateway unificado — ÚNICA porta de entrada para LLMs) ────── # Em Docker: http://litellm:4000 | Em dev local: http://localhost:4000 LITELLM_BASE_URL=http://localhost:4000 LITELLM_API_KEY=arcadia-internal -# ── IA — Ollama (LLMs locais) ───────────────────────────────────────────────── +# ── IA — Manus Agent (aponta para LiteLLM como gateway) ────────────────────── +# Em Docker: AI_INTEGRATIONS_OPENAI_BASE_URL=http://litellm:4000/v1 +# Em dev local: http://localhost:4000/v1 +AI_INTEGRATIONS_OPENAI_BASE_URL=http://localhost:4000/v1 +AI_INTEGRATIONS_OPENAI_API_KEY=arcadia-internal + +# ── IA — Ollama (LLMs locais — soberania total) ─────────────────────────────── +# Se Ollama está no host (fora do Docker): OLLAMA_BASE_URL=http://localhost:11434 +# Se Ollama está em outro servidor: OLLAMA_BASE_URL=http://IP_DO_SERVIDOR: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) +# Deixe vazio para operação 100% soberana (apenas Ollama + LLMFit) +OPENAI_API_KEY= +ANTHROPIC_API_KEY= +GROQ_API_KEY= + # ── Open WebUI ──────────────────────────────────────────────────────────────── WEBUI_SECRET_KEY=troque-por-string-aleatoria-segura diff --git a/CLAUDE.md b/CLAUDE.md new file mode 100644 index 0000000..54b29b6 --- /dev/null +++ b/CLAUDE.md @@ -0,0 +1,91 @@ +# Arcádia Suite — Contexto para Claude + +## Stack +- **Frontend:** React 18 + TypeScript + Tailwind + shadcn/ui +- **Backend:** Express.js + Socket.IO + Drizzle ORM +- **DB:** PostgreSQL 16 + pgvector +- **Microserviços Python:** FastAPI (portas 8001-8005) +- **Deploy:** Docker Compose + Coolify + PM2 +- **Real-time:** Socket.IO + +## Estrutura principal +``` +server/ + manus/service.ts # Agente principal (169KB, 30+ tools, ReAct pattern) + autonomous/ # Pipeline multi-agente (Architect→CodeGen→Validator) + blackboard/ # Coordenação de agentes + python/ # 8 microserviços Python (fisco, contabil, bi, etc.) + learning/service.ts # Knowledge management + [modulo]/routes.ts # 38 grupos de rotas (crm, erp, whatsapp, chat...) +client/ # 66 páginas React +shared/schema.ts # Schema do banco (7317 linhas, Drizzle ORM) +docker/ + litellm-config.yaml # Roteamento de LLMs (TIER 1: LLMFit, TIER 2: Ollama, TIER 3: externos) +``` + +## Arquitetura de IA +``` +Manus / Agents / Embeddings + │ AI_INTEGRATIONS_OPENAI_BASE_URL + ▼ + LiteLLM :4000 (gateway unificado, loga tudo no banco) + ├──► LLMFit (TIER 1 — fine-tuned, soberano) [slot pronto, comentado] + ├──► Ollama :11434 (TIER 2 — local, padrão) + └──► OpenAI/Anthropic/Groq (TIER 3 — opt-in, só se API key configurada) +``` + +**Variáveis chave do Manus:** +``` +AI_INTEGRATIONS_OPENAI_BASE_URL=http://litellm:4000/v1 +AI_INTEGRATIONS_OPENAI_API_KEY=${LITELLM_API_KEY} +``` + +## Docs estratégicos +- `DOCUMENTATION.md` — docs técnicas completas +- `PLANO_EVOLUCAO_ARCADIA.md` — roadmap e evolução +- `MAPA_SISTEMA_ARCADIA.md` — mapa do sistema + +## Branch de desenvolvimento +Sempre commitar em: `claude/analyze-project-0mXjP` +Push: `git push -u origin claude/analyze-project-0mXjP` + +## O que está implementado +- ✅ Manus (agente autônomo, 30+ ferramentas) +- ✅ Pipeline de agentes autônomos +- ✅ Embeddings semânticos (pgvector) +- ✅ CRM, WhatsApp, Email, Chat +- ✅ ERP/ERPNext, Fiscal (NF-e, SPED), Contábil (DRE, balanço) +- ✅ BI workspace, Retail/POS, RH, Produtividade +- ✅ Docker dev + prod, LiteLLM gateway + +## O que ainda falta +- ❌ LLMFit: slot pronto em `litellm-config.yaml`, só habilitar quando disponível +- ❌ Testes automatizados / CI-CD +- ❌ Monitoramento (APM, Sentry, métricas) +- ❌ Multi-tenancy completo +- ❌ Rate limiting em todos os endpoints (parcial) + +## Comandos úteis +```bash +# Dev +docker compose up -d +docker compose --profile ai up litellm ollama -d + +# Prod (Coolify) +docker compose -f docker-compose.prod.yml up -d + +# Migrations +npm run db:push + +# Build +npm run build +``` + +## Variáveis de ambiente críticas (ver .env.example) +``` +SESSION_SECRET, SSO_SECRET # gerar strings seguras em prod +AI_INTEGRATIONS_OPENAI_BASE_URL # aponta para LiteLLM +LLMFIT_BASE_URL # LLMFit quando disponível +OLLAMA_BASE_URL # Ollama host ou container +OPENAI_API_KEY # opcional (soberania: deixar vazio) +``` diff --git a/docker-compose.prod.yml b/docker-compose.prod.yml index 732542d..af01a8c 100644 --- a/docker-compose.prod.yml +++ b/docker-compose.prod.yml @@ -58,6 +58,11 @@ services: 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: @@ -154,7 +159,8 @@ services: networks: - arcadia-internal - # ── LiteLLM (proxy de LLM) ─────────────────────────────────────────────────── + # ── 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 @@ -164,10 +170,25 @@ services: 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 — ativar se o servidor tiver RAM suficiente) ────────── + # ── 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 @@ -175,19 +196,23 @@ services: - ollama_models:/root/.ollama networks: - arcadia-internal + # Remova 'profiles: [ai]' para ativar por padrão no deploy profiles: [ai] - # ── Open WebUI ─────────────────────────────────────────────────────────────── + # ── Open WebUI (interface para Ollama + LLMFit) ─────────────────────────────── open-webui: image: ghcr.io/open-webui/open-webui:main restart: always environment: - OLLAMA_BASE_URL: http://ollama:11434 + # 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: - - ollama + - litellm networks: - arcadia-internal - arcadia-public diff --git a/docker/litellm-config.yaml b/docker/litellm-config.yaml index 30ddfb1..336d872 100644 --- a/docker/litellm-config.yaml +++ b/docker/litellm-config.yaml @@ -1,20 +1,34 @@ -# LiteLLM — Proxy unificado de LLMs para o Arcádia Suite +# LiteLLM — Gateway unificado de LLMs para o Arcádia Suite # Documentação: https://docs.litellm.ai/docs/proxy/configs +# +# ESTRATÉGIA DE SOBERANIA DOS DADOS: +# ┌─────────────────────────────────────────────────────────────────────────┐ +# │ TIER 1 (soberania total): LLMFit — modelos fine-tuned locais │ +# │ TIER 2 (soberania total): Ollama — modelos open source no servidor │ +# │ 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. +# Nunca chamam APIs externas diretamente. model_list: - # ── OpenAI (quando disponível) ─────────────────────────────────────────────── - - model_name: gpt-4o - litellm_params: - model: openai/gpt-4o - api_key: os.environ/OPENAI_API_KEY + # ── TIER 1: LLMFit (modelos fine-tuned locais — máxima soberania) ──────────── + # Descomente quando o LLMFit estiver rodando no servidor + # O LLMFit expõe API compatível com OpenAI — basta apontar a URL + # + # - model_name: arcadia-finetuned + # litellm_params: + # model: openai/arcadia-v1 # nome do modelo no LLMFit + # api_base: os.environ/LLMFIT_BASE_URL + # api_key: llmfit-internal + # + # - model_name: arcadia-embed + # litellm_params: + # model: openai/arcadia-embed-v1 # modelo de embeddings fine-tuned + # api_base: os.environ/LLMFIT_BASE_URL + # api_key: llmfit-internal - - model_name: gpt-4o-mini - litellm_params: - model: openai/gpt-4o-mini - api_key: os.environ/OPENAI_API_KEY - - # ── Ollama (LLMs locais — soberania) ───────────────────────────────────────── + # ── TIER 2: Ollama (LLMs locais — soberania total) ─────────────────────────── - model_name: llama3.3 litellm_params: model: ollama/llama3.3 @@ -30,26 +44,61 @@ model_list: model: ollama/deepseek-r1:7b api_base: os.environ/OLLAMA_BASE_URL - # ── Modelo padrão: tenta OpenAI, fallback para Ollama ─────────────────────── - - model_name: arcadia-default + - model_name: nomic-embed-text + litellm_params: + model: ollama/nomic-embed-text + api_base: os.environ/OLLAMA_BASE_URL + + # ── TIER 3: OpenAI (opt-in — só ativo se OPENAI_API_KEY configurado) ───────── + - model_name: gpt-4o + litellm_params: + model: openai/gpt-4o + api_key: os.environ/OPENAI_API_KEY + + - model_name: gpt-4o-mini litellm_params: model: openai/gpt-4o-mini api_key: os.environ/OPENAI_API_KEY + + # ── TIER 3: Anthropic (opt-in — descomente para habilitar) ─────────────────── + # - model_name: claude-sonnet + # litellm_params: + # model: anthropic/claude-sonnet-4-6 + # api_key: os.environ/ANTHROPIC_API_KEY + + # ── TIER 3: Groq (opt-in — inferência rápida sem dados persistidos) ────────── + # - model_name: groq-llama + # litellm_params: + # model: groq/llama-3.3-70b-versatile + # api_key: os.environ/GROQ_API_KEY + + # ── Modelo padrão do Arcádia (Manus usa este) ───────────────────────────────── + # Prioridade: LLMFit → OpenAI (se configurado) → Ollama (sempre disponível) + # Para soberania total: remova o fallback para gpt-4o-mini + - model_name: arcadia-default + litellm_params: + model: ollama/llama3.3 + api_base: os.environ/OLLAMA_BASE_URL model_info: - fallbacks: ["llama3.3"] + # fallbacks: ["gpt-4o-mini"] # descomente para habilitar fallback externo router_settings: routing_strategy: least-busy fallbacks: - {"gpt-4o": ["llama3.3"]} - - {"gpt-4o-mini": ["qwen2.5-coder"]} + - {"gpt-4o-mini": ["llama3.3"]} - {"arcadia-default": ["llama3.3"]} litellm_settings: drop_params: true request_timeout: 120 set_verbose: false + # Loga todas as chamadas no banco — essencial para auditoria e soberania + success_callback: ["langfuse"] + failure_callback: ["langfuse"] general_settings: master_key: os.environ/LITELLM_MASTER_KEY database_url: os.environ/DATABASE_URL + # Habilita interface de gestão do LiteLLM (opcional) + # ui_access_mode: "all"