diff --git a/common/util/pom.xml b/common/util/pom.xml
index 6719dc628a..a50cead962 100644
--- a/common/util/pom.xml
+++ b/common/util/pom.xml
@@ -114,7 +114,10 @@
net.objecthunter
exp4j
- ${exp4j.version}
+
+
+ com.networknt
+ json-schema-validator
diff --git a/common/util/src/main/java/org/thingsboard/common/util/JsonSchemaUtils.java b/common/util/src/main/java/org/thingsboard/common/util/JsonSchemaUtils.java
new file mode 100644
index 0000000000..db45994826
--- /dev/null
+++ b/common/util/src/main/java/org/thingsboard/common/util/JsonSchemaUtils.java
@@ -0,0 +1,47 @@
+/**
+ * Copyright © 2016-2025 The Thingsboard Authors
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.thingsboard.common.util;
+
+import com.fasterxml.jackson.databind.JsonNode;
+import com.networknt.schema.JsonSchemaFactory;
+import com.networknt.schema.SchemaId;
+import com.networknt.schema.SchemaLocation;
+import com.networknt.schema.SpecVersion;
+import com.networknt.schema.ValidationMessage;
+
+import java.util.Set;
+
+public final class JsonSchemaUtils {
+
+ private JsonSchemaUtils() {
+ throw new AssertionError("Can't instantiate utility class");
+ }
+
+ /**
+ * Validates that the provided JsonNode is a valid JSON Schema (Draft 2020-12).
+ *
+ * @param schemaNode the JSON Schema document as a JsonNode
+ * @return true if the schema is well-formed, false otherwise
+ */
+ public static boolean isValidJsonSchema(JsonNode schemaNode) {
+ Set errors = JsonSchemaFactory
+ .getInstance(SpecVersion.VersionFlag.V202012)
+ .getSchema(SchemaLocation.of(SchemaId.V202012))
+ .validate(schemaNode);
+ return errors.isEmpty();
+ }
+
+}
diff --git a/rule-engine/rule-engine-components/src/main/java/org/thingsboard/rule/engine/ai/TbAiNodeConfiguration.java b/rule-engine/rule-engine-components/src/main/java/org/thingsboard/rule/engine/ai/TbAiNodeConfiguration.java
index 9d8ac5fbd1..6dd4337aed 100644
--- a/rule-engine/rule-engine-components/src/main/java/org/thingsboard/rule/engine/ai/TbAiNodeConfiguration.java
+++ b/rule-engine/rule-engine-components/src/main/java/org/thingsboard/rule/engine/ai/TbAiNodeConfiguration.java
@@ -15,9 +15,12 @@
*/
package org.thingsboard.rule.engine.ai;
+import com.fasterxml.jackson.databind.JsonNode;
+import jakarta.validation.constraints.AssertTrue;
import jakarta.validation.constraints.NotBlank;
import jakarta.validation.constraints.NotNull;
import lombok.Data;
+import org.thingsboard.common.util.JsonSchemaUtils;
import org.thingsboard.rule.engine.api.NodeConfiguration;
import org.thingsboard.server.common.data.id.AiSettingsId;
import org.thingsboard.server.common.data.validation.Length;
@@ -36,15 +39,22 @@ public class TbAiNodeConfiguration implements NodeConfiguration