Files
agent_contas/Makefile

119 lines
6.5 KiB
Makefile

# Variables
PROJECT_NAME=agente-de-contas-backend
# Detecta o comando de compose disponível, priorizando Podman
DOCKER_COMPOSE := $(shell command -v podman >/dev/null 2>&1 && (podman compose version >/dev/null 2>&1 && echo "podman compose" || echo "podman-compose") || (command -v docker-compose >/dev/null 2>&1 && echo "docker-compose" || echo "docker compose"))
.PHONY: help deploy down logs shell check-tools health-check local-observability-up local-observability-down prepare-local-pubsub-env validate-local-pubsub pull-local-pubsub local-api-pubsub-up local-api-pubsub-down local-api-pubsub-logs validate-oci-migration-setup validate-oci-migration llm-test add-case
help: ## Show this help menu
@echo "Available targets for Project: $(PROJECT_NAME)"
@grep -E '^[a-zA-Z_-]+:.*?## .*$$' $(MAKEFILE_LIST) | sort | awk 'BEGIN {FS = ":.*?## "}; {printf " %-15s %s\n", $$1, $$2}'
deploy: down ## Full clean deployment flow (Down -> Build No-Cache -> Up)
@echo "Building Docker image (no cache)..."
$(DOCKER_COMPOSE) build --no-cache
@echo "Starting containers..."
$(DOCKER_COMPOSE) up -d
@echo "Deployment completed!"
down: ## Stop and remove containers
@echo "Stopping containers..."
$(DOCKER_COMPOSE) down
logs: ## Tail the containers logs
@echo "Showing logs..."
$(DOCKER_COMPOSE) logs -f backend
shell: ## Open a shell inside the backend container
@echo "Opening shell..."
$(DOCKER_COMPOSE) exec backend /bin/bash
check-tools: ## Check if required tools are installed
@echo "Checking tools..."
@command -v make >/dev/null 2>&1 && echo " Make: [OK]" || echo " Make: [MISSING]"
@command -v podman >/dev/null 2>&1 && echo " Podman: [OK]" || echo " Podman: [NOT FOUND]"
@podman compose version >/dev/null 2>&1 && echo " Podman Compose Plugin: [OK]" || echo " Podman Compose Plugin: [MISSING]"
@echo "Selected compose command: $(DOCKER_COMPOSE)"
health-check: ## Test the application health check
@echo "Testing health check..."
@curl -f http://localhost:8000/health || echo "Health check failed!"
local-oracle-state-test: ## Test Oracle state using local .env (RAG disabled)
@test -f .env || (echo ".env local nao encontrado"; exit 1)
@set -a; . ./.env; set +a; TIM_RUN_ORACLE_STATE_INTEGRATION=1 uv run pytest -q tests/integration/test_oracle_state_pool_integration.py
local-api-oracle-state: ## Start API with Oracle state from local .env (RAG disabled)
@test -f .env || (echo ".env local nao encontrado"; exit 1)
@set -a; . ./.env; set +a; uv run uvicorn agente_contas_tim.api.app:app --reload
local-observability-up: ## Start local Pub/Sub emulator and Mongo sequence
COMPOSE_DISABLE_ENV_FILE=1 $(DOCKER_COMPOSE) -f docker-compose.local-observability.yml up -d
local-observability-down: ## Stop local observability fakes
COMPOSE_DISABLE_ENV_FILE=1 $(DOCKER_COMPOSE) -f docker-compose.local-observability.yml down
prepare-local-pubsub-env: ## Create local Pub/Sub fake credentials, topic and subscription
uv run --locked --no-sync python scripts/validate_local_pubsub_emulator.py --prepare-only
validate-local-pubsub: ## Emit IC/RCT/NOC through the OCI bridge into local Pub/Sub/OTLP fakes
uv run --locked --no-sync python scripts/validate_local_pubsub_emulator.py --require-otel
pull-local-pubsub: ## Pull messages already published by the app to local Pub/Sub emulator
uv run --locked --no-sync python scripts/validate_local_pubsub_emulator.py --pull-only --pull-timeout 60
local-api-pubsub-up: local-observability-up prepare-local-pubsub-env ## Start backend API pointing to local Pub/Sub emulator
COMPOSE_DISABLE_ENV_FILE=1 $(DOCKER_COMPOSE) -f docker-compose.yml -f docker-compose.local-api-pubsub.yml up -d --build backend
local-api-pubsub-down: ## Stop backend API started with local Pub/Sub emulator override
COMPOSE_DISABLE_ENV_FILE=1 $(DOCKER_COMPOSE) -f docker-compose.yml -f docker-compose.local-api-pubsub.yml down
local-api-pubsub-logs: ## Tail backend API logs for local Pub/Sub emulator validation
COMPOSE_DISABLE_ENV_FILE=1 $(DOCKER_COMPOSE) -f docker-compose.yml -f docker-compose.local-api-pubsub.yml logs -f backend
validate-oci-migration-setup: ## Sync dependencies for local OCI observer migration validation
uv sync --locked
validate-oci-migration: ## Validate locally phases 1-4 of the OCI observer migration
@echo "Checking uv.lock consistency..."
uv lock --check
@echo "Checking legacy framework dependency/import removal..."
@if if command -v rg >/dev/null 2>&1; then \
rg -n 'agent-framework==2\.6\.4|agent_framework\.guardrails_old|guardrails_old|Compass|compass' pyproject.toml uv.lock agente_contas_tim workflows tests agent_framework_oci/libs/agent_framework/src; \
else \
grep -RInE 'agent-framework==2\.6\.4|agent_framework\.guardrails_old|guardrails_old|Compass|compass' pyproject.toml uv.lock agente_contas_tim workflows tests agent_framework_oci/libs/agent_framework/src; \
fi; then \
echo "Legacy framework dependency/import references found"; \
exit 1; \
else \
echo "Legacy framework dependency/import references: OK"; \
fi
@echo "Checking Python compilation..."
uv run --locked --no-sync python -m compileall agente_contas_tim agent_framework_oci/libs/agent_framework/src/agent_framework -q
@echo "Checking diff whitespace..."
git diff --check develop...HEAD
@echo "Running focused migration tests..."
uv run --locked --no-sync python -m pytest \
tests/observability/test_oracle_migration_phase1_contract.py \
tests/observability/test_agent_framework_bridge.py \
tests/observability/test_agent_framework_oci_tim_contract.py \
tests/observability/test_observability.py \
tests/observability/test_langfuse_pii_masking.py \
tests/api/test_health_routes.py \
tests/api/test_app_metadata.py \
tests/integrations/test_business_context.py \
tests/integrations/test_grl_events.py \
tests/judges/test_evaluator.py \
tests/api/test_agent_sse_context_aliases.py \
tests/agent/test_invoice_context_provider.py \
tests/guardrails/test_compliance_anatel.py \
tests/guardrails/test_ausencia_oferta_proativa.py \
tests/guardrails/test_verbalizacao_prematura.py \
-q
llm-test: ## Roda uma suíte LLM por SUITE: intent|intent-transcricao|orch|matcher|processing-interruption|workflow-answer|reescrita|guardrails|input|output|det|pinj|oos|aoferta|tox|revprec|... [ARGS="--repeat 3 --only X"]
RUN_LLM_TESTS=1 uv run --locked --no-sync python -m tests.llm_tests $(SUITE) $(ARGS)
add-case: ## Consome o paste de tests/llm_tests/paste_inbox.json e cria o caso (intent/orch auto); esvazia o inbox
uv run --locked --no-sync python -m tests.llm_tests.add_case_from_paste $(ARGS)