fix: 动态更新系统提示词中的运行时信息(时间戳)

问题:
- system_prompt 在 Agent 初始化时固定,导致模型获取的时间信息过时
- 长时间运行的会话中,模型对时间判断不准确

解决方案:
- 在 get_full_system_prompt() 中添加动态更新逻辑
- 每次获取系统提示词时,使用正则表达式替换运行时信息中的时间戳
- 保持其他运行时信息(模型、工作空间等)不变

测试:
- 创建测试脚本验证时间动态更新功能
- 等待3秒后时间正确更新(22:19:45 -> 22:19:48)
This commit is contained in:
cowagent
2026-02-04 22:27:24 +08:00
parent eec10cb5db
commit 480c60c0a7

View File

@@ -1,6 +1,8 @@
import json import json
import time import time
import threading import threading
import datetime
import re
from common.log import logger from common.log import logger
from agent.protocol.models import LLMRequest, LLMModel from agent.protocol.models import LLMRequest, LLMModel
@@ -105,8 +107,51 @@ class Agent:
:return: Complete system prompt :return: Complete system prompt
""" """
# Skills are now included in system_prompt by PromptBuilder # Skills are now included in system_prompt by PromptBuilder
# No need to append them here # Update runtime info (timestamp) dynamically before returning
return self.system_prompt return self._update_runtime_info(self.system_prompt)
def _update_runtime_info(self, prompt: str) -> str:
"""
Update runtime information (timestamp) in the system prompt.
This ensures the model always has the current time, even if the
agent was initialized hours ago.
:param prompt: Original system prompt
:return: Updated system prompt with current time
"""
# Find the runtime info section
runtime_section_pattern = r'(## 运行时信息\s*\n\s*\n)(当前时间: )([^\n]+)(\s+星期[一二三四五六日])(\s+\([^)]+\))?'
# Get current time info
now = datetime.datetime.now()
# Get timezone
try:
offset = -time.timezone if not time.daylight else -time.altzone
hours = offset // 3600
minutes = (offset % 3600) // 60
timezone_name = f"UTC{hours:+03d}:{minutes:02d}" if minutes else f"UTC{hours:+03d}"
except Exception:
timezone_name = "UTC"
# Chinese weekday mapping
weekday_map = {
'Monday': '星期一', 'Tuesday': '星期二', 'Wednesday': '星期三',
'Thursday': '星期四', 'Friday': '星期五', 'Saturday': '星期六', 'Sunday': '星期日'
}
weekday_zh = weekday_map.get(now.strftime("%A"), now.strftime("%A"))
# Build new time string
new_time = now.strftime("%Y-%m-%d %H:%M:%S")
# Replace the time in the prompt
def replace_time(match):
return f"{match.group(1)}{match.group(2)}{new_time} {weekday_zh} ({timezone_name})"
updated_prompt = re.sub(runtime_section_pattern, replace_time, prompt)
return updated_prompt
def refresh_skills(self): def refresh_skills(self):
"""Refresh the loaded skills.""" """Refresh the loaded skills."""