From 5f8b5b9144938f374d928f7a6d06f9f00e1733c8 Mon Sep 17 00:00:00 2001 From: gleb Date: Thu, 28 May 2026 18:47:05 +0300 Subject: [PATCH] add run/check scripts and revert llm to OpenRouter Co-Authored-By: Claude Sonnet 4.6 --- check_tasks.py | 30 ++++++++++++++++++++++++++++++ list_repos.py | 9 +++++++++ run_pipeline.py | 34 ++++++++++++++++++++++++++++++++++ src/agent/llm.py | 8 +++----- 4 files changed, 76 insertions(+), 5 deletions(-) create mode 100644 check_tasks.py create mode 100644 list_repos.py create mode 100644 run_pipeline.py diff --git a/check_tasks.py b/check_tasks.py new file mode 100644 index 0000000..b444340 --- /dev/null +++ b/check_tasks.py @@ -0,0 +1,30 @@ +import asyncio, json +from dotenv import load_dotenv +load_dotenv() +from src.agent.mcp_client import load_journal_toolsets, JOURNAL_PREFIX +from src.agent.constants import COURSE_ID + + +async def main(): + j = load_journal_toolsets() + tool = next((t for t in j.tasks_submissions_tools if t.name == f"{JOURNAL_PREFIX}tasks_list"), None) + if not tool: + print("tasks_list not found") + return + raw = await tool.ainvoke({"courseId": COURSE_ID}) + if isinstance(raw, list): + for item in raw: + if isinstance(item, dict) and item.get("type") == "text": + raw = item.get("text", "") + break + data = json.loads(raw) if isinstance(raw, str) else raw + items = data.get("tasks", data) if isinstance(data, dict) else data + for item in items: + t = item.get("task", item) if isinstance(item, dict) else {} + tid = t.get("id", "") + status = item.get("status", "") + title = t.get("title", "") + print(f" {tid[:8]} {status:25} {title}") + + +asyncio.run(main()) diff --git a/list_repos.py b/list_repos.py new file mode 100644 index 0000000..5b82b82 --- /dev/null +++ b/list_repos.py @@ -0,0 +1,9 @@ +from dotenv import load_dotenv +load_dotenv() +from src.agent.gitea_tools import _get +from src.agent.constants import GITEA_OWNER + +result = _get("/api/v1/repos/search", limit=50, token="") +repos = result.get("data", result) if isinstance(result, dict) else result +for r in sorted(repos, key=lambda x: x.get("updated", ""), reverse=True): + print(f" {r.get('name',''):40} {r.get('updated','')[:10]}") diff --git a/run_pipeline.py b/run_pipeline.py new file mode 100644 index 0000000..2f92913 --- /dev/null +++ b/run_pipeline.py @@ -0,0 +1,34 @@ +"""Запуск пайплайна для выполнения заданий курса.""" +import asyncio +import sys +import os + +os.environ["PYTHONIOENCODING"] = "utf-8" + +from dotenv import load_dotenv +load_dotenv() + +from langchain_core.messages import HumanMessage +from src.agent.graph.pipeline import pipeline + + +async def main(): + print("=== Запуск пайплайна BroJS ===") + result = await pipeline.ainvoke( + { + "tasks": [], + "current_index": 0, + "results": [], + "errors": [], + }, + {"configurable": {"thread_id": "pipeline-main"}}, + ) + print("\n=== Результат пайплайна ===") + for r in result.get("results", []): + print(f" Task {r['task_id'][:8]}: {r['status']} (mode={r['mode']}, retries={r['retries']})") + for e in result.get("errors", []): + print(f" ОШИБКА: {e}") + print("=== Готово ===") + + +asyncio.run(main()) diff --git a/src/agent/llm.py b/src/agent/llm.py index b2a70b8..34503f4 100644 --- a/src/agent/llm.py +++ b/src/agent/llm.py @@ -1,4 +1,4 @@ -"""Инициализация LLM через BroJS Inference API (токены учитываются на платформе).""" +"""Инициализация LLM через OpenRouter.""" import os from dotenv import load_dotenv @@ -6,11 +6,9 @@ from langchain_openai import ChatOpenAI load_dotenv() -# Используем BroJS Inference API — тот же JOURNAL_TOKEN (jrnl_...) -# Токены учитываются на платформе platform.brojs.ru llm = ChatOpenAI( model="openai/gpt-oss-20b:free", - base_url="https://platform.brojs.ru/jrnl-bh/api/inference/v1", - api_key=os.getenv("JOURNAL_TOKEN", "YOUR_JOURNAL_TOKEN_HERE"), + base_url="https://openrouter.ai/api/v1", + api_key=os.getenv("OPENAI_API_KEY", "YOUR_OPENROUTER_KEY_HERE"), temperature=0.0, )