From f20247b04e7e96ea1415ac5fc44a840e3390752f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E5=90=B4=E6=96=87=E5=B3=B0?= Date: Thu, 11 Jun 2026 18:07:44 +0800 Subject: [PATCH] =?UTF-8?q?=E4=BC=98=E5=8C=96=E6=97=B6=E9=97=B4=E5=B7=A5?= =?UTF-8?q?=E5=85=B7?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- agents/time/time.go | 27 ++++++++++++++++++++------- agents/time/time_test.go | 4 ++-- 2 files changed, 22 insertions(+), 9 deletions(-) diff --git a/agents/time/time.go b/agents/time/time.go index 8ea1b36..2f6b716 100644 --- a/agents/time/time.go +++ b/agents/time/time.go @@ -91,13 +91,13 @@ func Resolve(now time.Time) Context { func BuildContext(ctx Context, routeReason string) string { var b strings.Builder b.WriteString("时间工具结果。请优先使用这里的绝对日期解释用户问题中的相对时间,不要自行猜测当前日期。\n") - fmt.Fprintf(&b, "当前本地日期时间:%s\n", ctx.Now.Format("2006-01-02 15:04:05 MST")) - fmt.Fprintf(&b, "今天:%s\n", FormatSQLRange(ctx.Today)) - fmt.Fprintf(&b, "明天:%s\n", FormatSQLRange(ctx.Tomorrow)) - fmt.Fprintf(&b, "昨天:%s\n", FormatSQLRange(ctx.Yesterday)) - fmt.Fprintf(&b, "本周:%s\n", FormatSQLRange(ctx.ThisWeek)) - fmt.Fprintf(&b, "本月:%s\n", FormatSQLRange(ctx.ThisMonth)) - fmt.Fprintf(&b, "本年:%s\n", FormatSQLRange(ctx.ThisYear)) + fmt.Fprintf(&b, "当前本地日期时间:%s(%s)\n", ctx.Now.Format("2006-01-02 15:04:05 MST"), FormatWeekday(ctx.Now)) + fmt.Fprintf(&b, "今天:%s,%s\n", FormatDateWeekday(ctx.Today.Start), FormatSQLRangeWithWeekday(ctx.Today)) + fmt.Fprintf(&b, "明天:%s,%s\n", FormatDateWeekday(ctx.Tomorrow.Start), FormatSQLRangeWithWeekday(ctx.Tomorrow)) + fmt.Fprintf(&b, "昨天:%s,%s\n", FormatDateWeekday(ctx.Yesterday.Start), FormatSQLRangeWithWeekday(ctx.Yesterday)) + fmt.Fprintf(&b, "本周:%s\n", FormatSQLRangeWithWeekday(ctx.ThisWeek)) + fmt.Fprintf(&b, "本月:%s\n", FormatSQLRangeWithWeekday(ctx.ThisMonth)) + fmt.Fprintf(&b, "本年:%s\n", FormatSQLRangeWithWeekday(ctx.ThisYear)) b.WriteString("SQL 日期过滤建议:对日程/事件类表使用半开区间,例如 event_time >= start AND event_time < end;如果实际字段名不同,必须使用 schema 中存在的时间字段。\n") if strings.TrimSpace(routeReason) != "" { b.WriteString("激活原因:" + strings.TrimSpace(routeReason) + "\n") @@ -109,10 +109,23 @@ func FormatDate(t time.Time) string { return t.Format("2006-01-02") } +func FormatWeekday(t time.Time) string { + weekdays := []string{"星期日", "星期一", "星期二", "星期三", "星期四", "星期五", "星期六"} + return weekdays[t.Weekday()] +} + +func FormatDateWeekday(t time.Time) string { + return fmt.Sprintf("%s(%s)", FormatDate(t), FormatWeekday(t)) +} + func FormatSQLRange(r Range) string { return fmt.Sprintf("start=%s, end_exclusive=%s", r.Start.Format("2006-01-02 15:04:05"), r.End.Format("2006-01-02 15:04:05")) } +func FormatSQLRangeWithWeekday(r Range) string { + return fmt.Sprintf("start=%s(%s), end_exclusive=%s(%s)", r.Start.Format("2006-01-02 15:04:05"), FormatWeekday(r.Start), r.End.Format("2006-01-02 15:04:05"), FormatWeekday(r.End)) +} + func startOfDay(t time.Time) time.Time { y, m, d := t.Date() return time.Date(y, m, d, 0, 0, 0, 0, t.Location()) diff --git a/agents/time/time_test.go b/agents/time/time_test.go index a4f8061..5cc3041 100644 --- a/agents/time/time_test.go +++ b/agents/time/time_test.go @@ -23,7 +23,7 @@ func TestResolveBuildsCalendarRanges(t *testing.T) { func TestBuildContextIncludesSQLHints(t *testing.T) { ctx := Resolve(time.Date(2026, 6, 10, 13, 14, 15, 0, time.UTC)) text := BuildContext(ctx, "需要日期范围") - for _, want := range []string{"时间工具结果", "本月", "start=", "end_exclusive=", "半开区间", "需要日期范围"} { + for _, want := range []string{"时间工具结果", "本月", "start=", "end_exclusive=", "星期三", "星期一", "半开区间", "需要日期范围"} { if !strings.Contains(text, want) { t.Fatalf("context missing %q:\n%s", want, text) } @@ -39,7 +39,7 @@ func TestToolDefinitionAndExecuteTool(t *testing.T) { if err != nil { t.Fatal(err) } - for _, want := range []string{"时间工具结果", "2026-06-10", "本月", "start=", "end_exclusive=", "测试原因"} { + for _, want := range []string{"时间工具结果", "2026-06-10", "星期三", "本月", "start=", "end_exclusive=", "测试原因"} { if !strings.Contains(text, want) { t.Fatalf("tool result missing %q:\n%s", want, text) }