From b3d6bc9e3770123ce2588ec220aee56f3962fe9d 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:42 +0000 Subject: [PATCH] add agent.py --- agent.py | 46 ++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 46 insertions(+) create mode 100644 agent.py diff --git a/agent.py b/agent.py new file mode 100644 index 0000000..2ca1a82 --- /dev/null +++ b/agent.py @@ -0,0 +1,46 @@ +"""FAQ‑бот: ChromaDB для конспектов + MCP‑style tool для метаданных курса.""" +import os +from dotenv import load_dotenv +from langchain_openai import ChatOpenAI +from langchain_core.messages import HumanMessage +from langchain.agents import create_agent + +load_dotenv() + +from tools import search_course_docs, fetch_course_meta # noqa: E402 + +llm = ChatOpenAI( + model="openai/gpt-oss-20b:free", + base_url="https://platform.brojs.ru/jrnl-bh/api/inference/v1", + api_key=os.getenv("JOURNAL_MCP_PAT"), + temperature=0.0, +) + +SYSTEM_PROMPT = """Ты — FAQ‑бот курса KFU-26-1 по LangChain/LangGraph. + +Доступные инструменты: +1. search_course_docs — поиск по конспектам курса в ChromaDB (Ollama embeddings) + Используй для вопросов о технологиях: LangChain, LangGraph, MCP, агентах, коде +2. fetch_course_meta — метаданные курса через MCP‑style tool (расписание, дедлайны, контакты, глоссарий) + Используй для вопросов о расписании, сроках, контактах преподавателя + +Правила маршрутизации: +- Вопрос про содержание, технологии, концепции → search_course_docs [source: chroma] +- Вопрос про расписание, дедлайны, контакты, термины → fetch_course_meta [source: mcp_meta] +- Не вызывай оба инструмента без необходимости — выбери один подходящий + +В каждом ответе укажи источник: [source: chroma] или [source: mcp_meta]""" + +agent = create_agent( + llm=llm, + tools=[search_course_docs, fetch_course_meta], + system_prompt=SYSTEM_PROMPT, +) + +async def ask(question: str, thread_id: str = "faq-1") -> str: + """Задать вопрос агенту и получить ответ.""" + result = await agent.ainvoke( + {"messages": [HumanMessage(content=question)]}, + {"configurable": {"thread_id": thread_id}}, + ) + return result["messages"][-1].content