From 9049bd683de433bbfaaed7d1e0a3629a6cb89236 Mon Sep 17 00:00:00 2001 From: sora <2075279110@qq.com> Date: Mon, 14 Sep 2026 04:05:18 +0000 Subject: [PATCH] openai-pool: allow plain-URL members (no port range required) --auto-concurrency wraps a single endpoint as a 1-member pool; the spec parser rejected it with 'needs a {start..end} port range' and killed every benchmark. Range-less comma segments are now plain members; only a fully empty endpoint list errors. Co-Authored-By: Claude --- evalharness/model/runner.py | 10 ++++++---- 1 file changed, 6 insertions(+), 4 deletions(-) diff --git a/evalharness/model/runner.py b/evalharness/model/runner.py index 1288fd4..5b65a21 100644 --- a/evalharness/model/runner.py +++ b/evalharness/model/runner.py @@ -852,13 +852,12 @@ def _make_adapter(spec: str, api_key: str = '') -> ModelAdapter: from .pool import pooled rest = spec[len('openai-pool/'):] - ms = __import__('re').findall(r'\{(\d+)\.\.(\d+)\}', rest) - if not ms: - raise ValueError("openai-pool needs a {start..end} port range") base_url, _, model = rest.partition('?') # expand EACH comma-separated segment's OWN range independently -- # a global sub(count=1) would keep replacing only the FIRST range - # and emit URLs with literal '{8200..8203}' in later segments + # and emit URLs with literal '{8200..8203}' in later segments. + # Segments WITHOUT a range are plain members: --auto-concurrency + # wraps a single endpoint as a 1-member pool to get the gate. specs = [] for seg in base_url.split(','): seg = seg.strip() @@ -870,6 +869,9 @@ def _make_adapter(spec: str, api_key: str = '') -> ModelAdapter: specs.append(f'openai/{u}?{model}') elif seg: specs.append(f'openai/{seg}?{model}') + if not specs: + raise ValueError('openai-pool needs at least one endpoint ' + '(plain URL or {start..end} port range)') adapter = pooled(specs, api_key=api_key) if api_key else pooled(specs) elif re.fullmatch(r'mock[-:](boxed|oracle|fc|tool|echo|const)?', spec): # mock-boxed (preferred) == legacy mock:boxed; bare 'mock' == echo.