GLM-5.3 10-task agent benchmark

3code vs pi vs opencode vs hermes vs zcode: 10-task SWE-bench Verified on GLM-5.3

Detailed data for the 10-task subset, second round. All five agents routed through the same LiteLLM proxy to Z.ai glm-5.3, so every difference reflects the agent harness, not the model. Per-task timeout 600s. All agents ran with vanilla config.

Scorecard

# instance_id band 3code pi opencode hermes zcode
1 sympy__sympy-23534 easy resolved resolved resolved resolved resolved
2 pydata__xarray-6461 easy resolved resolved resolved resolved resolved
3 django__django-15368 easy resolved resolved resolved resolved resolved
4 psf__requests-1766 easy unresolved unresolved unresolved resolved unresolved
5 matplotlib__matplotlib-26342 medium resolved empty (timeout) empty (timeout) empty (timeout) resolved
6 django__django-15037 medium resolved resolved resolved resolved resolved
7 scikit-learn__scikit-learn-14087 medium empty (timeout) unresolved empty (timeout) empty (timeout) unresolved
8 pytest-dev__pytest-7236 medium resolved resolved resolved empty (timeout) empty (timeout)
9 sphinx-doc__sphinx-8056 medium resolved resolved resolved resolved resolved
10 astropy__astropy-14369 hard empty (timeout) empty (timeout) empty (timeout) empty (timeout) empty (timeout)
7/10 6/10 6/10 6/10 6/10

Zero eval errors. “empty (timeout)” means the 600s cap was hit without a diff; “unresolved” means a patch was produced but the task tests failed.

Noise floor notes: psf__requests-1766 was resolved by all agents in the GLM-5.2 round and went unresolved for four of five here, so that reads as a model-level regression, not a harness difference. Z.ai’s rate limiter (429s) interrupted several tasks mid-run; affected tasks were retried after a cooldown and the table shows the final state.

Batch totals (all 10 tasks)

agent input output total tokens resolved
3code 4,137,609 71,751 4,209,360 7/10
pi 4,523,650 117,707 4,641,357 6/10
zcode 4,675,371 90,629 4,766,000 6/10
hermes 5,974,355 98,255 6,072,610 6/10
opencode 6,683,560 88,187 6,771,747 6/10

Same table as a percentage of the median agent (zcode):

agent total tokens % of median resolved
3code 4,209,360 88.3% 7/10
pi 4,641,357 97.4% 6/10
zcode 4,766,000 100.0% 6/10
hermes 6,072,610 127.4% 6/10
opencode 6,771,747 142.1% 6/10

3code used 38% less input than opencode and 9% less than pi, while resolving one more task. Output tokens are lowest for 3code as well (terse system prompt and reply style are deliberate design).

Caveat on input tokens: due to a LiteLLM proxy configuration error, cache hit rates were not recorded this round (Z.ai’s implicit caching was almost certainly active, but the proxy dropped the cached_tokens field from streamed responses). Input totals here include tokens that were actually served from cache and billed at a discount; reported input is therefore an upper bound on billed cost. Cache reporting is fixed for future tests. Token windows are reconstructed from per-task timing; pi’s django-15368 and scikit-learn numbers include overlapping retry attempts, so pi’s total is an upper bound.

Per-task detail

sympy__sympy-23534 (easy)

resolved diff lines time input output
3code resolved 13 135s 40,105 1,701
pi resolved 13 180s 47,131 2,106
opencode resolved 13 70s 64,491 1,548
hermes resolved 13 206s 147,010 1,851
zcode resolved 13 162s 160,511 4,400

pydata__xarray-6461 (easy)

resolved diff lines time input output
3code resolved 13 207s 333,917 6,451
pi resolved 13 382s 467,413 12,614
opencode resolved 17 556s 712,398 9,265
hermes resolved 13 541s 426,740 4,821
zcode resolved 30 549s 1,264,168 16,339

django__django-15368 (easy)

resolved diff lines time input output
3code resolved 24 125s 126,824 3,418
pi resolved 22 135s 206,395 5,898
opencode resolved 22 169s 191,677 3,453
hermes resolved 22 228s 291,779 8,484
zcode resolved 23 303s 375,779 7,715

psf__requests-1766 (easy)

resolved diff lines time input output
3code unresolved 13 33s 28,359 1,145
pi unresolved 13 40s 82,125 1,342
opencode unresolved 13 31s 23,560 509
hermes resolved 13 99s 117,305 2,674
zcode unresolved 13 95s 108,122 3,896

matplotlib__matplotlib-26342 (medium)

resolved diff lines time input output
3code resolved 25 121s 171,840 3,443
pi empty (timeout) 0 605s 1,097,843 20,296
opencode empty (timeout) 0 604s 963,618 7,972
hermes empty (timeout) 0 604s 432,451 10,790
zcode resolved 25 305s 273,064 7,410

django__django-15037 (medium)

resolved diff lines time input output
3code resolved 41 214s 467,390 8,046
pi resolved 24 222s 274,467 6,268
opencode resolved 24 304s 614,120 13,544
hermes resolved 24 315s 596,666 11,907
zcode resolved 24 347s 425,322 13,546

scikit-learn__scikit-learn-14087 (medium)

resolved diff lines time input output
3code empty (timeout) 0 602s 350,068 8,377
pi unresolved 13 135s 133,360 6,619
opencode empty (timeout) 0 602s 146,069 3,061
hermes empty (timeout) 0 602s 286,867 5,219
zcode unresolved 13 186s 200,477 7,045

pytest-dev__pytest-7236 (medium)

resolved diff lines time input output
3code resolved 40 340s 638,398 12,911
pi resolved 40 474s 811,656 20,576
opencode resolved 40 429s 874,535 15,139
hermes empty (timeout) 0 601s 1,117,483 23,973
zcode empty (timeout) 0 601s 1,339,082 18,710

sphinx-doc__sphinx-8056 (medium)

resolved diff lines time input output
3code resolved 38 237s 423,004 5,334
pi resolved 38 316s 487,079 16,253
opencode resolved 51 377s 1,638,918 15,042
hermes resolved 38 325s 1,063,094 9,764
zcode resolved 38 303s 405,548 7,809

astropy__astropy-14369 (hard)

resolved diff lines time input output
3code empty (timeout) 0 602s 1,557,704 20,925
pi empty (timeout) 0 602s 916,181 25,735
opencode empty (timeout) 0 602s 1,454,174 18,654
hermes empty (timeout) 0 602s 1,494,960 18,772
zcode empty (timeout) 0 602s 123,298 3,759

Observations

The agents that didn’t run

Methodology

Same as the GLM-5.2 round: SWE-bench Verified harness for evaluation, patches extracted as git diff HEAD from a fresh clone at the task’s base commit, per-task 600s timeout, agents run once per task with retries only for rate-limit (429) failures. Token counts come from the LiteLLM proxy’s usage log, which captures Z.ai’s usage object verbatim per request (pass-through, no recomputation) - except for the cached-token field this round, see the caveat above. GLM-5.3 requires thinking enabled; the proxy normalizes this for vanilla clients by injecting thinking: {type: enabled} (and translating reasoning_effort for OpenAI-protocol clients) before relaying, at Z.ai’s default effort.

Changes since the GLM-5.2 round: 3code grew a --no-sandbox flag (used here; the harness already isolates in a throwaway clone) and its system prompt now points multi-step work at the cybernetic-plan skill. The harness grew a --subset10 flag and pi, hermes, and zcode agent entries. zcode runs through the proxy as an openai-compatible provider against an isolated HOME config, keyed with ZCODE_API_KEY.