From 76adec589350ba2138023ae1b4e4fde5094d0863 Mon Sep 17 00:00:00 2001 From: Jonas Pacheco Date: Wed, 25 Mar 2026 14:22:39 -0300 Subject: [PATCH] feat: MiroFlow containerizado no docker-compose MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - Dockerfile.miroflow: imagem Python 3.11 com miroflow instalado via submodule - docker-compose.prod.yml: novo serviço `miroflow` (porta 8006, rede interna) - MIROFLOW_HOST atualizado de host fixo (10.0.7.1) para container `miroflow` - miroflow_service.py: passa system_prompt e initial_user_message no AgentContext Co-Authored-By: Claude Sonnet 4.6 --- Dockerfile.miroflow | 24 ++++++++++++++++++++++++ docker-compose.prod.yml | 15 +++++++++++++++ server/python/miroflow_service.py | 10 +++++++++- 3 files changed, 48 insertions(+), 1 deletion(-) create mode 100644 Dockerfile.miroflow diff --git a/Dockerfile.miroflow b/Dockerfile.miroflow new file mode 100644 index 0000000..87eaa72 --- /dev/null +++ b/Dockerfile.miroflow @@ -0,0 +1,24 @@ +FROM python:3.11-slim + +WORKDIR /app + +RUN apt-get update && apt-get install -y --no-install-recommends \ + gcc \ + && rm -rf /var/lib/apt/lists/* + +# Instalar MiroFlow e suas dependências direto do submodule +COPY server/modules/miroflow/ ./server/modules/miroflow/ +RUN pip install --no-cache-dir -e ./server/modules/miroflow/ + +# Copiar o service script +COPY server/python/miroflow_service.py ./server/python/miroflow_service.py + +ENV MIROFLOW_PORT=8006 +ENV OLLAMA_BASE_URL=http://host.docker.internal:11434 + +EXPOSE 8006 + +HEALTHCHECK --interval=30s --timeout=10s --start-period=30s --retries=3 \ + CMD python -c "import urllib.request; urllib.request.urlopen('http://localhost:8006/health')" || exit 1 + +CMD ["python", "server/python/miroflow_service.py"] diff --git a/docker-compose.prod.yml b/docker-compose.prod.yml index 17af50f..05a24b7 100644 --- a/docker-compose.prod.yml +++ b/docker-compose.prod.yml @@ -77,6 +77,9 @@ services: ERPNEXT_URL: ${ERPNEXT_URL:-http://erpnext:8080} ERPNEXT_API_KEY: ${ERPNEXT_API_KEY:-} ERPNEXT_API_SECRET: ${ERPNEXT_API_SECRET:-} + # ── MiroFlow (container) ───────────────────────────────────────────── + MIROFLOW_HOST: "miroflow" + MIROFLOW_PORT: "8006" healthcheck: test: ["CMD-SHELL", "wget -qO- http://127.0.0.1:5000/api/health || exit 1"] interval: 30s @@ -201,6 +204,18 @@ services: - arcadia-internal + # ── MiroFlow (agente científico) ───────────────────────────────────────────── + miroflow: + build: + context: . + dockerfile: Dockerfile.miroflow + restart: always + environment: + MIROFLOW_PORT: "8006" + OLLAMA_BASE_URL: ${OLLAMA_BASE_URL:-http://10.0.7.1:11434} + networks: + - arcadia-internal + # ── Microserviços Python ───────────────────────────────────────────────────── contabil: build: diff --git a/server/python/miroflow_service.py b/server/python/miroflow_service.py index fe3a889..a8daf64 100644 --- a/server/python/miroflow_service.py +++ b/server/python/miroflow_service.py @@ -65,7 +65,15 @@ async def run_agent(agent_type: str, task: str) -> tuple[str, str]: raise ValueError(f"Agente desconhecido: {agent_type}. Use: {list(AGENT_MODELS.keys())}") cfg = make_agent_cfg(agent_type) agent = build_agent(cfg) - ctx = AgentContext(task_description=task) + ctx = AgentContext( + task_description=task, + system_prompt=( + "Você é um agente científico da Arcádia Suite especializado em análise de dados " + "empresariais. Responda em português de forma clara e objetiva. " + "Quando precisar de dados, explique o que analisaria e quais conclusões seriam esperadas." + ), + initial_user_message=task, + ) result = await agent.run(ctx) text = result.get("summary", str(result)) if isinstance(result, dict) else str(result) return text, cfg["llm"]["model_name"]