81 lines
2.5 KiB
Python
81 lines
2.5 KiB
Python
"""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())
|