Skip to main content
Version: Next

Model Evaluation

We evaluated a range of models against the bundle's real agent tasks to ground the guidance in Model Requirements. This page documents how the evaluation works and the measured results.

Methodology

The eval tool

The agent-server ships a CLI evaluation harness under agent-server/eval. It drives real agent sessions against the live PHP backend and records full metrics per run.

cd dev/pimcore/pimcore-agent-bundle/agent-server
npm run eval -- list # list available tasks and agents
npm run eval -- run <taskId> --batch <b> # run a task, tagged into a batch
npm run eval -- summary --batch <b> # aggregate a batch into a metrics table

Other subcommands (prompt, ask-reply, proposal, report, status) drive follow-up turns, answer questions, resolve proposals, and emit per-session reports.

Claude Code as the operator

Each task is run with Claude Code acting as the operator that drives the conversation the way a real user would: it sends the task prompt, issues refinement messages when the first attempt is incomplete, and approves, refines, or rejects the agent's proposals - then judges the outcome and records a pass/fail verdict with notes.

Mechanical "continue or stop?" checkpoints are handled by an autopilot so operator latency does not distort timings: it auto-answers continue until the task completes, a real question surfaces (hands back to the operator), the per-task tool-call ceiling is hit, or a maximum number of continue round-trips is reached.

The tasks

The suite has 18 tasks spanning the capabilities agents are used for. Each runs against a sample agent definition shipped with the bundle which can be run against our demo dataset.

#TaskWhat it exercises
1smoke-list-classesBasic tool wiring - call the read tool and list the available data-object classes instead of answering from memory.
2reason-data-modelRead and explain the data model: the Manufacturer ↔ Car relation plus the fields the Car class itself holds.
3load-red-carsQuery cars filtered by color and present them as interactive object-preview widgets (not a table or prose list).
4load-bmw-cars-tableQuery cars by manufacturer and render them in a data-table widget with sensible columns.
5load-aston-martin-assetsFind image assets for a manufacturer and present them through asset-preview widgets.
6summarize-carRead a single car and summarise its key fields, emitting an element-link widget to the object.
7update-car-objectPropose a multi-field update (bodystyle, class, year, colors, images, dimensions) as one approved change-set.
8update-accessorypart-objectEdit nested classification-store data - round numeric dimensions and change a typed value.
9update-event-objectMulti-language update (title/description across locales) plus tags, location, status, and computed dates.
10update-multiple-carsProduce one separate proposal per car across four cars, each with localised descriptions.
11asset-metadata-relationAdd a car to an asset's relation field while preserving the entries already present.
12asset-tags-visualVision - look at the image and tag it with the correct color, country, and quality.
13research-car-priceUse the web-research tool to find a price and propose a written analysis (not internal guesses).
14personalize-documentCreate a target-group-scoped variant of an existing landing page for a given persona.
15template-simpleAuthor and render a simple Twig template with a single editable headline.
16template-advancedAuthor a more complex template combining an image grid and a WYSIWYG editable.
17create-news-objectCreate a News object end-to-end - image, field-collection entries, and relations, in the correct folder.
18landing-page-chevroletBuild a complex landing page from web research: intro, FAQ, and an image carousel with linked content.

Metrics and grading

Every run records token accounting (input, output, cache-read, cache-write), server-side timing (model vs. tool time), tool-call counts, proposals, and emitted widgets. Automated checks (e.g. "this widget was emitted", "this proposal field equals X", "this tool was called", "no errors") run after the session; the operator's pass/fail verdict is the headline result.

Results

These results are spot-checks. Each figure is a single run; the agents and models are non-deterministic, so reruns will produce slightly different numbers and occasionally different pass/fail outcomes. Some failures are environmental rather than model quality - for example, Hugging Face inference endpoints that scale to zero can time out mid-run. Treat the table as directional, and re-run the eval tool against your own tasks before committing to a model for production.

One row per unique model, using that model's best (highest-scoring) run. Where a model was evaluated more than once, the run with the most passes is shown (ties broken by lower cost), so the date column varies per model. Non-cached input = total input − cache-read; it is the figure that best reflects effective input cost. Token counts are rounded to thousands; all runs are from June 2026.

ModelDateSuccessInOutCached-inNon-cached-inProviderRuntimeEstimated Costs
claude-sonnet-4.62026-06-2318/18 (100%)3,593k61k3,176k417kCopilot25.5 min3.12 $
claude-haiku-4.52026-06-0917/18 (94%)3,010k41k2,597k412kCopilot10.2 min0.88$
gpt-5.4-mini2026-06-1117/18 (94%)3,468k81k3,010k457kCopilot20.8 min0.93$
qwen3p6-plus2026-06-1017/18 (94%)5,431k87k4,485k946kFireworks40.0 min1.19 $
gemini-3.5-flash2026-06-1117/18 (94%)7,642k67k5,823k1,820kCopilot29.2 min4.2 $
kimi-k2p62026-06-1016/18 (89%)2,563k56k2,138k425kFireworks21.6 min0.97 $
deepseek-v3.22026-06-2216/18 (89%)5,768k63k1,665k4,103kHuggingface57.2 min1.58$
Qwen3.6-35B-A3B2026-06-1914/18 (78%)6,656k131k06,656kHuggingface30.2 min1.12 $
minimax-m2.72026-06-2214/18 (78%)7,969k108k6,780k1,190kHuggingface28.8 min2.52 $
gemma4:31b-cloud2026-06-1113/18 (72%)2,883k19k02,883kOllama23.8 min-
gemma-4-26B-A4B-it2026-06-1912/18 (67%)10,111k68k010,111kHuggingface61.2 min0.73 $
gpt-oss-120b2026-06-0910/18 (56%)7,842k87k7,102k740kCerebras7.5 min0.32 $
qwen3-32b2026-06-1910/18 (56%)3,122k137k03,122kHuggingface59.7 min0.28 $

claude-sonnet-4.6 is the only model to clear the whole suite (18/18) and is the accuracy leader, but it is several times more expensive per run than the efficiency leaders. Among the high-scorers, claude-haiku-4.5 is the most efficient - comparable non-cached input to Sonnet at roughly a third the cost and a quarter the runtime - which is why it remains the shipped default. The practical read: default to Haiku, and reach for Sonnet on the hardest document/creation agents where the extra reliability is worth the cost.

Per-model strengths, weaknesses, and failures

Each entry summarizes what the model is good and bad at, then lists the specific tasks its best run failed.

  • claude-sonnet-4.6 (18/18): The only clean sweep - it passed every task, including the two hard document/creation tasks that trip most of the field (a full Chevrolet landing page with five product-teaser renderlets, and an end-to-end News object) plus the date and vision tasks. Strong caching (≈88%); the trade-off is cost - several times pricier per run than Haiku and ~2.5× slower.

    Failed: none.

  • claude-haiku-4.5 (17/18): Best pass-rate-to-cost balance - one task off the top at the lowest cost and fastest runtime; reliable on object/asset updates, tagging, templates, listings, and document personalization. Its one real gap is Unix-timestamp/date arithmetic.

    Failed: update-event-object - set the wrong date and only converged after an explicit epoch was supplied.

  • gpt-5.4-mini (17/18): Broadly correct across updates, research, templates, and the hard document tasks, with strong content quality; roughly twice as slow as Haiku.

    Failed: load-aston-martin-assets - found all assets but rendered a data-table instead of the required asset-preview widgets.

  • qwen3p6-plus (17/18): Top-tier accuracy including dates and document tasks; the slowest of the 17/18 tier and prone to long single-inference stalls.

    Failed: template-advanced - no proposal; stalled in a 300 s inference timeout (environmental, not a logic error).

  • gemini-3.5-flash (17/18): Very high pass rate across updates, listings, and templates, but high token and non-cached cost.

    Failed: landing-page-chevrolet - produced only an empty areablock skeleton and then thrashed on refine (serialization errors).

  • kimi-k2p6 (16/18): Lowest total input of any model; fast and accurate on text/data tasks, but no reliable vision.

    Failed: load-red-cars (data-table instead of object-preview widgets); asset-tags-visual (blue car never tagged blue).

  • deepseek-v3.2 (16/18): Strong content and research quality, but weak at date computation and expensive: caches poorly (≈29%) and is the slowest model.

    Failed: landing-page-chevrolet (car-teaser links unmet); update-event-object (wrong dates).

  • Qwen3.6-35B-A3B (14/18): Gets listing content right but systematically mis-emits widgets and has no vision; no prompt cache inflates cost.

    Failed: load-red-cars, load-bmw-cars-table (wrong widget type), asset-tags-visual (vision hallucination), landing-page-chevrolet (empty-scaffold thrash).

  • minimax-m2.7 (14/18): Reasonable on standard object updates, but skips required web research, is weak on vision and dates, and goes non-convergent on multi-part creates.

    Failed: research-car-price (no web research), update-event-object (dates), asset-tags-visual (vision miss), create-news-object (non-convergent, 96 tool calls).

  • gemma4:31b-cloud (13/18): Cheapest output tokens and fine on simpler updates/listings, but stalls to empty answers on create/document tasks; no prompt cache.

    Failed: asset-tags-visual, update-event-object (dates), template-advanced (undefined CSS variable), and create-news-object / landing-page-chevrolet (no proposal - ended with an empty answer).

  • gemma-4-26B-A4B-it (12/18): Passes simpler read/update tasks but falls into an "approve-minimal-first" non-convergence loop on anything multi-field; by far the most expensive (10.1 M input, 61 m).

    Failed: load-red-cars, update-car-object (only 5/7 fields), update-event-object, personalize-document, create-news-object, landing-page-chevrolet.

  • gpt-oss-120b (10/18): Fastest wall-clock, but broadly unreliable for tool-driven work: leaks chain-of-thought as the answer, skips required tool calls, and hallucinates errors.

    Failed: eight tasks incl. smoke-list-classes (leaked reasoning, never called the tool), the data-query widgets, asset-tags-visual, research-car-price, and landing-page-chevrolet.

  • qwen3-32b (10/18): Modest input footprint but the weakest tier: no vision, broken dates/relations (hallucinated IDs), no widget emission, and thrashes on templates/documents.

    Failed: eight tasks incl. the data-query widgets, asset-tags-visual, research-car-price, template-simple (42 failing calls), create-news-object, and landing-page-chevrolet.