From 2e5aab3fd673b6f2b8cfde83657ebd355161a4bd Mon Sep 17 00:00:00 2001 From: Dmytro Skarzhynets Date: Wed, 11 Jun 2025 17:51:38 +0300 Subject: [PATCH] AI rule node: use `ObjectNode` instead of more general `JsonNode` for JSON Schema config field --- .../rule/engine/ai/Langchain4jJsonSchemaAdapter.java | 5 +++-- .../main/java/org/thingsboard/rule/engine/ai/TbAiNode.java | 5 +++-- .../thingsboard/rule/engine/ai/TbAiNodeConfiguration.java | 6 +++--- 3 files changed, 9 insertions(+), 7 deletions(-) diff --git a/rule-engine/rule-engine-components/src/main/java/org/thingsboard/rule/engine/ai/Langchain4jJsonSchemaAdapter.java b/rule-engine/rule-engine-components/src/main/java/org/thingsboard/rule/engine/ai/Langchain4jJsonSchemaAdapter.java index 9ad745f3ed..12988c209d 100644 --- a/rule-engine/rule-engine-components/src/main/java/org/thingsboard/rule/engine/ai/Langchain4jJsonSchemaAdapter.java +++ b/rule-engine/rule-engine-components/src/main/java/org/thingsboard/rule/engine/ai/Langchain4jJsonSchemaAdapter.java @@ -16,6 +16,7 @@ package org.thingsboard.rule.engine.ai; import com.fasterxml.jackson.databind.JsonNode; +import com.fasterxml.jackson.databind.node.ObjectNode; import dev.langchain4j.model.chat.request.json.JsonArraySchema; import dev.langchain4j.model.chat.request.json.JsonBooleanSchema; import dev.langchain4j.model.chat.request.json.JsonEnumSchema; @@ -42,10 +43,10 @@ final class Langchain4jJsonSchemaAdapter { /** * Creates a Langchain4j {@link JsonSchema} from the given root JSON Schema node. * - * @param rootSchemaNode a valid JSON Schema as a Jackson {@link JsonNode} + * @param rootSchemaNode a valid JSON Schema as a Jackson {@link ObjectNode} * @return the corresponding Langchain4j {@link JsonSchema} */ - public static JsonSchema fromJsonNode(JsonNode rootSchemaNode) { + public static JsonSchema fromJsonNode(ObjectNode rootSchemaNode) { return JsonSchema.builder() .name(rootSchemaNode.get("title").textValue()) .rootElement(parse(rootSchemaNode)) diff --git a/rule-engine/rule-engine-components/src/main/java/org/thingsboard/rule/engine/ai/TbAiNode.java b/rule-engine/rule-engine-components/src/main/java/org/thingsboard/rule/engine/ai/TbAiNode.java index 7ee354d581..0acba685ac 100644 --- a/rule-engine/rule-engine-components/src/main/java/org/thingsboard/rule/engine/ai/TbAiNode.java +++ b/rule-engine/rule-engine-components/src/main/java/org/thingsboard/rule/engine/ai/TbAiNode.java @@ -16,6 +16,7 @@ package org.thingsboard.rule.engine.ai; import com.fasterxml.jackson.databind.JsonNode; +import com.fasterxml.jackson.databind.node.ObjectNode; import com.google.common.util.concurrent.FutureCallback; import com.google.common.util.concurrent.ListenableFuture; import dev.langchain4j.data.message.SystemMessage; @@ -97,11 +98,11 @@ public final class TbAiNode extends TbAbstractExternalNode implements TbNode { aiSettingsId = config.getAiSettingsId(); } - private static JsonSchema getJsonSchema(ResponseFormatType responseFormatType, JsonNode jsonSchema) { + private static JsonSchema getJsonSchema(ResponseFormatType responseFormatType, ObjectNode jsonSchema) { if (responseFormatType == ResponseFormatType.TEXT) { return null; } - return responseFormatType == ResponseFormatType.JSON && jsonSchema != null && !jsonSchema.isNull() ? Langchain4jJsonSchemaAdapter.fromJsonNode(jsonSchema) : null; + return responseFormatType == ResponseFormatType.JSON && jsonSchema != null ? Langchain4jJsonSchemaAdapter.fromJsonNode(jsonSchema) : null; } @Override 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 7d2b9745ab..96ecde330a 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 @@ -16,7 +16,7 @@ package org.thingsboard.rule.engine.ai; import com.fasterxml.jackson.annotation.JsonIgnore; -import com.fasterxml.jackson.databind.JsonNode; +import com.fasterxml.jackson.databind.node.ObjectNode; import dev.langchain4j.model.chat.request.ResponseFormatType; import jakarta.validation.constraints.AssertTrue; import jakarta.validation.constraints.Max; @@ -46,7 +46,7 @@ public class TbAiNodeConfiguration implements NodeConfiguration