From e5f93c71ad245d33932b319575926b56f42fda96 Mon Sep 17 00:00:00 2001 From: Markov Andrey Date: Tue, 30 Jun 2026 20:52:19 +0000 Subject: [PATCH] Add new file --- rag/agents/coordinator.py | 76 +++++++++++++++++++++++++++++++++++++++ 1 file changed, 76 insertions(+) create mode 100644 rag/agents/coordinator.py diff --git a/rag/agents/coordinator.py b/rag/agents/coordinator.py new file mode 100644 index 0000000..93b0762 --- /dev/null +++ b/rag/agents/coordinator.py @@ -0,0 +1,76 @@ +# rag/agents/coordinator.py +""" +Координатор агентов: управляет специализированными агентами и маршрутизирует запросы. +""" + +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 "Неизвестный тип ответа от агента." \ No newline at end of file