This is an automated email from the ASF dual-hosted git repository.

sxnan pushed a commit to branch main
in repository https://gitbox.apache.org/repos/asf/flink-agents.git


The following commit(s) were added to refs/heads/main by this push:
     new 0815d58  [hotfix] Fix the type loss issue in agent plan 
deserialization (#343)
0815d58 is described below

commit 0815d58d7889ecfe0d4e34fe391d50b6efedb0d9
Author: Eugene <[email protected]>
AuthorDate: Mon Dec 8 17:35:39 2025 +0800

    [hotfix] Fix the type loss issue in agent plan deserialization (#343)
---
 .../agents/api/resource/ResourceDescriptor.java    |  5 +++++
 docs/content/docs/development/workflow_agent.md    |  2 +-
 .../agents/integration/test/ReActAgentTest.java    |  2 +-
 .../examples/agents/ReviewAnalysisAgent.java       |  2 +-
 .../chatmodels/ollama/OllamaChatModelSetup.java    |  2 +-
 .../ResourceProviderJsonDeserializer.java          | 24 ++--------------------
 6 files changed, 11 insertions(+), 26 deletions(-)

diff --git 
a/api/src/main/java/org/apache/flink/agents/api/resource/ResourceDescriptor.java
 
b/api/src/main/java/org/apache/flink/agents/api/resource/ResourceDescriptor.java
index 49113c2..f2803ba 100644
--- 
a/api/src/main/java/org/apache/flink/agents/api/resource/ResourceDescriptor.java
+++ 
b/api/src/main/java/org/apache/flink/agents/api/resource/ResourceDescriptor.java
@@ -59,6 +59,11 @@ public class ResourceDescriptor {
         return (T) initialArguments.get(argName);
     }
 
+    public <T> T getArgument(String argName, T defaultValue) {
+        T value = getArgument(argName);
+        return value != null ? value : defaultValue;
+    }
+
     public static class Builder {
         private final String clazz;
         private final Map<String, Object> initialArguments;
diff --git a/docs/content/docs/development/workflow_agent.md 
b/docs/content/docs/development/workflow_agent.md
index e60f3de..346f80d 100644
--- a/docs/content/docs/development/workflow_agent.md
+++ b/docs/content/docs/development/workflow_agent.md
@@ -144,7 +144,7 @@ public class ReviewAnalysisAgent extends Agent {
                 .addInitialArgument("model", "qwen3:8b")
                 .addInitialArgument("prompt", "reviewAnalysisPrompt")
                 .addInitialArgument("tools", 
Collections.singletonList("notifyShippingManager"))
-                .addInitialArgument("extract_reasoning", "true")
+                .addInitialArgument("extract_reasoning", true)
                 .build();
     }
 
diff --git 
a/e2e-test/flink-agents-end-to-end-tests-integration/src/test/java/org/apache/flink/agents/integration/test/ReActAgentTest.java
 
b/e2e-test/flink-agents-end-to-end-tests-integration/src/test/java/org/apache/flink/agents/integration/test/ReActAgentTest.java
index 3967dfd..10905fc 100644
--- 
a/e2e-test/flink-agents-end-to-end-tests-integration/src/test/java/org/apache/flink/agents/integration/test/ReActAgentTest.java
+++ 
b/e2e-test/flink-agents-end-to-end-tests-integration/src/test/java/org/apache/flink/agents/integration/test/ReActAgentTest.java
@@ -162,7 +162,7 @@ public class ReActAgentTest {
                         .addInitialArgument("connection", "ollama")
                         .addInitialArgument("model", OLLAMA_MODEL)
                         .addInitialArgument("tools", List.of("add", 
"multiply"))
-                        .addInitialArgument("extract_reasoning", "true")
+                        .addInitialArgument("extract_reasoning", true)
                         .build();
 
         Prompt prompt =
diff --git 
a/examples/src/main/java/org/apache/flink/agents/examples/agents/ReviewAnalysisAgent.java
 
b/examples/src/main/java/org/apache/flink/agents/examples/agents/ReviewAnalysisAgent.java
index b82e78a..bbba3c8 100644
--- 
a/examples/src/main/java/org/apache/flink/agents/examples/agents/ReviewAnalysisAgent.java
+++ 
b/examples/src/main/java/org/apache/flink/agents/examples/agents/ReviewAnalysisAgent.java
@@ -66,7 +66,7 @@ public class ReviewAnalysisAgent extends Agent {
                 .addInitialArgument("model", "qwen3:8b")
                 .addInitialArgument("prompt", "reviewAnalysisPrompt")
                 .addInitialArgument("tools", 
Collections.singletonList("notifyShippingManager"))
-                .addInitialArgument("extract_reasoning", "true")
+                .addInitialArgument("extract_reasoning", true)
                 .build();
     }
 
diff --git 
a/integrations/chat-models/ollama/src/main/java/org/apache/flink/agents/integrations/chatmodels/ollama/OllamaChatModelSetup.java
 
b/integrations/chat-models/ollama/src/main/java/org/apache/flink/agents/integrations/chatmodels/ollama/OllamaChatModelSetup.java
index 8b78f8f..e12aed4 100644
--- 
a/integrations/chat-models/ollama/src/main/java/org/apache/flink/agents/integrations/chatmodels/ollama/OllamaChatModelSetup.java
+++ 
b/integrations/chat-models/ollama/src/main/java/org/apache/flink/agents/integrations/chatmodels/ollama/OllamaChatModelSetup.java
@@ -62,7 +62,7 @@ public class OllamaChatModelSetup extends BaseChatModelSetup {
             ResourceDescriptor descriptor, BiFunction<String, ResourceType, 
Resource> getResource) {
         super(descriptor, getResource);
         this.model = descriptor.getArgument("model");
-        this.extractReasoning = 
Boolean.parseBoolean(descriptor.getArgument("extract_reasoning"));
+        this.extractReasoning = descriptor.getArgument("extract_reasoning", 
false);
     }
 
     /**
diff --git 
a/plan/src/main/java/org/apache/flink/agents/plan/serializer/ResourceProviderJsonDeserializer.java
 
b/plan/src/main/java/org/apache/flink/agents/plan/serializer/ResourceProviderJsonDeserializer.java
index b548b4d..6dbd870 100644
--- 
a/plan/src/main/java/org/apache/flink/agents/plan/serializer/ResourceProviderJsonDeserializer.java
+++ 
b/plan/src/main/java/org/apache/flink/agents/plan/serializer/ResourceProviderJsonDeserializer.java
@@ -33,9 +33,7 @@ import 
org.apache.flink.shaded.jackson2.com.fasterxml.jackson.databind.ObjectMap
 import 
org.apache.flink.shaded.jackson2.com.fasterxml.jackson.databind.deser.std.StdDeserializer;
 
 import java.io.IOException;
-import java.util.ArrayList;
 import java.util.HashMap;
-import java.util.List;
 import java.util.Map;
 
 /**
@@ -82,7 +80,7 @@ public class ResourceProviderJsonDeserializer extends 
StdDeserializer<ResourcePr
         JsonNode kwargsNode = node.get("kwargs");
         Map<String, Object> kwargs = new HashMap<>();
         if (kwargsNode != null && kwargsNode.isObject()) {
-            kwargs = (Map<String, Object>) parseJsonNode(kwargsNode);
+            kwargs = mapper.convertValue(kwargsNode, Map.class);
         }
         return new PythonResourceProvider(
                 name, ResourceType.fromValue(type), module, clazz, kwargs);
@@ -98,7 +96,7 @@ public class ResourceProviderJsonDeserializer extends 
StdDeserializer<ResourcePr
         JsonNode serializedNode = node.get("serialized");
         Map<String, Object> serialized = new HashMap<>();
         if (serializedNode != null && serializedNode.isObject()) {
-            serialized = (Map<String, Object>) parseJsonNode(serializedNode);
+            serialized = mapper.convertValue(serializedNode, Map.class);
         }
         return new PythonSerializableResourceProvider(
                 name, ResourceType.fromValue(type), module, clazz, serialized);
@@ -126,22 +124,4 @@ public class ResourceProviderJsonDeserializer extends 
StdDeserializer<ResourcePr
         return new JavaSerializableResourceProvider(
                 name, ResourceType.fromValue(type), module, clazz, 
serializedResource);
     }
-
-    private Object parseJsonNode(JsonNode node) {
-        if (node.isObject()) {
-            Map<String, Object> map = new HashMap<>();
-            node.fields()
-                    .forEachRemaining(
-                            entry -> map.put(entry.getKey(), 
parseJsonNode(entry.getValue())));
-            return map;
-        } else if (node.isArray()) {
-            List<Object> list = new ArrayList<>();
-            node.forEach(element -> list.add(parseJsonNode(element)));
-            return list;
-        } else if (node.isValueNode()) {
-            return node.asText();
-        } else {
-            throw new UnsupportedOperationException("Unsupported node type: " 
+ node.getNodeType());
-        }
-    }
 }

Reply via email to