"""Инструменты FAQ‑бота: поиск в ChromaDB + MCP‑style tool метаданных курса.""" import json from langchain.tools import tool from vectorstore import similarity_search @tool def search_course_docs(query: str, k: int = 3) -> str: """Поиск по конспектам курса в локальной базе ChromaDB. Используй для вопросов о технологиях курса: LangChain, LangGraph, MCP, агентах, инструментах, концепциях, примерах кода. Args: query: поисковый запрос k: количество результатов (по умолчанию 3) Returns: релевантные отрывки из конспектов с указанием источника """ docs = similarity_search(query, k=k) if not docs: return "[source: chroma] Релевантные документы не найдены." parts = [] for i, doc in enumerate(docs, 1): src = doc.metadata.get("source", "unknown") parts.append(f"{i}. [{src}]\n{doc.page_content}") return "[source: chroma]\n\n" + "\n\n".join(parts) @tool def fetch_course_meta(query: str) -> str: """Получить метаданные курса: расписание, дедлайны, контакты, глоссарий. Имитирует MCP‑style tool call к серверу метаданных курса. В production‑среде это был бы вызов через MCP tool list/call. Используй для вопросов о расписании, сроках сдачи, контактах, терминах. Args: query: что именно нужно (schedule/deadlines/contacts/glossary) Returns: метаданные курса с указанием источника [source: mcp_meta] """ COURSE_META = { "schedule": { "Понедельник": "10:00-12:00 — LangChain основы", "Среда": "14:00-16:00 — LangGraph практика", "Пятница": "10:00-12:00 — Разбор проектов", }, "deadlines": { "ДЗ-1 LangChain basics": "2026-06-15 23:59", "ДЗ-2 LangGraph agents": "2026-06-22 23:59", "Финальный проект": "2026-07-04 23:00", }, "contacts": { "Преподаватель": "professor@brojs.ru", "Ассистент": "assistant@brojs.ru", "Платформа": "platform.brojs.ru", }, "glossary": { "LangChain": "Фреймворк для LLM-приложений", "LangGraph": "Граф‑based агентный фреймворк", "ChromaDB": "Векторная база данных для эмбеддингов", "MCP": "Model Context Protocol — стандарт интеграции инструментов", "RAG": "Retrieval-Augmented Generation", "Embeddings": "Векторные представления текста", }, } q = query.lower() if any(w in q for w in ["расписание", "schedule", "занятия", "когда", "пары"]): data = COURSE_META["schedule"] note = "(В проде: MCP tool call к серверу расписания)" elif any(w in q for w in ["дедлайн", "deadline", "сдать", "срок", "когда сдавать"]): data = COURSE_META["deadlines"] note = "(В проде: MCP tool call к трекеру дедлайнов)" elif any(w in q for w in ["контакт", "почта", "email", "преподаватель", "ассистент"]): data = COURSE_META["contacts"] note = "(В проде: MCP tool call к справочнику контактов)" elif any(w in q for w in ["глоссарий", "glossary", "что значит", "термин", "определение"]): data = COURSE_META["glossary"] note = "(В проде: MCP tool call к глоссарию курса)" else: data = COURSE_META note = "(В проде: MCP tool call к серверу метаданных курса)" return f"[source: mcp_meta] {note}\n{json.dumps(data, ensure_ascii=False, indent=2)}"