83 lines
2.9 KiB
Python
83 lines
2.9 KiB
Python
"""Starlette REST Route Handlers for GCP Solution Architecture Agent."""
|
|
|
|
import logging
|
|
from typing import Any, Dict
|
|
from starlette.requests import Request
|
|
from starlette.responses import JSONResponse
|
|
|
|
from app.card import AGENT_CARD
|
|
from app.config import get_settings
|
|
from app.skills.loader import SkillLoader
|
|
from app.tools.validation_tools import validate_repository_artifacts
|
|
from app.workflows.gcp_architecture_graph import create_agent
|
|
|
|
logger = logging.getLogger(__name__)
|
|
|
|
|
|
async def health_check(request: Request) -> JSONResponse:
|
|
"""GET /health - Operational health endpoint."""
|
|
settings = get_settings()
|
|
return JSONResponse({
|
|
"status": "healthy",
|
|
"agent": settings.AGENT_NAME,
|
|
"version": settings.AGENT_VERSION,
|
|
})
|
|
|
|
|
|
async def get_card(request: Request) -> JSONResponse:
|
|
"""GET /card - Agent metadata and capability card."""
|
|
return JSONResponse(AGENT_CARD)
|
|
|
|
|
|
async def run_workflow(request: Request) -> JSONResponse:
|
|
"""POST /generate - Execute full 4-phase GCP Solution Architecture workflow."""
|
|
try:
|
|
body = await request.json() if request.headers.get("content-type") == "application/json" else {}
|
|
except Exception:
|
|
body = {}
|
|
|
|
workflow_request = body.get("request", "Default event-driven HTTP architecture")
|
|
target_dir = body.get("target_dir", ".")
|
|
|
|
settings = get_settings()
|
|
loader = SkillLoader(settings.SKILLS_DIR)
|
|
loader.load_skills()
|
|
|
|
agent = create_agent(loader)
|
|
initial_state = {
|
|
"workflow_request": workflow_request,
|
|
"target_dir": target_dir,
|
|
"active_skills": [],
|
|
}
|
|
|
|
final_state = agent.invoke(initial_state)
|
|
|
|
return JSONResponse({
|
|
"status": "success",
|
|
"phases_completed": ["discover", "design", "validate", "package"],
|
|
"validation_passed": final_state.get("validation_passed", True),
|
|
"artifacts": {
|
|
"requirements_doc": final_state.get("requirements_doc"),
|
|
"architecture_doc": final_state.get("architecture_doc"),
|
|
"mermaid_diagram": final_state.get("mermaid_diagram"),
|
|
"terraform_code": final_state.get("terraform_code"),
|
|
"validation_results": final_state.get("validation_results"),
|
|
"solution_guide": final_state.get("solution_guide"),
|
|
},
|
|
"active_skills": final_state.get("active_skills", []),
|
|
})
|
|
|
|
|
|
async def validate_artifacts_route(request: Request) -> JSONResponse:
|
|
"""POST /validate - Run pre-deployment validation checks against target directory."""
|
|
try:
|
|
body = await request.json() if request.headers.get("content-type") == "application/json" else {}
|
|
except Exception:
|
|
body = {}
|
|
|
|
target_dir = body.get("target_dir", ".")
|
|
result = validate_repository_artifacts.invoke({"target_dir": target_dir})
|
|
|
|
status_code = 200 if result.get("valid") else 400
|
|
return JSONResponse(result, status_code=status_code)
|