[eric] lint: de-private the wall budget, trim error_classify under cap, drop stray ws_manager

This commit is contained in:
ciregenz
2026-07-30 20:58:16 -07:00
parent f6ad6cfb91
commit e989517c6c
3 changed files with 9 additions and 16 deletions
+2 -2
View File
@@ -61,7 +61,7 @@ P_BATCHABLE_ACTION_TOOLS = {
# Past this many seconds a run stops exploring and delivers what it has. Sits above every run that
# actually succeeded in the 2026-07-30 sweeps (slowest good one: 142.8s) and well under the 300s
# that produced an empty answer. It nudges rather than kills, so the answer still comes from Done.
P_WALL_BUDGET_S = 180.0
WALL_BUDGET_S = 180.0
P_WRAPUP_NUDGE = (
"You've spent several turns looking without finishing. Wrap up NOW: call Done with the "
@@ -2052,7 +2052,7 @@ async def run_browser_agent(
# task ground past 300s and returned NOTHING, while every run that ever succeeded that
# day finished inside 143s. So the clock gets the same nudge the turn cap gets, and the
# answer arrives partial-but-honest instead of never.
p_out_of_time = time.time() - metrics_started_at > P_WALL_BUDGET_S
p_out_of_time = time.time() - metrics_started_at > WALL_BUDGET_S
if ((turn >= MAX_TURNS - 4 or p_out_of_time)
and not wrapup_nudged and not done_called and not send_confirmed):
wrapup_nudged = True
+5 -12
View File
@@ -201,19 +201,12 @@ def parse_retry_after(exc: BaseException, extra_text: str = "") -> int | None:
return None
# Transports that fail without saying anything a pattern can read. anthropic.APIConnectionError
# stringifies to the bare "Connection error." (no code, no ECONNRESET, nothing), so the list above
# scores it NON-transient and the retry never fires: one network hiccup then throws away a run that
# was already several steps in, and the user is told "Error: Connection error." Measured live, twice
# in one sweep. A transport failure is transient by construction, so classify it by TYPE, which no
# rewording upstream can break.
# anthropic.APIConnectionError stringifies to the bare "Connection error.", so the patterns above
# score it NON-transient and one network hiccup throws away a whole run (measured live, twice). A
# transport failure is transient by construction, so classify by TYPE, which no rewording breaks.
P_TRANSIENT_EXC_TYPES: Tuple[type, ...] = (
anthropic.APIConnectionError, # APITimeoutError subclasses this
anthropic.InternalServerError,
httpx.TransportError, # connect/read/write/pool timeouts, protocol errors
ConnectionError,
TimeoutError,
)
anthropic.APIConnectionError, anthropic.InternalServerError, # APITimeoutError subclasses the first
httpx.TransportError, ConnectionError, TimeoutError) # connect/read/pool timeouts, protocol errors
@typechecked
+2 -2
View File
@@ -373,7 +373,7 @@ def test_a_run_out_of_wall_time_delivers_what_it_has(monkeypatch):
# clock now gets the same one-shot wrap-up nudge the turn cap gets, so a long errand comes back
# partial-but-honest instead of never.
BH.BROWSER_HISTORY.clear(); BH.DOMAIN_NOTES.clear()
monkeypatch.setattr(BA, "P_WALL_BUDGET_S", 0.0) # over budget from the first turn
monkeypatch.setattr(BA, "WALL_BUDGET_S", 0.0) # over budget from the first turn
primary = FakeLLM([
Resp([p_rp("looking around"), p_tu("BrowserGetText")]),
Resp([p_tu("Done", message="Top comment is from u/someone, 387 upvotes.")]),
@@ -389,7 +389,7 @@ def test_a_run_out_of_wall_time_delivers_what_it_has(monkeypatch):
def test_a_quick_run_is_never_nudged_by_the_wall_budget(monkeypatch):
# The budget must not touch normal runs, or it would cut short the very tasks it exists to save.
BH.BROWSER_HISTORY.clear(); BH.DOMAIN_NOTES.clear()
assert BA.P_WALL_BUDGET_S >= 150, "budget must sit above the slowest run that actually succeeded"
assert BA.WALL_BUDGET_S >= 150, "budget must sit above the slowest run that actually succeeded"
primary = FakeLLM([
Resp([p_rp("reading"), p_tu("BrowserGetText")]),
Resp([p_tu("Done", message="It costs $9.99.")]),