test_message_attributes.py 4.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121
  1. #!/usr/bin/env python3
  2. """
  3. 测试LangChain消息对象的属性,查看是否包含id和时间戳信息
  4. """
  5. import asyncio
  6. import sys
  7. import os
  8. from pathlib import Path
  9. # 添加项目路径
  10. project_root = Path(__file__).parent
  11. sys.path.insert(0, str(project_root))
  12. from react_agent.agent import CustomReactAgent
  13. async def test_message_attributes():
  14. """测试消息对象的属性"""
  15. print("=" * 60)
  16. print("测试LangChain消息对象属性")
  17. print("=" * 60)
  18. try:
  19. # 初始化Agent
  20. print("🚀 初始化Agent...")
  21. agent = await CustomReactAgent.create()
  22. # 获取对话历史
  23. thread_id = "wang10:20250717211620915"
  24. print(f"📖 获取对话历史: {thread_id}")
  25. # 直接从checkpointer获取原始数据
  26. thread_config = {"configurable": {"thread_id": thread_id}}
  27. conversation_state = await agent.checkpointer.aget(thread_config)
  28. if not conversation_state:
  29. print("❌ 未找到对话数据")
  30. return
  31. messages = conversation_state.get('channel_values', {}).get('messages', [])
  32. print(f"📊 找到 {len(messages)} 条原始消息")
  33. # 分析前5条消息的属性
  34. print(f"\n🔍 分析前5条消息的所有属性:")
  35. for i, msg in enumerate(messages[:5]):
  36. print(f"\n消息 {i+1}:")
  37. print(f" 类型: {type(msg).__name__}")
  38. print(f" 内容长度: {len(str(msg.content))}")
  39. # 获取所有属性
  40. all_attrs = dir(msg)
  41. # 过滤出非私有属性
  42. public_attrs = [attr for attr in all_attrs if not attr.startswith('_')]
  43. print(f" 公共属性: {public_attrs}")
  44. # 检查关键属性
  45. key_attrs = ['id', 'timestamp', 'created_at', 'time', 'date', 'additional_kwargs', 'response_metadata']
  46. for attr in key_attrs:
  47. if hasattr(msg, attr):
  48. value = getattr(msg, attr)
  49. print(f" {attr}: {value} (类型: {type(value).__name__})")
  50. # 检查additional_kwargs和response_metadata
  51. if hasattr(msg, 'additional_kwargs') and msg.additional_kwargs:
  52. print(f" additional_kwargs内容: {msg.additional_kwargs}")
  53. if hasattr(msg, 'response_metadata') and msg.response_metadata:
  54. print(f" response_metadata内容: {msg.response_metadata}")
  55. # 打印消息的dict表示(如果有的话)
  56. if hasattr(msg, 'dict'):
  57. try:
  58. msg_dict = msg.dict()
  59. print(f" dict()方法返回的键: {list(msg_dict.keys())}")
  60. except:
  61. pass
  62. # 检查conversation_state的其他信息
  63. print(f"\n🔍 conversation_state的顶级键: {list(conversation_state.keys())}")
  64. # 检查是否有时间戳相关的元数据
  65. for key, value in conversation_state.items():
  66. if 'time' in key.lower() or 'date' in key.lower() or 'created' in key.lower():
  67. print(f" 时间相关字段 {key}: {value}")
  68. await agent.close()
  69. except Exception as e:
  70. print(f"❌ 测试失败: {e}")
  71. import traceback
  72. traceback.print_exc()
  73. async def test_create_new_message():
  74. """测试创建新消息时是否自动添加时间戳"""
  75. print(f"\n" + "=" * 60)
  76. print("测试新建消息的属性")
  77. print("=" * 60)
  78. try:
  79. from langchain_core.messages import HumanMessage, AIMessage
  80. from datetime import datetime
  81. import uuid
  82. # 创建新消息
  83. human_msg = HumanMessage(content="测试消息", id=str(uuid.uuid4()))
  84. ai_msg = AIMessage(content="AI回复", id=str(uuid.uuid4()))
  85. print("🔍 新建HumanMessage属性:")
  86. print(f" id: {getattr(human_msg, 'id', 'None')}")
  87. print(f" 所有属性: {[attr for attr in dir(human_msg) if not attr.startswith('_')]}")
  88. print("🔍 新建AIMessage属性:")
  89. print(f" id: {getattr(ai_msg, 'id', 'None')}")
  90. print(f" 所有属性: {[attr for attr in dir(ai_msg) if not attr.startswith('_')]}")
  91. except Exception as e:
  92. print(f"❌ 新消息测试失败: {e}")
  93. if __name__ == "__main__":
  94. print(f"🚀 开始消息属性测试 - {asyncio.get_event_loop()}")
  95. asyncio.run(test_message_attributes())
  96. asyncio.run(test_create_new_message())