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.