| """ |
| SummaryAgent - A simple AI agent for summarizing text content. |
| """ |
|
|
| import logging |
| import os |
| from dataclasses import dataclass |
| from typing import Any |
|
|
| from pydantic import BaseModel, Field |
| from pydantic_ai import Agent, RunContext |
|
|
| from .base_agent import ArchonDependencies, BaseAgent |
| from .mcp_client import get_mcp_client |
|
|
| logger = logging.getLogger(__name__) |
|
|
|
|
| @dataclass |
| class SummaryDependencies(ArchonDependencies): |
| """Dependencies for summary operations.""" |
|
|
| text_to_summarize: str = "" |
| task_id: str = "" |
| project_id: str = "" |
| progress_callback: Any | None = None |
|
|
|
|
| class SummaryOperation(BaseModel): |
| """Structured output for summary operations.""" |
|
|
| summary: str = Field(description="The concise summary of the provided text.") |
| original_length: int = Field(description="Length of the original text.") |
| summary_length: int = Field(description="Length of the generated summary.") |
| success: bool = Field(description="Whether the summary operation was successful.") |
| message: str = Field(description="Human-readable message about the operation.") |
|
|
|
|
| class SummaryAgent(BaseAgent[SummaryDependencies, SummaryOperation]): |
| """ |
| A simple agent that summarizes text content. |
| """ |
|
|
| def __init__(self, model: str | None = None, **kwargs): |
| if model is None: |
| model = os.getenv("SUMMARY_AGENT_MODEL") |
|
|
| super().__init__(model=model, name="SummaryAgent", retries=3, enable_rate_limiting=True, **kwargs) |
|
|
| def _create_agent(self, **kwargs) -> Agent[SummaryDependencies, SummaryOperation]: |
| """Create the PydanticAI agent with tools and prompts.""" |
| from src.server.services.prompt_service import prompt_service |
|
|
| default_prompt = "You are a concise summarization assistant. Your goal is to provide accurate and brief summaries of any given text. Use the 'summarize_text' tool to process user requests." |
| system_prompt = prompt_service.get_prompt("summary_agent_prompt", default_prompt) |
|
|
| agent = Agent( |
| model=self.model, |
| deps_type=SummaryDependencies, |
| system_prompt=system_prompt, |
| **kwargs, |
| ) |
|
|
| @agent.tool |
| async def summarize_text(ctx: RunContext[SummaryDependencies]) -> SummaryOperation: |
| """ |
| Summarizes the provided text content. |
| """ |
| text = ctx.deps.text_to_summarize |
| task_id = ctx.deps.task_id |
| project_id = ctx.deps.project_id |
| progress_callback = ctx.deps.progress_callback |
|
|
| if not text: |
| return SummaryOperation( |
| summary="", |
| original_length=0, |
| summary_length=0, |
| success=False, |
| message="No text provided for summarization.", |
| ) |
|
|
| if progress_callback: |
| await progress_callback({"step": "summarization", "log": "✍️ Generating summary..."}) |
|
|
| |
| |
| |
| import litellm |
|
|
| response = await litellm.completion( |
| model=self.model, messages=[{"role": "user", "content": f"Summarize this text: {text}"}] |
| ) |
| generated_summary = response["choices"][0]["message"]["content"] |
|
|
| |
| mcp_client = await get_mcp_client(agent_type="summary") |
|
|
| await mcp_client.call_tool( |
| tool_name="manage_task", |
| action="update", |
| project_id=project_id, |
| task_id=task_id, |
| output={"agent": self.name, "summary": generated_summary, "original_text_length": len(text)}, |
| ) |
|
|
| if progress_callback: |
| await progress_callback({"step": "summarization", "log": "✅ Summary generated and reported."}) |
|
|
| return SummaryOperation( |
| summary=generated_summary, |
| original_length=len(text), |
| summary_length=len(generated_summary), |
| success=True, |
| message="Text summarized successfully and reported via MCP.", |
| ) |
|
|
| return agent |
|
|
| def get_system_prompt(self) -> str: |
| """Get the base system prompt for this agent.""" |
| return "You are a concise summarization assistant. Your goal is to provide accurate and brief summaries of any given text. Use the 'summarize_text' tool to process user requests." |
|
|