diff --git a/README.md b/README.md new file mode 100644 index 0000000..1cae35c --- /dev/null +++ b/README.md @@ -0,0 +1,128 @@ +# 🤖 Агент решения домашних заданий + +Берёт задания из журнала через **MCP**, решает их с помощью LLM, заливает на **git.brojs.ru** и отправляет ссылку преподавателю. +Общаться с агентом можно через чат на `localhost:8123` — так же, как у преподавателя. + +## Структура проекта + +``` +homework_agent/ +├── agent.py # Граф агента + CLI (точка входа для langgraph dev) +├── llm.py # Фабрика LLM: openai (пары) ↔ gigachat (дома) +├── mcp_clients.py # Загрузка MCP-инструментов (journal + gitea) +├── gitea_rest.py # REST fallback для Gitea (если uvx недоступен) +├── langgraph.json # Конфиг для langgraph dev +├── requirements.txt +├── .env.example +└── .env # ← создай сам, не коммить! +``` + +## Установка + +```bash +# 1. Виртуальное окружение +python -m venv .venv +.venv\Scripts\activate # Windows +# source .venv/bin/activate # Mac/Linux + +# 2. Зависимости +pip install -r requirements.txt + +# 3. uv (нужен для Gitea MCP, если будешь использовать) +pip install uv +``` + +## Настройка .env + +```bash +cp .env.example .env +# открой .env и заполни значения +``` + +### Токен журнала — `JOURNAL_MCP_PAT` (самое важное!) + +Без него агент не видит задания. Спроси у преподавателя или найди сам: + +1. Зайди на `https://platform.brojs.ru` (авторизуйся) +2. Открой DevTools (`F12`) → вкладка **Network** +3. Обнови страницу, кликни на любой запрос к `/jrnl-bh/api/...` +4. В заголовках найди `Authorization: Bearer <токен>` — это и есть `JOURNAL_MCP_PAT` + +### Токен Gitea — `GITEA_TOKEN` + +1. Зайди на https://git.brojs.ru (авторизуйся) +2. Аватарка → **Settings** → **Applications** → **Generate New Token** +3. Поставь права: `repository: read & write` +4. Скопируй в `.env` как `GITEA_TOKEN` +5. Туда же `GITEA_USERNAME` — твой логин на git.brojs.ru + +### Переключение LLM + +**На парах (gpt-oss-20b):** +```env +LLM_PROVIDER=openai +OPENAI_BASE_URL=https://89fe241d-b6f4-4e49-b3d5-9ed3c91dbe2f.tunnel4.com/v1 +OPENAI_MODEL=openi/gpt-oss-20b +OPENAI_API_KEY=fake +``` +> ⚠️ URL туннеля меняется каждый день — спрашивай актуальный у преподавателя + +**Дома (GigaChat, бесплатно):** +```env +LLM_PROVIDER=gigachat +GIGACHAT_CREDENTIALS=твои_credentials +GIGACHAT_SCOPE=GIGACHAT_API_B2B +``` +Получить credentials: https://developers.sber.ru/studio/workspaces/my-space/get-token/gigachat + +## 🚀 Запуск чата (localhost:8123) + +```bash +langgraph dev +``` + +Открой в браузере `http://localhost:8123` — появится чат. Можно писать: +- *«покажи мои задания»* +- *«реши задание с id=abc123»* +- *«какие задания есть в курсе xyz?»* + +## Запуск из консоли (без чата) + +```bash +# Показать список заданий +python agent.py --list + +# Решить конкретное задание +python agent.py --task-id + +# Решить задания курса +python agent.py --course-id + +# Посмотреть решение без отправки +python agent.py --task-id --dry-run +``` + +## Как это работает + +``` +Ты пишешь в чат + ↓ +agent_graph (LangGraph ReAct) + ↓ читает задания + mcp__journal-mcp__tasks_list / task_get + ↓ пишет код (LLM) + gpt-oss-20b / GigaChat + ↓ заливает на Gitea + upload_solution → git.brojs.ru/username/dz + ↓ отправляет ссылку + mcp__journal-mcp__submission_teacher_set_status +``` + +## Частые проблемы + +| Ошибка | Решение | +|--------|---------| +| `JOURNAL_MCP_PAT не задан` | Добавь токен в `.env` | +| `FileNotFoundError: uvx` | `pip install uv` или работает REST fallback | +| LLM не отвечает | Проверь `OPENAI_BASE_URL` — URL туннеля мог смениться | +| `langgraph: command not found` | `pip install langgraph-cli[inmem]` | diff --git a/agent_ui.html b/agent_ui.html new file mode 100644 index 0000000..3f15416 --- /dev/null +++ b/agent_ui.html @@ -0,0 +1,383 @@ + + + + + +HW Agent + + + + + + + + +
+ +
+
+
+ connecting... +
+ +
+
+ +
+ + +
+
+
+
+

homework agent

+

langgraph @ localhost:2024

+
+
список заданий
+
решить задание
+
переделать по комменту
+
+
+
+
+
+ + +
+
enter — отправить · shift+enter — перенос строки
+
+
+
+ + + + diff --git a/langgraph.json b/langgraph.json new file mode 100644 index 0000000..952ad60 --- /dev/null +++ b/langgraph.json @@ -0,0 +1,6 @@ +{ + "dependencies": ["."], + "graphs": { + "homework_agent": "src.agent:agent_graph" + } +} diff --git a/requirements.txt b/requirements.txt new file mode 100644 index 0000000..ee5a8f1 --- /dev/null +++ b/requirements.txt @@ -0,0 +1,16 @@ +langchain==1.2.15 +langchain-core==1.3.0 +langchain-openai==1.1.9 +langchain-community>=0.3.0 +langchain-mcp-adapters==0.2.1 +langgraph==1.1.8 +langgraph-cli[inmem]==0.4.23 +fastmcp==3.1.0 +gigachat==0.2.0 +requests>=2.31.0 +beautifulsoup4>=4.12.0 +python-dotenv>=1.0.0 +pydantic>=2.0.0 +rich==14.3.3 +markdownify==1.2.2 +httpx>=0.27.0