feat: add review effort accounting and budget governor
This commit is contained in:
@@ -7,7 +7,7 @@ from .opencode_synthesis import _normalize_lens_finding
|
||||
LENS_TIMEOUT_S = 540
|
||||
|
||||
|
||||
def _run_one_lens(workdir, spec, model, factory_root):
|
||||
def _run_one_lens(workdir, spec, model, factory_root, budget=None, budget_state=None):
|
||||
"""Run one lens through the compatibility module's runtime seam."""
|
||||
from . import opencode as oc
|
||||
|
||||
@@ -28,9 +28,12 @@ def _run_one_lens(workdir, spec, model, factory_root):
|
||||
"--agent", spec.id, "--dir", workdir, "--model", model, prompt,
|
||||
]
|
||||
try:
|
||||
proc = oc.subprocess.run(
|
||||
cmd, cwd=workdir, env=env, capture_output=True, text=True,
|
||||
stdin=oc.subprocess.DEVNULL, timeout=LENS_TIMEOUT_S,
|
||||
proc = oc._run_process(
|
||||
cmd, cwd=workdir, env=env,
|
||||
timeout=min(LENS_TIMEOUT_S, budget.max_duration_seconds)
|
||||
if budget else LENS_TIMEOUT_S,
|
||||
parse_events=oc.parse_opencode_events, budget=budget,
|
||||
budget_state=budget_state, model=model,
|
||||
)
|
||||
except oc.subprocess.TimeoutExpired:
|
||||
print(f"pragent: lens {spec.id} timed out after {LENS_TIMEOUT_S}s", flush=True)
|
||||
@@ -69,7 +72,7 @@ def _run_one_lens(workdir, spec, model, factory_root):
|
||||
return normalized, usage, spec.id
|
||||
|
||||
|
||||
def run_lenses(workdir, reviewers, default_model, factory_root):
|
||||
def run_lenses(workdir, reviewers, default_model, factory_root, budget=None, budget_state=None):
|
||||
"""Run configured lenses in parallel and return results by lens id."""
|
||||
if not reviewers:
|
||||
return {}
|
||||
@@ -81,7 +84,7 @@ def run_lenses(workdir, reviewers, default_model, factory_root):
|
||||
futures = {
|
||||
ex.submit(
|
||||
_run_one_lens, workdir, spec,
|
||||
spec.model or default_model, factory_root,
|
||||
spec.model or default_model, factory_root, budget, budget_state,
|
||||
): spec
|
||||
for spec in reviewers
|
||||
}
|
||||
@@ -131,5 +134,5 @@ def merge_usage(parts):
|
||||
for key in base:
|
||||
if isinstance(base[key], (int, float)):
|
||||
base[key] += usage.get(key, 0) or 0
|
||||
base["iterations"].extend(usage.get("iterations", []) or [])
|
||||
return base
|
||||
|
||||
|
||||
Reference in New Issue
Block a user