Files
task-6a219d2dfd30e81cf3146bad/tools.py
T
2026-06-04 16:27:33 +00:00

89 lines
4.4 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.
"""Инструменты FAQ‑бота: поиск в ChromaDB + MCPstyle 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:
"""Получить метаданные курса: расписание, дедлайны, контакты, глоссарий.
Имитирует MCPstyle 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)}"