Просмотр исходного кода

fix: rewrite serialize_milvus_result with better error handling

guantao 1 день назад
Родитель
Сommit
d1321590c3
1 измененных файлов с 35 добавлено и 18 удалено
  1. 35 18
      knowhub/server.py

+ 35 - 18
knowhub/server.py

@@ -138,29 +138,46 @@ def decrypt_content(resource_id: str, encrypted_text: str, provided_key: Optiona
 
 def serialize_milvus_result(data):
     """将 Milvus 返回的数据转换为可序列化的字典"""
-    if data is None:
-        return None
-    elif isinstance(data, (str, int, float, bool)):
+    # 基本类型直接返回
+    if data is None or isinstance(data, (str, int, float, bool)):
         return data
-    elif isinstance(data, dict):
+
+    # 字典类型递归处理
+    if isinstance(data, dict):
         return {k: serialize_milvus_result(v) for k, v in data.items()}
-    elif isinstance(data, (list, tuple)):
+
+    # 列表/元组类型递归处理
+    if isinstance(data, (list, tuple)):
         return [serialize_milvus_result(item) for item in data]
-    elif hasattr(data, '__iter__') and not isinstance(data, (str, bytes)):
-        # 处理 RepeatedScalarContainer 等可迭代对象
-        # 先转换为列表,确保返回的是真正的列表而不是字符串表示
+
+    # 尝试转换为字典(对于有 to_dict 方法的对象)
+    if hasattr(data, 'to_dict') and callable(getattr(data, 'to_dict')):
         try:
-            return [serialize_milvus_result(item) for item in list(data)]
+            return serialize_milvus_result(data.to_dict())
         except:
-            # 如果迭代失败,尝试转换为字符串
-            return str(data)
-    elif hasattr(data, 'to_dict'):
-        return serialize_milvus_result(data.to_dict())
-    elif hasattr(data, '__dict__'):
-        return serialize_milvus_result(vars(data))
-    else:
-        # 最后的fallback
-        return data
+            pass
+
+    # 尝试转换为列表(对于可迭代对象,如 RepeatedScalarContainer)
+    if hasattr(data, '__iter__') and not isinstance(data, (str, bytes, dict)):
+        try:
+            # 强制转换为列表并递归处理
+            result = []
+            for item in data:
+                result.append(serialize_milvus_result(item))
+            return result
+        except:
+            pass
+
+    # 尝试获取对象的属性字典
+    if hasattr(data, '__dict__'):
+        try:
+            return serialize_milvus_result(vars(data))
+        except:
+            pass
+
+    # 最后的 fallback:对于无法处理的类型,返回 None 而不是字符串表示
+    # 这样可以避免产生无法序列化的字符串
+    return None
 
 
 def init_db():