This is an automated email from the ASF dual-hosted git repository. jpoth pushed a commit to branch main in repository https://gitbox.apache.org/repos/asf/camel.git
commit 7f9f16ff41d5862bcb5be7e158838e736d11cd36 Author: John Poth <[email protected]> AuthorDate: Fri Feb 27 11:41:31 2026 +0100 CAMEL-22545 add poolingMode option --- .../HuggingFaceComponentConfigurer.java | 3 ++ .../huggingface/HuggingFaceEndpointConfigurer.java | 3 ++ .../huggingface/HuggingFaceEndpointUriFactory.java | 3 +- .../camel/component/huggingface/huggingface.json | 42 +++++++++++----------- .../huggingface/HuggingFaceConfiguration.java | 12 +++++++ .../huggingface/tasks/AbstractTaskPredictor.java | 20 +++++++++-- 6 files changed, 59 insertions(+), 24 deletions(-) diff --git a/components/camel-ai/camel-huggingface/src/generated/java/org/apache/camel/component/huggingface/HuggingFaceComponentConfigurer.java b/components/camel-ai/camel-huggingface/src/generated/java/org/apache/camel/component/huggingface/HuggingFaceComponentConfigurer.java index c069a858d910..050e6f5ac8c5 100644 --- a/components/camel-ai/camel-huggingface/src/generated/java/org/apache/camel/component/huggingface/HuggingFaceComponentConfigurer.java +++ b/components/camel-ai/camel-huggingface/src/generated/java/org/apache/camel/component/huggingface/HuggingFaceComponentConfigurer.java @@ -58,6 +58,7 @@ public class HuggingFaceComponentConfigurer extends PropertyConfigurerSupport im case "multiLabel": getOrCreateConfiguration(target).setMultiLabel(property(camelContext, boolean.class, value)); return true; case "oauthprofile": case "oauthProfile": getOrCreateConfiguration(target).setOauthProfile(property(camelContext, java.lang.String.class, value)); return true; + case "pooling": getOrCreateConfiguration(target).setPooling(property(camelContext, boolean.class, value)); return true; case "predicttimeout": case "predictTimeout": getOrCreateConfiguration(target).setPredictTimeout(property(camelContext, int.class, value)); return true; case "predictorbean": @@ -105,6 +106,7 @@ public class HuggingFaceComponentConfigurer extends PropertyConfigurerSupport im case "multiLabel": return boolean.class; case "oauthprofile": case "oauthProfile": return java.lang.String.class; + case "pooling": return boolean.class; case "predicttimeout": case "predictTimeout": return int.class; case "predictorbean": @@ -153,6 +155,7 @@ public class HuggingFaceComponentConfigurer extends PropertyConfigurerSupport im case "multiLabel": return getOrCreateConfiguration(target).isMultiLabel(); case "oauthprofile": case "oauthProfile": return getOrCreateConfiguration(target).getOauthProfile(); + case "pooling": return getOrCreateConfiguration(target).isPooling(); case "predicttimeout": case "predictTimeout": return getOrCreateConfiguration(target).getPredictTimeout(); case "predictorbean": diff --git a/components/camel-ai/camel-huggingface/src/generated/java/org/apache/camel/component/huggingface/HuggingFaceEndpointConfigurer.java b/components/camel-ai/camel-huggingface/src/generated/java/org/apache/camel/component/huggingface/HuggingFaceEndpointConfigurer.java index 1a18ecc45a1a..5e1496dc8c33 100644 --- a/components/camel-ai/camel-huggingface/src/generated/java/org/apache/camel/component/huggingface/HuggingFaceEndpointConfigurer.java +++ b/components/camel-ai/camel-huggingface/src/generated/java/org/apache/camel/component/huggingface/HuggingFaceEndpointConfigurer.java @@ -44,6 +44,7 @@ public class HuggingFaceEndpointConfigurer extends PropertyConfigurerSupport imp case "multiLabel": target.getConfiguration().setMultiLabel(property(camelContext, boolean.class, value)); return true; case "oauthprofile": case "oauthProfile": target.getConfiguration().setOauthProfile(property(camelContext, java.lang.String.class, value)); return true; + case "pooling": target.getConfiguration().setPooling(property(camelContext, boolean.class, value)); return true; case "predicttimeout": case "predictTimeout": target.getConfiguration().setPredictTimeout(property(camelContext, int.class, value)); return true; case "predictorbean": @@ -84,6 +85,7 @@ public class HuggingFaceEndpointConfigurer extends PropertyConfigurerSupport imp case "multiLabel": return boolean.class; case "oauthprofile": case "oauthProfile": return java.lang.String.class; + case "pooling": return boolean.class; case "predicttimeout": case "predictTimeout": return int.class; case "predictorbean": @@ -125,6 +127,7 @@ public class HuggingFaceEndpointConfigurer extends PropertyConfigurerSupport imp case "multiLabel": return target.getConfiguration().isMultiLabel(); case "oauthprofile": case "oauthProfile": return target.getConfiguration().getOauthProfile(); + case "pooling": return target.getConfiguration().isPooling(); case "predicttimeout": case "predictTimeout": return target.getConfiguration().getPredictTimeout(); case "predictorbean": diff --git a/components/camel-ai/camel-huggingface/src/generated/java/org/apache/camel/component/huggingface/HuggingFaceEndpointUriFactory.java b/components/camel-ai/camel-huggingface/src/generated/java/org/apache/camel/component/huggingface/HuggingFaceEndpointUriFactory.java index bb17f2ca65bd..2734be93d9a0 100644 --- a/components/camel-ai/camel-huggingface/src/generated/java/org/apache/camel/component/huggingface/HuggingFaceEndpointUriFactory.java +++ b/components/camel-ai/camel-huggingface/src/generated/java/org/apache/camel/component/huggingface/HuggingFaceEndpointUriFactory.java @@ -23,7 +23,7 @@ public class HuggingFaceEndpointUriFactory extends org.apache.camel.support.comp private static final Set<String> SECRET_PROPERTY_NAMES; private static final Map<String, String> MULTI_VALUE_PREFIXES; static { - Set<String> props = new HashSet<>(19); + Set<String> props = new HashSet<>(20); props.add("authToken"); props.add("autoSelect"); props.add("device"); @@ -35,6 +35,7 @@ public class HuggingFaceEndpointUriFactory extends org.apache.camel.support.comp props.add("modelLoadingTimeout"); props.add("multiLabel"); props.add("oauthProfile"); + props.add("pooling"); props.add("predictTimeout"); props.add("predictorBean"); props.add("revision"); diff --git a/components/camel-ai/camel-huggingface/src/generated/resources/META-INF/org/apache/camel/component/huggingface/huggingface.json b/components/camel-ai/camel-huggingface/src/generated/resources/META-INF/org/apache/camel/component/huggingface/huggingface.json index 24de317f56e4..0be8cb797bbd 100644 --- a/components/camel-ai/camel-huggingface/src/generated/resources/META-INF/org/apache/camel/component/huggingface/huggingface.json +++ b/components/camel-ai/camel-huggingface/src/generated/resources/META-INF/org/apache/camel/component/huggingface/huggingface.json @@ -35,17 +35,18 @@ "modelId": { "index": 8, "kind": "property", "displayName": "Model Id", "group": "producer", "label": "", "required": true, "type": "string", "javaType": "java.lang.String", "deprecated": false, "deprecationNote": "", "autowired": false, "secret": false, "configurationClass": "org.apache.camel.component.huggingface.HuggingFaceConfiguration", "configurationField": "configuration", "description": "Hugging Face model ID (e.g., distilbert-base-uncased-finetuned-sst-2-english)" }, "modelLoadingTimeout": { "index": 9, "kind": "property", "displayName": "Model Loading Timeout", "group": "producer", "label": "", "required": false, "type": "integer", "javaType": "int", "deprecated": false, "deprecationNote": "", "autowired": false, "secret": false, "configurationClass": "org.apache.camel.component.huggingface.HuggingFaceConfiguration", "configurationField": "configuration", "description": "Model loading timeout in seconds, if negative then use default (240 seconds)" }, "multiLabel": { "index": 10, "kind": "property", "displayName": "Multi Label", "group": "producer", "label": "", "required": false, "type": "boolean", "javaType": "boolean", "deprecated": false, "deprecationNote": "", "autowired": false, "secret": false, "defaultValue": false, "configurationClass": "org.apache.camel.component.huggingface.HuggingFaceConfiguration", "configurationField": "configuration", "description": "Allow multi-label classifications for zero-shot tasks" }, - "predictorBean": { "index": 11, "kind": "property", "displayName": "Predictor Bean", "group": "producer", "label": "", "required": false, "type": "string", "javaType": "java.lang.String", "deprecated": false, "deprecationNote": "", "autowired": false, "secret": false, "configurationClass": "org.apache.camel.component.huggingface.HuggingFaceConfiguration", "configurationField": "configuration", "description": "Bean name of a custom TaskPredictor implementation (for tasks not covered b [...] - "predictTimeout": { "index": 12, "kind": "property", "displayName": "Predict Timeout", "group": "producer", "label": "", "required": false, "type": "integer", "javaType": "int", "deprecated": false, "deprecationNote": "", "autowired": false, "secret": false, "configurationClass": "org.apache.camel.component.huggingface.HuggingFaceConfiguration", "configurationField": "configuration", "description": "Predict timeout in seconds, if negative then use default (120 seconds)" }, - "revision": { "index": 13, "kind": "property", "displayName": "Revision", "group": "producer", "label": "", "required": false, "type": "string", "javaType": "java.lang.String", "deprecated": false, "deprecationNote": "", "autowired": false, "secret": false, "configurationClass": "org.apache.camel.component.huggingface.HuggingFaceConfiguration", "configurationField": "configuration", "description": "Model revision or branch (default: main)" }, - "systemPrompt": { "index": 14, "kind": "property", "displayName": "System Prompt", "group": "producer", "label": "", "required": false, "type": "string", "javaType": "java.lang.String", "deprecated": false, "deprecationNote": "", "autowired": false, "secret": false, "configurationClass": "org.apache.camel.component.huggingface.HuggingFaceConfiguration", "configurationField": "configuration", "description": "Initial system prompt for chat tasks (e.g., 'You are a helpful assistant name [...] - "temperature": { "index": 15, "kind": "property", "displayName": "Temperature", "group": "producer", "label": "", "required": false, "type": "number", "javaType": "float", "deprecated": false, "deprecationNote": "", "autowired": false, "secret": false, "configurationClass": "org.apache.camel.component.huggingface.HuggingFaceConfiguration", "configurationField": "configuration", "description": "Temperature for sampling (0.0-1.0)" }, - "topK": { "index": 16, "kind": "property", "displayName": "Top K", "group": "producer", "label": "", "required": false, "type": "integer", "javaType": "int", "deprecated": false, "autowired": false, "secret": false, "defaultValue": 5, "configurationClass": "org.apache.camel.component.huggingface.HuggingFaceConfiguration", "configurationField": "configuration", "description": "Top-k parameter for classification tasks" }, - "userRole": { "index": 17, "kind": "property", "displayName": "User Role", "group": "producer", "label": "", "required": false, "type": "string", "javaType": "java.lang.String", "deprecated": false, "autowired": false, "secret": false, "defaultValue": "user", "configurationClass": "org.apache.camel.component.huggingface.HuggingFaceConfiguration", "configurationField": "configuration", "description": "Role for user messages in chat history (e.g., 'user' or 'human')" }, - "autowiredEnabled": { "index": 18, "kind": "property", "displayName": "Autowired Enabled", "group": "advanced", "label": "advanced", "required": false, "type": "boolean", "javaType": "boolean", "deprecated": false, "autowired": false, "secret": false, "defaultValue": true, "description": "Whether autowiring is enabled. This is used for automatic autowiring options (the option must be marked as autowired) by looking up in the registry to find if there is a single instance of matching [...] - "healthCheckConsumerEnabled": { "index": 19, "kind": "property", "displayName": "Health Check Consumer Enabled", "group": "health", "label": "health", "required": false, "type": "boolean", "javaType": "boolean", "deprecated": false, "autowired": false, "secret": false, "defaultValue": true, "description": "Used for enabling or disabling all consumer based health checks from this component" }, - "healthCheckProducerEnabled": { "index": 20, "kind": "property", "displayName": "Health Check Producer Enabled", "group": "health", "label": "health", "required": false, "type": "boolean", "javaType": "boolean", "deprecated": false, "autowired": false, "secret": false, "defaultValue": true, "description": "Used for enabling or disabling all producer based health checks from this component. Notice: Camel has by default disabled all producer based health-checks. You can turn on produce [...] - "oauthProfile": { "index": 21, "kind": "property", "displayName": "Oauth Profile", "group": "security", "label": "security", "required": false, "type": "string", "javaType": "java.lang.String", "deprecated": false, "deprecationNote": "", "autowired": false, "secret": false, "configurationClass": "org.apache.camel.component.huggingface.HuggingFaceConfiguration", "configurationField": "configuration", "description": "OAuth profile name for obtaining an access token via the OAuth 2.0 Cl [...] + "pooling": { "index": 11, "kind": "property", "displayName": "Pooling", "group": "producer", "label": "", "required": false, "type": "boolean", "javaType": "boolean", "deprecated": false, "autowired": false, "secret": false, "defaultValue": true, "configurationClass": "org.apache.camel.component.huggingface.HuggingFaceConfiguration", "configurationField": "configuration", "description": "Whether to pool the predictor (keep the Python process alive) or create a new one for each request" }, + "predictorBean": { "index": 12, "kind": "property", "displayName": "Predictor Bean", "group": "producer", "label": "", "required": false, "type": "string", "javaType": "java.lang.String", "deprecated": false, "deprecationNote": "", "autowired": false, "secret": false, "configurationClass": "org.apache.camel.component.huggingface.HuggingFaceConfiguration", "configurationField": "configuration", "description": "Bean name of a custom TaskPredictor implementation (for tasks not covered b [...] + "predictTimeout": { "index": 13, "kind": "property", "displayName": "Predict Timeout", "group": "producer", "label": "", "required": false, "type": "integer", "javaType": "int", "deprecated": false, "deprecationNote": "", "autowired": false, "secret": false, "configurationClass": "org.apache.camel.component.huggingface.HuggingFaceConfiguration", "configurationField": "configuration", "description": "Predict timeout in seconds, if negative then use default (120 seconds)" }, + "revision": { "index": 14, "kind": "property", "displayName": "Revision", "group": "producer", "label": "", "required": false, "type": "string", "javaType": "java.lang.String", "deprecated": false, "deprecationNote": "", "autowired": false, "secret": false, "configurationClass": "org.apache.camel.component.huggingface.HuggingFaceConfiguration", "configurationField": "configuration", "description": "Model revision or branch (default: main)" }, + "systemPrompt": { "index": 15, "kind": "property", "displayName": "System Prompt", "group": "producer", "label": "", "required": false, "type": "string", "javaType": "java.lang.String", "deprecated": false, "deprecationNote": "", "autowired": false, "secret": false, "configurationClass": "org.apache.camel.component.huggingface.HuggingFaceConfiguration", "configurationField": "configuration", "description": "Initial system prompt for chat tasks (e.g., 'You are a helpful assistant name [...] + "temperature": { "index": 16, "kind": "property", "displayName": "Temperature", "group": "producer", "label": "", "required": false, "type": "number", "javaType": "float", "deprecated": false, "deprecationNote": "", "autowired": false, "secret": false, "configurationClass": "org.apache.camel.component.huggingface.HuggingFaceConfiguration", "configurationField": "configuration", "description": "Temperature for sampling (0.0-1.0)" }, + "topK": { "index": 17, "kind": "property", "displayName": "Top K", "group": "producer", "label": "", "required": false, "type": "integer", "javaType": "int", "deprecated": false, "autowired": false, "secret": false, "defaultValue": 5, "configurationClass": "org.apache.camel.component.huggingface.HuggingFaceConfiguration", "configurationField": "configuration", "description": "Top-k parameter for classification tasks" }, + "userRole": { "index": 18, "kind": "property", "displayName": "User Role", "group": "producer", "label": "", "required": false, "type": "string", "javaType": "java.lang.String", "deprecated": false, "autowired": false, "secret": false, "defaultValue": "user", "configurationClass": "org.apache.camel.component.huggingface.HuggingFaceConfiguration", "configurationField": "configuration", "description": "Role for user messages in chat history (e.g., 'user' or 'human')" }, + "autowiredEnabled": { "index": 19, "kind": "property", "displayName": "Autowired Enabled", "group": "advanced", "label": "advanced", "required": false, "type": "boolean", "javaType": "boolean", "deprecated": false, "autowired": false, "secret": false, "defaultValue": true, "description": "Whether autowiring is enabled. This is used for automatic autowiring options (the option must be marked as autowired) by looking up in the registry to find if there is a single instance of matching [...] + "healthCheckConsumerEnabled": { "index": 20, "kind": "property", "displayName": "Health Check Consumer Enabled", "group": "health", "label": "health", "required": false, "type": "boolean", "javaType": "boolean", "deprecated": false, "autowired": false, "secret": false, "defaultValue": true, "description": "Used for enabling or disabling all consumer based health checks from this component" }, + "healthCheckProducerEnabled": { "index": 21, "kind": "property", "displayName": "Health Check Producer Enabled", "group": "health", "label": "health", "required": false, "type": "boolean", "javaType": "boolean", "deprecated": false, "autowired": false, "secret": false, "defaultValue": true, "description": "Used for enabling or disabling all producer based health checks from this component. Notice: Camel has by default disabled all producer based health-checks. You can turn on produce [...] + "oauthProfile": { "index": 22, "kind": "property", "displayName": "Oauth Profile", "group": "security", "label": "security", "required": false, "type": "string", "javaType": "java.lang.String", "deprecated": false, "deprecationNote": "", "autowired": false, "secret": false, "configurationClass": "org.apache.camel.component.huggingface.HuggingFaceConfiguration", "configurationField": "configuration", "description": "OAuth profile name for obtaining an access token via the OAuth 2.0 Cl [...] }, "headers": { "CamelHuggingFaceOutput": { "index": 0, "kind": "header", "displayName": "", "group": "producer", "label": "", "required": false, "javaType": "String", "deprecated": false, "deprecationNote": "", "autowired": false, "secret": false, "description": "The output from the model", "constantName": "org.apache.camel.component.huggingface.HuggingFaceConstants#OUTPUT" } @@ -61,14 +62,15 @@ "modelId": { "index": 7, "kind": "parameter", "displayName": "Model Id", "group": "producer", "label": "", "required": true, "type": "string", "javaType": "java.lang.String", "deprecated": false, "deprecationNote": "", "autowired": false, "secret": false, "configurationClass": "org.apache.camel.component.huggingface.HuggingFaceConfiguration", "configurationField": "configuration", "description": "Hugging Face model ID (e.g., distilbert-base-uncased-finetuned-sst-2-english)" }, "modelLoadingTimeout": { "index": 8, "kind": "parameter", "displayName": "Model Loading Timeout", "group": "producer", "label": "", "required": false, "type": "integer", "javaType": "int", "deprecated": false, "deprecationNote": "", "autowired": false, "secret": false, "configurationClass": "org.apache.camel.component.huggingface.HuggingFaceConfiguration", "configurationField": "configuration", "description": "Model loading timeout in seconds, if negative then use default (240 seconds)" }, "multiLabel": { "index": 9, "kind": "parameter", "displayName": "Multi Label", "group": "producer", "label": "", "required": false, "type": "boolean", "javaType": "boolean", "deprecated": false, "deprecationNote": "", "autowired": false, "secret": false, "defaultValue": false, "configurationClass": "org.apache.camel.component.huggingface.HuggingFaceConfiguration", "configurationField": "configuration", "description": "Allow multi-label classifications for zero-shot tasks" }, - "predictorBean": { "index": 10, "kind": "parameter", "displayName": "Predictor Bean", "group": "producer", "label": "", "required": false, "type": "string", "javaType": "java.lang.String", "deprecated": false, "deprecationNote": "", "autowired": false, "secret": false, "configurationClass": "org.apache.camel.component.huggingface.HuggingFaceConfiguration", "configurationField": "configuration", "description": "Bean name of a custom TaskPredictor implementation (for tasks not covered [...] - "predictTimeout": { "index": 11, "kind": "parameter", "displayName": "Predict Timeout", "group": "producer", "label": "", "required": false, "type": "integer", "javaType": "int", "deprecated": false, "deprecationNote": "", "autowired": false, "secret": false, "configurationClass": "org.apache.camel.component.huggingface.HuggingFaceConfiguration", "configurationField": "configuration", "description": "Predict timeout in seconds, if negative then use default (120 seconds)" }, - "revision": { "index": 12, "kind": "parameter", "displayName": "Revision", "group": "producer", "label": "", "required": false, "type": "string", "javaType": "java.lang.String", "deprecated": false, "deprecationNote": "", "autowired": false, "secret": false, "configurationClass": "org.apache.camel.component.huggingface.HuggingFaceConfiguration", "configurationField": "configuration", "description": "Model revision or branch (default: main)" }, - "systemPrompt": { "index": 13, "kind": "parameter", "displayName": "System Prompt", "group": "producer", "label": "", "required": false, "type": "string", "javaType": "java.lang.String", "deprecated": false, "deprecationNote": "", "autowired": false, "secret": false, "configurationClass": "org.apache.camel.component.huggingface.HuggingFaceConfiguration", "configurationField": "configuration", "description": "Initial system prompt for chat tasks (e.g., 'You are a helpful assistant nam [...] - "temperature": { "index": 14, "kind": "parameter", "displayName": "Temperature", "group": "producer", "label": "", "required": false, "type": "number", "javaType": "float", "deprecated": false, "deprecationNote": "", "autowired": false, "secret": false, "configurationClass": "org.apache.camel.component.huggingface.HuggingFaceConfiguration", "configurationField": "configuration", "description": "Temperature for sampling (0.0-1.0)" }, - "topK": { "index": 15, "kind": "parameter", "displayName": "Top K", "group": "producer", "label": "", "required": false, "type": "integer", "javaType": "int", "deprecated": false, "autowired": false, "secret": false, "defaultValue": 5, "configurationClass": "org.apache.camel.component.huggingface.HuggingFaceConfiguration", "configurationField": "configuration", "description": "Top-k parameter for classification tasks" }, - "userRole": { "index": 16, "kind": "parameter", "displayName": "User Role", "group": "producer", "label": "", "required": false, "type": "string", "javaType": "java.lang.String", "deprecated": false, "autowired": false, "secret": false, "defaultValue": "user", "configurationClass": "org.apache.camel.component.huggingface.HuggingFaceConfiguration", "configurationField": "configuration", "description": "Role for user messages in chat history (e.g., 'user' or 'human')" }, - "lazyStartProducer": { "index": 17, "kind": "parameter", "displayName": "Lazy Start Producer", "group": "producer (advanced)", "label": "producer,advanced", "required": false, "type": "boolean", "javaType": "boolean", "deprecated": false, "autowired": false, "secret": false, "defaultValue": false, "description": "Whether the producer should be started lazy (on the first message). By starting lazy you can use this to allow CamelContext and routes to startup in situations where a produ [...] - "oauthProfile": { "index": 18, "kind": "parameter", "displayName": "Oauth Profile", "group": "security", "label": "security", "required": false, "type": "string", "javaType": "java.lang.String", "deprecated": false, "deprecationNote": "", "autowired": false, "secret": false, "configurationClass": "org.apache.camel.component.huggingface.HuggingFaceConfiguration", "configurationField": "configuration", "description": "OAuth profile name for obtaining an access token via the OAuth 2.0 C [...] + "pooling": { "index": 10, "kind": "parameter", "displayName": "Pooling", "group": "producer", "label": "", "required": false, "type": "boolean", "javaType": "boolean", "deprecated": false, "autowired": false, "secret": false, "defaultValue": true, "configurationClass": "org.apache.camel.component.huggingface.HuggingFaceConfiguration", "configurationField": "configuration", "description": "Whether to pool the predictor (keep the Python process alive) or create a new one for each request" }, + "predictorBean": { "index": 11, "kind": "parameter", "displayName": "Predictor Bean", "group": "producer", "label": "", "required": false, "type": "string", "javaType": "java.lang.String", "deprecated": false, "deprecationNote": "", "autowired": false, "secret": false, "configurationClass": "org.apache.camel.component.huggingface.HuggingFaceConfiguration", "configurationField": "configuration", "description": "Bean name of a custom TaskPredictor implementation (for tasks not covered [...] + "predictTimeout": { "index": 12, "kind": "parameter", "displayName": "Predict Timeout", "group": "producer", "label": "", "required": false, "type": "integer", "javaType": "int", "deprecated": false, "deprecationNote": "", "autowired": false, "secret": false, "configurationClass": "org.apache.camel.component.huggingface.HuggingFaceConfiguration", "configurationField": "configuration", "description": "Predict timeout in seconds, if negative then use default (120 seconds)" }, + "revision": { "index": 13, "kind": "parameter", "displayName": "Revision", "group": "producer", "label": "", "required": false, "type": "string", "javaType": "java.lang.String", "deprecated": false, "deprecationNote": "", "autowired": false, "secret": false, "configurationClass": "org.apache.camel.component.huggingface.HuggingFaceConfiguration", "configurationField": "configuration", "description": "Model revision or branch (default: main)" }, + "systemPrompt": { "index": 14, "kind": "parameter", "displayName": "System Prompt", "group": "producer", "label": "", "required": false, "type": "string", "javaType": "java.lang.String", "deprecated": false, "deprecationNote": "", "autowired": false, "secret": false, "configurationClass": "org.apache.camel.component.huggingface.HuggingFaceConfiguration", "configurationField": "configuration", "description": "Initial system prompt for chat tasks (e.g., 'You are a helpful assistant nam [...] + "temperature": { "index": 15, "kind": "parameter", "displayName": "Temperature", "group": "producer", "label": "", "required": false, "type": "number", "javaType": "float", "deprecated": false, "deprecationNote": "", "autowired": false, "secret": false, "configurationClass": "org.apache.camel.component.huggingface.HuggingFaceConfiguration", "configurationField": "configuration", "description": "Temperature for sampling (0.0-1.0)" }, + "topK": { "index": 16, "kind": "parameter", "displayName": "Top K", "group": "producer", "label": "", "required": false, "type": "integer", "javaType": "int", "deprecated": false, "autowired": false, "secret": false, "defaultValue": 5, "configurationClass": "org.apache.camel.component.huggingface.HuggingFaceConfiguration", "configurationField": "configuration", "description": "Top-k parameter for classification tasks" }, + "userRole": { "index": 17, "kind": "parameter", "displayName": "User Role", "group": "producer", "label": "", "required": false, "type": "string", "javaType": "java.lang.String", "deprecated": false, "autowired": false, "secret": false, "defaultValue": "user", "configurationClass": "org.apache.camel.component.huggingface.HuggingFaceConfiguration", "configurationField": "configuration", "description": "Role for user messages in chat history (e.g., 'user' or 'human')" }, + "lazyStartProducer": { "index": 18, "kind": "parameter", "displayName": "Lazy Start Producer", "group": "producer (advanced)", "label": "producer,advanced", "required": false, "type": "boolean", "javaType": "boolean", "deprecated": false, "autowired": false, "secret": false, "defaultValue": false, "description": "Whether the producer should be started lazy (on the first message). By starting lazy you can use this to allow CamelContext and routes to startup in situations where a produ [...] + "oauthProfile": { "index": 19, "kind": "parameter", "displayName": "Oauth Profile", "group": "security", "label": "security", "required": false, "type": "string", "javaType": "java.lang.String", "deprecated": false, "deprecationNote": "", "autowired": false, "secret": false, "configurationClass": "org.apache.camel.component.huggingface.HuggingFaceConfiguration", "configurationField": "configuration", "description": "OAuth profile name for obtaining an access token via the OAuth 2.0 C [...] } } diff --git a/components/camel-ai/camel-huggingface/src/main/java/org/apache/camel/component/huggingface/HuggingFaceConfiguration.java b/components/camel-ai/camel-huggingface/src/main/java/org/apache/camel/component/huggingface/HuggingFaceConfiguration.java index 7b7e827548b9..c3709d5b009a 100644 --- a/components/camel-ai/camel-huggingface/src/main/java/org/apache/camel/component/huggingface/HuggingFaceConfiguration.java +++ b/components/camel-ai/camel-huggingface/src/main/java/org/apache/camel/component/huggingface/HuggingFaceConfiguration.java @@ -99,6 +99,18 @@ public class HuggingFaceConfiguration implements Cloneable { @UriParam(defaultValue = "5", description = "Top-k parameter for classification tasks") private int topK = 5; + @UriParam(defaultValue = "true", + description = "Whether to pool the predictor (keep the Python process alive) or create a new one for each request") + private boolean pooling = true; + + public boolean isPooling() { + return pooling; + } + + public void setPooling(boolean pooling) { + this.pooling = pooling; + } + public int getTopK() { return topK; } diff --git a/components/camel-ai/camel-huggingface/src/main/java/org/apache/camel/component/huggingface/tasks/AbstractTaskPredictor.java b/components/camel-ai/camel-huggingface/src/main/java/org/apache/camel/component/huggingface/tasks/AbstractTaskPredictor.java index f67640d0755a..bc08beff3265 100644 --- a/components/camel-ai/camel-huggingface/src/main/java/org/apache/camel/component/huggingface/tasks/AbstractTaskPredictor.java +++ b/components/camel-ai/camel-huggingface/src/main/java/org/apache/camel/component/huggingface/tasks/AbstractTaskPredictor.java @@ -44,6 +44,7 @@ public abstract class AbstractTaskPredictor implements TaskPredictor { protected HuggingFaceEndpoint endpoint; protected HuggingFaceConfiguration config; protected ZooModel<Input, Output> model; + protected Predictor<Input, Output> predictor; protected Path tmpDir; protected AbstractTaskPredictor(HuggingFaceEndpoint endpoint) { @@ -118,9 +119,19 @@ public abstract class AbstractTaskPredictor implements TaskPredictor { @Override public void predict(Exchange exchange) throws Exception { Input input = prepareInput(exchange); - try (Predictor<Input, Output> djlPredictor = model.newPredictor()) { - Output output = djlPredictor.predict(input); - processOutput(exchange, output); + if (config.isPooling()) { + synchronized (this) { + if (predictor == null) { + predictor = model.newPredictor(); + } + Output output = predictor.predict(input); + processOutput(exchange, output); + } + } else { + try (Predictor<Input, Output> djlPredictor = model.newPredictor()) { + Output output = djlPredictor.predict(input); + processOutput(exchange, output); + } } } @@ -130,6 +141,9 @@ public abstract class AbstractTaskPredictor implements TaskPredictor { @Override public void close() throws Exception { + if (predictor != null) { + predictor.close(); + } if (model != null) { model.close(); }
