263 lines
7.8 KiB
Markdown
263 lines
7.8 KiB
Markdown
# Integração de IA — Ollama + LLMFit no Servidor
|
|
|
|
Guia para conectar o Arcádia Suite às IAs locais em produção.
|
|
|
|
---
|
|
|
|
## Visão geral do fluxo
|
|
|
|
```
|
|
Arcádia Suite (Manus, Agents, Embeddings)
|
|
│
|
|
│ http://litellm:4000/v1
|
|
▼
|
|
LiteLLM (porta 4000) — gateway único
|
|
│
|
|
├──► LLMFit (seus modelos fine-tuned) [TIER 1 — prioridade]
|
|
└──► Ollama (modelos open source locais) [TIER 2 — padrão/fallback]
|
|
```
|
|
|
|
Nenhum serviço do Arcádia chama Ollama ou LLMFit diretamente.
|
|
Tudo passa pelo LiteLLM — que roteia, loga e faz fallback automaticamente.
|
|
|
|
---
|
|
|
|
## Cenário A: Ollama já instalado no servidor (fora do Docker)
|
|
|
|
### 1. Verificar se o Ollama responde
|
|
|
|
```bash
|
|
curl http://localhost:11434/api/tags
|
|
# Deve retornar a lista de modelos instalados
|
|
```
|
|
|
|
### 2. Configurar a variável no Coolify
|
|
|
|
```
|
|
OLLAMA_BASE_URL=http://host-gateway:11434
|
|
```
|
|
|
|
> `host-gateway` é o endereço do host dentro da rede Docker.
|
|
> Se não funcionar, use o IP da interface de rede do servidor (ex: `http://192.168.1.X:11434`).
|
|
|
|
### 3. Desativar o container Ollama (não precisa dos dois)
|
|
|
|
No Coolify, não suba o profile `ai` se não for usar o container Docker do Ollama:
|
|
```bash
|
|
# Sobe tudo EXCETO ollama e open-webui
|
|
docker compose -f docker-compose.prod.yml up -d
|
|
# Sobe só o LiteLLM (necessário sempre)
|
|
docker compose -f docker-compose.prod.yml --profile ai up litellm -d
|
|
```
|
|
|
|
### 4. Puxar os modelos necessários
|
|
|
|
```bash
|
|
# Modelos usados pelo Arcádia (mínimo recomendado)
|
|
ollama pull llama3.3 # agente principal (Manus)
|
|
ollama pull nomic-embed-text # embeddings semânticos
|
|
ollama pull qwen2.5-coder:7b # geração de código (DevCenter)
|
|
ollama pull deepseek-r1:7b # raciocínio complexo
|
|
```
|
|
|
|
---
|
|
|
|
## Cenário B: Ollama como container Docker
|
|
|
|
Use este cenário se o Ollama NÃO está instalado no servidor.
|
|
|
|
### 1. Configurar variável
|
|
|
|
```
|
|
OLLAMA_BASE_URL=http://ollama:11434
|
|
```
|
|
|
|
### 2. Subir com o profile ai
|
|
|
|
```bash
|
|
docker compose -f docker-compose.prod.yml --profile ai up -d
|
|
```
|
|
|
|
### 3. Puxar modelos após container subir
|
|
|
|
```bash
|
|
docker exec -it $(docker ps -qf "name=ollama") ollama pull llama3.3
|
|
docker exec -it $(docker ps -qf "name=ollama") ollama pull nomic-embed-text
|
|
docker exec -it $(docker ps -qf "name=ollama") ollama pull qwen2.5-coder:7b
|
|
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
|
|
|
|
Configure todas no Coolify antes do deploy:
|
|
|
|
```bash
|
|
# ── Banco ─────────────────────────────────────────────────────────────────────
|
|
PGPASSWORD= # senha forte, não use a padrão
|
|
DATABASE_URL=postgresql://arcadia:SENHA@db:5432/arcadia
|
|
|
|
# ── Segurança (gerar com: openssl rand -hex 32) ────────────────────────────────
|
|
SESSION_SECRET=
|
|
SSO_SECRET=
|
|
LITELLM_API_KEY=
|
|
WEBUI_SECRET_KEY=
|
|
SUPERSET_SECRET_KEY=
|
|
|
|
# ── Manus → LiteLLM (não alterar — já configurado) ───────────────────────────
|
|
AI_INTEGRATIONS_OPENAI_BASE_URL=http://litellm:4000/v1
|
|
AI_INTEGRATIONS_OPENAI_API_KEY=${LITELLM_API_KEY}
|
|
|
|
# ── Ollama ────────────────────────────────────────────────────────────────────
|
|
# Ollama no host: http://host-gateway:11434
|
|
# Ollama em container: http://ollama: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) ───────────────────
|
|
OPENAI_API_KEY=
|
|
ANTHROPIC_API_KEY=
|
|
GROQ_API_KEY=
|
|
|
|
# ── Domínio ───────────────────────────────────────────────────────────────────
|
|
DOMAIN=seudominio.com.br
|
|
```
|
|
|
|
---
|
|
|
|
## Verificar se a integração está funcionando
|
|
|
|
### 1. Testar LiteLLM direto
|
|
|
|
```bash
|
|
curl http://localhost:4000/v1/chat/completions \
|
|
-H "Authorization: Bearer SEU_LITELLM_API_KEY" \
|
|
-H "Content-Type: application/json" \
|
|
-d '{"model":"arcadia-default","messages":[{"role":"user","content":"Oi"}]}'
|
|
```
|
|
|
|
### 2. Testar Manus via interface
|
|
|
|
Acesse `https://seudominio.com.br` → abra o Manus → envie uma mensagem simples.
|
|
O Manus deve responder via Ollama (ou LLMFit se configurado).
|
|
|
|
### 3. Ver logs em tempo real
|
|
|
|
```bash
|
|
# Logs do LiteLLM (todas as chamadas de IA)
|
|
docker compose logs -f litellm
|
|
|
|
# Logs do app (Manus, erros, requests)
|
|
docker compose logs -f app
|
|
```
|
|
|
|
---
|
|
|
|
## Ordem de inicialização recomendada
|
|
|
|
```bash
|
|
# 1. Banco e Redis
|
|
docker compose -f docker-compose.prod.yml up -d db redis
|
|
|
|
# 2. Aguardar banco ficar saudável
|
|
docker compose -f docker-compose.prod.yml ps # esperar db = healthy
|
|
|
|
# 3. Migrations (primeira vez ou após atualização de schema)
|
|
docker compose -f docker-compose.prod.yml run --rm app npm run db:push
|
|
|
|
# 4. LiteLLM
|
|
docker compose -f docker-compose.prod.yml up -d litellm
|
|
|
|
# 5. App + microserviços Python
|
|
docker compose -f docker-compose.prod.yml up -d app contabil bi automation fisco embeddings
|
|
|
|
# 6. Ollama (se usando container)
|
|
docker compose -f docker-compose.prod.yml --profile ai up -d ollama
|
|
# Aguardar e puxar modelos:
|
|
docker exec $(docker ps -qf "name=ollama") ollama pull llama3.3
|
|
docker exec $(docker ps -qf "name=ollama") ollama pull nomic-embed-text
|
|
```
|
|
|
|
---
|
|
|
|
## Dúvidas frequentes
|
|
|
|
**O Manus não responde / trava**
|
|
→ Verifique se o LiteLLM está de pé: `docker compose logs litellm`
|
|
→ Verifique se o Ollama tem o modelo: `ollama list`
|
|
|
|
**Erro "model not found" no LiteLLM**
|
|
→ O modelo referenciado em `litellm-config.yaml` não foi baixado no Ollama.
|
|
→ 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**
|
|
→ 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
|