""" CLI для FAQ‑бота курса KFU-26-1. Маршрутизация: вопросы по материалам → ChromaDB, по метаданным → MCP‑style tool. Запуск: ollama pull nomic-embed-text python main.py """ import asyncio import sys from dotenv import load_dotenv load_dotenv() from vectorstore import load_faq_to_chroma # noqa: E402 from agent import ask # noqa: E402 # 3 заготовленных вопроса: 2 в chroma, 1 в mcp_meta DEMO_QUESTIONS = [ ("Что такое LangGraph и как он отличается от LangChain?", "chroma"), ("Как создать инструмент tool в LangChain?", "chroma"), ("Когда дедлайн финального проекта и как связаться с препо?", "mcp_meta"), ] async def run_demo() -> None: """Запускает три заготовленных демо‑вопроса.""" print("\n--- Демо-вопросы ---") for i, (question, expected_source) in enumerate(DEMO_QUESTIONS, 1): print(f"\n[{i}] Вопрос: {question}") print(f" Ожидаемый источник: {expected_source}") answer = await ask(question, thread_id=f"demo-{i}") print(f" Ответ: {answer}") async def interactive_mode() -> None: """Интерактивный режим — вводи вопросы вручную.""" print("\n--- Интерактивный режим (exit для выхода) ---") session_id = 0 while True: try: q = input("\nВопрос: ").strip() except (EOFError, KeyboardInterrupt): print("\nВыход.") break if not q or q.lower() in ("exit", "quit"): break session_id += 1 answer = await ask(q, thread_id=f"interactive-{session_id}") print(f"Ответ: {answer}") async def main() -> None: print("=== FAQ‑бот курса KFU-26-1 ===") print("Загружаем конспекты в ChromaDB (Ollama nomic-embed-text)...") n = load_faq_to_chroma() print(f"Проиндексировано: {n} чанков\n") await run_demo() await interactive_mode() if __name__ == "__main__": asyncio.run(main())