From 9dff79279b63b6abbcba408ece8edd5af2c6a485 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=D0=9A=D0=B8=D1=80=D0=B8=D0=BB=D0=BB=20=D0=9A=D1=83=D1=82?= =?UTF-8?q?=D0=BB=D0=B0=D1=85=D0=BC=D0=B5=D1=82=D0=BE=D0=B2?= Date: Thu, 4 Jun 2026 16:27:33 +0000 Subject: [PATCH] add tools.py --- tools.py | 88 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 88 insertions(+) create mode 100644 tools.py diff --git a/tools.py b/tools.py new file mode 100644 index 0000000..b7fdc20 --- /dev/null +++ b/tools.py @@ -0,0 +1,88 @@ +"""Инструменты 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)}"