Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
5 changes: 4 additions & 1 deletion .github/workflows/agent-deployment-test.yaml
Original file line number Diff line number Diff line change
@@ -1,7 +1,9 @@
# QG4: Agent Deployment Health Checks
#
# Nightly workflow: logs into the OpenShift demo cluster, deploys each
# agent via build-openshift + Helm, validates GET /health, and tears down.
# agent via build-openshift + Helm, validates health endpoints, and tears
# down. Pre-deployed agents (e.g., Langflow) skip build/deploy and only
# verify health on an already-running route.

name: "QG4: Agent Deployment Integration Tests"

Expand Down Expand Up @@ -66,6 +68,7 @@ jobs:
- { name: autogen-mcp-agent, dir: agents/autogen/templates/mcp_agent }
- { name: vanilla-python-openai-responses-agent, dir: agents/vanilla_python/templates/openai_responses_agent }
- { name: a2a-langgraph-crewai, dir: agents/a2a/templates/langgraph_crewai_agent }
- { name: langflow-simple-tool-calling-agent, dir: agents/langflow/templates/simple_tool_calling_agent }
include:
- agent: { name: langgraph-db-memory-agent, dir: agents/langgraph/templates/react_with_database_memory }
POSTGRES_HOST: ${{ vars.POSTGRES_HOST }}
Expand Down
2 changes: 1 addition & 1 deletion AGENTS.md
Original file line number Diff line number Diff line change
Expand Up @@ -68,7 +68,7 @@ ruff format --check path/to/file.py

Several agents diverge significantly from the standard pattern:

**langflow/templates/simple_tool_calling_agent** - Podman Compose flow-import deployment, not standalone FastAPI. No Dockerfile, pyproject.toml, main.py, src/, or tests/. Different Makefile targets (`init`, `ollama`, `run`, `stop`, `clean`). Uses infra-only env vars (PostgreSQL, Langfuse, Ollama) -- not `API_KEY`/`BASE_URL`/`MODEL_ID`.
**langflow/templates/simple_tool_calling_agent** - Podman Compose flow-import deployment, not standalone FastAPI. No Dockerfile, pyproject.toml, main.py, or src/. Has `tests/integration/` (pre-deployed health check only). Different Makefile targets (`init`, `ollama`, `run`, `stop`, `clean`, `test-integration`). Uses infra-only env vars (PostgreSQL, Langfuse, Ollama) -- not `API_KEY`/`BASE_URL`/`MODEL_ID`.

@coderabbitai coderabbitai Bot Jul 13, 2026 •

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

📐 Maintainability & Code Quality | 🟡 Minor | ⚡ Quick win

Document the actual readiness endpoint

This bullet should explicitly say GET /health_check, not just “pre-deployed health check”. The surrounding guidance defines GET /health as the standard contract, so the current wording is ambiguous and can send contributors to the wrong endpoint.

As per coding guidelines, agent-specific layout and workflow documentation should accurately describe this non-standard agent.

🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

In `@AGENTS.md` at line 71, Update the
langflow/templates/simple_tool_calling_agent bullet in AGENTS.md to explicitly
identify the pre-deployed readiness endpoint as GET /health_check,
distinguishing it from the standard GET /health contract while preserving the
existing deployment and workflow details.

Source: Coding guidelines

Copy link
Copy Markdown
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Fixed in e1db125 — updated the langflow entry to reflect tests/integration/ and the test-integration Makefile target.

Assisted by Claude Opus 4.6 (1M context)

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

@mpk-droid Thanks for the update! Looking at the current wording — "Has tests/integration/ (pre-deployed health check only)" — it still doesn't explicitly name the GET /health_check endpoint, which was the core ask (to avoid ambiguity with the standard GET /health contract mentioned elsewhere in the doc). If that's an intentional simplification, that's fine, but if you'd like it fully explicit, something like:

Has `tests/integration/` (verifies `GET /health_check` readiness endpoint only).

would remove any ambiguity for future contributors.


**a2a/templates/langgraph_crewai_agent** - Uses `python:3.12-slim` (not UBI9), PYTHONPATH `/app` (not `/opt/app-root/src`), `agents/a2a/deployment/` chart, `template.env` (not `.env.example`), `entrypoint.sh` (not `main.py`), Starlette (not FastAPI). No tests/ directory.

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -3,7 +3,7 @@ COMPOSE_FILE := local/podman-compose.yml
ENV_FILE := local/.env
MODEL ?= qwen2.5:7b

.PHONY: init ollama ogx-server run stop clean status logs help
.PHONY: init ollama ogx-server run stop clean status logs help test-integration

help: ## Show this help
@grep -E '^[a-zA-Z_-]+:.*?## .*$$' $(MAKEFILE_LIST) | awk 'BEGIN {FS = ":.*?## "}; {printf " %-12s %s\n", $$1, $$2}'
Expand Down Expand Up @@ -81,3 +81,9 @@ status: ## Show status of running services

logs: ## Tail logs from all services
@podman-compose -f $(COMPOSE_FILE) logs -f

test-integration: ## Run integration deployment test
PYTHONPATH=$$(git rev-parse --show-toplevel)/tests \
uv run --with pytest --with httpx --with pyyaml \
python -m pytest tests/integration/test_deployment.py \
-v --tb=long --junitxml=results.xml
Original file line number Diff line number Diff line change
@@ -0,0 +1,38 @@
from __future__ import annotations

import logging

import pytest
from integration.conftest import cluster_auth, repo_root # noqa: F401
from integration.utils import (
RouteNotFoundError,
get_route,
load_agent_name,
resolve_agent_dir,
)

logger = logging.getLogger(__name__)


@pytest.fixture(scope="module")
def agent_dir():
return resolve_agent_dir(__file__)


@pytest.fixture(scope="module")
def agent_name(agent_dir):
return load_agent_name(agent_dir)


@pytest.fixture(scope="module")
def deployed_agent(cluster_auth, agent_name): # noqa: F811
namespace = cluster_auth["namespace"]
try:
route_url = get_route(agent_name, namespace=namespace)
except RouteNotFoundError as exc:
pytest.fail(
f"Pre-deployed agent route not found: {exc}. "
"Ensure the agent is deployed before running integration tests."
)
logger.info("Pre-deployed agent at %s", route_url)
yield route_url
Original file line number Diff line number Diff line change
@@ -0,0 +1,10 @@
from __future__ import annotations

import pytest
from integration.utils import health_check


@pytest.mark.integration
def test_health_endpoint(deployed_agent):
result = health_check(f"{deployed_agent}/health_check", retries=12, backoff=5.0)
assert result["status"] == "ok"