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:
@@ -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"
|
||||
|
||||
Reference in New Issue
Block a user