diff --git a/routes/openclaw_bot_routes.py b/routes/openclaw_bot_routes.py index b30c7a4..7a3075e 100644 --- a/routes/openclaw_bot_routes.py +++ b/routes/openclaw_bot_routes.py @@ -4148,6 +4148,16 @@ _FC_TOOLS = [{ }, "required": ["query"] } + }, + { + "name": "check_data_freshness", + "description": ( + "查詢內部業績資料的最新可用日期與可用月份清單。" + "ADR-019 Phase 2:在回答任何特定時段(本月/本週/某月某日)業績問題前," + "先呼叫此工具確認資料是否已涵蓋該期間,避免回覆「業績為零」這類因 ETL " + "尚未匯入造成的虛假結論。月初/季初、用戶用『本月/本週』等相對時間詞時務必先呼叫。" + ), + "parameters": {"type": "OBJECT", "properties": {}, "required": []} } ] }] @@ -4249,6 +4259,33 @@ def _execute_tool(name: str, args: dict) -> dict: except Exception as e: return {"results": [], "error": str(e)} + # ── check_data_freshness ────────────────────────────────── + elif name == "check_data_freshness": + # ADR-019 Phase 2:讓 agent 在回答業績問題前 probe 資料缺口 + latest = latest_date() # 'YYYY-MM-DD' 或 None + avail_months = query_available_months() or [] + result = { + "latest_data_date": latest, + "today": today, + "available_months": [m["month"] for m in avail_months], + "month_count": len(avail_months), + } + if latest: + try: + latest_dt = datetime.strptime(latest.replace('/', '-'), '%Y-%m-%d') + gap_days = (now.date() - latest_dt.date()).days + result["gap_days"] = gap_days + result["current_month_has_data"] = ( + latest_dt.year == now.year and latest_dt.month == now.month + ) + result["data_freshness_warning"] = ( + "⚠️ 當月尚無資料,請改詢問上月" if not result["current_month_has_data"] + else ("⚠️ 資料落後 " + str(gap_days) + " 天" if gap_days > 2 else None) + ) + except (ValueError, AttributeError): + pass + return result + return {"error": f"unknown tool: {name}"} @@ -4339,12 +4376,17 @@ def openclaw_answer(question: str): sys_msg = ( f"你是 OpenClaw(小O),服務「小龍蝦」電商業務團隊的 AI 助理。\n" f"今天是 {today_str}。\n" - "你有三個工具可以使用:\n" + "你有四個工具可以使用:\n" "1. query_sales — 查自家業績資料庫\n" "2. get_market_intel — 取得外部市場情報(新聞/熱搜/PTT口碑/匯率/天氣/節慶)\n" - "3. get_knowledge — 查歷史分析知識庫\n\n" - "根據用戶問題,自主決定要呼叫哪些工具(可以同時呼叫多個)。\n" - "工具結果回來後,用繁體中文自然回答,不要開場白,不要多餘的客套話。" + "3. get_knowledge — 查歷史分析知識庫\n" + "4. check_data_freshness — 確認業績資料最新可用日期,回答任何特定時段問題前必先呼叫\n\n" + "決策規則(ADR-019 Phase 2):\n" + "- 用戶用『本月/本週/今天』等相對時間 → 先 check_data_freshness\n" + "- 若 data_freshness_warning 顯示當月無資料,禁止編造『業績為零』," + "改主動問用戶是否要改看上月(並附 latest_data_date)\n" + "- 工具結果回來後用繁體中文自然回答,不要開場白,不要多餘客套話\n" + "- 同時呼叫多個工具時請平行送出" ) # 第一輪:讓 Gemini 判斷需要呼叫哪些工具