Files
fckbot/rag/agents/coordinator.py
2026-06-30 21:04:05 +00:00

68 lines
3.0 KiB
Python
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
"""
Координатор агентов: управляет специализированными агентами и маршрутизирует запросы.
"""
import logging
from typing import Dict, List, Optional, Any
from rag.agents.roles import BaseAgent
from rag.services.giga_client import GigaClient
from rag.config_models import AppConfig
logger = logging.getLogger(__name__)
class AgentCoordinator:
"""
Координатор, который выбирает подходящего агента для запроса и управляет
диалогом между агентами (при необходимости).
"""
def __init__(self, config: AppConfig, giga: GigaClient):
self.config = config
self.giga = giga
self.agents: Dict[str, BaseAgent] = {}
def register_agent(self, name: str, agent: BaseAgent) -> None:
"""Регистрирует агента с указанным именем."""
self.agents[name] = agent
logger.info(f"Агент '{name}' зарегистрирован")
async def process(
self,
query: str,
context: str,
history: List[Dict[str, str]],
tools: Optional[List[Dict[str, Any]]] = None,
) -> str:
"""
Основной метод: выбирает агента и передаёт ему запрос.
Если агент возвращает действие, выполняет его (или передаёт другому агенту).
"""
query_lower = query.lower()
if any(kw in query_lower for kw in ["методолог", "стандарт", "гост", "методика", "регламент"]):
agent_name = "methodologist"
elif any(kw in query_lower for kw in ["коробочное", "типовое", "решение", "шаблон", "создай документ"]):
agent_name = "box_solution"
elif any(kw in query_lower for kw in ["командировка", "бронирование", "билет", "отель", "календарь"]):
agent_name = "personal_assistant"
else:
agent_name = "methodologist"
agent = self.agents.get(agent_name)
if not agent:
logger.warning(f"Агент '{agent_name}' не найден, используем первого доступного")
if self.agents:
agent = next(iter(self.agents.values()))
else:
return "Нет доступных агентов для обработки запроса."
result = await agent.process(query, context, history, tools)
if result.get("type") == "answer":
return result.get("content", "")
elif result.get("type") == "action":
action = result.get("content", {})
return f"Агент запросил действие: {action}"
else:
return "Неизвестный тип ответа от агента."