add ui, refactor agent, fix pipeline

This commit is contained in:
2026-06-04 20:01:44 +03:00
parent 7e6d3a906b
commit bb895612a0
10 changed files with 898 additions and 81 deletions
+68 -39
View File
@@ -6,11 +6,14 @@ from src.agent.agent import homework_direct_agent
from src.agent.graph.pipeline import _invoke_with_retry, _get_journal_tool, _parse_text
print("[2/3] Агент готов, запускаем задание...")
TASK_ID = "6a1855055db1b0a5ea224b8b"
# ── Настройки ────────────────────────────────────────────────────────────────
TASK_ID = "6a1867fa8a94f887e50d52bd" # ← taskId из platform.brojs.ru
OWNER = "KirillKutlakhmetov"
REPO = f"task-{TASK_ID}"
URL = f"https://git.brojs.ru/{OWNER}/{REPO}"
# ── Вспомогательные функции ──────────────────────────────────────────────────
def _was_submitted(msgs: list) -> bool:
for m in msgs:
for tc in getattr(m, "tool_calls", []):
@@ -18,31 +21,72 @@ def _was_submitted(msgs: list) -> bool:
return True
return False
def _is_rate_limit(e) -> bool:
full = repr(e)
if hasattr(e, 'exceptions'):
full += " ".join(repr(sub) for sub in e.exceptions)
return "429" in full or "rate" in full.lower()
def _is_not_found(e) -> bool:
full = repr(e)
if hasattr(e, 'exceptions'):
full += " ".join(repr(sub) for sub in e.exceptions)
return "not found" in full.lower() or "submission" in full.lower()
async def _force_submit(task_id: str):
update = _get_journal_tool("task_update_answer")
submit = _get_journal_tool("task_submit")
"""Страховка: сдаёт задание если агент не сделал этого сам."""
task_get = _get_journal_tool("task_get")
update = _get_journal_tool("task_update_answer")
submit = _get_journal_tool("task_submit")
if not update or not submit:
print("[!] journal-инструменты недоступны")
print("[!] journal-инструменты недоступны — сдать не удалось")
return
# Сначала вызываем task_get — это инициализирует submission если его нет
if task_get:
try:
print("[AUTO] task_get (инициализация submission)...")
await task_get.ainvoke({"taskId": task_id})
await asyncio.sleep(2)
except BaseException:
pass # не критично
for attempt in range(1, 6):
try:
print(f"[AUTO] task_update_answer (попытка {attempt})")
r1 = await update.ainvoke({"taskId": task_id, "answerType": "link", "content": URL})
print(f"[AUTO] update: {_parse_text(r1)[:120]}")
print(f"[AUTO] task_update_answer (попытка {attempt})...")
r1 = await update.ainvoke({
"taskId": task_id,
"answerType": "link",
"content": URL,
})
print(f"[AUTO] update OK: {_parse_text(r1)[:120]}")
await asyncio.sleep(3)
print(f"[AUTO] task_submit")
print(f"[AUTO] task_submit...")
r2 = await submit.ainvoke({"taskId": task_id, "confirmSubmit": True})
print(f"[AUTO] submit: {_parse_text(r2)[:120]}")
print(f"[AUTO] submit OK: {_parse_text(r2)[:120]}")
return
except BaseException as e:
full = repr(e)
if hasattr(e, 'exceptions'):
full += " ".join(repr(sub) for sub in e.exceptions)
if "429" in full and attempt < 5:
print(f"[AUTO] Rate limit, жду 70с...")
await asyncio.sleep(70)
print(f"[AUTO] Rate limit 429 — жду 10с...")
await asyncio.sleep(10)
elif attempt < 5:
print(f"[AUTO] Ошибка (попытка {attempt}): {full[:150]} — жду 10с...")
await asyncio.sleep(10)
else:
raise
print(f"[!] Все попытки исчерпаны: {full[:200]}")
return
# ── Основной запуск ──────────────────────────────────────────────────────────
async def main():
prompt = f"""Выполни задание из курса BroJS.
@@ -51,49 +95,33 @@ taskId: {TASK_ID}
owner: {OWNER}
repo: {REPO}
ШАГ 1. Прочитай задание полностью:
mcp__journal-bh-professor__task_text(taskId='{TASK_ID}')
ШАГ 2. Создай репозиторий:
gitea_create_repo(name='{REPO}')
ШАГ 3. Напиши и загрузи все нужные файлы через gitea_write_file.
- Пиши полный рабочий код, без заглушек и TODO
- Минимум 4 файла: main.py, requirements.txt, README.md + модули по заданию
- Читай файлы репозитория только через gitea_get_file, не read_file
ШАГ 4. Отправь ответ:
mcp__journal-bh-professor__task_update_answer(
taskId='{TASK_ID}',
answerType='link',
content='{URL}'
)
ШАГ 5. Сдай задание (ОБЯЗАТЕЛЬНО):
mcp__journal-bh-professor__task_submit(
taskId='{TASK_ID}',
confirmSubmit=True
)"""
ШАГ 1. mcp__journal-bh-professor__task_text(taskId='{TASK_ID}')
ШАГ 2. gitea_create_repo(name='{REPO}')
ШАГ 3. gitea_write_file — загрузи все файлы (main.py, requirements.txt, README.md + модули). Полный код, без заглушек.
ШАГ 4. mcp__journal-bh-professor__task_update_answer(taskId='{TASK_ID}', answerType='link', content='{URL}')
ШАГ 5. mcp__journal-bh-professor__task_submit(taskId='{TASK_ID}', confirmSubmit=True)"""
config = {"configurable": {"thread_id": f"hw-{TASK_ID}-{int(time.time())}"}}
print(f"[3/3] Агент работает...")
result = await _invoke_with_retry(
homework_direct_agent,
{"messages": [HumanMessage(content=prompt)]},
config,
)
print("[ГОТОВО] Агент завершил работу.")
msgs = result.get("messages", [])
print(f"[{len(msgs)} сообщений]")
for i, m in enumerate(msgs):
role = type(m).__name__
tcs = getattr(m, "tool_calls", [])
content_str = str(getattr(m, "content", ""))
tcs = getattr(m, "tool_calls", [])
text = str(getattr(m, "content", ""))
if tcs:
for tc in tcs:
print(f" [{i}] {role} -> {tc['name']}({str(tc.get('args',''))[:120]})")
elif content_str.strip():
print(f" [{i}] {role}: {content_str[:200]}")
elif text.strip():
print(f" [{i}] {role}: {text[:200]}")
if not _was_submitted(msgs):
print("\n[!] Агент не вызвал task_submit — сдаю автоматически...")
@@ -101,4 +129,5 @@ repo: {REPO}
else:
print("\n[OK] Задание сдано агентом самостоятельно.")
asyncio.run(main())