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.git


The following commit(s) were added to refs/heads/main by this push:
     new 7b10b3e79107 chore: docs - AI patterns for agents, and canonical YAML 
in the AI component docs (#27439)
7b10b3e79107 is described below

commit 7b10b3e79107d0b4d87a0d7ef9250d32bab9cdab
Author: Claus Ibsen <[email protected]>
AuthorDate: Tue Oct 6 15:17:09 2026 +0200

    chore: docs - AI patterns for agents, and canonical YAML in the AI 
component docs (#27439)
    
    * chore: docs - AI patterns for agents, and canonical YAML in the AI 
component docs
    
    AI patterns page: rows for guard decisions with a System One model,
    tool calling (ai-tool), MCP server and client, tool authorization
    (OPA, OpenFGA), workload identity (SPIFFE), LLM observability and RAG
    ingestion.
    
    AI component docs (camel-ai, camel-spiffe): rewrite the YAML examples
    that use the deprecated compact notation (to: "...", setBody: {simple:},
    when items with simple:, log: "...", top-level from:) into the canonical
    form, keeping comments and URIs as written. Also fix a json-validator URI
    in the LLM integration guide that used a non-existent schema option.
    
    Co-Authored-By: Claude Opus 5.5 (1M context) <[email protected]>
    Signed-off-by: Claus Ibsen <[email protected]>
    
    * chore: docs - address review feedback on the AI docs
    
    - a2a producer: the two when branches of the streaming example in the 
canonical form too
    - AI integration guide: the external prompt example read a file as the 
directory of a file
      consumer, and its document part was never set; the prompt is now a Simple 
template loaded with
      resource:, filled in with the document of each exchange from a folder of 
resumes
    - AI patterns: AI Observability covers the LangChain4j, OpenAI and Spring 
AI chat producers, not
      every LLM call
    
    Co-Authored-By: Claude Opus 5.5 (1M context) <[email protected]>
    Signed-off-by: Claus Ibsen <[email protected]>
    
    * chore: docs - escape ${body} in the LLM integration guide prose, and 
indent the route blocks correctly
    
    The external prompt paragraph wrote `${body}` in normal text, where 
AsciiDoc reads {body} as an attribute
    reference: the doc validation fails on the missing attribute warning. Use a 
passthrough.
    
    The examples that were a top-level from: and became - route: were indented 
two spaces too deep under
    from:; indent them like every other route.
    
    Co-Authored-By: Claude Opus 5.5 (1M context) <[email protected]>
    Signed-off-by: Claus Ibsen <[email protected]>
    
    ---------
    
    Signed-off-by: Claus Ibsen <[email protected]>
    Co-authored-by: Claude Opus 5.5 (1M context) <[email protected]>
---
 .../apache/camel/catalog/docs/a2a-component.adoc   |  31 +++--
 .../apache/camel/catalog/docs/a2a-consumer.adoc    |  68 +++++++---
 .../apache/camel/catalog/docs/a2a-producer.adoc    | 147 +++++++++++++++------
 .../org/apache/camel/catalog/docs/ai-patterns.adoc |  38 ++++++
 .../camel/catalog/docs/ai-tool-component.adoc      |  13 +-
 .../camel/catalog/docs/docling-component.adoc      |  12 +-
 .../apache/camel/catalog/docs/docling-serve.adoc   |   4 +-
 .../camel/catalog/docs/kserve-component.adoc       |  16 ++-
 .../catalog/docs/langchain4j-agent-component.adoc  |  12 +-
 .../camel/catalog/docs/langchain4j-agent-mcp.adoc  |  12 +-
 .../catalog/docs/langchain4j-agent-multimodal.adoc |  20 ++-
 .../docs/langchain4j-embeddings-component.adoc     |  24 +++-
 .../apache/camel/catalog/docs/openai-batch.adoc    |  13 +-
 .../camel/catalog/docs/openai-component.adoc       |  36 +++--
 .../camel/catalog/docs/openai-operations.adoc      |  82 +++++++-----
 .../apache/camel/catalog/docs/openai-webhooks.adoc |  16 ++-
 .../camel/catalog/docs/pgvector-component.adoc     |  20 ++-
 .../camel/catalog/docs/semantic-language.adoc      |  15 ++-
 .../camel/catalog/docs/spiffe-component.adoc       |  23 ++--
 .../catalog/docs/tensorflow-serving-component.adoc |  16 ++-
 .../camel-a2a/src/main/docs/a2a-component.adoc     |  31 +++--
 .../camel-a2a/src/main/docs/a2a-consumer.adoc      |  68 +++++++---
 .../camel-a2a/src/main/docs/a2a-producer.adoc      | 147 +++++++++++++++------
 .../src/main/docs/ai-tool-component.adoc           |  13 +-
 .../src/main/docs/docling-component.adoc           |  12 +-
 .../camel-docling/src/main/docs/docling-serve.adoc |   4 +-
 .../src/main/docs/kserve-component.adoc            |  16 ++-
 .../src/main/docs/langchain4j-agent-component.adoc |  12 +-
 .../src/main/docs/langchain4j-agent-mcp.adoc       |  12 +-
 .../main/docs/langchain4j-agent-multimodal.adoc    |  20 ++-
 .../docs/langchain4j-embeddings-component.adoc     |  24 +++-
 .../camel-openai/src/main/docs/openai-batch.adoc   |  13 +-
 .../src/main/docs/openai-component.adoc            |  36 +++--
 .../src/main/docs/openai-operations.adoc           |  82 +++++++-----
 .../src/main/docs/openai-webhooks.adoc             |  16 ++-
 .../src/main/docs/pgvector-component.adoc          |  20 ++-
 .../src/main/docs/semantic-language.adoc           |  15 ++-
 .../main/docs/tensorflow-serving-component.adoc    |  16 ++-
 .../src/main/docs/ai-llm-integration-guide.adoc    | 100 +++++++++-----
 .../src/main/docs/spiffe-component.adoc            |  23 ++--
 .../main/docs/modules/eips/pages/ai-patterns.adoc  |  38 ++++++
 41 files changed, 968 insertions(+), 368 deletions(-)

diff --git 
a/catalog/camel-catalog/src/generated/resources/org/apache/camel/catalog/docs/a2a-component.adoc
 
b/catalog/camel-catalog/src/generated/resources/org/apache/camel/catalog/docs/a2a-component.adoc
index a3a7846b5544..15a3ce7e855c 100644
--- 
a/catalog/camel-catalog/src/generated/resources/org/apache/camel/catalog/docs/a2a-component.adoc
+++ 
b/catalog/camel-catalog/src/generated/resources/org/apache/camel/catalog/docs/a2a-component.adoc
@@ -184,9 +184,11 @@ Example — including remote agent skills in an LLM prompt:
 ----
 steps:
   - setBody:
-      simple: |
-        Generate a plan using these available skills:
-        ${a2a:card.skills}
+      expression:
+        simple:
+          expression: |
+            Generate a plan using these available skills:
+            ${a2a:card.skills}
 ----
 
 For the full text of all parts combined, use the TypeConverter:
@@ -480,9 +482,13 @@ Both streaming and async agents use the same route pattern 
— `setBody` is alwa
 ----
 steps:
   - script:
-      simple: "${a2a:emit('progress...')}"    # optional status events
+      expression:
+        simple:
+          expression: "${a2a:emit('progress...')}"    # optional status events
   - setBody:
-      constant: "final response"              # consumer handles delivery
+      expression:
+        constant:
+          expression: "final response"              # consumer handles delivery
 ----
 
 The consumer handles delivery regardless of mechanism:
@@ -511,7 +517,9 @@ Bean reference example — useful when the card needs 
programmatic construction
         agentCard: "#myCardBean"
       steps:
         - setBody:
-            constant: "final response"
+            expression:
+              constant:
+                expression: "final response"
 ----
 
 URI parameter overrides — customize base cards per environment via properties:
@@ -526,7 +534,9 @@ URI parameter overrides — customize base cards per 
environment via properties:
         version: "{{agent.version}}"
       steps:
         - setBody:
-            constant: "final response"
+            expression:
+              constant:
+                expression: "final response"
 ----
 
 Security schemes from the card drive auth handler selection. Config parameters 
(`oauthProfile`, `bearerToken`, `apiKey`) provide the runtime credentials and 
influence scheme priority.
@@ -584,7 +594,9 @@ Example — consumer in POJO mode for multimodal processing:
         - log:
             message: "Received ${body.parts().size()} parts"
         - setBody:
-            simple: "Processed ${body.parts()[0]}"
+            expression:
+              simple:
+                expression: "Processed ${body.parts()[0]}"
 ----
 
 Example — producer in RAW mode for proxying:
@@ -595,7 +607,8 @@ Example — producer in RAW mode for proxying:
     from:
       uri: direct:proxy
       steps:
-        - to: a2a:http://remote-agent:8080?dataFormat=RAW
+        - to:
+            uri: a2a:http://remote-agent:8080?dataFormat=RAW
         - log:
             message: "Raw JSON: ${body}"
 ----
diff --git 
a/catalog/camel-catalog/src/generated/resources/org/apache/camel/catalog/docs/a2a-consumer.adoc
 
b/catalog/camel-catalog/src/generated/resources/org/apache/camel/catalog/docs/a2a-consumer.adoc
index e5c8fd8d1649..4463f4c63d8b 100644
--- 
a/catalog/camel-catalog/src/generated/resources/org/apache/camel/catalog/docs/a2a-consumer.adoc
+++ 
b/catalog/camel-catalog/src/generated/resources/org/apache/camel/catalog/docs/a2a-consumer.adoc
@@ -36,7 +36,9 @@ YAML::
         - log:
             message: "Received: ${body}"
         - setBody:
-            constant: "Hello from my agent!"
+            expression:
+              constant:
+                expression: "Hello from my agent!"
 ----
 
 Java::
@@ -145,7 +147,9 @@ By default, the consumer uses the REST binding (HTTP+JSON 
with colon-notation pa
         validateAuth: false
       steps:
         - setBody:
-            constant: "JSON-RPC response"
+            expression:
+              constant:
+                expression: "JSON-RPC response"
 ----
 
 This example is local-only because it disables operation auth. Keep 
`validateAuth=true` and configure a card security scheme for network-exposed 
agents.
@@ -198,7 +202,9 @@ Validate incoming bearer tokens via the `camel-oauth` SPI. 
When an `oauthProfile
         validateAuth: true
       steps:
         - setBody:
-            constant: "Authenticated response"
+            expression:
+              constant:
+                expression: "Authenticated response"
 ----
 
 Configure the OIDC provider in application properties (these properties are 
owned by the `camel-oauth` component — see its documentation for the canonical 
format):
@@ -251,7 +257,9 @@ The `apiKeyHeader` parameter controls which HTTP header 
carries the API key. It
         apiKeyHeader: X-API-Key      # default is Authorization
       steps:
         - setBody:
-            constant: "API key protected response"
+            expression:
+              constant:
+                expression: "API key protected response"
 ----
 
 The agent card must declare an `apiKey` security scheme:
@@ -293,7 +301,9 @@ When the scheme declares `location=header` and `name`, that 
header name takes pr
         validateAuth: true
       steps:
         - setBody:
-            constant: "Bearer token protected response"
+            expression:
+              constant:
+                expression: "Bearer token protected response"
 ----
 
 The agent card must declare an `http` bearer security scheme:
@@ -342,17 +352,29 @@ YAML::
         httpServerComponent: undertow
       steps:
         - script:
-            simple: "${a2a:emit('Connecting to database...')}"
+            expression:
+              simple:
+                expression: "${a2a:emit('Connecting to database...')}"
         - delay:
-            constant: 2000
+            expression:
+              constant:
+                expression: 2000
         - script:
-            simple: "${a2a:emit('Processing 1000 records...')}"
+            expression:
+              simple:
+                expression: "${a2a:emit('Processing 1000 records...')}"
         - delay:
-            constant: 3000
+            expression:
+              constant:
+                expression: 3000
         - script:
-            simple: "${a2a:emit('Analysis complete!')}"
+            expression:
+              simple:
+                expression: "${a2a:emit('Analysis complete!')}"
         - setBody:
-            constant: "Final analysis results: ..."
+            expression:
+              constant:
+                expression: "Final analysis results: ..."
 ----
 
 Java::
@@ -380,7 +402,9 @@ You can also emit with an explicit state:
 ----
 steps:
   - script:
-      simple: "${a2a:emit(INPUT_REQUIRED, 'Please provide your address')}"
+      expression:
+        simple:
+          expression: "${a2a:emit(INPUT_REQUIRED, 'Please provide your 
address')}"
 ----
 
 NOTE: Use `script` EIP (not `setBody`) for `${a2a:emit()}` calls — `script` 
evaluates the expression for its side effect without changing the message body. 
Use `setBody` only for the final response.
@@ -428,7 +452,9 @@ Use stable `id` values on long-lived sub-tasks so route 
tracing and route-struct
                   ref: answerDraftingService
                   method: draft
         - setBody:
-            simple: "Final answer: ${body}"
+            expression:
+              simple:
+                expression: "Final answer: ${body}"
 ----
 
 The route examples in this section are local-only because they disable 
operation auth. Keep `validateAuth=true` and configure a card security scheme 
for network-exposed agents.
@@ -500,9 +526,13 @@ For long-running operations, enable `returnImmediately` to 
return a `SUBMITTED`
         asyncTimeout: 30000          # default is 300000 (5 minutes)
       steps:
         - delay:
-            constant: 10000
+            expression:
+              constant:
+                expression: 10000
         - setBody:
-            constant: "Long computation result"
+            expression:
+              constant:
+                expression: "Long computation result"
 ----
 
 The `asyncTimeout` parameter (default: 300,000 ms / 5 minutes) controls how 
long the background processing can run before the task is marked `FAILED`.
@@ -559,7 +589,9 @@ Control concurrent task processing and queue overflow:
         taskQueueSize: 50
       steps:
         - setBody:
-            constant: "Processing..."
+            expression:
+              constant:
+                expression: "Processing..."
 ----
 
 [cols="1,1,3"]
@@ -598,7 +630,9 @@ The consumer enforces `maxPayloadSize` (default 6,291,456 
bytes / 6 MiB) on inco
         maxPayloadSize: 10485760
       steps:
         - setBody:
-            constant: "final response"
+            expression:
+              constant:
+                expression: "final response"
 ----
 
 === CORS Support
diff --git 
a/catalog/camel-catalog/src/generated/resources/org/apache/camel/catalog/docs/a2a-producer.adoc
 
b/catalog/camel-catalog/src/generated/resources/org/apache/camel/catalog/docs/a2a-producer.adoc
index 273a9c588df2..ca73b0cb73c8 100644
--- 
a/catalog/camel-catalog/src/generated/resources/org/apache/camel/catalog/docs/a2a-producer.adoc
+++ 
b/catalog/camel-catalog/src/generated/resources/org/apache/camel/catalog/docs/a2a-producer.adoc
@@ -20,7 +20,9 @@ YAML::
       uri: direct:call-agent
       steps:
         - setBody:
-            constant: "What is the weather?"
+            expression:
+              constant:
+                expression: "What is the weather?"
         - to:
             uri: a2a:http://remote-agent:8080
         - log:
@@ -111,19 +113,28 @@ YAML::
 steps:
   - setHeader:
       name: CamelA2AOperation
-      constant: MESSAGE_STREAM
-  - to: a2a:https://agent.example.com
+      expression:
+        constant:
+          expression: MESSAGE_STREAM
+  - to:
+      uri: a2a:https://agent.example.com
   - split:
-      simple: "${body}"
+      expression:
+        simple:
+          expression: "${body}"
       streaming: true
       steps:
         - choice:
             when:
-              - simple: "${body.statusUpdate} != null"
+              - expression:
+                  simple:
+                    expression: "${body.statusUpdate} != null"
                 steps:
                   - log:
                       message: "Progress: ${body.statusUpdate.status.state}"
-              - simple: "${body.message} != null"
+              - expression:
+                  simple:
+                    expression: "${body.message} != null"
                 steps:
                   - log:
                       message: "Final message received"
@@ -149,7 +160,8 @@ To buffer all events into a `List<StreamResponse>`:
 [source,yaml]
 ----
 steps:
-  - to: a2a:https://agent.example.com
+  - to:
+      uri: a2a:https://agent.example.com
   - convertBodyTo:
       type: java.util.List
 ----
@@ -171,7 +183,9 @@ steps:
         operation: MESSAGE_STREAM
   - setHeader:
       name: Content-Type
-      constant: text/event-stream
+      expression:
+        constant:
+          expression: text/event-stream
 ----
 
 Java::
@@ -193,13 +207,20 @@ Subscribe to ongoing task updates from a remote agent:
 steps:
   - setHeader:
       name: CamelA2AOperation
-      constant: TASK_SUBSCRIBE
+      expression:
+        constant:
+          expression: TASK_SUBSCRIBE
   - setHeader:
       name: CamelA2ATaskId
-      simple: "${exchangeProperty.taskId}"
-  - to: a2a:https://agent.example.com
+      expression:
+        simple:
+          expression: "${exchangeProperty.taskId}"
+  - to:
+      uri: a2a:https://agent.example.com
   - split:
-      simple: "${body}"
+      expression:
+        simple:
+          expression: "${body}"
       streaming: true
       steps:
         - log:
@@ -214,24 +235,32 @@ Streaming requests use `asyncTimeout` (default 5 minutes) 
instead of the standar
 ----
 # Step 1: Submit the task
 - setBody:
-    constant: "Start long operation"
+    expression:
+      constant:
+        expression: "Start long operation"
 - to:
     uri: a2a:http://remote-agent:8083
     parameters:
       oauthProfile: assistant
 - setVariable:
     name: taskId
-    simple: "${header.CamelA2ATaskId}"
+    expression:
+      simple:
+        expression: "${header.CamelA2ATaskId}"
 
 # Step 2: Poll for completion
 - removeHeaders:
     pattern: "*"
 - setHeader:
     name: CamelA2AOperation
-    constant: TASK_GET
+    expression:
+      constant:
+        expression: TASK_GET
 - setHeader:
     name: CamelA2ATaskId
-    simple: "${variable.taskId}"
+    expression:
+      simple:
+        expression: "${variable.taskId}"
 - to:
     uri: a2a:http://remote-agent:8083
     parameters:
@@ -244,24 +273,36 @@ Streaming requests use `asyncTimeout` (default 5 minutes) 
instead of the standar
 ----
 # Step 1: Submit task
 - setBody:
-    constant: "Track my package"
-- to: a2a:http://remote-agent:8085
+    expression:
+      constant:
+        expression: "Track my package"
+- to:
+    uri: a2a:http://remote-agent:8085
 - setVariable:
     name: taskId
-    simple: "${header.CamelA2ATaskId}"
+    expression:
+      simple:
+        expression: "${header.CamelA2ATaskId}"
 
 # Step 2: Register push notification webhook
 - removeHeaders:
     pattern: "*"
 - setHeader:
     name: CamelA2AOperation
-    constant: PUSH_CONFIG_CREATE
+    expression:
+      constant:
+        expression: PUSH_CONFIG_CREATE
 - setHeader:
     name: CamelA2ATaskId
-    simple: "${variable.taskId}"
+    expression:
+      simple:
+        expression: "${variable.taskId}"
 - setBody:
-    simple: "${ref:pushConfig}"
-- to: a2a:http://remote-agent:8085
+    expression:
+      simple:
+        expression: "${ref:pushConfig}"
+- to:
+    uri: a2a:http://remote-agent:8085
 ----
 
 Configure the webhook URL as a bean:
@@ -279,35 +320,54 @@ The full push notification config CRUD is also available. 
`PUSH_CONFIG_GET` and
 # List push configs for a task
 - setHeader:
     name: CamelA2AOperation
-    constant: PUSH_CONFIG_LIST
+    expression:
+      constant:
+        expression: PUSH_CONFIG_LIST
 - setHeader:
     name: CamelA2ATaskId
-    simple: "${variable.taskId}"
-- to: a2a:https://agent.example.com
+    expression:
+      simple:
+        expression: "${variable.taskId}"
+- to:
+    uri: a2a:https://agent.example.com
 
 # Get a specific push config
 - setHeader:
     name: CamelA2AOperation
-    constant: PUSH_CONFIG_GET
+    expression:
+      constant:
+        expression: PUSH_CONFIG_GET
 - setHeader:
     name: CamelA2ATaskId
-    simple: "${variable.taskId}"
+    expression:
+      simple:
+        expression: "${variable.taskId}"
 - setHeader:
     name: CamelA2APushConfigId
-    simple: "${variable.configId}"
-- to: "a2a:https://agent.example.com?protocolBinding=JSONRPC";
+    expression:
+      simple:
+        expression: "${variable.configId}"
+- to:
+    uri: "a2a:https://agent.example.com?protocolBinding=JSONRPC";
 
 # Delete a push config
 - setHeader:
     name: CamelA2AOperation
-    constant: PUSH_CONFIG_DELETE
+    expression:
+      constant:
+        expression: PUSH_CONFIG_DELETE
 - setHeader:
     name: CamelA2ATaskId
-    simple: "${variable.taskId}"
+    expression:
+      simple:
+        expression: "${variable.taskId}"
 - setHeader:
     name: CamelA2APushConfigId
-    simple: "${variable.configId}"
-- to: "a2a:https://agent.example.com?protocolBinding=JSONRPC";
+    expression:
+      simple:
+        expression: "${variable.configId}"
+- to:
+    uri: "a2a:https://agent.example.com?protocolBinding=JSONRPC";
 ----
 
 === Parallel Multicast
@@ -324,9 +384,12 @@ Call multiple agents concurrently using Camel's 
`multicast` EIP:
             parallelProcessing: true
             aggregationStrategy: "#class:MyAggregator"
             steps:
-              - to: direct:call-weather
-              - to: direct:call-news
-              - to: direct:call-fortune
+              - to:
+                  uri: direct:call-weather
+              - to:
+                  uri: direct:call-news
+              - to:
+                  uri: direct:call-fortune
 
 - route:
     id: call-weather
@@ -336,7 +399,9 @@ Call multiple agents concurrently using Camel's `multicast` 
EIP:
         - removeHeaders:
             pattern: "*"
         - setBody:
-            constant: "What is the weather?"
+            expression:
+              constant:
+                expression: "What is the weather?"
         - to:
             uri: a2a:http://weather-agent:8080
             parameters:
@@ -355,7 +420,8 @@ Override the remote agent's URL from the card using 
`host`/`port`/`basePath` con
 [source,yaml]
 ----
 steps:
-  - to: a2a:https://agent.example.com?host=http://localhost&port=8080
+  - to:
+      uri: a2a:https://agent.example.com?host=http://localhost&port=8080
 ----
 
 Priority without producer credentials: `host` config > card's 
`supportedInterfaces` URL > `agentCardSource` URL. When producer credentials 
are configured (`apiKey`, `bearerToken`, or `oauthProfile`) and `host` is not 
set, the producer sends credentialed requests only to the HTTP(S) 
`agentCardSource` origin. This avoids sending credentials to a URL supplied by 
the remote card's `supportedInterfaces` field. The `port` and `basePath` 
producer overrides are applied when `host` is configured. [...]
@@ -369,7 +435,8 @@ By default, the producer does not follow HTTP redirects to 
prevent credential le
 [source,yaml]
 ----
 steps:
-  - to: a2a:https://agent.example.com?followRedirects=true
+  - to:
+      uri: a2a:https://agent.example.com?followRedirects=true
 ----
 
 NOTE: `followRedirects` applies to operation requests only. Agent card 
discovery never follows redirects — a card URL that returns a redirect fails 
with an error.
diff --git 
a/catalog/camel-catalog/src/generated/resources/org/apache/camel/catalog/docs/ai-patterns.adoc
 
b/catalog/camel-catalog/src/generated/resources/org/apache/camel/catalog/docs/ai-patterns.adoc
index d77c72900306..b636dffa008f 100644
--- 
a/catalog/camel-catalog/src/generated/resources/org/apache/camel/catalog/docs/ai-patterns.adoc
+++ 
b/catalog/camel-catalog/src/generated/resources/org/apache/camel/catalog/docs/ai-patterns.adoc
@@ -212,6 +212,44 @@ See also the full 
xref:enterprise-integration-patterns.adoc[Enterprise Integrati
 |xref:languages:semantic-language.adoc[Semantic], xref:switch-eip.adoc[Switch]
 |Evaluate a Semantic choice question once and dispatch its category string 
through literal Switch cases.
 
+|Guardrail / Guard decision
+|xref:languages:semantic-language.adoc[Semantic], 
xref:ROOT:typesafe-ai-component.adoc[TypeSafe AI],
+xref:filter-eip.adoc[Filter], xref:validate-eip.adoc[Validate]
+|Ask a yes/no question about the message (is this request actionable, does 
this action fit the task) and filter or
+validate on the answer. A System One model such as Jev answers with a fast, 
structured decision instead of
+generated text.
+
+|Tool / Function calling
+|xref:ROOT:ai-tool-component.adoc[AI Tool]
+|Expose a route as a tool an AI agent can call. The same route works with the 
LangChain4j, Spring AI and OpenAI
+agents.
+
+|MCP server
+|xref:others:mcp-server.adoc[MCP Server], 
xref:ROOT:ai-resource-component.adoc[AI Resource]
+|Expose `ai-tool` routes as MCP tools and `ai-resource` routes as MCP 
resources to any MCP client.
+
+|MCP client
+|xref:others:langchain4j-agent-mcp.adoc[LangChain4j Agent MCP], 
xref:others:openai-mcp.adoc[OpenAI MCP]
+|Let an agent in a route call the tools of remote MCP servers.
+
+|Tool authorization / Agent permissions
+|xref:ROOT:ai-tool-component.adoc#_authorizing_tool_calls[AI Tool 
authorization],
+xref:ROOT:opa-component.adoc[OPA], xref:ROOT:openfga-component.adoc[OpenFGA]
+|Authorize every tool call before it runs, on the caller identity and the tool 
name, never on model output.
+
+|Agent identity / Workload identity
+|xref:ROOT:spiffe-component.adoc[SPIFFE]
+|Give each workload a cryptographic identity and mutual TLS, so a tool call 
can be authorized on who is calling.
+
+|LLM observability
+|xref:others:ai-observability.adoc[AI Observability]
+|Record an OpenTelemetry span and Micrometer metrics (model, tokens, duration) 
for each call of the LangChain4j, OpenAI
+and Spring AI chat producers, inside the route's trace.
+
+|RAG ingestion
+|xref:ROOT:langchain4j-ingest-component.adoc[LangChain4j Ingest]
+|Split, embed and store documents in an embedding store for 
retrieval-augmented generation.
+
 |Agent-to-Agent / A2A
 |xref:ROOT:a2a-component.adoc[A2A]
 |Google's Agent-to-Agent protocol for communication between AI agents.
diff --git 
a/catalog/camel-catalog/src/generated/resources/org/apache/camel/catalog/docs/ai-tool-component.adoc
 
b/catalog/camel-catalog/src/generated/resources/org/apache/camel/catalog/docs/ai-tool-component.adoc
index ab10c665857f..9912e90bdf31 100644
--- 
a/catalog/camel-catalog/src/generated/resources/org/apache/camel/catalog/docs/ai-tool-component.adoc
+++ 
b/catalog/camel-catalog/src/generated/resources/org/apache/camel/catalog/docs/ai-tool-component.adoc
@@ -187,7 +187,8 @@ YAML::
             "additionalProperties": false
           }
       steps:
-        - to: direct:createOrder
+        - to:
+            uri: direct:createOrder
 ----
 ====
 
@@ -228,7 +229,9 @@ YAML::
         outputParameter.unit: string
       steps:
         - setBody:
-            constant: '{"temperature":21.5,"unit":"celsius"}'
+            expression:
+              constant:
+                expression: '{"temperature":21.5,"unit":"celsius"}'
 ----
 ====
 
@@ -277,7 +280,8 @@ YAML::
         idempotentHint: false
         openWorldHint: true
       steps:
-        - to: direct:deleteOrder
+        - to:
+            uri: direct:deleteOrder
 ----
 ====
 
@@ -414,7 +418,8 @@ YAML::
         description: "Transfer funds"
         authorizationPolicy: "#myAuthorizationPolicy"
       steps:
-        - to: bean:ledger
+        - to:
+            uri: bean:ledger
 ----
 ====
 
diff --git 
a/catalog/camel-catalog/src/generated/resources/org/apache/camel/catalog/docs/docling-component.adoc
 
b/catalog/camel-catalog/src/generated/resources/org/apache/camel/catalog/docs/docling-component.adoc
index e23a16a20eb1..66cdaf2814d1 100644
--- 
a/catalog/camel-catalog/src/generated/resources/org/apache/camel/catalog/docs/docling-component.adoc
+++ 
b/catalog/camel-catalog/src/generated/resources/org/apache/camel/catalog/docs/docling-component.adoc
@@ -393,13 +393,19 @@ YAML::
       steps:
         - setHeader:
             name: "CamelDoclingOperation"
-            constant: "CONVERT_TO_HTML"
+            expression:
+              constant:
+                expression: "CONVERT_TO_HTML"
         - setHeader:
             name: "CamelDoclingEnableOCR"
-            constant: true
+            expression:
+              constant:
+                expression: true
         - setHeader:
             name: "CamelDoclingOCRLanguage"
-            constant: "es"
+            expression:
+              constant:
+                expression: "es"
         - to:
             uri: docling:CONVERT_TO_MARKDOWN  # Operation will be overridden 
by header
         - to:
diff --git 
a/catalog/camel-catalog/src/generated/resources/org/apache/camel/catalog/docs/docling-serve.adoc
 
b/catalog/camel-catalog/src/generated/resources/org/apache/camel/catalog/docs/docling-serve.adoc
index 847a958a63e0..ae2e15c94c94 100644
--- 
a/catalog/camel-catalog/src/generated/resources/org/apache/camel/catalog/docs/docling-serve.adoc
+++ 
b/catalog/camel-catalog/src/generated/resources/org/apache/camel/catalog/docs/docling-serve.adoc
@@ -67,7 +67,9 @@ YAML::
         repeatCount: 1
       steps:
         - setBody:
-            constant: "https://arxiv.org/pdf/2501.17887";
+            expression:
+              constant:
+                expression: "https://arxiv.org/pdf/2501.17887";
         - to:
             uri: docling:CONVERT_TO_MARKDOWN
             parameters:
diff --git 
a/catalog/camel-catalog/src/generated/resources/org/apache/camel/catalog/docs/kserve-component.adoc
 
b/catalog/camel-catalog/src/generated/resources/org/apache/camel/catalog/docs/kserve-component.adoc
index dc671d9445d1..eb4e7efa3173 100644
--- 
a/catalog/camel-catalog/src/generated/resources/org/apache/camel/catalog/docs/kserve-component.adoc
+++ 
b/catalog/camel-catalog/src/generated/resources/org/apache/camel/catalog/docs/kserve-component.adoc
@@ -248,10 +248,14 @@ YAML::
       steps:
         - setHeader:
             name: CamelKServeModelName
-            constant: simple
+            expression:
+              constant:
+                expression: simple
         - setHeader:
             name: CamelKServeModelVersion
-            constant: "1"
+            expression:
+              constant:
+                expression: "1"
         - to:
             uri: kserve:model/ready
         - log:
@@ -345,10 +349,14 @@ YAML::
       steps:
         - setHeader:
             name: CamelKServeModelName
-            constant: simple
+            expression:
+              constant:
+                expression: simple
         - setHeader:
             name: CamelKServeModelVersion
-            constant: "1"
+            expression:
+              constant:
+                expression: "1"
         - to:
             uri: kserve:model/metadata
         - log:
diff --git 
a/catalog/camel-catalog/src/generated/resources/org/apache/camel/catalog/docs/langchain4j-agent-component.adoc
 
b/catalog/camel-catalog/src/generated/resources/org/apache/camel/catalog/docs/langchain4j-agent-component.adoc
index abacb230bd3a..fe956b89dfba 100644
--- 
a/catalog/camel-catalog/src/generated/resources/org/apache/camel/catalog/docs/langchain4j-agent-component.adoc
+++ 
b/catalog/camel-catalog/src/generated/resources/org/apache/camel/catalog/docs/langchain4j-agent-component.adoc
@@ -715,7 +715,9 @@ YAML::
         parameter.userId: string
       steps:
         - setBody:
-            constant: '{"name": "John Doe", "id": "123"}'
+            expression:
+              constant:
+                expression: '{"name": "John Doe", "id": "123"}'
 
 - route:
     from:
@@ -726,7 +728,9 @@ YAML::
         parameter.city: string
       steps:
         - setBody:
-            constant: '{"weather": "sunny", "temperature": "22°C"}'
+            expression:
+              constant:
+                expression: '{"weather": "sunny", "temperature": "22°C"}'
 
 # Agent with tools
 - route:
@@ -1192,7 +1196,9 @@ YAML::
       uri: direct:extract-person-info
       steps:
         - setBody:
-            constant: "Extract information about John Smith, a 35-year-old 
software engineer"
+            expression:
+              constant:
+                expression: "Extract information about John Smith, a 
35-year-old software engineer"
         - to:
             uri: langchain4j-agent:structured
             parameters:
diff --git 
a/catalog/camel-catalog/src/generated/resources/org/apache/camel/catalog/docs/langchain4j-agent-mcp.adoc
 
b/catalog/camel-catalog/src/generated/resources/org/apache/camel/catalog/docs/langchain4j-agent-mcp.adoc
index 8411ec98fa4e..4027f1d927b0 100644
--- 
a/catalog/camel-catalog/src/generated/resources/org/apache/camel/catalog/docs/langchain4j-agent-mcp.adoc
+++ 
b/catalog/camel-catalog/src/generated/resources/org/apache/camel/catalog/docs/langchain4j-agent-mcp.adoc
@@ -326,14 +326,20 @@ YAML::
       steps:
         - choice:
             when:
-              - simple: "${header.userRole} == 'readonly'"
+              - expression:
+                  simple:
+                    expression: "${header.userRole} == 'readonly'"
                 steps:
                   - setHeader:
                       name: CamelLangChain4jAgentExcludeTags
-                      constant: admin-tools
+                      expression:
+                        constant:
+                          expression: admin-tools
                   - setHeader:
                       name: CamelLangChain4jAgentExcludeMcpServers
-                      constant: filesystem
+                      expression:
+                        constant:
+                          expression: filesystem
         - to:
             uri: langchain4j-agent:assistant
             parameters:
diff --git 
a/catalog/camel-catalog/src/generated/resources/org/apache/camel/catalog/docs/langchain4j-agent-multimodal.adoc
 
b/catalog/camel-catalog/src/generated/resources/org/apache/camel/catalog/docs/langchain4j-agent-multimodal.adoc
index 51a7287a3614..efe1792b0744 100644
--- 
a/catalog/camel-catalog/src/generated/resources/org/apache/camel/catalog/docs/langchain4j-agent-multimodal.adoc
+++ 
b/catalog/camel-catalog/src/generated/resources/org/apache/camel/catalog/docs/langchain4j-agent-multimodal.adoc
@@ -95,7 +95,9 @@ YAML::
       steps:
         - setHeader:
             name: CamelLangChain4jAgentUserMessage
-            constant: Describe this image
+            expression:
+              constant:
+                expression: Describe this image
         - to:
             uri: langchain4j-agent:vision
             parameters:
@@ -146,7 +148,9 @@ YAML::
       steps:
         - setHeader:
             name: CamelLangChain4jAgentUserMessage
-            constant: "What do you see in this image?"
+            expression:
+              constant:
+                expression: "What do you see in this image?"
         - to:
             uri: langchain4j-agent:vision
             parameters:
@@ -206,10 +210,14 @@ YAML::
       steps:
         - setHeader:
             name: CamelLangChain4jAgentUserMessage
-            constant: Analyze this document
+            expression:
+              constant:
+                expression: Analyze this document
         - setHeader:
             name: CamelLangChain4jAgentMediaType
-            constant: application/pdf
+            expression:
+              constant:
+                expression: application/pdf
         - to:
             uri: langchain4j-agent:analyzer
             parameters:
@@ -282,7 +290,9 @@ YAML::
       steps:
         - setHeader:
             name: CamelLangChain4jAgentUserMessage
-            constant: "Describe what you see in this image. Be detailed but 
concise."
+            expression:
+              constant:
+                expression: "Describe what you see in this image. Be detailed 
but concise."
         - to:
             uri: langchain4j-agent:vision
             parameters:
diff --git 
a/catalog/camel-catalog/src/generated/resources/org/apache/camel/catalog/docs/langchain4j-embeddings-component.adoc
 
b/catalog/camel-catalog/src/generated/resources/org/apache/camel/catalog/docs/langchain4j-embeddings-component.adoc
index 655ebad558b6..4fd7aa0d8cf2 100644
--- 
a/catalog/camel-catalog/src/generated/resources/org/apache/camel/catalog/docs/langchain4j-embeddings-component.adoc
+++ 
b/catalog/camel-catalog/src/generated/resources/org/apache/camel/catalog/docs/langchain4j-embeddings-component.adoc
@@ -259,10 +259,14 @@ YAML::
             uri: langchain4j-embeddings:embed
         - setHeader:
             name: CamelQdrantAction
-            constant: UPSERT
+            expression:
+              constant:
+                expression: UPSERT
         - setHeader:
             name: CamelQdrantPointId
-            constant: 1
+            expression:
+              constant:
+                expression: 1
         - transformDataType:
             toType: "qdrant:embeddings"
         - to:
@@ -303,10 +307,14 @@ YAML::
             toType: "qdrant:embeddings"
         - setHeader:
             name: CamelQdrantAction
-            constant: SIMILARITY_SEARCH
+            expression:
+              constant:
+                expression: SIMILARITY_SEARCH
         - setHeader:
             name: CamelQdrantWithPayload
-            constant: true
+            expression:
+              constant:
+                expression: true
         - to:
             uri: qdrant:myCollection
         - transformDataType:
@@ -343,7 +351,9 @@ YAML::
             uri: langchain4j-embeddings:embed
         - setHeader:
             name: CamelPgVectorAction
-            constant: UPSERT
+            expression:
+              constant:
+                expression: UPSERT
         - transformDataType:
             toType: "pgvector:embeddings"
         - to:
@@ -381,7 +391,9 @@ YAML::
             toType: "pgvector:embeddings"
         - setHeader:
             name: CamelPgVectorAction
-            constant: SIMILARITY_SEARCH
+            expression:
+              constant:
+                expression: SIMILARITY_SEARCH
         - to:
             uri: pgvector:myCollection
         - transformDataType:
diff --git 
a/catalog/camel-catalog/src/generated/resources/org/apache/camel/catalog/docs/openai-batch.adoc
 
b/catalog/camel-catalog/src/generated/resources/org/apache/camel/catalog/docs/openai-batch.adoc
index f168d7830ac7..f752b78eade2 100644
--- 
a/catalog/camel-catalog/src/generated/resources/org/apache/camel/catalog/docs/openai-batch.adoc
+++ 
b/catalog/camel-catalog/src/generated/resources/org/apache/camel/catalog/docs/openai-batch.adoc
@@ -62,11 +62,14 @@ YAML::
 +
 [source,yaml]
 ----
-- from:
-    uri: direct:classify
-    steps:
-      - to: 
"openai:batch?batchEndpoint=/v1/chat/completions&model=gpt-4o-mini&systemMessage=Classify
 the ticket"
-      - log: "Batch ${header.CamelOpenAIBatchId} is 
${header.CamelOpenAIBatchStatus}"
+- route:
+    from:
+      uri: direct:classify
+      steps:
+        - to:
+            uri: 
"openai:batch?batchEndpoint=/v1/chat/completions&model=gpt-4o-mini&systemMessage=Classify
 the ticket"
+        - log:
+            message: "Batch ${header.CamelOpenAIBatchId} is 
${header.CamelOpenAIBatchStatus}"
 ----
 ====
 
diff --git 
a/catalog/camel-catalog/src/generated/resources/org/apache/camel/catalog/docs/openai-component.adoc
 
b/catalog/camel-catalog/src/generated/resources/org/apache/camel/catalog/docs/openai-component.adoc
index 513e9b2e9575..002f1aebb2dd 100644
--- 
a/catalog/camel-catalog/src/generated/resources/org/apache/camel/catalog/docs/openai-component.adoc
+++ 
b/catalog/camel-catalog/src/generated/resources/org/apache/camel/catalog/docs/openai-component.adoc
@@ -257,7 +257,9 @@ YAML::
       steps:
         - setHeader:
             name: CamelOpenAIUserMessage
-            simple: "Rate 1-10 for ${header.role}: ${body}"
+            expression:
+              simple:
+                expression: "Rate 1-10 for ${header.role}: ${body}"
         - to:
             uri: openai:chat-completion
             parameters:
@@ -462,10 +464,14 @@ YAML::
       steps:
         - setHeader:
             name: CamelOpenAIMediaType
-            constant: "image/png"
+            expression:
+              constant:
+                expression: "image/png"
         - setHeader:
             name: CamelOpenAIUserMessage
-            constant: "Describe what you see in this image"
+            expression:
+              constant:
+                expression: "Describe what you see in this image"
         - to:
             uri: openai:chat-completion
             parameters:
@@ -610,10 +616,14 @@ YAML::
       uri: direct:json-schema
       steps:
         - setBody:
-            constant: "Create a product description"
+            expression:
+              constant:
+                expression: "Create a product description"
         - setHeader:
             name: CamelOpenAIJsonSchema
-            constant: 
'{"type":"object","properties":{"name":{"type":"string"},"price":{"type":"number"}}}'
+            expression:
+              constant:
+                expression: 
'{"type":"object","properties":{"name":{"type":"string"},"price":{"type":"number"}}}'
         - to:
             uri: openai:chat-completion
         - log:
@@ -658,7 +668,9 @@ YAML::
       uri: direct:json-schema-resource
       steps:
         - setBody:
-            constant: "Create a product description"
+            expression:
+              constant:
+                expression: "Create a product description"
         - to:
             uri: openai:chat-completion
             parameters:
@@ -720,7 +732,9 @@ YAML::
       uri: direct:conversation
       steps:
         - setBody:
-            constant: "My name is Alice"
+            expression:
+              constant:
+                expression: "My name is Alice"
         - to:
             uri: openai:chat-completion
             parameters:
@@ -728,7 +742,9 @@ YAML::
         - log:
             message: "First response: ${body}"
         - setBody:
-            constant: "What is my name?"
+            expression:
+              constant:
+                expression: "What is my name?"
         - to:
             uri: openai:chat-completion
             parameters:
@@ -1220,7 +1236,9 @@ YAML::
       steps:
         - setHeader:
             name: CamelOpenAIUserMessage
-            simple: "Summarize this ${header.documentType} in 3 bullet points: 
${body}"
+            expression:
+              simple:
+                expression: "Summarize this ${header.documentType} in 3 bullet 
points: ${body}"
         - to:
             uri: openai:chat-completion
         - log:
diff --git 
a/catalog/camel-catalog/src/generated/resources/org/apache/camel/catalog/docs/openai-operations.adoc
 
b/catalog/camel-catalog/src/generated/resources/org/apache/camel/catalog/docs/openai-operations.adoc
index 200689f4ea0a..9ef3d1c690e8 100644
--- 
a/catalog/camel-catalog/src/generated/resources/org/apache/camel/catalog/docs/openai-operations.adoc
+++ 
b/catalog/camel-catalog/src/generated/resources/org/apache/camel/catalog/docs/openai-operations.adoc
@@ -81,7 +81,9 @@ Using the xref:ROOT:pgvector-component.adoc[PGVector] 
component:
               embeddingModel: nomic-embed-text
         - setHeader:
             name: CamelPgVectorAction
-            constant: UPSERT
+            expression:
+              constant:
+                expression: UPSERT
         - setHeader:
             name: CamelPgVectorTextContent
             expression:
@@ -101,10 +103,14 @@ Using the xref:ROOT:pgvector-component.adoc[PGVector] 
component:
               embeddingModel: nomic-embed-text
         - setHeader:
             name: CamelPgVectorAction
-            constant: SIMILARITY_SEARCH
+            expression:
+              constant:
+                expression: SIMILARITY_SEARCH
         - setHeader:
             name: CamelPgVectorQueryTopK
-            constant: 5
+            expression:
+              constant:
+                expression: 5
         - to:
             uri: pgvector:documents
 ----
@@ -206,19 +212,26 @@ YAML::
 +
 [source,yaml]
 ----
-- from:
-    uri: platform-http:/chat
-    steps:
-      - to: openai:moderation?moderationModel=omni-moderation-latest
-      - choice:
-          when:
-            - simple: "${header.CamelOpenAIModerationFlagged} == true"
+- route:
+    from:
+      uri: platform-http:/chat
+      steps:
+        - to:
+            uri: openai: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:
-                - setBody:
-                    constant: "Your message violates our usage policy."
-          otherwise:
-            steps:
-              - to: openai:chat-completion?model=gpt-5
+                - to:
+                    uri: openai:chat-completion?model=gpt-5
 ----
 ====
 
@@ -256,22 +269,31 @@ YAML::
 +
 [source,yaml]
 ----
-- from:
-    uri: platform-http:/upload
-    steps:
-      - setHeader:
-          name: CamelOpenAIModerationText
-          simple: "${header.caption}"
-      - to: openai:moderation?moderationModel=omni-moderation-latest
-      - choice:
-          when:
-            - simple: "${header.CamelOpenAIModerationFlagged} == true"
+- route:
+    from:
+      uri: platform-http:/upload
+      steps:
+        - setHeader:
+            name: CamelOpenAIModerationText
+            expression:
+              simple:
+                expression: "${header.caption}"
+        - to:
+            uri: openai:moderation?moderationModel=omni-moderation-latest
+        - choice:
+            when:
+              - expression:
+                  simple:
+                    expression: "${header.CamelOpenAIModerationFlagged} == 
true"
+                steps:
+                  - setBody:
+                      expression:
+                        constant:
+                          expression: "Your upload violates our usage policy."
+            otherwise:
               steps:
-                - setBody:
-                    constant: "Your upload violates our usage policy."
-          otherwise:
-            steps:
-              - to: aws2-s3:uploads
+                - to:
+                    uri: aws2-s3:uploads
 ----
 ====
 
diff --git 
a/catalog/camel-catalog/src/generated/resources/org/apache/camel/catalog/docs/openai-webhooks.adoc
 
b/catalog/camel-catalog/src/generated/resources/org/apache/camel/catalog/docs/openai-webhooks.adoc
index 1c1f1c6f1ad7..d13ce100dd9b 100644
--- 
a/catalog/camel-catalog/src/generated/resources/org/apache/camel/catalog/docs/openai-webhooks.adoc
+++ 
b/catalog/camel-catalog/src/generated/resources/org/apache/camel/catalog/docs/openai-webhooks.adoc
@@ -58,11 +58,15 @@ YAML::
       steps:
         - choice:
             when:
-              - simple: "${header.CamelOpenAIWebhookEventType} == 
'response.completed'"
+              - expression:
+                  simple:
+                    expression: "${header.CamelOpenAIWebhookEventType} == 
'response.completed'"
                 steps:
                   - to:
                       uri: direct:response-completed
-              - simple: "${header.CamelOpenAIWebhookEventType} == 
'batch.completed'"
+              - expression:
+                  simple:
+                    expression: "${header.CamelOpenAIWebhookEventType} == 
'batch.completed'"
                 steps:
                   - to:
                       uri: direct:batch-completed
@@ -96,11 +100,15 @@ YAML::
         webhookSecret: "{{openai.webhook.secret}}"
       steps:
         - filter:
-            simple: "${header.CamelOpenAIWebhookEventType} == 
'response.completed'"
+            expression:
+              simple:
+                expression: "${header.CamelOpenAIWebhookEventType} == 
'response.completed'"
             steps:
               - setHeader:
                   name: CamelOpenAIResponseId
-                  simple: "${header.CamelOpenAIWebhookObjectId}"
+                  expression:
+                    simple:
+                      expression: "${header.CamelOpenAIWebhookObjectId}"
               - to:
                   uri: openai:responses-retrieve
               - to:
diff --git 
a/catalog/camel-catalog/src/generated/resources/org/apache/camel/catalog/docs/pgvector-component.adoc
 
b/catalog/camel-catalog/src/generated/resources/org/apache/camel/catalog/docs/pgvector-component.adoc
index 2e03e9b37d56..3e177369c7fd 100644
--- 
a/catalog/camel-catalog/src/generated/resources/org/apache/camel/catalog/docs/pgvector-component.adoc
+++ 
b/catalog/camel-catalog/src/generated/resources/org/apache/camel/catalog/docs/pgvector-component.adoc
@@ -116,7 +116,9 @@ YAML::
               embeddingModel: nomic-embed-text
         - setHeader:
             name: CamelPgVectorAction
-            constant: UPSERT
+            expression:
+              constant:
+                expression: UPSERT
         - setHeader:
             name: CamelPgVectorTextContent
             expression:
@@ -135,10 +137,14 @@ YAML::
               embeddingModel: nomic-embed-text
         - setHeader:
             name: CamelPgVectorAction
-            constant: SIMILARITY_SEARCH
+            expression:
+              constant:
+                expression: SIMILARITY_SEARCH
         - setHeader:
             name: CamelPgVectorQueryTopK
-            constant: 5
+            expression:
+              constant:
+                expression: 5
         - to:
             uri: pgvector:documents
 ----
@@ -185,7 +191,9 @@ YAML::
             uri: langchain4j-embeddings:embed
         - setHeader:
             name: CamelPgVectorAction
-            constant: UPSERT
+            expression:
+              constant:
+                expression: UPSERT
         - transformDataType:
             toType: "pgvector:embeddings"
         - to:
@@ -201,7 +209,9 @@ YAML::
             toType: "pgvector:embeddings"
         - setHeader:
             name: CamelPgVectorAction
-            constant: SIMILARITY_SEARCH
+            expression:
+              constant:
+                expression: SIMILARITY_SEARCH
         - to:
             uri: pgvector:myCollection
         - transformDataType:
diff --git 
a/catalog/camel-catalog/src/generated/resources/org/apache/camel/catalog/docs/semantic-language.adoc
 
b/catalog/camel-catalog/src/generated/resources/org/apache/camel/catalog/docs/semantic-language.adoc
index a180b2d45f6e..2dcf6a92fd57 100644
--- 
a/catalog/camel-catalog/src/generated/resources/org/apache/camel/catalog/docs/semantic-language.adoc
+++ 
b/catalog/camel-catalog/src/generated/resources/org/apache/camel/catalog/docs/semantic-language.adoc
@@ -136,15 +136,18 @@ The xref:others:yaml-dsl.adoc[YAML DSL] supports 
declarations alongside routes,
                   simple:
                     expression: "${exchangeProperty.department} == 'billing'"
                 steps:
-                  - to: direct:billing
+                  - to:
+                      uri: direct:billing
               - expression:
                   simple:
                     expression: "${exchangeProperty.department} == 'technical'"
                 steps:
-                  - to: direct:technical
+                  - to:
+                      uri: direct:technical
             otherwise:
               steps:
-                - to: direct:review
+                - to:
+                    uri: direct:review
 ----
 
 Names are context-wide. Duplicate declarations across resources and unknown 
references fail.
@@ -394,10 +397,12 @@ For example, replace the route above with:
                   simple:
                     expression: "${exchangeProperty.decision[department]} == 
'billing'"
                 steps:
-                  - to: direct:billing
+                  - to:
+                      uri: direct:billing
             otherwise:
               steps:
-                - to: direct:review
+                - to:
+                    uri: direct:review
 ----
 
 A result might contain `actionable -> true`, `department -> "billing"` and 
`urgency -> 1.2`.
diff --git 
a/catalog/camel-catalog/src/generated/resources/org/apache/camel/catalog/docs/spiffe-component.adoc
 
b/catalog/camel-catalog/src/generated/resources/org/apache/camel/catalog/docs/spiffe-component.adoc
index dcb978c9e29a..61e453af99e0 100644
--- 
a/catalog/camel-catalog/src/generated/resources/org/apache/camel/catalog/docs/spiffe-component.adoc
+++ 
b/catalog/camel-catalog/src/generated/resources/org/apache/camel/catalog/docs/spiffe-component.adoc
@@ -100,16 +100,19 @@ Validate an incoming bearer token on a `platform-http` 
route, without a bean to
 
 [source,yaml]
 ------------------------------------------------------------
-- from:
-    uri: "platform-http:/api"
-    steps:
-      # the Authorization: Bearer <token> header is picked up automatically; 
validation replaces the body with the
-      # JwtSvid, so this fits a request whose payload is not needed afterwards
-      - to: 
"spiffe:auth?operation=validateJwtSvid&audience=spiffe://example.org/api"
-      # the token is a credential; drop it before the exchange goes further
-      - removeHeaders:
-          pattern: "Authorization"
-      - to: "direct:handleRequest"
+- route:
+    from:
+      uri: "platform-http:/api"
+      steps:
+        # the Authorization: Bearer <token> header is picked up automatically; 
validation replaces the body with the
+        # JwtSvid, so this fits a request whose payload is not needed 
afterwards
+        - to:
+            uri: 
"spiffe:auth?operation=validateJwtSvid&audience=spiffe://example.org/api"
+        # the token is a credential; drop it before the exchange goes further
+        - removeHeaders:
+            pattern: "Authorization"
+        - to:
+            uri: "direct:handleRequest"
 ------------------------------------------------------------
 
 A missing token fails with `IllegalArgumentException`; a rejected one 
(invalid, expired, or a wrong audience) fails
diff --git 
a/catalog/camel-catalog/src/generated/resources/org/apache/camel/catalog/docs/tensorflow-serving-component.adoc
 
b/catalog/camel-catalog/src/generated/resources/org/apache/camel/catalog/docs/tensorflow-serving-component.adoc
index 8f98f3121cb8..0f3d5b3b7e32 100644
--- 
a/catalog/camel-catalog/src/generated/resources/org/apache/camel/catalog/docs/tensorflow-serving-component.adoc
+++ 
b/catalog/camel-catalog/src/generated/resources/org/apache/camel/catalog/docs/tensorflow-serving-component.adoc
@@ -190,10 +190,14 @@ YAML::
       steps:
         - setHeader:
             name: CamelTensorFlowServingModelName
-            constant: half_plus_two
+            expression:
+              constant:
+                expression: half_plus_two
         - setHeader:
             name: CamelTensorFlowServingModelVersion
-            constant: 123
+            expression:
+              constant:
+                expression: 123
         - to:
             uri: tensorflow-serving:model-status
         - log:
@@ -290,10 +294,14 @@ YAML::
       steps:
         - setHeader:
             name: CamelTensorFlowServingModelName
-            constant: half_plus_two
+            expression:
+              constant:
+                expression: half_plus_two
         - setHeader:
             name: CamelTensorFlowServingModelVersion
-            constant: 123
+            expression:
+              constant:
+                expression: 123
         - to:
             uri: tensorflow-serving:model-metadata
         - log:
diff --git a/components/camel-ai/camel-a2a/src/main/docs/a2a-component.adoc 
b/components/camel-ai/camel-a2a/src/main/docs/a2a-component.adoc
index a3a7846b5544..15a3ce7e855c 100644
--- a/components/camel-ai/camel-a2a/src/main/docs/a2a-component.adoc
+++ b/components/camel-ai/camel-a2a/src/main/docs/a2a-component.adoc
@@ -184,9 +184,11 @@ Example — including remote agent skills in an LLM prompt:
 ----
 steps:
   - setBody:
-      simple: |
-        Generate a plan using these available skills:
-        ${a2a:card.skills}
+      expression:
+        simple:
+          expression: |
+            Generate a plan using these available skills:
+            ${a2a:card.skills}
 ----
 
 For the full text of all parts combined, use the TypeConverter:
@@ -480,9 +482,13 @@ Both streaming and async agents use the same route pattern 
— `setBody` is alwa
 ----
 steps:
   - script:
-      simple: "${a2a:emit('progress...')}"    # optional status events
+      expression:
+        simple:
+          expression: "${a2a:emit('progress...')}"    # optional status events
   - setBody:
-      constant: "final response"              # consumer handles delivery
+      expression:
+        constant:
+          expression: "final response"              # consumer handles delivery
 ----
 
 The consumer handles delivery regardless of mechanism:
@@ -511,7 +517,9 @@ Bean reference example — useful when the card needs 
programmatic construction
         agentCard: "#myCardBean"
       steps:
         - setBody:
-            constant: "final response"
+            expression:
+              constant:
+                expression: "final response"
 ----
 
 URI parameter overrides — customize base cards per environment via properties:
@@ -526,7 +534,9 @@ URI parameter overrides — customize base cards per 
environment via properties:
         version: "{{agent.version}}"
       steps:
         - setBody:
-            constant: "final response"
+            expression:
+              constant:
+                expression: "final response"
 ----
 
 Security schemes from the card drive auth handler selection. Config parameters 
(`oauthProfile`, `bearerToken`, `apiKey`) provide the runtime credentials and 
influence scheme priority.
@@ -584,7 +594,9 @@ Example — consumer in POJO mode for multimodal processing:
         - log:
             message: "Received ${body.parts().size()} parts"
         - setBody:
-            simple: "Processed ${body.parts()[0]}"
+            expression:
+              simple:
+                expression: "Processed ${body.parts()[0]}"
 ----
 
 Example — producer in RAW mode for proxying:
@@ -595,7 +607,8 @@ Example — producer in RAW mode for proxying:
     from:
       uri: direct:proxy
       steps:
-        - to: a2a:http://remote-agent:8080?dataFormat=RAW
+        - to:
+            uri: a2a:http://remote-agent:8080?dataFormat=RAW
         - log:
             message: "Raw JSON: ${body}"
 ----
diff --git a/components/camel-ai/camel-a2a/src/main/docs/a2a-consumer.adoc 
b/components/camel-ai/camel-a2a/src/main/docs/a2a-consumer.adoc
index e5c8fd8d1649..4463f4c63d8b 100644
--- a/components/camel-ai/camel-a2a/src/main/docs/a2a-consumer.adoc
+++ b/components/camel-ai/camel-a2a/src/main/docs/a2a-consumer.adoc
@@ -36,7 +36,9 @@ YAML::
         - log:
             message: "Received: ${body}"
         - setBody:
-            constant: "Hello from my agent!"
+            expression:
+              constant:
+                expression: "Hello from my agent!"
 ----
 
 Java::
@@ -145,7 +147,9 @@ By default, the consumer uses the REST binding (HTTP+JSON 
with colon-notation pa
         validateAuth: false
       steps:
         - setBody:
-            constant: "JSON-RPC response"
+            expression:
+              constant:
+                expression: "JSON-RPC response"
 ----
 
 This example is local-only because it disables operation auth. Keep 
`validateAuth=true` and configure a card security scheme for network-exposed 
agents.
@@ -198,7 +202,9 @@ Validate incoming bearer tokens via the `camel-oauth` SPI. 
When an `oauthProfile
         validateAuth: true
       steps:
         - setBody:
-            constant: "Authenticated response"
+            expression:
+              constant:
+                expression: "Authenticated response"
 ----
 
 Configure the OIDC provider in application properties (these properties are 
owned by the `camel-oauth` component — see its documentation for the canonical 
format):
@@ -251,7 +257,9 @@ The `apiKeyHeader` parameter controls which HTTP header 
carries the API key. It
         apiKeyHeader: X-API-Key      # default is Authorization
       steps:
         - setBody:
-            constant: "API key protected response"
+            expression:
+              constant:
+                expression: "API key protected response"
 ----
 
 The agent card must declare an `apiKey` security scheme:
@@ -293,7 +301,9 @@ When the scheme declares `location=header` and `name`, that 
header name takes pr
         validateAuth: true
       steps:
         - setBody:
-            constant: "Bearer token protected response"
+            expression:
+              constant:
+                expression: "Bearer token protected response"
 ----
 
 The agent card must declare an `http` bearer security scheme:
@@ -342,17 +352,29 @@ YAML::
         httpServerComponent: undertow
       steps:
         - script:
-            simple: "${a2a:emit('Connecting to database...')}"
+            expression:
+              simple:
+                expression: "${a2a:emit('Connecting to database...')}"
         - delay:
-            constant: 2000
+            expression:
+              constant:
+                expression: 2000
         - script:
-            simple: "${a2a:emit('Processing 1000 records...')}"
+            expression:
+              simple:
+                expression: "${a2a:emit('Processing 1000 records...')}"
         - delay:
-            constant: 3000
+            expression:
+              constant:
+                expression: 3000
         - script:
-            simple: "${a2a:emit('Analysis complete!')}"
+            expression:
+              simple:
+                expression: "${a2a:emit('Analysis complete!')}"
         - setBody:
-            constant: "Final analysis results: ..."
+            expression:
+              constant:
+                expression: "Final analysis results: ..."
 ----
 
 Java::
@@ -380,7 +402,9 @@ You can also emit with an explicit state:
 ----
 steps:
   - script:
-      simple: "${a2a:emit(INPUT_REQUIRED, 'Please provide your address')}"
+      expression:
+        simple:
+          expression: "${a2a:emit(INPUT_REQUIRED, 'Please provide your 
address')}"
 ----
 
 NOTE: Use `script` EIP (not `setBody`) for `${a2a:emit()}` calls — `script` 
evaluates the expression for its side effect without changing the message body. 
Use `setBody` only for the final response.
@@ -428,7 +452,9 @@ Use stable `id` values on long-lived sub-tasks so route 
tracing and route-struct
                   ref: answerDraftingService
                   method: draft
         - setBody:
-            simple: "Final answer: ${body}"
+            expression:
+              simple:
+                expression: "Final answer: ${body}"
 ----
 
 The route examples in this section are local-only because they disable 
operation auth. Keep `validateAuth=true` and configure a card security scheme 
for network-exposed agents.
@@ -500,9 +526,13 @@ For long-running operations, enable `returnImmediately` to 
return a `SUBMITTED`
         asyncTimeout: 30000          # default is 300000 (5 minutes)
       steps:
         - delay:
-            constant: 10000
+            expression:
+              constant:
+                expression: 10000
         - setBody:
-            constant: "Long computation result"
+            expression:
+              constant:
+                expression: "Long computation result"
 ----
 
 The `asyncTimeout` parameter (default: 300,000 ms / 5 minutes) controls how 
long the background processing can run before the task is marked `FAILED`.
@@ -559,7 +589,9 @@ Control concurrent task processing and queue overflow:
         taskQueueSize: 50
       steps:
         - setBody:
-            constant: "Processing..."
+            expression:
+              constant:
+                expression: "Processing..."
 ----
 
 [cols="1,1,3"]
@@ -598,7 +630,9 @@ The consumer enforces `maxPayloadSize` (default 6,291,456 
bytes / 6 MiB) on inco
         maxPayloadSize: 10485760
       steps:
         - setBody:
-            constant: "final response"
+            expression:
+              constant:
+                expression: "final response"
 ----
 
 === CORS Support
diff --git a/components/camel-ai/camel-a2a/src/main/docs/a2a-producer.adoc 
b/components/camel-ai/camel-a2a/src/main/docs/a2a-producer.adoc
index 273a9c588df2..ca73b0cb73c8 100644
--- a/components/camel-ai/camel-a2a/src/main/docs/a2a-producer.adoc
+++ b/components/camel-ai/camel-a2a/src/main/docs/a2a-producer.adoc
@@ -20,7 +20,9 @@ YAML::
       uri: direct:call-agent
       steps:
         - setBody:
-            constant: "What is the weather?"
+            expression:
+              constant:
+                expression: "What is the weather?"
         - to:
             uri: a2a:http://remote-agent:8080
         - log:
@@ -111,19 +113,28 @@ YAML::
 steps:
   - setHeader:
       name: CamelA2AOperation
-      constant: MESSAGE_STREAM
-  - to: a2a:https://agent.example.com
+      expression:
+        constant:
+          expression: MESSAGE_STREAM
+  - to:
+      uri: a2a:https://agent.example.com
   - split:
-      simple: "${body}"
+      expression:
+        simple:
+          expression: "${body}"
       streaming: true
       steps:
         - choice:
             when:
-              - simple: "${body.statusUpdate} != null"
+              - expression:
+                  simple:
+                    expression: "${body.statusUpdate} != null"
                 steps:
                   - log:
                       message: "Progress: ${body.statusUpdate.status.state}"
-              - simple: "${body.message} != null"
+              - expression:
+                  simple:
+                    expression: "${body.message} != null"
                 steps:
                   - log:
                       message: "Final message received"
@@ -149,7 +160,8 @@ To buffer all events into a `List<StreamResponse>`:
 [source,yaml]
 ----
 steps:
-  - to: a2a:https://agent.example.com
+  - to:
+      uri: a2a:https://agent.example.com
   - convertBodyTo:
       type: java.util.List
 ----
@@ -171,7 +183,9 @@ steps:
         operation: MESSAGE_STREAM
   - setHeader:
       name: Content-Type
-      constant: text/event-stream
+      expression:
+        constant:
+          expression: text/event-stream
 ----
 
 Java::
@@ -193,13 +207,20 @@ Subscribe to ongoing task updates from a remote agent:
 steps:
   - setHeader:
       name: CamelA2AOperation
-      constant: TASK_SUBSCRIBE
+      expression:
+        constant:
+          expression: TASK_SUBSCRIBE
   - setHeader:
       name: CamelA2ATaskId
-      simple: "${exchangeProperty.taskId}"
-  - to: a2a:https://agent.example.com
+      expression:
+        simple:
+          expression: "${exchangeProperty.taskId}"
+  - to:
+      uri: a2a:https://agent.example.com
   - split:
-      simple: "${body}"
+      expression:
+        simple:
+          expression: "${body}"
       streaming: true
       steps:
         - log:
@@ -214,24 +235,32 @@ Streaming requests use `asyncTimeout` (default 5 minutes) 
instead of the standar
 ----
 # Step 1: Submit the task
 - setBody:
-    constant: "Start long operation"
+    expression:
+      constant:
+        expression: "Start long operation"
 - to:
     uri: a2a:http://remote-agent:8083
     parameters:
       oauthProfile: assistant
 - setVariable:
     name: taskId
-    simple: "${header.CamelA2ATaskId}"
+    expression:
+      simple:
+        expression: "${header.CamelA2ATaskId}"
 
 # Step 2: Poll for completion
 - removeHeaders:
     pattern: "*"
 - setHeader:
     name: CamelA2AOperation
-    constant: TASK_GET
+    expression:
+      constant:
+        expression: TASK_GET
 - setHeader:
     name: CamelA2ATaskId
-    simple: "${variable.taskId}"
+    expression:
+      simple:
+        expression: "${variable.taskId}"
 - to:
     uri: a2a:http://remote-agent:8083
     parameters:
@@ -244,24 +273,36 @@ Streaming requests use `asyncTimeout` (default 5 minutes) 
instead of the standar
 ----
 # Step 1: Submit task
 - setBody:
-    constant: "Track my package"
-- to: a2a:http://remote-agent:8085
+    expression:
+      constant:
+        expression: "Track my package"
+- to:
+    uri: a2a:http://remote-agent:8085
 - setVariable:
     name: taskId
-    simple: "${header.CamelA2ATaskId}"
+    expression:
+      simple:
+        expression: "${header.CamelA2ATaskId}"
 
 # Step 2: Register push notification webhook
 - removeHeaders:
     pattern: "*"
 - setHeader:
     name: CamelA2AOperation
-    constant: PUSH_CONFIG_CREATE
+    expression:
+      constant:
+        expression: PUSH_CONFIG_CREATE
 - setHeader:
     name: CamelA2ATaskId
-    simple: "${variable.taskId}"
+    expression:
+      simple:
+        expression: "${variable.taskId}"
 - setBody:
-    simple: "${ref:pushConfig}"
-- to: a2a:http://remote-agent:8085
+    expression:
+      simple:
+        expression: "${ref:pushConfig}"
+- to:
+    uri: a2a:http://remote-agent:8085
 ----
 
 Configure the webhook URL as a bean:
@@ -279,35 +320,54 @@ The full push notification config CRUD is also available. 
`PUSH_CONFIG_GET` and
 # List push configs for a task
 - setHeader:
     name: CamelA2AOperation
-    constant: PUSH_CONFIG_LIST
+    expression:
+      constant:
+        expression: PUSH_CONFIG_LIST
 - setHeader:
     name: CamelA2ATaskId
-    simple: "${variable.taskId}"
-- to: a2a:https://agent.example.com
+    expression:
+      simple:
+        expression: "${variable.taskId}"
+- to:
+    uri: a2a:https://agent.example.com
 
 # Get a specific push config
 - setHeader:
     name: CamelA2AOperation
-    constant: PUSH_CONFIG_GET
+    expression:
+      constant:
+        expression: PUSH_CONFIG_GET
 - setHeader:
     name: CamelA2ATaskId
-    simple: "${variable.taskId}"
+    expression:
+      simple:
+        expression: "${variable.taskId}"
 - setHeader:
     name: CamelA2APushConfigId
-    simple: "${variable.configId}"
-- to: "a2a:https://agent.example.com?protocolBinding=JSONRPC";
+    expression:
+      simple:
+        expression: "${variable.configId}"
+- to:
+    uri: "a2a:https://agent.example.com?protocolBinding=JSONRPC";
 
 # Delete a push config
 - setHeader:
     name: CamelA2AOperation
-    constant: PUSH_CONFIG_DELETE
+    expression:
+      constant:
+        expression: PUSH_CONFIG_DELETE
 - setHeader:
     name: CamelA2ATaskId
-    simple: "${variable.taskId}"
+    expression:
+      simple:
+        expression: "${variable.taskId}"
 - setHeader:
     name: CamelA2APushConfigId
-    simple: "${variable.configId}"
-- to: "a2a:https://agent.example.com?protocolBinding=JSONRPC";
+    expression:
+      simple:
+        expression: "${variable.configId}"
+- to:
+    uri: "a2a:https://agent.example.com?protocolBinding=JSONRPC";
 ----
 
 === Parallel Multicast
@@ -324,9 +384,12 @@ Call multiple agents concurrently using Camel's 
`multicast` EIP:
             parallelProcessing: true
             aggregationStrategy: "#class:MyAggregator"
             steps:
-              - to: direct:call-weather
-              - to: direct:call-news
-              - to: direct:call-fortune
+              - to:
+                  uri: direct:call-weather
+              - to:
+                  uri: direct:call-news
+              - to:
+                  uri: direct:call-fortune
 
 - route:
     id: call-weather
@@ -336,7 +399,9 @@ Call multiple agents concurrently using Camel's `multicast` 
EIP:
         - removeHeaders:
             pattern: "*"
         - setBody:
-            constant: "What is the weather?"
+            expression:
+              constant:
+                expression: "What is the weather?"
         - to:
             uri: a2a:http://weather-agent:8080
             parameters:
@@ -355,7 +420,8 @@ Override the remote agent's URL from the card using 
`host`/`port`/`basePath` con
 [source,yaml]
 ----
 steps:
-  - to: a2a:https://agent.example.com?host=http://localhost&port=8080
+  - to:
+      uri: a2a:https://agent.example.com?host=http://localhost&port=8080
 ----
 
 Priority without producer credentials: `host` config > card's 
`supportedInterfaces` URL > `agentCardSource` URL. When producer credentials 
are configured (`apiKey`, `bearerToken`, or `oauthProfile`) and `host` is not 
set, the producer sends credentialed requests only to the HTTP(S) 
`agentCardSource` origin. This avoids sending credentials to a URL supplied by 
the remote card's `supportedInterfaces` field. The `port` and `basePath` 
producer overrides are applied when `host` is configured. [...]
@@ -369,7 +435,8 @@ By default, the producer does not follow HTTP redirects to 
prevent credential le
 [source,yaml]
 ----
 steps:
-  - to: a2a:https://agent.example.com?followRedirects=true
+  - to:
+      uri: a2a:https://agent.example.com?followRedirects=true
 ----
 
 NOTE: `followRedirects` applies to operation requests only. Agent card 
discovery never follows redirects — a card URL that returns a redirect fails 
with an error.
diff --git 
a/components/camel-ai/camel-ai-tool/src/main/docs/ai-tool-component.adoc 
b/components/camel-ai/camel-ai-tool/src/main/docs/ai-tool-component.adoc
index ab10c665857f..9912e90bdf31 100644
--- a/components/camel-ai/camel-ai-tool/src/main/docs/ai-tool-component.adoc
+++ b/components/camel-ai/camel-ai-tool/src/main/docs/ai-tool-component.adoc
@@ -187,7 +187,8 @@ YAML::
             "additionalProperties": false
           }
       steps:
-        - to: direct:createOrder
+        - to:
+            uri: direct:createOrder
 ----
 ====
 
@@ -228,7 +229,9 @@ YAML::
         outputParameter.unit: string
       steps:
         - setBody:
-            constant: '{"temperature":21.5,"unit":"celsius"}'
+            expression:
+              constant:
+                expression: '{"temperature":21.5,"unit":"celsius"}'
 ----
 ====
 
@@ -277,7 +280,8 @@ YAML::
         idempotentHint: false
         openWorldHint: true
       steps:
-        - to: direct:deleteOrder
+        - to:
+            uri: direct:deleteOrder
 ----
 ====
 
@@ -414,7 +418,8 @@ YAML::
         description: "Transfer funds"
         authorizationPolicy: "#myAuthorizationPolicy"
       steps:
-        - to: bean:ledger
+        - to:
+            uri: bean:ledger
 ----
 ====
 
diff --git 
a/components/camel-ai/camel-docling/src/main/docs/docling-component.adoc 
b/components/camel-ai/camel-docling/src/main/docs/docling-component.adoc
index e23a16a20eb1..66cdaf2814d1 100644
--- a/components/camel-ai/camel-docling/src/main/docs/docling-component.adoc
+++ b/components/camel-ai/camel-docling/src/main/docs/docling-component.adoc
@@ -393,13 +393,19 @@ YAML::
       steps:
         - setHeader:
             name: "CamelDoclingOperation"
-            constant: "CONVERT_TO_HTML"
+            expression:
+              constant:
+                expression: "CONVERT_TO_HTML"
         - setHeader:
             name: "CamelDoclingEnableOCR"
-            constant: true
+            expression:
+              constant:
+                expression: true
         - setHeader:
             name: "CamelDoclingOCRLanguage"
-            constant: "es"
+            expression:
+              constant:
+                expression: "es"
         - to:
             uri: docling:CONVERT_TO_MARKDOWN  # Operation will be overridden 
by header
         - to:
diff --git a/components/camel-ai/camel-docling/src/main/docs/docling-serve.adoc 
b/components/camel-ai/camel-docling/src/main/docs/docling-serve.adoc
index 847a958a63e0..ae2e15c94c94 100644
--- a/components/camel-ai/camel-docling/src/main/docs/docling-serve.adoc
+++ b/components/camel-ai/camel-docling/src/main/docs/docling-serve.adoc
@@ -67,7 +67,9 @@ YAML::
         repeatCount: 1
       steps:
         - setBody:
-            constant: "https://arxiv.org/pdf/2501.17887";
+            expression:
+              constant:
+                expression: "https://arxiv.org/pdf/2501.17887";
         - to:
             uri: docling:CONVERT_TO_MARKDOWN
             parameters:
diff --git 
a/components/camel-ai/camel-kserve/src/main/docs/kserve-component.adoc 
b/components/camel-ai/camel-kserve/src/main/docs/kserve-component.adoc
index dc671d9445d1..eb4e7efa3173 100644
--- a/components/camel-ai/camel-kserve/src/main/docs/kserve-component.adoc
+++ b/components/camel-ai/camel-kserve/src/main/docs/kserve-component.adoc
@@ -248,10 +248,14 @@ YAML::
       steps:
         - setHeader:
             name: CamelKServeModelName
-            constant: simple
+            expression:
+              constant:
+                expression: simple
         - setHeader:
             name: CamelKServeModelVersion
-            constant: "1"
+            expression:
+              constant:
+                expression: "1"
         - to:
             uri: kserve:model/ready
         - log:
@@ -345,10 +349,14 @@ YAML::
       steps:
         - setHeader:
             name: CamelKServeModelName
-            constant: simple
+            expression:
+              constant:
+                expression: simple
         - setHeader:
             name: CamelKServeModelVersion
-            constant: "1"
+            expression:
+              constant:
+                expression: "1"
         - to:
             uri: kserve:model/metadata
         - log:
diff --git 
a/components/camel-ai/camel-langchain4j-agent/src/main/docs/langchain4j-agent-component.adoc
 
b/components/camel-ai/camel-langchain4j-agent/src/main/docs/langchain4j-agent-component.adoc
index abacb230bd3a..fe956b89dfba 100644
--- 
a/components/camel-ai/camel-langchain4j-agent/src/main/docs/langchain4j-agent-component.adoc
+++ 
b/components/camel-ai/camel-langchain4j-agent/src/main/docs/langchain4j-agent-component.adoc
@@ -715,7 +715,9 @@ YAML::
         parameter.userId: string
       steps:
         - setBody:
-            constant: '{"name": "John Doe", "id": "123"}'
+            expression:
+              constant:
+                expression: '{"name": "John Doe", "id": "123"}'
 
 - route:
     from:
@@ -726,7 +728,9 @@ YAML::
         parameter.city: string
       steps:
         - setBody:
-            constant: '{"weather": "sunny", "temperature": "22°C"}'
+            expression:
+              constant:
+                expression: '{"weather": "sunny", "temperature": "22°C"}'
 
 # Agent with tools
 - route:
@@ -1192,7 +1196,9 @@ YAML::
       uri: direct:extract-person-info
       steps:
         - setBody:
-            constant: "Extract information about John Smith, a 35-year-old 
software engineer"
+            expression:
+              constant:
+                expression: "Extract information about John Smith, a 
35-year-old software engineer"
         - to:
             uri: langchain4j-agent:structured
             parameters:
diff --git 
a/components/camel-ai/camel-langchain4j-agent/src/main/docs/langchain4j-agent-mcp.adoc
 
b/components/camel-ai/camel-langchain4j-agent/src/main/docs/langchain4j-agent-mcp.adoc
index 8411ec98fa4e..4027f1d927b0 100644
--- 
a/components/camel-ai/camel-langchain4j-agent/src/main/docs/langchain4j-agent-mcp.adoc
+++ 
b/components/camel-ai/camel-langchain4j-agent/src/main/docs/langchain4j-agent-mcp.adoc
@@ -326,14 +326,20 @@ YAML::
       steps:
         - choice:
             when:
-              - simple: "${header.userRole} == 'readonly'"
+              - expression:
+                  simple:
+                    expression: "${header.userRole} == 'readonly'"
                 steps:
                   - setHeader:
                       name: CamelLangChain4jAgentExcludeTags
-                      constant: admin-tools
+                      expression:
+                        constant:
+                          expression: admin-tools
                   - setHeader:
                       name: CamelLangChain4jAgentExcludeMcpServers
-                      constant: filesystem
+                      expression:
+                        constant:
+                          expression: filesystem
         - to:
             uri: langchain4j-agent:assistant
             parameters:
diff --git 
a/components/camel-ai/camel-langchain4j-agent/src/main/docs/langchain4j-agent-multimodal.adoc
 
b/components/camel-ai/camel-langchain4j-agent/src/main/docs/langchain4j-agent-multimodal.adoc
index 51a7287a3614..efe1792b0744 100644
--- 
a/components/camel-ai/camel-langchain4j-agent/src/main/docs/langchain4j-agent-multimodal.adoc
+++ 
b/components/camel-ai/camel-langchain4j-agent/src/main/docs/langchain4j-agent-multimodal.adoc
@@ -95,7 +95,9 @@ YAML::
       steps:
         - setHeader:
             name: CamelLangChain4jAgentUserMessage
-            constant: Describe this image
+            expression:
+              constant:
+                expression: Describe this image
         - to:
             uri: langchain4j-agent:vision
             parameters:
@@ -146,7 +148,9 @@ YAML::
       steps:
         - setHeader:
             name: CamelLangChain4jAgentUserMessage
-            constant: "What do you see in this image?"
+            expression:
+              constant:
+                expression: "What do you see in this image?"
         - to:
             uri: langchain4j-agent:vision
             parameters:
@@ -206,10 +210,14 @@ YAML::
       steps:
         - setHeader:
             name: CamelLangChain4jAgentUserMessage
-            constant: Analyze this document
+            expression:
+              constant:
+                expression: Analyze this document
         - setHeader:
             name: CamelLangChain4jAgentMediaType
-            constant: application/pdf
+            expression:
+              constant:
+                expression: application/pdf
         - to:
             uri: langchain4j-agent:analyzer
             parameters:
@@ -282,7 +290,9 @@ YAML::
       steps:
         - setHeader:
             name: CamelLangChain4jAgentUserMessage
-            constant: "Describe what you see in this image. Be detailed but 
concise."
+            expression:
+              constant:
+                expression: "Describe what you see in this image. Be detailed 
but concise."
         - to:
             uri: langchain4j-agent:vision
             parameters:
diff --git 
a/components/camel-ai/camel-langchain4j-embeddings/src/main/docs/langchain4j-embeddings-component.adoc
 
b/components/camel-ai/camel-langchain4j-embeddings/src/main/docs/langchain4j-embeddings-component.adoc
index 655ebad558b6..4fd7aa0d8cf2 100644
--- 
a/components/camel-ai/camel-langchain4j-embeddings/src/main/docs/langchain4j-embeddings-component.adoc
+++ 
b/components/camel-ai/camel-langchain4j-embeddings/src/main/docs/langchain4j-embeddings-component.adoc
@@ -259,10 +259,14 @@ YAML::
             uri: langchain4j-embeddings:embed
         - setHeader:
             name: CamelQdrantAction
-            constant: UPSERT
+            expression:
+              constant:
+                expression: UPSERT
         - setHeader:
             name: CamelQdrantPointId
-            constant: 1
+            expression:
+              constant:
+                expression: 1
         - transformDataType:
             toType: "qdrant:embeddings"
         - to:
@@ -303,10 +307,14 @@ YAML::
             toType: "qdrant:embeddings"
         - setHeader:
             name: CamelQdrantAction
-            constant: SIMILARITY_SEARCH
+            expression:
+              constant:
+                expression: SIMILARITY_SEARCH
         - setHeader:
             name: CamelQdrantWithPayload
-            constant: true
+            expression:
+              constant:
+                expression: true
         - to:
             uri: qdrant:myCollection
         - transformDataType:
@@ -343,7 +351,9 @@ YAML::
             uri: langchain4j-embeddings:embed
         - setHeader:
             name: CamelPgVectorAction
-            constant: UPSERT
+            expression:
+              constant:
+                expression: UPSERT
         - transformDataType:
             toType: "pgvector:embeddings"
         - to:
@@ -381,7 +391,9 @@ YAML::
             toType: "pgvector:embeddings"
         - setHeader:
             name: CamelPgVectorAction
-            constant: SIMILARITY_SEARCH
+            expression:
+              constant:
+                expression: SIMILARITY_SEARCH
         - to:
             uri: pgvector:myCollection
         - transformDataType:
diff --git a/components/camel-ai/camel-openai/src/main/docs/openai-batch.adoc 
b/components/camel-ai/camel-openai/src/main/docs/openai-batch.adoc
index f168d7830ac7..f752b78eade2 100644
--- a/components/camel-ai/camel-openai/src/main/docs/openai-batch.adoc
+++ b/components/camel-ai/camel-openai/src/main/docs/openai-batch.adoc
@@ -62,11 +62,14 @@ YAML::
 +
 [source,yaml]
 ----
-- from:
-    uri: direct:classify
-    steps:
-      - to: 
"openai:batch?batchEndpoint=/v1/chat/completions&model=gpt-4o-mini&systemMessage=Classify
 the ticket"
-      - log: "Batch ${header.CamelOpenAIBatchId} is 
${header.CamelOpenAIBatchStatus}"
+- route:
+    from:
+      uri: direct:classify
+      steps:
+        - to:
+            uri: 
"openai:batch?batchEndpoint=/v1/chat/completions&model=gpt-4o-mini&systemMessage=Classify
 the ticket"
+        - log:
+            message: "Batch ${header.CamelOpenAIBatchId} is 
${header.CamelOpenAIBatchStatus}"
 ----
 ====
 
diff --git 
a/components/camel-ai/camel-openai/src/main/docs/openai-component.adoc 
b/components/camel-ai/camel-openai/src/main/docs/openai-component.adoc
index 513e9b2e9575..002f1aebb2dd 100644
--- a/components/camel-ai/camel-openai/src/main/docs/openai-component.adoc
+++ b/components/camel-ai/camel-openai/src/main/docs/openai-component.adoc
@@ -257,7 +257,9 @@ YAML::
       steps:
         - setHeader:
             name: CamelOpenAIUserMessage
-            simple: "Rate 1-10 for ${header.role}: ${body}"
+            expression:
+              simple:
+                expression: "Rate 1-10 for ${header.role}: ${body}"
         - to:
             uri: openai:chat-completion
             parameters:
@@ -462,10 +464,14 @@ YAML::
       steps:
         - setHeader:
             name: CamelOpenAIMediaType
-            constant: "image/png"
+            expression:
+              constant:
+                expression: "image/png"
         - setHeader:
             name: CamelOpenAIUserMessage
-            constant: "Describe what you see in this image"
+            expression:
+              constant:
+                expression: "Describe what you see in this image"
         - to:
             uri: openai:chat-completion
             parameters:
@@ -610,10 +616,14 @@ YAML::
       uri: direct:json-schema
       steps:
         - setBody:
-            constant: "Create a product description"
+            expression:
+              constant:
+                expression: "Create a product description"
         - setHeader:
             name: CamelOpenAIJsonSchema
-            constant: 
'{"type":"object","properties":{"name":{"type":"string"},"price":{"type":"number"}}}'
+            expression:
+              constant:
+                expression: 
'{"type":"object","properties":{"name":{"type":"string"},"price":{"type":"number"}}}'
         - to:
             uri: openai:chat-completion
         - log:
@@ -658,7 +668,9 @@ YAML::
       uri: direct:json-schema-resource
       steps:
         - setBody:
-            constant: "Create a product description"
+            expression:
+              constant:
+                expression: "Create a product description"
         - to:
             uri: openai:chat-completion
             parameters:
@@ -720,7 +732,9 @@ YAML::
       uri: direct:conversation
       steps:
         - setBody:
-            constant: "My name is Alice"
+            expression:
+              constant:
+                expression: "My name is Alice"
         - to:
             uri: openai:chat-completion
             parameters:
@@ -728,7 +742,9 @@ YAML::
         - log:
             message: "First response: ${body}"
         - setBody:
-            constant: "What is my name?"
+            expression:
+              constant:
+                expression: "What is my name?"
         - to:
             uri: openai:chat-completion
             parameters:
@@ -1220,7 +1236,9 @@ YAML::
       steps:
         - setHeader:
             name: CamelOpenAIUserMessage
-            simple: "Summarize this ${header.documentType} in 3 bullet points: 
${body}"
+            expression:
+              simple:
+                expression: "Summarize this ${header.documentType} in 3 bullet 
points: ${body}"
         - to:
             uri: openai:chat-completion
         - log:
diff --git 
a/components/camel-ai/camel-openai/src/main/docs/openai-operations.adoc 
b/components/camel-ai/camel-openai/src/main/docs/openai-operations.adoc
index 200689f4ea0a..9ef3d1c690e8 100644
--- a/components/camel-ai/camel-openai/src/main/docs/openai-operations.adoc
+++ b/components/camel-ai/camel-openai/src/main/docs/openai-operations.adoc
@@ -81,7 +81,9 @@ Using the xref:ROOT:pgvector-component.adoc[PGVector] 
component:
               embeddingModel: nomic-embed-text
         - setHeader:
             name: CamelPgVectorAction
-            constant: UPSERT
+            expression:
+              constant:
+                expression: UPSERT
         - setHeader:
             name: CamelPgVectorTextContent
             expression:
@@ -101,10 +103,14 @@ Using the xref:ROOT:pgvector-component.adoc[PGVector] 
component:
               embeddingModel: nomic-embed-text
         - setHeader:
             name: CamelPgVectorAction
-            constant: SIMILARITY_SEARCH
+            expression:
+              constant:
+                expression: SIMILARITY_SEARCH
         - setHeader:
             name: CamelPgVectorQueryTopK
-            constant: 5
+            expression:
+              constant:
+                expression: 5
         - to:
             uri: pgvector:documents
 ----
@@ -206,19 +212,26 @@ YAML::
 +
 [source,yaml]
 ----
-- from:
-    uri: platform-http:/chat
-    steps:
-      - to: openai:moderation?moderationModel=omni-moderation-latest
-      - choice:
-          when:
-            - simple: "${header.CamelOpenAIModerationFlagged} == true"
+- route:
+    from:
+      uri: platform-http:/chat
+      steps:
+        - to:
+            uri: openai: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:
-                - setBody:
-                    constant: "Your message violates our usage policy."
-          otherwise:
-            steps:
-              - to: openai:chat-completion?model=gpt-5
+                - to:
+                    uri: openai:chat-completion?model=gpt-5
 ----
 ====
 
@@ -256,22 +269,31 @@ YAML::
 +
 [source,yaml]
 ----
-- from:
-    uri: platform-http:/upload
-    steps:
-      - setHeader:
-          name: CamelOpenAIModerationText
-          simple: "${header.caption}"
-      - to: openai:moderation?moderationModel=omni-moderation-latest
-      - choice:
-          when:
-            - simple: "${header.CamelOpenAIModerationFlagged} == true"
+- route:
+    from:
+      uri: platform-http:/upload
+      steps:
+        - setHeader:
+            name: CamelOpenAIModerationText
+            expression:
+              simple:
+                expression: "${header.caption}"
+        - to:
+            uri: openai:moderation?moderationModel=omni-moderation-latest
+        - choice:
+            when:
+              - expression:
+                  simple:
+                    expression: "${header.CamelOpenAIModerationFlagged} == 
true"
+                steps:
+                  - setBody:
+                      expression:
+                        constant:
+                          expression: "Your upload violates our usage policy."
+            otherwise:
               steps:
-                - setBody:
-                    constant: "Your upload violates our usage policy."
-          otherwise:
-            steps:
-              - to: aws2-s3:uploads
+                - to:
+                    uri: aws2-s3:uploads
 ----
 ====
 
diff --git 
a/components/camel-ai/camel-openai/src/main/docs/openai-webhooks.adoc 
b/components/camel-ai/camel-openai/src/main/docs/openai-webhooks.adoc
index 1c1f1c6f1ad7..d13ce100dd9b 100644
--- a/components/camel-ai/camel-openai/src/main/docs/openai-webhooks.adoc
+++ b/components/camel-ai/camel-openai/src/main/docs/openai-webhooks.adoc
@@ -58,11 +58,15 @@ YAML::
       steps:
         - choice:
             when:
-              - simple: "${header.CamelOpenAIWebhookEventType} == 
'response.completed'"
+              - expression:
+                  simple:
+                    expression: "${header.CamelOpenAIWebhookEventType} == 
'response.completed'"
                 steps:
                   - to:
                       uri: direct:response-completed
-              - simple: "${header.CamelOpenAIWebhookEventType} == 
'batch.completed'"
+              - expression:
+                  simple:
+                    expression: "${header.CamelOpenAIWebhookEventType} == 
'batch.completed'"
                 steps:
                   - to:
                       uri: direct:batch-completed
@@ -96,11 +100,15 @@ YAML::
         webhookSecret: "{{openai.webhook.secret}}"
       steps:
         - filter:
-            simple: "${header.CamelOpenAIWebhookEventType} == 
'response.completed'"
+            expression:
+              simple:
+                expression: "${header.CamelOpenAIWebhookEventType} == 
'response.completed'"
             steps:
               - setHeader:
                   name: CamelOpenAIResponseId
-                  simple: "${header.CamelOpenAIWebhookObjectId}"
+                  expression:
+                    simple:
+                      expression: "${header.CamelOpenAIWebhookObjectId}"
               - to:
                   uri: openai:responses-retrieve
               - to:
diff --git 
a/components/camel-ai/camel-pgvector/src/main/docs/pgvector-component.adoc 
b/components/camel-ai/camel-pgvector/src/main/docs/pgvector-component.adoc
index 2e03e9b37d56..3e177369c7fd 100644
--- a/components/camel-ai/camel-pgvector/src/main/docs/pgvector-component.adoc
+++ b/components/camel-ai/camel-pgvector/src/main/docs/pgvector-component.adoc
@@ -116,7 +116,9 @@ YAML::
               embeddingModel: nomic-embed-text
         - setHeader:
             name: CamelPgVectorAction
-            constant: UPSERT
+            expression:
+              constant:
+                expression: UPSERT
         - setHeader:
             name: CamelPgVectorTextContent
             expression:
@@ -135,10 +137,14 @@ YAML::
               embeddingModel: nomic-embed-text
         - setHeader:
             name: CamelPgVectorAction
-            constant: SIMILARITY_SEARCH
+            expression:
+              constant:
+                expression: SIMILARITY_SEARCH
         - setHeader:
             name: CamelPgVectorQueryTopK
-            constant: 5
+            expression:
+              constant:
+                expression: 5
         - to:
             uri: pgvector:documents
 ----
@@ -185,7 +191,9 @@ YAML::
             uri: langchain4j-embeddings:embed
         - setHeader:
             name: CamelPgVectorAction
-            constant: UPSERT
+            expression:
+              constant:
+                expression: UPSERT
         - transformDataType:
             toType: "pgvector:embeddings"
         - to:
@@ -201,7 +209,9 @@ YAML::
             toType: "pgvector:embeddings"
         - setHeader:
             name: CamelPgVectorAction
-            constant: SIMILARITY_SEARCH
+            expression:
+              constant:
+                expression: SIMILARITY_SEARCH
         - to:
             uri: pgvector:myCollection
         - transformDataType:
diff --git 
a/components/camel-ai/camel-semantic/src/main/docs/semantic-language.adoc 
b/components/camel-ai/camel-semantic/src/main/docs/semantic-language.adoc
index a180b2d45f6e..2dcf6a92fd57 100644
--- a/components/camel-ai/camel-semantic/src/main/docs/semantic-language.adoc
+++ b/components/camel-ai/camel-semantic/src/main/docs/semantic-language.adoc
@@ -136,15 +136,18 @@ The xref:others:yaml-dsl.adoc[YAML DSL] supports 
declarations alongside routes,
                   simple:
                     expression: "${exchangeProperty.department} == 'billing'"
                 steps:
-                  - to: direct:billing
+                  - to:
+                      uri: direct:billing
               - expression:
                   simple:
                     expression: "${exchangeProperty.department} == 'technical'"
                 steps:
-                  - to: direct:technical
+                  - to:
+                      uri: direct:technical
             otherwise:
               steps:
-                - to: direct:review
+                - to:
+                    uri: direct:review
 ----
 
 Names are context-wide. Duplicate declarations across resources and unknown 
references fail.
@@ -394,10 +397,12 @@ For example, replace the route above with:
                   simple:
                     expression: "${exchangeProperty.decision[department]} == 
'billing'"
                 steps:
-                  - to: direct:billing
+                  - to:
+                      uri: direct:billing
             otherwise:
               steps:
-                - to: direct:review
+                - to:
+                    uri: direct:review
 ----
 
 A result might contain `actionable -> true`, `department -> "billing"` and 
`urgency -> 1.2`.
diff --git 
a/components/camel-ai/camel-tensorflow-serving/src/main/docs/tensorflow-serving-component.adoc
 
b/components/camel-ai/camel-tensorflow-serving/src/main/docs/tensorflow-serving-component.adoc
index 8f98f3121cb8..0f3d5b3b7e32 100644
--- 
a/components/camel-ai/camel-tensorflow-serving/src/main/docs/tensorflow-serving-component.adoc
+++ 
b/components/camel-ai/camel-tensorflow-serving/src/main/docs/tensorflow-serving-component.adoc
@@ -190,10 +190,14 @@ YAML::
       steps:
         - setHeader:
             name: CamelTensorFlowServingModelName
-            constant: half_plus_two
+            expression:
+              constant:
+                expression: half_plus_two
         - setHeader:
             name: CamelTensorFlowServingModelVersion
-            constant: 123
+            expression:
+              constant:
+                expression: 123
         - to:
             uri: tensorflow-serving:model-status
         - log:
@@ -290,10 +294,14 @@ YAML::
       steps:
         - setHeader:
             name: CamelTensorFlowServingModelName
-            constant: half_plus_two
+            expression:
+              constant:
+                expression: half_plus_two
         - setHeader:
             name: CamelTensorFlowServingModelVersion
-            constant: 123
+            expression:
+              constant:
+                expression: 123
         - to:
             uri: tensorflow-serving:model-metadata
         - log:
diff --git a/components/camel-ai/src/main/docs/ai-llm-integration-guide.adoc 
b/components/camel-ai/src/main/docs/ai-llm-integration-guide.adoc
index e60ab002566e..7ae2d3fc1e96 100644
--- a/components/camel-ai/src/main/docs/ai-llm-integration-guide.adoc
+++ b/components/camel-ai/src/main/docs/ai-llm-integration-guide.adoc
@@ -66,7 +66,9 @@ For tasks like resume parsing, invoice extraction, or 
classification, **do not h
       uri: direct:extract-resume
       steps:
         - setBody:
-            simple: "${body}"
+            expression:
+              simple:
+                expression: "${body}"
         - to:
             uri: openai:chat-completion
             parameters:
@@ -159,13 +161,14 @@ The message body is the user prompt when no header 
overrides it:
 
 [source,yaml]
 ----
-- from:
-    uri: direct:ask
-    steps:
-      - to:
-          uri: openai:chat-completion
-          parameters:
-            model: gpt-4o-mini
+- route:
+    from:
+      uri: direct:ask
+      steps:
+        - to:
+            uri: openai:chat-completion
+            parameters:
+              model: gpt-4o-mini
 ----
 
 Send `"Summarize this CV: ..."` as the exchange body.
@@ -182,7 +185,9 @@ Use `CamelOpenAIUserMessage` to build prompts from exchange 
data:
       steps:
         - setHeader:
             name: CamelOpenAIUserMessage
-            simple: "Rate this candidate 1-10 for role ${header.jobTitle}. CV: 
${body}"
+            expression:
+              simple:
+                expression: "Rate this candidate 1-10 for role 
${header.jobTitle}. CV: ${body}"
         - to:
             uri: openai:chat-completion
             parameters:
@@ -199,17 +204,35 @@ Inline prompt strings in every route become hard to 
maintain. Common patterns:
 
 === External prompt files
 
-Load prompts from the classpath or file system and pass them as the body or 
via a processor:
+Keep a prompt in its own file as a Simple template, and load it with the 
`resource:` prefix: the template is read
+once and evaluated for each exchange, so `+${body}+` in it is the document the 
route received. For example
+`prompts/extract-resume.txt` on the classpath:
+
+[source,text]
+----
+Extract structured data from this resume. Use only facts present in the 
document.
+
+Document to parse:
+${body}
+----
+
+The route reads the resumes from a folder and sends each one with the prompt:
 
 [source,yaml]
 ----
-- from:
-    uri: file:prompts/extract-resume.txt?noop=true
-    steps:
-      - setHeader:
-          name: CamelOpenAIUserMessage
-          simple: "${body}\n\nDocument to 
parse:\n${exchangeProperty.documentText}"
-      - to: 
openai:chat-completion?jsonSchema=resource:classpath:schemas/resume.schema.json
+- route:
+    from:
+      uri: file:inbox/resumes
+      steps:
+        - setHeader:
+            name: CamelOpenAIUserMessage
+            expression:
+              simple:
+                expression: resource:classpath:prompts/extract-resume.txt
+        - to:
+            uri: openai:chat-completion
+            parameters:
+              jsonSchema: resource:classpath:schemas/resume.schema.json
 ----
 
 See xref:openai-component.adoc#_basic_chat_completion_with_string_input[OpenAI 
— file-based prompts].
@@ -244,20 +267,23 @@ With `streaming=true`, the OpenAI component returns an 
`Iterator<ChatCompletionC
 
 [source,yaml]
 ----
-- from:
-    uri: direct:stream-chat
-    steps:
-      - to:
-          uri: openai:chat-completion
-          parameters:
-            userMessage: Explain Apache Camel in one paragraph
+- route:
+    from:
+      uri: direct:stream-chat
+      steps:
+        - to:
+            uri: openai:chat-completion
+            parameters:
+              userMessage: Explain Apache Camel in one paragraph
+              streaming: true
+        - split:
             streaming: true
-      - split:
-          streaming: true
-          simple: ${body}
-          steps:
-            - log:
-                message: "chunk: ${body}"
+            expression:
+              simple:
+                expression: ${body}
+            steps:
+              - log:
+                  message: "chunk: ${body}"
 ----
 
 IMPORTANT: Conversation memory is **not** updated for streaming responses. Use 
non-streaming mode when you need multi-turn history on the same exchange.
@@ -385,11 +411,15 @@ A typical resume-processing pipeline (the use case from 
community feedback):
         # 1. Optional: extract text upstream (docling, tika, etc.)
         - setProperty:
             name: documentText
-            simple: "${body}"
+            expression:
+              simple:
+                expression: "${body}"
         # 2. Structured LLM extraction — no manual JSON parsing
         - setHeader:
             name: CamelOpenAIUserMessage
-            simple: "Extract candidate fields from this 
resume:\n\n${exchangeProperty.documentText}"
+            expression:
+              simple:
+                expression: "Extract candidate fields from this 
resume:\n\n${exchangeProperty.documentText}"
         - to:
             uri: openai:chat-completion
             parameters:
@@ -397,8 +427,10 @@ A typical resume-processing pipeline (the use case from 
community feedback):
               temperature: 0.1
               jsonSchema: resource:classpath:schemas/resume.schema.json
         # 3. Optional: validate then route to HR system
-        - to: 
json-validator:validate?schema=resource:classpath:schemas/resume.schema.json
-        - to: direct:store-candidate
+        - to:
+            uri: json-validator:classpath:schemas/resume.schema.json
+        - to:
+            uri: direct:store-candidate
 ----
 
 == Related documentation
diff --git a/components/camel-spiffe/src/main/docs/spiffe-component.adoc 
b/components/camel-spiffe/src/main/docs/spiffe-component.adoc
index dcb978c9e29a..61e453af99e0 100644
--- a/components/camel-spiffe/src/main/docs/spiffe-component.adoc
+++ b/components/camel-spiffe/src/main/docs/spiffe-component.adoc
@@ -100,16 +100,19 @@ Validate an incoming bearer token on a `platform-http` 
route, without a bean to
 
 [source,yaml]
 ------------------------------------------------------------
-- from:
-    uri: "platform-http:/api"
-    steps:
-      # the Authorization: Bearer <token> header is picked up automatically; 
validation replaces the body with the
-      # JwtSvid, so this fits a request whose payload is not needed afterwards
-      - to: 
"spiffe:auth?operation=validateJwtSvid&audience=spiffe://example.org/api"
-      # the token is a credential; drop it before the exchange goes further
-      - removeHeaders:
-          pattern: "Authorization"
-      - to: "direct:handleRequest"
+- route:
+    from:
+      uri: "platform-http:/api"
+      steps:
+        # the Authorization: Bearer <token> header is picked up automatically; 
validation replaces the body with the
+        # JwtSvid, so this fits a request whose payload is not needed 
afterwards
+        - to:
+            uri: 
"spiffe:auth?operation=validateJwtSvid&audience=spiffe://example.org/api"
+        # the token is a credential; drop it before the exchange goes further
+        - removeHeaders:
+            pattern: "Authorization"
+        - to:
+            uri: "direct:handleRequest"
 ------------------------------------------------------------
 
 A missing token fails with `IllegalArgumentException`; a rejected one 
(invalid, expired, or a wrong audience) fails
diff --git 
a/core/camel-core-engine/src/main/docs/modules/eips/pages/ai-patterns.adoc 
b/core/camel-core-engine/src/main/docs/modules/eips/pages/ai-patterns.adoc
index d77c72900306..b636dffa008f 100644
--- a/core/camel-core-engine/src/main/docs/modules/eips/pages/ai-patterns.adoc
+++ b/core/camel-core-engine/src/main/docs/modules/eips/pages/ai-patterns.adoc
@@ -212,6 +212,44 @@ See also the full 
xref:enterprise-integration-patterns.adoc[Enterprise Integrati
 |xref:languages:semantic-language.adoc[Semantic], xref:switch-eip.adoc[Switch]
 |Evaluate a Semantic choice question once and dispatch its category string 
through literal Switch cases.
 
+|Guardrail / Guard decision
+|xref:languages:semantic-language.adoc[Semantic], 
xref:ROOT:typesafe-ai-component.adoc[TypeSafe AI],
+xref:filter-eip.adoc[Filter], xref:validate-eip.adoc[Validate]
+|Ask a yes/no question about the message (is this request actionable, does 
this action fit the task) and filter or
+validate on the answer. A System One model such as Jev answers with a fast, 
structured decision instead of
+generated text.
+
+|Tool / Function calling
+|xref:ROOT:ai-tool-component.adoc[AI Tool]
+|Expose a route as a tool an AI agent can call. The same route works with the 
LangChain4j, Spring AI and OpenAI
+agents.
+
+|MCP server
+|xref:others:mcp-server.adoc[MCP Server], 
xref:ROOT:ai-resource-component.adoc[AI Resource]
+|Expose `ai-tool` routes as MCP tools and `ai-resource` routes as MCP 
resources to any MCP client.
+
+|MCP client
+|xref:others:langchain4j-agent-mcp.adoc[LangChain4j Agent MCP], 
xref:others:openai-mcp.adoc[OpenAI MCP]
+|Let an agent in a route call the tools of remote MCP servers.
+
+|Tool authorization / Agent permissions
+|xref:ROOT:ai-tool-component.adoc#_authorizing_tool_calls[AI Tool 
authorization],
+xref:ROOT:opa-component.adoc[OPA], xref:ROOT:openfga-component.adoc[OpenFGA]
+|Authorize every tool call before it runs, on the caller identity and the tool 
name, never on model output.
+
+|Agent identity / Workload identity
+|xref:ROOT:spiffe-component.adoc[SPIFFE]
+|Give each workload a cryptographic identity and mutual TLS, so a tool call 
can be authorized on who is calling.
+
+|LLM observability
+|xref:others:ai-observability.adoc[AI Observability]
+|Record an OpenTelemetry span and Micrometer metrics (model, tokens, duration) 
for each call of the LangChain4j, OpenAI
+and Spring AI chat producers, inside the route's trace.
+
+|RAG ingestion
+|xref:ROOT:langchain4j-ingest-component.adoc[LangChain4j Ingest]
+|Split, embed and store documents in an embedding store for 
retrieval-augmented generation.
+
 |Agent-to-Agent / A2A
 |xref:ROOT:a2a-component.adoc[A2A]
 |Google's Agent-to-Agent protocol for communication between AI agents.

Reply via email to