from __future__ import annotations import json import logging from typing import Any, Dict from langchain_core.messages import HumanMessage from ai_business_automation_agent.prompts.reporting_prompt import REPORTING_PROMPT from ai_business_automation_agent.utils import append_agent_log, parse_llm_json logger = logging.getLogger(__name__) def run_reporting_agent(state: Dict[str, Any], llm) -> Dict[str, Any]: prompt = REPORTING_PROMPT.format( email_content=state.get("email_content", ""), extracted_json=json.dumps(state.get("extracted_data") or {}, ensure_ascii=False), vendor_verification_json=json.dumps(state.get("vendor_verification") or {}, ensure_ascii=False), validation_json=json.dumps(state.get("validation_status") or {}, ensure_ascii=False), decision_json=json.dumps(state.get("decision") or {}, ensure_ascii=False), erp_json=json.dumps(state.get("erp_update_status") or {}, ensure_ascii=False), ) resp = llm.invoke([HumanMessage(content=prompt)]) text = getattr(resp, "content", str(resp)) parsed, err = parse_llm_json(text) updates: Dict[str, Any] = {} if err: logger.warning("Reporting JSON parse error: %s", err) updates["report"] = ( "REPORT GENERATION FAILED\n\n" f"Error: {err}\n\n" "Raw model output:\n" f"{text}" ) updates.update(append_agent_log(state, agent="reporting", event="error", payload={"error": err})) else: updates["report"] = parsed.get("report", "") updates.update(append_agent_log(state, agent="reporting", event="ok", payload=parsed)) updates.update(append_agent_log(state, agent="reporting", event="prompt", payload={"prompt": prompt})) updates.update(append_agent_log(state, agent="reporting", event="raw_response", payload={"text": text})) return updates