Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view

Large diffs are not rendered by default.

Original file line number Diff line number Diff line change
Expand Up @@ -145,6 +145,58 @@ YAML::
----
====

=== Complex Parameters with argSchema

Use `argSchema` when the flat `parameter.*` syntax is not expressive enough for nested objects, arrays, or other advanced JSON Schema constructs. `argSchema` is mutually exclusive with `parameter.*`.

[tabs]
====
YAML::
+
[source,yaml]
----
- route:
from:
uri: ai-tool:createOrder
parameters:
tags: orders
description: "Create an order"
argSchema: |
{
"type": "object",
"properties": {
"customer": {
"type": "object",
"properties": {
"id": { "type": "string" }
},
"required": ["id"]
},
"items": {
"type": "array",
"items": {
"type": "object",
"properties": {
"sku": { "type": "string" },
"qty": { "type": "integer" }
}
}
}
},
"required": ["customer", "items"],
"additionalProperties": false
}
steps:
- to: direct:createOrder
----
====

Top-level schema properties are exposed as exchange headers. Nested values are passed as Map or List objects.

`argSchema` also supports Camel resource references such as `classpath:schemas/create-order.json`.

The root schema must be a JSON Schema object with a top-level `properties` map. Camel always allowlists top-level property names when invoking the tool route, even if the schema sets `additionalProperties: true`. Nested fields are not flattened into headers; only top-level properties become exchange headers (Map/List/primitive values).

=== Tag-Based Discovery

Tags group tools so that AI producers can select relevant subsets.
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -30,6 +30,8 @@ private org.apache.camel.component.ai.tool.AiToolConfiguration getOrCreateConfig
public boolean configure(CamelContext camelContext, Object obj, String name, Object value, boolean ignoreCase) {
AiToolComponent target = (AiToolComponent) obj;
switch (ignoreCase ? name.toLowerCase() : name) {
case "argschema":
case "argSchema": getOrCreateConfiguration(target).setArgSchema(property(camelContext, java.lang.String.class, value)); return true;
case "autowiredenabled":
case "autowiredEnabled": target.setAutowiredEnabled(property(camelContext, boolean.class, value)); return true;
case "bridgeerrorhandler":
Expand All @@ -45,6 +47,8 @@ public boolean configure(CamelContext camelContext, Object obj, String name, Obj
@Override
public Class<?> getOptionType(String name, boolean ignoreCase) {
switch (ignoreCase ? name.toLowerCase() : name) {
case "argschema":
case "argSchema": return java.lang.String.class;
case "autowiredenabled":
case "autowiredEnabled": return boolean.class;
case "bridgeerrorhandler":
Expand All @@ -61,6 +65,8 @@ public Class<?> getOptionType(String name, boolean ignoreCase) {
public Object getOptionValue(Object obj, String name, boolean ignoreCase) {
AiToolComponent target = (AiToolComponent) obj;
switch (ignoreCase ? name.toLowerCase() : name) {
case "argschema":
case "argSchema": return getOrCreateConfiguration(target).getArgSchema();
case "autowiredenabled":
case "autowiredEnabled": return target.isAutowiredEnabled();
case "bridgeerrorhandler":
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -23,6 +23,8 @@ public class AiToolConfigurationConfigurer extends org.apache.camel.support.comp
public boolean configure(CamelContext camelContext, Object obj, String name, Object value, boolean ignoreCase) {
org.apache.camel.component.ai.tool.AiToolConfiguration target = (org.apache.camel.component.ai.tool.AiToolConfiguration) obj;
switch (ignoreCase ? name.toLowerCase() : name) {
case "argschema":
case "argSchema": target.setArgSchema(property(camelContext, java.lang.String.class, value)); return true;
case "description": target.setDescription(property(camelContext, java.lang.String.class, value)); return true;
case "parameters": target.setParameters(property(camelContext, java.util.Map.class, value)); return true;
case "tags": target.setTags(property(camelContext, java.lang.String.class, value)); return true;
Expand All @@ -33,6 +35,8 @@ public boolean configure(CamelContext camelContext, Object obj, String name, Obj
@Override
public Class<?> getOptionType(String name, boolean ignoreCase) {
switch (ignoreCase ? name.toLowerCase() : name) {
case "argschema":
case "argSchema": return java.lang.String.class;
case "description": return java.lang.String.class;
case "parameters": return java.util.Map.class;
case "tags": return java.lang.String.class;
Expand All @@ -44,6 +48,8 @@ public Class<?> getOptionType(String name, boolean ignoreCase) {
public Object getOptionValue(Object obj, String name, boolean ignoreCase) {
org.apache.camel.component.ai.tool.AiToolConfiguration target = (org.apache.camel.component.ai.tool.AiToolConfiguration) obj;
switch (ignoreCase ? name.toLowerCase() : name) {
case "argschema":
case "argSchema": return target.getArgSchema();
case "description": return target.getDescription();
case "parameters": return target.getParameters();
case "tags": return target.getTags();
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -23,6 +23,8 @@ public class AiToolEndpointConfigurer extends PropertyConfigurerSupport implemen
public boolean configure(CamelContext camelContext, Object obj, String name, Object value, boolean ignoreCase) {
AiToolEndpoint target = (AiToolEndpoint) obj;
switch (ignoreCase ? name.toLowerCase() : name) {
case "argschema":
case "argSchema": target.getConfiguration().setArgSchema(property(camelContext, java.lang.String.class, value)); return true;
case "bridgeerrorhandler":
case "bridgeErrorHandler": target.setBridgeErrorHandler(property(camelContext, boolean.class, value)); return true;
case "description": target.getConfiguration().setDescription(property(camelContext, java.lang.String.class, value)); return true;
Expand All @@ -39,6 +41,8 @@ public boolean configure(CamelContext camelContext, Object obj, String name, Obj
@Override
public Class<?> getOptionType(String name, boolean ignoreCase) {
switch (ignoreCase ? name.toLowerCase() : name) {
case "argschema":
case "argSchema": return java.lang.String.class;
case "bridgeerrorhandler":
case "bridgeErrorHandler": return boolean.class;
case "description": return java.lang.String.class;
Expand All @@ -56,6 +60,8 @@ public Class<?> getOptionType(String name, boolean ignoreCase) {
public Object getOptionValue(Object obj, String name, boolean ignoreCase) {
AiToolEndpoint target = (AiToolEndpoint) obj;
switch (ignoreCase ? name.toLowerCase() : name) {
case "argschema":
case "argSchema": return target.getConfiguration().getArgSchema();
case "bridgeerrorhandler":
case "bridgeErrorHandler": return target.isBridgeErrorHandler();
case "description": return target.getConfiguration().getDescription();
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -24,7 +24,8 @@ public class AiToolEndpointUriFactory extends org.apache.camel.support.component
private static final Set<String> ENDPOINT_IDENTITY_PROPERTY_NAMES;
private static final Map<String, String> MULTI_VALUE_PREFIXES;
static {
Set<String> props = new HashSet<>(7);
Set<String> props = new HashSet<>(8);
props.add("argSchema");
props.add("bridgeErrorHandler");
props.add("description");
props.add("exceptionHandler");
Expand Down
Loading