From 5816c14d00f730a7dd41a97aed79f5e2d2def954 Mon Sep 17 00:00:00 2001 From: Claude Date: Fri, 13 Mar 2026 17:07:41 +0000 Subject: [PATCH] =?UTF-8?q?feat:=20integra=C3=A7=C3=A3o=20Manus=E2=86=92Li?= =?UTF-8?q?teLLM=20gateway=20+=20slot=20LLMFit=20+=20soberania=20de=20dado?= =?UTF-8?q?s?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - 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 --- .env.example | 23 ++++++++++- docker-compose.prod.yml | 35 +++++++++++++--- docker/litellm-config.yaml | 81 ++++++++++++++++++++++++++++++-------- 3 files changed, 116 insertions(+), 23 deletions(-) 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/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"