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 19a0bba4 Blog: Apache Camel 4.23 What's New (#1806)
19a0bba4 is described below

commit 19a0bba459dea3c663c9b81afc2ab89f9921449e
Author: Claus Ibsen <[email protected]>
AuthorDate: Thu Oct 15 22:07:05 2026 +0200

    Blog: Apache Camel 4.23 What's New (#1806)
    
    * Blog: Apache Camel 4.23 What's New
    
    Co-Authored-By: Claude Opus 5.5 (1M context) <[email protected]>
    Signed-off-by: Claus Ibsen <[email protected]>
    
    * Blog: Camel 4.23 What's New - roadmap for 4.24
    
    Co-Authored-By: Claude Opus 5.5 (1M context) <[email protected]>
    Signed-off-by: Claus Ibsen <[email protected]>
    
    * Blog: Camel 4.23 What's New - final numbers and late fixes from the 
release tag
    
    Co-Authored-By: Claude Opus 5.5 (1M context) <[email protected]>
    Signed-off-by: Claus Ibsen <[email protected]>
    
    * Blog: Camel 4.23 What's New - AI share as in 4.22, CAMEL-25489 counted
    
    Co-Authored-By: Claude Opus 5.5 (1M context) <[email protected]>
    Signed-off-by: Claus Ibsen <[email protected]>
    
    * Blog: Camel 4.23 What's New - Kafka Share, OpenAI Batch API, faster 
scripting languages and the CLI connector WebSocket transport
    
    * Blog: Camel 4.23 What's New - add croway to the authors
    
    * Blog: Camel 4.23 What's New - add OpenFeature section
    
    Add a dedicated section for the new camel-openfeature component covering
    boolean toggles, the OpenFeature language for predicates, and fractional
    targeting for A/B testing with code examples in YAML and Java DSL.
    
    Co-Authored-By: Claude Opus 4.6 <[email protected]>
    
    ---------
    
    Signed-off-by: Claus Ibsen <[email protected]>
    Co-authored-by: Claude Opus 5.5 (1M context) <[email protected]>
    Co-authored-by: croway <[email protected]>
    Co-authored-by: Christoph Deppisch <[email protected]>
---
 content/blog/2026/10/camel423-whatsnew/index.md | 835 ++++++++++++++++++++++++
 1 file changed, 835 insertions(+)

diff --git a/content/blog/2026/10/camel423-whatsnew/index.md 
b/content/blog/2026/10/camel423-whatsnew/index.md
new file mode 100644
index 00000000..2763b934
--- /dev/null
+++ b/content/blog/2026/10/camel423-whatsnew/index.md
@@ -0,0 +1,835 @@
+---
+title: "Apache Camel 4.23 What's New"
+date: 2026-10-15
+draft: false
+authors: [ davsclaus, croway, christophd ]
+categories: [ "Releases" ]
+keywords: ["apache camel", "whats new", "camel 4", "release", "camel 4.23", 
"integration framework", "ai", "security"]
+preview: "Details of what we have done in the Camel 4.23 release."
+---
+
+Apache Camel 4.23 has just been [released](/blog/2026/10/RELEASE-4.23.0/).
+
+This is the biggest Camel release in a long time. Since 4.22 we have resolved 
**1030 JIRA tickets**
+(nearly twice as many as in 4.22): 503 bug fixes, 362 improvements and 53 new 
features,
+made in over 2000 commits by 63 contributors.
+
+As in Camel 4.22, AI-assisted development is now the norm rather than the 
exception:
+almost 90% of the commits that were not made by bots were made with an AI 
coding assistant. Every change
+still went through the usual Apache process -- JIRA, pull request, CI and 
review by the Camel committers --
+but having AI coding assistants on the team has allowed us to go much deeper 
on bug fixing, security hardening
+and documentation than we could before, and still have time for new features.
+
+The headline features in this release are:
+
+- **Semantic EIPs** -- A new `semantic` language lets routes make decisions on 
the *meaning* of a message
+  (classify, score, detect prompt injection) and use those decisions in 
Choice, Filter, Switch, Aggregate, error handling and more.
+- **Authorization as components** -- New components for Open Policy Agent, 
OpenFGA and SPIFFE, so
+  "who is calling" and "what may they do" become route steps and route 
policies, also for AI agent tools.
+- **Camel Core** -- New Switch and Cache EIPs, a pluggable 
`KeyValueRepository` SPI, error messages that point
+  to the line in your source file, and a much more robust dev mode reload.
+- **Camel CLI and TUI** -- The TUI source editor now supports Java and XML 
routes (not only YAML), routes can be converted
+  between YAML, XML and Java without running them, and the validator explains 
*what to write* in many more cases.
+- **Feature flags with OpenFeature** -- A new component and language for 
vendor-neutral feature flagging using the
+  OpenFeature specification, with support for boolean toggles, A/B testing and 
fractional rollout.
+- **Secure out of the box** -- Around 145 tickets in this release are about 
security hardening and secure defaults.
+- **Validated documentation** -- Every YAML, XML and Java DSL code snippet in 
the documentation is now validated,
+  and the build fails if an invalid snippet is added.
+
+## Camel Core
+
+### Switch EIP
+
+The new [Switch EIP](/components/next/eips/switch-eip.html) is a fast, literal 
value-based dispatcher.
+It evaluates a selector expression once and sends the message to the endpoint 
of the case with the matching value.
+
+Where the [Choice EIP](/components/next/eips/choice-eip.html) evaluates 
predicates in turn and can have nested steps,
+each case in Switch is exactly one value and one endpoint, which makes it easy 
to read and fast to route:
+
+```java
+from("direct:tickets")
+    .doSwitch(header("department"))
+        .doCase("billing", "direct:billing")
+        .doCase("technical", "direct:technical")
+        .otherwise("direct:review")
+    .end();
+```
+
+And in YAML DSL:
+
+```yaml
+- route:
+    from:
+      uri: direct:tickets
+      steps:
+        - switch:
+            selector:
+              header:
+                expression: department
+            case:
+              - value: billing
+                uri: direct:billing
+              - value: technical
+                uri: direct:technical
+            otherwise:
+              uri: direct:review
+```
+
+Values are matched case-insensitively, duplicate values are rejected at 
startup, and the endpoint URIs are fixed
+(use `toD` when you need a computed URI). The Switch MBean counts how many 
messages went to each case.
+
+### Cache EIP
+
+The new [Cache EIP](/components/next/eips/cache-eip.html) adds read-through 
caching to a block of steps, similar to Spring's `@Cacheable`.
+On a cache hit the cached value becomes the message body and the block is 
skipped; on a miss the block runs and its result is cached:
+
+```yaml
+- route:
+    from:
+      uri: direct:product
+      steps:
+        - cache:
+            expression:
+              simple:
+                expression: "${header.productId}"
+            ttl: 10m
+            steps:
+              - to:
+                  uri: http://product-service/api/product
+```
+
+Failed exchanges are never cached, and a failing cache never fails the route: 
a failed read just runs the block.
+
+### Key-Value Repository SPI and State Store
+
+A new `KeyValueRepository` SPI is one key-value store abstraction behind 
several Camel features: the Cache EIP,
+the Idempotent Consumer, the Aggregator, and the new [State 
Store](/components/next/state-store-component.html) component.
+
+It comes with implementations for memory, JDBC, JPA, Cassandra, Kafka, Redis, 
Infinispan, Hazelcast, Caffeine, Ehcache and JCache.
+The new `KeyValueIdempotentRepository` and `KeyValueAggregationRepository` 
adapters let the Idempotent Consumer and the Aggregator
+use any of these backends.
+
+The `state-store` component exposes the repository directly in routes, with 
operations such as `put`, `putIfAbsent`, `get`, `delete` and `keys`,
+and optional TTL. If you are coming from MuleSoft, this is the equivalent of 
the Object Store.
+
+### Simple Language
+
+The Simple language has received a lot of attention:
+
+- Predicates inside `${ }`, as in EL and Groovy: `${body != null && 
body.size() > 0}`.
+- The ternary operator now accepts compound conditions: `${header.age > 18 && 
header.country == 'DK' ? 'yes' : 'no'}`.
+- `!` as a negation prefix: `${!body.isEmpty()}`.
+- `equals` and `!equals` operators for plain text comparison. Remember that 
`==` compares numeric strings as numbers, so `0001 == 001` is true.
+- A new `escape` function for html, xml, json, js, sql and url: 
`${escape(html, ${body})}`.
+- Error messages say what to write: `Unknown function: bdy (did you mean 
${body}?)`.
+
+A review of the language also fixed a number of corner cases, so check the 
upgrade guide.
+If you want to extend Simple with your own functions, see the [Extending 
Apache Camel Simple](/blog/2026/09/camel-simple-customfunction/) blog post.
+
+### Errors that point to your source
+
+When source location is enabled (it is by default in the `dev` profile), Camel 
now tells you *where* in your source the problem is.
+The failed delivery log, the error registry, and the inflight, blocked and 
shutdown dumps all include the file and line:
+
+```text
+... at route1[to3] orders.camel.yaml:18. Exhausted after delivery attempt: 1 
...
+```
+
+The error registry also records the origin of a handled error (the node that 
actually failed, not the `onException` that handled it),
+and collapses repeated identical errors so a storm of one error no longer 
pushes the others out.
+
+### Dev Mode Reload
+
+Live reloading in dev mode is now much more forgiving:
+
+- A failed reload keeps the previous routes running (restored from the last 
good definitions), and logs a WARN that says so.
+- Directories created while the application runs (such as a new Java package) 
are now watched.
+- An exchange that is cut off by a reload is logged as a single WARN line that 
says where it was waiting, instead of a full stack trace.
+- Stopping or removing all routes is now one graceful shutdown, so `direct` 
consumers are drained first.
+
+### Java DSL Parser
+
+The new `camel-java-io` module can read Java DSL routes into the Camel model 
*without compiling them*. It works in milliseconds
+and never runs, loads or compiles any code from the source file. It is what 
powers the Java support in the TUI source editor,
+`camel transform route`, `camel overview` and the route diagrams.
+
+### CamelEvent JSON
+
+Camel events can now be serialized to JSON (`asJSon()` / `toJSon()`), with 
structured details such as exchange id, route id,
+endpoint, step id and exception. The event dev console shows these details.
+
+### Other Core Improvements
+
+- The `marshal` EIP has an `allowNullBody` option (like `unmarshal`), and both 
say clearly when the body is null.
+- The Splitter now unwraps `List<Exchange>` parts, such as from batching 
consumers like Kafka.
+- A new `resolveResource` option on every expression loads the content when 
the result is a `resource:...` value.
+- The Circuit Breaker EIP counts fallback, timed out and bulkhead-rejected 
calls in JMX, the dev console and the TUI.
+- Many correctness fixes in Saga, Aggregate, Resequencer, Claim Check, 
Idempotent Consumer and onCompletion during graceful shutdown.
+- `http:` and `https:` resources are now loaded with a connect and read 
timeout.
+
+## Semantic EIPs
+
+The new [Semantic](/components/next/languages/semantic-language.html) language 
lets a route make decisions on the meaning of a message.
+You declare named evaluations once, and then use them anywhere Camel accepts 
an expression or predicate:
+
+```yaml
+- semantic:
+    evaluation:
+      department:
+        type: choice
+        instructions: Which department should handle this message?
+        criteria:
+          billing: Invoices, payments and refunds
+          technical: Bugs, outages and technical problems
+- route:
+    from:
+      uri: direct:tickets
+      steps:
+        - setProperty:
+            name: department
+            expression:
+              language:
+                language: semantic
+                expression: ref:department
+        - choice:
+            when:
+              - expression:
+                  simple:
+                    expression: "${exchangeProperty.department} == 'billing'"
+                steps:
+                  - to:
+                      uri: direct:billing
+            otherwise:
+              steps:
+                - to:
+                    uri: direct:review
+```
+
+An evaluation returns a boolean, a category, a score or a set of labels, and 
can be used with Choice, Filter, Switch, Validate,
+Aggregate correlation and completion, Recipient List, Loop, onException 
`retryWhile`, and more.
+Several evaluations can be batched in one call 
(`refs:actionable,department,urgency`).
+The evaluations are also available in the Simple language with 
`${semantic('name')}`.
+
+The actual evaluation is done by an *expert*, which is a pluggable adapter 
that declares what it can do.
+Camel 4.23 comes with two experts:
+
+- **TypeSafe AI** (`camel-typesafe-ai`) -- calls the TypeSafe AI "System One" 
decision API (the Jev model),
+  which answers yes/no, choice and score questions with probabilities. It is 
also available as a component and as a `typesafe-ai` language.
+- **Wolf Defender** (`camel-wolf-defender`) -- detects prompt injection and 
jailbreak attempts *locally* on the CPU
+  using ONNX Runtime and the Wolf-Defender model. No remote service is needed.
+
+Semantic decisions can be audited (opt-in), and the audit history can be 
inspected with `camel semantic audit`, the dev console,
+and the new Semantic tab in the Camel TUI.
+
+To learn more, see the blog posts [TypeSafe Jev meets Apache 
Camel](/blog/2026/09/semantic-evaluation-system-one/)
+and [One request, several agents: semantic 
routing](/blog/2026/10/semantic-agent-routing/).
+
+_Note: the Semantic language is in Preview, and its YAML syntax changed during 
the 4.23 development cycle (`question:` became `evaluation:`
+with an `expert`); the documentation shows the final syntax._
+
+## Camel AI
+
+### LLM Component
+
+The `camel-openai` component works with many LLM vendors that offer an 
OpenAI-compatible API, and it is now also available
+under the more neutral `llm:` scheme. The `openai:` scheme continues to work. 
The component gained:
+
+- **Moderation** of text and images, with the verdict as headers so a route 
can block a flagged message before it reaches the model.
+- **Image generation and editing**.
+- **Batch API** support (`batch`, `batch-retrieve`, `batch-cancel`, 
`batch-results`) for half-price asynchronous processing.
+- A **webhook consumer** that verifies OpenAI webhook signatures.
+- **Agentic loop visibility** -- cumulative token headers, a per-iteration 
trace, lifecycle events, and a token budget (`maxAgenticTokens`)
+  that also applies to the Responses API tool loop.
+- **Phase-specific timeouts** (connect, read, write) and **structured error 
metadata** (`CamelAiErrorCategory` such as `RATE_LIMIT`, and 
`CamelAiRetryAfterMillis`)
+  so `onException` can handle rate limits properly.
+- Calling `ai-tool` routes from the `AiToolRegistry` (`tags` option), 
including `returnDirect`.
+
+```yaml
+- route:
+    from:
+      uri: platform-http:/chat
+      steps:
+        - to:
+            uri: llm:moderation?moderationModel=omni-moderation-latest
+        - choice:
+            when:
+              - expression:
+                  simple:
+                    expression: "${header.CamelOpenAIModerationFlagged} == 
true"
+                steps:
+                  - setBody:
+                      expression:
+                        constant:
+                          expression: "Your message violates our usage policy."
+            otherwise:
+              steps:
+                - to:
+                    uri: llm:chat-completion?model=gpt-5
+```
+
+#### Batch API
+
+The Batch API runs requests offline at half the price of the synchronous API, 
with a separate rate limit, and returns
+the answers within 24 hours. It is a good fit for work nobody is waiting for: 
overnight enrichment, embedding backfills,
+moderation backlogs or prompt regression runs.
+
+Four operations cover the flow: `batch` uploads the requests and creates the 
batch, `batch-retrieve` reports its status,
+`batch-cancel` cancels it, and `batch-results` streams the answers back. A 
stream of messages becomes a batch with the
+aggregator and `OpenAIBatchAggregationStrategy`. The requests are built from 
the same endpoint options as the
+synchronous operation (`model`, `systemMessage`, `outputClass`, ...):
+
+```java
+// collect tickets into batches of 1000 (or every 10 minutes)
+from("kafka:tickets")
+    .setHeader("CamelOpenAIBatchCustomId", header("kafka.KEY"))
+    .aggregate(constant(true), OpenAIBatchAggregationStrategy.spooled())
+        .completionSize(1000).completionTimeout(600000)
+    
.to("llm:batch?batchEndpoint=/v1/chat/completions&model=gpt-4o-mini&systemMessage=Classify
 the ticket")
+    .to("sql:insert into openai_batch (id, status) values 
(:#CamelOpenAIBatchId, :#CamelOpenAIBatchStatus)");
+
+// when a batch has finished, stream the answers back, one line at a time
+from("direct:collect")
+    .to("llm:batch-results")
+    .split(body()).streaming()
+        .setHeader("ticketId", simple("${body[custom_id]}"))
+        
.setBody(simple("${body[response][body][choices][0][message][content]}"))
+        .to("sql:update ticket set category = :#${body} where id = 
:#${header.ticketId}")
+    .end();
+```
+
+Batches work for chat completions, responses, embeddings and moderations. The 
`spooled()` strategy writes the requests
+to a file instead of holding them in memory, and the results are streamed, so 
the memory used stays the same however
+large the batch is. In a load test against a mock server, the component 
created 1,600 batches of 1,000 requests per second,
+and read 584,000 result lines per second, with less than 40 MB of live heap. 
See
+[Batch API operations](/components/next/others/openai-batch.html) for polling 
patterns that survive a restart.
+
+### AI Tools and MCP
+
+Building on the AI tools from [Camel 
4.22](/blog/2026/08/camel-ai-tools-mcp-422/):
+
+- **Authorization** -- `ai-tool` has an `authorizationPolicy` option. Set it 
on the component and every tool route is guarded by construction.
+  A denial is returned to the model as a short refusal, never as a stack 
trace. See [Authorizing what an AI agent may 
do](/blog/2026/09/securing-ai-agent-tools/).
+- **Structured output** -- `outputSchema` lets a tool return MCP 
`structuredContent`.
+- **AI resources** -- the new `ai-resource` component exposes a route as a 
read-only MCP resource (`resources/list` and `resources/read`).
+- **MCP stdio transport** -- `camel run tools.yaml --mcp-stdio` lets an IDE or 
AI agent launch Camel as an MCP subprocess.
+- **Wildcard tags** (`camel.server.mcp-tags=*` or `crm*`) and server metadata 
such as title, description, website and instructions.
+- Tool routes called from `camel-openai` and `camel-spring-ai-chat` now see 
the calling exchange's properties and variables, as with LangChain4j.
+
+### LangChain4j
+
+- The new [LangChain4j 
Ingest](/components/next/langchain4j-ingest-component.html) component is the 
missing ingestion half of RAG:
+  it splits documents, embeds them in batches and stores them in an embedding 
store, with filters and idempotency.
+  It can also embed images, audio, video and PDF documents whole with a 
multimodal model.
+- LangChain4j models can be declared without Java code, using `provider`, 
`modelName`, `baseUrl`, `apiKey` and friends,
+  for example `camel.component.langchain4j-agent.provider=ollama`.
+- The agent supports moderation, tool-calling limits and an `AiServices` 
builder customizer.
+- Embeddings and embedding store support batch operations.
+
+### GenAI Observability
+
+The new `camel-ai-observability` module records LLM calls following the 
OpenTelemetry GenAI semantic conventions
+(spans with model, operation and token usage) and as Micrometer metrics. It 
covers `langchain4j-chat`, `langchain4j-agent`,
+`langchain4j-embeddings`, `openai`/`llm` and `spring-ai-chat`. See the blog 
posts
+[Observe Your Camel AI Routes with GenAI 
OpenTelemetry](/blog/2026/09/camel-genai-observability-jbang/) and
+[GenAI Observability with Spring 
Boot](/blog/2026/09/camel-genai-observability-spring-boot/).
+
+### Other AI Changes
+
+- `camel-docling` can consume completed asynchronous conversion tasks.
+- The Maven archetypes now generate an `AGENTS.md` file for AI coding 
assistants, pointing to `llms.txt`, the Camel CLI and the Camel MCP server.
+
+## Security
+
+### Authorization and Identity Components
+
+Three new components make authorization a first-class part of a route:
+
+- [SPIFFE](/components/next/spiffe-component.html) -- *who is calling*. Fetch 
and validate SPIFFE identity documents from the Workload API,
+  get rotating mutual TLS for any component that supports 
`sslContextParameters`, and authorize on the peer SPIFFE ID with 
`SpiffeSecurityPolicy`.
+- [OPA](/components/next/opa-component.html) -- *what the rules say*. Evaluate 
Open Policy Agent (Rego) policies against the exchange,
+  either against an OPA server or in-process with a WASM bundle. 
`OpaSecurityPolicy` guards a whole route.
+- [OpenFGA](/components/next/openfga-component.html) -- *what the caller's 
relationship to the resource is*. Relationship-based (Zanzibar-style) 
authorization checks.
+
+```yaml
+- route:
+    from:
+      uri: platform-http:/orders
+      steps:
+        - to:
+            uri: opa:authz/orders/allow
+            parameters:
+              serverUrl: http://localhost:8181
+        - filter:
+            expression:
+              simple:
+                expression: "${header.CamelOpaDecisionAllow} == true"
+            steps:
+              - to:
+                  uri: direct:handleOrder
+```
+
+All of them fail closed by default. See the [Workload identity with SPIFFE and 
SPIRE](/blog/2026/09/camel-spiffe-workload-identity/) blog post,
+which comes with an example where Open Policy Agent decides what each identity 
may do.
+
+### Secure Out of the Box
+
+We continue the effort to make Camel secure by default. Around 145 tickets in 
this release are about security hardening, including:
+
+- **Deserialization filters on by default** in the Netty object codecs, 
JGroups, Spring Redis, Hazelcast and the key-value repositories.
+- **Header filtering** of Camel internal headers in more components (JCR, 
Spring WS, Vert.x HTTP REST, Azure Event Hubs).
+- **File containment** -- remote file consumers (FTP, SFTP, SMB, Azure Files) 
stay inside their directory, and the jail and local work directory checks 
resolve symbolic links.
+- **TLS** -- `SSLContextParameters` now defaults to TLSv1.2 as minimum and 
excludes 3DES, plus fixes so client authentication, protocols and ciphers are 
applied in more components.
+- **XML** -- external entity resolution is disabled by default in Smooks, 
Saxon XQuery, FOP and the XML converter.
+- **Authentication** -- fixes in camel-oauth, Keycloak, Shiro, Netty HTTP and 
Undertow WebSockets, and CORS credentials only for configured origins.
+- **Message input is not trusted as configuration** -- HTTP producers no 
longer resolve property placeholders in a URI from a message header,
+  SQL and XSLT override headers are opt-in, and AWS S3 key and bucket headers 
are used as-is.
+- **Secrets** -- more values are masked when logging properties and endpoint 
URIs.
+- **Security policy** -- the security policy check now matches options per 
component, and more insecure options are marked so the check can report them.
+
+## Camel CLI
+
+### Runtimes
+
+`camel run` now uses the `jbang` runtime by default (the fast in-process run 
you know). The `--runtime=main` option now works
+like `spring-boot` and `quarkus`: it exports a Camel Main project, builds it 
with Maven and runs it in a separate JVM,
+which gives a classpath much closer to production.
+
+Flags such as `--console` and the max-duration options now work on all three 
runtimes.
+
+### Convert Routes Between DSLs
+
+A route file can be converted between YAML, XML and Java DSL without running 
it:
+
+```bash
+camel transform route --format=xml route.yaml
+camel transform route --format=yaml src/main/java/com/acme/OrderRoute.java
+camel transform route --format=java orders.camel.yaml
+```
+
+Java routes are read with the new Java DSL parser, so no compilation is 
needed. When a route cannot be converted without loss
+(such as a lambda processor), the command refuses and tells you why. In the 
TUI, press F12 on a file and choose *Convert to YAML/XML/Java*.
+
+### A Validator That Says What to Write
+
+`camel validate` and the YAML DSL validator now explain *what to write* in 
many more cases (about 35 new hints), for example:
+
+- a `to:` URI with `${...}` says to use `toD:`
+- a `${...}` placeholder in an endpoint option says the syntax is `{{key}}`
+- a SQL query with `:name` says that camel-sql uses `:#name`
+- a YAML indentation error is explained in plain words, and a misplaced key 
says where it goes
+- a `direct:` or `seda:` endpoint that no route consumes is reported
+
+There are new `camel validate source` and `camel validate properties` 
commands, `--camel-version` to validate against another Camel version,
+`--canonical` to report the deprecated compact YAML notation, and `camel 
validate normalize` now handles Kamelets.
+
+Many of these hints were found by having a frontier AI model coach a small 
local model through building Camel integrations.
+Every message the local model could not act on became a hint -- and they help 
humans just the same.
+Read about it in the local-model benchmark blog posts:
+[round 1](/blog/2026/09/camel-local-model-benchmark/),
+[round 2](/blog/2026/09/camel-local-model-benchmark-round-2/) and
+[round 3](/blog/2026/10/camel-local-model-benchmark-round-3/).
+
+### Examples
+
+The bundled examples have been revamped into a ladder of real-world examples, 
from quick start to showcase,
+with most of them sharing one web shop story. 27 of the 39 examples are 
bundled and run offline:
+
+```bash
+camel run --example                 # list the groups and what each example 
teaches
+camel run --example=route           # one group in full
+camel run --example=route/aggregator
+```
+
+### Project Overview
+
+The new `camel overview` command analyzes a project and describes its routes 
and business capabilities.
+With `--ai` it lets an AI model write the descriptions, and with `--save` it 
writes a `camel-summary.md` file where the AI-written
+parts are marked as AI-assisted. The overview is also available in the TUI and 
as an MCP tool.
+
+### MCP Servers
+
+The two Camel MCP servers (`camel mcp` and `camel tui --mcp`) now share one 
set of authoring tools (`camel_catalog_doc`,
+`camel_validate_source`, `camel_write_file`, `camel_edit_file`, `camel_run`, 
...). Other improvements:
+
+- `camel_edit_file` replaces snippets instead of rewriting the whole file, and 
several edits can be applied in one call.
+- Writing a file in dev mode reports whether the reload succeeded, and the 
first output of the running integration.
+- Runtime tool groups (SQL, tracing, resilience, HTTP) are loaded based on 
what the application actually uses.
+- A repeated identical tool call gets a short "already answered" reply, so an 
agent can notice it is looping.
+- Catalog tools serve samples for components, data formats and languages, and 
know about Kamelets.
+- `camel_dependency_for_class` maps a class name to its Maven dependency.
+
+### CLI Connector over WebSocket
+
+The CLI connector is what lets `camel get`, `camel cmd` and the TUI talk to a 
running integration. Until now it worked
+only through files in `~/.camel`, so the tool had to run on the same machine. 
The new WebSocket transport turns this
+around: the integration connects to the tool, so IDEs and other developer 
tools can drive integrations running in a
+container or on a remote development cluster, and receive status, traces and 
debugger updates as they happen.
+
+```bash
+java -Dcamel.cli.transport=websocket \
+     -Dcamel.cli.websocket.url=ws://127.0.0.1:8000/connect \
+     -jar my-app.jar
+```
+
+The integration does not open any port. It reconnects on its own and refuses 
to start under the `prod` profile.
+On Spring Boot, the starter uses the Spring WebSocket client. See the
+[CLI Connector](/components/next/others/cli-connector.html) page.
+
+### Other CLI Improvements
+
+- `camel infra run` shows the progress of pulling the container image.
+- `camel run --observe` adds GenAI observability automatically when AI 
components are used.
+- `camel.main.duration=15s` as a shorter alternative to `durationMaxSeconds`.
+- The YAML generated by `camel init`, the examples and the MCP scaffold tools 
is now in the canonical YAML DSL format.
+
+## Camel TUI
+
+### Source Editor for Java and XML
+
+The TUI source editor now supports Java DSL and XML DSL routes, in addition to 
YAML. All three get:
+
+- **Problems as you type** -- endpoint URIs and options, Simple expressions, 
and `to` vs `toD`. F9 goes to the next problem,
+  Shift+F9 applies a quick fix, and Shift+F8 asks the AI to fix it (also for a 
line that fails at runtime).
+- **Tab completion** -- the Java DSL route chain (including inside arguments 
and the REST DSL), XML elements and attributes,
+  the Simple language, and the arguments of Simple functions such as 
`${date:...}` and `${properties:...}`.
+- **Refactorings** (Ctrl+R) -- replace an endpoint URI, extract a value to a 
property, or extract steps to a new route.
+- **Navigation** -- jump links between routes (also across folders), Ctrl+G to 
go to a node, Ctrl+T for the tree of the current route.
+- **Editing** -- undo/redo, block-aware move, duplicate and delete, and a diff 
of unsaved changes.
+- **Live data** -- each line shows its exchange and failure counts while the 
integration runs.
+
+There are also 16 new themes based on popular editor color schemes (Dracula, 
Nord, Solarized, Gruvbox, Catppuccin, Tokyo Night, and more)
+with their own syntax highlighting.
+
+### AI in the TUI
+
+- **Bring your own agent** -- the AI panel (F8) can use ACP coding agents such 
as Claude Code, Codex, Qwen and OpenCode (Ctrl+P).
+  See the blog post [Bring Your Own Agent to Camel 
TUI](/blog/2026/09/camel-tui-byoa/).
+- **Ollama tab** -- shows local model performance: throughput, context fill, 
cache hits, GPU/CPU and a request log.
+  Prompts and context sizes are tuned for local models.
+- **Checked answers** -- Simple expressions in an AI answer are checked 
against the catalog before they are shown, and the model gets one turn to fix 
them.
+- **Semantic tab** -- inspect semantic evaluations and experts, try them in a 
playground, and browse the audit history.
+
+### Recording Demos
+
+`camel tui --record=demo.tape` now plays the tape itself and writes an 
asciinema `.cast` file. On top of the usual key commands,
+the tape can show captions, highlight areas, switch tabs and themes, and wait 
for text on the screen,
+which makes it easy to keep demos and documentation screenshots up to date.
+
+## Documentation
+
+All the route examples in the Camel documentation have been validated and 
fixed -- in the EIP, component,
+data format and language pages, and in the user manual. This was a big job: in 
the component and data format pages alone,
+about 375 YAML examples did not validate, and many Java and XML examples were 
out of date or plain wrong
+(some still used Camel 1.x and 2.x syntax).
+
+To keep it that way, the build now checks every code snippet in the 
documentation:
+
+- **YAML** examples are validated against the YAML DSL schema, and checked 
with the same authoring checks as `camel validate yaml`
+  (endpoint URIs and options, Simple expressions, headers).
+- **XML** examples are validated against the Camel XML schemas.
+- **Java** examples are read with the new Java DSL parser, which fails on DSL 
methods that do not exist or have wrong arguments,
+  and their imports are checked.
+
+If someone adds an invalid snippet, the build fails. You can now copy an 
example from the documentation and trust that it is correct.
+
+This matters for AI as well. The documentation is what AI models learn Camel 
from, and the validated examples are also
+served by the Camel MCP servers (`camel_catalog_sample`), so an AI coding 
assistant gets a correct example instead of guessing.
+
+The language pages also show their examples in Java, XML and YAML tabs.
+
+## Camel Kafka
+
+### Kafka Share Groups (Queues for Kafka)
+
+The new [Kafka Share](/components/next/kafka-share-component.html) component 
consumes from Kafka share groups
+(KIP-932, Queues for Kafka). A share group reads a topic like a queue:
+
+- Many consumers can read from the same partition, so you can run more 
consumers than partitions, and none of them are idle.
+- Every record is acknowledged on its own, so a slow or failing record does 
not hold up the records after it.
+- The broker delivers a released record again, possibly to another consumer, 
and counts how many times each record was delivered.
+
+Camel acknowledges each record from the outcome of the exchange: `ACCEPT` when 
the exchange completes (or the exception
+was handled), `RELEASE` when it fails, so the broker delivers it again. A 
route can also decide on its own with the
+`CamelKafkaShareAcknowledge` header (`ACCEPT`, `RELEASE` or `REJECT`), for 
example to park a record that keeps failing:
+
+```yaml
+- route:
+    from:
+      uri: kafka-share:support-tickets
+      parameters:
+        brokers: "{{kafka.brokers}}"
+        groupId: ticket-triage
+        consumersCount: 20          # 20 consumers on a topic with 3 partitions
+      steps:
+        - filter:
+            simple: "${header.CamelKafkaShareDeliveryCount} >= 4"
+            steps:
+              - setHeader:
+                  name: CamelKafkaShareAcknowledge
+                  constant: REJECT
+              - to: "kafka:support-tickets-dlq?brokers={{kafka.brokers}}"
+              - stop: {}
+        - to: "langchain4j-chat:triage"
+        - to: "kafka:tickets-triaged?brokers={{kafka.brokers}}"
+```
+
+Share groups require Kafka 4.2 or newer. There is no ordering, no offset 
seeking and no transactions, so keep using the
+`kafka` component when you need those. A `camel-kafka-share-starter` is 
available for Spring Boot.
+
+### Other Kafka Changes
+
+- The shared Kafka client code has moved to a new `camel-kafka-common` module 
(same packages).
+- Fewer per-message allocations in the producer, consumer and transformers.
+- `autoOffsetReset` accepts `by_duration` (Kafka 4.0+).
+- A suspended consumer keeps its partitions, and `sslContextParameters` now 
applies the SSL settings correctly.
+
+## Faster Scripting Languages
+
+We benchmarked the scripting languages with JMH and with 5-minute load tests, 
and fixed what the profiles showed. The
+biggest problem was in Groovy: on every evaluation it looked up the shell 
factory in the registry and rebuilt the
+script binding. In Camel 4.23 a Groovy expression resolves these once, keeps 
its compiled script, and creates the
+binding on demand. A Groovy route is now almost as fast as the same route in 
Java.
+
+| Benchmark (JDK 21, 8 threads unless noted)                    | Before       
    | Camel 4.23            | Speed-up |
+|---------------------------------------------------------------|------------------|-----------------------|---------:|
+| Groovy predicate, 1 thread                                    | 3.6 M ops/s  
    | 25.3 M ops/s          |     7.0× |
+| Groovy expression (string concat), 1 thread                   | 3.0 M ops/s  
    | 14.8 M ops/s          |     4.9× |
+| Groovy route (filter + setBody)                               | 1.37 M msg/s 
    | 5.87 M msg/s          |     4.3× |
+| Groovy 5-minute load test                                     | 1.08 M 
msg/s, p99 102 µs | 3.80 M msg/s, p99 3 µs | 3.5× |
+| Groovy load test with 1,500 different scripts                 | 5,000 msg/s  
    | 2.92 M msg/s          |     580× |
+| `groovyJson` pretty print, 1 MB                               | 55.6 ms      
    | 6.1 ms                |     9.2× |
+| `groovyXml` unmarshal, 1 KB                                   | 33.2 µs      
    | 10.8 µs               |     3.1× |
+| JavaScript (GraalJS) 5-minute load test                       | 4,700 msg/s  
    | 15,000 msg/s          |     3.2× |
+| QuickJS route                                                 | 5,350 msg/s  
    | 10,400 msg/s          |     1.9× |
+| QuickJS 5-minute load test                                    | out of 
memory after 22 s | 8,860 msg/s, stable heap | -- |
+
+For comparison, the same route in Java runs at 6.2 M msg/s and the Java load 
test at 4.18 M msg/s.
+With more than 1,000 different scripts, Groovy used to compile a script again 
on every evaluation, because the script
+cache was full. Now each expression keeps its own compiled script.
+
+Other changes:
+
+- **JavaScript** shares one GraalJS engine and caches the parsed scripts, so 
each message allocates 323 KB instead of 1.77 MB.
+  Objects and arrays returned by a script are now converted to Java maps and 
lists, and remain usable after the script has finished.
+- **QuickJS** scripts can call a controlled `camel` API and see the variables 
and the exception. Scripts are compiled
+  once per engine, and an engine is recycled when its memory or evaluation 
count is used up, which fixes the memory leak in long-running routes.
+- **jOOR** with `preCompile=false` compiles an inline script once, instead of 
on every message.
+- **Python** (Jython) evaluations are now thread safe.
+
+The Groovy binding and the JavaScript result types change in small ways. See 
the upgrade guide.
+
+_Measured with JMH 1.37 on an Apple M1 Pro (10 cores), JDK 21, G1, 1 GB heap 
for the load tests. "Before" is the code as it was in
+Camel 4.22 (QuickJS is new in 4.23, so its "before" is its first version). The 
absolute numbers depend on the machine,
+so compare the speed-ups rather than the throughput. The benchmarks, the raw 
results and a detailed report are in the
+[camel-performance-tests](https://github.com/apache/camel-performance-tests/tree/scripting-languages-perf-4.23/tests/camel-jmh/groovy-results)
+repository._
+
+## DataWeave Conversion
+
+The DataWeave to DataSonnet converter (`camel transform dataweave`) has been 
rewritten to convert real-world MuleSoft DataWeave scripts faithfully.
+A converted script either gives the same result as DataWeave or fails at 
startup -- it no longer converts silently into something that gives a wrong 
result.
+The converter is tested against a corpus of 332 DataWeave snippets, with 
expected outputs produced by the DataWeave CLI.
+
+## Feature Flags with OpenFeature
+
+The new [OpenFeature](/components/next/openfeature-component.html) component 
evaluates feature flags using the
+[OpenFeature specification](https://openfeature.dev/), a vendor-neutral 
standard for feature flagging.
+It supports boolean flags for toggle and detour patterns, and string flags
+for A/B testing, fractional targeting and targeted rollout. Out of the box it 
uses
+[flagd](https://flagd.dev/) for local or remote flag evaluation, but any 
OpenFeature provider
+(LaunchDarkly, Split, Flagsmith, GrowthBook and others) can be plugged in.
+
+Flag definitions use the standard flagd JSON format. The simplest case is a 
boolean toggle:
+
+```json
+{
+  "flags": {
+    "enrichment-enabled": {
+      "state": "ENABLED",
+      "variants": { "on": true, "off": false },
+      "defaultVariant": "on"
+    }
+  }
+}
+```
+
+A route evaluates the flag, stores the result in an exchange property and 
branches on it:
+
+```yaml
+- route:
+    from:
+      uri: direct:start
+      steps:
+        - to:
+            uri: openfeature:flags
+            parameters:
+              flagKey: enrichment-enabled
+              resultProperty: enrichEnabled
+        - choice:
+            when:
+              - expression:
+                  simple:
+                    expression: "${exchangeProperty.enrichEnabled} == true"
+                steps:
+                  - to:
+                      uri: direct:enrich-order
+            otherwise:
+              steps:
+                - to:
+                    uri: direct:skip-enrichment
+```
+
+For boolean predicates in Choice, Filter and Validate, the [OpenFeature 
language](/components/next/languages/openfeature-language.html)
+is a shorter alternative that does not modify the exchange:
+
+```java
+from("direct:start")
+    .filter().language("openfeature", "enrichment-enabled")
+        .to("direct:enrich-order")
+    .end();
+```
+
+String flags with fractional targeting rules support A/B testing and gradual 
rollout.
+In this example, 10% of the traffic is routed to a new routing algorithm while 
90% stays on the legacy one.
+The provider uses the targeting key (an order ID in this case) for consistent 
assignment,
+so the same order always gets the same variant:
+
+```json
+{
+  "flags": {
+    "routing-algorithm": {
+      "state": "ENABLED",
+      "variants": {
+        "legacy": "content-based-router",
+        "new": "dynamic-router"
+      },
+      "defaultVariant": "legacy",
+      "targeting": {
+        "fractional": [
+          ["legacy", 90],
+          ["new", 10]
+        ]
+      }
+    }
+  }
+}
+```
+
+```java
+from("direct:start")
+    .setHeader("CamelOpenFeatureTargetingKey", simple("${header.orderId}"))
+    .setProperty("algorithm").language("openfeature", "routing-algorithm")
+    .toD("direct:route-${exchangeProperty.algorithm}");
+```
+
+## Other Component Fixes
+
+The last days before the release brought another round of consumer and vault 
fixes:
+
+- The object storage consumers (AWS S3, AWS S3 Vectors, Google Storage, Azure 
Storage Blob, IBM COS, Huawei OBS, Alibaba OSS and MinIO)
+  and the Google Mail stream consumer no longer pick up an object or message 
again while its exchange is still in flight (asynchronous routes).
+  With `fileName`, the AWS S3 and IBM COS consumers also pick up the objects 
of a batch that was cut short by a route stop again after a restart.
+- The Slack consumer pages through the history, so it no longer skips messages 
when many are posted between two polls,
+  and the Keycloak events consumer no longer routes the latest events of a 
poll twice.
+- The MyBatis and SQL consumers no longer mark a row as consumed when its 
exchange failed or was marked rollback only.
+- The vault property functions (AWS Secrets Manager, Azure Key Vault, Google 
Secret Manager, IBM Secrets Manager and CyberArk) are now thread safe,
+  and the HashiCorp Vault secret refresh detects updates in any secrets engine.
+
+## Camel Spring Boot
+
+- New starters for the new components, including `camel-opa-starter`, 
`camel-openfga-starter`, `camel-openfeature-starter`,
+  `camel-odata-starter`, `camel-kafka-share-starter` and 
`camel-ai-observability-starter`.
+- Security hardening of the starters: the Jolokia starter binds to localhost, 
the debug starter no longer opens a JMX connector,
+  the Undertow Spring Security starter validates the token issuer and 
audience, vault starters fail closed,
+  and the Jasypt starter uses a modern default algorithm.
+- Starter configuration options that cannot be bound are now reported instead 
of silently ignored.
+
+## New Components
+
+- `camel-ai-resource` -- Expose a route as a read-only AI (MCP) resource.
+- `camel-alibaba-*` -- Alibaba Cloud: EventBridge, Function Compute, KMS, MNS, 
OSS, OTS (Tablestore), SLS and SMS.
+- `camel-hivemq` -- MQTT 5 and 3.1.1 using the maintained HiveMQ MQTT client.
+- `camel-kafka-share` -- Consume from Kafka share groups (KIP-932).
+- `camel-langchain4j-ingest` -- Document ingestion for RAG.
+- `camel-odata` -- OData V4, the successor to the deprecated `camel-olingo4`.
+- `camel-opa` -- Open Policy Agent policy evaluation.
+- `camel-openfeature` -- Feature flags using the OpenFeature specification 
(component and language).
+- `camel-openfga` -- Relationship-based authorization with OpenFGA.
+- `camel-rest-postman` -- Call and expose REST services using a Postman 
Collection as contract.
+- `camel-spiffe` -- SPIFFE workload identity and rotating mTLS.
+- `camel-state-store` -- Key-value operations on a pluggable store.
+- `camel-typesafe-ai` -- TypeSafe AI decision API (component, language and 
semantic expert).
+
+## New Languages
+
+- `python3` -- Python 3 using GraalPy (the existing `python` language is 
Jython based).
+- `quickjs` -- JavaScript using QuickJS4J, a pure Java engine with no native 
code.
+- `semantic` -- Semantic evaluation of message content.
+- `openfeature` -- Feature flag as a predicate.
+
+## New Data Formats
+
+- `toon` -- TOON (Token-Oriented Object Notation), a compact JSON-like format 
that uses fewer tokens when sending data to an LLM.
+- `ubl` -- UBL 2.1 (Universal Business Language) documents, such as used in 
Peppol and EU e-invoicing.
+
+## Other
+
+- `camel-wolf-defender` -- Local prompt-injection detection as a semantic 
expert.
+- `camel-ai-observability` -- GenAI observability with OpenTelemetry and 
Micrometer.
+
+## Deprecated
+
+- `camel-minio` -- The MinIO project has been archived. Use `camel-aws2-s3` 
with an endpoint override instead.
+- Exchange pooling (`camel.main.exchange-factory=pooled`).
+- `MemoryIdempotentRepository` and `MemoryAggregationRepository` -- Use the 
new key-value repository adapters.
+- YAML DSL `kind: Pipe` (aka KameletBinding) -- Use a regular route.
+- `camel-catalog-suggest` -- Did-you-mean suggestions are now built into the 
catalog.
+
+## Removed Components
+
+The following components, deprecated in earlier releases, have been removed:
+
+- `camel-csimple` -- Use `simple`.
+- `camel-joor` language -- Use `java`.
+- `camel-langchain4j-tools` -- Use `camel-ai-tool` with 
`camel-langchain4j-agent`.
+- `camel-zeebe` -- Use `camel-camunda`.
+- `camel-splunk` -- Use `camel-splunk-hec` for sending events.
+- `camel-headersmap` -- The built-in header map is now as fast; just remove 
the dependency.
+- `camel-hazelcast-atomicvalue`, `camel-digitalocean`, `camel-iec60870`, 
`camel-irc`, `camel-ironmq`, `camel-json-patch`, `camel-leveldb`
+  -- the libraries they used are no longer maintained.
+- `camel-reactive-executor-tomcat`, `camel-reactive-executor-vertx`, 
`camel-threadpoolfactory-vertx`.
+- `camel-archetype-spring` and `camel-catalog-lucene`.
+
+## Upgrading
+
+Make sure to read the [upgrade 
guide](/manual/camel-4x-upgrade-guide-4_23.html) if you are upgrading from a 
previous
+Camel version. With more than a thousand tickets resolved, the upgrade guide 
for this release is long.
+Many entries are fixes that make Camel behave as documented, but some changes 
may affect you, such as:
+
+- Message headers keep the case of their names as they were set (as in Camel 
4.20 and older); header lookup is still case-insensitive.
+- `SSLContextParameters` uses TLSv1.2 as the minimum protocol by default.
+- `camel-http` is now the default client for the REST producer and 
`rest-openapi`.
+- `@PropertyInject` fails on an invalid value instead of using the default 
value, and its `separator` is no longer a regular expression.
+- `CAMEL_COMPONENT_*`, `CAMEL_DATAFORMAT_*` and `CAMEL_LANGUAGE_*` environment 
variables now take effect.
+- Endpoint URI normalization is now order-independent.
+- The Jasypt Spring Boot starter has a new default algorithm, which affects 
existing encrypted values.
+- Several MCP tools were renamed or removed in favour of the shared authoring 
tools (see the mapping table in the upgrade guide).
+
+If you are upgrading from, for example, 4.4 to 4.8, then make sure to follow 
the upgrade guides for each release
+in-between, i.e.
+4.4 -> 4.5, 4.5 -> 4.6, and so forth.
+
+The Camel Upgrade Recipes tool can also be used to automate upgrading.
+See more at: https://github.com/apache/camel-upgrade-recipes
+
+## Release Notes
+
+You can find additional information about this release in the list of resolved 
JIRA tickets:
+
+- [Release notes 4.23](/releases/release-4.23.0/)
+
+## Roadmap
+
+The next 4.24 release is planned for December.
+
+In Camel 4.24 we plan to upgrade to Quarkus 4 and drop support for Java 17, 
which makes Java 21 the minimum version.

Reply via email to