This commit is contained in:
@ -32,7 +32,7 @@ SYSTEM_PROMPT = """你是一个专门解析提醒请求的助手。请分析用
|
||||
|
||||
时间格式要求:
|
||||
- datetime: "YYYY-MM-DDTHH:MM:SS" (ISO 8601)
|
||||
- datetime_delta: "PTxHxMxS" 格式 (如"PT1H30M"表示1小时30分钟)
|
||||
- datetime_delta: "PxYxMxDTxHxMxS" 格式 (如"PT1H30M"表示1小时30分钟,"P3DT4H"表示三天四小时,"P5MT2M"表示五个月两分钟)
|
||||
|
||||
判断标准:
|
||||
- is_notice=true: 明确包含时间+提醒内容的请求
|
||||
@ -50,7 +50,7 @@ SYSTEM_PROMPT = """你是一个专门解析提醒请求的助手。请分析用
|
||||
输出:{"datetime": null, "datetime_delta": "PT5M", "datetime_delta_minus": true, "content": "关火", "is_notice": true}
|
||||
|
||||
用户:"昨天提醒我关火"
|
||||
输出:{"datetime": null, "datetime_delta": "PT1D", "datetime_delta_minus": true, "content": "关火", "is_notice": true}
|
||||
输出:{"datetime": null, "datetime_delta": "P1D", "datetime_delta_minus": true, "content": "关火", "is_notice": true}
|
||||
|
||||
用户:"什么是提醒功能?"
|
||||
输出:{"datetime": null, "datetime_delta": null, "datetime_delta_minus": false, "content": "", "is_notice": false}
|
||||
@ -58,12 +58,13 @@ SYSTEM_PROMPT = """你是一个专门解析提醒请求的助手。请分析用
|
||||
请严格按照上述格式输出JSON,不要添加任何其他文字说明。现在是 DATETIME"""
|
||||
|
||||
pt_pattern = re.compile(
|
||||
r"^PT"
|
||||
r"^P"
|
||||
r"((?P<year>\d+)Y)?"
|
||||
r"((?P<month>\d+)M)?"
|
||||
r"((?P<day>\d+)D)?"
|
||||
r"((?P<hour>\d+)H)?"
|
||||
r"(T((?P<hour>\d+)H)?"
|
||||
r"((?P<minute>\d+)M)?"
|
||||
r"((?P<second>\d+)S)?$"
|
||||
r"((?P<second>\d+)S)?)?$"
|
||||
)
|
||||
|
||||
|
||||
@ -96,6 +97,7 @@ async def ask_ai(expression: str, now: datetime.datetime | None = None) -> tuple
|
||||
|
||||
datetime_absolute = data.get("datetime", None)
|
||||
datetime_delta = data.get("datetime_delta", None)
|
||||
is_minus = data.get("datetime_delta_minus", False)
|
||||
content = data.get("content", "")
|
||||
is_notice = data.get("is_notice", False)
|
||||
|
||||
@ -103,19 +105,41 @@ async def ask_ai(expression: str, now: datetime.datetime | None = None) -> tuple
|
||||
return (None, "")
|
||||
if datetime_absolute:
|
||||
try:
|
||||
return (datetime.datetime.strptime(datetime_absolute, "%Y-%m-%dT%H:%M:%S"), content)
|
||||
res = datetime.datetime.strptime(datetime_absolute, "%Y-%m-%dT%H:%M:%S"), content
|
||||
logger.info(f"提醒功能:使用绝对时间解析 AI 返回值 raw={result} target={res[0]}")
|
||||
return res
|
||||
except ValueError:
|
||||
pass
|
||||
|
||||
if datetime_delta and (match := pt_pattern.match(datetime_delta)):
|
||||
years = tryint(match.group("year"))
|
||||
months = tryint(match.group("month"))
|
||||
days = tryint(match.group("day"))
|
||||
hours = tryint(match.group("hour"))
|
||||
minutes = tryint(match.group("minute"))
|
||||
seconds = tryint(match.group("second"))
|
||||
|
||||
dt = datetime.timedelta(days=days, hours=hours, minutes=minutes, seconds=seconds)
|
||||
now2 = now.replace(year=now.year + years)
|
||||
if is_minus:
|
||||
dt = -dt
|
||||
if is_minus:
|
||||
now2 = now.replace(year=now.year - years)
|
||||
m = now2.month
|
||||
if (months - m) >= 0:
|
||||
neg_months = -(m - months - 1)
|
||||
neg_years = (neg_months + 11) // 12
|
||||
target_month = 12 - ((neg_months - 1) % 12)
|
||||
now2 = now2.replace(year=now2.year - neg_years, month=target_month)
|
||||
else:
|
||||
now2 = now2.replace(month=m - months)
|
||||
else:
|
||||
now2 = now.replace(year=now.year + years)
|
||||
m = now2.month
|
||||
now2 = now2.replace(
|
||||
year=now2.year + (m + months - 1) // 12,
|
||||
month=(m + months - 1) % 12 + 1
|
||||
)
|
||||
logger.info(f"提醒功能:使用相对时间解析 AI 返回值 raw={result} target={now2+dt}")
|
||||
return (now2 + dt, content)
|
||||
|
||||
logger.warning(f"提醒功能:解析 AI 返回值时没有找到解析方法 raw={result}")
|
||||
|
||||
Reference in New Issue
Block a user