From 97f0ead1fb982f5840f617170a8fbf5d2639ed83 Mon Sep 17 00:00:00 2001 From: chrischristiansen-glitch Date: Tue, 9 Jun 2026 23:43:15 +0200 Subject: [PATCH] feat(CG5): add /billing/by-service endpoint --- agents/core-logic/app.py | 22 +++++++++++++++++++++- 1 file changed, 21 insertions(+), 1 deletion(-) diff --git a/agents/core-logic/app.py b/agents/core-logic/app.py index 9362beb..71335fe 100644 --- a/agents/core-logic/app.py +++ b/agents/core-logic/app.py @@ -2,6 +2,7 @@ # OSVauco-NMTMD-GCOS — FastAPI HTTP entrypoint for Cloud Run import os +import sys import logging from contextlib import asynccontextmanager @@ -12,6 +13,9 @@ from pydantic import BaseModel logging.basicConfig(level=logging.INFO) logger = logging.getLogger(__name__) +# Allow imports from repo root (e.g. ml.billing_agent) +sys.path.insert(0, os.path.join(os.path.dirname(__file__), '..', '..')) + try: from google.adk.runners import Runner from google.adk.sessions import InMemorySessionService @@ -167,10 +171,11 @@ async def billing_tokens_summary(): logger.error(f"[/billing/tokens/summary] Failed: {e}", exc_info=True) raise HTTPException(status_code=500, detail=str(e)) + @app.get("/billing/recommendations") async def billing_recommendations(budget: float = 500.0): """ - CG4 — Kjører anbefalings- og anomali-motoren. + CG4 — Kjorer anbefalings- og anomali-motoren. Returnerer en liste med anbefalinger og estimert besparelse. """ try: @@ -179,3 +184,18 @@ async def billing_recommendations(budget: float = 500.0): except Exception as e: logger.error(f"[/billing/recommendations] Failed: {e}", exc_info=True) raise HTTPException(status_code=500, detail=str(e)) + + +@app.get("/billing/by-service") +async def billing_by_service(days: int = 30): + """ + CG5 — Returnerer kostnad per tjeneste gruppert med SKU-detaljer. + Brukes av dashboard for grouped drill-down visning. + """ + try: + from ml.billing_agent import BillingAgent + agent = BillingAgent() + return JSONResponse(agent.get_service_totals(days)) + except Exception as e: + logger.error(f"[/billing/by-service] Failed: {e}", exc_info=True) + raise HTTPException(status_code=500, detail=str(e))