This is an automated email from the ASF dual-hosted git repository.

davsclaus pushed a commit to branch main
in repository https://gitbox.apache.org/repos/asf/camel-website.git


The following commit(s) were added to refs/heads/main by this push:
     new 9da0491d Blog: Round 2 of the local-model benchmark, a real-world 
example set and 31 more Camel fixes (#1786)
9da0491d is described below

commit 9da0491df662fbdd511b2dc08cf4913f2758a41d
Author: Claus Ibsen <[email protected]>
AuthorDate: Mon Sep 21 23:02:21 2026 +0200

    Blog: Round 2 of the local-model benchmark, a real-world example set and 31 
more Camel fixes (#1786)
    
    Claude-Session: https://claude.ai/code/session_01Bp3538HRBPMQkb5ta9xRaj
    
    Co-authored-by: Claude Opus 5 (1M context) <[email protected]>
---
 .../featured.jpg                                   | Bin 0 -> 120664 bytes
 .../camel-local-model-benchmark-round-2/index.md   |  62 +++++++++++++++++++++
 2 files changed, 62 insertions(+)

diff --git 
a/content/blog/2026/09/camel-local-model-benchmark-round-2/featured.jpg 
b/content/blog/2026/09/camel-local-model-benchmark-round-2/featured.jpg
new file mode 100644
index 00000000..18ac7674
Binary files /dev/null and 
b/content/blog/2026/09/camel-local-model-benchmark-round-2/featured.jpg differ
diff --git a/content/blog/2026/09/camel-local-model-benchmark-round-2/index.md 
b/content/blog/2026/09/camel-local-model-benchmark-round-2/index.md
new file mode 100644
index 00000000..718999fb
--- /dev/null
+++ b/content/blog/2026/09/camel-local-model-benchmark-round-2/index.md
@@ -0,0 +1,62 @@
+---
+title: "Round 2: a real-world example set, a step-by-step benchmark, and 31 
more Camel fixes"
+date: 2026-09-22
+draft: false
+authors: [davsclaus]
+categories: ["AI", "Tooling"]
+keywords: ["apache camel", "AI", "local model", "ollama", "coding agent", 
"MCP", "camel cli", "yaml dsl", "validation", "camel 4.23"]
+preview: "The second round of the local-model benchmark moved from thirteen 
beginner examples to a ladder of real-world ones with a web shop running 
through them, added a step-by-step mode that works the way developers do, and 
produced 33 issues, 31 of them fixed in Camel 4.23. Step-by-step went from 81 
to 92 percent; one-shot reached 10 of 10 at least once."
+---
+
+Two weeks ago we [let a frontier model coach a small local model through 
Camel](/blog/2026/09/camel-local-model-benchmark/) and fixed Camel between 
every run: twelve of thirteen beginner examples in the end, and 99 findings 
that were wrong for humans too. That post ended with a promise: the next runs 
use a different set of examples, so the fixes land in the parts of Camel the 
first thirteen did not reach.
+
+This is that round. Same laptop, same 22 GB local model (`qwen3.6:35b-a3b` in 
Ollama), same frontier model running the harness and reading every failed 
attempt, Camel 4.23 on the main branch. What changed is the examples, the way 
the model is asked to work, and 31 more things in Camel.
+
+## A more realistic example set
+
+The first round used the beginner examples: a timer, a splitter, a memory-leak 
simulator, each a self-contained demo. Real integration work is not like that. 
So the [Camel CLI examples 
repository](https://github.com/apache/camel-jbang-examples) was reorganised 
into a ladder. Each rung is a group that builds on the ones before it: run, 
transform, route, fail well, connect without a service, connect to one service, 
contracts and security, AI, cloud. From the run rung onwards the examples s 
[...]
+
+Every example got the same shape: a README that says what you will see when it 
runs, how it works, and how to build it yourself step by step; a 
`metadata.json` that lists what it teaches; and a test in the Citrus YAML DSL 
that `camel test run` executes. The description in the README is written as 
observable behaviour, "three orders land in the table and a report every ten 
seconds lists them", because that is what the benchmark checks in the log.
+
+Twenty of those rungs were the one-shot set: one sentence in, a running route 
out. And the "build it step by step" sections became something new.
+
+## Step by step, the way people work
+
+Nobody writes an integration from one sentence. A developer starts a route, 
runs it, adds a step, watches the log, fixes what broke, adds the next. The 
second round measures that. The harness starts the example's first step with 
`camel run --dev`, then sends the README's remaining steps one at a time as 
requests through the [camel-jbang-mcp server](/manual/camel-jbang-mcp.html): 
"add a Java class OrderNumber and set the header from its method", "make the 
supplier throw for calls four to  [...]
+
+Eleven examples, 37 steps, each run five times. This is the benchmark that 
resembles a working day, and it is the one that moved.
+
+## What the runs found
+
+The loop was the same as before: run, read every failed attempt, decide 
whether the model or Camel was at fault, fix Camel, run again. 33 issues came 
out of it, 31 fixed and merged for Camel 4.23. A few, to give the flavour:
+
+- **A failed reload left the app without routes.** Save a file with a mistake 
in dev mode and every route stopped, silently, until the next good save. Now 
the previous routes are restored and the log says so 
([CAMEL-24860](https://issues.apache.org/jira/browse/CAMEL-24860)). Adding a 
second route file next to one with several routes failed with a duplicate route 
id ([CAMEL-24866](https://issues.apache.org/jira/browse/CAMEL-24866)). A 
directory created while the app ran was never watched  [...]
+- **The runtime now says what the validator knew.** When a YAML route fails to 
load, `camel run` prints the validator's report with the line and the fix 
instead of a YAML stack trace 
([CAMEL-24851](https://issues.apache.org/jira/browse/CAMEL-24851)). A person 
prototyping with the CLI gets the same.
+- **The validator says what to write.** `period: ${order.period}` in an 
endpoint option is a Simple expression, not a property placeholder; the 
validator now says to write `{{order.period}}` 
([CAMEL-24857](https://issues.apache.org/jira/browse/CAMEL-24857)). A `cron` 
endpoint without its required name, a `:name` parameter in a SQL query that 
camel-sql spells `:#name`, a resource file next to the route that must be 
`resource:classpath:`, a nested Resilience4j key that silently does nothin [...]
+- **The write tool reports the outcome.** Writing a file through the MCP 
server now waits for the reload and answers with what happened, reloaded, 
failed with the cause, or a properties reload, so an agent does not go on with 
a route that did not load 
([CAMEL-24859](https://issues.apache.org/jira/browse/CAMEL-24859)).
+- **The MCP server was missing tools.** It wrapped 27 of the 53 runtime tools 
and had none for SQL, datasources, circuit breakers, metrics, spans or route 
analysis. Now it has them 
([CAMEL-24867](https://issues.apache.org/jira/browse/CAMEL-24867)).
+
+Five of the 33 were plain bugs. The rest were places where Camel was right but 
silent or cryptic, and the fix is a better message for everyone.
+
+## The numbers
+
+Measured on the same clean build after the last merge.
+
+| | before round 2 | after |
+|---|---|---|
+| Step by step, 10 examples, 34 steps, 5 runs each: steps passed | 81% | 92% |
+| Runs with every step passed | 29 of 50 | 41 of 50 |
+| One sentence, 10 examples, 5 attempts each: attempts passed | 66% | 70% |
+| Passed at least once (pass@5) | 9 of 10 | 10 of 10 |
+| Passed all five times (pass^5) | 4 of 10 | 4 of 10 |
+| Tokens per one-shot attempt | ~3.1k | ~2.4k |
+
+The step-by-step mode gained the most: the steps that used to fail on a 
placeholder, a missing cron name or a silent reload now pass, and four examples 
that were shaky pass five times out of five. The one-shot mode gained less, and 
honesty requires saying why. Its remaining failures are not Camel being silent. 
The files validate, the app starts, and the log does not show what the sentence 
described: two routes named in the description that the model merged into one, 
a pick list logged in [...]
+
+One more experiment, on the SQL example. The MCP server exposes many runtime 
tools, and a local model pays for every tool description in its prompt, so it 
normally gets a small core set. We ran the SQL example twice: once with the 
core set, once with three SQL tools added, which let the model query the app's 
datasource and see its SQL trace. Two things came out. When a step *was* a 
database task, "correct this customer's country in the customers table", the 
model with the SQL tool did it [...]
+
+So a tool helps a small model with the task it was asked to do; it does not 
make the model check its own work. That settles how the MCP server will pick 
tool groups for local models: from what the running app has, a datasource, a 
circuit breaker, tracing, rather than waiting for the model to ask for them, 
because it will not.
+
+## Same loop, better Camel
+
+This is a continuation, not a conclusion. The harness, the examples and every 
failed attempt are public; the model is a 22 GB file anyone can run; the fixes 
ship in 4.23 and none of them is an AI feature. What a coding agent trips over 
within seconds is what a person at the keyboard trips over an hour later, and 
we now have a way to find those places twenty times a day. We will keep running 
it, on the next rungs of the ladder and on the next models, and keep fixing 
Camel for both kinds o [...]

Reply via email to