Add Deep Agents UI, pipeline fixes, and agent improvements.

Includes deep-agents-ui integration, rework detection via Gitea,
tool-call sanitization fixes, and startup scripts.
This commit is contained in:
dapa46
2026-06-18 19:33:26 +03:00
parent ba83d0cfe4
commit 0f38d8d588
83 changed files with 22561 additions and 179 deletions
+48 -6
View File
@@ -13,6 +13,46 @@ import asyncio
from langchain.tools import tool
from langchain_core.messages import HumanMessage
from src.agent.constants import COURSE_ID
@tool
async def list_course_tasks(status_filter: str = "all") -> str:
"""Получить список заданий курса KFU-26-1 из журнала BroJS.
Используй этот инструмент для проверки статусов (todo, in_progress, done и т.д.).
Не используй read_file/grep для списка заданий.
Args:
status_filter: all | todo | in_progress | done | ready_for_review
или несколько через запятую, например "todo,in_progress"
Returns:
Список заданий: id, название, статус.
"""
from src.agent.graph.pipeline import _get_journal_tool, _parse_tasks
tool = _get_journal_tool("tasks_list")
if not tool:
return "ERROR: tasks_list недоступен — проверь JOURNAL_TOKEN в .env"
raw = await tool.ainvoke({"courseId": COURSE_ID})
tasks = _parse_tasks(raw)
if not tasks:
return "Заданий не найдено (пустой ответ журнала)."
filters = {s.strip() for s in status_filter.lower().split(",") if s.strip()}
if filters and "all" not in filters:
tasks = [t for t in tasks if (t.get("status") or "").lower() in filters]
lines = [f"Всего: {len(tasks)} заданий (фильтр: {status_filter})", ""]
for t in tasks:
tid = t.get("id", "")
title = (t.get("title") or "")[:60]
status = t.get("status") or "?"
lines.append(f"- {tid} | {status} | {title}")
return "\n".join(lines)
@tool
async def solve_task(task_id: str) -> str:
@@ -34,13 +74,12 @@ async def solve_task(task_id: str) -> str:
from src.agent.agent import homework_direct_agent, rework_agent
from src.agent.graph.pipeline import (
MAX_RETRIES,
_existing_repo_url,
_fix_prompt,
_force_submit,
_get_task_meta,
_invoke_with_retry,
_is_submitted,
_needs_retry,
_task_json,
_task_text,
_verify_repo,
TaskInfo,
@@ -50,12 +89,15 @@ async def solve_task(task_id: str) -> str:
await asyncio.sleep(5)
# Определяем: первая сдача или пересдача
repo_url = await _existing_repo_url(task_id)
is_rework = repo_url is not None
meta = await _get_task_meta(task_id)
repo_url = meta["repo_url"]
is_rework = repo_url is not None or meta["has_feedback"]
if is_rework:
data = await _task_json(task_id)
comments = data.get("comments") or data.get("feedback", "")
if not repo_url:
from src.agent.constants import GITEA_OWNER
repo_url = f"https://git.brojs.ru/{GITEA_OWNER}/task-{task_id}"
comments = meta["comments"]
prompt = (
f"Пересдача задания.\n\n"
f"ID: {task_id}\n"