refactor(review): always render usage; drop report_usage flag
This commit is contained in:
+35
-13
@@ -43,6 +43,13 @@ from http.server import BaseHTTPRequestHandler, ThreadingHTTPServer
|
||||
|
||||
from ai_review import review_pr
|
||||
|
||||
try:
|
||||
import feedback_harvest # optional — absent in CI-step pod, present in
|
||||
# central webhook service. Harvesting is the
|
||||
# collection side of the feedback loop.
|
||||
except ImportError:
|
||||
feedback_harvest = None
|
||||
|
||||
# Pull-request webhook `action` values. We fire on EVERY pull_request action
|
||||
# except `closed` (no point reviewing a closed/merged PR) — the AI-REVIEW label
|
||||
# gate + sha dedupe downstream make broadening safe: a same-sha re-fire (title
|
||||
@@ -53,7 +60,6 @@ from ai_review import review_pr
|
||||
# `X-Gitea-Event-Type` header uses `label_updated` / `synchronized`.
|
||||
SKIP_ACTIONS = {"closed"}
|
||||
AI_REVIEW_LABEL = "AI-REVIEW"
|
||||
AI_USAGE_LABEL = "AI-USAGE"
|
||||
|
||||
GITEA_API = os.environ.get("GITEA_API", "http://gitea-http.gitea.svc.cluster.local:3000")
|
||||
BOT_TOKEN = os.environ.get("PRAGENT_BOT_TOKEN", "")
|
||||
@@ -65,6 +71,9 @@ WEBHOOK_SECRET = os.environ.get("WEBHOOK_SECRET", "").encode()
|
||||
PORT = int(os.environ.get("WEBHOOK_PORT", "8080"))
|
||||
MAX_CONCURRENT = max(1, int(os.environ.get("PRAGENT_MAX_CONCURRENT_REVIEWS", "2")))
|
||||
MAX_BODY_BYTES = int(os.environ.get("PRAGENT_MAX_BODY_BYTES", str(10 * 1024 * 1024)))
|
||||
# Feedback DB — SQLite mounted at PRAGENT_FEEDBACK_DB. Empty / unset =
|
||||
# feedback collection disabled (CI-step path doesn't have it).
|
||||
FEEDBACK_DB = os.environ.get("PRAGENT_FEEDBACK_DB", "")
|
||||
|
||||
# Bound on reviews running at once. Every review forks an opencode process that
|
||||
# untars a repo, reads files and shells out to linters, so an unbounded thread
|
||||
@@ -143,23 +152,16 @@ def _handle_pull_request(payload: dict) -> tuple[int, str]:
|
||||
if not BOT_TOKEN:
|
||||
return 500, "PRAGENT_BOT_TOKEN not set"
|
||||
|
||||
# AI-USAGE label (opt-in) → append the token-usage section + per-comment 🪙
|
||||
# lines to the review. PRAGENT_USAGE_ALWAYS forces it on for testing / a
|
||||
# future default-on.
|
||||
report_usage = _labels_have(labels, AI_USAGE_LABEL) or bool(
|
||||
os.environ.get("PRAGENT_USAGE_ALWAYS")
|
||||
)
|
||||
|
||||
key = (repo, str(index), sha)
|
||||
if not _claim(key):
|
||||
return 200, f"ignore (already in flight) {repo}#{index} sha={sha[:8]}"
|
||||
|
||||
threading.Thread(
|
||||
target=_run_review,
|
||||
args=(key, title, body, report_usage, base_ref),
|
||||
args=(key, title, body, base_ref),
|
||||
daemon=True,
|
||||
).start()
|
||||
return 202, f"reviewing {repo}#{index} action={action} sha={sha[:8]} usage={report_usage}"
|
||||
return 202, f"reviewing {repo}#{index} action={action} sha={sha[:8]}"
|
||||
|
||||
|
||||
def _claim(key: tuple[str, str, str]) -> bool:
|
||||
@@ -177,9 +179,30 @@ def _release(key: tuple[str, str, str]) -> None:
|
||||
|
||||
|
||||
def _run_review(
|
||||
key: tuple[str, str, str], title: str, body: str, report_usage: bool, base_ref: str
|
||||
key: tuple[str, str, str], title: str, body: str, base_ref: str
|
||||
) -> None:
|
||||
repo, index, sha = key
|
||||
# Harvest reactions on PRIOR bot comments on this PR (best-effort —
|
||||
# piggy-backs the webhook path so we don't need a separate cron).
|
||||
# Disabled if feedback_harvest isn't importable (CI-step image) or
|
||||
# FEEDBACK_DB isn't set.
|
||||
if FEEDBACK_DB and feedback_harvest is not None:
|
||||
try:
|
||||
hstats = feedback_harvest.harvest_for_pr(
|
||||
api=GITEA_API, token=BOT_TOKEN,
|
||||
repo=repo, pr_index=int(index), db_path=FEEDBACK_DB,
|
||||
)
|
||||
print(
|
||||
f"pragent-webhook: harvested {repo}#{index} "
|
||||
f"reviews={hstats['reviews_seen']} "
|
||||
f"findings={hstats['findings_seen']} "
|
||||
f"reactions={hstats['reactions_recorded']}",
|
||||
flush=True,
|
||||
)
|
||||
except Exception as e:
|
||||
# Harvest must never abort a review.
|
||||
print(f"pragent-webhook: harvest failed for {repo}#{index}: {e}", flush=True)
|
||||
|
||||
try:
|
||||
with _review_slots:
|
||||
ok = review_pr(
|
||||
@@ -194,10 +217,9 @@ def _run_review(
|
||||
model=OLLAMA_MODEL,
|
||||
max_tokens=OLLAMA_MAX_TOKENS,
|
||||
max_chars=DIFF_MAX_CHARS,
|
||||
report_usage=report_usage,
|
||||
base_ref=base_ref,
|
||||
)
|
||||
print(f"pragent-webhook: reviewed {repo}#{index} sha={sha[:8]} ok={ok} usage={report_usage}", flush=True)
|
||||
print(f"pragent-webhook: reviewed {repo}#{index} sha={sha[:8]} ok={ok}", flush=True)
|
||||
except Exception as e: # review_pr is fail-open, but guard the thread anyway
|
||||
print(f"pragent-webhook: thread crashed for {repo}#{index}: {e}", flush=True)
|
||||
finally:
|
||||
|
||||
Reference in New Issue
Block a user