fix: P0 token 环境变量 + P1 fail_count 逻辑简化(姜维 Review)
This commit is contained in:
@@ -7,6 +7,7 @@ from __future__ import annotations
|
|||||||
|
|
||||||
import json
|
import json
|
||||||
import logging
|
import logging
|
||||||
|
import os
|
||||||
import urllib.request
|
import urllib.request
|
||||||
from pathlib import Path
|
from pathlib import Path
|
||||||
from typing import Dict, List
|
from typing import Dict, List
|
||||||
@@ -23,10 +24,7 @@ logger = logging.getLogger("moziplus-v2.handler.toolchain")
|
|||||||
# ---------------------------------------------------------------------------
|
# ---------------------------------------------------------------------------
|
||||||
|
|
||||||
_GITEA_BASE = "http://192.168.2.154:3000/api/v1"
|
_GITEA_BASE = "http://192.168.2.154:3000/api/v1"
|
||||||
_GITEA_TOKEN = "a6d596b826f4bfeaf983ef4d25ac25dab95bbc4e"
|
_GITEA_TOKEN = os.environ.get("GITEA_TOKEN", "")
|
||||||
|
|
||||||
# 业务失败连续次数阈值,超过则升级为系统失败
|
|
||||||
_BUSINESS_FAIL_THRESHOLD = 3
|
|
||||||
|
|
||||||
# action_type → action_hint 映射
|
# action_type → action_hint 映射
|
||||||
_ACTION_HINTS: Dict[str, str] = {
|
_ACTION_HINTS: Dict[str, str] = {
|
||||||
@@ -308,22 +306,16 @@ class ToolchainHandler(BaseTaskHandler):
|
|||||||
).fetchone()
|
).fetchone()
|
||||||
if row and row["must_haves"]:
|
if row and row["must_haves"]:
|
||||||
meta = json.loads(row["must_haves"])
|
meta = json.loads(row["must_haves"])
|
||||||
# 统计该 task 的业务失败次数
|
|
||||||
fail_count = conn.execute(
|
|
||||||
"SELECT COUNT(*) FROM events WHERE task_id=? "
|
|
||||||
"AND event_type='status_change' AND payload LIKE '%failed%'",
|
|
||||||
(task_id,)
|
|
||||||
).fetchone()[0]
|
|
||||||
conn.close()
|
conn.close()
|
||||||
except Exception:
|
except Exception:
|
||||||
fail_count = 0
|
pass
|
||||||
|
|
||||||
action_type = meta.get("action_type", "")
|
action_type = meta.get("action_type", "")
|
||||||
context_data = meta.get("context", {})
|
context_data = meta.get("context", {})
|
||||||
assignee = meta.get("assignee", "") or meta.get("from", "")
|
assignee = meta.get("assignee", "") or meta.get("from", "")
|
||||||
|
|
||||||
# 三分路决策
|
# 三分路决策
|
||||||
route = self._classify_failure(verify, fail_count)
|
route = self._classify_failure(verify)
|
||||||
|
|
||||||
if route == "business":
|
if route == "business":
|
||||||
self._handle_business_failure(
|
self._handle_business_failure(
|
||||||
@@ -335,14 +327,11 @@ class ToolchainHandler(BaseTaskHandler):
|
|||||||
self._handle_infrastructure_failure(
|
self._handle_infrastructure_failure(
|
||||||
task_id, agent_id, verify, db_path)
|
task_id, agent_id, verify, db_path)
|
||||||
|
|
||||||
def _classify_failure(self, verify: VerifyResult, fail_count: int) -> str:
|
def _classify_failure(self, verify: VerifyResult) -> str:
|
||||||
"""分类失败类型:business / system / infrastructure"""
|
"""分类失败类型:business / system / infrastructure"""
|
||||||
# verify_error 或 DB 不可用 → 基础设施失败
|
# verify_error 或 DB 不可用 → 基础设施失败
|
||||||
if verify.reason == "verify_error":
|
if verify.reason == "verify_error":
|
||||||
return "infrastructure"
|
return "infrastructure"
|
||||||
# 连续业务失败超过阈值 → 升级为系统失败
|
|
||||||
if fail_count >= _BUSINESS_FAIL_THRESHOLD:
|
|
||||||
return "system"
|
|
||||||
# 默认:业务失败
|
# 默认:业务失败
|
||||||
return "business"
|
return "business"
|
||||||
|
|
||||||
@@ -450,6 +439,8 @@ class ToolchainHandler(BaseTaskHandler):
|
|||||||
self, repo: str, pr_number: int, body: str,
|
self, repo: str, pr_number: int, body: str,
|
||||||
) -> bool:
|
) -> bool:
|
||||||
"""在 PR/Issue 上创建 comment。返回是否成功。"""
|
"""在 PR/Issue 上创建 comment。返回是否成功。"""
|
||||||
|
if not _GITEA_TOKEN:
|
||||||
|
return False
|
||||||
payload = json.dumps({"body": body}, ensure_ascii=False).encode("utf-8")
|
payload = json.dumps({"body": body}, ensure_ascii=False).encode("utf-8")
|
||||||
try:
|
try:
|
||||||
req = urllib.request.Request(
|
req = urllib.request.Request(
|
||||||
@@ -471,6 +462,8 @@ class ToolchainHandler(BaseTaskHandler):
|
|||||||
assignees: list = None,
|
assignees: list = None,
|
||||||
) -> bool:
|
) -> bool:
|
||||||
"""创建 Gitea Issue。返回是否成功。"""
|
"""创建 Gitea Issue。返回是否成功。"""
|
||||||
|
if not _GITEA_TOKEN:
|
||||||
|
return False
|
||||||
data = {"title": title, "body": body}
|
data = {"title": title, "body": body}
|
||||||
if assignees:
|
if assignees:
|
||||||
data["assignees"] = assignees
|
data["assignees"] = assignees
|
||||||
|
|||||||
Reference in New Issue
Block a user