From d21d1c6e5c1a30d9ad8cc393ed5be5b0db05faff Mon Sep 17 00:00:00 2001 From: zihanjian Date: Thu, 25 Sep 2025 13:24:19 +0800 Subject: [PATCH] 1 --- function_calls/llm.py | 22 +++++++++++++--- function_calls/services/reminder.py | 41 ++++++++++++++++++++++++++++- 2 files changed, 58 insertions(+), 5 deletions(-) diff --git a/function_calls/llm.py b/function_calls/llm.py index ed9f2b2..de7403a 100644 --- a/function_calls/llm.py +++ b/function_calls/llm.py @@ -81,13 +81,23 @@ class FunctionCallLLM: elif isinstance(system_msg, str): custom_prompt = system_msg if custom_prompt: - messages.append({"role": "system", "content": custom_prompt}) + from datetime import datetime + + now = datetime.now() + suffix = now.strftime("%Y-%m-%d %H:%M:%S %A") + enriched_prompt = ( + f"{custom_prompt}\n\n" + f"当前时间:{suffix}\n" + ) + messages.append({"role": "system", "content": enriched_prompt}) tool_prompt = ( "You are an assistant that can call tools. " "When you invoke a function, wait for the tool response before replying to the user. " "Only deliver a final answer once you have enough information." ) + messages.append({"role": "system", "content": tool_prompt}) + history_messages = self._build_history_messages(ctx) if history_messages: messages.extend(history_messages) @@ -131,6 +141,11 @@ class FunctionCallLLM: spec = functions[function_name] result = executor(spec, arguments) tool_content = formatter(result) + self.logger.info( + "Function '%s' tool response payload: %s", + function_name, + tool_content, + ) messages.append( { "role": "tool", @@ -237,9 +252,8 @@ class FunctionCallLLM: if not content: continue role = "assistant" if item.get("sender_wxid") == ctx.robot_wxid else "user" - if role == "user": - sender_name = item.get("sender", "未知用户") - content = f"{sender_name}: {content}" + sender_name = item.get("sender", "未知用户") + content = f"[{sender_name}] {content}" formatted.append({"role": role, "content": content}) return formatted diff --git a/function_calls/services/reminder.py b/function_calls/services/reminder.py index 0067ef0..c1295dd 100644 --- a/function_calls/services/reminder.py +++ b/function_calls/services/reminder.py @@ -2,6 +2,7 @@ from __future__ import annotations from dataclasses import dataclass +from datetime import datetime from typing import Any, Dict, List, Optional from function.func_reminder import ReminderManager @@ -39,9 +40,15 @@ def create_reminder( data: Dict[str, Any], roomid: Optional[str] ) -> ReminderServiceResult: + time_value = data["time"] + if data.get("type") == "once": + normalized_time = _normalize_once_time(time_value) + else: + normalized_time = time_value + payload = { "type": data["type"], - "time": data["time"], + "time": normalized_time, "content": data["content"], } if data.get("weekday") is not None: @@ -64,6 +71,38 @@ def create_reminder( return ReminderServiceResult(success=True, messages=[message]) +def _normalize_once_time(time_str: str) -> str: + raw = (time_str or "").strip() + if not raw: + return time_str + + parsed: Optional[datetime] = None + for fmt in ("%Y-%m-%d %H:%M", "%Y-%m-%d %H:%M:%S"): + try: + parsed = datetime.strptime(raw, fmt) + break + except ValueError: + continue + + if parsed is None: + return time_str + + now = datetime.now() + if parsed.year < now.year: + try: + candidate = parsed.replace(year=now.year) + except ValueError: + candidate = parsed + if candidate <= now: + try: + candidate = candidate.replace(year=candidate.year + 1) + except ValueError: + candidate = parsed + parsed = candidate + + return parsed.strftime("%Y-%m-%d %H:%M") + + def list_reminders( manager: ReminderManager, sender_wxid: str,