fix(bot):user memory message role changed to 'user',session add token use#733
fix(bot):user memory message role changed to 'user',session add token use#733
Conversation
2. fix memory role
PR Reviewer Guide 🔍Here are some key observations to aid the review process:
|
PR Code Suggestions ✨Explore these optional code suggestions:
|
qin-ptr
left a comment
There was a problem hiding this comment.
审查报告
Summary
这个 PR 实现了两个主要改进:1)将 user memory message 的 role 从 'system' 改为 'user';2)在 session 中记录 token 使用信息。整体方向正确,将 token_usage 从实例变量改为局部变量避免了状态污染,增强了异常处理。但存在一个严重的 bug 会导致 LLM API 调用失败,以及几处需要修复的代码问题。
Must Fix
-
[Bug]
bot/vikingbot/agent/context.py:275-281— 连续的 user role 消息会导致 LLM API 失败当前代码产生两个连续的 'user' role 消息:
# User memory (role: user) messages.append({"role": "user", "content": user_info}) # Current message (role: user) messages.append({"role": "user", "content": user_content})
大多数 LLM API(OpenAI、Anthropic Claude 等)要求消息必须在 user 和 assistant 之间交替,连续的 user 消息会导致 API 调用报错。
建议方案 1(推荐):将 user memory 信息合并到 current user message 中
# User memory + Current message combined user_info = await self._build_user_memory(session_key, current_message, history) user_content = self._build_user_content(current_message, media) # Combine into single user message if isinstance(user_content, str): combined_content = f"{user_info}\n\n---\n\n{user_content}" else: # list of dicts (with images) combined_content = [{"type": "text", "text": user_info}] + user_content messages.append({"role": "user", "content": combined_content})
建议方案 2:将 user memory 保留为 system role(恢复原设计),或在 system prompt 中处理。
-
[Bug]
bot/vikingbot/agent/loop.py:517-518— time_cost 参数处理错误代码写成:
time_cost=time_cost or {}, # Pass through for channel-specific needs
但 line 511 的
time_cost = round(time.time() - start_time, 2)总是返回浮点数(不可能是 None),所以or {}没有意义且会导致类型不一致(应该是 float,却可能变成 dict)。而且代码格式混乱,将一个参数分成两行。修复:
time_cost=time_cost,
-
[Bug]
bot/vikingbot/agent/loop.py:229— 文档字符串与实际返回值不匹配文档说返回
tuple of (final_content, tools_used),但实际返回三个值:tuple[str | None, list[dict], dict[str, int]]。修复:
Returns: tuple of (final_content, tools_used, token_usage)
Suggestions
-
[Suggestion]
bot/vikingbot/agent/loop.py:556-558— _process_system_message 中应使用 token_usage虽然在 line 545 接收了 token_usage 返回值,但 line 556-558 的
session.add_message没有传递它。为了一致性和数据完整性,建议添加:session.add_message( "assistant", final_content, tools_used=tools_used if tools_used else None, token_usage=token_usage )
-
[Suggestion]
bot/vikingbot/session/manager.py:32— 类型提示可以更精确token_usage: dict[str, Any]可以改为token_usage: dict[str, int] | None,因为从代码来看 token_usage 的值都是整数(prompt_tokens, completion_tokens, total_tokens)。
Verdict
REQUEST_CHANGES
存在一个严重的 bug(连续 user 消息)会导致 LLM API 调用失败,必须修复才能合并。另外两个 bug(time_cost 处理错误、文档过时)也应该修复以保证代码质量和类型一致性。修复后这个 PR 的改进方向是正确的。
🤖 I am a bot owned by @qin-ctx, powered by Claude.
Description
Related Issue
Type of Change
Changes Made
Testing
Checklist
Screenshots (if applicable)
Additional Notes