feat: integração Manus→LiteLLM gateway + slot LLMFit + soberania de dados

- Conecta Manus ao LiteLLM via AI_INTEGRATIONS_OPENAI_BASE_URL (era hardcoded para OpenAI)
- Adiciona OLLAMA_BASE_URL ao serviço litellm no docker-compose.prod.yml (fix crítico: sem isso o fallback para Ollama não funcionava)
- Adiciona DATABASE_URL ao litellm para logging/auditoria de chamadas LLM
- Open WebUI agora também aponta para LiteLLM (acesso a todos os modelos na interface)
- litellm-config.yaml: slot comentado para LLMFit (TIER 1), Ollama como padrão soberano (TIER 2), externos como opt-in (TIER 3)
- Adiciona modelo nomic-embed-text para embeddings locais via Ollama
- .env.example: documenta AI_INTEGRATIONS_*, LLMFIT_BASE_URL, providers externos opcionais
- arcadia-default agora aponta para llama3.3 (Ollama) por padrão — soberania total sem configuração adicional

Estratégia de soberania:
  Dados NUNCA saem sem configuração explícita de API key externa.
  LLMFit turbocharge: quando ativado, modelos fine-tuned têm prioridade sobre Ollama.

https://claude.ai/code/session_01DinH3VcgbAv1d9MqnNxzdb
This commit is contained in:
Claude 2026-03-13 17:07:41 +00:00
parent 0c006da8a5
commit 5816c14d00
No known key found for this signature in database
3 changed files with 116 additions and 23 deletions

View File

@ -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

View File

@ -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

View File

@ -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"