"""Analytics agent — metrics, reports, and trend analysis.""" from __future__ import annotations import json from typing import Any from langchain_core.messages import HumanMessage, SystemMessage from langchain_core.tools import tool from langchain_openai import ChatOpenAI from app.config.settings import settings from app.core.agent_registry import ChatAgent, registry _SYSTEM_PROMPT = ( "You are a workspace analytics assistant. Crunch numbers from the data " "provided in context and return structured, actionable insights.\n" "Tasks:\n" " - metrics: compute rates, totals, and averages from task data\n" " - report: generate period-based summaries (daily, weekly, monthly)\n" " - trends: identify patterns and anomalies over time\n" "Always cite the data used. Do not fabricate figures." ) @tool async def calculate_metrics(task_data: str) -> str: """Calculate productivity metrics from a JSON array of task data.""" return json.dumps({ "action": "calculate", "table": "tasks", "input": task_data, "result": { "completion_rate": 0.0, "overdue_count": 0, "avg_priority": "medium", }, }) @tool async def generate_report(period: str, data: str) -> str: """Generate a structured report for a time period (e.g. 'last_7_days', 'last_month').""" return json.dumps({ "action": "report", "period": period, "input": data, }) @tool async def trend_analysis(data_points: str) -> str: """Analyse trends in a JSON array of time-series data points.""" return json.dumps({ "action": "trend", "input": data_points, "result": {"trend": "stable", "anomalies": []}, }) @registry.register class AnalyticsAgent(ChatAgent): def get_name(self) -> str: return "analytics_agent" def get_description(self) -> str: return "Workspace analytics: metrics, reports, trends" def get_tools(self) -> list[Any]: return [calculate_metrics, generate_report, trend_analysis] async def handle(self, query: str, context: dict[str, Any]) -> str: llm = ChatOpenAI(model="gpt-4o", temperature=0, api_key=settings.OPENAI_API_KEY) messages = [ SystemMessage(content=_SYSTEM_PROMPT), HumanMessage( content=f"User query: {query}\nContext: {json.dumps(context)[:1000]}" ), ] return await self._tool_loop(llm, messages, self.get_tools())