fix(benchmarks): pass prompts through stdin so Windows rework turns keep newlines
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
This commit is contained in:
1 parent
e6b516f828
commit
af1e248243
1 file changed
+11
-7
@@ -51,11 +51,15 @@ def kill_tree(process):
|
|||||||
process.wait(timeout=30)
|
process.wait(timeout=30)
|
||||||
|
|
||||||
|
|
||||||
def run_jsonl(command, cwd, env, timeout):
|
def run_jsonl(command, cwd, env, timeout, prompt):
|
||||||
"""Run a client, return (events, seconds, timed_out); output is read on a thread so the deadline holds."""
|
"""Run a client, return (events, seconds, timed_out); output is read on a thread so the deadline holds.
|
||||||
|
|
||||||
|
The prompt goes through stdin: on Windows the clients start through .cmd shims that cut arguments at newlines.
|
||||||
|
"""
|
||||||
start = time.monotonic()
|
start = time.monotonic()
|
||||||
process = subprocess.Popen(command, cwd=cwd, env=env, stdin=subprocess.DEVNULL, stdout=subprocess.PIPE,
|
process = subprocess.Popen(command, cwd=cwd, env=env, stdin=subprocess.PIPE, stdout=subprocess.PIPE,
|
||||||
stderr=subprocess.DEVNULL, text=True, encoding='utf-8', errors='replace')
|
stderr=subprocess.DEVNULL, text=True, encoding='utf-8', errors='replace')
|
||||||
|
threading.Thread(target=lambda: (process.stdin.write(prompt), process.stdin.close()), daemon=True).start()
|
||||||
lines = queue.Queue()
|
lines = queue.Queue()
|
||||||
threading.Thread(target=lambda: ([lines.put(line) for line in process.stdout], lines.put(None)), daemon=True).start()
|
threading.Thread(target=lambda: ([lines.put(line) for line in process.stdout], lines.put(None)), daemon=True).start()
|
||||||
events, timed_out = [], False
|
events, timed_out = [], False
|
||||||
@@ -90,12 +94,12 @@ def codex_env(arm, args):
|
|||||||
|
|
||||||
|
|
||||||
def claude_turn(prompt, cwd, arm, args, session):
|
def claude_turn(prompt, cwd, arm, args, session):
|
||||||
command = [shutil.which('claude'), '-p', prompt, '--output-format', 'stream-json', '--verbose',
|
command = [shutil.which('claude'), '-p', '--output-format', 'stream-json', '--verbose',
|
||||||
'--permission-mode', 'auto', '--allowedTools', *CLAUDE_TOOLS, *claude_flags(arm, args)]
|
'--permission-mode', 'auto', '--allowedTools', *CLAUDE_TOOLS, *claude_flags(arm, args)]
|
||||||
if session:
|
if session:
|
||||||
command += ['--resume', session]
|
command += ['--resume', session]
|
||||||
timeout = args.timeout
|
timeout = args.timeout
|
||||||
events, seconds, timed_out = run_jsonl(command, cwd, clean_env(), timeout)
|
events, seconds, timed_out = run_jsonl(command, cwd, clean_env(), timeout, prompt)
|
||||||
result = next((event for event in reversed(events) if event.get('type') == 'result'), {})
|
result = next((event for event in reversed(events) if event.get('type') == 'result'), {})
|
||||||
usage = result.get('usage', {})
|
usage = result.get('usage', {})
|
||||||
calls = [block for event in events if event.get('type') == 'assistant'
|
calls = [block for event in events if event.get('type') == 'assistant'
|
||||||
@@ -121,8 +125,8 @@ def codex_turn(prompt, cwd, arm, args, session):
|
|||||||
command += ['--json', '--skip-git-repo-check', '--sandbox', 'workspace-write',
|
command += ['--json', '--skip-git-repo-check', '--sandbox', 'workspace-write',
|
||||||
'-m', args.codex_model, '-c', f'model_reasoning_effort="{args.codex_effort}"']
|
'-m', args.codex_model, '-c', f'model_reasoning_effort="{args.codex_effort}"']
|
||||||
command += ['-C', str(cwd)] if not session else []
|
command += ['-C', str(cwd)] if not session else []
|
||||||
command.append(prompt)
|
command.append('-')
|
||||||
events, seconds, timed_out = run_jsonl(command, cwd, codex_env(arm, args), args.timeout)
|
events, seconds, timed_out = run_jsonl(command, cwd, codex_env(arm, args), args.timeout, prompt)
|
||||||
items = [event.get('item', {}) for event in events if event.get('type') == 'item.completed']
|
items = [event.get('item', {}) for event in events if event.get('type') == 'item.completed']
|
||||||
tools = [item for item in items if item.get('type') not in ('agent_message', 'reasoning', 'error')]
|
tools = [item for item in items if item.get('type') not in ('agent_message', 'reasoning', 'error')]
|
||||||
usage = [event.get('usage', {}) for event in events if event.get('type') == 'turn.completed']
|
usage = [event.get('usage', {}) for event in events if event.get('type') == 'turn.completed']
|
||||||
|
|||||||
Reference in new issue
Block a user