Initial commit: homework automation agent for BroJS course KFU-26-1
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
This commit is contained in:
@@ -0,0 +1,104 @@
|
||||
import asyncio, sys, time
|
||||
sys.path.insert(0, '.')
|
||||
print("[1/3] Импортируем агента (MCP init ~20-60с)...")
|
||||
from langchain_core.messages import HumanMessage
|
||||
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"
|
||||
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", []):
|
||||
if "task_submit" in tc.get("name", ""):
|
||||
return True
|
||||
return False
|
||||
|
||||
async def _force_submit(task_id: str):
|
||||
update = _get_journal_tool("task_update_answer")
|
||||
submit = _get_journal_tool("task_submit")
|
||||
if not update or not submit:
|
||||
print("[!] journal-инструменты недоступны")
|
||||
return
|
||||
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]}")
|
||||
await asyncio.sleep(3)
|
||||
print(f"[AUTO] task_submit")
|
||||
r2 = await submit.ainvoke({"taskId": task_id, "confirmSubmit": True})
|
||||
print(f"[AUTO] submit: {_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)
|
||||
else:
|
||||
raise
|
||||
|
||||
async def main():
|
||||
prompt = f"""Выполни задание из курса BroJS.
|
||||
|
||||
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
|
||||
)"""
|
||||
|
||||
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", ""))
|
||||
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]}")
|
||||
|
||||
if not _was_submitted(msgs):
|
||||
print("\n[!] Агент не вызвал task_submit — сдаю автоматически...")
|
||||
await _force_submit(TASK_ID)
|
||||
else:
|
||||
print("\n[OK] Задание сдано агентом самостоятельно.")
|
||||
|
||||
asyncio.run(main())
|
||||
Reference in New Issue
Block a user