2026-01-23 12:38:11 - health.utils.env_loader - INFO - Loading extra configuration from: /Users/lili/workspace/bulter/.gemini.current.env
2026-01-23 12:38:11 - __main__ - INFO - Starting Butler Bot with Gemini model: gemini-3-flash
2026-01-23 12:38:12 - slack_bot.llm.gemini - INFO - Using proxy: http://127.0.0.1:8045
2026-01-23 12:38:12 - slack_bot.llm.gemini - INFO - Initialized Gemini model: gemini-3-flash
2026-01-23 12:38:12 - slack_bot.dispatcher - INFO - Dispatcher initialized with Gemini
2026-01-23 12:38:12 - __main__ - INFO - ⚡️ Butler (Gemini) is connected to Slack!
2026-01-23 13:04:01 - health.utils.env_loader - INFO - Loading extra configuration from: /Users/lili/workspace/bulter/.gemini.current.env
2026-01-23 13:04:01 - __main__ - INFO - Starting Butler Bot with Gemini model: gemini-3-flash
2026-01-23 13:04:03 - slack_bot.llm.gemini - INFO - Using proxy: http://127.0.0.1:8045
2026-01-23 13:04:03 - slack_bot.llm.gemini - INFO - Initialized Gemini model: gemini-3-flash
2026-01-23 13:04:03 - slack_bot.dispatcher - INFO - Dispatcher initialized with Gemini
2026-01-23 13:04:03 - __main__ - INFO - ⚡️ Butler (Gemini) is connected to Slack!
⚡️ Bolt app is running!
2026-01-23 13:04:48 - __main__ - INFO - [6c040917] 📥 Received message from U0A8ZCK7RJM in D0AA4GBQRKK: log_diet吃了一根香蕉 (Files: 0)
2026-01-23 13:04:48 - slack_bot.dispatcher - INFO - [6c040917] Processing message in D0AA4GBQRKK from U0A8ZCK7RJM
2026-01-23 13:04:48 - slack_bot.dispatcher - INFO - [6c040917] Calling Gemini for initial response...
2026-01-23 13:04:48 - slack_bot.llm.gemini - INFO - Sending payload to OpenAI Proxy: {"model": "gemini-3-flash", "messages": [{"role": "system", "content": "You are Butler, a personal health assistant for tracking and analyzing health data.\n\nYou help the user manage:\n- Sleep quality and patterns (from Garmin watch)\n- Exercise data: steps, activities, heart rate\n- Diet logs: meals, supplements, fasting modes (OMAD, PSMF)\n- Diet logs: meals, supplements, fasting modes (OMAD, PSMF)\n- Body feelings and symptoms\n\nGuidelines:\n- **DATA INTEGRITY IS PARAMOUNT**: Never hallucinate or invent data. If a tool returns \"No data found\", YOU MUST SAY \"I cannot find data for this date\". Do NOT guess numbers.\n- **VISION & IMAGES**: When analyzing images (e.g., food logs), if the image is unclear or unreadable, say \"I cannot identify the food in this image\". Do NOT guess ingredients you do not see.\n- Be concise and data-driven\n- When the user wants to log something (diet, supplement, etc), use the appropriate tool\n- When asked about health data, retrieve it first befo...
2026-01-23 13:04:52 - slack_bot.dispatcher - INFO - [6c040917] Gemini response in 4.43s: 0 chars, 1 tools
2026-01-23 13:04:52 - slack_bot.dispatcher - INFO - [6c040917] Executing 1 tools
2026-01-23 13:04:52 - slack_bot.dispatcher - INFO - [6c040917] Tool: log_diet Args: {'description': '一根香蕉', 'target_date': '2026-01-23'}
2026-01-23 13:04:52 - health.services.manual_log_storage - INFO - Saved manual log for 2026-01-23 to /Users/lili/workspace/bulter/data/health/manual_logs/2026/01/2026-01-23.json
2026-01-23 13:04:52 - health.services.manual_log_storage - INFO - Added diet entry for 2026-01-23 at 13:04
2026-01-23 13:04:52 - slack_bot.dispatcher - INFO - [6c040917] ✓ log_diet finished in 0.00s
2026-01-23 13:04:52 - slack_bot.dispatcher - INFO - [6c040917] Requesting final analysis...
2026-01-23 13:04:52 - slack_bot.llm.gemini - INFO - Sending payload to OpenAI Proxy: {"model": "gemini-3-flash", "messages": [{"role": "system", "content": "You are Butler, a personal health assistant for tracking and analyzing health data.\n\nYou help the user manage:\n- Sleep quality and patterns (from Garmin watch)\n- Exercise data: steps, activities, heart rate\n- Diet logs: meals, supplements, fasting modes (OMAD, PSMF)\n- Diet logs: meals, supplements, fasting modes (OMAD, PSMF)\n- Body feelings and symptoms\n\nGuidelines:\n- **DATA INTEGRITY IS PARAMOUNT**: Never hallucinate or invent data. If a tool returns \"No data found\", YOU MUST SAY \"I cannot find data for this date\". Do NOT guess numbers.\n- **VISION & IMAGES**: When analyzing images (e.g., food logs), if the image is unclear or unreadable, say \"I cannot identify the food in this image\". Do NOT guess ingredients you do not see.\n- Be concise and data-driven\n- When the user wants to log something (diet, supplement, etc), use the appropriate tool\n- When asked about health data, retrieve it first befo...
2026-01-23 13:04:57 - slack_bot.dispatcher - INFO - [6c040917] Final analysis received in 4.59s
2026-01-23 13:04:57 - slack_bot.dispatcher - INFO - Formatted text (len 179 -> 177)
2026-01-23 13:04:58 - slack_bot.dispatcher - INFO - [6c040917] 📤 Message updated 1769144688.442169
2026-01-23 13:04:58 - slack_bot.dispatcher - INFO - [6c040917] Dispatch completed in 9.49s
2026-01-23 13:04:58 - __main__ - INFO - [6c040917] ✅ Request completed in 9.96s
2026-01-23 13:05:55 - __main__ - INFO - [251964af] 📥 Received message from U0A8ZCK7RJM in D0AA4GBQRKK: 我还是有点担心胸闷的问题，因为今天早上运动了，现在症状不明显（也很有可能是心理作用），但是考虑到要坐飞机和应酬，我应该有些什么应对措施，即使是短时间内没那么健康的 (Files: 0)
2026-01-23 13:05:55 - slack_bot.dispatcher - INFO - [251964af] Processing message in D0AA4GBQRKK from U0A8ZCK7RJM
2026-01-23 13:05:55 - slack_bot.dispatcher - INFO - [251964af] Calling Gemini for initial response...
2026-01-23 13:05:55 - slack_bot.llm.gemini - INFO - Sending payload to OpenAI Proxy: {"model": "gemini-3-flash", "messages": [{"role": "system", "content": "You are Butler, a personal health assistant for tracking and analyzing health data.\n\nYou help the user manage:\n- Sleep quality and patterns (from Garmin watch)\n- Exercise data: steps, activities, heart rate\n- Diet logs: meals, supplements, fasting modes (OMAD, PSMF)\n- Diet logs: meals, supplements, fasting modes (OMAD, PSMF)\n- Body feelings and symptoms\n\nGuidelines:\n- **DATA INTEGRITY IS PARAMOUNT**: Never hallucinate or invent data. If a tool returns \"No data found\", YOU MUST SAY \"I cannot find data for this date\". Do NOT guess numbers.\n- **VISION & IMAGES**: When analyzing images (e.g., food logs), if the image is unclear or unreadable, say \"I cannot identify the food in this image\". Do NOT guess ingredients you do not see.\n- Be concise and data-driven\n- When the user wants to log something (diet, supplement, etc), use the appropriate tool\n- When asked about health data, retrieve it first befo...
2026-01-23 13:06:01 - slack_bot.llm.gemini - WARNING - JSON parse error: Extra data: line 1 column 79 (char 78). String: {"query":"pseudohypoxia chest tightness air travel biohacker countermeasures"}{"query":"mechanical c...
2026-01-23 13:06:01 - slack_bot.llm.gemini - INFO - Successfully recovered JSON using raw_decode
2026-01-23 13:06:01 - slack_bot.dispatcher - INFO - [251964af] Gemini response in 6.08s: 0 chars, 1 tools
2026-01-23 13:06:01 - slack_bot.dispatcher - INFO - [251964af] Executing 1 tools
2026-01-23 13:06:01 - slack_bot.dispatcher - INFO - [251964af] Tool: search_web Args: {'query': 'pseudohypoxia chest tightness air travel biohacker countermeasures'}
2026-01-23 13:06:01 - slack_bot.tools.web - INFO - Searching web for: pseudohypoxia chest tightness air travel biohacker countermeasures
/Users/lili/workspace/bulter/slack_bot/tools/web.py:23: RuntimeWarning: This package (`duckduckgo_search`) has been renamed to `ddgs`! Use `pip install ddgs` instead.
  results = DDGS().text(query, max_results=max_results)
2026-01-23 13:06:02 - slack_bot.dispatcher - INFO - [251964af] ✓ search_web finished in 0.28s
2026-01-23 13:06:02 - slack_bot.dispatcher - INFO - [251964af] Requesting final analysis...
2026-01-23 13:06:02 - slack_bot.llm.gemini - INFO - Sending payload to OpenAI Proxy: {"model": "gemini-3-flash", "messages": [{"role": "system", "content": "You are Butler, a personal health assistant for tracking and analyzing health data.\n\nYou help the user manage:\n- Sleep quality and patterns (from Garmin watch)\n- Exercise data: steps, activities, heart rate\n- Diet logs: meals, supplements, fasting modes (OMAD, PSMF)\n- Diet logs: meals, supplements, fasting modes (OMAD, PSMF)\n- Body feelings and symptoms\n\nGuidelines:\n- **DATA INTEGRITY IS PARAMOUNT**: Never hallucinate or invent data. If a tool returns \"No data found\", YOU MUST SAY \"I cannot find data for this date\". Do NOT guess numbers.\n- **VISION & IMAGES**: When analyzing images (e.g., food logs), if the image is unclear or unreadable, say \"I cannot identify the food in this image\". Do NOT guess ingredients you do not see.\n- Be concise and data-driven\n- When the user wants to log something (diet, supplement, etc), use the appropriate tool\n- When asked about health data, retrieve it first befo...
2026-01-23 13:06:18 - slack_bot.dispatcher - INFO - [251964af] Final analysis received in 16.64s
2026-01-23 13:06:18 - slack_bot.dispatcher - INFO - Formatted text (len 763 -> 731)
2026-01-23 13:06:19 - slack_bot.dispatcher - WARNING - [251964af] Update failed, posting new: The request to the Slack API failed. (url: https://slack.com/api/chat.update)
The server responded with: {'ok': False, 'error': 'msg_too_long'}
2026-01-23 13:06:19 - slack_bot.dispatcher - INFO - [251964af] Dispatch completed in 24.01s
2026-01-23 13:06:19 - __main__ - INFO - [251964af] ✅ Request completed in 24.48s
2026-01-23 13:26:47 - __main__ - INFO - [b22a34a8] 📥 Received message from U0A8ZCK7RJM in D0AA4GBQRKK: 是不是多吃点碳水是有帮助的，反正无非就是长胖点，影响几天的血糖 (Files: 0)
2026-01-23 13:26:48 - slack_bot.dispatcher - INFO - [b22a34a8] Processing message in D0AA4GBQRKK from U0A8ZCK7RJM
2026-01-23 13:26:48 - slack_bot.dispatcher - INFO - [b22a34a8] Calling Gemini for initial response...
2026-01-23 13:26:48 - slack_bot.llm.gemini - INFO - Sending payload to OpenAI Proxy: {"model": "gemini-3-flash", "messages": [{"role": "system", "content": "You are Butler, a personal health assistant for tracking and analyzing health data.\n\nYou help the user manage:\n- Sleep quality and patterns (from Garmin watch)\n- Exercise data: steps, activities, heart rate\n- Diet logs: meals, supplements, fasting modes (OMAD, PSMF)\n- Diet logs: meals, supplements, fasting modes (OMAD, PSMF)\n- Body feelings and symptoms\n\nGuidelines:\n- **DATA INTEGRITY IS PARAMOUNT**: Never hallucinate or invent data. If a tool returns \"No data found\", YOU MUST SAY \"I cannot find data for this date\". Do NOT guess numbers.\n- **VISION & IMAGES**: When analyzing images (e.g., food logs), if the image is unclear or unreadable, say \"I cannot identify the food in this image\". Do NOT guess ingredients you do not see.\n- Be concise and data-driven\n- When the user wants to log something (diet, supplement, etc), use the appropriate tool\n- When asked about health data, retrieve it first befo...
2026-01-23 13:27:06 - slack_bot.dispatcher - INFO - [b22a34a8] Gemini response in 18.66s: 1152 chars, 0 tools
2026-01-23 13:27:06 - slack_bot.dispatcher - INFO - Formatted text (len 1152 -> 1116)
2026-01-23 13:27:07 - slack_bot.dispatcher - INFO - [b22a34a8] 📤 Message updated 1769146008.059349
2026-01-23 13:27:07 - slack_bot.dispatcher - INFO - [b22a34a8] Dispatch completed in 19.19s
2026-01-23 13:27:07 - __main__ - INFO - [b22a34a8] ✅ Request completed in 19.67s
2026-01-23 13:30:07 - __main__ - INFO - [52c14b67] 📥 Received message from U0A8ZCK7RJM in D0AA4GBQRKK: 好的，请帮忙制定一个 (Files: 0)
2026-01-23 13:30:08 - slack_bot.dispatcher - INFO - [52c14b67] Processing message in D0AA4GBQRKK from U0A8ZCK7RJM
2026-01-23 13:30:08 - slack_bot.dispatcher - INFO - [52c14b67] Calling Gemini for initial response...
2026-01-23 13:30:08 - slack_bot.llm.gemini - INFO - Sending payload to OpenAI Proxy: {"model": "gemini-3-flash", "messages": [{"role": "system", "content": "You are Butler, a personal health assistant for tracking and analyzing health data.\n\nYou help the user manage:\n- Sleep quality and patterns (from Garmin watch)\n- Exercise data: steps, activities, heart rate\n- Diet logs: meals, supplements, fasting modes (OMAD, PSMF)\n- Diet logs: meals, supplements, fasting modes (OMAD, PSMF)\n- Body feelings and symptoms\n\nGuidelines:\n- **DATA INTEGRITY IS PARAMOUNT**: Never hallucinate or invent data. If a tool returns \"No data found\", YOU MUST SAY \"I cannot find data for this date\". Do NOT guess numbers.\n- **VISION & IMAGES**: When analyzing images (e.g., food logs), if the image is unclear or unreadable, say \"I cannot identify the food in this image\". Do NOT guess ingredients you do not see.\n- Be concise and data-driven\n- When the user wants to log something (diet, supplement, etc), use the appropriate tool\n- When asked about health data, retrieve it first befo...
2026-01-23 13:30:18 - slack_bot.dispatcher - INFO - [52c14b67] Gemini response in 10.62s: 1347 chars, 0 tools
2026-01-23 13:30:18 - slack_bot.dispatcher - INFO - Formatted text (len 1347 -> 1335)
2026-01-23 13:30:19 - slack_bot.dispatcher - INFO - [52c14b67] 📤 Message updated 1769146208.044249
2026-01-23 13:30:19 - slack_bot.dispatcher - INFO - [52c14b67] Dispatch completed in 11.28s
2026-01-23 13:30:19 - __main__ - INFO - [52c14b67] ✅ Request completed in 11.84s
2026-01-23 13:30:59 - __main__ - INFO - [613bf8bd] 📥 Received message from U0A8ZCK7RJM in D0AA4GBQRKK: 同步佳明数据 (Files: 0)
2026-01-23 13:31:00 - slack_bot.dispatcher - INFO - [613bf8bd] Processing message in D0AA4GBQRKK from U0A8ZCK7RJM
2026-01-23 13:31:00 - slack_bot.dispatcher - INFO - [613bf8bd] Calling Gemini for initial response...
2026-01-23 13:31:00 - slack_bot.llm.gemini - INFO - Sending payload to OpenAI Proxy: {"model": "gemini-3-flash", "messages": [{"role": "system", "content": "You are Butler, a personal health assistant for tracking and analyzing health data.\n\nYou help the user manage:\n- Sleep quality and patterns (from Garmin watch)\n- Exercise data: steps, activities, heart rate\n- Diet logs: meals, supplements, fasting modes (OMAD, PSMF)\n- Diet logs: meals, supplements, fasting modes (OMAD, PSMF)\n- Body feelings and symptoms\n\nGuidelines:\n- **DATA INTEGRITY IS PARAMOUNT**: Never hallucinate or invent data. If a tool returns \"No data found\", YOU MUST SAY \"I cannot find data for this date\". Do NOT guess numbers.\n- **VISION & IMAGES**: When analyzing images (e.g., food logs), if the image is unclear or unreadable, say \"I cannot identify the food in this image\". Do NOT guess ingredients you do not see.\n- Be concise and data-driven\n- When the user wants to log something (diet, supplement, etc), use the appropriate tool\n- When asked about health data, retrieve it first befo...
2026-01-23 13:31:03 - slack_bot.dispatcher - INFO - [613bf8bd] Gemini response in 2.87s: 0 chars, 1 tools
2026-01-23 13:31:03 - slack_bot.dispatcher - INFO - [613bf8bd] Executing 1 tools
2026-01-23 13:31:03 - slack_bot.dispatcher - INFO - [613bf8bd] Tool: sync_garmin Args: {'target_date': '2026-01-23'}
2026-01-23 13:31:03 - slack_bot.tools.garmin - INFO - Starting Garmin sync for 2026-01-23...
2026-01-23 13:31:03 - health.services.data_sync - INFO - Authenticating with Garmin...
2026-01-23 13:31:03 - health.services.garmin_client - INFO - Authenticating with Garmin Connect China for 350134531@qq.com
2026-01-23 13:31:04 - health.services.garmin_client - INFO - Successfully authenticated with Garmin Connect China
2026-01-23 13:31:04 - health.services.data_sync - INFO - Authentication successful
2026-01-23 13:31:04 - health.services.data_sync - INFO - Syncing 13 metric types from 2026-01-23 to 2026-01-23
2026-01-23 13:31:04 - health.services.data_sync - INFO - Syncing steps from 2026-01-23 to 2026-01-23 (1 days)
2026-01-23 13:31:04 - health.services.data_sync - INFO - ✓ Synced steps for 2026-01-23
2026-01-23 13:31:04 - health.services.data_sync - INFO - steps sync complete: 1 synced, 0 skipped, 0 errors
2026-01-23 13:31:04 - health.services.data_sync - INFO - Syncing heart_rate from 2026-01-23 to 2026-01-23 (1 days)
2026-01-23 13:31:04 - health.services.data_sync - INFO - ✓ Synced heart_rate for 2026-01-23
2026-01-23 13:31:04 - health.services.data_sync - INFO - heart_rate sync complete: 1 synced, 0 skipped, 0 errors
2026-01-23 13:31:04 - health.services.data_sync - INFO - Syncing sleep from 2026-01-23 to 2026-01-23 (1 days)
2026-01-23 13:31:05 - health.services.data_sync - INFO - ✓ Synced sleep for 2026-01-23
2026-01-23 13:31:05 - health.services.data_sync - INFO - sleep sync complete: 1 synced, 0 skipped, 0 errors
2026-01-23 13:31:05 - health.services.data_sync - INFO - Syncing stress from 2026-01-23 to 2026-01-23 (1 days)
2026-01-23 13:31:05 - health.services.data_sync - INFO - ✓ Synced stress for 2026-01-23
2026-01-23 13:31:05 - health.services.data_sync - INFO - stress sync complete: 1 synced, 0 skipped, 0 errors
2026-01-23 13:31:05 - health.services.data_sync - INFO - Syncing body_battery from 2026-01-23 to 2026-01-23 (1 days)
2026-01-23 13:31:05 - health.services.data_sync - INFO - ✓ Synced body_battery for 2026-01-23
2026-01-23 13:31:05 - health.services.data_sync - INFO - body_battery sync complete: 1 synced, 0 skipped, 0 errors
2026-01-23 13:31:05 - health.services.data_sync - INFO - Syncing spo2 from 2026-01-23 to 2026-01-23 (1 days)
2026-01-23 13:31:05 - health.services.data_sync - INFO - ✓ Synced spo2 for 2026-01-23
2026-01-23 13:31:05 - health.services.data_sync - INFO - spo2 sync complete: 1 synced, 0 skipped, 0 errors
2026-01-23 13:31:05 - health.services.data_sync - INFO - Syncing respiration from 2026-01-23 to 2026-01-23 (1 days)
2026-01-23 13:31:05 - health.services.data_sync - INFO - ✓ Synced respiration for 2026-01-23
2026-01-23 13:31:05 - health.services.data_sync - INFO - respiration sync complete: 1 synced, 0 skipped, 0 errors
2026-01-23 13:31:05 - health.services.data_sync - INFO - Syncing hydration from 2026-01-23 to 2026-01-23 (1 days)
2026-01-23 13:31:05 - health.services.data_sync - INFO - ✓ Synced hydration for 2026-01-23
2026-01-23 13:31:05 - health.services.data_sync - INFO - hydration sync complete: 1 synced, 0 skipped, 0 errors
2026-01-23 13:31:05 - health.services.data_sync - INFO - Syncing floors from 2026-01-23 to 2026-01-23 (1 days)
2026-01-23 13:31:05 - health.services.data_sync - INFO - ✓ Synced floors for 2026-01-23
2026-01-23 13:31:05 - health.services.data_sync - INFO - floors sync complete: 1 synced, 0 skipped, 0 errors
2026-01-23 13:31:05 - health.services.data_sync - INFO - Syncing intensity_minutes from 2026-01-23 to 2026-01-23 (1 days)
2026-01-23 13:31:05 - health.services.data_sync - INFO - ✓ Synced intensity_minutes for 2026-01-23
2026-01-23 13:31:05 - health.services.data_sync - INFO - intensity_minutes sync complete: 1 synced, 0 skipped, 0 errors
2026-01-23 13:31:05 - health.services.data_sync - INFO - Syncing hrv from 2026-01-23 to 2026-01-23 (1 days)
2026-01-23 13:31:05 - health.services.data_sync - INFO - ✓ Synced hrv for 2026-01-23
2026-01-23 13:31:05 - health.services.data_sync - INFO - hrv sync complete: 1 synced, 0 skipped, 0 errors
2026-01-23 13:31:05 - health.services.data_sync - INFO - Syncing rhr from 2026-01-23 to 2026-01-23 (1 days)
2026-01-23 13:31:06 - health.services.data_sync - INFO - ✓ Synced rhr for 2026-01-23
2026-01-23 13:31:06 - health.services.data_sync - INFO - rhr sync complete: 1 synced, 0 skipped, 0 errors
2026-01-23 13:31:06 - health.services.data_sync - INFO - Syncing weight from 2026-01-23 to 2026-01-23 (1 days)
2026-01-23 13:31:06 - health.services.data_sync - INFO - ✓ Synced weight for 2026-01-23
2026-01-23 13:31:06 - health.services.data_sync - INFO - weight sync complete: 1 synced, 0 skipped, 0 errors
2026-01-23 13:31:06 - health.services.data_sync - INFO - Syncing activities from 2026-01-23 to 2026-01-23
2026-01-23 13:31:06 - health.services.garmin_client - INFO - Fetched 1 activities
2026-01-23 13:31:06 - health.services.data_sync - INFO - Found 1 activities
2026-01-23 13:31:06 - health.services.data_sync - INFO - ✓ Synced activity 559897702 (elliptical) on 2026-01-23
2026-01-23 13:31:06 - health.services.data_sync - INFO - Activity sync complete: 1 synced, 0 skipped, 0 errors
2026-01-23 13:31:06 - health.services.query - INFO - Querying health data summary for 2026-01-23
2026-01-23 13:31:06 - health.services.query - INFO - Found 13 metrics and 1 activities
2026-01-23 13:31:06 - slack_bot.dispatcher - INFO - [613bf8bd] ✓ sync_garmin finished in 3.01s
2026-01-23 13:31:06 - slack_bot.dispatcher - INFO - [613bf8bd] Requesting final analysis...
2026-01-23 13:31:06 - slack_bot.llm.gemini - INFO - Sending payload to OpenAI Proxy: {"model": "gemini-3-flash", "messages": [{"role": "system", "content": "You are Butler, a personal health assistant for tracking and analyzing health data.\n\nYou help the user manage:\n- Sleep quality and patterns (from Garmin watch)\n- Exercise data: steps, activities, heart rate\n- Diet logs: meals, supplements, fasting modes (OMAD, PSMF)\n- Diet logs: meals, supplements, fasting modes (OMAD, PSMF)\n- Body feelings and symptoms\n\nGuidelines:\n- **DATA INTEGRITY IS PARAMOUNT**: Never hallucinate or invent data. If a tool returns \"No data found\", YOU MUST SAY \"I cannot find data for this date\". Do NOT guess numbers.\n- **VISION & IMAGES**: When analyzing images (e.g., food logs), if the image is unclear or unreadable, say \"I cannot identify the food in this image\". Do NOT guess ingredients you do not see.\n- Be concise and data-driven\n- When the user wants to log something (diet, supplement, etc), use the appropriate tool\n- When asked about health data, retrieve it first befo...
2026-01-23 13:31:14 - slack_bot.dispatcher - INFO - [613bf8bd] Final analysis received in 7.69s
2026-01-23 13:31:14 - slack_bot.dispatcher - INFO - Formatted text (len 583 -> 565)
2026-01-23 13:31:14 - slack_bot.dispatcher - INFO - [613bf8bd] 📤 Message updated 1769146260.391989
2026-01-23 13:31:14 - slack_bot.dispatcher - INFO - [613bf8bd] Dispatch completed in 14.08s
2026-01-23 13:31:14 - __main__ - INFO - [613bf8bd] ✅ Request completed in 14.62s
2026-01-23 13:32:11 - __main__ - INFO - [e5fa9f9d] 📥 Received message from U0A8ZCK7RJM in D0AA4GBQRKK: 最近几天的体重会不会掉的有点太快了，我有点担心 (Files: 0)
2026-01-23 13:32:11 - slack_bot.dispatcher - INFO - [e5fa9f9d] Processing message in D0AA4GBQRKK from U0A8ZCK7RJM
2026-01-23 13:32:11 - slack_bot.dispatcher - INFO - [e5fa9f9d] Calling Gemini for initial response...
2026-01-23 13:32:11 - slack_bot.llm.gemini - INFO - Sending payload to OpenAI Proxy: {"model": "gemini-3-flash", "messages": [{"role": "system", "content": "You are Butler, a personal health assistant for tracking and analyzing health data.\n\nYou help the user manage:\n- Sleep quality and patterns (from Garmin watch)\n- Exercise data: steps, activities, heart rate\n- Diet logs: meals, supplements, fasting modes (OMAD, PSMF)\n- Diet logs: meals, supplements, fasting modes (OMAD, PSMF)\n- Body feelings and symptoms\n\nGuidelines:\n- **DATA INTEGRITY IS PARAMOUNT**: Never hallucinate or invent data. If a tool returns \"No data found\", YOU MUST SAY \"I cannot find data for this date\". Do NOT guess numbers.\n- **VISION & IMAGES**: When analyzing images (e.g., food logs), if the image is unclear or unreadable, say \"I cannot identify the food in this image\". Do NOT guess ingredients you do not see.\n- Be concise and data-driven\n- When the user wants to log something (diet, supplement, etc), use the appropriate tool\n- When asked about health data, retrieve it first befo...
2026-01-23 13:32:14 - slack_bot.llm.gemini - WARNING - JSON parse error: Extra data: line 1 column 75 (char 74). String: {"end_date":"2026-01-23","metric_type":"weight","start_date":"2026-01-09"}{"end_date":"2026-01-23","...
2026-01-23 13:32:14 - slack_bot.llm.gemini - INFO - Successfully recovered JSON using raw_decode
2026-01-23 13:32:14 - slack_bot.dispatcher - INFO - [e5fa9f9d] Gemini response in 2.53s: 0 chars, 1 tools
2026-01-23 13:32:14 - slack_bot.dispatcher - INFO - [e5fa9f9d] Executing 1 tools
2026-01-23 13:32:14 - slack_bot.dispatcher - INFO - [e5fa9f9d] Tool: get_manual_history Args: {'end_date': '2026-01-23', 'metric_type': 'weight', 'start_date': '2026-01-09'}
2026-01-23 13:32:14 - slack_bot.tools.health_read - WARNING - get_manual_history received unexpected args: {'metric_type': 'weight'}
2026-01-23 13:32:14 - slack_bot.dispatcher - INFO - [e5fa9f9d] ✓ get_manual_history finished in 0.00s
2026-01-23 13:32:14 - slack_bot.dispatcher - INFO - [e5fa9f9d] Requesting final analysis...
2026-01-23 13:32:14 - slack_bot.llm.gemini - INFO - Sending payload to OpenAI Proxy: {"model": "gemini-3-flash", "messages": [{"role": "system", "content": "You are Butler, a personal health assistant for tracking and analyzing health data.\n\nYou help the user manage:\n- Sleep quality and patterns (from Garmin watch)\n- Exercise data: steps, activities, heart rate\n- Diet logs: meals, supplements, fasting modes (OMAD, PSMF)\n- Diet logs: meals, supplements, fasting modes (OMAD, PSMF)\n- Body feelings and symptoms\n\nGuidelines:\n- **DATA INTEGRITY IS PARAMOUNT**: Never hallucinate or invent data. If a tool returns \"No data found\", YOU MUST SAY \"I cannot find data for this date\". Do NOT guess numbers.\n- **VISION & IMAGES**: When analyzing images (e.g., food logs), if the image is unclear or unreadable, say \"I cannot identify the food in this image\". Do NOT guess ingredients you do not see.\n- Be concise and data-driven\n- When the user wants to log something (diet, supplement, etc), use the appropriate tool\n- When asked about health data, retrieve it first befo...
2026-01-23 13:32:26 - slack_bot.dispatcher - INFO - [e5fa9f9d] Final analysis received in 11.85s
2026-01-23 13:32:26 - slack_bot.dispatcher - INFO - Formatted text (len 788 -> 754)
2026-01-23 13:32:26 - slack_bot.dispatcher - WARNING - [e5fa9f9d] Update failed, posting new: The request to the Slack API failed. (url: https://slack.com/api/chat.update)
The server responded with: {'ok': False, 'error': 'msg_too_long'}
2026-01-23 13:32:27 - slack_bot.dispatcher - INFO - [e5fa9f9d] Dispatch completed in 15.38s
2026-01-23 13:32:27 - __main__ - INFO - [e5fa9f9d] ✅ Request completed in 15.96s
2026-01-23 16:40:08 - __main__ - INFO - [8de2c83f] 📥 Received message from U0A8ZCK7RJM in D0AA4GBQRKK: 由于学期结束，晚上要带老婆小孩吃大餐，有什么推荐或者注意的吗 (Files: 0)
2026-01-23 16:40:09 - slack_bot.dispatcher - INFO - [8de2c83f] Processing message in D0AA4GBQRKK from U0A8ZCK7RJM
2026-01-23 16:40:09 - slack_bot.dispatcher - INFO - [8de2c83f] Calling Gemini for initial response...
2026-01-23 16:40:09 - slack_bot.llm.gemini - INFO - Sending payload to OpenAI Proxy: {"model": "gemini-3-flash", "messages": [{"role": "system", "content": "You are Butler, a personal health assistant for tracking and analyzing health data.\n\nYou help the user manage:\n- Sleep quality and patterns (from Garmin watch)\n- Exercise data: steps, activities, heart rate\n- Diet logs: meals, supplements, fasting modes (OMAD, PSMF)\n- Diet logs: meals, supplements, fasting modes (OMAD, PSMF)\n- Body feelings and symptoms\n\nGuidelines:\n- **DATA INTEGRITY IS PARAMOUNT**: Never hallucinate or invent data. If a tool returns \"No data found\", YOU MUST SAY \"I cannot find data for this date\". Do NOT guess numbers.\n- **VISION & IMAGES**: When analyzing images (e.g., food logs), if the image is unclear or unreadable, say \"I cannot identify the food in this image\". Do NOT guess ingredients you do not see.\n- Be concise and data-driven\n- When the user wants to log something (diet, supplement, etc), use the appropriate tool\n- When asked about health data, retrieve it first befo...
2026-01-23 16:40:26 - slack_bot.dispatcher - INFO - [8de2c83f] Gemini response in 16.61s: 1266 chars, 0 tools
2026-01-23 16:40:26 - slack_bot.dispatcher - INFO - Formatted text (len 1266 -> 1204)
2026-01-23 16:40:26 - slack_bot.dispatcher - INFO - [8de2c83f] 📤 Message updated 1769157609.462949
2026-01-23 16:40:26 - slack_bot.dispatcher - INFO - [8de2c83f] Dispatch completed in 17.19s
2026-01-23 16:40:26 - __main__ - INFO - [8de2c83f] ✅ Request completed in 17.76s
2026-01-23 21:00:44 - __main__ - INFO - [18a491ab] 📥 Received message from U0A8ZCK7RJM in D0AA4GBQRKK: 晚上七点吃了粤菜，有窑鸡，花菜和鹅肠，以及半碗米饭 (Files: 0)
2026-01-23 21:00:44 - slack_bot.dispatcher - INFO - [18a491ab] Processing message in D0AA4GBQRKK from U0A8ZCK7RJM
2026-01-23 21:00:44 - slack_bot.dispatcher - INFO - [18a491ab] Calling Gemini for initial response...
2026-01-23 21:00:44 - slack_bot.llm.gemini - INFO - Sending payload to OpenAI Proxy: {"model": "gemini-3-flash", "messages": [{"role": "system", "content": "You are Butler, a personal health assistant for tracking and analyzing health data.\n\nYou help the user manage:\n- Sleep quality and patterns (from Garmin watch)\n- Exercise data: steps, activities, heart rate\n- Diet logs: meals, supplements, fasting modes (OMAD, PSMF)\n- Diet logs: meals, supplements, fasting modes (OMAD, PSMF)\n- Body feelings and symptoms\n\nGuidelines:\n- **DATA INTEGRITY IS PARAMOUNT**: Never hallucinate or invent data. If a tool returns \"No data found\", YOU MUST SAY \"I cannot find data for this date\". Do NOT guess numbers.\n- **VISION & IMAGES**: When analyzing images (e.g., food logs), if the image is unclear or unreadable, say \"I cannot identify the food in this image\". Do NOT guess ingredients you do not see.\n- Be concise and data-driven\n- When the user wants to log something (diet, supplement, etc), use the appropriate tool\n- When asked about health data, retrieve it first befo...
2026-01-23 21:00:56 - slack_bot.dispatcher - INFO - [18a491ab] Gemini response in 12.11s: 906 chars, 0 tools
2026-01-23 21:00:56 - slack_bot.dispatcher - INFO - Formatted text (len 906 -> 886)
2026-01-23 21:00:57 - slack_bot.dispatcher - INFO - [18a491ab] 📤 Message updated 1769173244.456329
2026-01-23 21:00:57 - slack_bot.dispatcher - INFO - [18a491ab] Dispatch completed in 12.78s
2026-01-23 21:00:57 - __main__ - INFO - [18a491ab] ✅ Request completed in 13.27s
2026-01-24 08:37:35 - __main__ - INFO - [fc768594] 📥 Received message from U0A8ZCK7RJM in D0AA4GBQRKK: 同步佳明数据 (Files: 0)
2026-01-24 08:37:36 - slack_bot.dispatcher - INFO - [fc768594] Processing message in D0AA4GBQRKK from U0A8ZCK7RJM
2026-01-24 08:37:36 - slack_bot.dispatcher - INFO - [fc768594] Calling Gemini for initial response...
2026-01-24 08:37:36 - slack_bot.llm.gemini - INFO - Sending payload to OpenAI Proxy: {"model": "gemini-3-flash", "messages": [{"role": "system", "content": "You are Butler, a personal health assistant for tracking and analyzing health data.\n\nYou help the user manage:\n- Sleep quality and patterns (from Garmin watch)\n- Exercise data: steps, activities, heart rate\n- Diet logs: meals, supplements, fasting modes (OMAD, PSMF)\n- Diet logs: meals, supplements, fasting modes (OMAD, PSMF)\n- Body feelings and symptoms\n\nGuidelines:\n- **DATA INTEGRITY IS PARAMOUNT**: Never hallucinate or invent data. If a tool returns \"No data found\", YOU MUST SAY \"I cannot find data for this date\". Do NOT guess numbers.\n- **VISION & IMAGES**: When analyzing images (e.g., food logs), if the image is unclear or unreadable, say \"I cannot identify the food in this image\". Do NOT guess ingredients you do not see.\n- Be concise and data-driven\n- When the user wants to log something (diet, supplement, etc), use the appropriate tool\n- When asked about health data, retrieve it first befo...
2026-01-24 08:37:40 - slack_bot.dispatcher - INFO - [fc768594] Gemini response in 4.26s: 0 chars, 1 tools
2026-01-24 08:37:40 - slack_bot.dispatcher - INFO - [fc768594] Executing 1 tools
2026-01-24 08:37:40 - slack_bot.dispatcher - INFO - [fc768594] Tool: sync_garmin Args: {'target_date': '2026-01-23'}
2026-01-24 08:37:40 - slack_bot.tools.garmin - INFO - Starting Garmin sync for 2026-01-23...
2026-01-24 08:37:40 - health.services.data_sync - INFO - Authenticating with Garmin...
2026-01-24 08:37:40 - health.services.garmin_client - INFO - Authenticating with Garmin Connect China for 350134531@qq.com
2026-01-24 08:37:41 - health.services.garmin_client - INFO - Successfully authenticated with Garmin Connect China
2026-01-24 08:37:41 - health.services.data_sync - INFO - Authentication successful
2026-01-24 08:37:41 - health.services.data_sync - INFO - Syncing 13 metric types from 2026-01-23 to 2026-01-23
2026-01-24 08:37:41 - health.services.data_sync - INFO - Syncing steps from 2026-01-23 to 2026-01-23 (1 days)
2026-01-24 08:37:41 - health.services.data_sync - INFO - ✓ Synced steps for 2026-01-23
2026-01-24 08:37:41 - health.services.data_sync - INFO - steps sync complete: 1 synced, 0 skipped, 0 errors
2026-01-24 08:37:41 - health.services.data_sync - INFO - Syncing heart_rate from 2026-01-23 to 2026-01-23 (1 days)
2026-01-24 08:37:41 - health.services.data_sync - INFO - ✓ Synced heart_rate for 2026-01-23
2026-01-24 08:37:41 - health.services.data_sync - INFO - heart_rate sync complete: 1 synced, 0 skipped, 0 errors
2026-01-24 08:37:41 - health.services.data_sync - INFO - Syncing sleep from 2026-01-23 to 2026-01-23 (1 days)
2026-01-24 08:37:41 - health.services.data_sync - INFO - ✓ Synced sleep for 2026-01-23
2026-01-24 08:37:41 - health.services.data_sync - INFO - sleep sync complete: 1 synced, 0 skipped, 0 errors
2026-01-24 08:37:41 - health.services.data_sync - INFO - Syncing stress from 2026-01-23 to 2026-01-23 (1 days)
2026-01-24 08:37:41 - health.services.data_sync - INFO - ✓ Synced stress for 2026-01-23
2026-01-24 08:37:41 - health.services.data_sync - INFO - stress sync complete: 1 synced, 0 skipped, 0 errors
2026-01-24 08:37:41 - health.services.data_sync - INFO - Syncing body_battery from 2026-01-23 to 2026-01-23 (1 days)
2026-01-24 08:37:41 - health.services.data_sync - INFO - ✓ Synced body_battery for 2026-01-23
2026-01-24 08:37:41 - health.services.data_sync - INFO - body_battery sync complete: 1 synced, 0 skipped, 0 errors
2026-01-24 08:37:41 - health.services.data_sync - INFO - Syncing spo2 from 2026-01-23 to 2026-01-23 (1 days)
2026-01-24 08:37:41 - health.services.data_sync - INFO - ✓ Synced spo2 for 2026-01-23
2026-01-24 08:37:41 - health.services.data_sync - INFO - spo2 sync complete: 1 synced, 0 skipped, 0 errors
2026-01-24 08:37:41 - health.services.data_sync - INFO - Syncing respiration from 2026-01-23 to 2026-01-23 (1 days)
2026-01-24 08:37:42 - health.services.data_sync - INFO - ✓ Synced respiration for 2026-01-23
2026-01-24 08:37:42 - health.services.data_sync - INFO - respiration sync complete: 1 synced, 0 skipped, 0 errors
2026-01-24 08:37:42 - health.services.data_sync - INFO - Syncing hydration from 2026-01-23 to 2026-01-23 (1 days)
2026-01-24 08:37:42 - health.services.data_sync - INFO - ✓ Synced hydration for 2026-01-23
2026-01-24 08:37:42 - health.services.data_sync - INFO - hydration sync complete: 1 synced, 0 skipped, 0 errors
2026-01-24 08:37:42 - health.services.data_sync - INFO - Syncing floors from 2026-01-23 to 2026-01-23 (1 days)
2026-01-24 08:37:42 - health.services.data_sync - INFO - ✓ Synced floors for 2026-01-23
2026-01-24 08:37:42 - health.services.data_sync - INFO - floors sync complete: 1 synced, 0 skipped, 0 errors
2026-01-24 08:37:42 - health.services.data_sync - INFO - Syncing intensity_minutes from 2026-01-23 to 2026-01-23 (1 days)
2026-01-24 08:37:42 - health.services.data_sync - INFO - ✓ Synced intensity_minutes for 2026-01-23
2026-01-24 08:37:42 - health.services.data_sync - INFO - intensity_minutes sync complete: 1 synced, 0 skipped, 0 errors
2026-01-24 08:37:42 - health.services.data_sync - INFO - Syncing hrv from 2026-01-23 to 2026-01-23 (1 days)
2026-01-24 08:37:42 - health.services.data_sync - INFO - ✓ Synced hrv for 2026-01-23
2026-01-24 08:37:42 - health.services.data_sync - INFO - hrv sync complete: 1 synced, 0 skipped, 0 errors
2026-01-24 08:37:42 - health.services.data_sync - INFO - Syncing rhr from 2026-01-23 to 2026-01-23 (1 days)
2026-01-24 08:37:42 - health.services.data_sync - INFO - ✓ Synced rhr for 2026-01-23
2026-01-24 08:37:42 - health.services.data_sync - INFO - rhr sync complete: 1 synced, 0 skipped, 0 errors
2026-01-24 08:37:42 - health.services.data_sync - INFO - Syncing weight from 2026-01-23 to 2026-01-23 (1 days)
2026-01-24 08:37:42 - health.services.data_sync - INFO - ✓ Synced weight for 2026-01-23
2026-01-24 08:37:42 - health.services.data_sync - INFO - weight sync complete: 1 synced, 0 skipped, 0 errors
2026-01-24 08:37:42 - health.services.data_sync - INFO - Syncing activities from 2026-01-23 to 2026-01-23
2026-01-24 08:37:42 - health.services.garmin_client - INFO - Fetched 1 activities
2026-01-24 08:37:42 - health.services.data_sync - INFO - Found 1 activities
2026-01-24 08:37:42 - health.services.data_sync - INFO - ✓ Synced activity 559897702 (elliptical) on 2026-01-23
2026-01-24 08:37:42 - health.services.data_sync - INFO - Activity sync complete: 1 synced, 0 skipped, 0 errors
2026-01-24 08:37:43 - health.services.query - INFO - Querying health data summary for 2026-01-23
2026-01-24 08:37:43 - health.services.query - INFO - Found 13 metrics and 1 activities
2026-01-24 08:37:43 - slack_bot.dispatcher - INFO - [fc768594] ✓ sync_garmin finished in 2.50s
2026-01-24 08:37:43 - slack_bot.dispatcher - INFO - [fc768594] Requesting final analysis...
2026-01-24 08:37:43 - slack_bot.llm.gemini - INFO - Sending payload to OpenAI Proxy: {"model": "gemini-3-flash", "messages": [{"role": "system", "content": "You are Butler, a personal health assistant for tracking and analyzing health data.\n\nYou help the user manage:\n- Sleep quality and patterns (from Garmin watch)\n- Exercise data: steps, activities, heart rate\n- Diet logs: meals, supplements, fasting modes (OMAD, PSMF)\n- Diet logs: meals, supplements, fasting modes (OMAD, PSMF)\n- Body feelings and symptoms\n\nGuidelines:\n- **DATA INTEGRITY IS PARAMOUNT**: Never hallucinate or invent data. If a tool returns \"No data found\", YOU MUST SAY \"I cannot find data for this date\". Do NOT guess numbers.\n- **VISION & IMAGES**: When analyzing images (e.g., food logs), if the image is unclear or unreadable, say \"I cannot identify the food in this image\". Do NOT guess ingredients you do not see.\n- Be concise and data-driven\n- When the user wants to log something (diet, supplement, etc), use the appropriate tool\n- When asked about health data, retrieve it first befo...
2026-01-24 08:37:50 - slack_bot.dispatcher - INFO - [fc768594] Final analysis received in 7.51s
2026-01-24 08:37:50 - slack_bot.dispatcher - INFO - Formatted text (len 652 -> 624)
2026-01-24 08:37:51 - slack_bot.dispatcher - INFO - [fc768594] 📤 Message updated 1769215056.269699
2026-01-24 08:37:51 - slack_bot.dispatcher - INFO - [fc768594] Dispatch completed in 14.95s
2026-01-24 08:37:51 - __main__ - INFO - [fc768594] ✅ Request completed in 15.51s
2026-01-24 15:32:12 - __main__ - INFO - [082ec129] 📥 Received message from U0A8ZCK7RJM in D0AA4GBQRKK: 拉取佳明数据 (Files: 0)
2026-01-24 15:32:12 - slack_bot.dispatcher - INFO - [082ec129] Processing message in D0AA4GBQRKK from U0A8ZCK7RJM
2026-01-24 15:32:12 - slack_bot.dispatcher - INFO - [082ec129] Calling Gemini for initial response...
2026-01-24 15:32:12 - slack_bot.llm.gemini - INFO - Sending payload to OpenAI Proxy: {"model": "gemini-3-flash", "messages": [{"role": "system", "content": "You are Butler, a personal health assistant for tracking and analyzing health data.\n\nYou help the user manage:\n- Sleep quality and patterns (from Garmin watch)\n- Exercise data: steps, activities, heart rate\n- Diet logs: meals, supplements, fasting modes (OMAD, PSMF)\n- Diet logs: meals, supplements, fasting modes (OMAD, PSMF)\n- Body feelings and symptoms\n\nGuidelines:\n- **DATA INTEGRITY IS PARAMOUNT**: Never hallucinate or invent data. If a tool returns \"No data found\", YOU MUST SAY \"I cannot find data for this date\". Do NOT guess numbers.\n- **VISION & IMAGES**: When analyzing images (e.g., food logs), if the image is unclear or unreadable, say \"I cannot identify the food in this image\". Do NOT guess ingredients you do not see.\n- Be concise and data-driven\n- When the user wants to log something (diet, supplement, etc), use the appropriate tool\n- When asked about health data, retrieve it first befo...
2026-01-24 15:32:18 - slack_bot.dispatcher - INFO - [082ec129] Gemini response in 5.74s: 0 chars, 1 tools
2026-01-24 15:32:18 - slack_bot.dispatcher - INFO - [082ec129] Executing 1 tools
2026-01-24 15:32:18 - slack_bot.dispatcher - INFO - [082ec129] Tool: sync_garmin Args: {'target_date': '2026-01-23'}
2026-01-24 15:32:18 - slack_bot.tools.garmin - INFO - Starting Garmin sync for 2026-01-23...
2026-01-24 15:32:18 - health.services.data_sync - INFO - Authenticating with Garmin...
2026-01-24 15:32:18 - health.services.garmin_client - INFO - Authenticating with Garmin Connect China for 350134531@qq.com
2026-01-24 15:32:18 - health.services.garmin_client - INFO - Successfully authenticated with Garmin Connect China
2026-01-24 15:32:18 - health.services.data_sync - INFO - Authentication successful
2026-01-24 15:32:18 - health.services.data_sync - INFO - Syncing 13 metric types from 2026-01-23 to 2026-01-23
2026-01-24 15:32:18 - health.services.data_sync - INFO - Syncing steps from 2026-01-23 to 2026-01-23 (1 days)
2026-01-24 15:32:18 - health.services.data_sync - INFO - ✓ Synced steps for 2026-01-23
2026-01-24 15:32:18 - health.services.data_sync - INFO - steps sync complete: 1 synced, 0 skipped, 0 errors
2026-01-24 15:32:18 - health.services.data_sync - INFO - Syncing heart_rate from 2026-01-23 to 2026-01-23 (1 days)
2026-01-24 15:32:19 - health.services.data_sync - INFO - ✓ Synced heart_rate for 2026-01-23
2026-01-24 15:32:19 - health.services.data_sync - INFO - heart_rate sync complete: 1 synced, 0 skipped, 0 errors
2026-01-24 15:32:19 - health.services.data_sync - INFO - Syncing sleep from 2026-01-23 to 2026-01-23 (1 days)
2026-01-24 15:32:19 - health.services.data_sync - INFO - ✓ Synced sleep for 2026-01-23
2026-01-24 15:32:19 - health.services.data_sync - INFO - sleep sync complete: 1 synced, 0 skipped, 0 errors
2026-01-24 15:32:19 - health.services.data_sync - INFO - Syncing stress from 2026-01-23 to 2026-01-23 (1 days)
2026-01-24 15:32:19 - health.services.data_sync - INFO - ✓ Synced stress for 2026-01-23
2026-01-24 15:32:19 - health.services.data_sync - INFO - stress sync complete: 1 synced, 0 skipped, 0 errors
2026-01-24 15:32:19 - health.services.data_sync - INFO - Syncing body_battery from 2026-01-23 to 2026-01-23 (1 days)
2026-01-24 15:32:19 - health.services.data_sync - INFO - ✓ Synced body_battery for 2026-01-23
2026-01-24 15:32:19 - health.services.data_sync - INFO - body_battery sync complete: 1 synced, 0 skipped, 0 errors
2026-01-24 15:32:19 - health.services.data_sync - INFO - Syncing spo2 from 2026-01-23 to 2026-01-23 (1 days)
2026-01-24 15:32:19 - health.services.data_sync - INFO - ✓ Synced spo2 for 2026-01-23
2026-01-24 15:32:19 - health.services.data_sync - INFO - spo2 sync complete: 1 synced, 0 skipped, 0 errors
2026-01-24 15:32:19 - health.services.data_sync - INFO - Syncing respiration from 2026-01-23 to 2026-01-23 (1 days)
2026-01-24 15:32:19 - health.services.data_sync - INFO - ✓ Synced respiration for 2026-01-23
2026-01-24 15:32:19 - health.services.data_sync - INFO - respiration sync complete: 1 synced, 0 skipped, 0 errors
2026-01-24 15:32:19 - health.services.data_sync - INFO - Syncing hydration from 2026-01-23 to 2026-01-23 (1 days)
2026-01-24 15:32:19 - health.services.data_sync - INFO - ✓ Synced hydration for 2026-01-23
2026-01-24 15:32:19 - health.services.data_sync - INFO - hydration sync complete: 1 synced, 0 skipped, 0 errors
2026-01-24 15:32:19 - health.services.data_sync - INFO - Syncing floors from 2026-01-23 to 2026-01-23 (1 days)
2026-01-24 15:32:19 - health.services.data_sync - INFO - ✓ Synced floors for 2026-01-23
2026-01-24 15:32:19 - health.services.data_sync - INFO - floors sync complete: 1 synced, 0 skipped, 0 errors
2026-01-24 15:32:19 - health.services.data_sync - INFO - Syncing intensity_minutes from 2026-01-23 to 2026-01-23 (1 days)
2026-01-24 15:32:20 - health.services.data_sync - INFO - ✓ Synced intensity_minutes for 2026-01-23
2026-01-24 15:32:20 - health.services.data_sync - INFO - intensity_minutes sync complete: 1 synced, 0 skipped, 0 errors
2026-01-24 15:32:20 - health.services.data_sync - INFO - Syncing hrv from 2026-01-23 to 2026-01-23 (1 days)
2026-01-24 15:32:20 - health.services.data_sync - INFO - ✓ Synced hrv for 2026-01-23
2026-01-24 15:32:20 - health.services.data_sync - INFO - hrv sync complete: 1 synced, 0 skipped, 0 errors
2026-01-24 15:32:20 - health.services.data_sync - INFO - Syncing rhr from 2026-01-23 to 2026-01-23 (1 days)
2026-01-24 15:32:20 - health.services.data_sync - INFO - ✓ Synced rhr for 2026-01-23
2026-01-24 15:32:20 - health.services.data_sync - INFO - rhr sync complete: 1 synced, 0 skipped, 0 errors
2026-01-24 15:32:20 - health.services.data_sync - INFO - Syncing weight from 2026-01-23 to 2026-01-23 (1 days)
2026-01-24 15:32:20 - health.services.data_sync - INFO - ✓ Synced weight for 2026-01-23
2026-01-24 15:32:20 - health.services.data_sync - INFO - weight sync complete: 1 synced, 0 skipped, 0 errors
2026-01-24 15:32:20 - health.services.data_sync - INFO - Syncing activities from 2026-01-23 to 2026-01-23
2026-01-24 15:32:20 - health.services.garmin_client - INFO - Fetched 1 activities
2026-01-24 15:32:20 - health.services.data_sync - INFO - Found 1 activities
2026-01-24 15:32:20 - health.services.data_sync - INFO - ✓ Synced activity 559897702 (elliptical) on 2026-01-23
2026-01-24 15:32:20 - health.services.data_sync - INFO - Activity sync complete: 1 synced, 0 skipped, 0 errors
2026-01-24 15:32:20 - health.services.query - INFO - Querying health data summary for 2026-01-23
2026-01-24 15:32:20 - health.services.query - INFO - Found 13 metrics and 1 activities
2026-01-24 15:32:20 - slack_bot.dispatcher - INFO - [082ec129] ✓ sync_garmin finished in 2.25s
2026-01-24 15:32:20 - slack_bot.dispatcher - INFO - [082ec129] Requesting final analysis...
2026-01-24 15:32:20 - slack_bot.llm.gemini - INFO - Sending payload to OpenAI Proxy: {"model": "gemini-3-flash", "messages": [{"role": "system", "content": "You are Butler, a personal health assistant for tracking and analyzing health data.\n\nYou help the user manage:\n- Sleep quality and patterns (from Garmin watch)\n- Exercise data: steps, activities, heart rate\n- Diet logs: meals, supplements, fasting modes (OMAD, PSMF)\n- Diet logs: meals, supplements, fasting modes (OMAD, PSMF)\n- Body feelings and symptoms\n\nGuidelines:\n- **DATA INTEGRITY IS PARAMOUNT**: Never hallucinate or invent data. If a tool returns \"No data found\", YOU MUST SAY \"I cannot find data for this date\". Do NOT guess numbers.\n- **VISION & IMAGES**: When analyzing images (e.g., food logs), if the image is unclear or unreadable, say \"I cannot identify the food in this image\". Do NOT guess ingredients you do not see.\n- Be concise and data-driven\n- When the user wants to log something (diet, supplement, etc), use the appropriate tool\n- When asked about health data, retrieve it first befo...
2026-01-24 15:32:28 - slack_bot.dispatcher - INFO - [082ec129] Final analysis received in 7.86s
2026-01-24 15:32:28 - slack_bot.dispatcher - INFO - Formatted text (len 490 -> 470)
2026-01-24 15:32:28 - slack_bot.dispatcher - INFO - [082ec129] 📤 Message updated 1769239932.424889
2026-01-24 15:32:28 - slack_bot.dispatcher - INFO - [082ec129] Dispatch completed in 16.44s
2026-01-24 15:32:28 - __main__ - INFO - [082ec129] ✅ Request completed in 16.96s
2026-01-24 15:32:56 - __main__ - INFO - [e8fbe297] 📥 Received message from U0A8ZCK7RJM in D0AA4GBQRKK: 今天是一月二十四日 (Files: 0)
2026-01-24 15:32:56 - slack_bot.dispatcher - INFO - [e8fbe297] Processing message in D0AA4GBQRKK from U0A8ZCK7RJM
2026-01-24 15:32:56 - slack_bot.dispatcher - INFO - [e8fbe297] Calling Gemini for initial response...
2026-01-24 15:32:56 - slack_bot.llm.gemini - INFO - Sending payload to OpenAI Proxy: {"model": "gemini-3-flash", "messages": [{"role": "system", "content": "You are Butler, a personal health assistant for tracking and analyzing health data.\n\nYou help the user manage:\n- Sleep quality and patterns (from Garmin watch)\n- Exercise data: steps, activities, heart rate\n- Diet logs: meals, supplements, fasting modes (OMAD, PSMF)\n- Diet logs: meals, supplements, fasting modes (OMAD, PSMF)\n- Body feelings and symptoms\n\nGuidelines:\n- **DATA INTEGRITY IS PARAMOUNT**: Never hallucinate or invent data. If a tool returns \"No data found\", YOU MUST SAY \"I cannot find data for this date\". Do NOT guess numbers.\n- **VISION & IMAGES**: When analyzing images (e.g., food logs), if the image is unclear or unreadable, say \"I cannot identify the food in this image\". Do NOT guess ingredients you do not see.\n- Be concise and data-driven\n- When the user wants to log something (diet, supplement, etc), use the appropriate tool\n- When asked about health data, retrieve it first befo...
2026-01-24 15:33:01 - slack_bot.llm.gemini - WARNING - JSON parse error: Extra data: line 1 column 29 (char 28). String: {"target_date":"2026-01-24"}{"target_date":"2026-01-24"}...
2026-01-24 15:33:01 - slack_bot.llm.gemini - INFO - Successfully recovered JSON using raw_decode
2026-01-24 15:33:01 - slack_bot.dispatcher - INFO - [e8fbe297] Gemini response in 4.09s: 0 chars, 1 tools
2026-01-24 15:33:01 - slack_bot.dispatcher - INFO - [e8fbe297] Executing 1 tools
2026-01-24 15:33:01 - slack_bot.dispatcher - INFO - [e8fbe297] Tool: get_daily_detailed_stats Args: {'target_date': '2026-01-24'}
2026-01-24 15:33:01 - health.services.query - INFO - Querying health data summary for 2026-01-24
2026-01-24 15:33:01 - health.services.query - INFO - Found 0 metrics and 0 activities
2026-01-24 15:33:01 - slack_bot.tools.health_read - INFO - Data missing for 2026-01-24, attempting auto-sync...
2026-01-24 15:33:01 - health.services.data_sync - INFO - Authenticating with Garmin...
2026-01-24 15:33:01 - health.services.garmin_client - INFO - Authenticating with Garmin Connect China for 350134531@qq.com
2026-01-24 15:33:01 - health.services.garmin_client - INFO - Successfully authenticated with Garmin Connect China
2026-01-24 15:33:01 - health.services.data_sync - INFO - Authentication successful
2026-01-24 15:33:01 - health.services.data_sync - INFO - Syncing 13 metric types from 2026-01-24 to 2026-01-24
2026-01-24 15:33:01 - health.services.data_sync - INFO - Syncing steps from 2026-01-24 to 2026-01-24 (1 days)
2026-01-24 15:33:01 - health.services.data_sync - INFO - ✓ Synced steps for 2026-01-24
2026-01-24 15:33:01 - health.services.data_sync - INFO - steps sync complete: 1 synced, 0 skipped, 0 errors
2026-01-24 15:33:01 - health.services.data_sync - INFO - Syncing heart_rate from 2026-01-24 to 2026-01-24 (1 days)
2026-01-24 15:33:01 - health.services.data_sync - INFO - ✓ Synced heart_rate for 2026-01-24
2026-01-24 15:33:01 - health.services.data_sync - INFO - heart_rate sync complete: 1 synced, 0 skipped, 0 errors
2026-01-24 15:33:01 - health.services.data_sync - INFO - Syncing sleep from 2026-01-24 to 2026-01-24 (1 days)
2026-01-24 15:33:01 - health.services.data_sync - INFO - ✓ Synced sleep for 2026-01-24
2026-01-24 15:33:01 - health.services.data_sync - INFO - sleep sync complete: 1 synced, 0 skipped, 0 errors
2026-01-24 15:33:01 - health.services.data_sync - INFO - Syncing stress from 2026-01-24 to 2026-01-24 (1 days)
2026-01-24 15:33:02 - health.services.data_sync - INFO - ✓ Synced stress for 2026-01-24
2026-01-24 15:33:02 - health.services.data_sync - INFO - stress sync complete: 1 synced, 0 skipped, 0 errors
2026-01-24 15:33:02 - health.services.data_sync - INFO - Syncing body_battery from 2026-01-24 to 2026-01-24 (1 days)
2026-01-24 15:33:02 - health.services.data_sync - INFO - ✓ Synced body_battery for 2026-01-24
2026-01-24 15:33:02 - health.services.data_sync - INFO - body_battery sync complete: 1 synced, 0 skipped, 0 errors
2026-01-24 15:33:02 - health.services.data_sync - INFO - Syncing spo2 from 2026-01-24 to 2026-01-24 (1 days)
2026-01-24 15:33:02 - health.services.data_sync - INFO - ✓ Synced spo2 for 2026-01-24
2026-01-24 15:33:02 - health.services.data_sync - INFO - spo2 sync complete: 1 synced, 0 skipped, 0 errors
2026-01-24 15:33:02 - health.services.data_sync - INFO - Syncing respiration from 2026-01-24 to 2026-01-24 (1 days)
2026-01-24 15:33:02 - health.services.data_sync - INFO - ✓ Synced respiration for 2026-01-24
2026-01-24 15:33:02 - health.services.data_sync - INFO - respiration sync complete: 1 synced, 0 skipped, 0 errors
2026-01-24 15:33:02 - health.services.data_sync - INFO - Syncing hydration from 2026-01-24 to 2026-01-24 (1 days)
2026-01-24 15:33:02 - health.services.data_sync - INFO - ✓ Synced hydration for 2026-01-24
2026-01-24 15:33:02 - health.services.data_sync - INFO - hydration sync complete: 1 synced, 0 skipped, 0 errors
2026-01-24 15:33:02 - health.services.data_sync - INFO - Syncing floors from 2026-01-24 to 2026-01-24 (1 days)
2026-01-24 15:33:02 - health.services.data_sync - INFO - ✓ Synced floors for 2026-01-24
2026-01-24 15:33:02 - health.services.data_sync - INFO - floors sync complete: 1 synced, 0 skipped, 0 errors
2026-01-24 15:33:02 - health.services.data_sync - INFO - Syncing intensity_minutes from 2026-01-24 to 2026-01-24 (1 days)
2026-01-24 15:33:02 - health.services.data_sync - INFO - ✓ Synced intensity_minutes for 2026-01-24
2026-01-24 15:33:02 - health.services.data_sync - INFO - intensity_minutes sync complete: 1 synced, 0 skipped, 0 errors
2026-01-24 15:33:02 - health.services.data_sync - INFO - Syncing hrv from 2026-01-24 to 2026-01-24 (1 days)
2026-01-24 15:33:02 - health.services.data_sync - INFO - ✓ Synced hrv for 2026-01-24
2026-01-24 15:33:02 - health.services.data_sync - INFO - hrv sync complete: 1 synced, 0 skipped, 0 errors
2026-01-24 15:33:02 - health.services.data_sync - INFO - Syncing rhr from 2026-01-24 to 2026-01-24 (1 days)
2026-01-24 15:33:02 - health.services.data_sync - INFO - ✓ Synced rhr for 2026-01-24
2026-01-24 15:33:02 - health.services.data_sync - INFO - rhr sync complete: 1 synced, 0 skipped, 0 errors
2026-01-24 15:33:02 - health.services.data_sync - INFO - Syncing weight from 2026-01-24 to 2026-01-24 (1 days)
2026-01-24 15:33:02 - health.services.data_sync - INFO - weight sync complete: 0 synced, 1 skipped, 0 errors
2026-01-24 15:33:02 - health.services.data_sync - INFO - Syncing activities from 2026-01-24 to 2026-01-24
2026-01-24 15:33:02 - health.services.data_sync - INFO - Found 0 activities
2026-01-24 15:33:02 - health.services.data_sync - INFO - Activity sync complete: 0 synced, 0 skipped, 0 errors
2026-01-24 15:33:02 - health.services.query - INFO - Querying health data summary for 2026-01-24
2026-01-24 15:33:03 - health.services.query - INFO - Found 12 metrics and 0 activities
2026-01-24 15:33:03 - slack_bot.tools.health_read - INFO - Auto-sync completed, re-queried data.
2026-01-24 15:33:03 - slack_bot.dispatcher - INFO - [e8fbe297] ✓ get_daily_detailed_stats finished in 2.00s
2026-01-24 15:33:03 - slack_bot.dispatcher - INFO - [e8fbe297] Requesting final analysis...
2026-01-24 15:33:03 - slack_bot.llm.gemini - INFO - Sending payload to OpenAI Proxy: {"model": "gemini-3-flash", "messages": [{"role": "system", "content": "You are Butler, a personal health assistant for tracking and analyzing health data.\n\nYou help the user manage:\n- Sleep quality and patterns (from Garmin watch)\n- Exercise data: steps, activities, heart rate\n- Diet logs: meals, supplements, fasting modes (OMAD, PSMF)\n- Diet logs: meals, supplements, fasting modes (OMAD, PSMF)\n- Body feelings and symptoms\n\nGuidelines:\n- **DATA INTEGRITY IS PARAMOUNT**: Never hallucinate or invent data. If a tool returns \"No data found\", YOU MUST SAY \"I cannot find data for this date\". Do NOT guess numbers.\n- **VISION & IMAGES**: When analyzing images (e.g., food logs), if the image is unclear or unreadable, say \"I cannot identify the food in this image\". Do NOT guess ingredients you do not see.\n- Be concise and data-driven\n- When the user wants to log something (diet, supplement, etc), use the appropriate tool\n- When asked about health data, retrieve it first befo...
2026-01-24 15:33:11 - slack_bot.dispatcher - INFO - [e8fbe297] Final analysis received in 8.63s
2026-01-24 15:33:11 - slack_bot.dispatcher - INFO - Formatted text (len 519 -> 495)
2026-01-24 15:33:12 - slack_bot.dispatcher - INFO - [e8fbe297] 📤 Message updated 1769239976.846709
2026-01-24 15:33:12 - slack_bot.dispatcher - INFO - [e8fbe297] Dispatch completed in 15.27s
2026-01-24 15:33:12 - __main__ - INFO - [e8fbe297] ✅ Request completed in 15.73s
2026-01-24 15:43:05 - __main__ - INFO - [0a4f0d78] 📥 Received message from U0A8ZCK7RJM in D0AA4GBQRKK: 最近总是感觉略微胸闷，是否还是跟碳水摄入不足有强关联 (Files: 0)
2026-01-24 15:43:06 - slack_bot.dispatcher - INFO - [0a4f0d78] Processing message in D0AA4GBQRKK from U0A8ZCK7RJM
2026-01-24 15:43:06 - slack_bot.dispatcher - INFO - [0a4f0d78] Calling Gemini for initial response...
2026-01-24 15:43:06 - slack_bot.llm.gemini - INFO - Sending payload to OpenAI Proxy: {"model": "gemini-3-flash", "messages": [{"role": "system", "content": "You are Butler, a personal health assistant for tracking and analyzing health data.\n\nYou help the user manage:\n- Sleep quality and patterns (from Garmin watch)\n- Exercise data: steps, activities, heart rate\n- Diet logs: meals, supplements, fasting modes (OMAD, PSMF)\n- Diet logs: meals, supplements, fasting modes (OMAD, PSMF)\n- Body feelings and symptoms\n\nGuidelines:\n- **DATA INTEGRITY IS PARAMOUNT**: Never hallucinate or invent data. If a tool returns \"No data found\", YOU MUST SAY \"I cannot find data for this date\". Do NOT guess numbers.\n- **VISION & IMAGES**: When analyzing images (e.g., food logs), if the image is unclear or unreadable, say \"I cannot identify the food in this image\". Do NOT guess ingredients you do not see.\n- Be concise and data-driven\n- When the user wants to log something (diet, supplement, etc), use the appropriate tool\n- When asked about health data, retrieve it first befo...
2026-01-24 15:43:12 - slack_bot.llm.gemini - WARNING - JSON parse error: Extra data: line 1 column 74 (char 73). String: {"category":"feelings","end_date":"2026-01-24","start_date":"2026-01-10"}{"category":"diet","end_dat...
2026-01-24 15:43:12 - slack_bot.llm.gemini - INFO - Successfully recovered JSON using raw_decode
2026-01-24 15:43:12 - slack_bot.dispatcher - INFO - [0a4f0d78] Gemini response in 6.21s: 0 chars, 1 tools
2026-01-24 15:43:12 - slack_bot.dispatcher - INFO - [0a4f0d78] Executing 1 tools
2026-01-24 15:43:12 - slack_bot.dispatcher - INFO - [0a4f0d78] Tool: analyze_driver Args: {'category': 'feelings', 'end_date': '2026-01-24', 'start_date': '2026-01-10'}
2026-01-24 15:43:12 - slack_bot.dispatcher - ERROR - [0a4f0d78] Error executing analyze_driver: AnalyticsTool.analyze_driver() got an unexpected keyword argument 'category'
2026-01-24 15:43:12 - slack_bot.dispatcher - INFO - [0a4f0d78] Requesting final analysis...
2026-01-24 15:43:12 - slack_bot.llm.gemini - INFO - Sending payload to OpenAI Proxy: {"model": "gemini-3-flash", "messages": [{"role": "system", "content": "You are Butler, a personal health assistant for tracking and analyzing health data.\n\nYou help the user manage:\n- Sleep quality and patterns (from Garmin watch)\n- Exercise data: steps, activities, heart rate\n- Diet logs: meals, supplements, fasting modes (OMAD, PSMF)\n- Diet logs: meals, supplements, fasting modes (OMAD, PSMF)\n- Body feelings and symptoms\n\nGuidelines:\n- **DATA INTEGRITY IS PARAMOUNT**: Never hallucinate or invent data. If a tool returns \"No data found\", YOU MUST SAY \"I cannot find data for this date\". Do NOT guess numbers.\n- **VISION & IMAGES**: When analyzing images (e.g., food logs), if the image is unclear or unreadable, say \"I cannot identify the food in this image\". Do NOT guess ingredients you do not see.\n- Be concise and data-driven\n- When the user wants to log something (diet, supplement, etc), use the appropriate tool\n- When asked about health data, retrieve it first befo...
2026-01-24 15:43:25 - slack_bot.dispatcher - INFO - [0a4f0d78] Final analysis received in 13.35s
2026-01-24 15:43:25 - slack_bot.dispatcher - INFO - Formatted text (len 940 -> 910)
2026-01-24 15:43:26 - slack_bot.dispatcher - INFO - [0a4f0d78] 📤 Message updated 1769240586.103939
2026-01-24 15:43:26 - slack_bot.dispatcher - INFO - [0a4f0d78] Dispatch completed in 20.09s
2026-01-24 15:43:26 - __main__ - INFO - [0a4f0d78] ✅ Request completed in 20.63s
2026-01-24 15:46:04 - __main__ - INFO - [ea874430] 📥 Received message from U0A8ZCK7RJM in D0AA4GBQRKK: 泰式spa会不会有帮助，还有晚上可能需要面对酒精 (Files: 0)
2026-01-24 15:46:04 - slack_bot.dispatcher - INFO - [ea874430] Processing message in D0AA4GBQRKK from U0A8ZCK7RJM
2026-01-24 15:46:04 - slack_bot.dispatcher - INFO - [ea874430] Calling Gemini for initial response...
2026-01-24 15:46:04 - slack_bot.llm.gemini - INFO - Sending payload to OpenAI Proxy: {"model": "gemini-3-flash", "messages": [{"role": "system", "content": "You are Butler, a personal health assistant for tracking and analyzing health data.\n\nYou help the user manage:\n- Sleep quality and patterns (from Garmin watch)\n- Exercise data: steps, activities, heart rate\n- Diet logs: meals, supplements, fasting modes (OMAD, PSMF)\n- Diet logs: meals, supplements, fasting modes (OMAD, PSMF)\n- Body feelings and symptoms\n\nGuidelines:\n- **DATA INTEGRITY IS PARAMOUNT**: Never hallucinate or invent data. If a tool returns \"No data found\", YOU MUST SAY \"I cannot find data for this date\". Do NOT guess numbers.\n- **VISION & IMAGES**: When analyzing images (e.g., food logs), if the image is unclear or unreadable, say \"I cannot identify the food in this image\". Do NOT guess ingredients you do not see.\n- Be concise and data-driven\n- When the user wants to log something (diet, supplement, etc), use the appropriate tool\n- When asked about health data, retrieve it first befo...
2026-01-24 15:46:12 - slack_bot.dispatcher - INFO - [ea874430] Gemini response in 8.20s: 0 chars, 1 tools
2026-01-24 15:46:12 - slack_bot.dispatcher - INFO - [ea874430] Executing 1 tools
2026-01-24 15:46:12 - slack_bot.dispatcher - INFO - [ea874430] Tool: get_health_insights Args: {'analysis_type': 'recovery_correlations', 'lookback_days': 30}
2026-01-24 15:46:12 - health.services.query - INFO - Querying sleep from 2025-12-25 to 2026-01-24
2026-01-24 15:46:12 - health.services.query - INFO - Found 31 records for sleep
2026-01-24 15:46:12 - health.services.query - INFO - Querying heart_rate from 2025-12-25 to 2026-01-24
2026-01-24 15:46:12 - health.services.query - INFO - Found 31 records for heart_rate
2026-01-24 15:46:12 - health.services.query - INFO - Querying stress from 2025-12-25 to 2026-01-24
2026-01-24 15:46:12 - health.services.query - INFO - Found 31 records for stress
2026-01-24 15:46:12 - health.services.query - INFO - Querying body_battery from 2025-12-25 to 2026-01-24
2026-01-24 15:46:12 - health.services.query - INFO - Found 31 records for body_battery
2026-01-24 15:46:12 - health.services.query - INFO - Querying steps from 2025-12-25 to 2026-01-24
2026-01-24 15:46:12 - health.services.query - INFO - Found 31 records for steps
2026-01-24 15:46:12 - health.services.query - INFO - Querying hrv from 2025-12-25 to 2026-01-24
2026-01-24 15:46:12 - health.services.query - INFO - Found 31 records for hrv
2026-01-24 15:46:12 - health.services.query - INFO - Querying rhr from 2025-12-25 to 2026-01-24
2026-01-24 15:46:12 - health.services.query - INFO - Found 31 records for rhr
2026-01-24 15:46:12 - slack_bot.tools.analytics - ERROR - Error generating insights: 'has_alcohol'
2026-01-24 15:46:12 - slack_bot.dispatcher - INFO - [ea874430] ✓ get_health_insights finished in 0.29s
2026-01-24 15:46:12 - slack_bot.dispatcher - INFO - [ea874430] Requesting final analysis...
2026-01-24 15:46:12 - slack_bot.llm.gemini - INFO - Sending payload to OpenAI Proxy: {"model": "gemini-3-flash", "messages": [{"role": "system", "content": "You are Butler, a personal health assistant for tracking and analyzing health data.\n\nYou help the user manage:\n- Sleep quality and patterns (from Garmin watch)\n- Exercise data: steps, activities, heart rate\n- Diet logs: meals, supplements, fasting modes (OMAD, PSMF)\n- Diet logs: meals, supplements, fasting modes (OMAD, PSMF)\n- Body feelings and symptoms\n\nGuidelines:\n- **DATA INTEGRITY IS PARAMOUNT**: Never hallucinate or invent data. If a tool returns \"No data found\", YOU MUST SAY \"I cannot find data for this date\". Do NOT guess numbers.\n- **VISION & IMAGES**: When analyzing images (e.g., food logs), if the image is unclear or unreadable, say \"I cannot identify the food in this image\". Do NOT guess ingredients you do not see.\n- Be concise and data-driven\n- When the user wants to log something (diet, supplement, etc), use the appropriate tool\n- When asked about health data, retrieve it first befo...
2026-01-24 15:46:21 - slack_bot.dispatcher - INFO - [ea874430] Final analysis received in 8.86s
2026-01-24 15:46:21 - slack_bot.dispatcher - INFO - Formatted text (len 802 -> 766)
2026-01-24 15:46:22 - slack_bot.dispatcher - INFO - [ea874430] 📤 Message updated 1769240764.398959
2026-01-24 15:46:22 - slack_bot.dispatcher - INFO - [ea874430] Dispatch completed in 17.89s
2026-01-24 15:46:22 - __main__ - INFO - [ea874430] ✅ Request completed in 18.36s
2026-01-24 19:55:32 - __main__ - INFO - [52cc59dd] 📥 Received message from U0A8ZCK7RJM in D0AA4GBQRKK: ---:fish:今日晚餐介绍---

【曼谷银都鱼翅酒楼】唐人街的味觉传奇

:star2:73年鱼翅老店，屹立于唐人街心脏地带逾半世纪

:stew:招牌顶级鱼翅，用的不是水，是每日用老鸡、火腿、龙骨吊足十小时以上的“金汤”，软糯中带着一丝筋骨，浓郁醇厚。

[Grin]老饕暗语：“来银都，不是吃饭，是喝翅膀。”

这个的营养价值怎么样 (Files: 0)
2026-01-24 19:55:33 - slack_bot.dispatcher - INFO - [52cc59dd] Processing message in D0AA4GBQRKK from U0A8ZCK7RJM
2026-01-24 19:55:33 - slack_bot.dispatcher - INFO - [52cc59dd] Calling Gemini for initial response...
2026-01-24 19:55:33 - slack_bot.llm.gemini - INFO - Sending payload to OpenAI Proxy: {"model": "gemini-3-flash", "messages": [{"role": "system", "content": "You are Butler, a personal health assistant for tracking and analyzing health data.\n\nYou help the user manage:\n- Sleep quality and patterns (from Garmin watch)\n- Exercise data: steps, activities, heart rate\n- Diet logs: meals, supplements, fasting modes (OMAD, PSMF)\n- Diet logs: meals, supplements, fasting modes (OMAD, PSMF)\n- Body feelings and symptoms\n\nGuidelines:\n- **DATA INTEGRITY IS PARAMOUNT**: Never hallucinate or invent data. If a tool returns \"No data found\", YOU MUST SAY \"I cannot find data for this date\". Do NOT guess numbers.\n- **VISION & IMAGES**: When analyzing images (e.g., food logs), if the image is unclear or unreadable, say \"I cannot identify the food in this image\". Do NOT guess ingredients you do not see.\n- Be concise and data-driven\n- When the user wants to log something (diet, supplement, etc), use the appropriate tool\n- When asked about health data, retrieve it first befo...
2026-01-24 19:55:44 - slack_bot.dispatcher - INFO - [52cc59dd] Gemini response in 11.72s: 2559 chars, 0 tools
2026-01-24 19:55:44 - slack_bot.dispatcher - INFO - Formatted text (len 2559 -> 2517)
2026-01-24 19:55:45 - slack_bot.dispatcher - WARNING - [52cc59dd] Update failed, posting new: The request to the Slack API failed. (url: https://slack.com/api/chat.update)
The server responded with: {'ok': False, 'error': 'msg_too_long'}
2026-01-24 19:55:45 - slack_bot.dispatcher - INFO - [52cc59dd] Dispatch completed in 12.70s
2026-01-24 19:55:45 - __main__ - INFO - [52cc59dd] ✅ Request completed in 13.18s
2026-01-24 19:58:06 - __main__ - INFO - [7b0b8b40] 📥 Received message from U0A8ZCK7RJM in D0AA4GBQRKK: 记录 (Files: 0)
2026-01-24 19:58:06 - slack_bot.dispatcher - INFO - [7b0b8b40] Processing message in D0AA4GBQRKK from U0A8ZCK7RJM
2026-01-24 19:58:06 - slack_bot.dispatcher - INFO - [7b0b8b40] Calling Gemini for initial response...
2026-01-24 19:58:06 - slack_bot.llm.gemini - INFO - Sending payload to OpenAI Proxy: {"model": "gemini-3-flash", "messages": [{"role": "system", "content": "You are Butler, a personal health assistant for tracking and analyzing health data.\n\nYou help the user manage:\n- Sleep quality and patterns (from Garmin watch)\n- Exercise data: steps, activities, heart rate\n- Diet logs: meals, supplements, fasting modes (OMAD, PSMF)\n- Diet logs: meals, supplements, fasting modes (OMAD, PSMF)\n- Body feelings and symptoms\n\nGuidelines:\n- **DATA INTEGRITY IS PARAMOUNT**: Never hallucinate or invent data. If a tool returns \"No data found\", YOU MUST SAY \"I cannot find data for this date\". Do NOT guess numbers.\n- **VISION & IMAGES**: When analyzing images (e.g., food logs), if the image is unclear or unreadable, say \"I cannot identify the food in this image\". Do NOT guess ingredients you do not see.\n- Be concise and data-driven\n- When the user wants to log something (diet, supplement, etc), use the appropriate tool\n- When asked about health data, retrieve it first befo...
2026-01-24 19:58:15 - slack_bot.dispatcher - INFO - [7b0b8b40] Gemini response in 8.59s: 597 chars, 0 tools
2026-01-24 19:58:15 - slack_bot.dispatcher - INFO - Formatted text (len 597 -> 585)
2026-01-24 19:58:16 - slack_bot.dispatcher - INFO - [7b0b8b40] 📤 Message updated 1769255886.817709
2026-01-24 19:58:16 - slack_bot.dispatcher - INFO - [7b0b8b40] Dispatch completed in 9.18s
2026-01-24 19:58:16 - __main__ - INFO - [7b0b8b40] ✅ Request completed in 9.70s
2026-01-25 09:30:13 - __main__ - INFO - [fcef0d9b] 📥 Received message from U0A8ZCK7RJM in D0AA4GBQRKK: 记录1月25日晚喝了两杯红酒，一杯啤酒，一盅白酒 (Files: 0)
2026-01-25 09:30:13 - slack_bot.dispatcher - INFO - [fcef0d9b] Processing message in D0AA4GBQRKK from U0A8ZCK7RJM
2026-01-25 09:30:13 - slack_bot.dispatcher - INFO - [fcef0d9b] Calling Gemini for initial response...
2026-01-25 09:30:13 - slack_bot.llm.gemini - INFO - Sending payload to OpenAI Proxy: {"model": "gemini-3-flash", "messages": [{"role": "system", "content": "You are Butler, a personal health assistant for tracking and analyzing health data.\n\nYou help the user manage:\n- Sleep quality and patterns (from Garmin watch)\n- Exercise data: steps, activities, heart rate\n- Diet logs: meals, supplements, fasting modes (OMAD, PSMF)\n- Diet logs: meals, supplements, fasting modes (OMAD, PSMF)\n- Body feelings and symptoms\n\nGuidelines:\n- **DATA INTEGRITY IS PARAMOUNT**: Never hallucinate or invent data. If a tool returns \"No data found\", YOU MUST SAY \"I cannot find data for this date\". Do NOT guess numbers.\n- **VISION & IMAGES**: When analyzing images (e.g., food logs), if the image is unclear or unreadable, say \"I cannot identify the food in this image\". Do NOT guess ingredients you do not see.\n- Be concise and data-driven\n- When the user wants to log something (diet, supplement, etc), use the appropriate tool\n- When asked about health data, retrieve it first befo...
2026-01-25 09:30:21 - slack_bot.llm.gemini - WARNING - JSON parse error: Extra data: line 1 column 101 (char 100). String: {"alcohol_type":"红酒 (Red Wine)","amount":"2杯 (2 glasses)","target_date":"2026-01-25","time":"20:00"}...
2026-01-25 09:30:21 - slack_bot.llm.gemini - INFO - Successfully recovered JSON using raw_decode
2026-01-25 09:30:21 - slack_bot.dispatcher - INFO - [fcef0d9b] Gemini response in 7.72s: 0 chars, 1 tools
2026-01-25 09:30:21 - slack_bot.dispatcher - INFO - [fcef0d9b] Executing 1 tools
2026-01-25 09:30:21 - slack_bot.dispatcher - INFO - [fcef0d9b] Tool: log_alcohol Args: {'alcohol_type': '红酒 (Red Wine)', 'amount': '2杯 (2 glasses)', 'target_date': '2026-01-25', 'time': '20:00'}
2026-01-25 09:30:21 - slack_bot.tools.health_write - ERROR - Failed to log alcohol: 1 validation error for AlcoholEntry
drink_type
  Field required [type=missing, input_value={'time': '20:00', 'alcoho...nt': '2杯 (2 glasses)'}, input_type=dict]
    For further information visit https://errors.pydantic.dev/2.12/v/missing
2026-01-25 09:30:21 - slack_bot.dispatcher - INFO - [fcef0d9b] ✓ log_alcohol finished in 0.00s
2026-01-25 09:30:21 - slack_bot.dispatcher - INFO - [fcef0d9b] Requesting final analysis...
2026-01-25 09:30:21 - slack_bot.llm.gemini - INFO - Sending payload to OpenAI Proxy: {"model": "gemini-3-flash", "messages": [{"role": "system", "content": "You are Butler, a personal health assistant for tracking and analyzing health data.\n\nYou help the user manage:\n- Sleep quality and patterns (from Garmin watch)\n- Exercise data: steps, activities, heart rate\n- Diet logs: meals, supplements, fasting modes (OMAD, PSMF)\n- Diet logs: meals, supplements, fasting modes (OMAD, PSMF)\n- Body feelings and symptoms\n\nGuidelines:\n- **DATA INTEGRITY IS PARAMOUNT**: Never hallucinate or invent data. If a tool returns \"No data found\", YOU MUST SAY \"I cannot find data for this date\". Do NOT guess numbers.\n- **VISION & IMAGES**: When analyzing images (e.g., food logs), if the image is unclear or unreadable, say \"I cannot identify the food in this image\". Do NOT guess ingredients you do not see.\n- Be concise and data-driven\n- When the user wants to log something (diet, supplement, etc), use the appropriate tool\n- When asked about health data, retrieve it first befo...
2026-01-25 09:30:28 - slack_bot.dispatcher - INFO - [fcef0d9b] Final analysis received in 7.12s
2026-01-25 09:30:28 - slack_bot.dispatcher - INFO - Formatted text (len 1214 -> 1190)
2026-01-25 09:30:28 - slack_bot.dispatcher - INFO - [fcef0d9b] 📤 Message updated 1769304613.536699
2026-01-25 09:30:28 - slack_bot.dispatcher - INFO - [fcef0d9b] Dispatch completed in 15.32s
2026-01-25 09:30:28 - __main__ - INFO - [fcef0d9b] ✅ Request completed in 15.79s
2026-01-25 09:31:02 - __main__ - INFO - [bed534a7] 📥 Received message from U0A8ZCK7RJM in D0AA4GBQRKK: 拉取佳明数据 (Files: 0)
2026-01-25 09:31:02 - slack_bot.dispatcher - INFO - [bed534a7] Processing message in D0AA4GBQRKK from U0A8ZCK7RJM
2026-01-25 09:31:02 - slack_bot.dispatcher - INFO - [bed534a7] Calling Gemini for initial response...
2026-01-25 09:31:02 - slack_bot.llm.gemini - INFO - Sending payload to OpenAI Proxy: {"model": "gemini-3-flash", "messages": [{"role": "system", "content": "You are Butler, a personal health assistant for tracking and analyzing health data.\n\nYou help the user manage:\n- Sleep quality and patterns (from Garmin watch)\n- Exercise data: steps, activities, heart rate\n- Diet logs: meals, supplements, fasting modes (OMAD, PSMF)\n- Diet logs: meals, supplements, fasting modes (OMAD, PSMF)\n- Body feelings and symptoms\n\nGuidelines:\n- **DATA INTEGRITY IS PARAMOUNT**: Never hallucinate or invent data. If a tool returns \"No data found\", YOU MUST SAY \"I cannot find data for this date\". Do NOT guess numbers.\n- **VISION & IMAGES**: When analyzing images (e.g., food logs), if the image is unclear or unreadable, say \"I cannot identify the food in this image\". Do NOT guess ingredients you do not see.\n- Be concise and data-driven\n- When the user wants to log something (diet, supplement, etc), use the appropriate tool\n- When asked about health data, retrieve it first befo...
2026-01-25 09:31:08 - slack_bot.llm.gemini - WARNING - JSON parse error: Extra data: line 1 column 29 (char 28). String: {"target_date":"2026-01-23"}{"target_date":"2026-01-24"}{"target_date":"2026-01-25"}...
2026-01-25 09:31:08 - slack_bot.llm.gemini - INFO - Successfully recovered JSON using raw_decode
2026-01-25 09:31:08 - slack_bot.dispatcher - INFO - [bed534a7] Gemini response in 5.23s: 0 chars, 1 tools
2026-01-25 09:31:08 - slack_bot.dispatcher - INFO - [bed534a7] Executing 1 tools
2026-01-25 09:31:08 - slack_bot.dispatcher - INFO - [bed534a7] Tool: sync_garmin Args: {'target_date': '2026-01-23'}
2026-01-25 09:31:08 - slack_bot.tools.garmin - INFO - Starting Garmin sync for 2026-01-23...
2026-01-25 09:31:08 - health.services.data_sync - INFO - Authenticating with Garmin...
2026-01-25 09:31:08 - health.services.garmin_client - INFO - Authenticating with Garmin Connect China for 350134531@qq.com
2026-01-25 09:31:08 - health.services.garmin_client - INFO - Successfully authenticated with Garmin Connect China
2026-01-25 09:31:08 - health.services.data_sync - INFO - Authentication successful
2026-01-25 09:31:08 - health.services.data_sync - INFO - Syncing 13 metric types from 2026-01-23 to 2026-01-23
2026-01-25 09:31:08 - health.services.data_sync - INFO - Syncing steps from 2026-01-23 to 2026-01-23 (1 days)
2026-01-25 09:31:08 - health.services.data_sync - INFO - ✓ Synced steps for 2026-01-23
2026-01-25 09:31:08 - health.services.data_sync - INFO - steps sync complete: 1 synced, 0 skipped, 0 errors
2026-01-25 09:31:08 - health.services.data_sync - INFO - Syncing heart_rate from 2026-01-23 to 2026-01-23 (1 days)
2026-01-25 09:31:08 - health.services.data_sync - INFO - ✓ Synced heart_rate for 2026-01-23
2026-01-25 09:31:08 - health.services.data_sync - INFO - heart_rate sync complete: 1 synced, 0 skipped, 0 errors
2026-01-25 09:31:08 - health.services.data_sync - INFO - Syncing sleep from 2026-01-23 to 2026-01-23 (1 days)
2026-01-25 09:31:09 - health.services.data_sync - INFO - ✓ Synced sleep for 2026-01-23
2026-01-25 09:31:09 - health.services.data_sync - INFO - sleep sync complete: 1 synced, 0 skipped, 0 errors
2026-01-25 09:31:09 - health.services.data_sync - INFO - Syncing stress from 2026-01-23 to 2026-01-23 (1 days)
2026-01-25 09:31:09 - health.services.data_sync - INFO - ✓ Synced stress for 2026-01-23
2026-01-25 09:31:09 - health.services.data_sync - INFO - stress sync complete: 1 synced, 0 skipped, 0 errors
2026-01-25 09:31:09 - health.services.data_sync - INFO - Syncing body_battery from 2026-01-23 to 2026-01-23 (1 days)
2026-01-25 09:31:09 - health.services.data_sync - INFO - ✓ Synced body_battery for 2026-01-23
2026-01-25 09:31:09 - health.services.data_sync - INFO - body_battery sync complete: 1 synced, 0 skipped, 0 errors
2026-01-25 09:31:09 - health.services.data_sync - INFO - Syncing spo2 from 2026-01-23 to 2026-01-23 (1 days)
2026-01-25 09:31:09 - health.services.data_sync - INFO - ✓ Synced spo2 for 2026-01-23
2026-01-25 09:31:09 - health.services.data_sync - INFO - spo2 sync complete: 1 synced, 0 skipped, 0 errors
2026-01-25 09:31:09 - health.services.data_sync - INFO - Syncing respiration from 2026-01-23 to 2026-01-23 (1 days)
2026-01-25 09:31:09 - health.services.data_sync - INFO - ✓ Synced respiration for 2026-01-23
2026-01-25 09:31:09 - health.services.data_sync - INFO - respiration sync complete: 1 synced, 0 skipped, 0 errors
2026-01-25 09:31:09 - health.services.data_sync - INFO - Syncing hydration from 2026-01-23 to 2026-01-23 (1 days)
2026-01-25 09:31:09 - health.services.data_sync - INFO - ✓ Synced hydration for 2026-01-23
2026-01-25 09:31:09 - health.services.data_sync - INFO - hydration sync complete: 1 synced, 0 skipped, 0 errors
2026-01-25 09:31:09 - health.services.data_sync - INFO - Syncing floors from 2026-01-23 to 2026-01-23 (1 days)
2026-01-25 09:31:09 - health.services.data_sync - INFO - ✓ Synced floors for 2026-01-23
2026-01-25 09:31:09 - health.services.data_sync - INFO - floors sync complete: 1 synced, 0 skipped, 0 errors
2026-01-25 09:31:09 - health.services.data_sync - INFO - Syncing intensity_minutes from 2026-01-23 to 2026-01-23 (1 days)
2026-01-25 09:31:09 - health.services.data_sync - INFO - ✓ Synced intensity_minutes for 2026-01-23
2026-01-25 09:31:09 - health.services.data_sync - INFO - intensity_minutes sync complete: 1 synced, 0 skipped, 0 errors
2026-01-25 09:31:09 - health.services.data_sync - INFO - Syncing hrv from 2026-01-23 to 2026-01-23 (1 days)
2026-01-25 09:31:10 - health.services.data_sync - INFO - ✓ Synced hrv for 2026-01-23
2026-01-25 09:31:10 - health.services.data_sync - INFO - hrv sync complete: 1 synced, 0 skipped, 0 errors
2026-01-25 09:31:10 - health.services.data_sync - INFO - Syncing rhr from 2026-01-23 to 2026-01-23 (1 days)
2026-01-25 09:31:10 - health.services.data_sync - INFO - ✓ Synced rhr for 2026-01-23
2026-01-25 09:31:10 - health.services.data_sync - INFO - rhr sync complete: 1 synced, 0 skipped, 0 errors
2026-01-25 09:31:10 - health.services.data_sync - INFO - Syncing weight from 2026-01-23 to 2026-01-23 (1 days)
2026-01-25 09:31:10 - health.services.data_sync - INFO - ✓ Synced weight for 2026-01-23
2026-01-25 09:31:10 - health.services.data_sync - INFO - weight sync complete: 1 synced, 0 skipped, 0 errors
2026-01-25 09:31:10 - health.services.data_sync - INFO - Syncing activities from 2026-01-23 to 2026-01-23
2026-01-25 09:31:10 - health.services.garmin_client - INFO - Fetched 1 activities
2026-01-25 09:31:10 - health.services.data_sync - INFO - Found 1 activities
2026-01-25 09:31:10 - health.services.data_sync - INFO - ✓ Synced activity 559897702 (elliptical) on 2026-01-23
2026-01-25 09:31:10 - health.services.data_sync - INFO - Activity sync complete: 1 synced, 0 skipped, 0 errors
2026-01-25 09:31:10 - health.services.query - INFO - Querying health data summary for 2026-01-23
2026-01-25 09:31:10 - health.services.query - INFO - Found 13 metrics and 1 activities
2026-01-25 09:31:10 - slack_bot.dispatcher - INFO - [bed534a7] ✓ sync_garmin finished in 2.22s
2026-01-25 09:31:10 - slack_bot.dispatcher - INFO - [bed534a7] Requesting final analysis...
2026-01-25 09:31:10 - slack_bot.llm.gemini - INFO - Sending payload to OpenAI Proxy: {"model": "gemini-3-flash", "messages": [{"role": "system", "content": "You are Butler, a personal health assistant for tracking and analyzing health data.\n\nYou help the user manage:\n- Sleep quality and patterns (from Garmin watch)\n- Exercise data: steps, activities, heart rate\n- Diet logs: meals, supplements, fasting modes (OMAD, PSMF)\n- Diet logs: meals, supplements, fasting modes (OMAD, PSMF)\n- Body feelings and symptoms\n\nGuidelines:\n- **DATA INTEGRITY IS PARAMOUNT**: Never hallucinate or invent data. If a tool returns \"No data found\", YOU MUST SAY \"I cannot find data for this date\". Do NOT guess numbers.\n- **VISION & IMAGES**: When analyzing images (e.g., food logs), if the image is unclear or unreadable, say \"I cannot identify the food in this image\". Do NOT guess ingredients you do not see.\n- Be concise and data-driven\n- When the user wants to log something (diet, supplement, etc), use the appropriate tool\n- When asked about health data, retrieve it first befo...
2026-01-25 09:31:23 - slack_bot.dispatcher - INFO - [bed534a7] Final analysis received in 12.92s
2026-01-25 09:31:23 - slack_bot.dispatcher - INFO - Formatted text (len 671 -> 649)
2026-01-25 09:31:23 - slack_bot.dispatcher - INFO - [bed534a7] 📤 Message updated 1769304662.788049
2026-01-25 09:31:23 - slack_bot.dispatcher - INFO - [bed534a7] Dispatch completed in 20.99s
2026-01-25 09:31:23 - __main__ - INFO - [bed534a7] ✅ Request completed in 21.53s
2026-01-25 09:32:11 - __main__ - INFO - [6c335e93] 📥 Received message from U0A8ZCK7RJM in D0AA4GBQRKK: 今天是25日，请更新24到25日数据 (Files: 0)
2026-01-25 09:32:12 - slack_bot.dispatcher - INFO - [6c335e93] Processing message in D0AA4GBQRKK from U0A8ZCK7RJM
2026-01-25 09:32:12 - slack_bot.dispatcher - INFO - [6c335e93] Calling Gemini for initial response...
2026-01-25 09:32:12 - slack_bot.llm.gemini - INFO - Sending payload to OpenAI Proxy: {"model": "gemini-3-flash", "messages": [{"role": "system", "content": "You are Butler, a personal health assistant for tracking and analyzing health data.\n\nYou help the user manage:\n- Sleep quality and patterns (from Garmin watch)\n- Exercise data: steps, activities, heart rate\n- Diet logs: meals, supplements, fasting modes (OMAD, PSMF)\n- Diet logs: meals, supplements, fasting modes (OMAD, PSMF)\n- Body feelings and symptoms\n\nGuidelines:\n- **DATA INTEGRITY IS PARAMOUNT**: Never hallucinate or invent data. If a tool returns \"No data found\", YOU MUST SAY \"I cannot find data for this date\". Do NOT guess numbers.\n- **VISION & IMAGES**: When analyzing images (e.g., food logs), if the image is unclear or unreadable, say \"I cannot identify the food in this image\". Do NOT guess ingredients you do not see.\n- Be concise and data-driven\n- When the user wants to log something (diet, supplement, etc), use the appropriate tool\n- When asked about health data, retrieve it first befo...
2026-01-25 09:32:16 - slack_bot.llm.gemini - WARNING - JSON parse error: Extra data: line 1 column 29 (char 28). String: {"target_date":"2026-01-24"}{"target_date":"2026-01-25"}{"target_date":"2026-01-24"}{"target_date":"...
2026-01-25 09:32:16 - slack_bot.llm.gemini - INFO - Successfully recovered JSON using raw_decode
2026-01-25 09:32:16 - slack_bot.dispatcher - INFO - [6c335e93] Gemini response in 4.12s: 0 chars, 1 tools
2026-01-25 09:32:16 - slack_bot.dispatcher - INFO - [6c335e93] Executing 1 tools
2026-01-25 09:32:16 - slack_bot.dispatcher - INFO - [6c335e93] Tool: get_daily_detailed_stats Args: {'target_date': '2026-01-24'}
2026-01-25 09:32:16 - health.services.query - INFO - Querying health data summary for 2026-01-24
2026-01-25 09:32:16 - health.services.query - INFO - Found 12 metrics and 0 activities
2026-01-25 09:32:16 - slack_bot.dispatcher - INFO - [6c335e93] ✓ get_daily_detailed_stats finished in 0.01s
2026-01-25 09:32:16 - slack_bot.dispatcher - INFO - [6c335e93] Requesting final analysis...
2026-01-25 09:32:16 - slack_bot.llm.gemini - INFO - Sending payload to OpenAI Proxy: {"model": "gemini-3-flash", "messages": [{"role": "system", "content": "You are Butler, a personal health assistant for tracking and analyzing health data.\n\nYou help the user manage:\n- Sleep quality and patterns (from Garmin watch)\n- Exercise data: steps, activities, heart rate\n- Diet logs: meals, supplements, fasting modes (OMAD, PSMF)\n- Diet logs: meals, supplements, fasting modes (OMAD, PSMF)\n- Body feelings and symptoms\n\nGuidelines:\n- **DATA INTEGRITY IS PARAMOUNT**: Never hallucinate or invent data. If a tool returns \"No data found\", YOU MUST SAY \"I cannot find data for this date\". Do NOT guess numbers.\n- **VISION & IMAGES**: When analyzing images (e.g., food logs), if the image is unclear or unreadable, say \"I cannot identify the food in this image\". Do NOT guess ingredients you do not see.\n- Be concise and data-driven\n- When the user wants to log something (diet, supplement, etc), use the appropriate tool\n- When asked about health data, retrieve it first befo...
2026-01-25 09:32:26 - slack_bot.dispatcher - INFO - [6c335e93] Final analysis received in 10.34s
2026-01-25 09:32:26 - slack_bot.dispatcher - INFO - Formatted text (len 2132 -> 2080)
2026-01-25 09:32:27 - slack_bot.dispatcher - WARNING - [6c335e93] Update failed, posting new: The request to the Slack API failed. (url: https://slack.com/api/chat.update)
The server responded with: {'ok': False, 'error': 'msg_too_long'}
2026-01-25 09:32:27 - slack_bot.dispatcher - INFO - [6c335e93] Dispatch completed in 15.65s
2026-01-25 09:32:27 - __main__ - INFO - [6c335e93] ✅ Request completed in 16.15s
2026-01-25 10:09:53 - __main__ - INFO - [65f87899] 📥 Received message from U0A8ZCK7RJM in D0AA4GBQRKK: hrv变低，昨晚因为仓促而没有酒前服用nac。今天有什么建议，下午打高尔夫球，晚上又有应酬 (Files: 0)
2026-01-25 10:09:53 - slack_bot.dispatcher - INFO - [65f87899] Processing message in D0AA4GBQRKK from U0A8ZCK7RJM
2026-01-25 10:09:53 - slack_bot.dispatcher - INFO - [65f87899] Calling Gemini for initial response...
2026-01-25 10:09:53 - slack_bot.llm.gemini - INFO - Sending payload to OpenAI Proxy: {"model": "gemini-3-flash", "messages": [{"role": "system", "content": "You are Butler, a personal health assistant for tracking and analyzing health data.\n\nYou help the user manage:\n- Sleep quality and patterns (from Garmin watch)\n- Exercise data: steps, activities, heart rate\n- Diet logs: meals, supplements, fasting modes (OMAD, PSMF)\n- Diet logs: meals, supplements, fasting modes (OMAD, PSMF)\n- Body feelings and symptoms\n\nGuidelines:\n- **DATA INTEGRITY IS PARAMOUNT**: Never hallucinate or invent data. If a tool returns \"No data found\", YOU MUST SAY \"I cannot find data for this date\". Do NOT guess numbers.\n- **VISION & IMAGES**: When analyzing images (e.g., food logs), if the image is unclear or unreadable, say \"I cannot identify the food in this image\". Do NOT guess ingredients you do not see.\n- Be concise and data-driven\n- When the user wants to log something (diet, supplement, etc), use the appropriate tool\n- When asked about health data, retrieve it first befo...
2026-01-25 10:10:09 - slack_bot.dispatcher - INFO - [65f87899] Gemini response in 15.31s: 1178 chars, 0 tools
2026-01-25 10:10:09 - slack_bot.dispatcher - INFO - Formatted text (len 1178 -> 1126)
2026-01-25 10:10:09 - slack_bot.dispatcher - INFO - [65f87899] 📤 Message updated 1769306993.783279
2026-01-25 10:10:09 - slack_bot.dispatcher - INFO - [65f87899] Dispatch completed in 15.86s
2026-01-25 10:10:09 - __main__ - INFO - [65f87899] ✅ Request completed in 16.33s
2026-01-25 10:50:09 - __main__ - INFO - [793f936a] 📥 Received message from U0A8ZCK7RJM in D0AA4GBQRKK: 可以喝咖啡吗 (Files: 0)
2026-01-25 10:50:09 - slack_bot.dispatcher - INFO - [793f936a] Processing message in D0AA4GBQRKK from U0A8ZCK7RJM
2026-01-25 10:50:09 - slack_bot.dispatcher - INFO - [793f936a] Calling Gemini for initial response...
2026-01-25 10:50:09 - slack_bot.llm.gemini - INFO - Sending payload to OpenAI Proxy: {"model": "gemini-3-flash", "messages": [{"role": "system", "content": "You are Butler, a personal health assistant for tracking and analyzing health data.\n\nYou help the user manage:\n- Sleep quality and patterns (from Garmin watch)\n- Exercise data: steps, activities, heart rate\n- Diet logs: meals, supplements, fasting modes (OMAD, PSMF)\n- Diet logs: meals, supplements, fasting modes (OMAD, PSMF)\n- Body feelings and symptoms\n\nGuidelines:\n- **DATA INTEGRITY IS PARAMOUNT**: Never hallucinate or invent data. If a tool returns \"No data found\", YOU MUST SAY \"I cannot find data for this date\". Do NOT guess numbers.\n- **VISION & IMAGES**: When analyzing images (e.g., food logs), if the image is unclear or unreadable, say \"I cannot identify the food in this image\". Do NOT guess ingredients you do not see.\n- Be concise and data-driven\n- When the user wants to log something (diet, supplement, etc), use the appropriate tool\n- When asked about health data, retrieve it first befo...
2026-01-25 10:50:22 - slack_bot.dispatcher - INFO - [793f936a] Gemini response in 12.43s: 904 chars, 0 tools
2026-01-25 10:50:22 - slack_bot.dispatcher - INFO - Formatted text (len 904 -> 866)
2026-01-25 10:50:22 - slack_bot.dispatcher - INFO - [793f936a] 📤 Message updated 1769309409.685459
2026-01-25 10:50:22 - slack_bot.dispatcher - INFO - [793f936a] Dispatch completed in 12.95s
2026-01-25 10:50:22 - __main__ - INFO - [793f936a] ✅ Request completed in 13.43s
2026-01-25 10:52:37 - __main__ - INFO - [2365a4a6] 📥 Received message from U0A8ZCK7RJM in D0AA4GBQRKK: 会场甜点呢 (Files: 0)
2026-01-25 10:52:37 - slack_bot.dispatcher - INFO - [2365a4a6] Processing message in D0AA4GBQRKK from U0A8ZCK7RJM
2026-01-25 10:52:37 - slack_bot.dispatcher - INFO - [2365a4a6] Calling Gemini for initial response...
2026-01-25 10:52:37 - slack_bot.llm.gemini - INFO - Sending payload to OpenAI Proxy: {"model": "gemini-3-flash", "messages": [{"role": "system", "content": "You are Butler, a personal health assistant for tracking and analyzing health data.\n\nYou help the user manage:\n- Sleep quality and patterns (from Garmin watch)\n- Exercise data: steps, activities, heart rate\n- Diet logs: meals, supplements, fasting modes (OMAD, PSMF)\n- Diet logs: meals, supplements, fasting modes (OMAD, PSMF)\n- Body feelings and symptoms\n\nGuidelines:\n- **DATA INTEGRITY IS PARAMOUNT**: Never hallucinate or invent data. If a tool returns \"No data found\", YOU MUST SAY \"I cannot find data for this date\". Do NOT guess numbers.\n- **VISION & IMAGES**: When analyzing images (e.g., food logs), if the image is unclear or unreadable, say \"I cannot identify the food in this image\". Do NOT guess ingredients you do not see.\n- Be concise and data-driven\n- When the user wants to log something (diet, supplement, etc), use the appropriate tool\n- When asked about health data, retrieve it first befo...
2026-01-25 10:52:51 - slack_bot.dispatcher - INFO - [2365a4a6] Gemini response in 14.08s: 1052 chars, 0 tools
2026-01-25 10:52:51 - slack_bot.dispatcher - INFO - Formatted text (len 1052 -> 1004)
2026-01-25 10:52:52 - slack_bot.dispatcher - INFO - [2365a4a6] 📤 Message updated 1769309557.439339
2026-01-25 10:52:52 - slack_bot.dispatcher - INFO - [2365a4a6] Dispatch completed in 14.74s
2026-01-25 10:52:52 - __main__ - INFO - [2365a4a6] ✅ Request completed in 15.19s
2026-01-25 10:59:12 - __main__ - INFO - [baa1bdd4] 📥 Received message from U0A8ZCK7RJM in D0AA4GBQRKK: 上午保持饥饿是好还是不好？会不会引发皮质醇升高 (Files: 0)
2026-01-25 10:59:12 - slack_bot.dispatcher - INFO - [baa1bdd4] Processing message in D0AA4GBQRKK from U0A8ZCK7RJM
2026-01-25 10:59:12 - slack_bot.dispatcher - INFO - [baa1bdd4] Calling Gemini for initial response...
2026-01-25 10:59:12 - slack_bot.llm.gemini - INFO - Sending payload to OpenAI Proxy: {"model": "gemini-3-flash", "messages": [{"role": "system", "content": "You are Butler, a personal health assistant for tracking and analyzing health data.\n\nYou help the user manage:\n- Sleep quality and patterns (from Garmin watch)\n- Exercise data: steps, activities, heart rate\n- Diet logs: meals, supplements, fasting modes (OMAD, PSMF)\n- Diet logs: meals, supplements, fasting modes (OMAD, PSMF)\n- Body feelings and symptoms\n\nGuidelines:\n- **DATA INTEGRITY IS PARAMOUNT**: Never hallucinate or invent data. If a tool returns \"No data found\", YOU MUST SAY \"I cannot find data for this date\". Do NOT guess numbers.\n- **VISION & IMAGES**: When analyzing images (e.g., food logs), if the image is unclear or unreadable, say \"I cannot identify the food in this image\". Do NOT guess ingredients you do not see.\n- Be concise and data-driven\n- When the user wants to log something (diet, supplement, etc), use the appropriate tool\n- When asked about health data, retrieve it first befo...
2026-01-25 10:59:29 - slack_bot.dispatcher - INFO - [baa1bdd4] Gemini response in 16.31s: 1244 chars, 0 tools
2026-01-25 10:59:29 - slack_bot.dispatcher - INFO - Formatted text (len 1244 -> 1180)
2026-01-25 10:59:29 - slack_bot.dispatcher - INFO - [baa1bdd4] 📤 Message updated 1769309952.651969
2026-01-25 10:59:29 - slack_bot.dispatcher - INFO - [baa1bdd4] Dispatch completed in 16.82s
2026-01-25 10:59:29 - __main__ - INFO - [baa1bdd4] ✅ Request completed in 17.29s
2026-01-25 11:49:28 - __main__ - INFO - [aa27e90d] 📥 Received message from U0A8ZCK7RJM in D0AA4GBQRKK: 我应该选哪一个 (Files: 1)
2026-01-25 11:49:29 - slack_bot.dispatcher - INFO - [aa27e90d] Processing message in D0AA4GBQRKK from U0A8ZCK7RJM
2026-01-25 11:49:29 - slack_bot.dispatcher - INFO - [aa27e90d] Message contains 1 files
2026-01-25 11:49:29 - slack_bot.dispatcher - INFO - [aa27e90d] found file: 3aef03269e7ed72a6800fe9fffb99a0e.jpg Type: image/jpeg URL_P: True
2026-01-25 11:49:29 - slack_bot.dispatcher - INFO - [aa27e90d] Attempting download from https://files.slack.com/files-pri/T0A9EPRE3T2-F0ABMCD4L56/download/3aef03269e7ed72a6800fe9fffb99a0e.jpg with token xoxb-...GUMgq
2026-01-25 11:49:29 - slack_bot.dispatcher - INFO - [aa27e90d] Attempting download from https://files.slack.com/files-pri/T0A9EPRE3T2-F0ABMCD4L56/download/3aef03269e7ed72a6800fe9fffb99a0e.jpg using Session (Token: xoxb-...GUMgq)
2026-01-25 11:49:30 - slack_bot.dispatcher - INFO - [aa27e90d] Downloaded and optimized image: 3aef03269e7ed72a6800fe9fffb99a0e.jpg (381.5KB -> 89.8KB)
2026-01-25 11:49:30 - slack_bot.dispatcher - INFO - [aa27e90d] Calling Gemini for initial response...
2026-01-25 11:49:30 - slack_bot.llm.gemini - INFO - Sending payload to OpenAI Proxy: {"model": "gemini-3-flash", "messages": [{"role": "system", "content": "You are Butler, a personal health assistant for tracking and analyzing health data.\n\nYou help the user manage:\n- Sleep quality and patterns (from Garmin watch)\n- Exercise data: steps, activities, heart rate\n- Diet logs: meals, supplements, fasting modes (OMAD, PSMF)\n- Diet logs: meals, supplements, fasting modes (OMAD, PSMF)\n- Body feelings and symptoms\n\nGuidelines:\n- **DATA INTEGRITY IS PARAMOUNT**: Never hallucinate or invent data. If a tool returns \"No data found\", YOU MUST SAY \"I cannot find data for this date\". Do NOT guess numbers.\n- **VISION & IMAGES**: When analyzing images (e.g., food logs), if the image is unclear or unreadable, say \"I cannot identify the food in this image\". Do NOT guess ingredients you do not see.\n- Be concise and data-driven\n- When the user wants to log something (diet, supplement, etc), use the appropriate tool\n- When asked about health data, retrieve it first befo...
2026-01-25 11:49:45 - slack_bot.dispatcher - INFO - [aa27e90d] Gemini response in 14.24s: 897 chars, 0 tools
2026-01-25 11:49:45 - slack_bot.dispatcher - INFO - Formatted text (len 897 -> 853)
2026-01-25 11:49:45 - slack_bot.dispatcher - INFO - [aa27e90d] 📤 Message updated 1769312969.346079
2026-01-25 11:49:45 - slack_bot.dispatcher - INFO - [aa27e90d] Dispatch completed in 16.30s
2026-01-25 11:49:45 - __main__ - INFO - [aa27e90d] ✅ Request completed in 17.07s
2026-01-25 11:50:51 - __main__ - INFO - [220120c8] 📥 Received message from U0A8ZCK7RJM in D0AA4GBQRKK: 我今天只有0.6克nac带着。应该什么时候吃 (Files: 0)
2026-01-25 11:50:51 - slack_bot.dispatcher - INFO - [220120c8] Processing message in D0AA4GBQRKK from U0A8ZCK7RJM
2026-01-25 11:50:51 - slack_bot.dispatcher - INFO - [220120c8] Calling Gemini for initial response...
2026-01-25 11:50:51 - slack_bot.llm.gemini - INFO - Sending payload to OpenAI Proxy: {"model": "gemini-3-flash", "messages": [{"role": "system", "content": "You are Butler, a personal health assistant for tracking and analyzing health data.\n\nYou help the user manage:\n- Sleep quality and patterns (from Garmin watch)\n- Exercise data: steps, activities, heart rate\n- Diet logs: meals, supplements, fasting modes (OMAD, PSMF)\n- Diet logs: meals, supplements, fasting modes (OMAD, PSMF)\n- Body feelings and symptoms\n\nGuidelines:\n- **DATA INTEGRITY IS PARAMOUNT**: Never hallucinate or invent data. If a tool returns \"No data found\", YOU MUST SAY \"I cannot find data for this date\". Do NOT guess numbers.\n- **VISION & IMAGES**: When analyzing images (e.g., food logs), if the image is unclear or unreadable, say \"I cannot identify the food in this image\". Do NOT guess ingredients you do not see.\n- Be concise and data-driven\n- When the user wants to log something (diet, supplement, etc), use the appropriate tool\n- When asked about health data, retrieve it first befo...
2026-01-25 11:50:58 - slack_bot.dispatcher - INFO - [220120c8] Gemini response in 6.99s: 930 chars, 0 tools
2026-01-25 11:50:58 - slack_bot.dispatcher - INFO - Formatted text (len 930 -> 916)
2026-01-25 11:50:59 - slack_bot.dispatcher - INFO - [220120c8] 📤 Message updated 1769313051.793319
2026-01-25 11:50:59 - slack_bot.dispatcher - INFO - [220120c8] Dispatch completed in 7.52s
2026-01-25 11:50:59 - __main__ - INFO - [220120c8] ✅ Request completed in 8.25s
2026-01-25 12:16:30 - __main__ - INFO - [5774e965] 📥 Received message from U0A8ZCK7RJM in D0AA4GBQRKK: b族维生素什么时候吃 (Files: 0)
2026-01-25 12:16:31 - slack_bot.dispatcher - INFO - [5774e965] Processing message in D0AA4GBQRKK from U0A8ZCK7RJM
2026-01-25 12:16:31 - slack_bot.dispatcher - INFO - [5774e965] Calling Gemini for initial response...
2026-01-25 12:16:31 - slack_bot.llm.gemini - INFO - Sending payload to OpenAI Proxy: {"model": "gemini-3-flash", "messages": [{"role": "system", "content": "You are Butler, a personal health assistant for tracking and analyzing health data.\n\nYou help the user manage:\n- Sleep quality and patterns (from Garmin watch)\n- Exercise data: steps, activities, heart rate\n- Diet logs: meals, supplements, fasting modes (OMAD, PSMF)\n- Diet logs: meals, supplements, fasting modes (OMAD, PSMF)\n- Body feelings and symptoms\n\nGuidelines:\n- **DATA INTEGRITY IS PARAMOUNT**: Never hallucinate or invent data. If a tool returns \"No data found\", YOU MUST SAY \"I cannot find data for this date\". Do NOT guess numbers.\n- **VISION & IMAGES**: When analyzing images (e.g., food logs), if the image is unclear or unreadable, say \"I cannot identify the food in this image\". Do NOT guess ingredients you do not see.\n- Be concise and data-driven\n- When the user wants to log something (diet, supplement, etc), use the appropriate tool\n- When asked about health data, retrieve it first befo...
2026-01-25 12:16:44 - slack_bot.dispatcher - INFO - [5774e965] Gemini response in 13.38s: 1074 chars, 0 tools
2026-01-25 12:16:44 - slack_bot.dispatcher - INFO - Formatted text (len 1074 -> 1022)
2026-01-25 12:16:45 - slack_bot.dispatcher - INFO - [5774e965] 📤 Message updated 1769314591.436189
2026-01-25 12:16:45 - slack_bot.dispatcher - INFO - [5774e965] Dispatch completed in 13.95s
2026-01-25 12:16:45 - __main__ - INFO - [5774e965] ✅ Request completed in 14.45s
2026-01-25 12:21:13 - __main__ - INFO - [da136510] 📥 Received message from U0A8ZCK7RJM in D0AA4GBQRKK: 确实好像没有碳水容易胸闷，不知道是不是真的这个原因，请帮我分析一下底层原因 (Files: 0)
2026-01-25 12:21:13 - slack_bot.dispatcher - INFO - [da136510] Processing message in D0AA4GBQRKK from U0A8ZCK7RJM
2026-01-25 12:21:13 - slack_bot.dispatcher - INFO - [da136510] Calling Gemini for initial response...
2026-01-25 12:21:13 - slack_bot.llm.gemini - INFO - Sending payload to OpenAI Proxy: {"model": "gemini-3-flash", "messages": [{"role": "system", "content": "You are Butler, a personal health assistant for tracking and analyzing health data.\n\nYou help the user manage:\n- Sleep quality and patterns (from Garmin watch)\n- Exercise data: steps, activities, heart rate\n- Diet logs: meals, supplements, fasting modes (OMAD, PSMF)\n- Diet logs: meals, supplements, fasting modes (OMAD, PSMF)\n- Body feelings and symptoms\n\nGuidelines:\n- **DATA INTEGRITY IS PARAMOUNT**: Never hallucinate or invent data. If a tool returns \"No data found\", YOU MUST SAY \"I cannot find data for this date\". Do NOT guess numbers.\n- **VISION & IMAGES**: When analyzing images (e.g., food logs), if the image is unclear or unreadable, say \"I cannot identify the food in this image\". Do NOT guess ingredients you do not see.\n- Be concise and data-driven\n- When the user wants to log something (diet, supplement, etc), use the appropriate tool\n- When asked about health data, retrieve it first befo...
2026-01-25 12:21:31 - slack_bot.dispatcher - INFO - [da136510] Gemini response in 17.36s: 1820 chars, 0 tools
2026-01-25 12:21:31 - slack_bot.dispatcher - INFO - Formatted text (len 1820 -> 1746)
2026-01-25 12:21:31 - slack_bot.dispatcher - WARNING - [da136510] Update failed, posting new: The request to the Slack API failed. (url: https://slack.com/api/chat.update)
The server responded with: {'ok': False, 'error': 'msg_too_long'}
2026-01-25 12:21:32 - slack_bot.dispatcher - INFO - [da136510] Dispatch completed in 18.36s
2026-01-25 12:21:32 - __main__ - INFO - [da136510] ✅ Request completed in 18.82s
2026-01-25 12:24:36 - __main__ - INFO - [b1816dd9] 📥 Received message from U0A8ZCK7RJM in D0AA4GBQRKK: 那这样的话，我以后就很难做psmf和omad了，是这样吗，怎么才可以增强呢 (Files: 0)
2026-01-25 12:24:36 - slack_bot.dispatcher - INFO - [b1816dd9] Processing message in D0AA4GBQRKK from U0A8ZCK7RJM
2026-01-25 12:24:36 - slack_bot.dispatcher - INFO - [b1816dd9] Calling Gemini for initial response...
2026-01-25 12:24:36 - slack_bot.llm.gemini - INFO - Sending payload to OpenAI Proxy: {"model": "gemini-3-flash", "messages": [{"role": "system", "content": "You are Butler, a personal health assistant for tracking and analyzing health data.\n\nYou help the user manage:\n- Sleep quality and patterns (from Garmin watch)\n- Exercise data: steps, activities, heart rate\n- Diet logs: meals, supplements, fasting modes (OMAD, PSMF)\n- Diet logs: meals, supplements, fasting modes (OMAD, PSMF)\n- Body feelings and symptoms\n\nGuidelines:\n- **DATA INTEGRITY IS PARAMOUNT**: Never hallucinate or invent data. If a tool returns \"No data found\", YOU MUST SAY \"I cannot find data for this date\". Do NOT guess numbers.\n- **VISION & IMAGES**: When analyzing images (e.g., food logs), if the image is unclear or unreadable, say \"I cannot identify the food in this image\". Do NOT guess ingredients you do not see.\n- Be concise and data-driven\n- When the user wants to log something (diet, supplement, etc), use the appropriate tool\n- When asked about health data, retrieve it first befo...
2026-01-25 12:24:51 - slack_bot.dispatcher - INFO - [b1816dd9] Gemini response in 15.24s: 1750 chars, 0 tools
2026-01-25 12:24:51 - slack_bot.dispatcher - INFO - Formatted text (len 1750 -> 1662)
2026-01-25 12:24:52 - slack_bot.dispatcher - INFO - [b1816dd9] 📤 Message updated 1769315076.563339
2026-01-25 12:24:52 - slack_bot.dispatcher - INFO - [b1816dd9] Dispatch completed in 15.74s
2026-01-25 12:24:52 - __main__ - INFO - [b1816dd9] ✅ Request completed in 16.20s
2026-01-25 12:28:56 - __main__ - INFO - [a6ec6d0f] 📥 Received message from U0A8ZCK7RJM in D0AA4GBQRKK: 高尔夫球最重要的几个动作技巧是什么，我快速review一下 (Files: 0)
2026-01-25 12:28:57 - slack_bot.dispatcher - INFO - [a6ec6d0f] Processing message in D0AA4GBQRKK from U0A8ZCK7RJM
2026-01-25 12:28:57 - slack_bot.dispatcher - INFO - [a6ec6d0f] Calling Gemini for initial response...
2026-01-25 12:28:57 - slack_bot.llm.gemini - INFO - Sending payload to OpenAI Proxy: {"model": "gemini-3-flash", "messages": [{"role": "system", "content": "You are Butler, a personal health assistant for tracking and analyzing health data.\n\nYou help the user manage:\n- Sleep quality and patterns (from Garmin watch)\n- Exercise data: steps, activities, heart rate\n- Diet logs: meals, supplements, fasting modes (OMAD, PSMF)\n- Diet logs: meals, supplements, fasting modes (OMAD, PSMF)\n- Body feelings and symptoms\n\nGuidelines:\n- **DATA INTEGRITY IS PARAMOUNT**: Never hallucinate or invent data. If a tool returns \"No data found\", YOU MUST SAY \"I cannot find data for this date\". Do NOT guess numbers.\n- **VISION & IMAGES**: When analyzing images (e.g., food logs), if the image is unclear or unreadable, say \"I cannot identify the food in this image\". Do NOT guess ingredients you do not see.\n- Be concise and data-driven\n- When the user wants to log something (diet, supplement, etc), use the appropriate tool\n- When asked about health data, retrieve it first befo...
2026-01-25 12:29:10 - slack_bot.dispatcher - INFO - [a6ec6d0f] Gemini response in 13.39s: 1244 chars, 0 tools
2026-01-25 12:29:10 - slack_bot.dispatcher - INFO - Formatted text (len 1244 -> 1180)
2026-01-25 12:29:11 - slack_bot.dispatcher - INFO - [a6ec6d0f] 📤 Message updated 1769315337.431829
2026-01-25 12:29:11 - slack_bot.dispatcher - INFO - [a6ec6d0f] Dispatch completed in 14.02s
2026-01-25 12:29:11 - __main__ - INFO - [a6ec6d0f] ✅ Request completed in 14.63s
2026-01-25 12:33:13 - __main__ - INFO - [791e56ea] 📥 Received message from U0A8ZCK7RJM in D0AA4GBQRKK: 挥球的时候应该注意哪些动作要点 (Files: 0)
2026-01-25 12:33:14 - slack_bot.dispatcher - INFO - [791e56ea] Processing message in D0AA4GBQRKK from U0A8ZCK7RJM
2026-01-25 12:33:14 - slack_bot.dispatcher - INFO - [791e56ea] Calling Gemini for initial response...
2026-01-25 12:33:14 - slack_bot.llm.gemini - INFO - Sending payload to OpenAI Proxy: {"model": "gemini-3-flash", "messages": [{"role": "system", "content": "You are Butler, a personal health assistant for tracking and analyzing health data.\n\nYou help the user manage:\n- Sleep quality and patterns (from Garmin watch)\n- Exercise data: steps, activities, heart rate\n- Diet logs: meals, supplements, fasting modes (OMAD, PSMF)\n- Diet logs: meals, supplements, fasting modes (OMAD, PSMF)\n- Body feelings and symptoms\n\nGuidelines:\n- **DATA INTEGRITY IS PARAMOUNT**: Never hallucinate or invent data. If a tool returns \"No data found\", YOU MUST SAY \"I cannot find data for this date\". Do NOT guess numbers.\n- **VISION & IMAGES**: When analyzing images (e.g., food logs), if the image is unclear or unreadable, say \"I cannot identify the food in this image\". Do NOT guess ingredients you do not see.\n- Be concise and data-driven\n- When the user wants to log something (diet, supplement, etc), use the appropriate tool\n- When asked about health data, retrieve it first befo...
2026-01-25 12:33:28 - slack_bot.dispatcher - INFO - [791e56ea] Gemini response in 14.71s: 1335 chars, 0 tools
2026-01-25 12:33:28 - slack_bot.dispatcher - INFO - Formatted text (len 1335 -> 1267)
2026-01-25 12:33:29 - slack_bot.dispatcher - INFO - [791e56ea] 📤 Message updated 1769315593.993179
2026-01-25 12:33:29 - slack_bot.dispatcher - INFO - [791e56ea] Dispatch completed in 15.25s
2026-01-25 12:33:29 - __main__ - INFO - [791e56ea] ✅ Request completed in 15.79s
Failed to check the state of sock (session id: 9b2b9c05-e36c-4a29-9885-0ed6d3c3d2ca, error: SSLError, message: [SYS] unknown error (_ssl.c:2406))
Failed to check the state of sock (session id: 9b2b9c05-e36c-4a29-9885-0ed6d3c3d2ca, error: SSLError, message: [SYS] unknown error (_ssl.c:2406))
Failed to check the state of sock (session id: 9b2b9c05-e36c-4a29-9885-0ed6d3c3d2ca, error: SSLError, message: [SYS] unknown error (_ssl.c:2406))
Failed to check the state of sock (session id: 9b2b9c05-e36c-4a29-9885-0ed6d3c3d2ca, error: SSLError, message: [SYS] unknown error (_ssl.c:2406))
Failed to check the state of sock (session id: 9b2b9c05-e36c-4a29-9885-0ed6d3c3d2ca, error: SSLError, message: [SYS] unknown error (_ssl.c:2406))
2026-01-25 18:32:58 - __main__ - INFO - [22591fed] 📥 Received message from U0A8ZCK7RJM in D0AA4GBQRKK: 打完球了。不过我没有用佳明记录运动数据，你可以拉取一下基本心率数据看看有没有什么可以研究的 (Files: 0)
2026-01-25 18:32:58 - slack_bot.dispatcher - INFO - [22591fed] Processing message in D0AA4GBQRKK from U0A8ZCK7RJM
2026-01-25 18:32:58 - slack_bot.dispatcher - INFO - [22591fed] Calling Gemini for initial response...
2026-01-25 18:32:58 - slack_bot.llm.gemini - INFO - Sending payload to OpenAI Proxy: {"model": "gemini-3-flash", "messages": [{"role": "system", "content": "You are Butler, a personal health assistant for tracking and analyzing health data.\n\nYou help the user manage:\n- Sleep quality and patterns (from Garmin watch)\n- Exercise data: steps, activities, heart rate\n- Diet logs: meals, supplements, fasting modes (OMAD, PSMF)\n- Diet logs: meals, supplements, fasting modes (OMAD, PSMF)\n- Body feelings and symptoms\n\nGuidelines:\n- **DATA INTEGRITY IS PARAMOUNT**: Never hallucinate or invent data. If a tool returns \"No data found\", YOU MUST SAY \"I cannot find data for this date\". Do NOT guess numbers.\n- **VISION & IMAGES**: When analyzing images (e.g., food logs), if the image is unclear or unreadable, say \"I cannot identify the food in this image\". Do NOT guess ingredients you do not see.\n- Be concise and data-driven\n- When the user wants to log something (diet, supplement, etc), use the appropriate tool\n- When asked about health data, retrieve it first befo...
2026-01-25 18:33:06 - slack_bot.llm.gemini - WARNING - JSON parse error: Extra data: line 1 column 29 (char 28). String: {"target_date":"2026-01-25"}{"target_date":"2026-01-25"}{"end_date":"2026-01-25","metric_type":"hear...
2026-01-25 18:33:06 - slack_bot.llm.gemini - INFO - Successfully recovered JSON using raw_decode
2026-01-25 18:33:06 - slack_bot.dispatcher - INFO - [22591fed] Gemini response in 7.25s: 0 chars, 1 tools
2026-01-25 18:33:06 - slack_bot.dispatcher - INFO - [22591fed] Executing 1 tools
2026-01-25 18:33:06 - slack_bot.dispatcher - INFO - [22591fed] Tool: get_metric_history Args: {'target_date': '2026-01-25'}
2026-01-25 18:33:06 - slack_bot.dispatcher - INFO - [22591fed] ✓ get_metric_history finished in 0.00s
2026-01-25 18:33:06 - slack_bot.dispatcher - INFO - [22591fed] Requesting final analysis...
2026-01-25 18:33:06 - slack_bot.llm.gemini - INFO - Sending payload to OpenAI Proxy: {"model": "gemini-3-flash", "messages": [{"role": "system", "content": "You are Butler, a personal health assistant for tracking and analyzing health data.\n\nYou help the user manage:\n- Sleep quality and patterns (from Garmin watch)\n- Exercise data: steps, activities, heart rate\n- Diet logs: meals, supplements, fasting modes (OMAD, PSMF)\n- Diet logs: meals, supplements, fasting modes (OMAD, PSMF)\n- Body feelings and symptoms\n\nGuidelines:\n- **DATA INTEGRITY IS PARAMOUNT**: Never hallucinate or invent data. If a tool returns \"No data found\", YOU MUST SAY \"I cannot find data for this date\". Do NOT guess numbers.\n- **VISION & IMAGES**: When analyzing images (e.g., food logs), if the image is unclear or unreadable, say \"I cannot identify the food in this image\". Do NOT guess ingredients you do not see.\n- Be concise and data-driven\n- When the user wants to log something (diet, supplement, etc), use the appropriate tool\n- When asked about health data, retrieve it first befo...
2026-01-25 18:33:17 - slack_bot.dispatcher - INFO - [22591fed] Final analysis received in 11.17s
2026-01-25 18:33:17 - slack_bot.dispatcher - INFO - Formatted text (len 1340 -> 1296)
2026-01-25 18:33:17 - slack_bot.dispatcher - INFO - [22591fed] 📤 Message updated 1769337178.686609
2026-01-25 18:33:17 - slack_bot.dispatcher - INFO - [22591fed] Dispatch completed in 18.97s
2026-01-25 18:33:17 - __main__ - INFO - [22591fed] ✅ Request completed in 19.45s
2026-01-25 18:52:50 - __main__ - INFO - [6da429e5] 📥 Received message from U0A8ZCK7RJM in D0AA4GBQRKK: 胸闷缓解了，而且最近副足舟骨也感觉很好，记录刚吃了0.6克nac (Files: 0)
2026-01-25 18:52:50 - slack_bot.dispatcher - INFO - [6da429e5] Processing message in D0AA4GBQRKK from U0A8ZCK7RJM
2026-01-25 18:52:50 - slack_bot.dispatcher - INFO - [6da429e5] Calling Gemini for initial response...
2026-01-25 18:52:50 - slack_bot.llm.gemini - INFO - Sending payload to OpenAI Proxy: {"model": "gemini-3-flash", "messages": [{"role": "system", "content": "You are Butler, a personal health assistant for tracking and analyzing health data.\n\nYou help the user manage:\n- Sleep quality and patterns (from Garmin watch)\n- Exercise data: steps, activities, heart rate\n- Diet logs: meals, supplements, fasting modes (OMAD, PSMF)\n- Diet logs: meals, supplements, fasting modes (OMAD, PSMF)\n- Body feelings and symptoms\n\nGuidelines:\n- **DATA INTEGRITY IS PARAMOUNT**: Never hallucinate or invent data. If a tool returns \"No data found\", YOU MUST SAY \"I cannot find data for this date\". Do NOT guess numbers.\n- **VISION & IMAGES**: When analyzing images (e.g., food logs), if the image is unclear or unreadable, say \"I cannot identify the food in this image\". Do NOT guess ingredients you do not see.\n- Be concise and data-driven\n- When the user wants to log something (diet, supplement, etc), use the appropriate tool\n- When asked about health data, retrieve it first befo...
2026-01-25 18:53:02 - slack_bot.dispatcher - INFO - [6da429e5] Gemini response in 11.52s: 1085 chars, 0 tools
2026-01-25 18:53:02 - slack_bot.dispatcher - INFO - Formatted text (len 1085 -> 1065)
2026-01-25 18:53:02 - slack_bot.dispatcher - INFO - [6da429e5] 📤 Message updated 1769338370.652479
2026-01-25 18:53:02 - slack_bot.dispatcher - INFO - [6da429e5] Dispatch completed in 12.07s
2026-01-25 18:53:02 - __main__ - INFO - [6da429e5] ✅ Request completed in 12.60s
2026-01-25 19:14:56 - __main__ - INFO - [7430f60e] 📥 Received message from U0A8ZCK7RJM in D0AA4GBQRKK: 胸闷更可能缺盐还是缺碳水 (Files: 0)
2026-01-25 19:14:57 - slack_bot.dispatcher - INFO - [7430f60e] Processing message in D0AA4GBQRKK from U0A8ZCK7RJM
2026-01-25 19:14:57 - slack_bot.dispatcher - INFO - [7430f60e] Calling Gemini for initial response...
2026-01-25 19:14:57 - slack_bot.llm.gemini - INFO - Sending payload to OpenAI Proxy: {"model": "gemini-3-flash", "messages": [{"role": "system", "content": "You are Butler, a personal health assistant for tracking and analyzing health data.\n\nYou help the user manage:\n- Sleep quality and patterns (from Garmin watch)\n- Exercise data: steps, activities, heart rate\n- Diet logs: meals, supplements, fasting modes (OMAD, PSMF)\n- Diet logs: meals, supplements, fasting modes (OMAD, PSMF)\n- Body feelings and symptoms\n\nGuidelines:\n- **DATA INTEGRITY IS PARAMOUNT**: Never hallucinate or invent data. If a tool returns \"No data found\", YOU MUST SAY \"I cannot find data for this date\". Do NOT guess numbers.\n- **VISION & IMAGES**: When analyzing images (e.g., food logs), if the image is unclear or unreadable, say \"I cannot identify the food in this image\". Do NOT guess ingredients you do not see.\n- Be concise and data-driven\n- When the user wants to log something (diet, supplement, etc), use the appropriate tool\n- When asked about health data, retrieve it first befo...
2026-01-25 19:15:13 - slack_bot.dispatcher - INFO - [7430f60e] Gemini response in 15.92s: 1354 chars, 0 tools
2026-01-25 19:15:13 - slack_bot.dispatcher - INFO - Formatted text (len 1354 -> 1286)
2026-01-25 19:15:13 - slack_bot.dispatcher - INFO - [7430f60e] 📤 Message updated 1769339697.013229
2026-01-25 19:15:13 - slack_bot.dispatcher - INFO - [7430f60e] Dispatch completed in 16.45s
2026-01-25 19:15:13 - __main__ - INFO - [7430f60e] ✅ Request completed in 16.90s
2026-01-25 19:43:02 - __main__ - INFO - [f274f9df] 📥 Received message from U0A8ZCK7RJM in D0AA4GBQRKK: 晚上吃这个

【Methavalai Sorndaeng】泰式皇室飨宴
:star2:始于1957年，70年老牌泰式餐厅，主理家族曾服务泰国王室，传承宫廷菜秘方，被誉为“平民御宴”。
 (Files: 0)
2026-01-25 19:43:02 - slack_bot.dispatcher - INFO - [f274f9df] Processing message in D0AA4GBQRKK from U0A8ZCK7RJM
2026-01-25 19:43:02 - slack_bot.dispatcher - INFO - [f274f9df] Calling Gemini for initial response...
2026-01-25 19:43:02 - slack_bot.llm.gemini - INFO - Sending payload to OpenAI Proxy: {"model": "gemini-3-flash", "messages": [{"role": "system", "content": "You are Butler, a personal health assistant for tracking and analyzing health data.\n\nYou help the user manage:\n- Sleep quality and patterns (from Garmin watch)\n- Exercise data: steps, activities, heart rate\n- Diet logs: meals, supplements, fasting modes (OMAD, PSMF)\n- Diet logs: meals, supplements, fasting modes (OMAD, PSMF)\n- Body feelings and symptoms\n\nGuidelines:\n- **DATA INTEGRITY IS PARAMOUNT**: Never hallucinate or invent data. If a tool returns \"No data found\", YOU MUST SAY \"I cannot find data for this date\". Do NOT guess numbers.\n- **VISION & IMAGES**: When analyzing images (e.g., food logs), if the image is unclear or unreadable, say \"I cannot identify the food in this image\". Do NOT guess ingredients you do not see.\n- Be concise and data-driven\n- When the user wants to log something (diet, supplement, etc), use the appropriate tool\n- When asked about health data, retrieve it first befo...
2026-01-25 19:43:19 - slack_bot.dispatcher - INFO - [f274f9df] Gemini response in 16.98s: 1372 chars, 0 tools
2026-01-25 19:43:19 - slack_bot.dispatcher - INFO - Formatted text (len 1372 -> 1320)
2026-01-25 19:43:20 - slack_bot.dispatcher - INFO - [f274f9df] 📤 Message updated 1769341382.552609
2026-01-25 19:43:20 - slack_bot.dispatcher - INFO - [f274f9df] Dispatch completed in 17.54s
2026-01-25 19:43:20 - __main__ - INFO - [f274f9df] ✅ Request completed in 18.00s
2026-01-25 21:04:30 - __main__ - INFO - [52fb5c33] 📥 Received message from U0A8ZCK7RJM in D0AA4GBQRKK: 喝了半杯啤酒 (Files: 0)
2026-01-25 21:04:31 - slack_bot.dispatcher - INFO - [52fb5c33] Processing message in D0AA4GBQRKK from U0A8ZCK7RJM
2026-01-25 21:04:31 - slack_bot.dispatcher - INFO - [52fb5c33] Calling Gemini for initial response...
2026-01-25 21:04:31 - slack_bot.llm.gemini - INFO - Sending payload to OpenAI Proxy: {"model": "gemini-3-flash", "messages": [{"role": "system", "content": "You are Butler, a personal health assistant for tracking and analyzing health data.\n\nYou help the user manage:\n- Sleep quality and patterns (from Garmin watch)\n- Exercise data: steps, activities, heart rate\n- Diet logs: meals, supplements, fasting modes (OMAD, PSMF)\n- Diet logs: meals, supplements, fasting modes (OMAD, PSMF)\n- Body feelings and symptoms\n\nGuidelines:\n- **DATA INTEGRITY IS PARAMOUNT**: Never hallucinate or invent data. If a tool returns \"No data found\", YOU MUST SAY \"I cannot find data for this date\". Do NOT guess numbers.\n- **VISION & IMAGES**: When analyzing images (e.g., food logs), if the image is unclear or unreadable, say \"I cannot identify the food in this image\". Do NOT guess ingredients you do not see.\n- Be concise and data-driven\n- When the user wants to log something (diet, supplement, etc), use the appropriate tool\n- When asked about health data, retrieve it first befo...
2026-01-25 21:04:45 - slack_bot.dispatcher - INFO - [52fb5c33] Gemini response in 13.96s: 999 chars, 0 tools
2026-01-25 21:04:45 - slack_bot.dispatcher - INFO - Formatted text (len 999 -> 999)
2026-01-25 21:04:45 - slack_bot.dispatcher - INFO - [52fb5c33] 📤 Message updated 1769346271.087779
2026-01-25 21:04:45 - slack_bot.dispatcher - INFO - [52fb5c33] Dispatch completed in 14.48s
2026-01-25 21:04:45 - __main__ - INFO - [52fb5c33] ✅ Request completed in 15.06s
2026-01-25 21:14:07 - __main__ - INFO - [45d2b380] 📥 Received message from U0A8ZCK7RJM in D0AA4GBQRKK: 已经结束，现在去看泰拳 (Files: 0)
2026-01-25 21:14:07 - slack_bot.dispatcher - INFO - [45d2b380] Processing message in D0AA4GBQRKK from U0A8ZCK7RJM
2026-01-25 21:14:07 - slack_bot.dispatcher - INFO - [45d2b380] Calling Gemini for initial response...
2026-01-25 21:14:07 - slack_bot.llm.gemini - INFO - Sending payload to OpenAI Proxy: {"model": "gemini-3-flash", "messages": [{"role": "system", "content": "You are Butler, a personal health assistant for tracking and analyzing health data.\n\nYou help the user manage:\n- Sleep quality and patterns (from Garmin watch)\n- Exercise data: steps, activities, heart rate\n- Diet logs: meals, supplements, fasting modes (OMAD, PSMF)\n- Diet logs: meals, supplements, fasting modes (OMAD, PSMF)\n- Body feelings and symptoms\n\nGuidelines:\n- **DATA INTEGRITY IS PARAMOUNT**: Never hallucinate or invent data. If a tool returns \"No data found\", YOU MUST SAY \"I cannot find data for this date\". Do NOT guess numbers.\n- **VISION & IMAGES**: When analyzing images (e.g., food logs), if the image is unclear or unreadable, say \"I cannot identify the food in this image\". Do NOT guess ingredients you do not see.\n- Be concise and data-driven\n- When the user wants to log something (diet, supplement, etc), use the appropriate tool\n- When asked about health data, retrieve it first befo...
2026-01-25 21:14:15 - slack_bot.dispatcher - INFO - [45d2b380] Gemini response in 8.24s: 943 chars, 0 tools
2026-01-25 21:14:15 - slack_bot.dispatcher - INFO - Formatted text (len 943 -> 943)
2026-01-25 21:14:16 - slack_bot.dispatcher - INFO - [45d2b380] 📤 Message updated 1769346847.675399
2026-01-25 21:14:16 - slack_bot.dispatcher - INFO - [45d2b380] Dispatch completed in 8.77s
2026-01-25 21:14:16 - __main__ - INFO - [45d2b380] ✅ Request completed in 9.23s
2026-01-25 21:25:13 - __main__ - INFO - [31342d17] 📥 Received message from U0A8ZCK7RJM in D0AA4GBQRKK: 好的 (Files: 0)
2026-01-25 21:25:14 - slack_bot.dispatcher - INFO - [31342d17] Processing message in D0AA4GBQRKK from U0A8ZCK7RJM
2026-01-25 21:25:14 - slack_bot.dispatcher - INFO - [31342d17] Calling Gemini for initial response...
2026-01-25 21:25:14 - slack_bot.llm.gemini - INFO - Sending payload to OpenAI Proxy: {"model": "gemini-3-flash", "messages": [{"role": "system", "content": "You are Butler, a personal health assistant for tracking and analyzing health data.\n\nYou help the user manage:\n- Sleep quality and patterns (from Garmin watch)\n- Exercise data: steps, activities, heart rate\n- Diet logs: meals, supplements, fasting modes (OMAD, PSMF)\n- Diet logs: meals, supplements, fasting modes (OMAD, PSMF)\n- Body feelings and symptoms\n\nGuidelines:\n- **DATA INTEGRITY IS PARAMOUNT**: Never hallucinate or invent data. If a tool returns \"No data found\", YOU MUST SAY \"I cannot find data for this date\". Do NOT guess numbers.\n- **VISION & IMAGES**: When analyzing images (e.g., food logs), if the image is unclear or unreadable, say \"I cannot identify the food in this image\". Do NOT guess ingredients you do not see.\n- Be concise and data-driven\n- When the user wants to log something (diet, supplement, etc), use the appropriate tool\n- When asked about health data, retrieve it first befo...
2026-01-25 21:25:22 - slack_bot.dispatcher - INFO - [31342d17] Gemini response in 8.44s: 323 chars, 0 tools
2026-01-25 21:25:22 - slack_bot.dispatcher - INFO - Formatted text (len 323 -> 311)
2026-01-25 21:25:23 - slack_bot.dispatcher - INFO - [31342d17] 📤 Message updated 1769347514.274969
2026-01-25 21:25:23 - slack_bot.dispatcher - INFO - [31342d17] Dispatch completed in 9.13s
2026-01-25 21:25:23 - __main__ - INFO - [31342d17] ✅ Request completed in 9.61s
2026-01-26 10:30:53 - __main__ - INFO - [20c99da1] 📥 Received message from U0A8ZCK7RJM in D0AA4GBQRKK: 同步佳明数据 (Files: 0)
2026-01-26 10:30:53 - slack_bot.dispatcher - INFO - [20c99da1] Processing message in D0AA4GBQRKK from U0A8ZCK7RJM
2026-01-26 10:30:53 - slack_bot.dispatcher - INFO - [20c99da1] Calling Gemini for initial response...
2026-01-26 10:30:53 - slack_bot.llm.gemini - INFO - Sending payload to OpenAI Proxy: {"model": "gemini-3-flash", "messages": [{"role": "system", "content": "You are Butler, a personal health assistant for tracking and analyzing health data.\n\nYou help the user manage:\n- Sleep quality and patterns (from Garmin watch)\n- Exercise data: steps, activities, heart rate\n- Diet logs: meals, supplements, fasting modes (OMAD, PSMF)\n- Diet logs: meals, supplements, fasting modes (OMAD, PSMF)\n- Body feelings and symptoms\n\nGuidelines:\n- **DATA INTEGRITY IS PARAMOUNT**: Never hallucinate or invent data. If a tool returns \"No data found\", YOU MUST SAY \"I cannot find data for this date\". Do NOT guess numbers.\n- **VISION & IMAGES**: When analyzing images (e.g., food logs), if the image is unclear or unreadable, say \"I cannot identify the food in this image\". Do NOT guess ingredients you do not see.\n- Be concise and data-driven\n- When the user wants to log something (diet, supplement, etc), use the appropriate tool\n- When asked about health data, retrieve it first befo...
2026-01-26 10:30:59 - slack_bot.llm.gemini - WARNING - JSON parse error: Extra data: line 1 column 29 (char 28). String: {"target_date":"2026-01-26"}{"target_date":"2026-01-26"}...
2026-01-26 10:30:59 - slack_bot.llm.gemini - INFO - Successfully recovered JSON using raw_decode
2026-01-26 10:30:59 - slack_bot.dispatcher - INFO - [20c99da1] Gemini response in 5.20s: 0 chars, 1 tools
2026-01-26 10:30:59 - slack_bot.dispatcher - INFO - [20c99da1] Executing 1 tools
2026-01-26 10:30:59 - slack_bot.dispatcher - INFO - [20c99da1] Tool: get_daily_detailed_stats Args: {'target_date': '2026-01-26'}
2026-01-26 10:30:59 - health.services.query - INFO - Querying health data summary for 2026-01-26
2026-01-26 10:30:59 - health.services.query - INFO - Found 0 metrics and 0 activities
2026-01-26 10:30:59 - slack_bot.tools.health_read - INFO - Data missing for 2026-01-26, attempting auto-sync...
2026-01-26 10:30:59 - health.services.data_sync - INFO - Authenticating with Garmin...
2026-01-26 10:30:59 - health.services.garmin_client - INFO - Authenticating with Garmin Connect China for 350134531@qq.com
2026-01-26 10:30:59 - health.services.garmin_client - INFO - Successfully authenticated with Garmin Connect China
2026-01-26 10:30:59 - health.services.data_sync - INFO - Authentication successful
2026-01-26 10:30:59 - health.services.data_sync - INFO - Syncing 13 metric types from 2026-01-26 to 2026-01-26
2026-01-26 10:30:59 - health.services.data_sync - INFO - Syncing steps from 2026-01-26 to 2026-01-26 (1 days)
2026-01-26 10:30:59 - health.services.data_sync - INFO - ✓ Synced steps for 2026-01-26
2026-01-26 10:30:59 - health.services.data_sync - INFO - steps sync complete: 1 synced, 0 skipped, 0 errors
2026-01-26 10:30:59 - health.services.data_sync - INFO - Syncing heart_rate from 2026-01-26 to 2026-01-26 (1 days)
2026-01-26 10:30:59 - health.services.data_sync - INFO - ✓ Synced heart_rate for 2026-01-26
2026-01-26 10:30:59 - health.services.data_sync - INFO - heart_rate sync complete: 1 synced, 0 skipped, 0 errors
2026-01-26 10:30:59 - health.services.data_sync - INFO - Syncing sleep from 2026-01-26 to 2026-01-26 (1 days)
2026-01-26 10:31:00 - health.services.data_sync - INFO - ✓ Synced sleep for 2026-01-26
2026-01-26 10:31:00 - health.services.data_sync - INFO - sleep sync complete: 1 synced, 0 skipped, 0 errors
2026-01-26 10:31:00 - health.services.data_sync - INFO - Syncing stress from 2026-01-26 to 2026-01-26 (1 days)
2026-01-26 10:31:00 - health.services.data_sync - INFO - ✓ Synced stress for 2026-01-26
2026-01-26 10:31:00 - health.services.data_sync - INFO - stress sync complete: 1 synced, 0 skipped, 0 errors
2026-01-26 10:31:00 - health.services.data_sync - INFO - Syncing body_battery from 2026-01-26 to 2026-01-26 (1 days)
2026-01-26 10:31:00 - health.services.data_sync - INFO - ✓ Synced body_battery for 2026-01-26
2026-01-26 10:31:00 - health.services.data_sync - INFO - body_battery sync complete: 1 synced, 0 skipped, 0 errors
2026-01-26 10:31:00 - health.services.data_sync - INFO - Syncing spo2 from 2026-01-26 to 2026-01-26 (1 days)
2026-01-26 10:31:00 - health.services.data_sync - INFO - ✓ Synced spo2 for 2026-01-26
2026-01-26 10:31:00 - health.services.data_sync - INFO - spo2 sync complete: 1 synced, 0 skipped, 0 errors
2026-01-26 10:31:00 - health.services.data_sync - INFO - Syncing respiration from 2026-01-26 to 2026-01-26 (1 days)
2026-01-26 10:31:00 - health.services.data_sync - INFO - ✓ Synced respiration for 2026-01-26
2026-01-26 10:31:00 - health.services.data_sync - INFO - respiration sync complete: 1 synced, 0 skipped, 0 errors
2026-01-26 10:31:00 - health.services.data_sync - INFO - Syncing hydration from 2026-01-26 to 2026-01-26 (1 days)
2026-01-26 10:31:00 - health.services.data_sync - INFO - ✓ Synced hydration for 2026-01-26
2026-01-26 10:31:00 - health.services.data_sync - INFO - hydration sync complete: 1 synced, 0 skipped, 0 errors
2026-01-26 10:31:00 - health.services.data_sync - INFO - Syncing floors from 2026-01-26 to 2026-01-26 (1 days)
2026-01-26 10:31:00 - health.services.data_sync - INFO - ✓ Synced floors for 2026-01-26
2026-01-26 10:31:00 - health.services.data_sync - INFO - floors sync complete: 1 synced, 0 skipped, 0 errors
2026-01-26 10:31:00 - health.services.data_sync - INFO - Syncing intensity_minutes from 2026-01-26 to 2026-01-26 (1 days)
2026-01-26 10:31:00 - health.services.data_sync - INFO - ✓ Synced intensity_minutes for 2026-01-26
2026-01-26 10:31:00 - health.services.data_sync - INFO - intensity_minutes sync complete: 1 synced, 0 skipped, 0 errors
2026-01-26 10:31:00 - health.services.data_sync - INFO - Syncing hrv from 2026-01-26 to 2026-01-26 (1 days)
2026-01-26 10:31:00 - health.services.data_sync - INFO - ✓ Synced hrv for 2026-01-26
2026-01-26 10:31:00 - health.services.data_sync - INFO - hrv sync complete: 1 synced, 0 skipped, 0 errors
2026-01-26 10:31:00 - health.services.data_sync - INFO - Syncing rhr from 2026-01-26 to 2026-01-26 (1 days)
2026-01-26 10:31:00 - health.services.data_sync - INFO - ✓ Synced rhr for 2026-01-26
2026-01-26 10:31:00 - health.services.data_sync - INFO - rhr sync complete: 1 synced, 0 skipped, 0 errors
2026-01-26 10:31:00 - health.services.data_sync - INFO - Syncing weight from 2026-01-26 to 2026-01-26 (1 days)
2026-01-26 10:31:01 - health.services.data_sync - INFO - weight sync complete: 0 synced, 1 skipped, 0 errors
2026-01-26 10:31:01 - health.services.data_sync - INFO - Syncing activities from 2026-01-26 to 2026-01-26
2026-01-26 10:31:01 - health.services.data_sync - INFO - Found 0 activities
2026-01-26 10:31:01 - health.services.data_sync - INFO - Activity sync complete: 0 synced, 0 skipped, 0 errors
2026-01-26 10:31:01 - health.services.query - INFO - Querying health data summary for 2026-01-26
2026-01-26 10:31:01 - health.services.query - INFO - Found 12 metrics and 0 activities
2026-01-26 10:31:01 - slack_bot.tools.health_read - INFO - Auto-sync completed, re-queried data.
2026-01-26 10:31:01 - slack_bot.dispatcher - INFO - [20c99da1] ✓ get_daily_detailed_stats finished in 1.98s
2026-01-26 10:31:01 - slack_bot.dispatcher - INFO - [20c99da1] Requesting final analysis...
2026-01-26 10:31:01 - slack_bot.llm.gemini - INFO - Sending payload to OpenAI Proxy: {"model": "gemini-3-flash", "messages": [{"role": "system", "content": "You are Butler, a personal health assistant for tracking and analyzing health data.\n\nYou help the user manage:\n- Sleep quality and patterns (from Garmin watch)\n- Exercise data: steps, activities, heart rate\n- Diet logs: meals, supplements, fasting modes (OMAD, PSMF)\n- Diet logs: meals, supplements, fasting modes (OMAD, PSMF)\n- Body feelings and symptoms\n\nGuidelines:\n- **DATA INTEGRITY IS PARAMOUNT**: Never hallucinate or invent data. If a tool returns \"No data found\", YOU MUST SAY \"I cannot find data for this date\". Do NOT guess numbers.\n- **VISION & IMAGES**: When analyzing images (e.g., food logs), if the image is unclear or unreadable, say \"I cannot identify the food in this image\". Do NOT guess ingredients you do not see.\n- Be concise and data-driven\n- When the user wants to log something (diet, supplement, etc), use the appropriate tool\n- When asked about health data, retrieve it first befo...
2026-01-26 10:31:13 - slack_bot.dispatcher - INFO - [20c99da1] Final analysis received in 11.88s
2026-01-26 10:31:13 - slack_bot.dispatcher - INFO - Formatted text (len 1076 -> 1044)
2026-01-26 10:31:13 - slack_bot.dispatcher - INFO - [20c99da1] 📤 Message updated 1769394653.877449
2026-01-26 10:31:13 - slack_bot.dispatcher - INFO - [20c99da1] Dispatch completed in 19.60s
2026-01-26 10:31:13 - __main__ - INFO - [20c99da1] ✅ Request completed in 20.18s
2026-01-26 10:31:53 - __main__ - INFO - [f00d2141] 📥 Received message from U0A8ZCK7RJM in D0AA4GBQRKK: rem和深睡眠是啥区别和作用 (Files: 0)
2026-01-26 10:31:53 - slack_bot.dispatcher - INFO - [f00d2141] Processing message in D0AA4GBQRKK from U0A8ZCK7RJM
2026-01-26 10:31:53 - slack_bot.dispatcher - INFO - [f00d2141] Calling Gemini for initial response...
2026-01-26 10:31:53 - slack_bot.llm.gemini - INFO - Sending payload to OpenAI Proxy: {"model": "gemini-3-flash", "messages": [{"role": "system", "content": "You are Butler, a personal health assistant for tracking and analyzing health data.\n\nYou help the user manage:\n- Sleep quality and patterns (from Garmin watch)\n- Exercise data: steps, activities, heart rate\n- Diet logs: meals, supplements, fasting modes (OMAD, PSMF)\n- Diet logs: meals, supplements, fasting modes (OMAD, PSMF)\n- Body feelings and symptoms\n\nGuidelines:\n- **DATA INTEGRITY IS PARAMOUNT**: Never hallucinate or invent data. If a tool returns \"No data found\", YOU MUST SAY \"I cannot find data for this date\". Do NOT guess numbers.\n- **VISION & IMAGES**: When analyzing images (e.g., food logs), if the image is unclear or unreadable, say \"I cannot identify the food in this image\". Do NOT guess ingredients you do not see.\n- Be concise and data-driven\n- When the user wants to log something (diet, supplement, etc), use the appropriate tool\n- When asked about health data, retrieve it first befo...
2026-01-26 10:32:02 - slack_bot.dispatcher - INFO - [f00d2141] Gemini response in 8.92s: 1374 chars, 0 tools
2026-01-26 10:32:02 - slack_bot.dispatcher - INFO - Formatted text (len 1374 -> 1316)
2026-01-26 10:32:03 - slack_bot.dispatcher - INFO - [f00d2141] 📤 Message updated 1769394713.708559
2026-01-26 10:32:03 - slack_bot.dispatcher - INFO - [f00d2141] Dispatch completed in 9.60s
2026-01-26 10:32:03 - __main__ - INFO - [f00d2141] ✅ Request completed in 10.07s
Failed to check the state of sock (session id: 25be61a9-9916-4885-b0b5-14178ff6d646, error: SSLError, message: [SYS] unknown error (_ssl.c:2406))
Failed to check the state of sock (session id: 25be61a9-9916-4885-b0b5-14178ff6d646, error: SSLError, message: [SYS] unknown error (_ssl.c:2406))
Failed to check the state of sock (session id: 25be61a9-9916-4885-b0b5-14178ff6d646, error: SSLError, message: [SYS] unknown error (_ssl.c:2406))
Failed to check the state of sock (session id: 25be61a9-9916-4885-b0b5-14178ff6d646, error: SSLError, message: [SYS] unknown error (_ssl.c:2406))
Failed to check the state of sock (session id: 25be61a9-9916-4885-b0b5-14178ff6d646, error: SSLError, message: [SYS] unknown error (_ssl.c:2406))
2026-01-27 23:52:40 - __main__ - INFO - [ee5e3f76] 📥 Received message from U0A8ZCK7RJM in D0AA4GBQRKK: 拉取佳明数据 (Files: 0)
2026-01-27 23:52:41 - slack_bot.dispatcher - INFO - [ee5e3f76] Processing message in D0AA4GBQRKK from U0A8ZCK7RJM
2026-01-27 23:52:41 - slack_bot.dispatcher - INFO - [ee5e3f76] Calling Gemini for initial response...
2026-01-27 23:52:41 - slack_bot.llm.gemini - INFO - Sending payload to OpenAI Proxy: {"model": "gemini-3-flash", "messages": [{"role": "system", "content": "You are Butler, a personal health assistant for tracking and analyzing health data.\n\nYou help the user manage:\n- Sleep quality and patterns (from Garmin watch)\n- Exercise data: steps, activities, heart rate\n- Diet logs: meals, supplements, fasting modes (OMAD, PSMF)\n- Diet logs: meals, supplements, fasting modes (OMAD, PSMF)\n- Body feelings and symptoms\n\nGuidelines:\n- **DATA INTEGRITY IS PARAMOUNT**: Never hallucinate or invent data. If a tool returns \"No data found\", YOU MUST SAY \"I cannot find data for this date\". Do NOT guess numbers.\n- **VISION & IMAGES**: When analyzing images (e.g., food logs), if the image is unclear or unreadable, say \"I cannot identify the food in this image\". Do NOT guess ingredients you do not see.\n- Be concise and data-driven\n- When the user wants to log something (diet, supplement, etc), use the appropriate tool\n- When asked about health data, retrieve it first befo...
2026-01-27 23:52:49 - slack_bot.llm.gemini - WARNING - JSON parse error: Extra data: line 1 column 29 (char 28). String: {"target_date":"2026-01-26"}{"target_date":"2026-01-26"}{"end_date":"2026-01-26","start_date":"2026-...
2026-01-27 23:52:49 - slack_bot.llm.gemini - INFO - Successfully recovered JSON using raw_decode
2026-01-27 23:52:49 - slack_bot.dispatcher - INFO - [ee5e3f76] Gemini response in 7.86s: 0 chars, 1 tools
2026-01-27 23:52:49 - slack_bot.dispatcher - INFO - [ee5e3f76] Executing 1 tools
2026-01-27 23:52:49 - slack_bot.dispatcher - INFO - [ee5e3f76] Tool: get_activity_history Args: {'target_date': '2026-01-26'}
2026-01-27 23:52:49 - health.services.query - INFO - Querying activities from 2026-01-26 to 2026-01-26
2026-01-27 23:52:49 - health.services.query - INFO - Found 0 activities
2026-01-27 23:52:49 - slack_bot.dispatcher - INFO - [ee5e3f76] ✓ get_activity_history finished in 0.00s
2026-01-27 23:52:49 - slack_bot.dispatcher - INFO - [ee5e3f76] Requesting final analysis...
2026-01-27 23:52:49 - slack_bot.llm.gemini - INFO - Sending payload to OpenAI Proxy: {"model": "gemini-3-flash", "messages": [{"role": "system", "content": "You are Butler, a personal health assistant for tracking and analyzing health data.\n\nYou help the user manage:\n- Sleep quality and patterns (from Garmin watch)\n- Exercise data: steps, activities, heart rate\n- Diet logs: meals, supplements, fasting modes (OMAD, PSMF)\n- Diet logs: meals, supplements, fasting modes (OMAD, PSMF)\n- Body feelings and symptoms\n\nGuidelines:\n- **DATA INTEGRITY IS PARAMOUNT**: Never hallucinate or invent data. If a tool returns \"No data found\", YOU MUST SAY \"I cannot find data for this date\". Do NOT guess numbers.\n- **VISION & IMAGES**: When analyzing images (e.g., food logs), if the image is unclear or unreadable, say \"I cannot identify the food in this image\". Do NOT guess ingredients you do not see.\n- Be concise and data-driven\n- When the user wants to log something (diet, supplement, etc), use the appropriate tool\n- When asked about health data, retrieve it first befo...
2026-01-27 23:53:35 - slack_bot.dispatcher - INFO - [ee5e3f76] Final analysis received in 46.88s
2026-01-27 23:53:35 - slack_bot.dispatcher - INFO - Formatted text (len 546 -> 518)
2026-01-27 23:53:36 - slack_bot.dispatcher - INFO - [ee5e3f76] 📤 Message updated 1769529161.113129
2026-01-27 23:53:36 - slack_bot.dispatcher - INFO - [ee5e3f76] Dispatch completed in 55.27s
2026-01-27 23:53:36 - __main__ - INFO - [ee5e3f76] ✅ Request completed in 55.96s
2026-01-27 23:55:42 - __main__ - INFO - [93d4375a] 📥 Received message from U0A8ZCK7RJM in D0AA4GBQRKK: 同步佳明数据 (Files: 0)
2026-01-27 23:55:43 - slack_bot.dispatcher - INFO - [93d4375a] Processing message in D0AA4GBQRKK from U0A8ZCK7RJM
2026-01-27 23:55:43 - slack_bot.dispatcher - INFO - [93d4375a] Calling Gemini for initial response...
2026-01-27 23:55:43 - slack_bot.llm.gemini - INFO - Sending payload to OpenAI Proxy: {"model": "gemini-3-flash", "messages": [{"role": "system", "content": "You are Butler, a personal health assistant for tracking and analyzing health data.\n\nYou help the user manage:\n- Sleep quality and patterns (from Garmin watch)\n- Exercise data: steps, activities, heart rate\n- Diet logs: meals, supplements, fasting modes (OMAD, PSMF)\n- Diet logs: meals, supplements, fasting modes (OMAD, PSMF)\n- Body feelings and symptoms\n\nGuidelines:\n- **DATA INTEGRITY IS PARAMOUNT**: Never hallucinate or invent data. If a tool returns \"No data found\", YOU MUST SAY \"I cannot find data for this date\". Do NOT guess numbers.\n- **VISION & IMAGES**: When analyzing images (e.g., food logs), if the image is unclear or unreadable, say \"I cannot identify the food in this image\". Do NOT guess ingredients you do not see.\n- Be concise and data-driven\n- When the user wants to log something (diet, supplement, etc), use the appropriate tool\n- When asked about health data, retrieve it first befo...
2026-01-27 23:55:53 - slack_bot.llm.gemini - WARNING - JSON parse error: Extra data: line 1 column 29 (char 28). String: {"target_date":"2026-01-26"}{"target_date":"2026-01-26"}...
2026-01-27 23:55:53 - slack_bot.llm.gemini - INFO - Successfully recovered JSON using raw_decode
2026-01-27 23:55:53 - slack_bot.dispatcher - INFO - [93d4375a] Gemini response in 10.35s: 0 chars, 1 tools
2026-01-27 23:55:53 - slack_bot.dispatcher - INFO - [93d4375a] Executing 1 tools
2026-01-27 23:55:53 - slack_bot.dispatcher - INFO - [93d4375a] Tool: get_daily_detailed_stats Args: {'target_date': '2026-01-26'}
2026-01-27 23:55:53 - health.services.query - INFO - Querying health data summary for 2026-01-26
2026-01-27 23:55:53 - health.services.query - INFO - Found 12 metrics and 0 activities
2026-01-27 23:55:53 - slack_bot.dispatcher - INFO - [93d4375a] ✓ get_daily_detailed_stats finished in 0.03s
2026-01-27 23:55:53 - slack_bot.dispatcher - INFO - [93d4375a] Requesting final analysis...
2026-01-27 23:55:53 - slack_bot.llm.gemini - INFO - Sending payload to OpenAI Proxy: {"model": "gemini-3-flash", "messages": [{"role": "system", "content": "You are Butler, a personal health assistant for tracking and analyzing health data.\n\nYou help the user manage:\n- Sleep quality and patterns (from Garmin watch)\n- Exercise data: steps, activities, heart rate\n- Diet logs: meals, supplements, fasting modes (OMAD, PSMF)\n- Diet logs: meals, supplements, fasting modes (OMAD, PSMF)\n- Body feelings and symptoms\n\nGuidelines:\n- **DATA INTEGRITY IS PARAMOUNT**: Never hallucinate or invent data. If a tool returns \"No data found\", YOU MUST SAY \"I cannot find data for this date\". Do NOT guess numbers.\n- **VISION & IMAGES**: When analyzing images (e.g., food logs), if the image is unclear or unreadable, say \"I cannot identify the food in this image\". Do NOT guess ingredients you do not see.\n- Be concise and data-driven\n- When the user wants to log something (diet, supplement, etc), use the appropriate tool\n- When asked about health data, retrieve it first befo...
2026-01-27 23:56:05 - slack_bot.dispatcher - INFO - [93d4375a] Final analysis received in 12.12s
2026-01-27 23:56:05 - slack_bot.dispatcher - INFO - Formatted text (len 635 -> 597)
2026-01-27 23:56:06 - slack_bot.dispatcher - INFO - [93d4375a] 📤 Message updated 1769529342.954469
2026-01-27 23:56:06 - slack_bot.dispatcher - INFO - [93d4375a] Dispatch completed in 23.23s
2026-01-27 23:56:06 - __main__ - INFO - [93d4375a] ✅ Request completed in 23.72s
Failed to check the state of sock (session id: eed69f5c-be73-4419-98db-7bb27d65ecf0, error: SSLError, message: [SYS] unknown error (_ssl.c:2406))
Failed to check the state of sock (session id: eed69f5c-be73-4419-98db-7bb27d65ecf0, error: SSLError, message: [SSL: BAD_LENGTH] bad length (_ssl.c:2406))
Failed to check the state of sock (session id: eed69f5c-be73-4419-98db-7bb27d65ecf0, error: SSLError, message: [SSL: BAD_LENGTH] bad length (_ssl.c:2406))
Failed to check the state of sock (session id: eed69f5c-be73-4419-98db-7bb27d65ecf0, error: SSLError, message: [SSL: BAD_LENGTH] bad length (_ssl.c:2406))
Failed to check the state of sock (session id: eed69f5c-be73-4419-98db-7bb27d65ecf0, error: SSLError, message: [SSL: BAD_LENGTH] bad length (_ssl.c:2406))
2026-01-28 09:28:25 - __main__ - INFO - [40f4455d] 📥 Received message from U0A8ZCK7RJM in D0AA4GBQRKK: 同步佳明数据 (Files: 0)
2026-01-28 09:28:25 - slack_bot.dispatcher - INFO - [40f4455d] Processing message in D0AA4GBQRKK from U0A8ZCK7RJM
2026-01-28 09:28:25 - slack_bot.dispatcher - INFO - [40f4455d] Calling Gemini for initial response...
2026-01-28 09:28:25 - slack_bot.llm.gemini - INFO - Sending payload to OpenAI Proxy: {"model": "gemini-3-flash", "messages": [{"role": "system", "content": "You are Butler, a personal health assistant for tracking and analyzing health data.\n\nYou help the user manage:\n- Sleep quality and patterns (from Garmin watch)\n- Exercise data: steps, activities, heart rate\n- Diet logs: meals, supplements, fasting modes (OMAD, PSMF)\n- Diet logs: meals, supplements, fasting modes (OMAD, PSMF)\n- Body feelings and symptoms\n\nGuidelines:\n- **DATA INTEGRITY IS PARAMOUNT**: Never hallucinate or invent data. If a tool returns \"No data found\", YOU MUST SAY \"I cannot find data for this date\". Do NOT guess numbers.\n- **VISION & IMAGES**: When analyzing images (e.g., food logs), if the image is unclear or unreadable, say \"I cannot identify the food in this image\". Do NOT guess ingredients you do not see.\n- Be concise and data-driven\n- When the user wants to log something (diet, supplement, etc), use the appropriate tool\n- When asked about health data, retrieve it first befo...
2026-01-28 09:28:31 - slack_bot.dispatcher - INFO - [40f4455d] Gemini response in 5.56s: 0 chars, 1 tools
2026-01-28 09:28:31 - slack_bot.dispatcher - INFO - [40f4455d] Executing 1 tools
2026-01-28 09:28:31 - slack_bot.dispatcher - INFO - [40f4455d] Tool: get_daily_detailed_stats Args: {'target_date': '2026-01-26'}
2026-01-28 09:28:31 - health.services.query - INFO - Querying health data summary for 2026-01-26
2026-01-28 09:28:31 - health.services.query - INFO - Found 12 metrics and 0 activities
2026-01-28 09:28:31 - slack_bot.dispatcher - INFO - [40f4455d] ✓ get_daily_detailed_stats finished in 0.02s
2026-01-28 09:28:31 - slack_bot.dispatcher - INFO - [40f4455d] Requesting final analysis...
2026-01-28 09:28:31 - slack_bot.llm.gemini - INFO - Sending payload to OpenAI Proxy: {"model": "gemini-3-flash", "messages": [{"role": "system", "content": "You are Butler, a personal health assistant for tracking and analyzing health data.\n\nYou help the user manage:\n- Sleep quality and patterns (from Garmin watch)\n- Exercise data: steps, activities, heart rate\n- Diet logs: meals, supplements, fasting modes (OMAD, PSMF)\n- Diet logs: meals, supplements, fasting modes (OMAD, PSMF)\n- Body feelings and symptoms\n\nGuidelines:\n- **DATA INTEGRITY IS PARAMOUNT**: Never hallucinate or invent data. If a tool returns \"No data found\", YOU MUST SAY \"I cannot find data for this date\". Do NOT guess numbers.\n- **VISION & IMAGES**: When analyzing images (e.g., food logs), if the image is unclear or unreadable, say \"I cannot identify the food in this image\". Do NOT guess ingredients you do not see.\n- Be concise and data-driven\n- When the user wants to log something (diet, supplement, etc), use the appropriate tool\n- When asked about health data, retrieve it first befo...
2026-01-28 09:28:41 - slack_bot.dispatcher - INFO - [40f4455d] Final analysis received in 10.06s
2026-01-28 09:28:41 - slack_bot.dispatcher - INFO - Formatted text (len 790 -> 754)
2026-01-28 09:28:41 - slack_bot.dispatcher - INFO - [40f4455d] 📤 Message updated 1769563705.537439
2026-01-28 09:28:41 - slack_bot.dispatcher - INFO - [40f4455d] Dispatch completed in 16.19s
2026-01-28 09:28:41 - __main__ - INFO - [40f4455d] ✅ Request completed in 16.71s
2026-01-28 09:29:23 - __main__ - INFO - [33a46e73] 📥 Received message from U0A8ZCK7RJM in D0AA4GBQRKK: 今天已经是一月28日了，请同步27日数据 (Files: 0)
2026-01-28 09:29:24 - slack_bot.dispatcher - INFO - [33a46e73] Processing message in D0AA4GBQRKK from U0A8ZCK7RJM
2026-01-28 09:29:24 - slack_bot.dispatcher - INFO - [33a46e73] Calling Gemini for initial response...
2026-01-28 09:29:24 - slack_bot.llm.gemini - INFO - Sending payload to OpenAI Proxy: {"model": "gemini-3-flash", "messages": [{"role": "system", "content": "You are Butler, a personal health assistant for tracking and analyzing health data.\n\nYou help the user manage:\n- Sleep quality and patterns (from Garmin watch)\n- Exercise data: steps, activities, heart rate\n- Diet logs: meals, supplements, fasting modes (OMAD, PSMF)\n- Diet logs: meals, supplements, fasting modes (OMAD, PSMF)\n- Body feelings and symptoms\n\nGuidelines:\n- **DATA INTEGRITY IS PARAMOUNT**: Never hallucinate or invent data. If a tool returns \"No data found\", YOU MUST SAY \"I cannot find data for this date\". Do NOT guess numbers.\n- **VISION & IMAGES**: When analyzing images (e.g., food logs), if the image is unclear or unreadable, say \"I cannot identify the food in this image\". Do NOT guess ingredients you do not see.\n- Be concise and data-driven\n- When the user wants to log something (diet, supplement, etc), use the appropriate tool\n- When asked about health data, retrieve it first befo...
2026-01-28 09:29:27 - slack_bot.llm.gemini - WARNING - JSON parse error: Extra data: line 1 column 29 (char 28). String: {"target_date":"2026-01-27"}{"end_date":"2026-01-27","start_date":"2026-01-27"}{"category":"all","en...
2026-01-28 09:29:27 - slack_bot.llm.gemini - INFO - Successfully recovered JSON using raw_decode
2026-01-28 09:29:27 - slack_bot.dispatcher - INFO - [33a46e73] Gemini response in 3.70s: 0 chars, 1 tools
2026-01-28 09:29:27 - slack_bot.dispatcher - INFO - [33a46e73] Executing 1 tools
2026-01-28 09:29:27 - slack_bot.dispatcher - INFO - [33a46e73] Tool: get_manual_history Args: {'target_date': '2026-01-27'}
2026-01-28 09:29:27 - slack_bot.dispatcher - INFO - [33a46e73] ✓ get_manual_history finished in 0.00s
2026-01-28 09:29:27 - slack_bot.dispatcher - INFO - [33a46e73] Requesting final analysis...
2026-01-28 09:29:27 - slack_bot.llm.gemini - INFO - Sending payload to OpenAI Proxy: {"model": "gemini-3-flash", "messages": [{"role": "system", "content": "You are Butler, a personal health assistant for tracking and analyzing health data.\n\nYou help the user manage:\n- Sleep quality and patterns (from Garmin watch)\n- Exercise data: steps, activities, heart rate\n- Diet logs: meals, supplements, fasting modes (OMAD, PSMF)\n- Diet logs: meals, supplements, fasting modes (OMAD, PSMF)\n- Body feelings and symptoms\n\nGuidelines:\n- **DATA INTEGRITY IS PARAMOUNT**: Never hallucinate or invent data. If a tool returns \"No data found\", YOU MUST SAY \"I cannot find data for this date\". Do NOT guess numbers.\n- **VISION & IMAGES**: When analyzing images (e.g., food logs), if the image is unclear or unreadable, say \"I cannot identify the food in this image\". Do NOT guess ingredients you do not see.\n- Be concise and data-driven\n- When the user wants to log something (diet, supplement, etc), use the appropriate tool\n- When asked about health data, retrieve it first befo...
2026-01-28 09:29:39 - slack_bot.dispatcher - INFO - [33a46e73] Final analysis received in 11.22s
2026-01-28 09:29:39 - slack_bot.dispatcher - INFO - Formatted text (len 2076 -> 2022)
2026-01-28 09:29:39 - slack_bot.dispatcher - INFO - [33a46e73] 📤 Message updated 1769563763.984879
2026-01-28 09:29:39 - slack_bot.dispatcher - INFO - [33a46e73] Dispatch completed in 15.55s
2026-01-28 09:29:39 - __main__ - INFO - [33a46e73] ✅ Request completed in 16.06s
2026-01-28 09:30:09 - __main__ - INFO - [15b5cab3] 📥 Received message from U0A8ZCK7RJM in D0AA4GBQRKK: 今天轻断食吧，去泰国几天，体重涨到了71.3kg (Files: 0)
2026-01-28 09:30:09 - slack_bot.dispatcher - INFO - [15b5cab3] Processing message in D0AA4GBQRKK from U0A8ZCK7RJM
2026-01-28 09:30:09 - slack_bot.dispatcher - INFO - [15b5cab3] Calling Gemini for initial response...
2026-01-28 09:30:09 - slack_bot.llm.gemini - INFO - Sending payload to OpenAI Proxy: {"model": "gemini-3-flash", "messages": [{"role": "system", "content": "You are Butler, a personal health assistant for tracking and analyzing health data.\n\nYou help the user manage:\n- Sleep quality and patterns (from Garmin watch)\n- Exercise data: steps, activities, heart rate\n- Diet logs: meals, supplements, fasting modes (OMAD, PSMF)\n- Diet logs: meals, supplements, fasting modes (OMAD, PSMF)\n- Body feelings and symptoms\n\nGuidelines:\n- **DATA INTEGRITY IS PARAMOUNT**: Never hallucinate or invent data. If a tool returns \"No data found\", YOU MUST SAY \"I cannot find data for this date\". Do NOT guess numbers.\n- **VISION & IMAGES**: When analyzing images (e.g., food logs), if the image is unclear or unreadable, say \"I cannot identify the food in this image\". Do NOT guess ingredients you do not see.\n- Be concise and data-driven\n- When the user wants to log something (diet, supplement, etc), use the appropriate tool\n- When asked about health data, retrieve it first befo...
2026-01-28 09:30:17 - slack_bot.dispatcher - INFO - [15b5cab3] Gemini response in 7.49s: 1384 chars, 0 tools
2026-01-28 09:30:17 - slack_bot.dispatcher - INFO - Formatted text (len 1384 -> 1384)
2026-01-28 09:30:17 - slack_bot.dispatcher - INFO - [15b5cab3] 📤 Message updated 1769563809.640249
2026-01-28 09:30:17 - slack_bot.dispatcher - INFO - [15b5cab3] Dispatch completed in 8.04s
2026-01-28 09:30:17 - __main__ - INFO - [15b5cab3] ✅ Request completed in 8.57s
2026-01-28 09:31:32 - __main__ - INFO - [0d9f94f8] 📥 Received message from U0A8ZCK7RJM in D0AA4GBQRKK: 好的，就这么执行吧，我正在椭圆机zone2，稍后看看数据 (Files: 0)
2026-01-28 09:31:32 - slack_bot.dispatcher - INFO - [0d9f94f8] Processing message in D0AA4GBQRKK from U0A8ZCK7RJM
2026-01-28 09:31:32 - slack_bot.dispatcher - INFO - [0d9f94f8] Calling Gemini for initial response...
2026-01-28 09:31:32 - slack_bot.llm.gemini - INFO - Sending payload to OpenAI Proxy: {"model": "gemini-3-flash", "messages": [{"role": "system", "content": "You are Butler, a personal health assistant for tracking and analyzing health data.\n\nYou help the user manage:\n- Sleep quality and patterns (from Garmin watch)\n- Exercise data: steps, activities, heart rate\n- Diet logs: meals, supplements, fasting modes (OMAD, PSMF)\n- Diet logs: meals, supplements, fasting modes (OMAD, PSMF)\n- Body feelings and symptoms\n\nGuidelines:\n- **DATA INTEGRITY IS PARAMOUNT**: Never hallucinate or invent data. If a tool returns \"No data found\", YOU MUST SAY \"I cannot find data for this date\". Do NOT guess numbers.\n- **VISION & IMAGES**: When analyzing images (e.g., food logs), if the image is unclear or unreadable, say \"I cannot identify the food in this image\". Do NOT guess ingredients you do not see.\n- Be concise and data-driven\n- When the user wants to log something (diet, supplement, etc), use the appropriate tool\n- When asked about health data, retrieve it first befo...
2026-01-28 09:31:37 - slack_bot.llm.gemini - WARNING - JSON parse error: Extra data: line 1 column 29 (char 28). String: {"target_date":"2026-01-28"}{"end_date":"2026-01-28","start_date":"2026-01-28"}...
2026-01-28 09:31:37 - slack_bot.llm.gemini - INFO - Successfully recovered JSON using raw_decode
2026-01-28 09:31:37 - slack_bot.dispatcher - INFO - [0d9f94f8] Gemini response in 4.78s: 0 chars, 1 tools
2026-01-28 09:31:37 - slack_bot.dispatcher - INFO - [0d9f94f8] Executing 1 tools
2026-01-28 09:31:37 - slack_bot.dispatcher - INFO - [0d9f94f8] Tool: get_activity_history Args: {'target_date': '2026-01-28'}
2026-01-28 09:31:37 - health.services.query - INFO - Querying activities from 2026-01-28 to 2026-01-28
2026-01-28 09:31:37 - health.services.query - INFO - Found 0 activities
2026-01-28 09:31:37 - slack_bot.dispatcher - INFO - [0d9f94f8] ✓ get_activity_history finished in 0.00s
2026-01-28 09:31:37 - slack_bot.dispatcher - INFO - [0d9f94f8] Requesting final analysis...
2026-01-28 09:31:37 - slack_bot.llm.gemini - INFO - Sending payload to OpenAI Proxy: {"model": "gemini-3-flash", "messages": [{"role": "system", "content": "You are Butler, a personal health assistant for tracking and analyzing health data.\n\nYou help the user manage:\n- Sleep quality and patterns (from Garmin watch)\n- Exercise data: steps, activities, heart rate\n- Diet logs: meals, supplements, fasting modes (OMAD, PSMF)\n- Diet logs: meals, supplements, fasting modes (OMAD, PSMF)\n- Body feelings and symptoms\n\nGuidelines:\n- **DATA INTEGRITY IS PARAMOUNT**: Never hallucinate or invent data. If a tool returns \"No data found\", YOU MUST SAY \"I cannot find data for this date\". Do NOT guess numbers.\n- **VISION & IMAGES**: When analyzing images (e.g., food logs), if the image is unclear or unreadable, say \"I cannot identify the food in this image\". Do NOT guess ingredients you do not see.\n- Be concise and data-driven\n- When the user wants to log something (diet, supplement, etc), use the appropriate tool\n- When asked about health data, retrieve it first befo...
2026-01-28 09:31:42 - slack_bot.dispatcher - INFO - [0d9f94f8] Final analysis received in 5.10s
2026-01-28 09:31:42 - slack_bot.dispatcher - INFO - Formatted text (len 389 -> 377)
2026-01-28 09:31:42 - slack_bot.dispatcher - INFO - [0d9f94f8] 📤 Message updated 1769563892.403999
2026-01-28 09:31:42 - slack_bot.dispatcher - INFO - [0d9f94f8] Dispatch completed in 10.41s
2026-01-28 09:31:42 - __main__ - INFO - [0d9f94f8] ✅ Request completed in 10.87s
2026-01-28 09:48:22 - __main__ - INFO - [6de4fb63] 📥 Received message from U0A8ZCK7RJM in D0AA4GBQRKK: 运动完确实也有点紧绷感，可能是缺电解质？ (Files: 0)
2026-01-28 09:48:23 - slack_bot.dispatcher - INFO - [6de4fb63] Processing message in D0AA4GBQRKK from U0A8ZCK7RJM
2026-01-28 09:48:23 - slack_bot.dispatcher - INFO - [6de4fb63] Calling Gemini for initial response...
2026-01-28 09:48:23 - slack_bot.llm.gemini - INFO - Sending payload to OpenAI Proxy: {"model": "gemini-3-flash", "messages": [{"role": "system", "content": "You are Butler, a personal health assistant for tracking and analyzing health data.\n\nYou help the user manage:\n- Sleep quality and patterns (from Garmin watch)\n- Exercise data: steps, activities, heart rate\n- Diet logs: meals, supplements, fasting modes (OMAD, PSMF)\n- Diet logs: meals, supplements, fasting modes (OMAD, PSMF)\n- Body feelings and symptoms\n\nGuidelines:\n- **DATA INTEGRITY IS PARAMOUNT**: Never hallucinate or invent data. If a tool returns \"No data found\", YOU MUST SAY \"I cannot find data for this date\". Do NOT guess numbers.\n- **VISION & IMAGES**: When analyzing images (e.g., food logs), if the image is unclear or unreadable, say \"I cannot identify the food in this image\". Do NOT guess ingredients you do not see.\n- Be concise and data-driven\n- When the user wants to log something (diet, supplement, etc), use the appropriate tool\n- When asked about health data, retrieve it first befo...
2026-01-28 09:48:32 - slack_bot.dispatcher - INFO - [6de4fb63] Gemini response in 9.00s: 1043 chars, 0 tools
2026-01-28 09:48:32 - slack_bot.dispatcher - INFO - Formatted text (len 1043 -> 1025)
2026-01-28 09:48:32 - slack_bot.dispatcher - INFO - [6de4fb63] 📤 Message updated 1769564903.266759
2026-01-28 09:48:32 - slack_bot.dispatcher - INFO - [6de4fb63] Dispatch completed in 9.58s
2026-01-28 09:48:32 - __main__ - INFO - [6de4fb63] ✅ Request completed in 10.06s
2026-01-28 09:48:54 - __main__ - INFO - [2838c367] 📥 Received message from U0A8ZCK7RJM in D0AA4GBQRKK: 主要是没有盐在手里 (Files: 0)
2026-01-28 09:48:54 - slack_bot.dispatcher - INFO - [2838c367] Processing message in D0AA4GBQRKK from U0A8ZCK7RJM
2026-01-28 09:48:54 - slack_bot.dispatcher - INFO - [2838c367] Calling Gemini for initial response...
2026-01-28 09:48:54 - slack_bot.llm.gemini - INFO - Sending payload to OpenAI Proxy: {"model": "gemini-3-flash", "messages": [{"role": "system", "content": "You are Butler, a personal health assistant for tracking and analyzing health data.\n\nYou help the user manage:\n- Sleep quality and patterns (from Garmin watch)\n- Exercise data: steps, activities, heart rate\n- Diet logs: meals, supplements, fasting modes (OMAD, PSMF)\n- Diet logs: meals, supplements, fasting modes (OMAD, PSMF)\n- Body feelings and symptoms\n\nGuidelines:\n- **DATA INTEGRITY IS PARAMOUNT**: Never hallucinate or invent data. If a tool returns \"No data found\", YOU MUST SAY \"I cannot find data for this date\". Do NOT guess numbers.\n- **VISION & IMAGES**: When analyzing images (e.g., food logs), if the image is unclear or unreadable, say \"I cannot identify the food in this image\". Do NOT guess ingredients you do not see.\n- Be concise and data-driven\n- When the user wants to log something (diet, supplement, etc), use the appropriate tool\n- When asked about health data, retrieve it first befo...
2026-01-28 09:49:07 - slack_bot.dispatcher - INFO - [2838c367] Gemini response in 13.18s: 1048 chars, 0 tools
2026-01-28 09:49:07 - slack_bot.dispatcher - INFO - Formatted text (len 1048 -> 1002)
2026-01-28 09:49:08 - slack_bot.dispatcher - INFO - [2838c367] 📤 Message updated 1769564934.701429
2026-01-28 09:49:08 - slack_bot.dispatcher - INFO - [2838c367] Dispatch completed in 13.76s
2026-01-28 09:49:08 - __main__ - INFO - [2838c367] ✅ Request completed in 14.33s
2026-01-28 09:50:12 - __main__ - INFO - [1a2be59b] 📥 Received message from U0A8ZCK7RJM in D0AA4GBQRKK: 已经回中国了，我找找盐，如果没有吃个包装卤蛋怎么样 (Files: 0)
2026-01-28 09:50:13 - slack_bot.dispatcher - INFO - [1a2be59b] Processing message in D0AA4GBQRKK from U0A8ZCK7RJM
2026-01-28 09:50:13 - slack_bot.dispatcher - INFO - [1a2be59b] Calling Gemini for initial response...
2026-01-28 09:50:13 - slack_bot.llm.gemini - INFO - Sending payload to OpenAI Proxy: {"model": "gemini-3-flash", "messages": [{"role": "system", "content": "You are Butler, a personal health assistant for tracking and analyzing health data.\n\nYou help the user manage:\n- Sleep quality and patterns (from Garmin watch)\n- Exercise data: steps, activities, heart rate\n- Diet logs: meals, supplements, fasting modes (OMAD, PSMF)\n- Diet logs: meals, supplements, fasting modes (OMAD, PSMF)\n- Body feelings and symptoms\n\nGuidelines:\n- **DATA INTEGRITY IS PARAMOUNT**: Never hallucinate or invent data. If a tool returns \"No data found\", YOU MUST SAY \"I cannot find data for this date\". Do NOT guess numbers.\n- **VISION & IMAGES**: When analyzing images (e.g., food logs), if the image is unclear or unreadable, say \"I cannot identify the food in this image\". Do NOT guess ingredients you do not see.\n- Be concise and data-driven\n- When the user wants to log something (diet, supplement, etc), use the appropriate tool\n- When asked about health data, retrieve it first befo...
2026-01-28 09:50:22 - slack_bot.dispatcher - INFO - [1a2be59b] Gemini response in 9.15s: 724 chars, 0 tools
2026-01-28 09:50:22 - slack_bot.dispatcher - INFO - Formatted text (len 724 -> 690)
2026-01-28 09:50:22 - slack_bot.dispatcher - INFO - [1a2be59b] 📤 Message updated 1769565013.161769
2026-01-28 09:50:22 - slack_bot.dispatcher - INFO - [1a2be59b] Dispatch completed in 9.64s
2026-01-28 09:50:22 - __main__ - INFO - [1a2be59b] ✅ Request completed in 10.30s
2026-01-28 09:54:58 - __main__ - INFO - [669e1cf0] 📥 Received message from U0A8ZCK7RJM in D0AA4GBQRKK: 好的，食堂有盐。怎么喝比较好 (Files: 0)
2026-01-28 09:54:59 - slack_bot.dispatcher - INFO - [669e1cf0] Processing message in D0AA4GBQRKK from U0A8ZCK7RJM
2026-01-28 09:54:59 - slack_bot.dispatcher - INFO - [669e1cf0] Calling Gemini for initial response...
2026-01-28 09:54:59 - slack_bot.llm.gemini - INFO - Sending payload to OpenAI Proxy: {"model": "gemini-3-flash", "messages": [{"role": "system", "content": "You are Butler, a personal health assistant for tracking and analyzing health data.\n\nYou help the user manage:\n- Sleep quality and patterns (from Garmin watch)\n- Exercise data: steps, activities, heart rate\n- Diet logs: meals, supplements, fasting modes (OMAD, PSMF)\n- Diet logs: meals, supplements, fasting modes (OMAD, PSMF)\n- Body feelings and symptoms\n\nGuidelines:\n- **DATA INTEGRITY IS PARAMOUNT**: Never hallucinate or invent data. If a tool returns \"No data found\", YOU MUST SAY \"I cannot find data for this date\". Do NOT guess numbers.\n- **VISION & IMAGES**: When analyzing images (e.g., food logs), if the image is unclear or unreadable, say \"I cannot identify the food in this image\". Do NOT guess ingredients you do not see.\n- Be concise and data-driven\n- When the user wants to log something (diet, supplement, etc), use the appropriate tool\n- When asked about health data, retrieve it first befo...
2026-01-28 09:55:06 - slack_bot.dispatcher - INFO - [669e1cf0] Gemini response in 7.25s: 627 chars, 0 tools
2026-01-28 09:55:06 - slack_bot.dispatcher - INFO - Formatted text (len 627 -> 621)
2026-01-28 09:55:06 - slack_bot.dispatcher - INFO - [669e1cf0] 📤 Message updated 1769565298.912679
2026-01-28 09:55:06 - slack_bot.dispatcher - INFO - [669e1cf0] Dispatch completed in 7.79s
2026-01-28 09:55:06 - __main__ - INFO - [669e1cf0] ✅ Request completed in 8.29s
2026-01-28 12:21:47 - __main__ - INFO - [50a53908] 📥 Received message from U0A8ZCK7RJM in D0AA4GBQRKK: log_diet一勺蛋白粉 (Files: 0)
2026-01-28 12:21:48 - slack_bot.dispatcher - INFO - [50a53908] Processing message in D0AA4GBQRKK from U0A8ZCK7RJM
2026-01-28 12:21:48 - slack_bot.dispatcher - INFO - [50a53908] Calling Gemini for initial response...
2026-01-28 12:21:48 - slack_bot.llm.gemini - INFO - Sending payload to OpenAI Proxy: {"model": "gemini-3-flash", "messages": [{"role": "system", "content": "You are Butler, a personal health assistant for tracking and analyzing health data.\n\nYou help the user manage:\n- Sleep quality and patterns (from Garmin watch)\n- Exercise data: steps, activities, heart rate\n- Diet logs: meals, supplements, fasting modes (OMAD, PSMF)\n- Diet logs: meals, supplements, fasting modes (OMAD, PSMF)\n- Body feelings and symptoms\n\nGuidelines:\n- **DATA INTEGRITY IS PARAMOUNT**: Never hallucinate or invent data. If a tool returns \"No data found\", YOU MUST SAY \"I cannot find data for this date\". Do NOT guess numbers.\n- **VISION & IMAGES**: When analyzing images (e.g., food logs), if the image is unclear or unreadable, say \"I cannot identify the food in this image\". Do NOT guess ingredients you do not see.\n- Be concise and data-driven\n- When the user wants to log something (diet, supplement, etc), use the appropriate tool\n- When asked about health data, retrieve it first befo...
2026-01-28 12:21:56 - slack_bot.dispatcher - INFO - [50a53908] Gemini response in 8.13s: 0 chars, 1 tools
2026-01-28 12:21:56 - slack_bot.dispatcher - INFO - [50a53908] Executing 1 tools
2026-01-28 12:21:56 - slack_bot.dispatcher - INFO - [50a53908] Tool: log_diet Args: {'description': '一勺蛋白粉 (1 scoop protein powder)', 'meal_type': 'snack', 'target_date': '2026-01-28'}
2026-01-28 12:21:56 - health.services.manual_log_storage - INFO - Saved manual log for 2026-01-28 to /Users/lili/workspace/bulter/data/health/manual_logs/2026/01/2026-01-28.json
2026-01-28 12:21:56 - health.services.manual_log_storage - INFO - Added diet entry for 2026-01-28 at 12:21
2026-01-28 12:21:56 - slack_bot.dispatcher - INFO - [50a53908] ✓ log_diet finished in 0.00s
2026-01-28 12:21:56 - slack_bot.dispatcher - INFO - [50a53908] Requesting final analysis...
2026-01-28 12:21:56 - slack_bot.llm.gemini - INFO - Sending payload to OpenAI Proxy: {"model": "gemini-3-flash", "messages": [{"role": "system", "content": "You are Butler, a personal health assistant for tracking and analyzing health data.\n\nYou help the user manage:\n- Sleep quality and patterns (from Garmin watch)\n- Exercise data: steps, activities, heart rate\n- Diet logs: meals, supplements, fasting modes (OMAD, PSMF)\n- Diet logs: meals, supplements, fasting modes (OMAD, PSMF)\n- Body feelings and symptoms\n\nGuidelines:\n- **DATA INTEGRITY IS PARAMOUNT**: Never hallucinate or invent data. If a tool returns \"No data found\", YOU MUST SAY \"I cannot find data for this date\". Do NOT guess numbers.\n- **VISION & IMAGES**: When analyzing images (e.g., food logs), if the image is unclear or unreadable, say \"I cannot identify the food in this image\". Do NOT guess ingredients you do not see.\n- Be concise and data-driven\n- When the user wants to log something (diet, supplement, etc), use the appropriate tool\n- When asked about health data, retrieve it first befo...
2026-01-28 12:22:01 - slack_bot.dispatcher - INFO - [50a53908] Final analysis received in 5.67s
2026-01-28 12:22:01 - slack_bot.dispatcher - INFO - Formatted text (len 363 -> 347)
2026-01-28 12:22:02 - slack_bot.dispatcher - INFO - [50a53908] 📤 Message updated 1769574107.933179
2026-01-28 12:22:02 - slack_bot.dispatcher - INFO - [50a53908] Dispatch completed in 14.34s
2026-01-28 12:22:02 - __main__ - INFO - [50a53908] ✅ Request completed in 14.94s
2026-01-28 12:34:41 - __main__ - INFO - [3ca2f785] 📥 Received message from U0A8ZCK7RJM in D0AA4GBQRKK: log diet三个鸡蛋 (Files: 0)
2026-01-28 12:34:42 - slack_bot.dispatcher - INFO - [3ca2f785] Processing message in D0AA4GBQRKK from U0A8ZCK7RJM
2026-01-28 12:34:42 - slack_bot.dispatcher - INFO - [3ca2f785] Calling Gemini for initial response...
2026-01-28 12:34:42 - slack_bot.llm.gemini - INFO - Sending payload to OpenAI Proxy: {"model": "gemini-3-flash", "messages": [{"role": "system", "content": "You are Butler, a personal health assistant for tracking and analyzing health data.\n\nYou help the user manage:\n- Sleep quality and patterns (from Garmin watch)\n- Exercise data: steps, activities, heart rate\n- Diet logs: meals, supplements, fasting modes (OMAD, PSMF)\n- Diet logs: meals, supplements, fasting modes (OMAD, PSMF)\n- Body feelings and symptoms\n\nGuidelines:\n- **DATA INTEGRITY IS PARAMOUNT**: Never hallucinate or invent data. If a tool returns \"No data found\", YOU MUST SAY \"I cannot find data for this date\". Do NOT guess numbers.\n- **VISION & IMAGES**: When analyzing images (e.g., food logs), if the image is unclear or unreadable, say \"I cannot identify the food in this image\". Do NOT guess ingredients you do not see.\n- Be concise and data-driven\n- When the user wants to log something (diet, supplement, etc), use the appropriate tool\n- When asked about health data, retrieve it first befo...
2026-01-28 12:34:46 - slack_bot.dispatcher - INFO - [3ca2f785] Gemini response in 4.69s: 0 chars, 1 tools
2026-01-28 12:34:46 - slack_bot.dispatcher - INFO - [3ca2f785] Executing 1 tools
2026-01-28 12:34:46 - slack_bot.dispatcher - INFO - [3ca2f785] Tool: log_diet Args: {'description': '三个鸡蛋 (3 eggs)', 'meal_type': 'snack', 'target_date': '2026-01-28'}
2026-01-28 12:34:46 - health.services.manual_log_storage - INFO - Saved manual log for 2026-01-28 to /Users/lili/workspace/bulter/data/health/manual_logs/2026/01/2026-01-28.json
2026-01-28 12:34:46 - health.services.manual_log_storage - INFO - Added diet entry for 2026-01-28 at 12:34
2026-01-28 12:34:46 - slack_bot.dispatcher - INFO - [3ca2f785] ✓ log_diet finished in 0.00s
2026-01-28 12:34:46 - slack_bot.dispatcher - INFO - [3ca2f785] Requesting final analysis...
2026-01-28 12:34:46 - slack_bot.llm.gemini - INFO - Sending payload to OpenAI Proxy: {"model": "gemini-3-flash", "messages": [{"role": "system", "content": "You are Butler, a personal health assistant for tracking and analyzing health data.\n\nYou help the user manage:\n- Sleep quality and patterns (from Garmin watch)\n- Exercise data: steps, activities, heart rate\n- Diet logs: meals, supplements, fasting modes (OMAD, PSMF)\n- Diet logs: meals, supplements, fasting modes (OMAD, PSMF)\n- Body feelings and symptoms\n\nGuidelines:\n- **DATA INTEGRITY IS PARAMOUNT**: Never hallucinate or invent data. If a tool returns \"No data found\", YOU MUST SAY \"I cannot find data for this date\". Do NOT guess numbers.\n- **VISION & IMAGES**: When analyzing images (e.g., food logs), if the image is unclear or unreadable, say \"I cannot identify the food in this image\". Do NOT guess ingredients you do not see.\n- Be concise and data-driven\n- When the user wants to log something (diet, supplement, etc), use the appropriate tool\n- When asked about health data, retrieve it first befo...
2026-01-28 12:34:53 - slack_bot.dispatcher - INFO - [3ca2f785] Final analysis received in 7.22s
2026-01-28 12:34:53 - slack_bot.dispatcher - INFO - Formatted text (len 498 -> 480)
2026-01-28 12:34:54 - slack_bot.dispatcher - INFO - [3ca2f785] 📤 Message updated 1769574881.982219
2026-01-28 12:34:54 - slack_bot.dispatcher - INFO - [3ca2f785] Dispatch completed in 12.42s
2026-01-28 12:34:54 - __main__ - INFO - [3ca2f785] ✅ Request completed in 13.43s
2026-01-28 12:35:10 - __main__ - INFO - [8d1aa4ea] 📥 Received message from U0A8ZCK7RJM in D0AA4GBQRKK: 好一些了 (Files: 0)
2026-01-28 12:35:11 - slack_bot.dispatcher - INFO - [8d1aa4ea] Processing message in D0AA4GBQRKK from U0A8ZCK7RJM
2026-01-28 12:35:11 - slack_bot.dispatcher - INFO - [8d1aa4ea] Calling Gemini for initial response...
2026-01-28 12:35:11 - slack_bot.llm.gemini - INFO - Sending payload to OpenAI Proxy: {"model": "gemini-3-flash", "messages": [{"role": "system", "content": "You are Butler, a personal health assistant for tracking and analyzing health data.\n\nYou help the user manage:\n- Sleep quality and patterns (from Garmin watch)\n- Exercise data: steps, activities, heart rate\n- Diet logs: meals, supplements, fasting modes (OMAD, PSMF)\n- Diet logs: meals, supplements, fasting modes (OMAD, PSMF)\n- Body feelings and symptoms\n\nGuidelines:\n- **DATA INTEGRITY IS PARAMOUNT**: Never hallucinate or invent data. If a tool returns \"No data found\", YOU MUST SAY \"I cannot find data for this date\". Do NOT guess numbers.\n- **VISION & IMAGES**: When analyzing images (e.g., food logs), if the image is unclear or unreadable, say \"I cannot identify the food in this image\". Do NOT guess ingredients you do not see.\n- Be concise and data-driven\n- When the user wants to log something (diet, supplement, etc), use the appropriate tool\n- When asked about health data, retrieve it first befo...
2026-01-28 12:35:19 - slack_bot.dispatcher - INFO - [8d1aa4ea] Gemini response in 7.86s: 672 chars, 0 tools
2026-01-28 12:35:19 - slack_bot.dispatcher - INFO - Formatted text (len 672 -> 650)
2026-01-28 12:35:20 - slack_bot.dispatcher - INFO - [8d1aa4ea] 📤 Message updated 1769574911.669639
2026-01-28 12:35:20 - slack_bot.dispatcher - INFO - [8d1aa4ea] Dispatch completed in 8.40s
2026-01-28 12:35:20 - __main__ - INFO - [8d1aa4ea] ✅ Request completed in 9.48s
2026-01-28 15:34:30 - __main__ - INFO - [a3e909ce] 📥 Received message from U0A8ZCK7RJM in D0AA4GBQRKK: 深入分析一下昨晚的睡眠和今早的椭圆机 (Files: 0)
2026-01-28 15:34:31 - slack_bot.dispatcher - INFO - [a3e909ce] Processing message in D0AA4GBQRKK from U0A8ZCK7RJM
2026-01-28 15:34:31 - slack_bot.dispatcher - INFO - [a3e909ce] Calling Gemini for initial response...
2026-01-28 15:34:31 - slack_bot.llm.gemini - INFO - Sending payload to OpenAI Proxy: {"model": "gemini-3-flash", "messages": [{"role": "system", "content": "You are Butler, a personal health assistant for tracking and analyzing health data.\n\nYou help the user manage:\n- Sleep quality and patterns (from Garmin watch)\n- Exercise data: steps, activities, heart rate\n- Diet logs: meals, supplements, fasting modes (OMAD, PSMF)\n- Diet logs: meals, supplements, fasting modes (OMAD, PSMF)\n- Body feelings and symptoms\n\nGuidelines:\n- **DATA INTEGRITY IS PARAMOUNT**: Never hallucinate or invent data. If a tool returns \"No data found\", YOU MUST SAY \"I cannot find data for this date\". Do NOT guess numbers.\n- **VISION & IMAGES**: When analyzing images (e.g., food logs), if the image is unclear or unreadable, say \"I cannot identify the food in this image\". Do NOT guess ingredients you do not see.\n- Be concise and data-driven\n- When the user wants to log something (diet, supplement, etc), use the appropriate tool\n- When asked about health data, retrieve it first befo...
2026-01-28 15:34:37 - slack_bot.llm.gemini - WARNING - JSON parse error: Extra data: line 1 column 29 (char 28). String: {"target_date":"2026-01-28"}{"end_date":"2026-01-28","start_date":"2026-01-28"}...
2026-01-28 15:34:37 - slack_bot.llm.gemini - INFO - Successfully recovered JSON using raw_decode
2026-01-28 15:34:37 - slack_bot.dispatcher - INFO - [a3e909ce] Gemini response in 5.94s: 0 chars, 1 tools
2026-01-28 15:34:37 - slack_bot.dispatcher - INFO - [a3e909ce] Executing 1 tools
2026-01-28 15:34:37 - slack_bot.dispatcher - INFO - [a3e909ce] Tool: get_activity_history Args: {'target_date': '2026-01-28'}
2026-01-28 15:34:37 - health.services.query - INFO - Querying activities from 2026-01-28 to 2026-01-28
2026-01-28 15:34:37 - health.services.query - INFO - Found 0 activities
2026-01-28 15:34:37 - slack_bot.dispatcher - INFO - [a3e909ce] ✓ get_activity_history finished in 0.01s
2026-01-28 15:34:37 - slack_bot.dispatcher - INFO - [a3e909ce] Requesting final analysis...
2026-01-28 15:34:37 - slack_bot.llm.gemini - INFO - Sending payload to OpenAI Proxy: {"model": "gemini-3-flash", "messages": [{"role": "system", "content": "You are Butler, a personal health assistant for tracking and analyzing health data.\n\nYou help the user manage:\n- Sleep quality and patterns (from Garmin watch)\n- Exercise data: steps, activities, heart rate\n- Diet logs: meals, supplements, fasting modes (OMAD, PSMF)\n- Diet logs: meals, supplements, fasting modes (OMAD, PSMF)\n- Body feelings and symptoms\n\nGuidelines:\n- **DATA INTEGRITY IS PARAMOUNT**: Never hallucinate or invent data. If a tool returns \"No data found\", YOU MUST SAY \"I cannot find data for this date\". Do NOT guess numbers.\n- **VISION & IMAGES**: When analyzing images (e.g., food logs), if the image is unclear or unreadable, say \"I cannot identify the food in this image\". Do NOT guess ingredients you do not see.\n- Be concise and data-driven\n- When the user wants to log something (diet, supplement, etc), use the appropriate tool\n- When asked about health data, retrieve it first befo...
2026-01-28 15:34:58 - slack_bot.dispatcher - INFO - [a3e909ce] Final analysis received in 21.26s
2026-01-28 15:34:58 - slack_bot.dispatcher - INFO - Formatted text (len 2412 -> 2358)
2026-01-28 15:34:59 - slack_bot.dispatcher - WARNING - [a3e909ce] Update failed, posting new: The request to the Slack API failed. (url: https://slack.com/api/chat.update)
The server responded with: {'ok': False, 'error': 'msg_too_long'}
2026-01-28 15:34:59 - slack_bot.dispatcher - INFO - [a3e909ce] Dispatch completed in 28.33s
2026-01-28 15:34:59 - __main__ - INFO - [a3e909ce] ✅ Request completed in 28.93s
2026-01-28 15:35:49 - __main__ - INFO - [f96f5c23] 📥 Received message from U0A8ZCK7RJM in D0AA4GBQRKK: 目前感觉良好，应该是补盐的策略非常有用 (Files: 0)
2026-01-28 15:35:49 - slack_bot.dispatcher - INFO - [f96f5c23] Processing message in D0AA4GBQRKK from U0A8ZCK7RJM
2026-01-28 15:35:49 - slack_bot.dispatcher - INFO - [f96f5c23] Calling Gemini for initial response...
2026-01-28 15:35:49 - slack_bot.llm.gemini - INFO - Sending payload to OpenAI Proxy: {"model": "gemini-3-flash", "messages": [{"role": "system", "content": "You are Butler, a personal health assistant for tracking and analyzing health data.\n\nYou help the user manage:\n- Sleep quality and patterns (from Garmin watch)\n- Exercise data: steps, activities, heart rate\n- Diet logs: meals, supplements, fasting modes (OMAD, PSMF)\n- Diet logs: meals, supplements, fasting modes (OMAD, PSMF)\n- Body feelings and symptoms\n\nGuidelines:\n- **DATA INTEGRITY IS PARAMOUNT**: Never hallucinate or invent data. If a tool returns \"No data found\", YOU MUST SAY \"I cannot find data for this date\". Do NOT guess numbers.\n- **VISION & IMAGES**: When analyzing images (e.g., food logs), if the image is unclear or unreadable, say \"I cannot identify the food in this image\". Do NOT guess ingredients you do not see.\n- Be concise and data-driven\n- When the user wants to log something (diet, supplement, etc), use the appropriate tool\n- When asked about health data, retrieve it first befo...
2026-01-28 15:36:06 - slack_bot.dispatcher - INFO - [f96f5c23] Gemini response in 16.13s: 934 chars, 0 tools
2026-01-28 15:36:06 - slack_bot.dispatcher - INFO - Formatted text (len 934 -> 908)
2026-01-28 15:36:06 - slack_bot.dispatcher - INFO - [f96f5c23] 📤 Message updated 1769585749.895459
2026-01-28 15:36:06 - slack_bot.dispatcher - INFO - [f96f5c23] Dispatch completed in 16.87s
2026-01-28 15:36:06 - __main__ - INFO - [f96f5c23] ✅ Request completed in 17.54s
2026-01-28 15:37:53 - __main__ - INFO - [95f77794] 📥 Received message from U0A8ZCK7RJM in D0AA4GBQRKK: 泰国有较长时间站立，打高尔夫和参观景点，但是脚踝完全没感觉，应该恢复到了历史最佳水平了 (Files: 0)
2026-01-28 15:37:54 - slack_bot.dispatcher - INFO - [95f77794] Processing message in D0AA4GBQRKK from U0A8ZCK7RJM
2026-01-28 15:37:54 - slack_bot.dispatcher - INFO - [95f77794] Calling Gemini for initial response...
2026-01-28 15:37:54 - slack_bot.llm.gemini - INFO - Sending payload to OpenAI Proxy: {"model": "gemini-3-flash", "messages": [{"role": "system", "content": "You are Butler, a personal health assistant for tracking and analyzing health data.\n\nYou help the user manage:\n- Sleep quality and patterns (from Garmin watch)\n- Exercise data: steps, activities, heart rate\n- Diet logs: meals, supplements, fasting modes (OMAD, PSMF)\n- Diet logs: meals, supplements, fasting modes (OMAD, PSMF)\n- Body feelings and symptoms\n\nGuidelines:\n- **DATA INTEGRITY IS PARAMOUNT**: Never hallucinate or invent data. If a tool returns \"No data found\", YOU MUST SAY \"I cannot find data for this date\". Do NOT guess numbers.\n- **VISION & IMAGES**: When analyzing images (e.g., food logs), if the image is unclear or unreadable, say \"I cannot identify the food in this image\". Do NOT guess ingredients you do not see.\n- Be concise and data-driven\n- When the user wants to log something (diet, supplement, etc), use the appropriate tool\n- When asked about health data, retrieve it first befo...
2026-01-28 15:38:05 - slack_bot.dispatcher - INFO - [95f77794] Gemini response in 11.19s: 1157 chars, 0 tools
2026-01-28 15:38:05 - slack_bot.dispatcher - INFO - Formatted text (len 1157 -> 1115)
2026-01-28 15:38:05 - slack_bot.dispatcher - INFO - [95f77794] 📤 Message updated 1769585873.995089
2026-01-28 15:38:05 - slack_bot.dispatcher - INFO - [95f77794] Dispatch completed in 11.83s
2026-01-28 15:38:05 - __main__ - INFO - [95f77794] ✅ Request completed in 12.43s
2026-01-28 15:39:01 - __main__ - INFO - [a4668fcd] 📥 Received message from U0A8ZCK7RJM in D0AA4GBQRKK: 也挺好的，唯一的感觉还是脖子容易酸 (Files: 0)
2026-01-28 15:39:02 - slack_bot.dispatcher - INFO - [a4668fcd] Processing message in D0AA4GBQRKK from U0A8ZCK7RJM
2026-01-28 15:39:02 - slack_bot.dispatcher - INFO - [a4668fcd] Calling Gemini for initial response...
2026-01-28 15:39:02 - slack_bot.llm.gemini - INFO - Sending payload to OpenAI Proxy: {"model": "gemini-3-flash", "messages": [{"role": "system", "content": "You are Butler, a personal health assistant for tracking and analyzing health data.\n\nYou help the user manage:\n- Sleep quality and patterns (from Garmin watch)\n- Exercise data: steps, activities, heart rate\n- Diet logs: meals, supplements, fasting modes (OMAD, PSMF)\n- Diet logs: meals, supplements, fasting modes (OMAD, PSMF)\n- Body feelings and symptoms\n\nGuidelines:\n- **DATA INTEGRITY IS PARAMOUNT**: Never hallucinate or invent data. If a tool returns \"No data found\", YOU MUST SAY \"I cannot find data for this date\". Do NOT guess numbers.\n- **VISION & IMAGES**: When analyzing images (e.g., food logs), if the image is unclear or unreadable, say \"I cannot identify the food in this image\". Do NOT guess ingredients you do not see.\n- Be concise and data-driven\n- When the user wants to log something (diet, supplement, etc), use the appropriate tool\n- When asked about health data, retrieve it first befo...
2026-01-28 15:39:17 - slack_bot.dispatcher - INFO - [a4668fcd] Gemini response in 15.45s: 1412 chars, 0 tools
2026-01-28 15:39:17 - slack_bot.dispatcher - INFO - Formatted text (len 1412 -> 1358)
2026-01-28 15:39:18 - slack_bot.dispatcher - INFO - [a4668fcd] 📤 Message updated 1769585941.928289
2026-01-28 15:39:18 - slack_bot.dispatcher - INFO - [a4668fcd] Dispatch completed in 16.14s
2026-01-28 15:39:18 - __main__ - INFO - [a4668fcd] ✅ Request completed in 16.74s
Traceback (most recent call last):
  File "/Users/lili/workspace/bulter/slack_bot/main.py", line 13, in <module>
    from slack_bot.dispatcher import MessageDispatcher
  File "/Users/lili/workspace/bulter/slack_bot/dispatcher.py", line 8, in <module>
    from slack_bot.tools.registry import TOOLS_SCHEMA, TOOL_FUNCTIONS
  File "/Users/lili/workspace/bulter/slack_bot/tools/registry.py", line 11, in <module>
    from .system_ops import get_system_status
  File "/Users/lili/workspace/bulter/slack_bot/tools/system_ops.py", line 1, in <module>
    import psutil
ModuleNotFoundError: No module named 'psutil'
Traceback (most recent call last):
  File "/Users/lili/workspace/bulter/slack_bot/main.py", line 13, in <module>
    from slack_bot.dispatcher import MessageDispatcher
  File "/Users/lili/workspace/bulter/slack_bot/dispatcher.py", line 8, in <module>
    from slack_bot.tools.registry import TOOLS_SCHEMA, TOOL_FUNCTIONS
  File "/Users/lili/workspace/bulter/slack_bot/tools/registry.py", line 12, in <module>
    from .process_ops import kill_process, get_process_list
  File "/Users/lili/workspace/bulter/slack_bot/tools/process_ops.py", line 48
    """
    ^
SyntaxError: unterminated triple-quoted string literal (detected at line 85)
2026-01-28 16:18:37 - health.utils.env_loader - INFO - Loading extra configuration from: /Users/lili/workspace/bulter/.gemini.current.env
2026-01-28 16:18:37 - __main__ - INFO - Starting Butler Bot with Gemini model: gemini-3-flash
2026-01-28 16:18:42 - slack_bot.llm.gemini - INFO - Using proxy: http://127.0.0.1:8045
2026-01-28 16:18:42 - slack_bot.llm.gemini - INFO - Initialized Gemini model: gemini-3-flash
2026-01-28 16:18:42 - slack_bot.dispatcher - INFO - Dispatcher initialized with Gemini
2026-01-28 16:18:42 - __main__ - INFO - ⚡️ Butler (Gemini) is connected to Slack!
⚡️ Bolt app is running!
2026-01-28 16:19:46 - __main__ - INFO - [35f54e05] 📥 Received message from U0A8ZCK7RJM in D0AA4GBQRKK: 今晚的饮食建议是什么 (Files: 0)
2026-01-28 16:19:48 - slack_bot.dispatcher - INFO - [35f54e05] Processing message in D0AA4GBQRKK from U0A8ZCK7RJM
2026-01-28 16:19:48 - slack_bot.dispatcher - INFO - [35f54e05] Calling Gemini for initial response...
2026-01-28 16:19:48 - slack_bot.llm.gemini - INFO - Sending payload to OpenAI Proxy: {"model": "gemini-3-flash", "messages": [{"role": "system", "content": "You are Butler, a personal health assistant for tracking and analyzing health data.\n\nYou help the user manage:\n- Sleep quality and patterns (from Garmin watch)\n- Exercise data: steps, activities, heart rate\n- Diet logs: meals, supplements, fasting modes (OMAD, PSMF)\n- Diet logs: meals, supplements, fasting modes (OMAD, PSMF)\n- Body feelings and symptoms\n\nGuidelines:\n- **DATA INTEGRITY IS PARAMOUNT**: Never hallucinate or invent data. If a tool returns \"No data found\", YOU MUST SAY \"I cannot find data for this date\". Do NOT guess numbers.\n- **VISION & IMAGES**: When analyzing images (e.g., food logs), if the image is unclear or unreadable, say \"I cannot identify the food in this image\". Do NOT guess ingredients you do not see.\n- Be concise and data-driven\n- When the user wants to log something (diet, supplement, etc), use the appropriate tool\n- When asked about health data, retrieve it first befo...
2026-01-28 16:20:04 - slack_bot.llm.gemini - ERROR - OpenAI API Request Failed: Token error: Token acquisition timeout (5s) - system too busy or deadlock detected
2026-01-28 16:20:04 - slack_bot.llm.gemini - ERROR - Dumped failed payload to /Users/lili/workspace/bulter/debug_failed_payload.json
2026-01-28 16:20:04 - slack_bot.dispatcher - INFO - [35f54e05] Gemini response in 16.68s: 101 chars, 0 tools
2026-01-28 16:20:04 - slack_bot.dispatcher - INFO - Formatted text (len 101 -> 101)
2026-01-28 16:20:08 - slack_bot.dispatcher - INFO - [35f54e05] 📤 Message updated 1769588387.887709
2026-01-28 16:20:08 - slack_bot.dispatcher - INFO - [35f54e05] Dispatch completed in 20.12s
2026-01-28 16:20:08 - __main__ - INFO - [35f54e05] ✅ Request completed in 21.40s
2026-01-28 16:21:29 - __main__ - INFO - [8451c742] 📥 Received message from U0A8ZCK7RJM in D0AA4GBQRKK: 重试一下 (Files: 0)
2026-01-28 16:21:30 - slack_bot.dispatcher - INFO - [8451c742] Processing message in D0AA4GBQRKK from U0A8ZCK7RJM
2026-01-28 16:21:30 - slack_bot.dispatcher - INFO - [8451c742] Calling Gemini for initial response...
2026-01-28 16:21:30 - slack_bot.llm.gemini - INFO - Sending payload to OpenAI Proxy: {"model": "gemini-3-flash", "messages": [{"role": "system", "content": "You are Butler, a personal health assistant for tracking and analyzing health data.\n\nYou help the user manage:\n- Sleep quality and patterns (from Garmin watch)\n- Exercise data: steps, activities, heart rate\n- Diet logs: meals, supplements, fasting modes (OMAD, PSMF)\n- Diet logs: meals, supplements, fasting modes (OMAD, PSMF)\n- Body feelings and symptoms\n\nGuidelines:\n- **DATA INTEGRITY IS PARAMOUNT**: Never hallucinate or invent data. If a tool returns \"No data found\", YOU MUST SAY \"I cannot find data for this date\". Do NOT guess numbers.\n- **VISION & IMAGES**: When analyzing images (e.g., food logs), if the image is unclear or unreadable, say \"I cannot identify the food in this image\". Do NOT guess ingredients you do not see.\n- Be concise and data-driven\n- When the user wants to log something (diet, supplement, etc), use the appropriate tool\n- When asked about health data, retrieve it first befo...
2026-01-28 16:22:11 - slack_bot.dispatcher - INFO - [8451c742] Gemini response in 40.85s: 1106 chars, 0 tools
2026-01-28 16:22:11 - slack_bot.dispatcher - INFO - Formatted text (len 1106 -> 1060)
2026-01-28 16:22:17 - slack_bot.dispatcher - INFO - [8451c742] 📤 Message updated 1769588490.616599
2026-01-28 16:22:17 - slack_bot.dispatcher - INFO - [8451c742] Dispatch completed in 46.27s
2026-01-28 16:22:17 - __main__ - INFO - [8451c742] ✅ Request completed in 47.55s
2026-01-28 16:36:14 - health.utils.env_loader - INFO - Loading extra configuration from: /Users/lili/workspace/bulter/.gemini.current.env
2026-01-28 16:36:14 - __main__ - INFO - Starting Butler Bot with Gemini model: gemini-3-flash
2026-01-28 16:36:15 - slack_bot.llm.gemini - INFO - Using proxy: http://127.0.0.1:8045
2026-01-28 16:36:15 - slack_bot.llm.gemini - INFO - Initialized Gemini model: gemini-3-flash
2026-01-28 16:36:15 - slack_bot.dispatcher - INFO - Dispatcher initialized with Gemini
2026-01-28 16:36:15 - __main__ - INFO - ⚡️ Butler (Gemini) is connected to Slack!
Failed to check the state of sock (session id: 16b7c7b5-1b1e-410a-a06d-e1d03c3d488e, error: SSLError, message: [SYS] unknown error (_ssl.c:2406))
Failed to check the state of sock (session id: 16b7c7b5-1b1e-410a-a06d-e1d03c3d488e, error: SSLError, message: [SYS] unknown error (_ssl.c:2406))
Failed to check the state of sock (session id: 16b7c7b5-1b1e-410a-a06d-e1d03c3d488e, error: SSLError, message: [SYS] unknown error (_ssl.c:2406))
Failed to check the state of sock (session id: 16b7c7b5-1b1e-410a-a06d-e1d03c3d488e, error: SSLError, message: [SYS] unknown error (_ssl.c:2406))
Failed to check the state of sock (session id: 16b7c7b5-1b1e-410a-a06d-e1d03c3d488e, error: SSLError, message: [SYS] unknown error (_ssl.c:2406))
⚡️ Bolt app is running!
2026-01-28 18:49:07 - __main__ - INFO - [de7eb67c] 📥 Received message from U0A8ZCK7RJM in D0AA4GBQRKK: 晚上吃了金枪鱼沙拉，大约400卡 (Files: 0)
2026-01-28 18:49:08 - slack_bot.dispatcher - INFO - [de7eb67c] Processing message in D0AA4GBQRKK from U0A8ZCK7RJM
2026-01-28 18:49:08 - slack_bot.dispatcher - INFO - [de7eb67c] Calling Gemini for initial response...
2026-01-28 18:49:21 - slack_bot.dispatcher - INFO - [de7eb67c] Gemini response in 12.66s: 896 chars, 0 tools
2026-01-28 18:49:21 - slack_bot.dispatcher - INFO - Formatted text (len 896 -> 896)
2026-01-28 18:49:21 - slack_bot.dispatcher - INFO - [de7eb67c] 📤 Message updated 1769597348.280029
2026-01-28 18:49:21 - slack_bot.dispatcher - INFO - [de7eb67c] Dispatch completed in 13.23s
2026-01-28 18:49:21 - __main__ - INFO - [de7eb67c] ✅ Request completed in 13.78s
2026-01-28 18:50:45 - __main__ - INFO - [ddfe1fee] 📥 Received message from U0A8ZCK7RJM in D0AA4GBQRKK: 明天早上是否可以运动，运动完之后怎么吃东西 (Files: 0)
2026-01-28 18:50:45 - slack_bot.dispatcher - INFO - [ddfe1fee] Processing message in D0AA4GBQRKK from U0A8ZCK7RJM
2026-01-28 18:50:45 - slack_bot.dispatcher - INFO - [ddfe1fee] Calling Gemini for initial response...
2026-01-28 18:51:08 - slack_bot.dispatcher - INFO - [ddfe1fee] Gemini response in 22.54s: 1420 chars, 0 tools
2026-01-28 18:51:08 - slack_bot.dispatcher - INFO - Formatted text (len 1420 -> 1354)
2026-01-28 18:51:08 - slack_bot.dispatcher - INFO - [ddfe1fee] 📤 Message updated 1769597445.645569
2026-01-28 18:51:08 - slack_bot.dispatcher - INFO - [ddfe1fee] Dispatch completed in 23.12s
2026-01-28 18:51:08 - __main__ - INFO - [ddfe1fee] ✅ Request completed in 23.65s
2026-01-29 07:50:12 - __main__ - INFO - [dcaa1856] 📥 Received message from U0A8ZCK7RJM in D0AA4GBQRKK: 同步佳明数据 (Files: 0)
2026-01-29 07:50:13 - slack_bot.dispatcher - INFO - [dcaa1856] Processing message in D0AA4GBQRKK from U0A8ZCK7RJM
2026-01-29 07:50:13 - slack_bot.dispatcher - INFO - [dcaa1856] Calling Gemini for initial response...
2026-01-29 07:50:23 - slack_bot.llm.gemini - WARNING - JSON parse error: Extra data: line 1 column 29 (char 28). String: {"target_date":"2026-01-28"}{"target_date":"2026-01-28"}...
2026-01-29 07:50:23 - slack_bot.llm.gemini - INFO - Successfully recovered JSON using raw_decode
2026-01-29 07:50:23 - slack_bot.dispatcher - INFO - [dcaa1856] Gemini response in 9.74s: 0 chars, 1 tools
2026-01-29 07:50:23 - slack_bot.dispatcher - INFO - [dcaa1856] Executing 1 tools
2026-01-29 07:50:23 - slack_bot.dispatcher - INFO - [dcaa1856] Tool: get_daily_detailed_stats Args: {'target_date': '2026-01-28'}
2026-01-29 07:50:23 - health.services.query - INFO - Querying health data summary for 2026-01-28
2026-01-29 07:50:23 - health.services.query - INFO - Found 0 metrics and 0 activities
2026-01-29 07:50:23 - slack_bot.tools.health_read - INFO - Data missing for 2026-01-28, attempting auto-sync...
2026-01-29 07:50:23 - health.services.data_sync - INFO - Authenticating with Garmin...
2026-01-29 07:50:23 - health.services.garmin_client - INFO - Authenticating with Garmin Connect China for 350134531@qq.com
2026-01-29 07:50:24 - health.services.garmin_client - INFO - Successfully authenticated with Garmin Connect China
2026-01-29 07:50:24 - health.services.data_sync - INFO - Authentication successful
2026-01-29 07:50:24 - health.services.data_sync - INFO - Syncing 13 metric types from 2026-01-28 to 2026-01-28
2026-01-29 07:50:24 - health.services.data_sync - INFO - Syncing steps from 2026-01-28 to 2026-01-28 (1 days)
2026-01-29 07:50:24 - health.services.data_sync - INFO - ✓ Synced steps for 2026-01-28
2026-01-29 07:50:24 - health.services.data_sync - INFO - steps sync complete: 1 synced, 0 skipped, 0 errors
2026-01-29 07:50:24 - health.services.data_sync - INFO - Syncing heart_rate from 2026-01-28 to 2026-01-28 (1 days)
2026-01-29 07:50:25 - health.services.data_sync - INFO - ✓ Synced heart_rate for 2026-01-28
2026-01-29 07:50:25 - health.services.data_sync - INFO - heart_rate sync complete: 1 synced, 0 skipped, 0 errors
2026-01-29 07:50:25 - health.services.data_sync - INFO - Syncing sleep from 2026-01-28 to 2026-01-28 (1 days)
2026-01-29 07:50:25 - health.services.data_sync - INFO - ✓ Synced sleep for 2026-01-28
2026-01-29 07:50:25 - health.services.data_sync - INFO - sleep sync complete: 1 synced, 0 skipped, 0 errors
2026-01-29 07:50:25 - health.services.data_sync - INFO - Syncing stress from 2026-01-28 to 2026-01-28 (1 days)
2026-01-29 07:50:25 - health.services.data_sync - INFO - ✓ Synced stress for 2026-01-28
2026-01-29 07:50:25 - health.services.data_sync - INFO - stress sync complete: 1 synced, 0 skipped, 0 errors
2026-01-29 07:50:25 - health.services.data_sync - INFO - Syncing body_battery from 2026-01-28 to 2026-01-28 (1 days)
2026-01-29 07:50:25 - health.services.data_sync - INFO - ✓ Synced body_battery for 2026-01-28
2026-01-29 07:50:25 - health.services.data_sync - INFO - body_battery sync complete: 1 synced, 0 skipped, 0 errors
2026-01-29 07:50:25 - health.services.data_sync - INFO - Syncing spo2 from 2026-01-28 to 2026-01-28 (1 days)
2026-01-29 07:50:25 - health.services.data_sync - INFO - ✓ Synced spo2 for 2026-01-28
2026-01-29 07:50:25 - health.services.data_sync - INFO - spo2 sync complete: 1 synced, 0 skipped, 0 errors
2026-01-29 07:50:25 - health.services.data_sync - INFO - Syncing respiration from 2026-01-28 to 2026-01-28 (1 days)
2026-01-29 07:50:25 - health.services.data_sync - INFO - ✓ Synced respiration for 2026-01-28
2026-01-29 07:50:25 - health.services.data_sync - INFO - respiration sync complete: 1 synced, 0 skipped, 0 errors
2026-01-29 07:50:25 - health.services.data_sync - INFO - Syncing hydration from 2026-01-28 to 2026-01-28 (1 days)
2026-01-29 07:50:25 - health.services.data_sync - INFO - ✓ Synced hydration for 2026-01-28
2026-01-29 07:50:25 - health.services.data_sync - INFO - hydration sync complete: 1 synced, 0 skipped, 0 errors
2026-01-29 07:50:25 - health.services.data_sync - INFO - Syncing floors from 2026-01-28 to 2026-01-28 (1 days)
2026-01-29 07:50:26 - health.services.data_sync - INFO - ✓ Synced floors for 2026-01-28
2026-01-29 07:50:26 - health.services.data_sync - INFO - floors sync complete: 1 synced, 0 skipped, 0 errors
2026-01-29 07:50:26 - health.services.data_sync - INFO - Syncing intensity_minutes from 2026-01-28 to 2026-01-28 (1 days)
2026-01-29 07:50:26 - health.services.data_sync - INFO - ✓ Synced intensity_minutes for 2026-01-28
2026-01-29 07:50:26 - health.services.data_sync - INFO - intensity_minutes sync complete: 1 synced, 0 skipped, 0 errors
2026-01-29 07:50:26 - health.services.data_sync - INFO - Syncing hrv from 2026-01-28 to 2026-01-28 (1 days)
2026-01-29 07:50:26 - health.services.data_sync - INFO - ✓ Synced hrv for 2026-01-28
2026-01-29 07:50:26 - health.services.data_sync - INFO - hrv sync complete: 1 synced, 0 skipped, 0 errors
2026-01-29 07:50:26 - health.services.data_sync - INFO - Syncing rhr from 2026-01-28 to 2026-01-28 (1 days)
2026-01-29 07:50:26 - health.services.data_sync - INFO - ✓ Synced rhr for 2026-01-28
2026-01-29 07:50:26 - health.services.data_sync - INFO - rhr sync complete: 1 synced, 0 skipped, 0 errors
2026-01-29 07:50:26 - health.services.data_sync - INFO - Syncing weight from 2026-01-28 to 2026-01-28 (1 days)
2026-01-29 07:50:26 - health.services.data_sync - INFO - ✓ Synced weight for 2026-01-28
2026-01-29 07:50:26 - health.services.data_sync - INFO - weight sync complete: 1 synced, 0 skipped, 0 errors
2026-01-29 07:50:26 - health.services.data_sync - INFO - Syncing activities from 2026-01-28 to 2026-01-28
2026-01-29 07:50:26 - health.services.garmin_client - INFO - Fetched 1 activities
2026-01-29 07:50:26 - health.services.data_sync - INFO - Found 1 activities
2026-01-29 07:50:26 - health.services.data_sync - INFO - ✓ Synced activity 561257381 (elliptical) on 2026-01-28
2026-01-29 07:50:26 - health.services.data_sync - INFO - Activity sync complete: 1 synced, 0 skipped, 0 errors
2026-01-29 07:50:26 - health.services.query - INFO - Querying health data summary for 2026-01-28
2026-01-29 07:50:26 - health.services.query - INFO - Found 13 metrics and 1 activities
2026-01-29 07:50:26 - slack_bot.tools.health_read - INFO - Auto-sync completed, re-queried data.
2026-01-29 07:50:26 - slack_bot.dispatcher - INFO - [dcaa1856] ✓ get_daily_detailed_stats finished in 3.35s
2026-01-29 07:50:26 - slack_bot.dispatcher - INFO - [dcaa1856] Requesting final analysis...
2026-01-29 07:50:40 - slack_bot.dispatcher - INFO - [dcaa1856] Final analysis received in 13.62s
2026-01-29 07:50:40 - slack_bot.dispatcher - INFO - Formatted text (len 610 -> 586)
2026-01-29 07:50:40 - slack_bot.dispatcher - INFO - [dcaa1856] 📤 Message updated 1769644213.529669
2026-01-29 07:50:40 - slack_bot.dispatcher - INFO - [dcaa1856] Dispatch completed in 27.27s
2026-01-29 07:50:40 - __main__ - INFO - [dcaa1856] ✅ Request completed in 28.12s
2026-01-29 07:51:15 - __main__ - INFO - [c2134297] 📥 Received message from U0A8ZCK7RJM in D0AA4GBQRKK: 今天已经29号了 (Files: 0)
2026-01-29 07:51:16 - slack_bot.dispatcher - INFO - [c2134297] Processing message in D0AA4GBQRKK from U0A8ZCK7RJM
2026-01-29 07:51:16 - slack_bot.dispatcher - INFO - [c2134297] Calling Gemini for initial response...
2026-01-29 07:51:21 - slack_bot.dispatcher - INFO - [c2134297] Gemini response in 5.34s: 0 chars, 1 tools
2026-01-29 07:51:21 - slack_bot.dispatcher - INFO - [c2134297] Executing 1 tools
2026-01-29 07:51:21 - slack_bot.dispatcher - INFO - [c2134297] Tool: get_daily_detailed_stats Args: {'target_date': '2026-01-29'}
2026-01-29 07:51:21 - health.services.query - INFO - Querying health data summary for 2026-01-29
2026-01-29 07:51:21 - health.services.query - INFO - Found 0 metrics and 0 activities
2026-01-29 07:51:21 - slack_bot.tools.health_read - INFO - Data missing for 2026-01-29, attempting auto-sync...
2026-01-29 07:51:21 - health.services.data_sync - INFO - Authenticating with Garmin...
2026-01-29 07:51:21 - health.services.garmin_client - INFO - Authenticating with Garmin Connect China for 350134531@qq.com
2026-01-29 07:51:22 - health.services.garmin_client - INFO - Successfully authenticated with Garmin Connect China
2026-01-29 07:51:22 - health.services.data_sync - INFO - Authentication successful
2026-01-29 07:51:22 - health.services.data_sync - INFO - Syncing 13 metric types from 2026-01-29 to 2026-01-29
2026-01-29 07:51:22 - health.services.data_sync - INFO - Syncing steps from 2026-01-29 to 2026-01-29 (1 days)
2026-01-29 07:51:22 - health.services.data_sync - INFO - ✓ Synced steps for 2026-01-29
2026-01-29 07:51:22 - health.services.data_sync - INFO - steps sync complete: 1 synced, 0 skipped, 0 errors
2026-01-29 07:51:22 - health.services.data_sync - INFO - Syncing heart_rate from 2026-01-29 to 2026-01-29 (1 days)
2026-01-29 07:51:22 - health.services.data_sync - INFO - ✓ Synced heart_rate for 2026-01-29
2026-01-29 07:51:22 - health.services.data_sync - INFO - heart_rate sync complete: 1 synced, 0 skipped, 0 errors
2026-01-29 07:51:22 - health.services.data_sync - INFO - Syncing sleep from 2026-01-29 to 2026-01-29 (1 days)
2026-01-29 07:51:22 - health.services.data_sync - INFO - ✓ Synced sleep for 2026-01-29
2026-01-29 07:51:22 - health.services.data_sync - INFO - sleep sync complete: 1 synced, 0 skipped, 0 errors
2026-01-29 07:51:22 - health.services.data_sync - INFO - Syncing stress from 2026-01-29 to 2026-01-29 (1 days)
2026-01-29 07:51:22 - health.services.data_sync - INFO - ✓ Synced stress for 2026-01-29
2026-01-29 07:51:22 - health.services.data_sync - INFO - stress sync complete: 1 synced, 0 skipped, 0 errors
2026-01-29 07:51:22 - health.services.data_sync - INFO - Syncing body_battery from 2026-01-29 to 2026-01-29 (1 days)
2026-01-29 07:51:22 - health.services.data_sync - INFO - ✓ Synced body_battery for 2026-01-29
2026-01-29 07:51:22 - health.services.data_sync - INFO - body_battery sync complete: 1 synced, 0 skipped, 0 errors
2026-01-29 07:51:22 - health.services.data_sync - INFO - Syncing spo2 from 2026-01-29 to 2026-01-29 (1 days)
2026-01-29 07:51:23 - health.services.data_sync - INFO - ✓ Synced spo2 for 2026-01-29
2026-01-29 07:51:23 - health.services.data_sync - INFO - spo2 sync complete: 1 synced, 0 skipped, 0 errors
2026-01-29 07:51:23 - health.services.data_sync - INFO - Syncing respiration from 2026-01-29 to 2026-01-29 (1 days)
2026-01-29 07:51:23 - health.services.data_sync - INFO - ✓ Synced respiration for 2026-01-29
2026-01-29 07:51:23 - health.services.data_sync - INFO - respiration sync complete: 1 synced, 0 skipped, 0 errors
2026-01-29 07:51:23 - health.services.data_sync - INFO - Syncing hydration from 2026-01-29 to 2026-01-29 (1 days)
2026-01-29 07:51:23 - health.services.data_sync - INFO - ✓ Synced hydration for 2026-01-29
2026-01-29 07:51:23 - health.services.data_sync - INFO - hydration sync complete: 1 synced, 0 skipped, 0 errors
2026-01-29 07:51:23 - health.services.data_sync - INFO - Syncing floors from 2026-01-29 to 2026-01-29 (1 days)
2026-01-29 07:51:23 - health.services.data_sync - INFO - ✓ Synced floors for 2026-01-29
2026-01-29 07:51:23 - health.services.data_sync - INFO - floors sync complete: 1 synced, 0 skipped, 0 errors
2026-01-29 07:51:23 - health.services.data_sync - INFO - Syncing intensity_minutes from 2026-01-29 to 2026-01-29 (1 days)
2026-01-29 07:51:23 - health.services.data_sync - INFO - ✓ Synced intensity_minutes for 2026-01-29
2026-01-29 07:51:23 - health.services.data_sync - INFO - intensity_minutes sync complete: 1 synced, 0 skipped, 0 errors
2026-01-29 07:51:23 - health.services.data_sync - INFO - Syncing hrv from 2026-01-29 to 2026-01-29 (1 days)
2026-01-29 07:51:23 - health.services.data_sync - INFO - ✓ Synced hrv for 2026-01-29
2026-01-29 07:51:23 - health.services.data_sync - INFO - hrv sync complete: 1 synced, 0 skipped, 0 errors
2026-01-29 07:51:23 - health.services.data_sync - INFO - Syncing rhr from 2026-01-29 to 2026-01-29 (1 days)
2026-01-29 07:51:23 - health.services.data_sync - INFO - ✓ Synced rhr for 2026-01-29
2026-01-29 07:51:23 - health.services.data_sync - INFO - rhr sync complete: 1 synced, 0 skipped, 0 errors
2026-01-29 07:51:23 - health.services.data_sync - INFO - Syncing weight from 2026-01-29 to 2026-01-29 (1 days)
2026-01-29 07:51:23 - health.services.data_sync - INFO - ✓ Synced weight for 2026-01-29
2026-01-29 07:51:23 - health.services.data_sync - INFO - weight sync complete: 1 synced, 0 skipped, 0 errors
2026-01-29 07:51:23 - health.services.data_sync - INFO - Syncing activities from 2026-01-29 to 2026-01-29
2026-01-29 07:51:23 - health.services.data_sync - INFO - Found 0 activities
2026-01-29 07:51:23 - health.services.data_sync - INFO - Activity sync complete: 0 synced, 0 skipped, 0 errors
2026-01-29 07:51:23 - health.services.query - INFO - Querying health data summary for 2026-01-29
2026-01-29 07:51:23 - health.services.query - INFO - Found 13 metrics and 0 activities
2026-01-29 07:51:23 - slack_bot.tools.health_read - INFO - Auto-sync completed, re-queried data.
2026-01-29 07:51:23 - slack_bot.dispatcher - INFO - [c2134297] ✓ get_daily_detailed_stats finished in 2.40s
2026-01-29 07:51:23 - slack_bot.dispatcher - INFO - [c2134297] Requesting final analysis...
2026-01-29 07:51:38 - slack_bot.dispatcher - INFO - [c2134297] Final analysis received in 14.18s
2026-01-29 07:51:38 - slack_bot.dispatcher - INFO - Formatted text (len 819 -> 777)
2026-01-29 07:51:40 - slack_bot.dispatcher - INFO - [c2134297] 📤 Message updated 1769644276.155989
2026-01-29 07:51:40 - slack_bot.dispatcher - INFO - [c2134297] Dispatch completed in 24.58s
2026-01-29 07:51:40 - __main__ - INFO - [c2134297] ✅ Request completed in 25.43s
2026-01-29 07:58:08 - __main__ - INFO - [8d20204c] 📥 Received message from U0A8ZCK7RJM in D0AA4GBQRKK: 运动完再补盐可以吗 (Files: 0)
2026-01-29 07:58:08 - slack_bot.dispatcher - INFO - [8d20204c] Processing message in D0AA4GBQRKK from U0A8ZCK7RJM
2026-01-29 07:58:08 - slack_bot.dispatcher - INFO - [8d20204c] Calling Gemini for initial response...
2026-01-29 07:58:18 - slack_bot.dispatcher - INFO - [8d20204c] Gemini response in 10.09s: 720 chars, 0 tools
2026-01-29 07:58:18 - slack_bot.dispatcher - INFO - Formatted text (len 720 -> 720)
2026-01-29 07:58:19 - slack_bot.dispatcher - INFO - [8d20204c] 📤 Message updated 1769644688.776879
2026-01-29 07:58:19 - slack_bot.dispatcher - INFO - [8d20204c] Dispatch completed in 10.68s
2026-01-29 07:58:19 - __main__ - INFO - [8d20204c] ✅ Request completed in 11.20s
2026-01-29 08:01:14 - __main__ - INFO - [badc4dc3] 📥 Received message from U0A8ZCK7RJM in D0AA4GBQRKK: 椭圆机 (Files: 0)
2026-01-29 08:01:15 - slack_bot.dispatcher - INFO - [badc4dc3] Processing message in D0AA4GBQRKK from U0A8ZCK7RJM
2026-01-29 08:01:15 - slack_bot.dispatcher - INFO - [badc4dc3] Calling Gemini for initial response...
2026-01-29 08:01:28 - slack_bot.dispatcher - INFO - [badc4dc3] Gemini response in 13.05s: 988 chars, 0 tools
2026-01-29 08:01:28 - slack_bot.dispatcher - INFO - Formatted text (len 988 -> 944)
2026-01-29 08:01:28 - slack_bot.dispatcher - INFO - [badc4dc3] 📤 Message updated 1769644875.111719
2026-01-29 08:01:28 - slack_bot.dispatcher - INFO - [badc4dc3] Dispatch completed in 13.60s
2026-01-29 08:01:28 - __main__ - INFO - [badc4dc3] ✅ Request completed in 14.15s
Failed to check the state of sock (session id: ede5b1ad-fed8-492b-91e6-6e94ffe56275, error: SSLError, message: [SYS] unknown error (_ssl.c:2406))
Failed to check the state of sock (session id: ede5b1ad-fed8-492b-91e6-6e94ffe56275, error: SSLError, message: [SYS] unknown error (_ssl.c:2406))
Failed to check the state of sock (session id: ede5b1ad-fed8-492b-91e6-6e94ffe56275, error: SSLError, message: [SYS] unknown error (_ssl.c:2406))
Failed to check the state of sock (session id: ede5b1ad-fed8-492b-91e6-6e94ffe56275, error: SSLError, message: [SYS] unknown error (_ssl.c:2406))
Failed to check the state of sock (session id: ede5b1ad-fed8-492b-91e6-6e94ffe56275, error: SSLError, message: [SYS] unknown error (_ssl.c:2406))
2026-01-29 09:43:50 - __main__ - INFO - [6eb038a3] 📥 Received message from U0A8ZCK7RJM in D0AA4GBQRKK: 运行完成，可以分析一下今天的运动数据吗 (Files: 0)
2026-01-29 09:43:52 - slack_bot.dispatcher - INFO - [6eb038a3] Processing message in D0AA4GBQRKK from U0A8ZCK7RJM
2026-01-29 09:43:52 - slack_bot.dispatcher - INFO - [6eb038a3] Calling Gemini for initial response...
2026-01-29 09:44:10 - slack_bot.llm.gemini - WARNING - JSON parse error: Extra data: line 1 column 52 (char 51). String: {"end_date":"2026-01-29","start_date":"2026-01-29"}{"target_date":"2026-01-29"}...
2026-01-29 09:44:10 - slack_bot.llm.gemini - INFO - Successfully recovered JSON using raw_decode
2026-01-29 09:44:10 - slack_bot.dispatcher - INFO - [6eb038a3] Gemini response in 17.34s: 0 chars, 1 tools
2026-01-29 09:44:10 - slack_bot.dispatcher - INFO - [6eb038a3] Executing 1 tools
2026-01-29 09:44:10 - slack_bot.dispatcher - INFO - [6eb038a3] Tool: get_daily_detailed_stats Args: {'end_date': '2026-01-29', 'start_date': '2026-01-29'}
2026-01-29 09:44:10 - slack_bot.dispatcher - ERROR - [6eb038a3] Error executing get_daily_detailed_stats: HealthReader.get_daily_detailed_stats() missing 1 required positional argument: 'target_date'
2026-01-29 09:44:10 - slack_bot.dispatcher - INFO - [6eb038a3] Requesting final analysis...
2026-01-29 09:44:30 - slack_bot.dispatcher - INFO - [6eb038a3] Final analysis received in 20.68s
2026-01-29 09:44:30 - slack_bot.dispatcher - INFO - Formatted text (len 2506 -> 2454)
2026-01-29 09:44:33 - slack_bot.dispatcher - WARNING - [6eb038a3] Update failed, posting new: The request to the Slack API failed. (url: https://slack.com/api/chat.update)
The server responded with: {'ok': False, 'error': 'msg_too_long'}
2026-01-29 09:44:33 - slack_bot.dispatcher - INFO - [6eb038a3] Dispatch completed in 41.08s
2026-01-29 09:44:33 - __main__ - INFO - [6eb038a3] ✅ Request completed in 42.97s
2026-01-29 09:55:53 - health.utils.env_loader - INFO - Loading extra configuration from: /Users/lili/workspace/bulter/.gemini.current.env
2026-01-29 09:55:53 - __main__ - INFO - Starting Butler Bot with Gemini model: gemini-3-flash
2026-01-29 09:55:54 - slack_bot.llm.gemini - INFO - Using proxy: http://127.0.0.1:8045
2026-01-29 09:55:54 - slack_bot.llm.gemini - INFO - Initialized Gemini model: gemini-3-flash
2026-01-29 09:55:54 - slack_bot.dispatcher - INFO - Dispatcher initialized with Gemini
2026-01-29 09:55:54 - __main__ - INFO - ⚡️ Butler (Gemini) is connected to Slack!
⚡️ Bolt app is running!
2026-01-29 09:56:52 - __main__ - INFO - [657dd01f] 📥 Received message from U0A8ZCK7RJM in D0AA4GBQRKK: 刚才的数据有问题，请忽略，重新给我查一下 (Files: 0)
2026-01-29 09:56:53 - slack_bot.dispatcher - INFO - [657dd01f] Processing message in D0AA4GBQRKK from U0A8ZCK7RJM
2026-01-29 09:56:53 - slack_bot.dispatcher - INFO - [657dd01f] Calling Gemini for initial response...
2026-01-29 09:56:57 - slack_bot.llm.gemini - WARNING - JSON parse error: Extra data: line 1 column 29 (char 28). String: {"target_date":"2026-01-29"}{"target_date":"2026-01-29"}{"end_date":"2026-01-29","start_date":"2026-...
2026-01-29 09:56:57 - slack_bot.llm.gemini - INFO - Successfully recovered JSON using raw_decode
2026-01-29 09:56:57 - slack_bot.dispatcher - INFO - [657dd01f] Gemini response in 4.52s: 0 chars, 1 tools
2026-01-29 09:56:57 - slack_bot.dispatcher - INFO - [657dd01f] Executing 1 tools
2026-01-29 09:56:57 - slack_bot.dispatcher - INFO - [657dd01f] Tool: get_activity_history Args: {'target_date': '2026-01-29'}
2026-01-29 09:56:57 - health.services.query - INFO - Querying activities from 2026-01-29 to 2026-01-29
2026-01-29 09:56:57 - health.services.query - INFO - Found 0 activities
2026-01-29 09:56:57 - slack_bot.dispatcher - INFO - [657dd01f] ✓ get_activity_history finished in 0.02s
2026-01-29 09:56:57 - slack_bot.dispatcher - INFO - [657dd01f] Requesting final analysis...
2026-01-29 09:57:14 - slack_bot.dispatcher - INFO - [657dd01f] Final analysis received in 16.70s
2026-01-29 09:57:14 - slack_bot.dispatcher - INFO - Formatted text (len 2235 -> 2203)
2026-01-29 09:57:15 - slack_bot.dispatcher - INFO - [657dd01f] 📤 Message updated 1769651813.218029
2026-01-29 09:57:15 - slack_bot.dispatcher - INFO - [657dd01f] Dispatch completed in 21.84s
2026-01-29 09:57:15 - __main__ - INFO - [657dd01f] ✅ Request completed in 22.39s
Failed to establish a connection (session id: 816740e2-e988-482d-800c-59e9e0c290d5, error: _ssl.c:983: The handshake operation timed out)
on_error invoked (session id: a0e727fe-23e9-4f21-a991-d862970a7fbc, error: TimeoutError, message: _ssl.c:983: The handshake operation timed out)
2026-01-29 15:46:33 - __main__ - INFO - [6db9f4a7] 📥 Received message from U0A8ZCK7RJM in D0AA4GBQRKK: 中午吃了一勺蛋白粉，两个鸡蛋，一盘青菜和一个玉米，下午吃了一根香蕉 (Files: 0)
2026-01-29 15:46:33 - slack_bot.dispatcher - INFO - [6db9f4a7] Processing message in D0AA4GBQRKK from U0A8ZCK7RJM
2026-01-29 15:46:34 - slack_bot.dispatcher - INFO - [6db9f4a7] Calling Gemini for initial response...
2026-01-29 15:46:50 - slack_bot.dispatcher - INFO - [6db9f4a7] Gemini response in 16.21s: 1589 chars, 0 tools
2026-01-29 15:46:50 - slack_bot.dispatcher - INFO - Formatted text (len 1589 -> 1545)
2026-01-29 15:46:50 - slack_bot.dispatcher - INFO - [6db9f4a7] 📤 Message updated 1769672793.908529
2026-01-29 15:46:50 - slack_bot.dispatcher - INFO - [6db9f4a7] Dispatch completed in 16.88s
2026-01-29 15:46:50 - __main__ - INFO - [6db9f4a7] ✅ Request completed in 17.58s
2026-01-29 15:47:25 - __main__ - INFO - [a6d6883a] 📥 Received message from U0A8ZCK7RJM in D0AA4GBQRKK: 晚餐需要去应酬 (Files: 0)
2026-01-29 15:47:26 - slack_bot.dispatcher - INFO - [a6d6883a] Processing message in D0AA4GBQRKK from U0A8ZCK7RJM
2026-01-29 15:47:26 - slack_bot.dispatcher - INFO - [a6d6883a] Calling Gemini for initial response...
2026-01-29 15:47:39 - slack_bot.dispatcher - INFO - [a6d6883a] Gemini response in 12.94s: 1248 chars, 0 tools
2026-01-29 15:47:39 - slack_bot.dispatcher - INFO - Formatted text (len 1248 -> 1184)
2026-01-29 15:47:39 - slack_bot.dispatcher - INFO - [a6d6883a] 📤 Message updated 1769672845.963229
2026-01-29 15:47:39 - slack_bot.dispatcher - INFO - [a6d6883a] Dispatch completed in 13.65s
2026-01-29 15:47:39 - __main__ - INFO - [a6d6883a] ✅ Request completed in 14.14s
Failed to check the state of sock (session id: d5482989-32ed-4786-a53c-cc384cf56b28, error: SSLError, message: [SYS] unknown error (_ssl.c:2406))
Failed to check the state of sock (session id: d5482989-32ed-4786-a53c-cc384cf56b28, error: SSLError, message: [SYS] unknown error (_ssl.c:2406))
Failed to check the state of sock (session id: d5482989-32ed-4786-a53c-cc384cf56b28, error: SSLError, message: [SSL: BAD_LENGTH] bad length (_ssl.c:2406))
Failed to check the state of sock (session id: d5482989-32ed-4786-a53c-cc384cf56b28, error: SSLError, message: [SSL: BAD_LENGTH] bad length (_ssl.c:2406))
Failed to check the state of sock (session id: d5482989-32ed-4786-a53c-cc384cf56b28, error: SSLError, message: [SSL: BAD_LENGTH] bad length (_ssl.c:2406))
2026-01-29 17:28:41 - __main__ - INFO - [69d9c6bf] 📥 Received message from U0A8ZCK7RJM in D0AA4GBQRKK: 我按照酒精防御协议，刚才已经吃了一瓶酸奶，一片全麦面包，加了上b族维生素和0.6克nac (Files: 0)
2026-01-29 17:28:42 - slack_bot.dispatcher - INFO - [69d9c6bf] Processing message in D0AA4GBQRKK from U0A8ZCK7RJM
2026-01-29 17:28:42 - slack_bot.dispatcher - INFO - [69d9c6bf] Calling Gemini for initial response...
2026-01-29 17:28:52 - slack_bot.dispatcher - INFO - [69d9c6bf] Gemini response in 10.52s: 897 chars, 0 tools
2026-01-29 17:28:52 - slack_bot.dispatcher - INFO - Formatted text (len 897 -> 859)
2026-01-29 17:28:53 - slack_bot.dispatcher - INFO - [69d9c6bf] 📤 Message updated 1769678922.229659
2026-01-29 17:28:53 - slack_bot.dispatcher - INFO - [69d9c6bf] Dispatch completed in 11.13s
2026-01-29 17:28:53 - __main__ - INFO - [69d9c6bf] ✅ Request completed in 11.79s
2026-01-30 08:30:34 - __main__ - INFO - [9fa850c7] 📥 Received message from U0A8ZCK7RJM in D0AA4GBQRKK: 轻断食的理论依据是什么 (Files: 0)
2026-01-30 08:30:35 - slack_bot.dispatcher - INFO - [9fa850c7] Processing message in D0AA4GBQRKK from U0A8ZCK7RJM
2026-01-30 08:30:35 - slack_bot.dispatcher - INFO - [9fa850c7] Calling Gemini for initial response...
2026-01-30 08:30:37 - slack_bot.dispatcher - INFO - [9fa850c7] Gemini response in 2.74s: 97 chars, 0 tools
2026-01-30 08:30:37 - slack_bot.dispatcher - INFO - Formatted text (len 97 -> 97)
2026-01-30 08:30:38 - slack_bot.dispatcher - INFO - [9fa850c7] 📤 Message updated 1769733034.980119
2026-01-30 08:30:38 - slack_bot.dispatcher - INFO - [9fa850c7] Dispatch completed in 3.26s
2026-01-30 08:30:38 - __main__ - INFO - [9fa850c7] ✅ Request completed in 3.73s
2026-01-30 09:15:17 - __main__ - INFO - [c83fe32e] 📥 Received message from U0A8ZCK7RJM in D0AA4GBQRKK: 拉取佳明数据 (Files: 0)
2026-01-30 09:15:18 - slack_bot.dispatcher - INFO - [c83fe32e] Processing message in D0AA4GBQRKK from U0A8ZCK7RJM
2026-01-30 09:15:18 - slack_bot.dispatcher - INFO - [c83fe32e] Calling Gemini for initial response...
2026-01-30 09:15:21 - slack_bot.dispatcher - INFO - [c83fe32e] Gemini response in 3.06s: 97 chars, 0 tools
2026-01-30 09:15:21 - slack_bot.dispatcher - INFO - Formatted text (len 97 -> 97)
2026-01-30 09:15:21 - slack_bot.dispatcher - INFO - [c83fe32e] 📤 Message updated 1769735718.199039
2026-01-30 09:15:21 - slack_bot.dispatcher - INFO - [c83fe32e] Dispatch completed in 3.55s
2026-01-30 09:15:21 - __main__ - INFO - [c83fe32e] ✅ Request completed in 4.14s
2026-01-30 09:31:19 - health.utils.env_loader - INFO - Loading extra configuration from: /Users/lili/workspace/bulter/.gemini.current.env
2026-01-30 09:31:19 - __main__ - INFO - Starting Butler Bot with Gemini model: gemini-2.5-flash
/Users/lili/workspace/bulter/slack_bot/llm/gemini.py:117: FutureWarning: 

All support for the `google.generativeai` package has ended. It will no longer be receiving 
updates or bug fixes. Please switch to the `google.genai` package as soon as possible.
See README for more details:

https://github.com/google-gemini/deprecated-generative-ai-python/blob/main/README.md

  import google.generativeai as genai
2026-01-30 09:31:22 - slack_bot.llm.gemini - INFO - Using direct Google API
2026-01-30 09:31:22 - slack_bot.llm.gemini - INFO - Initialized Gemini model: gemini-2.5-flash
2026-01-30 09:31:22 - slack_bot.dispatcher - INFO - Dispatcher initialized with Gemini
2026-01-30 09:31:22 - __main__ - INFO - ⚡️ Butler (Gemini) is connected to Slack!
⚡️ Bolt app is running!
2026-01-30 09:31:37 - __main__ - INFO - [a34c0ff4] 📥 Received message from U0A8ZCK7RJM in D0AA4GBQRKK: 拉取佳明数据 (Files: 0)
2026-01-30 09:31:38 - slack_bot.dispatcher - INFO - [a34c0ff4] Processing message in D0AA4GBQRKK from U0A8ZCK7RJM
2026-01-30 09:31:38 - slack_bot.dispatcher - INFO - [a34c0ff4] Calling Gemini for initial response...
2026-01-30 09:31:42 - slack_bot.dispatcher - INFO - [a34c0ff4] Gemini response in 3.94s: 0 chars, 1 tools
2026-01-30 09:31:42 - slack_bot.dispatcher - INFO - [a34c0ff4] Executing 1 tools
2026-01-30 09:31:42 - slack_bot.dispatcher - INFO - [a34c0ff4] Tool: get_daily_detailed_stats Args: {'target_date': '2026-01-30'}
2026-01-30 09:31:42 - health.services.query - INFO - Querying health data summary for 2026-01-30
2026-01-30 09:31:42 - health.services.query - INFO - Found 0 metrics and 0 activities
2026-01-30 09:31:42 - slack_bot.tools.health_read - INFO - Data missing for 2026-01-30, attempting auto-sync...
2026-01-30 09:31:42 - health.services.data_sync - INFO - Authenticating with Garmin...
2026-01-30 09:31:42 - health.services.garmin_client - INFO - Authenticating with Garmin Connect China for 350134531@qq.com
2026-01-30 09:31:43 - health.services.garmin_client - INFO - Successfully authenticated with Garmin Connect China
2026-01-30 09:31:43 - health.services.data_sync - INFO - Authentication successful
2026-01-30 09:31:43 - health.services.data_sync - INFO - Syncing 13 metric types from 2026-01-30 to 2026-01-30
2026-01-30 09:31:43 - health.services.data_sync - INFO - Syncing steps from 2026-01-30 to 2026-01-30 (1 days)
2026-01-30 09:31:43 - health.services.data_sync - INFO - ✓ Synced steps for 2026-01-30
2026-01-30 09:31:43 - health.services.data_sync - INFO - steps sync complete: 1 synced, 0 skipped, 0 errors
2026-01-30 09:31:43 - health.services.data_sync - INFO - Syncing heart_rate from 2026-01-30 to 2026-01-30 (1 days)
2026-01-30 09:31:43 - health.services.data_sync - INFO - ✓ Synced heart_rate for 2026-01-30
2026-01-30 09:31:43 - health.services.data_sync - INFO - heart_rate sync complete: 1 synced, 0 skipped, 0 errors
2026-01-30 09:31:43 - health.services.data_sync - INFO - Syncing sleep from 2026-01-30 to 2026-01-30 (1 days)
2026-01-30 09:31:43 - health.services.data_sync - INFO - ✓ Synced sleep for 2026-01-30
2026-01-30 09:31:43 - health.services.data_sync - INFO - sleep sync complete: 1 synced, 0 skipped, 0 errors
2026-01-30 09:31:43 - health.services.data_sync - INFO - Syncing stress from 2026-01-30 to 2026-01-30 (1 days)
2026-01-30 09:31:43 - health.services.data_sync - INFO - ✓ Synced stress for 2026-01-30
2026-01-30 09:31:43 - health.services.data_sync - INFO - stress sync complete: 1 synced, 0 skipped, 0 errors
2026-01-30 09:31:43 - health.services.data_sync - INFO - Syncing body_battery from 2026-01-30 to 2026-01-30 (1 days)
2026-01-30 09:31:44 - health.services.data_sync - INFO - ✓ Synced body_battery for 2026-01-30
2026-01-30 09:31:44 - health.services.data_sync - INFO - body_battery sync complete: 1 synced, 0 skipped, 0 errors
2026-01-30 09:31:44 - health.services.data_sync - INFO - Syncing spo2 from 2026-01-30 to 2026-01-30 (1 days)
2026-01-30 09:31:44 - health.services.data_sync - INFO - ✓ Synced spo2 for 2026-01-30
2026-01-30 09:31:44 - health.services.data_sync - INFO - spo2 sync complete: 1 synced, 0 skipped, 0 errors
2026-01-30 09:31:44 - health.services.data_sync - INFO - Syncing respiration from 2026-01-30 to 2026-01-30 (1 days)
2026-01-30 09:31:44 - health.services.data_sync - INFO - ✓ Synced respiration for 2026-01-30
2026-01-30 09:31:44 - health.services.data_sync - INFO - respiration sync complete: 1 synced, 0 skipped, 0 errors
2026-01-30 09:31:44 - health.services.data_sync - INFO - Syncing hydration from 2026-01-30 to 2026-01-30 (1 days)
2026-01-30 09:31:44 - health.services.data_sync - INFO - ✓ Synced hydration for 2026-01-30
2026-01-30 09:31:44 - health.services.data_sync - INFO - hydration sync complete: 1 synced, 0 skipped, 0 errors
2026-01-30 09:31:44 - health.services.data_sync - INFO - Syncing floors from 2026-01-30 to 2026-01-30 (1 days)
2026-01-30 09:31:44 - health.services.data_sync - INFO - ✓ Synced floors for 2026-01-30
2026-01-30 09:31:44 - health.services.data_sync - INFO - floors sync complete: 1 synced, 0 skipped, 0 errors
2026-01-30 09:31:44 - health.services.data_sync - INFO - Syncing intensity_minutes from 2026-01-30 to 2026-01-30 (1 days)
2026-01-30 09:31:44 - health.services.data_sync - INFO - ✓ Synced intensity_minutes for 2026-01-30
2026-01-30 09:31:44 - health.services.data_sync - INFO - intensity_minutes sync complete: 1 synced, 0 skipped, 0 errors
2026-01-30 09:31:44 - health.services.data_sync - INFO - Syncing hrv from 2026-01-30 to 2026-01-30 (1 days)
2026-01-30 09:31:44 - health.services.data_sync - INFO - ✓ Synced hrv for 2026-01-30
2026-01-30 09:31:44 - health.services.data_sync - INFO - hrv sync complete: 1 synced, 0 skipped, 0 errors
2026-01-30 09:31:44 - health.services.data_sync - INFO - Syncing rhr from 2026-01-30 to 2026-01-30 (1 days)
2026-01-30 09:31:44 - health.services.data_sync - INFO - ✓ Synced rhr for 2026-01-30
2026-01-30 09:31:44 - health.services.data_sync - INFO - rhr sync complete: 1 synced, 0 skipped, 0 errors
2026-01-30 09:31:44 - health.services.data_sync - INFO - Syncing weight from 2026-01-30 to 2026-01-30 (1 days)
2026-01-30 09:31:44 - health.services.data_sync - INFO - weight sync complete: 0 synced, 1 skipped, 0 errors
2026-01-30 09:31:44 - health.services.data_sync - INFO - Syncing activities from 2026-01-30 to 2026-01-30
2026-01-30 09:31:44 - health.services.data_sync - INFO - Found 0 activities
2026-01-30 09:31:44 - health.services.data_sync - INFO - Activity sync complete: 0 synced, 0 skipped, 0 errors
2026-01-30 09:31:44 - health.services.query - INFO - Querying health data summary for 2026-01-30
2026-01-30 09:31:44 - health.services.query - INFO - Found 12 metrics and 0 activities
2026-01-30 09:31:44 - slack_bot.tools.health_read - INFO - Auto-sync completed, re-queried data.
2026-01-30 09:31:44 - slack_bot.dispatcher - INFO - [a34c0ff4] ✓ get_daily_detailed_stats finished in 2.81s
2026-01-30 09:31:44 - slack_bot.dispatcher - INFO - [a34c0ff4] Requesting final analysis...
2026-01-30 09:31:51 - slack_bot.dispatcher - INFO - [a34c0ff4] Final analysis received in 6.42s
2026-01-30 09:31:51 - slack_bot.dispatcher - INFO - Formatted text (len 873 -> 831)
2026-01-30 09:31:51 - slack_bot.dispatcher - INFO - [a34c0ff4] 📤 Message updated 1769736698.078569
2026-01-30 09:31:51 - slack_bot.dispatcher - INFO - [a34c0ff4] Dispatch completed in 13.76s
2026-01-30 09:31:51 - __main__ - INFO - [a34c0ff4] ✅ Request completed in 14.26s
2026-01-30 09:35:48 - health.utils.env_loader - INFO - Loading extra configuration from: /Users/lili/workspace/bulter/.gemini.current.env
2026-01-30 09:35:48 - __main__ - INFO - Starting Butler Bot with Gemini model: gemini-3-flash
2026-01-30 09:35:49 - slack_bot.llm.gemini - INFO - Using proxy: http://127.0.0.1:8045
2026-01-30 09:35:49 - slack_bot.llm.gemini - INFO - Initialized Gemini model: gemini-3-flash
2026-01-30 09:35:49 - slack_bot.dispatcher - INFO - Dispatcher initialized with Gemini
2026-01-30 09:35:49 - __main__ - INFO - ⚡️ Butler (Gemini) is connected to Slack!
⚡️ Bolt app is running!
2026-01-30 09:36:49 - __main__ - INFO - [1f3b85cb] 📥 Received message from U0A8ZCK7RJM in D0AA4GBQRKK: 有没有什么药品可以吃的，帮助恢复 (Files: 0)
2026-01-30 09:36:50 - slack_bot.dispatcher - INFO - [1f3b85cb] Processing message in D0AA4GBQRKK from U0A8ZCK7RJM
2026-01-30 09:36:50 - slack_bot.dispatcher - INFO - [1f3b85cb] Calling Gemini for initial response...
2026-01-30 09:37:04 - slack_bot.dispatcher - INFO - [1f3b85cb] Gemini response in 13.91s: 1330 chars, 0 tools
2026-01-30 09:37:04 - slack_bot.dispatcher - INFO - Formatted text (len 1330 -> 1266)
2026-01-30 09:37:04 - slack_bot.dispatcher - INFO - [1f3b85cb] 📤 Message updated 1769737009.926139
2026-01-30 09:37:04 - slack_bot.dispatcher - INFO - [1f3b85cb] Dispatch completed in 14.45s
2026-01-30 09:37:04 - __main__ - INFO - [1f3b85cb] ✅ Request completed in 15.15s
2026-01-30 11:25:22 - health.utils.env_loader - INFO - Loading extra configuration from: /Users/lili/workspace/bulter/.gemini.current.env
2026-01-30 11:25:22 - __main__ - INFO - Starting Butler Bot with Gemini model: gemini-3-flash
2026-01-30 11:25:23 - slack_bot.llm.gemini - INFO - Using proxy: http://127.0.0.1:8045
2026-01-30 11:25:23 - slack_bot.llm.gemini - INFO - Initialized Gemini model: gemini-3-flash
2026-01-30 11:25:23 - slack_bot.dispatcher - INFO - Dispatcher initialized with Gemini
2026-01-30 11:25:23 - __main__ - INFO - ⚡️ Butler (Gemini) is connected to Slack!
⚡️ Bolt app is running!
2026-01-30 11:25:50 - __main__ - INFO - [02634e29] 📥 Received message from U0A8ZCK7RJM in D0AA4GBQRKK: 中午是不是要午休一下 (Files: 0)
2026-01-30 11:25:50 - slack_bot.dispatcher - INFO - [02634e29] Processing message in D0AA4GBQRKK from U0A8ZCK7RJM
2026-01-30 11:25:50 - slack_bot.dispatcher - INFO - [02634e29] Calling Gemini for initial response...
2026-01-30 11:26:06 - slack_bot.dispatcher - INFO - [02634e29] Gemini response in 16.33s: 1026 chars, 0 tools
2026-01-30 11:26:06 - slack_bot.dispatcher - INFO - Formatted text (len 1026 -> 980)
2026-01-30 11:26:07 - slack_bot.dispatcher - INFO - [02634e29] 📤 Message updated 1769743550.418749
2026-01-30 11:26:07 - slack_bot.dispatcher - INFO - [02634e29] Dispatch completed in 17.00s
2026-01-30 11:26:07 - __main__ - INFO - [02634e29] ✅ Request completed in 17.44s
2026-01-30 12:03:31 - health.utils.env_loader - INFO - Loading extra configuration from: /Users/lili/workspace/bulter/.gemini.current.env
2026-01-30 12:03:31 - __main__ - INFO - Starting Butler Bot with Gemini model: gemini-3-flash
2026-01-30 12:03:32 - slack_bot.llm.gemini - INFO - Using proxy: http://127.0.0.1:8045
2026-01-30 12:03:32 - slack_bot.llm.gemini - INFO - Initialized Gemini model: gemini-3-flash
2026-01-30 12:03:32 - slack_bot.dispatcher - INFO - Dispatcher initialized with Gemini
2026-01-30 12:03:32 - __main__ - INFO - ⚡️ Butler (Gemini) is connected to Slack!
2026-01-30 12:10:27 - health.utils.env_loader - INFO - Loading extra configuration from: /Users/lili/workspace/bulter/.gemini.current.env
2026-01-30 12:10:27 - __main__ - INFO - Starting Butler Bot with Gemini model: gemini-3-flash
2026-01-30 12:10:28 - slack_bot.llm.gemini - INFO - Using proxy: http://127.0.0.1:8045
2026-01-30 12:10:28 - slack_bot.llm.gemini - INFO - Initialized Gemini model: gemini-3-flash
2026-01-30 12:10:28 - slack_bot.dispatcher - INFO - Dispatcher initialized with Gemini
2026-01-30 12:10:28 - __main__ - INFO - ⚡️ Butler (Gemini) is connected to Slack!
⚡️ Bolt app is running!
2026-01-30 12:27:36 - __main__ - INFO - [1216cf6b] 📥 Received message from U0A8ZCK7RJM in D0AA4GBQRKK: 不过我现在竟然一点都不困 (Files: 0)
2026-01-30 12:27:37 - slack_bot.dispatcher - INFO - [1216cf6b] Processing message in D0AA4GBQRKK from U0A8ZCK7RJM
2026-01-30 12:27:37 - slack_bot.dispatcher - INFO - [1216cf6b] Calling Gemini for initial response...
2026-01-30 12:27:50 - slack_bot.dispatcher - INFO - [1216cf6b] Gemini response in 13.58s: 1138 chars, 0 tools
2026-01-30 12:27:50 - slack_bot.dispatcher - INFO - Formatted text (len 1138 -> 1096)
2026-01-30 12:27:51 - slack_bot.dispatcher - INFO - [1216cf6b] 📤 Message updated 1769747257.125279
2026-01-30 12:27:51 - slack_bot.dispatcher - INFO - [1216cf6b] Dispatch completed in 14.24s
2026-01-30 12:27:51 - __main__ - INFO - [1216cf6b] ✅ Request completed in 14.72s
Failed to check the state of sock (session id: eb883f6b-526b-4de1-a6ce-6961c3fb0f4d, error: SSLError, message: [SYS] unknown error (_ssl.c:2406))
Failed to check the state of sock (session id: eb883f6b-526b-4de1-a6ce-6961c3fb0f4d, error: SSLError, message: [SYS] unknown error (_ssl.c:2406))
Failed to check the state of sock (session id: eb883f6b-526b-4de1-a6ce-6961c3fb0f4d, error: SSLError, message: [SYS] unknown error (_ssl.c:2406))
Failed to check the state of sock (session id: eb883f6b-526b-4de1-a6ce-6961c3fb0f4d, error: SSLError, message: [SYS] unknown error (_ssl.c:2406))
Failed to check the state of sock (session id: eb883f6b-526b-4de1-a6ce-6961c3fb0f4d, error: SSLError, message: [SYS] unknown error (_ssl.c:2406))
2026-01-31 09:45:16 - __main__ - INFO - [aae53224] 📥 Received message from U0A8ZCK7RJM in D0AA4GBQRKK: 拉取佳明数据 (Files: 0)
2026-01-31 09:45:17 - slack_bot.dispatcher - INFO - [aae53224] Processing message in D0AA4GBQRKK from U0A8ZCK7RJM
2026-01-31 09:45:17 - slack_bot.dispatcher - INFO - [aae53224] Calling Gemini for initial response...
2026-01-31 09:45:24 - slack_bot.dispatcher - INFO - [aae53224] Gemini response in 7.78s: 0 chars, 0 tools
2026-01-31 09:45:25 - slack_bot.dispatcher - INFO - [aae53224] 📤 Message updated 1769823916.945779
2026-01-31 09:45:25 - slack_bot.dispatcher - INFO - [aae53224] Dispatch completed in 8.31s
2026-01-31 09:45:25 - __main__ - INFO - [aae53224] ✅ Request completed in 8.81s
2026-01-31 09:45:38 - __main__ - INFO - [b16446f9] 📥 Received message from U0A8ZCK7RJM in D0AA4GBQRKK: 分析昨晚睡眠数据 (Files: 0)
2026-01-31 09:45:38 - slack_bot.dispatcher - INFO - [b16446f9] Processing message in D0AA4GBQRKK from U0A8ZCK7RJM
2026-01-31 09:45:38 - slack_bot.dispatcher - INFO - [b16446f9] Calling Gemini for initial response...
2026-01-31 09:45:54 - slack_bot.dispatcher - INFO - [b16446f9] Gemini response in 15.84s: 1528 chars, 0 tools
2026-01-31 09:45:54 - slack_bot.dispatcher - INFO - Formatted text (len 1528 -> 1468)
2026-01-31 09:45:55 - slack_bot.dispatcher - INFO - [b16446f9] 📤 Message updated 1769823938.876369
2026-01-31 09:45:55 - slack_bot.dispatcher - INFO - [b16446f9] Dispatch completed in 16.41s
2026-01-31 09:45:55 - __main__ - INFO - [b16446f9] ✅ Request completed in 16.88s
2026-01-31 09:47:21 - __main__ - INFO - [40cb6d85] 📥 Received message from U0A8ZCK7RJM in D0AA4GBQRKK: 拉取错误了，有新的数据 (Files: 0)
2026-01-31 09:47:21 - slack_bot.dispatcher - INFO - [40cb6d85] Processing message in D0AA4GBQRKK from U0A8ZCK7RJM
2026-01-31 09:47:21 - slack_bot.dispatcher - INFO - [40cb6d85] Calling Gemini for initial response...
2026-01-31 09:47:27 - slack_bot.dispatcher - INFO - [40cb6d85] Gemini response in 6.20s: 0 chars, 0 tools
2026-01-31 09:47:28 - slack_bot.dispatcher - INFO - [40cb6d85] 📤 Message updated 1769824041.680849
2026-01-31 09:47:28 - slack_bot.dispatcher - INFO - [40cb6d85] Dispatch completed in 6.71s
2026-01-31 09:47:28 - __main__ - INFO - [40cb6d85] ✅ Request completed in 7.17s
2026-01-31 09:49:00 - __main__ - INFO - [b8d06dbd] 📥 Received message from U0A8ZCK7RJM in D0AA4GBQRKK: 数据是什么，一月三十日晚上的数据 (Files: 0)
2026-01-31 09:49:00 - slack_bot.dispatcher - INFO - [b8d06dbd] Processing message in D0AA4GBQRKK from U0A8ZCK7RJM
2026-01-31 09:49:00 - slack_bot.dispatcher - INFO - [b8d06dbd] Calling Gemini for initial response...
2026-01-31 09:49:10 - slack_bot.dispatcher - INFO - [b8d06dbd] Gemini response in 9.48s: 0 chars, 0 tools
2026-01-31 09:49:11 - slack_bot.dispatcher - INFO - [b8d06dbd] 📤 Message updated 1769824140.892509
2026-01-31 09:49:11 - slack_bot.dispatcher - INFO - [b8d06dbd] Dispatch completed in 10.08s
2026-01-31 09:49:11 - __main__ - INFO - [b8d06dbd] ✅ Request completed in 10.62s
2026-01-31 18:57:03 - __main__ - INFO - [10a3a506] 📥 Received message from U0A8ZCK7RJM in D0AA4GBQRKK: 同步数据 (Files: 0)
2026-01-31 18:57:04 - slack_bot.dispatcher - INFO - [10a3a506] Processing message in D0AA4GBQRKK from U0A8ZCK7RJM
2026-01-31 18:57:04 - slack_bot.dispatcher - INFO - [10a3a506] Calling Gemini for initial response...
2026-01-31 18:57:13 - slack_bot.dispatcher - INFO - [10a3a506] Gemini response in 8.98s: 0 chars, 0 tools
2026-01-31 18:57:13 - slack_bot.dispatcher - INFO - [10a3a506] 📤 Message updated 1769857023.916449
2026-01-31 18:57:13 - slack_bot.dispatcher - INFO - [10a3a506] Dispatch completed in 9.45s
2026-01-31 18:57:13 - __main__ - INFO - [10a3a506] ✅ Request completed in 9.94s
Failed to check the state of sock (session id: 7518bf6d-935f-4fad-bcb6-3894745d57e6, error: SSLError, message: [SYS] unknown error (_ssl.c:2406))
Failed to check the state of sock (session id: 7518bf6d-935f-4fad-bcb6-3894745d57e6, error: SSLError, message: [SYS] unknown error (_ssl.c:2406))
Failed to check the state of sock (session id: 7518bf6d-935f-4fad-bcb6-3894745d57e6, error: SSLError, message: [SYS] unknown error (_ssl.c:2406))
Failed to check the state of sock (session id: 7518bf6d-935f-4fad-bcb6-3894745d57e6, error: SSLError, message: [SYS] unknown error (_ssl.c:2406))
Failed to check the state of sock (session id: 7518bf6d-935f-4fad-bcb6-3894745d57e6, error: SSLError, message: [SYS] unknown error (_ssl.c:2406))
2026-02-02 10:27:14 - health.utils.env_loader - INFO - Loading extra configuration from: /Users/lili/workspace/bulter/.gemini.current.env
2026-02-02 10:27:14 - __main__ - INFO - Starting Butler Bot with Gemini model: gemini-3-flash
2026-02-02 10:27:15 - slack_bot.llm.gemini - INFO - Using proxy: http://127.0.0.1:8045
2026-02-02 10:27:15 - slack_bot.llm.gemini - INFO - Initialized Gemini model: gemini-3-flash
2026-02-02 10:27:15 - slack_bot.dispatcher - INFO - Dispatcher initialized with Gemini
2026-02-02 10:27:15 - __main__ - INFO - ⚡️ Butler (Gemini) is connected to Slack!
⚡️ Bolt app is running!
2026-02-02 10:27:43 - __main__ - INFO - [56a08c48] 📥 Received message from U0A8ZCK7RJM in D0AA4GBQRKK: 同步佳明数据 (Files: 0)
2026-02-02 10:27:43 - slack_bot.dispatcher - INFO - [56a08c48] Processing message in D0AA4GBQRKK from U0A8ZCK7RJM
2026-02-02 10:27:43 - slack_bot.dispatcher - INFO - [56a08c48] Calling Gemini for initial response...
2026-02-02 10:27:53 - slack_bot.dispatcher - INFO - [56a08c48] Gemini response in 9.27s: 0 chars, 0 tools
2026-02-02 10:27:53 - slack_bot.dispatcher - INFO - [56a08c48] 📤 Message updated 1769999263.702319
2026-02-02 10:27:53 - slack_bot.dispatcher - INFO - [56a08c48] Dispatch completed in 9.80s
2026-02-02 10:27:53 - __main__ - INFO - [56a08c48] ✅ Request completed in 10.34s
2026-02-02 10:30:41 - health.utils.env_loader - INFO - Loading extra configuration from: /Users/lili/workspace/bulter/.gemini.current.env
2026-02-02 10:30:41 - __main__ - INFO - Starting Butler Bot with Gemini model: gemini-3-flash
2026-02-02 10:30:42 - slack_bot.llm.gemini - INFO - Using proxy: http://127.0.0.1:8045
2026-02-02 10:30:42 - slack_bot.llm.gemini - INFO - Initialized Gemini model: gemini-3-flash
2026-02-02 10:30:42 - slack_bot.dispatcher - INFO - Dispatcher initialized with Gemini
2026-02-02 10:30:42 - __main__ - INFO - ⚡️ Butler (Gemini) is connected to Slack!
⚡️ Bolt app is running!
2026-02-02 10:31:02 - __main__ - INFO - [e5ce3eb8] 📥 Received message from U0A8ZCK7RJM in D0AA4GBQRKK: 同步佳明数据 (Files: 0)
2026-02-02 10:31:02 - slack_bot.dispatcher - INFO - [e5ce3eb8] Processing message in D0AA4GBQRKK from U0A8ZCK7RJM
2026-02-02 10:31:02 - slack_bot.dispatcher - INFO - [e5ce3eb8] Calling Gemini for initial response...
2026-02-02 10:31:11 - slack_bot.dispatcher - INFO - [e5ce3eb8] Gemini response in 8.68s: 0 chars, 0 tools
2026-02-02 10:31:12 - slack_bot.dispatcher - INFO - [e5ce3eb8] 📤 Message updated 1769999462.819409
2026-02-02 10:31:12 - slack_bot.dispatcher - INFO - [e5ce3eb8] Dispatch completed in 9.30s
2026-02-02 10:31:12 - __main__ - INFO - [e5ce3eb8] ✅ Request completed in 9.84s
2026-02-02 10:31:44 - __main__ - INFO - [72e97f02] 📥 Received message from U0A8ZCK7RJM in D0AA4GBQRKK: 昨天睡眠如何 (Files: 0)
2026-02-02 10:31:45 - slack_bot.dispatcher - INFO - [72e97f02] Processing message in D0AA4GBQRKK from U0A8ZCK7RJM
2026-02-02 10:31:45 - slack_bot.dispatcher - INFO - [72e97f02] Calling Gemini for initial response...
2026-02-02 10:31:54 - slack_bot.dispatcher - INFO - [72e97f02] Gemini response in 8.86s: 0 chars, 0 tools
2026-02-02 10:31:54 - slack_bot.dispatcher - INFO - [72e97f02] 📤 Message updated 1769999505.376289
2026-02-02 10:31:54 - slack_bot.dispatcher - INFO - [72e97f02] Dispatch completed in 9.33s
2026-02-02 10:31:54 - __main__ - INFO - [72e97f02] ✅ Request completed in 9.84s
2026-02-02 10:32:09 - health.utils.env_loader - INFO - Loading extra configuration from: /Users/lili/workspace/bulter/.gemini.current.env
2026-02-02 10:32:09 - __main__ - INFO - Starting Butler Bot with Gemini model: gemini-3-flash
2026-02-02 10:32:10 - slack_bot.llm.gemini - INFO - Using proxy: http://127.0.0.1:8045
2026-02-02 10:32:10 - slack_bot.llm.gemini - INFO - Initialized Gemini model: gemini-3-flash
2026-02-02 10:32:10 - slack_bot.dispatcher - INFO - Dispatcher initialized with Gemini
2026-02-02 10:32:10 - __main__ - INFO - ⚡️ Butler (Gemini) is connected to Slack!
⚡️ Bolt app is running!
2026-02-02 10:32:30 - __main__ - INFO - [2a365e80] 📥 Received message from U0A8ZCK7RJM in D0AA4GBQRKK: 昨天睡眠如何 (Files: 0)
2026-02-02 10:32:30 - slack_bot.dispatcher - INFO - [2a365e80] Processing message in D0AA4GBQRKK from U0A8ZCK7RJM
2026-02-02 10:32:30 - slack_bot.dispatcher - INFO - [2a365e80] Calling Gemini for initial response...
2026-02-02 10:32:36 - slack_bot.dispatcher - INFO - [2a365e80] Gemini response in 6.18s: 0 chars, 0 tools
2026-02-02 10:32:37 - slack_bot.dispatcher - INFO - [2a365e80] 📤 Message updated 1769999550.663089
2026-02-02 10:32:37 - slack_bot.dispatcher - INFO - [2a365e80] Dispatch completed in 6.71s
2026-02-02 10:32:37 - __main__ - INFO - [2a365e80] ✅ Request completed in 7.35s
2026-02-02 10:48:48 - health.utils.env_loader - INFO - Loading extra configuration from: /Users/lili/workspace/bulter/.gemini.current.env
2026-02-02 10:48:48 - __main__ - INFO - Starting Butler Bot with Gemini model: gemini-2.5-flash
2026-02-02 10:48:49 - slack_bot.llm.gemini - INFO - Using proxy: http://127.0.0.1:8045
2026-02-02 10:48:49 - slack_bot.llm.gemini - INFO - Initialized Gemini model: gemini-2.5-flash
2026-02-02 10:48:49 - slack_bot.dispatcher - INFO - Dispatcher initialized with Gemini
2026-02-02 10:48:49 - __main__ - INFO - ⚡️ Butler (Gemini) is connected to Slack!
2026-02-02 10:51:38 - health.utils.env_loader - INFO - Loading extra configuration from: /Users/lili/workspace/bulter/.gemini.current.env
2026-02-02 10:51:38 - __main__ - INFO - Starting Butler Bot with Gemini model: gemini-2.5-flash
2026-02-02 10:51:39 - slack_bot.llm.gemini - INFO - Using proxy: http://127.0.0.1:8045
2026-02-02 10:51:39 - slack_bot.llm.gemini - INFO - Initialized Gemini model: gemini-2.5-flash
2026-02-02 10:51:39 - slack_bot.dispatcher - INFO - Dispatcher initialized with Gemini
2026-02-02 10:51:39 - __main__ - INFO - ⚡️ Butler (Gemini) is connected to Slack!
2026-02-02 10:55:01 - health.utils.env_loader - INFO - Loading extra configuration from: /Users/lili/workspace/bulter/.gemini.current.env
2026-02-02 10:55:01 - __main__ - INFO - Starting Butler Bot with Gemini model: gemini-2.5-flash
2026-02-02 10:55:02 - slack_bot.llm.gemini - INFO - Using proxy: http://127.0.0.1:8045
2026-02-02 10:55:02 - slack_bot.llm.gemini - INFO - Initialized Gemini model: gemini-2.5-flash
2026-02-02 10:55:02 - slack_bot.dispatcher - INFO - Dispatcher initialized with Gemini
2026-02-02 10:55:02 - __main__ - INFO - ⚡️ Butler (Gemini) is connected to Slack!
2026-02-02 10:56:19 - health.utils.env_loader - INFO - Loading extra configuration from: /Users/lili/workspace/bulter/.gemini.current.env
2026-02-02 10:56:19 - __main__ - INFO - Starting Butler Bot with Gemini model: gemini-2.5-flash
2026-02-02 10:56:20 - slack_bot.llm.gemini - INFO - Using proxy: http://127.0.0.1:8045
2026-02-02 10:56:20 - slack_bot.llm.gemini - INFO - Initialized Gemini model: gemini-2.5-flash
2026-02-02 10:56:20 - slack_bot.dispatcher - INFO - Dispatcher initialized with Gemini
2026-02-02 10:56:20 - __main__ - INFO - ⚡️ Butler (Gemini) is connected to Slack!
⚡️ Bolt app is running!
2026-02-02 10:58:27 - __main__ - INFO - [46f1c3ff] 📥 Received message from U0A8ZCK7RJM in D0AA4GBQRKK: 同步佳明数据 (Files: 0)
2026-02-02 10:58:27 - slack_bot.dispatcher - INFO - [46f1c3ff] Processing message in D0AA4GBQRKK from U0A8ZCK7RJM
2026-02-02 10:58:27 - slack_bot.dispatcher - INFO - [46f1c3ff] Calling Gemini for initial response...
2026-02-02 10:58:32 - slack_bot.dispatcher - WARNING - [46f1c3ff] Forcing sync_garmin tool
2026-02-02 10:58:32 - slack_bot.dispatcher - INFO - [46f1c3ff] Gemini response in 4.48s: 0 chars, 1 tools
2026-02-02 10:58:32 - slack_bot.dispatcher - INFO - [46f1c3ff] Executing 1 tools
2026-02-02 10:58:32 - slack_bot.dispatcher - INFO - [46f1c3ff] Tool: sync_garmin Args: {'target_date': None}
2026-02-02 10:58:32 - slack_bot.tools.garmin - INFO - Starting Garmin sync for 2026-02-02...
2026-02-02 10:58:32 - health.services.data_sync - INFO - Authenticating with Garmin...
2026-02-02 10:58:32 - health.services.garmin_client - INFO - Authenticating with Garmin Connect China for 350134531@qq.com
2026-02-02 10:58:33 - health.services.garmin_client - INFO - Successfully authenticated with Garmin Connect China
2026-02-02 10:58:33 - health.services.data_sync - INFO - Authentication successful
2026-02-02 10:58:33 - health.services.data_sync - INFO - Syncing 13 metric types from 2026-02-02 to 2026-02-02
2026-02-02 10:58:33 - health.services.data_sync - INFO - Syncing steps from 2026-02-02 to 2026-02-02 (1 days)
2026-02-02 10:58:33 - health.services.data_sync - INFO - ✓ Synced steps for 2026-02-02
2026-02-02 10:58:33 - health.services.data_sync - INFO - steps sync complete: 1 synced, 0 skipped, 0 errors
2026-02-02 10:58:33 - health.services.data_sync - INFO - Syncing heart_rate from 2026-02-02 to 2026-02-02 (1 days)
2026-02-02 10:58:33 - health.services.data_sync - INFO - ✓ Synced heart_rate for 2026-02-02
2026-02-02 10:58:33 - health.services.data_sync - INFO - heart_rate sync complete: 1 synced, 0 skipped, 0 errors
2026-02-02 10:58:33 - health.services.data_sync - INFO - Syncing sleep from 2026-02-02 to 2026-02-02 (1 days)
2026-02-02 10:58:33 - health.services.data_sync - INFO - ✓ Synced sleep for 2026-02-02
2026-02-02 10:58:33 - health.services.data_sync - INFO - sleep sync complete: 1 synced, 0 skipped, 0 errors
2026-02-02 10:58:33 - health.services.data_sync - INFO - Syncing stress from 2026-02-02 to 2026-02-02 (1 days)
2026-02-02 10:58:34 - health.services.data_sync - INFO - ✓ Synced stress for 2026-02-02
2026-02-02 10:58:34 - health.services.data_sync - INFO - stress sync complete: 1 synced, 0 skipped, 0 errors
2026-02-02 10:58:34 - health.services.data_sync - INFO - Syncing body_battery from 2026-02-02 to 2026-02-02 (1 days)
2026-02-02 10:58:34 - health.services.data_sync - INFO - ✓ Synced body_battery for 2026-02-02
2026-02-02 10:58:34 - health.services.data_sync - INFO - body_battery sync complete: 1 synced, 0 skipped, 0 errors
2026-02-02 10:58:34 - health.services.data_sync - INFO - Syncing spo2 from 2026-02-02 to 2026-02-02 (1 days)
2026-02-02 10:58:34 - health.services.data_sync - INFO - ✓ Synced spo2 for 2026-02-02
2026-02-02 10:58:34 - health.services.data_sync - INFO - spo2 sync complete: 1 synced, 0 skipped, 0 errors
2026-02-02 10:58:34 - health.services.data_sync - INFO - Syncing respiration from 2026-02-02 to 2026-02-02 (1 days)
2026-02-02 10:58:34 - health.services.data_sync - INFO - ✓ Synced respiration for 2026-02-02
2026-02-02 10:58:34 - health.services.data_sync - INFO - respiration sync complete: 1 synced, 0 skipped, 0 errors
2026-02-02 10:58:34 - health.services.data_sync - INFO - Syncing hydration from 2026-02-02 to 2026-02-02 (1 days)
2026-02-02 10:58:34 - health.services.data_sync - INFO - ✓ Synced hydration for 2026-02-02
2026-02-02 10:58:34 - health.services.data_sync - INFO - hydration sync complete: 1 synced, 0 skipped, 0 errors
2026-02-02 10:58:34 - health.services.data_sync - INFO - Syncing floors from 2026-02-02 to 2026-02-02 (1 days)
2026-02-02 10:58:34 - health.services.data_sync - INFO - ✓ Synced floors for 2026-02-02
2026-02-02 10:58:34 - health.services.data_sync - INFO - floors sync complete: 1 synced, 0 skipped, 0 errors
2026-02-02 10:58:34 - health.services.data_sync - INFO - Syncing intensity_minutes from 2026-02-02 to 2026-02-02 (1 days)
2026-02-02 10:58:34 - health.services.data_sync - INFO - ✓ Synced intensity_minutes for 2026-02-02
2026-02-02 10:58:34 - health.services.data_sync - INFO - intensity_minutes sync complete: 1 synced, 0 skipped, 0 errors
2026-02-02 10:58:34 - health.services.data_sync - INFO - Syncing hrv from 2026-02-02 to 2026-02-02 (1 days)
2026-02-02 10:58:34 - health.services.data_sync - INFO - ✓ Synced hrv for 2026-02-02
2026-02-02 10:58:34 - health.services.data_sync - INFO - hrv sync complete: 1 synced, 0 skipped, 0 errors
2026-02-02 10:58:34 - health.services.data_sync - INFO - Syncing rhr from 2026-02-02 to 2026-02-02 (1 days)
2026-02-02 10:58:34 - health.services.data_sync - INFO - ✓ Synced rhr for 2026-02-02
2026-02-02 10:58:34 - health.services.data_sync - INFO - rhr sync complete: 1 synced, 0 skipped, 0 errors
2026-02-02 10:58:34 - health.services.data_sync - INFO - Syncing weight from 2026-02-02 to 2026-02-02 (1 days)
2026-02-02 10:58:34 - health.services.data_sync - INFO - weight sync complete: 0 synced, 1 skipped, 0 errors
2026-02-02 10:58:34 - health.services.data_sync - INFO - Syncing activities from 2026-02-02 to 2026-02-02
2026-02-02 10:58:35 - health.services.garmin_client - INFO - Fetched 1 activities
2026-02-02 10:58:35 - health.services.data_sync - INFO - Found 1 activities
2026-02-02 10:58:35 - health.services.data_sync - INFO - ✓ Synced activity 562552133 (elliptical) on 2026-02-02
2026-02-02 10:58:35 - health.services.data_sync - INFO - Activity sync complete: 1 synced, 0 skipped, 0 errors
2026-02-02 10:58:35 - health.services.query - INFO - Querying health data summary for 2026-02-02
2026-02-02 10:58:35 - health.services.query - INFO - Found 12 metrics and 1 activities
2026-02-02 10:58:35 - slack_bot.dispatcher - INFO - [46f1c3ff] ✓ sync_garmin finished in 2.75s
2026-02-02 10:58:35 - slack_bot.dispatcher - INFO - [46f1c3ff] Requesting final analysis...
2026-02-02 10:58:41 - slack_bot.dispatcher - INFO - [46f1c3ff] Final analysis received in 6.78s
2026-02-02 10:58:41 - slack_bot.dispatcher - INFO - Formatted text (len 411 -> 387)
2026-02-02 10:58:42 - slack_bot.dispatcher - INFO - [46f1c3ff] 📤 Message updated 1770001107.820819
2026-02-02 10:58:42 - slack_bot.dispatcher - INFO - [46f1c3ff] Dispatch completed in 14.61s
2026-02-02 10:58:42 - __main__ - INFO - [46f1c3ff] ✅ Request completed in 15.12s
2026-02-02 10:59:19 - __main__ - INFO - [2ee20665] 📥 Received message from U0A8ZCK7RJM in D0AA4GBQRKK: 今早椭圆机运动请深入分析 (Files: 0)
2026-02-02 10:59:20 - slack_bot.dispatcher - INFO - [2ee20665] Processing message in D0AA4GBQRKK from U0A8ZCK7RJM
2026-02-02 10:59:20 - slack_bot.dispatcher - INFO - [2ee20665] Calling Gemini for initial response...
2026-02-02 10:59:30 - slack_bot.dispatcher - INFO - [2ee20665] Gemini response in 10.74s: 1187 chars, 0 tools
2026-02-02 10:59:30 - slack_bot.dispatcher - INFO - Formatted text (len 1187 -> 1169)
2026-02-02 10:59:31 - slack_bot.dispatcher - INFO - [2ee20665] 📤 Message updated 1770001159.943809
2026-02-02 10:59:31 - slack_bot.dispatcher - INFO - [2ee20665] Dispatch completed in 11.37s
2026-02-02 10:59:31 - __main__ - INFO - [2ee20665] ✅ Request completed in 11.89s
2026-02-02 11:00:49 - __main__ - INFO - [92a530c4] 📥 Received message from U0A8ZCK7RJM in D0AA4GBQRKK: 今天要去北京出差，晚上有应酬，肯定不能轻断食了。不过我运动完是九点半，到现在还没吃饭，机场贵宾厅我应该吃点什么 (Files: 0)
2026-02-02 11:00:49 - slack_bot.dispatcher - INFO - [92a530c4] Processing message in D0AA4GBQRKK from U0A8ZCK7RJM
2026-02-02 11:00:49 - slack_bot.dispatcher - INFO - [92a530c4] Calling Gemini for initial response...
2026-02-02 11:01:01 - slack_bot.dispatcher - WARNING - [92a530c4] Forcing get_daily_detailed_stats for 2026-02-02
2026-02-02 11:01:01 - slack_bot.dispatcher - INFO - [92a530c4] Gemini response in 11.36s: 1269 chars, 1 tools
2026-02-02 11:01:01 - slack_bot.dispatcher - INFO - [92a530c4] Executing 1 tools
2026-02-02 11:01:01 - slack_bot.dispatcher - INFO - [92a530c4] Tool: get_daily_detailed_stats Args: {'target_date': '2026-02-02'}
2026-02-02 11:01:01 - health.services.query - INFO - Querying health data summary for 2026-02-02
2026-02-02 11:01:01 - health.services.query - INFO - Found 12 metrics and 1 activities
2026-02-02 11:01:01 - slack_bot.dispatcher - INFO - [92a530c4] ✓ get_daily_detailed_stats finished in 0.01s
2026-02-02 11:01:01 - slack_bot.dispatcher - INFO - [92a530c4] Requesting final analysis...
2026-02-02 11:01:13 - slack_bot.dispatcher - INFO - [92a530c4] Final analysis received in 12.13s
2026-02-02 11:01:13 - slack_bot.dispatcher - INFO - Formatted text (len 707 -> 695)
2026-02-02 11:01:14 - slack_bot.dispatcher - INFO - [92a530c4] 📤 Message updated 1770001249.813389
2026-02-02 11:01:14 - slack_bot.dispatcher - INFO - [92a530c4] Dispatch completed in 24.19s
2026-02-02 11:01:14 - __main__ - INFO - [92a530c4] ✅ Request completed in 24.68s
2026-02-02 11:42:25 - __main__ - INFO - [17721a6f] 📥 Received message from U0A8ZCK7RJM in D0AA4GBQRKK: 分析下最近两周的睡眠情况 (Files: 0)
2026-02-02 11:42:25 - slack_bot.dispatcher - INFO - [17721a6f] Processing message in D0AA4GBQRKK from U0A8ZCK7RJM
2026-02-02 11:42:25 - slack_bot.dispatcher - INFO - [17721a6f] Calling Gemini for initial response...
2026-02-02 11:42:35 - slack_bot.dispatcher - WARNING - [17721a6f] Forcing get_daily_detailed_stats for 2026-02-02
2026-02-02 11:42:35 - slack_bot.dispatcher - INFO - [17721a6f] Gemini response in 9.87s: 101 chars, 1 tools
2026-02-02 11:42:35 - slack_bot.dispatcher - INFO - [17721a6f] Executing 1 tools
2026-02-02 11:42:35 - slack_bot.dispatcher - INFO - [17721a6f] Tool: get_daily_detailed_stats Args: {'target_date': '2026-02-02'}
2026-02-02 11:42:35 - health.services.query - INFO - Querying health data summary for 2026-02-02
2026-02-02 11:42:35 - health.services.query - INFO - Found 12 metrics and 1 activities
2026-02-02 11:42:35 - slack_bot.dispatcher - INFO - [17721a6f] ✓ get_daily_detailed_stats finished in 0.01s
2026-02-02 11:42:35 - slack_bot.dispatcher - INFO - [17721a6f] Requesting final analysis...
2026-02-02 11:42:41 - slack_bot.dispatcher - INFO - [17721a6f] Final analysis received in 5.93s
2026-02-02 11:42:41 - slack_bot.dispatcher - INFO - Formatted text (len 197 -> 197)
2026-02-02 11:42:42 - slack_bot.dispatcher - INFO - [17721a6f] 📤 Message updated 1770003745.408699
2026-02-02 11:42:42 - slack_bot.dispatcher - INFO - [17721a6f] Dispatch completed in 16.47s
2026-02-02 11:42:42 - __main__ - INFO - [17721a6f] ✅ Request completed in 17.00s
2026-02-02 11:42:55 - __main__ - INFO - [298ea4f1] 📥 Received message from U0A8ZCK7RJM in D0AA4GBQRKK: 可以 (Files: 0)
2026-02-02 11:42:55 - slack_bot.dispatcher - INFO - [298ea4f1] Processing message in D0AA4GBQRKK from U0A8ZCK7RJM
2026-02-02 11:42:55 - slack_bot.dispatcher - INFO - [298ea4f1] Calling Gemini for initial response...
2026-02-02 11:43:02 - slack_bot.dispatcher - INFO - [298ea4f1] Gemini response in 6.66s: 119 chars, 0 tools
2026-02-02 11:43:02 - slack_bot.dispatcher - INFO - Formatted text (len 119 -> 119)
2026-02-02 11:43:02 - slack_bot.dispatcher - INFO - [298ea4f1] 📤 Message updated 1770003775.528659
2026-02-02 11:43:02 - slack_bot.dispatcher - INFO - [298ea4f1] Dispatch completed in 7.12s
2026-02-02 11:43:02 - __main__ - INFO - [298ea4f1] ✅ Request completed in 7.67s
Failed to check the state of sock (session id: 2eb8f46a-bae2-4496-ba9b-f00a2de27242, error: SSLError, message: [SYS] unknown error (_ssl.c:2406))
Failed to check the state of sock (session id: 2eb8f46a-bae2-4496-ba9b-f00a2de27242, error: SSLError, message: [SYS] unknown error (_ssl.c:2406))
Failed to check the state of sock (session id: 2eb8f46a-bae2-4496-ba9b-f00a2de27242, error: SSLError, message: [SYS] unknown error (_ssl.c:2406))
Failed to check the state of sock (session id: 2eb8f46a-bae2-4496-ba9b-f00a2de27242, error: SSLError, message: [SYS] unknown error (_ssl.c:2406))
Failed to check the state of sock (session id: 2eb8f46a-bae2-4496-ba9b-f00a2de27242, error: SSLError, message: [SYS] unknown error (_ssl.c:2406))
2026-02-03 08:50:48 - __main__ - INFO - [1edd2c1a] 📥 Received message from U0A8ZCK7RJM in D0AA4GBQRKK: 同步佳明数据 (Files: 0)
2026-02-03 08:50:49 - slack_bot.dispatcher - INFO - [1edd2c1a] Processing message in D0AA4GBQRKK from U0A8ZCK7RJM
2026-02-03 08:50:49 - slack_bot.dispatcher - INFO - [1edd2c1a] Calling Gemini for initial response...
2026-02-03 08:50:56 - slack_bot.dispatcher - WARNING - [1edd2c1a] Forcing sync_garmin tool
2026-02-03 08:50:56 - slack_bot.dispatcher - INFO - [1edd2c1a] Gemini response in 7.03s: 0 chars, 1 tools
2026-02-03 08:50:56 - slack_bot.dispatcher - INFO - [1edd2c1a] Executing 1 tools
2026-02-03 08:50:56 - slack_bot.dispatcher - INFO - [1edd2c1a] Tool: sync_garmin Args: {'target_date': None}
2026-02-03 08:50:56 - slack_bot.tools.garmin - INFO - Starting Garmin sync for 2026-02-03...
2026-02-03 08:50:56 - health.services.data_sync - INFO - Authenticating with Garmin...
2026-02-03 08:50:56 - health.services.garmin_client - INFO - Authenticating with Garmin Connect China for 350134531@qq.com
2026-02-03 08:50:56 - health.services.garmin_client - INFO - Successfully authenticated with Garmin Connect China
2026-02-03 08:50:56 - health.services.data_sync - INFO - Authentication successful
2026-02-03 08:50:56 - health.services.data_sync - INFO - Syncing 13 metric types from 2026-02-03 to 2026-02-03
2026-02-03 08:50:56 - health.services.data_sync - INFO - Syncing steps from 2026-02-03 to 2026-02-03 (1 days)
2026-02-03 08:50:56 - health.services.data_sync - INFO - ✓ Synced steps for 2026-02-03
2026-02-03 08:50:56 - health.services.data_sync - INFO - steps sync complete: 1 synced, 0 skipped, 0 errors
2026-02-03 08:50:56 - health.services.data_sync - INFO - Syncing heart_rate from 2026-02-03 to 2026-02-03 (1 days)
2026-02-03 08:50:56 - health.services.data_sync - INFO - ✓ Synced heart_rate for 2026-02-03
2026-02-03 08:50:56 - health.services.data_sync - INFO - heart_rate sync complete: 1 synced, 0 skipped, 0 errors
2026-02-03 08:50:56 - health.services.data_sync - INFO - Syncing sleep from 2026-02-03 to 2026-02-03 (1 days)
2026-02-03 08:50:56 - health.services.data_sync - INFO - ✓ Synced sleep for 2026-02-03
2026-02-03 08:50:56 - health.services.data_sync - INFO - sleep sync complete: 1 synced, 0 skipped, 0 errors
2026-02-03 08:50:56 - health.services.data_sync - INFO - Syncing stress from 2026-02-03 to 2026-02-03 (1 days)
2026-02-03 08:50:57 - health.services.data_sync - INFO - ✓ Synced stress for 2026-02-03
2026-02-03 08:50:57 - health.services.data_sync - INFO - stress sync complete: 1 synced, 0 skipped, 0 errors
2026-02-03 08:50:57 - health.services.data_sync - INFO - Syncing body_battery from 2026-02-03 to 2026-02-03 (1 days)
2026-02-03 08:50:57 - health.services.data_sync - INFO - ✓ Synced body_battery for 2026-02-03
2026-02-03 08:50:57 - health.services.data_sync - INFO - body_battery sync complete: 1 synced, 0 skipped, 0 errors
2026-02-03 08:50:57 - health.services.data_sync - INFO - Syncing spo2 from 2026-02-03 to 2026-02-03 (1 days)
2026-02-03 08:50:57 - health.services.data_sync - INFO - ✓ Synced spo2 for 2026-02-03
2026-02-03 08:50:57 - health.services.data_sync - INFO - spo2 sync complete: 1 synced, 0 skipped, 0 errors
2026-02-03 08:50:57 - health.services.data_sync - INFO - Syncing respiration from 2026-02-03 to 2026-02-03 (1 days)
2026-02-03 08:50:57 - health.services.data_sync - INFO - ✓ Synced respiration for 2026-02-03
2026-02-03 08:50:57 - health.services.data_sync - INFO - respiration sync complete: 1 synced, 0 skipped, 0 errors
2026-02-03 08:50:57 - health.services.data_sync - INFO - Syncing hydration from 2026-02-03 to 2026-02-03 (1 days)
2026-02-03 08:50:57 - health.services.data_sync - INFO - ✓ Synced hydration for 2026-02-03
2026-02-03 08:50:57 - health.services.data_sync - INFO - hydration sync complete: 1 synced, 0 skipped, 0 errors
2026-02-03 08:50:57 - health.services.data_sync - INFO - Syncing floors from 2026-02-03 to 2026-02-03 (1 days)
2026-02-03 08:50:57 - health.services.data_sync - INFO - ✓ Synced floors for 2026-02-03
2026-02-03 08:50:57 - health.services.data_sync - INFO - floors sync complete: 1 synced, 0 skipped, 0 errors
2026-02-03 08:50:57 - health.services.data_sync - INFO - Syncing intensity_minutes from 2026-02-03 to 2026-02-03 (1 days)
2026-02-03 08:50:57 - health.services.data_sync - INFO - ✓ Synced intensity_minutes for 2026-02-03
2026-02-03 08:50:57 - health.services.data_sync - INFO - intensity_minutes sync complete: 1 synced, 0 skipped, 0 errors
2026-02-03 08:50:57 - health.services.data_sync - INFO - Syncing hrv from 2026-02-03 to 2026-02-03 (1 days)
2026-02-03 08:50:57 - health.services.data_sync - INFO - ✓ Synced hrv for 2026-02-03
2026-02-03 08:50:57 - health.services.data_sync - INFO - hrv sync complete: 1 synced, 0 skipped, 0 errors
2026-02-03 08:50:57 - health.services.data_sync - INFO - Syncing rhr from 2026-02-03 to 2026-02-03 (1 days)
2026-02-03 08:50:57 - health.services.data_sync - INFO - ✓ Synced rhr for 2026-02-03
2026-02-03 08:50:57 - health.services.data_sync - INFO - rhr sync complete: 1 synced, 0 skipped, 0 errors
2026-02-03 08:50:57 - health.services.data_sync - INFO - Syncing weight from 2026-02-03 to 2026-02-03 (1 days)
2026-02-03 08:50:57 - health.services.data_sync - INFO - weight sync complete: 0 synced, 1 skipped, 0 errors
2026-02-03 08:50:57 - health.services.data_sync - INFO - Syncing activities from 2026-02-03 to 2026-02-03
2026-02-03 08:50:57 - health.services.data_sync - INFO - Found 0 activities
2026-02-03 08:50:57 - health.services.data_sync - INFO - Activity sync complete: 0 synced, 0 skipped, 0 errors
2026-02-03 08:50:57 - health.services.query - INFO - Querying health data summary for 2026-02-03
2026-02-03 08:50:57 - health.services.query - INFO - Found 12 metrics and 0 activities
2026-02-03 08:50:57 - slack_bot.dispatcher - INFO - [1edd2c1a] ✓ sync_garmin finished in 1.90s
2026-02-03 08:50:57 - slack_bot.dispatcher - INFO - [1edd2c1a] Requesting final analysis...
2026-02-03 08:51:07 - slack_bot.dispatcher - INFO - [1edd2c1a] Final analysis received in 9.69s
2026-02-03 08:51:07 - slack_bot.dispatcher - INFO - Formatted text (len 478 -> 478)
2026-02-03 08:51:08 - slack_bot.dispatcher - INFO - [1edd2c1a] 📤 Message updated 1770079848.897729
2026-02-03 08:51:08 - slack_bot.dispatcher - INFO - [1edd2c1a] Dispatch completed in 19.34s
2026-02-03 08:51:08 - __main__ - INFO - [1edd2c1a] ✅ Request completed in 19.90s
2026-02-03 08:52:21 - __main__ - INFO - [c9e625ea] 📥 Received message from U0A8ZCK7RJM in D0AA4GBQRKK: 昨晚上是参加应酬喝了酒的，已经是吃了nac和b族维生素了。今天应该怎么做，以及是否可以运动 (Files: 0)
2026-02-03 08:52:22 - slack_bot.dispatcher - INFO - [c9e625ea] Processing message in D0AA4GBQRKK from U0A8ZCK7RJM
2026-02-03 08:52:22 - slack_bot.dispatcher - INFO - [c9e625ea] Calling Gemini for initial response...
2026-02-03 08:52:41 - slack_bot.dispatcher - WARNING - [c9e625ea] Forcing get_daily_detailed_stats for 2026-02-03
2026-02-03 08:52:41 - slack_bot.dispatcher - INFO - [c9e625ea] Gemini response in 18.86s: 1511 chars, 1 tools
2026-02-03 08:52:41 - slack_bot.dispatcher - INFO - [c9e625ea] Executing 1 tools
2026-02-03 08:52:41 - slack_bot.dispatcher - INFO - [c9e625ea] Tool: get_daily_detailed_stats Args: {'target_date': '2026-02-03'}
2026-02-03 08:52:41 - health.services.query - INFO - Querying health data summary for 2026-02-03
2026-02-03 08:52:41 - health.services.query - INFO - Found 12 metrics and 0 activities
2026-02-03 08:52:41 - slack_bot.dispatcher - INFO - [c9e625ea] ✓ get_daily_detailed_stats finished in 0.01s
2026-02-03 08:52:41 - slack_bot.dispatcher - INFO - [c9e625ea] Requesting final analysis...
2026-02-03 08:52:57 - slack_bot.dispatcher - INFO - [c9e625ea] Final analysis received in 16.09s
2026-02-03 08:52:57 - slack_bot.dispatcher - INFO - Formatted text (len 1016 -> 986)
2026-02-03 08:52:58 - slack_bot.dispatcher - INFO - [c9e625ea] 📤 Message updated 1770079942.397179
2026-02-03 08:52:58 - slack_bot.dispatcher - INFO - [c9e625ea] Dispatch completed in 35.55s
2026-02-03 08:52:58 - __main__ - INFO - [c9e625ea] ✅ Request completed in 36.10s
2026-02-03 08:54:54 - __main__ - INFO - [257e18b1] 📥 Received message from U0A8ZCK7RJM in D0AA4GBQRKK: 游泳是不是也不好，卧推深蹲都得避免 (Files: 0)
2026-02-03 08:54:55 - slack_bot.dispatcher - INFO - [257e18b1] Processing message in D0AA4GBQRKK from U0A8ZCK7RJM
2026-02-03 08:54:55 - slack_bot.dispatcher - INFO - [257e18b1] Calling Gemini for initial response...
2026-02-03 08:55:02 - slack_bot.dispatcher - INFO - [257e18b1] Gemini response in 7.13s: 488 chars, 0 tools
2026-02-03 08:55:02 - slack_bot.dispatcher - INFO - Formatted text (len 488 -> 476)
2026-02-03 08:55:02 - slack_bot.dispatcher - INFO - [257e18b1] 📤 Message updated 1770080095.007869
2026-02-03 08:55:02 - slack_bot.dispatcher - INFO - [257e18b1] Dispatch completed in 7.65s
2026-02-03 08:55:02 - __main__ - INFO - [257e18b1] ✅ Request completed in 8.15s
2026-02-03 08:58:45 - __main__ - INFO - [551f5608] 📥 Received message from U0A8ZCK7RJM in D0AA4GBQRKK: 昨晚起夜太多了，可能是喝多了水，并且酒精利尿。所以说rem的缺乏，到底是起夜太多，还是酒精刺激 (Files: 0)
2026-02-03 08:58:46 - slack_bot.dispatcher - INFO - [551f5608] Processing message in D0AA4GBQRKK from U0A8ZCK7RJM
2026-02-03 08:58:46 - slack_bot.dispatcher - INFO - [551f5608] Calling Gemini for initial response...
2026-02-03 08:58:57 - slack_bot.dispatcher - INFO - [551f5608] Gemini response in 11.26s: 943 chars, 0 tools
2026-02-03 08:58:57 - slack_bot.dispatcher - INFO - Formatted text (len 943 -> 933)
2026-02-03 08:58:58 - slack_bot.dispatcher - INFO - [551f5608] 📤 Message updated 1770080326.224129
2026-02-03 08:58:58 - slack_bot.dispatcher - INFO - [551f5608] Dispatch completed in 11.86s
2026-02-03 08:58:58 - __main__ - INFO - [551f5608] ✅ Request completed in 12.39s
2026-02-03 09:00:22 - __main__ - INFO - [090ed63e] 📥 Received message from U0A8ZCK7RJM in D0AA4GBQRKK: rem和深度睡眠分别有什么作用，它们会受到怎么样的干扰，以及应该如何恢复 (Files: 0)
2026-02-03 09:00:22 - slack_bot.dispatcher - INFO - [090ed63e] Processing message in D0AA4GBQRKK from U0A8ZCK7RJM
2026-02-03 09:00:22 - slack_bot.dispatcher - INFO - [090ed63e] Calling Gemini for initial response...
2026-02-03 09:00:37 - slack_bot.dispatcher - WARNING - [090ed63e] Forcing get_daily_detailed_stats for 2026-02-03
2026-02-03 09:00:37 - slack_bot.dispatcher - INFO - [090ed63e] Gemini response in 14.47s: 2507 chars, 1 tools
2026-02-03 09:00:37 - slack_bot.dispatcher - INFO - [090ed63e] Executing 1 tools
2026-02-03 09:00:37 - slack_bot.dispatcher - INFO - [090ed63e] Tool: get_daily_detailed_stats Args: {'target_date': '2026-02-03'}
2026-02-03 09:00:37 - health.services.query - INFO - Querying health data summary for 2026-02-03
2026-02-03 09:00:37 - health.services.query - INFO - Found 12 metrics and 0 activities
2026-02-03 09:00:37 - slack_bot.dispatcher - INFO - [090ed63e] ✓ get_daily_detailed_stats finished in 0.02s
2026-02-03 09:00:37 - slack_bot.dispatcher - INFO - [090ed63e] Requesting final analysis...
2026-02-03 09:00:52 - slack_bot.dispatcher - INFO - [090ed63e] Final analysis received in 14.94s
2026-02-03 09:00:52 - slack_bot.dispatcher - INFO - Formatted text (len 168 -> 168)
2026-02-03 09:00:52 - slack_bot.dispatcher - INFO - [090ed63e] 📤 Message updated 1770080422.656949
2026-02-03 09:00:52 - slack_bot.dispatcher - INFO - [090ed63e] Dispatch completed in 29.91s
2026-02-03 09:00:52 - __main__ - INFO - [090ed63e] ✅ Request completed in 30.37s
2026-02-03 09:02:16 - __main__ - INFO - [5d97ed24] 📥 Received message from U0A8ZCK7RJM in D0AA4GBQRKK: 这个知识作为大模型应该是要知道的，你能查的出来吗 (Files: 0)
2026-02-03 09:02:16 - slack_bot.dispatcher - INFO - [5d97ed24] Processing message in D0AA4GBQRKK from U0A8ZCK7RJM
2026-02-03 09:02:16 - slack_bot.dispatcher - INFO - [5d97ed24] Calling Gemini for initial response...
2026-02-03 09:02:30 - slack_bot.dispatcher - INFO - [5d97ed24] Gemini response in 13.95s: 3492 chars, 0 tools
2026-02-03 09:02:30 - slack_bot.dispatcher - INFO - Formatted text (len 3492 -> 3392)
2026-02-03 09:02:31 - slack_bot.dispatcher - WARNING - [5d97ed24] Update failed, posting new: The request to the Slack API failed. (url: https://slack.com/api/chat.update)
The server responded with: {'ok': False, 'error': 'msg_too_long'}
2026-02-03 09:02:31 - slack_bot.dispatcher - INFO - [5d97ed24] Dispatch completed in 15.02s
2026-02-03 09:02:31 - __main__ - INFO - [5d97ed24] ✅ Request completed in 15.48s
2026-02-03 09:05:12 - __main__ - INFO - [27f258bb] 📥 Received message from U0A8ZCK7RJM in D0AA4GBQRKK: 如果面对非常有可能的大量酒精摄入的应酬，还有哪些方法可以保护自己，比如酸奶和面包提前多吃点？ (Files: 0)
2026-02-03 09:05:13 - slack_bot.dispatcher - INFO - [27f258bb] Processing message in D0AA4GBQRKK from U0A8ZCK7RJM
2026-02-03 09:05:13 - slack_bot.dispatcher - INFO - [27f258bb] Calling Gemini for initial response...
2026-02-03 09:05:33 - slack_bot.dispatcher - INFO - [27f258bb] Gemini response in 20.31s: 2561 chars, 0 tools
2026-02-03 09:05:33 - slack_bot.dispatcher - INFO - Formatted text (len 2561 -> 2497)
2026-02-03 09:05:34 - slack_bot.dispatcher - WARNING - [27f258bb] Update failed, posting new: The request to the Slack API failed. (url: https://slack.com/api/chat.update)
The server responded with: {'ok': False, 'error': 'msg_too_long'}
2026-02-03 09:05:34 - slack_bot.dispatcher - INFO - [27f258bb] Dispatch completed in 21.56s
2026-02-03 09:05:34 - __main__ - INFO - [27f258bb] ✅ Request completed in 22.11s
2026-02-03 09:07:40 - __main__ - INFO - [938146bf] 📥 Received message from U0A8ZCK7RJM in D0AA4GBQRKK: 那在应酬高发阶段，只能暂时停止运动了，尽量保证身体少一些压力来源 (Files: 0)
2026-02-03 09:07:40 - slack_bot.dispatcher - INFO - [938146bf] Processing message in D0AA4GBQRKK from U0A8ZCK7RJM
2026-02-03 09:07:40 - slack_bot.dispatcher - INFO - [938146bf] Calling Gemini for initial response...
2026-02-03 09:07:54 - slack_bot.dispatcher - INFO - [938146bf] Gemini response in 13.92s: 1109 chars, 0 tools
2026-02-03 09:07:54 - slack_bot.dispatcher - INFO - Formatted text (len 1109 -> 1085)
2026-02-03 09:07:55 - slack_bot.dispatcher - INFO - [938146bf] 📤 Message updated 1770080860.895499
2026-02-03 09:07:55 - slack_bot.dispatcher - INFO - [938146bf] Dispatch completed in 14.45s
2026-02-03 09:07:55 - __main__ - INFO - [938146bf] ✅ Request completed in 15.02s
2026-02-03 09:18:41 - __main__ - INFO - [9843d628] 📥 Received message from U0A8ZCK7RJM in D0AA4GBQRKK: 轻断食可能也得停了，这个对我减肥增肌影响都很大呀 (Files: 0)
2026-02-03 09:18:41 - slack_bot.dispatcher - INFO - [9843d628] Processing message in D0AA4GBQRKK from U0A8ZCK7RJM
2026-02-03 09:18:41 - slack_bot.dispatcher - INFO - [9843d628] Calling Gemini for initial response...
2026-02-03 09:19:00 - slack_bot.dispatcher - INFO - [9843d628] Gemini response in 18.34s: 1613 chars, 0 tools
2026-02-03 09:19:00 - slack_bot.dispatcher - INFO - Formatted text (len 1613 -> 1579)
2026-02-03 09:19:00 - slack_bot.dispatcher - INFO - [9843d628] 📤 Message updated 1770081521.702589
2026-02-03 09:19:00 - slack_bot.dispatcher - INFO - [9843d628] Dispatch completed in 18.94s
2026-02-03 09:19:00 - __main__ - INFO - [9843d628] ✅ Request completed in 19.43s
2026-02-03 09:20:21 - __main__ - INFO - [55a19337] 📥 Received message from U0A8ZCK7RJM in D0AA4GBQRKK: 现在我这个状态，今天要不要去吃酒店早餐，还是中午十二点吃也可以。昨晚除了酒精，热量肯定摄入也不少了 (Files: 0)
2026-02-03 09:20:22 - slack_bot.dispatcher - INFO - [55a19337] Processing message in D0AA4GBQRKK from U0A8ZCK7RJM
2026-02-03 09:20:22 - slack_bot.dispatcher - INFO - [55a19337] Calling Gemini for initial response...
2026-02-03 09:20:34 - slack_bot.dispatcher - WARNING - [55a19337] Forcing get_daily_detailed_stats for 2026-02-03
2026-02-03 09:20:34 - slack_bot.dispatcher - INFO - [55a19337] Gemini response in 12.07s: 909 chars, 1 tools
2026-02-03 09:20:34 - slack_bot.dispatcher - INFO - [55a19337] Executing 1 tools
2026-02-03 09:20:34 - slack_bot.dispatcher - INFO - [55a19337] Tool: get_daily_detailed_stats Args: {'target_date': '2026-02-03'}
2026-02-03 09:20:34 - health.services.query - INFO - Querying health data summary for 2026-02-03
2026-02-03 09:20:34 - health.services.query - INFO - Found 12 metrics and 0 activities
2026-02-03 09:20:34 - slack_bot.dispatcher - INFO - [55a19337] ✓ get_daily_detailed_stats finished in 0.01s
2026-02-03 09:20:34 - slack_bot.dispatcher - INFO - [55a19337] Requesting final analysis...
2026-02-03 09:20:44 - slack_bot.dispatcher - INFO - [55a19337] Final analysis received in 9.96s
2026-02-03 09:20:44 - slack_bot.dispatcher - INFO - Formatted text (len 566 -> 554)
2026-02-03 09:20:44 - slack_bot.dispatcher - INFO - [55a19337] 📤 Message updated 1770081622.265219
2026-02-03 09:20:44 - slack_bot.dispatcher - INFO - [55a19337] Dispatch completed in 22.58s
2026-02-03 09:20:44 - __main__ - INFO - [55a19337] ✅ Request completed in 23.07s
2026-02-03 09:26:31 - __main__ - INFO - [25e2b55e] 📥 Received message from U0A8ZCK7RJM in D0AA4GBQRKK: 可以喝咖啡吗 (Files: 0)
2026-02-03 09:26:31 - slack_bot.dispatcher - INFO - [25e2b55e] Processing message in D0AA4GBQRKK from U0A8ZCK7RJM
2026-02-03 09:26:31 - slack_bot.dispatcher - INFO - [25e2b55e] Calling Gemini for initial response...
2026-02-03 09:26:42 - slack_bot.dispatcher - INFO - [25e2b55e] Gemini response in 10.49s: 909 chars, 0 tools
2026-02-03 09:26:42 - slack_bot.dispatcher - INFO - Formatted text (len 909 -> 895)
2026-02-03 09:26:42 - slack_bot.dispatcher - INFO - [25e2b55e] 📤 Message updated 1770081991.500749
2026-02-03 09:26:42 - slack_bot.dispatcher - INFO - [25e2b55e] Dispatch completed in 11.05s
2026-02-03 09:26:42 - __main__ - INFO - [25e2b55e] ✅ Request completed in 11.54s
2026-02-03 09:30:24 - __main__ - INFO - [3f27f32a] 📥 Received message from U0A8ZCK7RJM in D0AA4GBQRKK: 左边的是碳烤酸奶，你觉得整体作为早餐怎么样 (Files: 1)
2026-02-03 09:30:25 - slack_bot.dispatcher - INFO - [3f27f32a] Processing message in D0AA4GBQRKK from U0A8ZCK7RJM
2026-02-03 09:30:25 - slack_bot.dispatcher - INFO - [3f27f32a] Message contains 1 files
2026-02-03 09:30:25 - slack_bot.dispatcher - INFO - [3f27f32a] found file: IMG_0908.jpg Type: image/jpeg URL_P: True
2026-02-03 09:30:25 - slack_bot.dispatcher - INFO - [3f27f32a] Attempting download from https://files.slack.com/files-pri/T0A9EPRE3T2-F0ACFTU0MUM/download/img_0908.jpg with token xoxb-...GUMgq
2026-02-03 09:30:25 - slack_bot.dispatcher - INFO - [3f27f32a] Attempting download from https://files.slack.com/files-pri/T0A9EPRE3T2-F0ACFTU0MUM/download/img_0908.jpg using Session (Token: xoxb-...GUMgq)
2026-02-03 09:30:28 - slack_bot.dispatcher - INFO - [3f27f32a] Downloaded and optimized image: IMG_0908.jpg (1905.1KB -> 154.6KB)
2026-02-03 09:30:28 - slack_bot.dispatcher - INFO - [3f27f32a] Calling Gemini for initial response...
2026-02-03 09:30:46 - slack_bot.dispatcher - INFO - [3f27f32a] Gemini response in 18.57s: 907 chars, 0 tools
2026-02-03 09:30:46 - slack_bot.dispatcher - INFO - Formatted text (len 907 -> 891)
2026-02-03 09:30:47 - slack_bot.dispatcher - INFO - [3f27f32a] 📤 Message updated 1770082225.068539
2026-02-03 09:30:47 - slack_bot.dispatcher - INFO - [3f27f32a] Dispatch completed in 22.31s
2026-02-03 09:30:47 - __main__ - INFO - [3f27f32a] ✅ Request completed in 22.82s
2026-02-03 09:31:58 - __main__ - INFO - [162b069f] 📥 Received message from U0A8ZCK7RJM in D0AA4GBQRKK: 直接牛奶是不是更好 (Files: 0)
2026-02-03 09:31:59 - slack_bot.dispatcher - INFO - [162b069f] Processing message in D0AA4GBQRKK from U0A8ZCK7RJM
2026-02-03 09:31:59 - slack_bot.dispatcher - INFO - [162b069f] Calling Gemini for initial response...
2026-02-03 09:32:12 - slack_bot.dispatcher - INFO - [162b069f] Gemini response in 13.10s: 714 chars, 0 tools
2026-02-03 09:32:12 - slack_bot.dispatcher - INFO - Formatted text (len 714 -> 690)
2026-02-03 09:32:13 - slack_bot.dispatcher - INFO - [162b069f] 📤 Message updated 1770082319.259709
2026-02-03 09:32:13 - slack_bot.dispatcher - INFO - [162b069f] Dispatch completed in 13.64s
2026-02-03 09:32:13 - __main__ - INFO - [162b069f] ✅ Request completed in 14.17s
2026-02-03 09:38:21 - __main__ - INFO - [6295ef46] 📥 Received message from U0A8ZCK7RJM in D0AA4GBQRKK: 碳烤酸奶比较甜，改成了无糖酸奶和牛奶 (Files: 0)
2026-02-03 09:38:21 - slack_bot.dispatcher - INFO - [6295ef46] Processing message in D0AA4GBQRKK from U0A8ZCK7RJM
2026-02-03 09:38:21 - slack_bot.dispatcher - INFO - [6295ef46] Calling Gemini for initial response...
2026-02-03 09:38:28 - slack_bot.dispatcher - INFO - [6295ef46] Gemini response in 7.12s: 333 chars, 0 tools
2026-02-03 09:38:28 - slack_bot.dispatcher - INFO - Formatted text (len 333 -> 333)
2026-02-03 09:38:29 - slack_bot.dispatcher - INFO - [6295ef46] 📤 Message updated 1770082701.582429
2026-02-03 09:38:29 - slack_bot.dispatcher - INFO - [6295ef46] Dispatch completed in 7.59s
2026-02-03 09:38:29 - __main__ - INFO - [6295ef46] ✅ Request completed in 8.15s
2026-02-04 09:48:46 - __main__ - INFO - [5a387534] 📥 Received message from U0A8ZCK7RJM in D0AA4GBQRKK: 昨晚睡眠怎么样 (Files: 0)
2026-02-04 09:48:46 - slack_bot.dispatcher - INFO - [5a387534] Processing message in D0AA4GBQRKK from U0A8ZCK7RJM
2026-02-04 09:48:46 - slack_bot.dispatcher - INFO - [5a387534] Calling Gemini for initial response...
2026-02-04 09:48:50 - slack_bot.dispatcher - WARNING - [5a387534] Forcing get_daily_detailed_stats for 2026-02-04
2026-02-04 09:48:50 - slack_bot.dispatcher - INFO - [5a387534] Gemini response in 3.85s: 35 chars, 1 tools
2026-02-04 09:48:50 - slack_bot.dispatcher - INFO - [5a387534] Executing 1 tools
2026-02-04 09:48:50 - slack_bot.dispatcher - INFO - [5a387534] Tool: get_daily_detailed_stats Args: {'target_date': '2026-02-04'}
2026-02-04 09:48:50 - health.services.query - INFO - Querying health data summary for 2026-02-04
2026-02-04 09:48:50 - health.services.query - INFO - Found 0 metrics and 0 activities
2026-02-04 09:48:50 - slack_bot.tools.health_read - INFO - Data missing for 2026-02-04, attempting auto-sync...
2026-02-04 09:48:50 - health.services.data_sync - INFO - Authenticating with Garmin...
2026-02-04 09:48:50 - health.services.garmin_client - INFO - Authenticating with Garmin Connect China for 350134531@qq.com
2026-02-04 09:48:51 - health.services.garmin_client - INFO - Successfully authenticated with Garmin Connect China
2026-02-04 09:48:51 - health.services.data_sync - INFO - Authentication successful
2026-02-04 09:48:51 - health.services.data_sync - INFO - Syncing 13 metric types from 2026-02-04 to 2026-02-04
2026-02-04 09:48:51 - health.services.data_sync - INFO - Syncing steps from 2026-02-04 to 2026-02-04 (1 days)
2026-02-04 09:48:51 - health.services.data_sync - INFO - ✓ Synced steps for 2026-02-04
2026-02-04 09:48:51 - health.services.data_sync - INFO - steps sync complete: 1 synced, 0 skipped, 0 errors
2026-02-04 09:48:51 - health.services.data_sync - INFO - Syncing heart_rate from 2026-02-04 to 2026-02-04 (1 days)
2026-02-04 09:48:51 - health.services.data_sync - INFO - ✓ Synced heart_rate for 2026-02-04
2026-02-04 09:48:51 - health.services.data_sync - INFO - heart_rate sync complete: 1 synced, 0 skipped, 0 errors
2026-02-04 09:48:51 - health.services.data_sync - INFO - Syncing sleep from 2026-02-04 to 2026-02-04 (1 days)
2026-02-04 09:48:51 - health.services.data_sync - INFO - ✓ Synced sleep for 2026-02-04
2026-02-04 09:48:51 - health.services.data_sync - INFO - sleep sync complete: 1 synced, 0 skipped, 0 errors
2026-02-04 09:48:51 - health.services.data_sync - INFO - Syncing stress from 2026-02-04 to 2026-02-04 (1 days)
2026-02-04 09:48:51 - health.services.data_sync - INFO - ✓ Synced stress for 2026-02-04
2026-02-04 09:48:51 - health.services.data_sync - INFO - stress sync complete: 1 synced, 0 skipped, 0 errors
2026-02-04 09:48:51 - health.services.data_sync - INFO - Syncing body_battery from 2026-02-04 to 2026-02-04 (1 days)
2026-02-04 09:48:51 - health.services.data_sync - INFO - ✓ Synced body_battery for 2026-02-04
2026-02-04 09:48:51 - health.services.data_sync - INFO - body_battery sync complete: 1 synced, 0 skipped, 0 errors
2026-02-04 09:48:51 - health.services.data_sync - INFO - Syncing spo2 from 2026-02-04 to 2026-02-04 (1 days)
2026-02-04 09:48:51 - health.services.data_sync - INFO - ✓ Synced spo2 for 2026-02-04
2026-02-04 09:48:51 - health.services.data_sync - INFO - spo2 sync complete: 1 synced, 0 skipped, 0 errors
2026-02-04 09:48:51 - health.services.data_sync - INFO - Syncing respiration from 2026-02-04 to 2026-02-04 (1 days)
2026-02-04 09:48:51 - health.services.data_sync - INFO - ✓ Synced respiration for 2026-02-04
2026-02-04 09:48:51 - health.services.data_sync - INFO - respiration sync complete: 1 synced, 0 skipped, 0 errors
2026-02-04 09:48:51 - health.services.data_sync - INFO - Syncing hydration from 2026-02-04 to 2026-02-04 (1 days)
2026-02-04 09:48:51 - health.services.data_sync - INFO - ✓ Synced hydration for 2026-02-04
2026-02-04 09:48:51 - health.services.data_sync - INFO - hydration sync complete: 1 synced, 0 skipped, 0 errors
2026-02-04 09:48:51 - health.services.data_sync - INFO - Syncing floors from 2026-02-04 to 2026-02-04 (1 days)
2026-02-04 09:48:52 - health.services.data_sync - INFO - ✓ Synced floors for 2026-02-04
2026-02-04 09:48:52 - health.services.data_sync - INFO - floors sync complete: 1 synced, 0 skipped, 0 errors
2026-02-04 09:48:52 - health.services.data_sync - INFO - Syncing intensity_minutes from 2026-02-04 to 2026-02-04 (1 days)
2026-02-04 09:48:52 - health.services.data_sync - INFO - ✓ Synced intensity_minutes for 2026-02-04
2026-02-04 09:48:52 - health.services.data_sync - INFO - intensity_minutes sync complete: 1 synced, 0 skipped, 0 errors
2026-02-04 09:48:52 - health.services.data_sync - INFO - Syncing hrv from 2026-02-04 to 2026-02-04 (1 days)
2026-02-04 09:48:52 - health.services.data_sync - INFO - ✓ Synced hrv for 2026-02-04
2026-02-04 09:48:52 - health.services.data_sync - INFO - hrv sync complete: 1 synced, 0 skipped, 0 errors
2026-02-04 09:48:52 - health.services.data_sync - INFO - Syncing rhr from 2026-02-04 to 2026-02-04 (1 days)
2026-02-04 09:48:52 - health.services.data_sync - INFO - ✓ Synced rhr for 2026-02-04
2026-02-04 09:48:52 - health.services.data_sync - INFO - rhr sync complete: 1 synced, 0 skipped, 0 errors
2026-02-04 09:48:52 - health.services.data_sync - INFO - Syncing weight from 2026-02-04 to 2026-02-04 (1 days)
2026-02-04 09:48:52 - health.services.data_sync - INFO - weight sync complete: 0 synced, 1 skipped, 0 errors
2026-02-04 09:48:52 - health.services.data_sync - INFO - Syncing activities from 2026-02-04 to 2026-02-04
2026-02-04 09:48:52 - health.services.data_sync - INFO - Found 0 activities
2026-02-04 09:48:52 - health.services.data_sync - INFO - Activity sync complete: 0 synced, 0 skipped, 0 errors
2026-02-04 09:48:52 - health.services.query - INFO - Querying health data summary for 2026-02-04
2026-02-04 09:48:52 - health.services.query - INFO - Found 12 metrics and 0 activities
2026-02-04 09:48:52 - slack_bot.tools.health_read - INFO - Auto-sync completed, re-queried data.
2026-02-04 09:48:52 - slack_bot.dispatcher - INFO - [5a387534] ✓ get_daily_detailed_stats finished in 1.91s
2026-02-04 09:48:52 - slack_bot.dispatcher - INFO - [5a387534] Requesting final analysis...
2026-02-04 09:48:57 - slack_bot.dispatcher - INFO - [5a387534] Final analysis received in 5.36s
2026-02-04 09:48:57 - slack_bot.dispatcher - INFO - Formatted text (len 349 -> 333)
2026-02-04 09:48:58 - slack_bot.dispatcher - INFO - [5a387534] 📤 Message updated 1770169726.658819
2026-02-04 09:48:58 - slack_bot.dispatcher - INFO - [5a387534] Dispatch completed in 11.67s
2026-02-04 09:48:58 - __main__ - INFO - [5a387534] ✅ Request completed in 12.27s
2026-02-04 11:11:13 - health.utils.env_loader - INFO - Loading extra configuration from: /Users/lili/workspace/bulter/.gemini.current.env
2026-02-04 11:11:13 - __main__ - INFO - Starting Butler Bot with Gemini model: gemini-2.5-flash
2026-02-04 11:11:14 - slack_bot.llm.gemini - INFO - Using proxy: http://127.0.0.1:8045
2026-02-04 11:11:14 - slack_bot.llm.gemini - INFO - Initialized Gemini model: gemini-2.5-flash
2026-02-04 11:11:14 - slack_bot.dispatcher - INFO - Dispatcher initialized with Gemini
2026-02-04 11:11:14 - __main__ - INFO - ⚡️ Butler (Gemini) is connected to Slack!
2026-02-04 11:12:03 - __main__ - INFO - [1b67e26b] 📥 Received message from U0A8ZCK7RJM in D0AA4GBQRKK: 上午的运动怎么样 (Files: 0)
2026-02-04 11:12:03 - slack_bot.dispatcher - INFO - [1b67e26b] Processing message in D0AA4GBQRKK from U0A8ZCK7RJM
2026-02-04 11:12:03 - slack_bot.dispatcher - INFO - [1b67e26b] Calling Gemini for initial response...
2026-02-04 11:12:17 - slack_bot.dispatcher - INFO - [1b67e26b] Gemini response in 13.68s: 1043 chars, 0 tools
2026-02-04 11:12:17 - slack_bot.dispatcher - INFO - Formatted text (len 1043 -> 1021)
2026-02-04 11:12:18 - slack_bot.dispatcher - INFO - [1b67e26b] 📤 Message updated 1770174723.618399
2026-02-04 11:12:18 - slack_bot.dispatcher - INFO - [1b67e26b] Dispatch completed in 14.32s
2026-02-04 11:12:18 - __main__ - INFO - [1b67e26b] ✅ Request completed in 14.86s
2026-02-04 11:12:43 - __main__ - INFO - [16f709de] 📥 Received message from U0A8ZCK7RJM in D0AA4GBQRKK: 上午是有椭圆机，请查询并分析 (Files: 0)
2026-02-04 11:12:44 - slack_bot.dispatcher - INFO - [16f709de] Processing message in D0AA4GBQRKK from U0A8ZCK7RJM
2026-02-04 11:12:44 - slack_bot.dispatcher - INFO - [16f709de] Calling Gemini for initial response...
2026-02-04 11:12:49 - slack_bot.dispatcher - INFO - [16f709de] Gemini response in 5.75s: 31 chars, 0 tools
2026-02-04 11:12:49 - slack_bot.dispatcher - INFO - Formatted text (len 31 -> 31)
2026-02-04 11:12:50 - slack_bot.dispatcher - INFO - [16f709de] 📤 Message updated 1770174764.146929
2026-02-04 11:12:50 - slack_bot.dispatcher - INFO - [16f709de] Dispatch completed in 6.24s
2026-02-04 11:12:50 - __main__ - INFO - [16f709de] ✅ Request completed in 6.72s
2026-02-04 11:23:45 - health.utils.env_loader - INFO - Loading extra configuration from: /Users/lili/workspace/bulter/.gemini.current.env
2026-02-04 11:23:45 - __main__ - INFO - Starting Butler Bot with Gemini model: gemini-2.5-flash
2026-02-04 11:23:46 - slack_bot.llm.gemini - INFO - Using proxy: http://127.0.0.1:8045
2026-02-04 11:23:46 - slack_bot.llm.gemini - INFO - Initialized Gemini model: gemini-2.5-flash
2026-02-04 11:23:46 - slack_bot.dispatcher - INFO - Dispatcher initialized with Gemini
2026-02-04 11:23:46 - __main__ - INFO - ⚡️ Butler (Gemini) is connected to Slack!
⚡️ Bolt app is running!
2026-02-04 11:34:20 - __main__ - INFO - [a021af3d] 📥 Received message from U0A8ZCK7RJM in D0AA4GBQRKK: 查询上午的运动数据，并分析 (Files: 0)
2026-02-04 11:34:20 - slack_bot.dispatcher - INFO - [a021af3d] Processing message in D0AA4GBQRKK from U0A8ZCK7RJM
2026-02-04 11:34:20 - slack_bot.dispatcher - INFO - [a021af3d] Calling Gemini for initial response...
2026-02-04 11:34:27 - slack_bot.dispatcher - INFO - [a021af3d] Gemini response in 7.09s: 0 chars, 0 tools
2026-02-04 11:34:28 - slack_bot.dispatcher - INFO - [a021af3d] 📤 Message updated 1770176060.680389
2026-02-04 11:34:28 - slack_bot.dispatcher - INFO - [a021af3d] Dispatch completed in 7.64s
2026-02-04 11:34:28 - __main__ - INFO - [a021af3d] ✅ Request completed in 8.13s
2026-02-04 11:39:07 - health.utils.env_loader - INFO - Loading extra configuration from: /Users/lili/workspace/bulter/.gemini.current.env
2026-02-04 11:39:07 - __main__ - INFO - Starting Butler Bot with Gemini model: gemini-2.5-flash
2026-02-04 11:39:08 - slack_bot.llm.gemini - INFO - Using proxy: http://127.0.0.1:8045
2026-02-04 11:39:08 - slack_bot.llm.gemini - INFO - Initialized Gemini model: gemini-2.5-flash
2026-02-04 11:39:08 - slack_bot.dispatcher - INFO - Dispatcher initialized with Gemini
2026-02-04 11:39:08 - __main__ - INFO - ⚡️ Butler (Gemini) is connected to Slack!
⚡️ Bolt app is running!
2026-02-04 11:40:03 - __main__ - INFO - [087e53dc] 📥 Received message from U0A8ZCK7RJM in D0AA4GBQRKK: 查询上午的运动数据，并分析 (Files: 0)
2026-02-04 11:40:03 - slack_bot.dispatcher - INFO - [087e53dc] Processing message in D0AA4GBQRKK from U0A8ZCK7RJM
2026-02-04 11:40:03 - slack_bot.dispatcher - INFO - [087e53dc] Calling Gemini for initial response...
2026-02-04 11:40:09 - slack_bot.dispatcher - WARNING - [087e53dc] Gemini returned empty response_text!
2026-02-04 11:40:09 - slack_bot.dispatcher - WARNING - [087e53dc] Forcing get_activity_history for 2026-02-04
2026-02-04 11:40:09 - slack_bot.dispatcher - INFO - [087e53dc] Gemini response in 6.04s: 0 chars, 1 tools
2026-02-04 11:40:09 - slack_bot.dispatcher - INFO - [087e53dc] Executing 1 tools
2026-02-04 11:40:09 - slack_bot.dispatcher - INFO - [087e53dc] Tool: get_activity_history Args: {'start_date': '2026-02-04', 'end_date': '2026-02-04'}
2026-02-04 11:40:09 - health.services.query - INFO - Querying activities from 2026-02-04 to 2026-02-04
2026-02-04 11:40:09 - health.services.query - INFO - Found 0 activities
2026-02-04 11:40:09 - slack_bot.dispatcher - INFO - [087e53dc] ✓ get_activity_history finished in 0.00s
2026-02-04 11:40:09 - slack_bot.dispatcher - INFO - [087e53dc] Requesting final analysis...
2026-02-04 11:40:15 - slack_bot.dispatcher - INFO - [087e53dc] Final analysis received in 5.22s
2026-02-04 11:40:15 - slack_bot.dispatcher - INFO - Formatted text (len 36 -> 36)
2026-02-04 11:40:15 - slack_bot.dispatcher - INFO - [087e53dc] 📤 Message updated 1770176403.800819
2026-02-04 11:40:15 - slack_bot.dispatcher - INFO - [087e53dc] Dispatch completed in 11.80s
2026-02-04 11:40:15 - __main__ - INFO - [087e53dc] ✅ Request completed in 12.33s
2026-02-04 11:40:53 - __main__ - INFO - [77eee855] 📥 Received message from U0A8ZCK7RJM in D0AA4GBQRKK: 再试一下，可能刚才没同步 (Files: 0)
2026-02-04 11:40:54 - slack_bot.dispatcher - INFO - [77eee855] Processing message in D0AA4GBQRKK from U0A8ZCK7RJM
2026-02-04 11:40:54 - slack_bot.dispatcher - INFO - [77eee855] Calling Gemini for initial response...
2026-02-04 11:40:59 - slack_bot.dispatcher - WARNING - [77eee855] Gemini returned empty response_text!
2026-02-04 11:40:59 - slack_bot.dispatcher - INFO - [77eee855] Gemini response in 5.27s: 0 chars, 0 tools
2026-02-04 11:40:59 - slack_bot.dispatcher - WARNING - No response text and no tool results - returning error message
2026-02-04 11:41:00 - slack_bot.dispatcher - INFO - [77eee855] 📤 Message updated 1770176454.286289
2026-02-04 11:41:00 - slack_bot.dispatcher - INFO - [77eee855] Dispatch completed in 5.82s
2026-02-04 11:41:00 - __main__ - INFO - [77eee855] ✅ Request completed in 6.40s
2026-02-04 11:41:15 - __main__ - INFO - [9a670498] 📥 Received message from U0A8ZCK7RJM in D0AA4GBQRKK: 查询上午的运动数据，并分析 (Files: 0)
2026-02-04 11:41:15 - slack_bot.dispatcher - INFO - [9a670498] Processing message in D0AA4GBQRKK from U0A8ZCK7RJM
2026-02-04 11:41:15 - slack_bot.dispatcher - INFO - [9a670498] Calling Gemini for initial response...
2026-02-04 11:41:19 - slack_bot.dispatcher - WARNING - [9a670498] Forcing get_activity_history for 2026-02-04
2026-02-04 11:41:19 - slack_bot.dispatcher - INFO - [9a670498] Gemini response in 3.37s: 38 chars, 1 tools
2026-02-04 11:41:19 - slack_bot.dispatcher - INFO - [9a670498] Executing 1 tools
2026-02-04 11:41:19 - slack_bot.dispatcher - INFO - [9a670498] Tool: get_activity_history Args: {'start_date': '2026-02-04', 'end_date': '2026-02-04'}
2026-02-04 11:41:19 - health.services.query - INFO - Querying activities from 2026-02-04 to 2026-02-04
2026-02-04 11:41:19 - health.services.query - INFO - Found 0 activities
2026-02-04 11:41:19 - slack_bot.dispatcher - INFO - [9a670498] ✓ get_activity_history finished in 0.00s
2026-02-04 11:41:19 - slack_bot.dispatcher - INFO - [9a670498] Requesting final analysis...
2026-02-04 11:41:25 - slack_bot.dispatcher - INFO - [9a670498] Final analysis received in 5.84s
2026-02-04 11:41:25 - slack_bot.dispatcher - INFO - Formatted text (len 36 -> 36)
2026-02-04 11:41:25 - slack_bot.dispatcher - INFO - [9a670498] 📤 Message updated 1770176475.835729
2026-02-04 11:41:25 - slack_bot.dispatcher - INFO - [9a670498] Dispatch completed in 9.71s
2026-02-04 11:41:25 - __main__ - INFO - [9a670498] ✅ Request completed in 10.29s
2026-02-04 11:45:14 - __main__ - INFO - [da679b8a] 📥 Received message from U0A8ZCK7RJM in D0AA4GBQRKK: 今天晚上可能会有酒精含量非常高的应酬，有没有什么全天的指导 (Files: 0)
2026-02-04 11:45:15 - slack_bot.dispatcher - INFO - [da679b8a] Processing message in D0AA4GBQRKK from U0A8ZCK7RJM
2026-02-04 11:45:15 - slack_bot.dispatcher - INFO - [da679b8a] Calling Gemini for initial response...
2026-02-04 11:45:35 - slack_bot.dispatcher - WARNING - [da679b8a] Forcing get_daily_detailed_stats for 2026-02-04
2026-02-04 11:45:35 - slack_bot.dispatcher - INFO - [da679b8a] Gemini response in 19.94s: 2409 chars, 1 tools
2026-02-04 11:45:35 - slack_bot.dispatcher - INFO - [da679b8a] Executing 1 tools
2026-02-04 11:45:35 - slack_bot.dispatcher - INFO - [da679b8a] Tool: get_daily_detailed_stats Args: {'target_date': '2026-02-04'}
2026-02-04 11:45:35 - health.services.query - INFO - Querying health data summary for 2026-02-04
2026-02-04 11:45:35 - health.services.query - INFO - Found 12 metrics and 0 activities
2026-02-04 11:45:35 - slack_bot.dispatcher - INFO - [da679b8a] ✓ get_daily_detailed_stats finished in 0.02s
2026-02-04 11:45:35 - slack_bot.dispatcher - INFO - [da679b8a] Requesting final analysis...
2026-02-04 11:45:52 - slack_bot.dispatcher - INFO - [da679b8a] Final analysis received in 17.13s
2026-02-04 11:45:52 - slack_bot.dispatcher - INFO - Formatted text (len 2115 -> 2006)
2026-02-04 11:45:52 - slack_bot.dispatcher - WARNING - [da679b8a] Update failed, posting new: The request to the Slack API failed. (url: https://slack.com/api/chat.update)
The server responded with: {'ok': False, 'error': 'msg_too_long'}
2026-02-04 11:45:53 - slack_bot.dispatcher - INFO - [da679b8a] Dispatch completed in 38.16s
2026-02-04 11:45:53 - __main__ - INFO - [da679b8a] ✅ Request completed in 38.71s
2026-02-04 11:47:43 - __main__ - INFO - [d4e8dd2a] 📥 Received message from U0A8ZCK7RJM in D0AA4GBQRKK: 最近的静息心率变化情况怎么样 (Files: 0)
2026-02-04 11:47:43 - slack_bot.dispatcher - INFO - [d4e8dd2a] Processing message in D0AA4GBQRKK from U0A8ZCK7RJM
2026-02-04 11:47:43 - slack_bot.dispatcher - INFO - [d4e8dd2a] Calling Gemini for initial response...
2026-02-04 11:47:49 - slack_bot.dispatcher - WARNING - [d4e8dd2a] Forcing get_daily_detailed_stats for 2026-02-04
2026-02-04 11:47:49 - slack_bot.dispatcher - INFO - [d4e8dd2a] Gemini response in 6.26s: 141 chars, 1 tools
2026-02-04 11:47:49 - slack_bot.dispatcher - INFO - [d4e8dd2a] Executing 1 tools
2026-02-04 11:47:49 - slack_bot.dispatcher - INFO - [d4e8dd2a] Tool: get_daily_detailed_stats Args: {'target_date': '2026-02-04'}
2026-02-04 11:47:49 - health.services.query - INFO - Querying health data summary for 2026-02-04
2026-02-04 11:47:49 - health.services.query - INFO - Found 12 metrics and 0 activities
2026-02-04 11:47:49 - slack_bot.dispatcher - INFO - [d4e8dd2a] ✓ get_daily_detailed_stats finished in 0.02s
2026-02-04 11:47:49 - slack_bot.dispatcher - INFO - [d4e8dd2a] Requesting final analysis...
2026-02-04 11:47:57 - slack_bot.dispatcher - INFO - [d4e8dd2a] Final analysis received in 8.07s
2026-02-04 11:47:57 - slack_bot.dispatcher - INFO - Formatted text (len 128 -> 126)
2026-02-04 11:47:58 - slack_bot.dispatcher - INFO - [d4e8dd2a] 📤 Message updated 1770176863.567489
2026-02-04 11:47:58 - slack_bot.dispatcher - INFO - [d4e8dd2a] Dispatch completed in 14.85s
2026-02-04 11:47:58 - __main__ - INFO - [d4e8dd2a] ✅ Request completed in 15.40s
2026-02-04 11:48:23 - __main__ - INFO - [cb5f6a3d] 📥 Received message from U0A8ZCK7RJM in D0AA4GBQRKK: 过去一年的历史趋势呢 (Files: 0)
2026-02-04 11:48:23 - slack_bot.dispatcher - INFO - [cb5f6a3d] Processing message in D0AA4GBQRKK from U0A8ZCK7RJM
2026-02-04 11:48:23 - slack_bot.dispatcher - INFO - [cb5f6a3d] Calling Gemini for initial response...
2026-02-04 11:48:29 - slack_bot.dispatcher - WARNING - [cb5f6a3d] Gemini returned empty response_text!
2026-02-04 11:48:29 - slack_bot.dispatcher - INFO - [cb5f6a3d] Gemini response in 5.37s: 0 chars, 0 tools
2026-02-04 11:48:29 - slack_bot.dispatcher - WARNING - No response text and no tool results - returning error message
2026-02-04 11:48:29 - slack_bot.dispatcher - INFO - [cb5f6a3d] 📤 Message updated 1770176903.599459
2026-02-04 11:48:29 - slack_bot.dispatcher - INFO - [cb5f6a3d] Dispatch completed in 5.88s
2026-02-04 11:48:29 - __main__ - INFO - [cb5f6a3d] ✅ Request completed in 6.45s
2026-02-04 15:30:43 - health.utils.env_loader - INFO - Loading extra configuration from: /Users/lili/workspace/bulter/.gemini.current.env
2026-02-04 15:30:43 - __main__ - INFO - Starting Butler Bot with Gemini model: gemini-2.5-flash
2026-02-04 15:30:44 - slack_bot.llm.gemini - INFO - Using proxy: http://127.0.0.1:8045
2026-02-04 15:30:44 - slack_bot.llm.gemini - INFO - Initialized Gemini model: gemini-2.5-flash
2026-02-04 15:30:44 - slack_bot.dispatcher - INFO - Dispatcher initialized with Gemini
2026-02-04 15:30:44 - __main__ - INFO - ⚡️ Butler (Gemini) is connected to Slack!
⚡️ Bolt app is running!
2026-02-04 15:31:10 - __main__ - INFO - [c2789773] 📥 Received message from U0A8ZCK7RJM in D0AA4GBQRKK: 过去两个月的静息心率变化 (Files: 0)
2026-02-04 15:31:11 - slack_bot.dispatcher - INFO - [c2789773] Processing message in D0AA4GBQRKK from U0A8ZCK7RJM
2026-02-04 15:31:11 - slack_bot.dispatcher - INFO - [c2789773] Calling Gemini for initial response...
2026-02-04 15:31:14 - slack_bot.dispatcher - WARNING - [c2789773] Gemini returned empty response_text!
2026-02-04 15:31:14 - slack_bot.dispatcher - WARNING - [c2789773] Forcing get_daily_detailed_stats for 2026-02-04
2026-02-04 15:31:14 - slack_bot.dispatcher - INFO - [c2789773] Gemini response in 3.28s: 0 chars, 1 tools
2026-02-04 15:31:14 - slack_bot.dispatcher - INFO - [c2789773] Executing 1 tools
2026-02-04 15:31:14 - slack_bot.dispatcher - INFO - [c2789773] Tool: get_daily_detailed_stats Args: {'target_date': '2026-02-04'}
2026-02-04 15:31:14 - health.services.query - INFO - Querying health data summary for 2026-02-04
2026-02-04 15:31:14 - health.services.query - INFO - Found 12 metrics and 0 activities
2026-02-04 15:31:14 - slack_bot.dispatcher - INFO - [c2789773] ✓ get_daily_detailed_stats finished in 0.02s
2026-02-04 15:31:14 - slack_bot.dispatcher - INFO - [c2789773] Requesting final analysis...
2026-02-04 15:31:16 - slack_bot.dispatcher - INFO - [c2789773] Final analysis received in 2.33s
2026-02-04 15:31:16 - slack_bot.dispatcher - INFO - Formatted text (len 101 -> 101)
2026-02-04 15:31:17 - slack_bot.dispatcher - INFO - [c2789773] 📤 Message updated 1770190271.041809
2026-02-04 15:31:17 - slack_bot.dispatcher - INFO - [c2789773] Dispatch completed in 6.29s
2026-02-04 15:31:17 - __main__ - INFO - [c2789773] ✅ Request completed in 6.92s
2026-02-04 15:36:38 - health.utils.env_loader - INFO - Loading extra configuration from: /Users/lili/workspace/bulter/.gemini.current.env
2026-02-04 15:36:38 - __main__ - INFO - Starting Butler Bot with Gemini model: gemini-3-pro-high
2026-02-04 15:36:39 - slack_bot.llm.gemini - INFO - Using proxy: http://127.0.0.1:8045
2026-02-04 15:36:39 - slack_bot.llm.gemini - INFO - Initialized Gemini model: gemini-3-pro-high
2026-02-04 15:36:39 - slack_bot.dispatcher - INFO - Dispatcher initialized with Gemini
2026-02-04 15:36:39 - __main__ - INFO - ⚡️ Butler (Gemini) is connected to Slack!
⚡️ Bolt app is running!
2026-02-04 15:36:58 - __main__ - INFO - [a6838c09] 📥 Received message from U0A8ZCK7RJM in D0AA4GBQRKK: 过去两个月的静息心率变化 (Files: 0)
2026-02-04 15:36:58 - slack_bot.dispatcher - INFO - [a6838c09] Processing message in D0AA4GBQRKK from U0A8ZCK7RJM
2026-02-04 15:36:58 - slack_bot.dispatcher - INFO - [a6838c09] Calling Gemini for initial response...
2026-02-04 15:37:04 - slack_bot.dispatcher - WARNING - [a6838c09] Forcing get_daily_detailed_stats for 2026-02-04
2026-02-04 15:37:04 - slack_bot.dispatcher - INFO - [a6838c09] Gemini response in 5.58s: 34 chars, 1 tools
2026-02-04 15:37:04 - slack_bot.dispatcher - INFO - [a6838c09] Executing 1 tools
2026-02-04 15:37:04 - slack_bot.dispatcher - INFO - [a6838c09] Tool: get_daily_detailed_stats Args: {'target_date': '2026-02-04'}
2026-02-04 15:37:04 - health.services.query - INFO - Querying health data summary for 2026-02-04
2026-02-04 15:37:04 - health.services.query - INFO - Found 12 metrics and 0 activities
2026-02-04 15:37:04 - slack_bot.dispatcher - INFO - [a6838c09] ✓ get_daily_detailed_stats finished in 0.02s
2026-02-04 15:37:04 - slack_bot.dispatcher - INFO - [a6838c09] Requesting final analysis...
2026-02-04 15:37:16 - slack_bot.dispatcher - INFO - [a6838c09] Final analysis received in 12.15s
2026-02-04 15:37:16 - slack_bot.dispatcher - INFO - Formatted text (len 273 -> 269)
2026-02-04 15:37:17 - slack_bot.dispatcher - INFO - [a6838c09] 📤 Message updated 1770190618.804129
2026-02-04 15:37:17 - slack_bot.dispatcher - INFO - [a6838c09] Dispatch completed in 18.35s
2026-02-04 15:37:17 - __main__ - INFO - [a6838c09] ✅ Request completed in 19.00s
2026-02-04 15:43:20 - health.utils.env_loader - INFO - Loading extra configuration from: /Users/lili/workspace/bulter/.gemini.current.env
2026-02-04 15:43:20 - __main__ - INFO - Starting Butler Bot with Gemini model: gemini-3-pro-high
2026-02-04 15:43:21 - slack_bot.llm.gemini - INFO - Using proxy: http://127.0.0.1:8045
2026-02-04 15:43:21 - slack_bot.llm.gemini - INFO - Initialized Gemini model: gemini-3-pro-high
2026-02-04 15:43:21 - slack_bot.dispatcher - INFO - Dispatcher initialized with Gemini
2026-02-04 15:43:21 - __main__ - INFO - ⚡️ Butler (Gemini) is connected to Slack!
⚡️ Bolt app is running!
2026-02-04 15:44:02 - __main__ - INFO - [39e4bda8] 📥 Received message from U0A8ZCK7RJM in D0AA4GBQRKK: 过去两个月的静息心率变化 (Files: 0)
2026-02-04 15:44:03 - slack_bot.dispatcher - INFO - [39e4bda8] Processing message in D0AA4GBQRKK from U0A8ZCK7RJM
2026-02-04 15:44:03 - slack_bot.dispatcher - INFO - [39e4bda8] Calling Gemini for initial response...
2026-02-04 15:44:11 - slack_bot.dispatcher - WARNING - [39e4bda8] Gemini returned empty response_text!
2026-02-04 15:44:11 - slack_bot.dispatcher - WARNING - [39e4bda8] Forcing get_daily_detailed_stats for 2026-02-04
2026-02-04 15:44:11 - slack_bot.dispatcher - INFO - [39e4bda8] Gemini response in 7.69s: 0 chars, 1 tools
2026-02-04 15:44:11 - slack_bot.dispatcher - INFO - [39e4bda8] Executing 1 tools
2026-02-04 15:44:11 - slack_bot.dispatcher - INFO - [39e4bda8] Tool: get_daily_detailed_stats Args: {'target_date': '2026-02-04'}
2026-02-04 15:44:11 - health.services.query - INFO - Querying health data summary for 2026-02-04
2026-02-04 15:44:11 - health.services.query - INFO - Found 12 metrics and 0 activities
2026-02-04 15:44:11 - slack_bot.dispatcher - INFO - [39e4bda8] ✓ get_daily_detailed_stats finished in 0.02s
2026-02-04 15:44:11 - slack_bot.dispatcher - INFO - [39e4bda8] Requesting final analysis...
2026-02-04 15:44:20 - slack_bot.llm.gemini - ERROR - OpenAI API Request Failed: Token error: All accounts failed or unhealthy.
2026-02-04 15:44:20 - slack_bot.llm.gemini - ERROR - Dumped failed payload to /Users/lili/workspace/bulter/debug_failed_payload.json
2026-02-04 15:44:20 - slack_bot.dispatcher - INFO - [39e4bda8] Final analysis received in 9.21s
2026-02-04 15:44:20 - slack_bot.dispatcher - INFO - Formatted text (len 65 -> 65)
2026-02-04 15:44:21 - slack_bot.dispatcher - INFO - [39e4bda8] 📤 Message updated 1770191043.480449
2026-02-04 15:44:21 - slack_bot.dispatcher - INFO - [39e4bda8] Dispatch completed in 17.46s
2026-02-04 15:44:21 - __main__ - INFO - [39e4bda8] ✅ Request completed in 18.17s
2026-02-04 15:51:17 - health.utils.env_loader - INFO - Loading extra configuration from: /Users/lili/workspace/bulter/.gemini.current.env
2026-02-04 15:51:17 - __main__ - INFO - Starting Butler Bot with Gemini model: gemini-3-pro-high
2026-02-04 15:51:18 - slack_bot.llm.gemini - INFO - Using proxy: http://127.0.0.1:8045
2026-02-04 15:51:18 - slack_bot.llm.gemini - INFO - Initialized Gemini model: gemini-3-pro-high
2026-02-04 15:51:18 - slack_bot.dispatcher - INFO - Dispatcher initialized with Gemini
2026-02-04 15:51:18 - __main__ - INFO - ⚡️ Butler (Gemini) is connected to Slack!
⚡️ Bolt app is running!
2026-02-04 15:51:24 - __main__ - INFO - [9f47ed4f] 📥 Received message from U0A8ZCK7RJM in D0AA4GBQRKK: 过去两个月的静息心率变化 (Files: 0)
2026-02-04 15:51:25 - slack_bot.dispatcher - INFO - [9f47ed4f] Processing message in D0AA4GBQRKK from U0A8ZCK7RJM
2026-02-04 15:51:25 - slack_bot.dispatcher - INFO - [9f47ed4f] Calling Gemini for initial response...
2026-02-04 15:51:26 - slack_bot.llm.gemini - ERROR - OpenAI API Request Failed: Token error: All accounts failed or unhealthy.
2026-02-04 15:51:26 - slack_bot.llm.gemini - ERROR - Dumped failed payload to /Users/lili/workspace/bulter/debug_failed_payload.json
2026-02-04 15:51:26 - slack_bot.dispatcher - WARNING - [9f47ed4f] Forcing get_daily_detailed_stats for 2026-02-04
2026-02-04 15:51:26 - slack_bot.dispatcher - INFO - [9f47ed4f] Gemini response in 1.51s: 65 chars, 1 tools
2026-02-04 15:51:26 - slack_bot.dispatcher - INFO - [9f47ed4f] Executing 1 tools
2026-02-04 15:51:26 - slack_bot.dispatcher - INFO - [9f47ed4f] Tool: get_daily_detailed_stats Args: {'target_date': '2026-02-04'}
2026-02-04 15:51:26 - health.services.query - INFO - Querying health data summary for 2026-02-04
2026-02-04 15:51:26 - health.services.query - INFO - Found 12 metrics and 0 activities
2026-02-04 15:51:26 - slack_bot.dispatcher - INFO - [9f47ed4f] ✓ get_daily_detailed_stats finished in 0.02s
2026-02-04 15:51:26 - slack_bot.dispatcher - INFO - [9f47ed4f] Requesting final analysis...
2026-02-04 15:51:27 - slack_bot.llm.gemini - ERROR - OpenAI API Request Failed: Token error: All accounts failed or unhealthy.
2026-02-04 15:51:27 - slack_bot.llm.gemini - ERROR - Dumped failed payload to /Users/lili/workspace/bulter/debug_failed_payload.json
2026-02-04 15:51:27 - slack_bot.dispatcher - INFO - [9f47ed4f] Final analysis received in 1.33s
2026-02-04 15:51:27 - slack_bot.dispatcher - INFO - Formatted text (len 65 -> 65)
2026-02-04 15:51:28 - slack_bot.dispatcher - INFO - [9f47ed4f] 📤 Message updated 1770191485.041169
2026-02-04 15:51:28 - slack_bot.dispatcher - INFO - [9f47ed4f] Dispatch completed in 3.64s
2026-02-04 15:51:28 - __main__ - INFO - [9f47ed4f] ✅ Request completed in 4.15s
2026-02-04 16:10:01 - health.utils.env_loader - INFO - Loading extra configuration from: /Users/lili/workspace/bulter/.gemini.current.env
2026-02-04 16:10:01 - __main__ - INFO - Starting Butler Bot with Gemini model: gemini-3-pro-high
2026-02-04 16:10:02 - slack_bot.llm.gemini - INFO - Using proxy: http://127.0.0.1:8045
2026-02-04 16:10:02 - slack_bot.llm.gemini - INFO - Initialized Gemini model: gemini-3-pro-high
2026-02-04 16:10:02 - slack_bot.dispatcher - INFO - Dispatcher initialized with Gemini
2026-02-04 16:10:02 - __main__ - INFO - ⚡️ Butler (Gemini) is connected to Slack!
⚡️ Bolt app is running!
2026-02-04 16:10:28 - __main__ - INFO - [5e1e3ef3] 📥 Received message from U0A8ZCK7RJM in D0AA4GBQRKK: 过去两个月的静息心率变化 (Files: 0)
2026-02-04 16:10:29 - slack_bot.dispatcher - INFO - [5e1e3ef3] Processing message in D0AA4GBQRKK from U0A8ZCK7RJM
2026-02-04 16:10:29 - slack_bot.dispatcher - INFO - [5e1e3ef3] Calling Gemini for initial response...
2026-02-04 16:10:30 - slack_bot.llm.gemini - ERROR - OpenAI API Request Failed: Token error: All accounts failed or unhealthy.
2026-02-04 16:10:30 - slack_bot.llm.gemini - ERROR - Dumped failed payload to /Users/lili/workspace/bulter/debug_failed_payload.json
2026-02-04 16:10:30 - slack_bot.dispatcher - WARNING - [5e1e3ef3] Forcing get_daily_detailed_stats for 2026-02-04
2026-02-04 16:10:30 - slack_bot.dispatcher - INFO - [5e1e3ef3] Gemini response in 1.57s: 65 chars, 1 tools
2026-02-04 16:10:30 - slack_bot.dispatcher - INFO - [5e1e3ef3] Executing 1 tools
2026-02-04 16:10:30 - slack_bot.dispatcher - INFO - [5e1e3ef3] Tool: get_daily_detailed_stats Args: {'target_date': '2026-02-04'}
2026-02-04 16:10:30 - health.services.query - INFO - Querying health data summary for 2026-02-04
2026-02-04 16:10:30 - health.services.query - INFO - Found 12 metrics and 0 activities
2026-02-04 16:10:30 - slack_bot.dispatcher - INFO - [5e1e3ef3] ✓ get_daily_detailed_stats finished in 0.02s
2026-02-04 16:10:30 - slack_bot.dispatcher - INFO - [5e1e3ef3] Requesting final analysis...
2026-02-04 16:10:32 - slack_bot.llm.gemini - ERROR - OpenAI API Request Failed: Token error: All accounts failed or unhealthy.
2026-02-04 16:10:32 - slack_bot.llm.gemini - ERROR - Dumped failed payload to /Users/lili/workspace/bulter/debug_failed_payload.json
2026-02-04 16:10:32 - slack_bot.dispatcher - INFO - [5e1e3ef3] Final analysis received in 1.46s
2026-02-04 16:10:32 - slack_bot.dispatcher - INFO - Formatted text (len 65 -> 65)
2026-02-04 16:10:32 - slack_bot.dispatcher - INFO - [5e1e3ef3] 📤 Message updated 1770192629.171299
2026-02-04 16:10:32 - slack_bot.dispatcher - INFO - [5e1e3ef3] Dispatch completed in 3.67s
2026-02-04 16:10:32 - __main__ - INFO - [5e1e3ef3] ✅ Request completed in 4.22s
2026-02-04 16:15:36 - health.utils.env_loader - INFO - Loading extra configuration from: /Users/lili/workspace/bulter/.gemini.current.env
2026-02-04 16:15:36 - __main__ - INFO - Starting Butler Bot with Gemini model: gemini-3-pro-high
2026-02-04 16:15:37 - slack_bot.llm.gemini - INFO - Using proxy: http://127.0.0.1:8045
2026-02-04 16:15:37 - slack_bot.llm.gemini - INFO - Initialized Gemini model: gemini-3-pro-high
2026-02-04 16:15:37 - slack_bot.dispatcher - INFO - Dispatcher initialized with Gemini
2026-02-04 16:15:37 - __main__ - INFO - ⚡️ Butler (Gemini) is connected to Slack!
⚡️ Bolt app is running!
2026-02-04 16:15:51 - __main__ - INFO - [9351cfc6] 📥 Received message from U0A8ZCK7RJM in D0AA4GBQRKK: 过去两个月的静息心率变化 (Files: 0)
2026-02-04 16:15:52 - slack_bot.dispatcher - INFO - [9351cfc6] Processing message in D0AA4GBQRKK from U0A8ZCK7RJM
2026-02-04 16:15:52 - slack_bot.dispatcher - INFO - [9351cfc6] Calling Gemini for initial response...
2026-02-04 16:15:53 - slack_bot.llm.gemini - ERROR - OpenAI API Request Failed: Token error: All accounts failed or unhealthy.
2026-02-04 16:15:53 - slack_bot.llm.gemini - ERROR - Dumped failed payload to /Users/lili/workspace/bulter/debug_failed_payload.json
2026-02-04 16:15:53 - slack_bot.dispatcher - WARNING - [9351cfc6] Forcing get_daily_detailed_stats for 2026-02-04
2026-02-04 16:15:53 - slack_bot.dispatcher - INFO - [9351cfc6] Gemini response in 1.66s: 65 chars, 1 tools
2026-02-04 16:15:53 - slack_bot.dispatcher - INFO - [9351cfc6] Executing 1 tools
2026-02-04 16:15:53 - slack_bot.dispatcher - INFO - [9351cfc6] Tool: get_daily_detailed_stats Args: {'target_date': '2026-02-04'}
2026-02-04 16:15:53 - health.services.query - INFO - Querying health data summary for 2026-02-04
2026-02-04 16:15:53 - health.services.query - INFO - Found 12 metrics and 0 activities
2026-02-04 16:15:53 - slack_bot.dispatcher - INFO - [9351cfc6] ✓ get_daily_detailed_stats finished in 0.02s
2026-02-04 16:15:53 - slack_bot.dispatcher - INFO - [9351cfc6] Requesting final analysis...
2026-02-04 16:15:55 - slack_bot.llm.gemini - ERROR - OpenAI API Request Failed: Token error: All accounts failed or unhealthy.
2026-02-04 16:15:55 - slack_bot.llm.gemini - ERROR - Dumped failed payload to /Users/lili/workspace/bulter/debug_failed_payload.json
2026-02-04 16:15:55 - slack_bot.dispatcher - INFO - [9351cfc6] Final analysis received in 1.45s
2026-02-04 16:15:55 - slack_bot.dispatcher - INFO - Formatted text (len 65 -> 65)
2026-02-04 16:15:55 - slack_bot.dispatcher - INFO - [9351cfc6] 📤 Message updated 1770192952.007569
2026-02-04 16:15:55 - slack_bot.dispatcher - INFO - [9351cfc6] Dispatch completed in 3.69s
2026-02-04 16:15:55 - __main__ - INFO - [9351cfc6] ✅ Request completed in 4.21s
2026-02-04 16:16:06 - health.utils.env_loader - INFO - Loading extra configuration from: /Users/lili/workspace/bulter/.gemini.current.env
2026-02-04 16:16:06 - __main__ - INFO - Starting Butler Bot with Gemini model: gemini-3-pro-high
2026-02-04 16:16:08 - slack_bot.llm.gemini - INFO - Using proxy: http://127.0.0.1:8045
2026-02-04 16:16:08 - slack_bot.llm.gemini - INFO - Initialized Gemini model: gemini-3-pro-high
2026-02-04 16:16:08 - slack_bot.dispatcher - INFO - Dispatcher initialized with Gemini
2026-02-04 16:16:08 - __main__ - INFO - ⚡️ Butler (Gemini) is connected to Slack!
⚡️ Bolt app is running!
2026-02-04 16:17:09 - __main__ - INFO - [b0f1ae12] 📥 Received message from U0A8ZCK7RJM in D0AA4GBQRKK: 过去两个月的静息心率变化 (Files: 0)
2026-02-04 16:17:09 - slack_bot.dispatcher - INFO - [b0f1ae12] Processing message in D0AA4GBQRKK from U0A8ZCK7RJM
2026-02-04 16:17:09 - slack_bot.dispatcher - INFO - [b0f1ae12] Calling Gemini for initial response...
2026-02-04 16:17:11 - slack_bot.llm.gemini - ERROR - OpenAI API Request Failed: Token error: All accounts failed or unhealthy.
2026-02-04 16:17:11 - slack_bot.llm.gemini - ERROR - Dumped failed payload to /Users/lili/workspace/bulter/debug_failed_payload.json
2026-02-04 16:17:11 - slack_bot.dispatcher - WARNING - [b0f1ae12] Forcing get_daily_detailed_stats for 2026-02-04
2026-02-04 16:17:11 - slack_bot.dispatcher - INFO - [b0f1ae12] Gemini response in 1.51s: 65 chars, 1 tools
2026-02-04 16:17:11 - slack_bot.dispatcher - INFO - [b0f1ae12] Executing 1 tools
2026-02-04 16:17:11 - slack_bot.dispatcher - INFO - [b0f1ae12] Tool: get_daily_detailed_stats Args: {'target_date': '2026-02-04'}
2026-02-04 16:17:11 - health.services.query - INFO - Querying health data summary for 2026-02-04
2026-02-04 16:17:11 - health.services.query - INFO - Found 12 metrics and 0 activities
2026-02-04 16:17:11 - slack_bot.dispatcher - INFO - [b0f1ae12] ✓ get_daily_detailed_stats finished in 0.02s
2026-02-04 16:17:11 - slack_bot.dispatcher - INFO - [b0f1ae12] Requesting final analysis...
2026-02-04 16:17:12 - slack_bot.llm.gemini - ERROR - OpenAI API Request Failed: Token error: All accounts failed or unhealthy.
2026-02-04 16:17:12 - slack_bot.llm.gemini - ERROR - Dumped failed payload to /Users/lili/workspace/bulter/debug_failed_payload.json
2026-02-04 16:17:12 - slack_bot.dispatcher - INFO - [b0f1ae12] Final analysis received in 1.30s
2026-02-04 16:17:12 - slack_bot.dispatcher - INFO - Formatted text (len 65 -> 65)
2026-02-04 16:17:13 - slack_bot.dispatcher - INFO - [b0f1ae12] 📤 Message updated 1770193029.752429
2026-02-04 16:17:13 - slack_bot.dispatcher - INFO - [b0f1ae12] Dispatch completed in 3.48s
2026-02-04 16:17:13 - __main__ - INFO - [b0f1ae12] ✅ Request completed in 4.00s
2026-02-04 16:30:49 - health.utils.env_loader - INFO - Loading extra configuration from: /Users/lili/workspace/bulter/.gemini.current.env
2026-02-04 16:30:49 - __main__ - INFO - Starting Butler Bot with Gemini model: gemini-3-pro-high
2026-02-04 16:30:50 - slack_bot.llm.gemini - INFO - Using proxy: http://127.0.0.1:8045
2026-02-04 16:30:50 - slack_bot.llm.gemini - INFO - Initialized Gemini model: gemini-3-pro-high
2026-02-04 16:30:50 - slack_bot.dispatcher - INFO - Dispatcher initialized with Gemini
2026-02-04 16:30:50 - __main__ - INFO - ⚡️ Butler (Gemini) is connected to Slack!
⚡️ Bolt app is running!
2026-02-04 16:36:51 - __main__ - INFO - [071cc71a] 📥 Received message from U0A8ZCK7RJM in D0AA4GBQRKK: 过去两个月的静息心率变化 (Files: 0)
2026-02-04 16:36:51 - slack_bot.dispatcher - INFO - [071cc71a] Processing message in D0AA4GBQRKK from U0A8ZCK7RJM
2026-02-04 16:36:51 - slack_bot.dispatcher - INFO - [071cc71a] Calling Gemini for initial response...
2026-02-04 16:36:53 - slack_bot.llm.gemini - ERROR - OpenAI API Request Failed: Token error: All accounts failed or unhealthy.
2026-02-04 16:36:53 - slack_bot.llm.gemini - ERROR - Dumped failed payload to /Users/lili/workspace/bulter/debug_failed_payload.json
2026-02-04 16:36:53 - slack_bot.dispatcher - WARNING - [071cc71a] Forcing get_metric_history for rhr (2026-01-05 to 2026-02-04, 30 days)
2026-02-04 16:36:53 - slack_bot.dispatcher - INFO - [071cc71a] Gemini response in 1.58s: 65 chars, 1 tools
2026-02-04 16:36:53 - slack_bot.dispatcher - INFO - [071cc71a] Executing 1 tools
2026-02-04 16:36:53 - slack_bot.dispatcher - INFO - [071cc71a] Tool: get_metric_history Args: {'metric_type': 'rhr', 'start_date': '2026-01-05', 'end_date': '2026-02-04'}
2026-02-04 16:36:53 - slack_bot.tools.health_read - INFO - Time range 31 days - using aggregated analysis
2026-02-04 16:36:53 - health.services.query - INFO - Querying rhr from 2026-01-05 to 2026-02-04
2026-02-04 16:36:53 - health.services.query - INFO - Found 28 records for rhr
2026-02-04 16:36:53 - slack_bot.dispatcher - INFO - [071cc71a] ✓ get_metric_history finished in 0.03s
2026-02-04 16:36:53 - slack_bot.dispatcher - INFO - [071cc71a] Requesting final analysis...
2026-02-04 16:36:54 - slack_bot.llm.gemini - ERROR - OpenAI API Request Failed: Token error: All accounts failed or unhealthy.
2026-02-04 16:36:54 - slack_bot.llm.gemini - ERROR - Dumped failed payload to /Users/lili/workspace/bulter/debug_failed_payload.json
2026-02-04 16:36:54 - slack_bot.dispatcher - INFO - [071cc71a] Final analysis received in 1.31s
2026-02-04 16:36:54 - slack_bot.dispatcher - INFO - Formatted text (len 65 -> 65)
2026-02-04 16:36:55 - slack_bot.dispatcher - INFO - [071cc71a] 📤 Message updated 1770194211.857919
2026-02-04 16:36:55 - slack_bot.dispatcher - INFO - [071cc71a] Dispatch completed in 3.63s
2026-02-04 16:36:55 - __main__ - INFO - [071cc71a] ✅ Request completed in 4.23s
2026-02-04 16:53:05 - health.utils.env_loader - INFO - Loading extra configuration from: /Users/lili/workspace/bulter/.gemini.current.env
2026-02-04 16:53:05 - __main__ - INFO - Starting Butler Bot with Gemini model: gemini-3-pro-high
2026-02-04 16:53:07 - slack_bot.llm.gemini - INFO - Using proxy: http://127.0.0.1:8045
2026-02-04 16:53:07 - slack_bot.llm.gemini - INFO - Initialized Gemini model: gemini-3-pro-high
2026-02-04 16:53:07 - slack_bot.dispatcher - INFO - Dispatcher initialized with Gemini
2026-02-04 16:53:07 - __main__ - INFO - ⚡️ Butler (Gemini) is connected to Slack!
⚡️ Bolt app is running!
2026-02-04 16:53:18 - __main__ - INFO - [c17d53b7] 📥 Received message from U0A8ZCK7RJM in D0AA4GBQRKK: 过去两个月的静息心率变化 (Files: 0)
2026-02-04 16:53:18 - slack_bot.dispatcher - INFO - [c17d53b7] Processing message in D0AA4GBQRKK from U0A8ZCK7RJM
2026-02-04 16:53:18 - slack_bot.dispatcher - INFO - [c17d53b7] Calling Gemini for initial response...
2026-02-04 16:53:20 - slack_bot.llm.gemini - ERROR - OpenAI API Request Failed: Token error: All accounts failed or unhealthy.
2026-02-04 16:53:20 - slack_bot.llm.gemini - ERROR - Dumped failed payload to /Users/lili/workspace/bulter/debug_failed_payload.json
2026-02-04 16:53:20 - slack_bot.dispatcher - WARNING - [c17d53b7] Forcing get_metric_history for rhr (2026-01-05 to 2026-02-04, 30 days)
2026-02-04 16:53:20 - slack_bot.dispatcher - INFO - [c17d53b7] Gemini response in 1.63s: 65 chars, 1 tools
2026-02-04 16:53:20 - slack_bot.dispatcher - INFO - [c17d53b7] Executing 1 tools
2026-02-04 16:53:20 - slack_bot.dispatcher - INFO - [c17d53b7] Tool: get_metric_history Args: {'metric_type': 'rhr', 'start_date': '2026-01-05', 'end_date': '2026-02-04'}
2026-02-04 16:53:20 - slack_bot.tools.health_read - INFO - Time range 31 days - using aggregated analysis
2026-02-04 16:53:20 - health.services.query - INFO - Querying rhr from 2026-01-05 to 2026-02-04
2026-02-04 16:53:20 - health.services.query - INFO - Found 28 records for rhr
2026-02-04 16:53:20 - slack_bot.dispatcher - INFO - [c17d53b7] ✓ get_metric_history finished in 0.03s
2026-02-04 16:53:20 - slack_bot.dispatcher - INFO - [c17d53b7] Requesting final analysis...
2026-02-04 16:53:21 - slack_bot.llm.gemini - ERROR - OpenAI API Request Failed: Token error: All accounts failed or unhealthy.
2026-02-04 16:53:21 - slack_bot.llm.gemini - ERROR - Dumped failed payload to /Users/lili/workspace/bulter/debug_failed_payload.json
2026-02-04 16:53:21 - slack_bot.dispatcher - INFO - [c17d53b7] Final analysis received in 1.26s
2026-02-04 16:53:21 - slack_bot.dispatcher - INFO - Formatted text (len 65 -> 65)
2026-02-04 16:53:22 - slack_bot.dispatcher - INFO - [c17d53b7] 📤 Message updated 1770195198.612199
2026-02-04 16:53:22 - slack_bot.dispatcher - INFO - [c17d53b7] Dispatch completed in 3.55s
2026-02-04 16:53:22 - __main__ - INFO - [c17d53b7] ✅ Request completed in 4.36s
2026-02-04 17:00:21 - health.utils.env_loader - INFO - Loading extra configuration from: /Users/lili/workspace/bulter/.gemini.current.env
2026-02-04 17:00:21 - __main__ - INFO - Starting Butler Bot with Gemini model: gemini-3-pro-high
2026-02-04 17:00:23 - slack_bot.llm.gemini - INFO - Using proxy: http://127.0.0.1:8045
2026-02-04 17:00:23 - slack_bot.llm.gemini - INFO - Initialized Gemini model: gemini-3-pro-high
2026-02-04 17:00:23 - slack_bot.dispatcher - INFO - Dispatcher initialized with Gemini
2026-02-04 17:00:23 - __main__ - INFO - ⚡️ Butler (Gemini) is connected to Slack!
⚡️ Bolt app is running!
2026-02-04 17:00:34 - __main__ - INFO - [ad951f11] 📥 Received message from U0A8ZCK7RJM in D0AA4GBQRKK: 过去两个月的静息心率变化 (Files: 0)
2026-02-04 17:00:35 - slack_bot.dispatcher - INFO - [ad951f11] Processing message in D0AA4GBQRKK from U0A8ZCK7RJM
2026-02-04 17:00:35 - slack_bot.dispatcher - INFO - [ad951f11] Calling Gemini for initial response...
2026-02-04 17:00:36 - slack_bot.llm.gemini - ERROR - OpenAI API Request Failed: Token error: All accounts failed or unhealthy.
2026-02-04 17:00:36 - slack_bot.llm.gemini - ERROR - Dumped failed payload to /Users/lili/workspace/bulter/debug_failed_payload.json
2026-02-04 17:00:36 - slack_bot.dispatcher - WARNING - [ad951f11] Forcing get_metric_history for rhr (2026-01-05 to 2026-02-04, 30 days)
2026-02-04 17:00:36 - slack_bot.dispatcher - INFO - [ad951f11] Gemini response in 1.54s: 65 chars, 1 tools
2026-02-04 17:00:36 - slack_bot.dispatcher - INFO - [ad951f11] Executing 1 tools
2026-02-04 17:00:36 - slack_bot.dispatcher - INFO - [ad951f11] Tool: get_metric_history Args: {'metric_type': 'rhr', 'start_date': '2026-01-05', 'end_date': '2026-02-04'}
2026-02-04 17:00:36 - slack_bot.tools.health_read - INFO - Time range 31 days - using aggregated analysis
2026-02-04 17:00:36 - health.services.query - INFO - Querying rhr from 2026-01-05 to 2026-02-04
2026-02-04 17:00:37 - health.services.query - INFO - Found 28 records for rhr
2026-02-04 17:00:37 - slack_bot.dispatcher - INFO - [ad951f11] ✓ get_metric_history finished in 0.04s
2026-02-04 17:00:37 - slack_bot.dispatcher - INFO - [ad951f11] Requesting final analysis...
2026-02-04 17:00:38 - slack_bot.llm.gemini - ERROR - OpenAI API Request Failed: Token error: All accounts failed or unhealthy.
2026-02-04 17:00:38 - slack_bot.llm.gemini - ERROR - Dumped failed payload to /Users/lili/workspace/bulter/debug_failed_payload.json
2026-02-04 17:00:38 - slack_bot.dispatcher - INFO - [ad951f11] Final analysis received in 1.45s
2026-02-04 17:00:38 - slack_bot.dispatcher - INFO - Formatted text (len 65 -> 65)
2026-02-04 17:00:39 - slack_bot.dispatcher - INFO - [ad951f11] 📤 Message updated 1770195635.246999
2026-02-04 17:00:39 - slack_bot.dispatcher - INFO - [ad951f11] Dispatch completed in 3.88s
2026-02-04 17:00:39 - __main__ - INFO - [ad951f11] ✅ Request completed in 4.56s
2026-02-04 17:06:53 - __main__ - INFO - [5da8a9e3] 📥 Received message from U0A8ZCK7RJM in D0AA4GBQRKK: 过去2个月的静息心率变化 (Files: 0)
2026-02-04 17:06:54 - slack_bot.dispatcher - INFO - [5da8a9e3] Processing message in D0AA4GBQRKK from U0A8ZCK7RJM
2026-02-04 17:06:54 - slack_bot.dispatcher - INFO - [5da8a9e3] Calling Gemini for initial response...
2026-02-04 17:06:55 - slack_bot.llm.gemini - ERROR - OpenAI API Request Failed: Token error: All accounts failed or unhealthy.
2026-02-04 17:06:55 - slack_bot.llm.gemini - ERROR - Dumped failed payload to /Users/lili/workspace/bulter/debug_failed_payload.json
2026-02-04 17:06:55 - slack_bot.dispatcher - WARNING - [5da8a9e3] Forcing get_metric_history for rhr (2025-12-06 to 2026-02-04, 60 days)
2026-02-04 17:06:55 - slack_bot.dispatcher - INFO - [5da8a9e3] Gemini response in 1.34s: 65 chars, 1 tools
2026-02-04 17:06:55 - slack_bot.dispatcher - INFO - [5da8a9e3] Executing 1 tools
2026-02-04 17:06:55 - slack_bot.dispatcher - INFO - [5da8a9e3] Tool: get_metric_history Args: {'metric_type': 'rhr', 'start_date': '2025-12-06', 'end_date': '2026-02-04'}
2026-02-04 17:06:55 - slack_bot.tools.health_read - INFO - Time range 61 days - using aggregated analysis
2026-02-04 17:06:55 - health.services.query - INFO - Querying rhr from 2025-12-06 to 2026-02-04
2026-02-04 17:06:55 - health.services.query - INFO - Found 58 records for rhr
2026-02-04 17:06:55 - slack_bot.dispatcher - INFO - [5da8a9e3] ✓ get_metric_history finished in 0.05s
2026-02-04 17:06:55 - slack_bot.dispatcher - INFO - [5da8a9e3] Requesting final analysis...
2026-02-04 17:06:56 - slack_bot.llm.gemini - ERROR - OpenAI API Request Failed: Token error: All accounts failed or unhealthy.
2026-02-04 17:06:56 - slack_bot.llm.gemini - ERROR - Dumped failed payload to /Users/lili/workspace/bulter/debug_failed_payload.json
2026-02-04 17:06:56 - slack_bot.dispatcher - INFO - [5da8a9e3] Final analysis received in 1.38s
2026-02-04 17:06:56 - slack_bot.dispatcher - INFO - Formatted text (len 65 -> 65)
2026-02-04 17:06:57 - slack_bot.dispatcher - INFO - [5da8a9e3] 📤 Message updated 1770196014.034149
2026-02-04 17:06:57 - slack_bot.dispatcher - INFO - [5da8a9e3] Dispatch completed in 3.43s
2026-02-04 17:06:57 - __main__ - INFO - [5da8a9e3] ✅ Request completed in 3.95s
2026-02-04 17:14:38 - health.utils.env_loader - INFO - Loading extra configuration from: /Users/lili/workspace/bulter/.gemini.current.env
2026-02-04 17:14:38 - __main__ - INFO - Starting Butler Bot with Gemini model: gemini-3-pro-high
2026-02-04 17:14:39 - slack_bot.llm.gemini - INFO - Using proxy: http://127.0.0.1:8045
2026-02-04 17:14:39 - slack_bot.llm.gemini - INFO - Initialized Gemini model: gemini-3-pro-high
2026-02-04 17:14:39 - slack_bot.dispatcher - INFO - Dispatcher initialized with Gemini
2026-02-04 17:14:39 - __main__ - INFO - ⚡️ Butler (Gemini) is connected to Slack!
⚡️ Bolt app is running!
2026-02-04 17:14:58 - __main__ - INFO - [8af23956] 📥 Received message from U0A8ZCK7RJM in D0AA4GBQRKK: 过去2个月的静息心率变化 (Files: 0)
2026-02-04 17:14:59 - slack_bot.dispatcher - INFO - [8af23956] Processing message in D0AA4GBQRKK from U0A8ZCK7RJM
2026-02-04 17:14:59 - slack_bot.dispatcher - INFO - [8af23956] Calling Gemini for initial response...
2026-02-04 17:15:01 - slack_bot.llm.gemini - ERROR - OpenAI API Request Failed: Token error: All accounts failed or unhealthy.
2026-02-04 17:15:01 - slack_bot.llm.gemini - ERROR - Dumped failed payload to /Users/lili/workspace/bulter/debug_failed_payload.json
2026-02-04 17:15:01 - slack_bot.dispatcher - WARNING - [8af23956] Forcing get_metric_history for rhr (2025-12-06 to 2026-02-04, 60 days)
2026-02-04 17:15:01 - slack_bot.dispatcher - INFO - [8af23956] Gemini response in 1.70s: 65 chars, 1 tools
2026-02-04 17:15:01 - slack_bot.dispatcher - INFO - [8af23956] Executing 1 tools
2026-02-04 17:15:01 - slack_bot.dispatcher - INFO - [8af23956] Tool: get_metric_history Args: {'metric_type': 'rhr', 'start_date': '2025-12-06', 'end_date': '2026-02-04'}
2026-02-04 17:15:01 - slack_bot.tools.health_read - INFO - Time range 61 days - using aggregated analysis
2026-02-04 17:15:01 - health.services.query - INFO - Querying rhr from 2025-12-06 to 2026-02-04
2026-02-04 17:15:01 - health.services.query - INFO - Found 58 records for rhr
2026-02-04 17:15:01 - slack_bot.dispatcher - INFO - [8af23956] ✓ get_metric_history finished in 0.05s
2026-02-04 17:15:01 - slack_bot.dispatcher - INFO - [8af23956] Requesting final analysis...
2026-02-04 17:15:02 - slack_bot.llm.gemini - ERROR - OpenAI API Request Failed: Token error: All accounts failed or unhealthy.
2026-02-04 17:15:02 - slack_bot.llm.gemini - ERROR - Dumped failed payload to /Users/lili/workspace/bulter/debug_failed_payload.json
2026-02-04 17:15:02 - slack_bot.dispatcher - INFO - [8af23956] Final analysis received in 1.30s
2026-02-04 17:15:02 - slack_bot.dispatcher - INFO - Formatted text (len 65 -> 65)
2026-02-04 17:15:03 - slack_bot.dispatcher - INFO - [8af23956] 📤 Message updated 1770196499.459669
2026-02-04 17:15:03 - slack_bot.dispatcher - INFO - [8af23956] Dispatch completed in 3.69s
2026-02-04 17:15:03 - __main__ - INFO - [8af23956] ✅ Request completed in 4.36s
2026-02-04 17:30:53 - __main__ - INFO - [9fb24d5e] 📥 Received message from U0A8ZCK7RJM in D0AA4GBQRKK: 昨天的步数是多少 (Files: 0)
2026-02-04 17:30:53 - slack_bot.dispatcher - INFO - [9fb24d5e] Processing message in D0AA4GBQRKK from U0A8ZCK7RJM
2026-02-04 17:30:53 - slack_bot.dispatcher - INFO - [9fb24d5e] Calling Gemini for initial response...
2026-02-04 17:30:54 - slack_bot.llm.gemini - ERROR - OpenAI API Request Failed: Token error: All accounts failed or unhealthy.
2026-02-04 17:30:54 - slack_bot.llm.gemini - ERROR - Dumped failed payload to /Users/lili/workspace/bulter/debug_failed_payload.json
2026-02-04 17:30:54 - slack_bot.dispatcher - WARNING - [9fb24d5e] Forcing get_metric_history for steps (2026-01-05 to 2026-02-04, 30 days)
2026-02-04 17:30:54 - slack_bot.dispatcher - INFO - [9fb24d5e] Gemini response in 1.36s: 65 chars, 1 tools
2026-02-04 17:30:54 - slack_bot.dispatcher - INFO - [9fb24d5e] Executing 1 tools
2026-02-04 17:30:54 - slack_bot.dispatcher - INFO - [9fb24d5e] Tool: get_metric_history Args: {'metric_type': 'steps', 'start_date': '2026-01-05', 'end_date': '2026-02-04'}
2026-02-04 17:30:54 - slack_bot.tools.health_read - INFO - Time range 31 days - using aggregated analysis
2026-02-04 17:30:54 - health.services.query - INFO - Querying steps from 2026-01-05 to 2026-02-04
2026-02-04 17:30:54 - health.services.query - INFO - Found 28 records for steps
2026-02-04 17:30:54 - slack_bot.dispatcher - INFO - [9fb24d5e] ✓ get_metric_history finished in 0.03s
2026-02-04 17:30:54 - slack_bot.dispatcher - INFO - [9fb24d5e] Requesting final analysis...
2026-02-04 17:30:56 - slack_bot.llm.gemini - ERROR - OpenAI API Request Failed: Token error: All accounts failed or unhealthy.
2026-02-04 17:30:56 - slack_bot.llm.gemini - ERROR - Dumped failed payload to /Users/lili/workspace/bulter/debug_failed_payload.json
2026-02-04 17:30:56 - slack_bot.dispatcher - INFO - [9fb24d5e] Final analysis received in 1.26s
2026-02-04 17:30:56 - slack_bot.dispatcher - INFO - Formatted text (len 65 -> 65)
2026-02-04 17:30:56 - slack_bot.dispatcher - INFO - [9fb24d5e] 📤 Message updated 1770197453.454869
2026-02-04 17:30:56 - slack_bot.dispatcher - INFO - [9fb24d5e] Dispatch completed in 3.16s
2026-02-04 17:30:56 - __main__ - INFO - [9fb24d5e] ✅ Request completed in 3.67s
2026-02-04 17:39:10 - health.utils.env_loader - INFO - Loading extra configuration from: /Users/lili/workspace/bulter/.gemini.current.env
2026-02-04 17:39:10 - __main__ - INFO - Starting Butler Bot with Gemini model: google/gemini-3-flash-preview
2026-02-04 17:39:11 - slack_bot.llm.gemini - INFO - Using OpenRouter: https://openrouter.ai/api
2026-02-04 17:39:11 - slack_bot.llm.gemini - INFO - Initialized Gemini model: google/gemini-3-flash-preview
2026-02-04 17:39:11 - slack_bot.dispatcher - INFO - Dispatcher initialized with Gemini
2026-02-04 17:39:11 - __main__ - INFO - ⚡️ Butler (Gemini) is connected to Slack!
⚡️ Bolt app is running!
2026-02-04 17:40:46 - __main__ - INFO - [066a78ba] 📥 Received message from U0A8ZCK7RJM in D0AA4GBQRKK: 昨天的步数是多少 (Files: 0)
2026-02-04 17:40:47 - slack_bot.dispatcher - INFO - [066a78ba] Processing message in D0AA4GBQRKK from U0A8ZCK7RJM
2026-02-04 17:40:47 - slack_bot.dispatcher - INFO - [066a78ba] Calling Gemini for initial response...
2026-02-04 17:40:50 - slack_bot.dispatcher - WARNING - [066a78ba] Gemini returned empty response_text!
2026-02-04 17:40:50 - slack_bot.dispatcher - INFO - [066a78ba] Gemini response in 2.65s: 0 chars, 1 tools
2026-02-04 17:40:50 - slack_bot.dispatcher - INFO - [066a78ba] Executing 1 tools
2026-02-04 17:40:50 - slack_bot.dispatcher - INFO - [066a78ba] Tool: get_daily_detailed_stats Args: {'target_date': '2026-02-03'}
2026-02-04 17:40:50 - health.services.query - INFO - Querying health data summary for 2026-02-03
2026-02-04 17:40:50 - health.services.query - INFO - Found 12 metrics and 0 activities
2026-02-04 17:40:50 - slack_bot.dispatcher - INFO - [066a78ba] ✓ get_daily_detailed_stats finished in 0.02s
2026-02-04 17:40:50 - slack_bot.dispatcher - INFO - [066a78ba] Requesting final analysis...
2026-02-04 17:40:52 - slack_bot.dispatcher - INFO - [066a78ba] Final analysis received in 2.18s
2026-02-04 17:40:52 - slack_bot.dispatcher - INFO - Formatted text (len 233 -> 225)
2026-02-04 17:40:52 - slack_bot.dispatcher - INFO - [066a78ba] 📤 Message updated 1770198047.455689
2026-02-04 17:40:52 - slack_bot.dispatcher - INFO - [066a78ba] Dispatch completed in 5.39s
2026-02-04 17:40:52 - __main__ - INFO - [066a78ba] ✅ Request completed in 6.08s
2026-02-04 18:04:21 - __main__ - INFO - [429542d1] 📥 Received message from U0A8ZCK7RJM in D0AA4GBQRKK: 过去2个月的静息心率变化 (Files: 0)
2026-02-04 18:04:22 - slack_bot.dispatcher - INFO - [429542d1] Processing message in D0AA4GBQRKK from U0A8ZCK7RJM
2026-02-04 18:04:22 - slack_bot.dispatcher - INFO - [429542d1] Calling Gemini for initial response...
2026-02-04 18:04:25 - slack_bot.dispatcher - WARNING - [429542d1] Gemini returned empty response_text!
2026-02-04 18:04:25 - slack_bot.dispatcher - INFO - [429542d1] Gemini response in 2.92s: 0 chars, 1 tools
2026-02-04 18:04:25 - slack_bot.dispatcher - INFO - [429542d1] Executing 1 tools
2026-02-04 18:04:25 - slack_bot.dispatcher - INFO - [429542d1] Tool: get_aggregated_analysis Args: {'end_date': '2026-02-04', 'metrics': ['rhr'], 'start_date': '2025-12-04'}
2026-02-04 18:04:25 - health.services.query - INFO - Querying rhr from 2025-12-04 to 2026-02-04
2026-02-04 18:04:25 - health.services.query - INFO - Found 60 records for rhr
2026-02-04 18:04:25 - slack_bot.dispatcher - INFO - [429542d1] ✓ get_aggregated_analysis finished in 0.05s
2026-02-04 18:04:25 - slack_bot.dispatcher - INFO - [429542d1] Requesting final analysis...
2026-02-04 18:04:29 - slack_bot.dispatcher - INFO - [429542d1] Final analysis received in 3.41s
2026-02-04 18:04:29 - slack_bot.dispatcher - INFO - Formatted text (len 515 -> 493)
2026-02-04 18:04:29 - slack_bot.dispatcher - INFO - [429542d1] 📤 Message updated 1770199462.675559
2026-02-04 18:04:29 - slack_bot.dispatcher - INFO - [429542d1] Dispatch completed in 6.92s
2026-02-04 18:04:29 - __main__ - INFO - [429542d1] ✅ Request completed in 8.29s
2026-02-04 22:05:29 - __main__ - INFO - [d4ab6d43] 📥 Received message from U0A8ZCK7RJM in D0AA4GBQRKK: 喝酒太多怎么办 (Files: 0)
2026-02-04 22:05:29 - slack_bot.dispatcher - INFO - [d4ab6d43] Processing message in D0AA4GBQRKK from U0A8ZCK7RJM
2026-02-04 22:05:29 - slack_bot.dispatcher - INFO - [d4ab6d43] Calling Gemini for initial response...
2026-02-04 22:05:37 - slack_bot.dispatcher - INFO - [d4ab6d43] Gemini response in 7.44s: 953 chars, 0 tools
2026-02-04 22:05:37 - slack_bot.dispatcher - INFO - Formatted text (len 953 -> 907)
2026-02-04 22:05:37 - slack_bot.dispatcher - INFO - [d4ab6d43] 📤 Message updated 1770213929.785359
2026-02-04 22:05:37 - slack_bot.dispatcher - INFO - [d4ab6d43] Dispatch completed in 8.12s
2026-02-04 22:05:37 - __main__ - INFO - [d4ab6d43] ✅ Request completed in 8.64s
2026-02-04 22:07:16 - __main__ - INFO - [5b20e47f] 📥 Received message from U0A8ZCK7RJM in D0AA4GBQRKK: 甘氨酸镁是否有必要增量服用 (Files: 0)
2026-02-04 22:07:16 - slack_bot.dispatcher - INFO - [5b20e47f] Processing message in D0AA4GBQRKK from U0A8ZCK7RJM
2026-02-04 22:07:16 - slack_bot.dispatcher - INFO - [5b20e47f] Calling Gemini for initial response...
2026-02-04 22:07:25 - slack_bot.dispatcher - INFO - [5b20e47f] Gemini response in 8.15s: 923 chars, 0 tools
2026-02-04 22:07:25 - slack_bot.dispatcher - INFO - Formatted text (len 923 -> 877)
2026-02-04 22:07:25 - slack_bot.dispatcher - INFO - [5b20e47f] 📤 Message updated 1770214036.882269
2026-02-04 22:07:25 - slack_bot.dispatcher - INFO - [5b20e47f] Dispatch completed in 8.77s
2026-02-04 22:07:25 - __main__ - INFO - [5b20e47f] ✅ Request completed in 9.49s
2026-02-05 12:52:46 - health.utils.env_loader - INFO - Loading extra configuration from: /Users/lili/workspace/bulter/.gemini.current.env
2026-02-05 12:52:46 - __main__ - INFO - Starting Butler Bot with Gemini model: gemini-3-pro-high
2026-02-05 12:52:47 - slack_bot.llm.gemini - INFO - Using proxy: http://127.0.0.1:8045
2026-02-05 12:52:47 - slack_bot.llm.gemini - INFO - Initialized Gemini model: gemini-3-pro-high
2026-02-05 12:52:47 - slack_bot.dispatcher - INFO - Dispatcher initialized with Gemini
2026-02-05 12:52:47 - __main__ - INFO - ⚡️ Butler (Gemini) is connected to Slack!
⚡️ Bolt app is running!
2026-02-05 12:56:36 - __main__ - INFO - [2981b564] 📥 Received message from U0A8ZCK7RJM in D0AA4GBQRKK: 昨天的睡眠情况如何 (Files: 0)
2026-02-05 12:56:36 - slack_bot.dispatcher - INFO - [2981b564] Processing message in D0AA4GBQRKK from U0A8ZCK7RJM
2026-02-05 12:56:36 - slack_bot.dispatcher - INFO - [2981b564] Calling Gemini for initial response...
2026-02-05 12:56:57 - slack_bot.dispatcher - WARNING - [2981b564] Forcing get_metric_history for sleep (2026-01-06 to 2026-02-05, 30 days)
2026-02-05 12:56:57 - slack_bot.dispatcher - INFO - [2981b564] Gemini response in 20.63s: 1734 chars, 1 tools
2026-02-05 12:56:57 - slack_bot.dispatcher - INFO - [2981b564] Executing 1 tools
2026-02-05 12:56:57 - slack_bot.dispatcher - INFO - [2981b564] Tool: get_metric_history Args: {'metric_type': 'sleep', 'start_date': '2026-01-06', 'end_date': '2026-02-05'}
2026-02-05 12:56:57 - slack_bot.tools.health_read - INFO - Time range 31 days - using aggregated analysis
2026-02-05 12:56:57 - health.services.query - INFO - Querying sleep from 2026-01-06 to 2026-02-05
2026-02-05 12:56:57 - health.services.query - INFO - Found 27 records for sleep
2026-02-05 12:56:57 - slack_bot.dispatcher - INFO - [2981b564] ✓ get_metric_history finished in 0.08s
2026-02-05 12:56:57 - slack_bot.dispatcher - INFO - [2981b564] Requesting final analysis...
2026-02-05 12:57:16 - slack_bot.dispatcher - INFO - [2981b564] Final analysis received in 18.72s
2026-02-05 12:57:16 - slack_bot.dispatcher - INFO - Formatted text (len 601 -> 575)
2026-02-05 12:57:16 - slack_bot.dispatcher - INFO - [2981b564] 📤 Message updated 1770267396.784029
2026-02-05 12:57:16 - slack_bot.dispatcher - INFO - [2981b564] Dispatch completed in 39.97s
2026-02-05 12:57:16 - __main__ - INFO - [2981b564] ✅ Request completed in 40.60s
2026-02-05 12:59:46 - __main__ - INFO - [fae5112a] 📥 Received message from U0A8ZCK7RJM in D0AA4GBQRKK: 2月5日的睡眠数据呢 (Files: 0)
2026-02-05 12:59:47 - slack_bot.dispatcher - INFO - [fae5112a] Processing message in D0AA4GBQRKK from U0A8ZCK7RJM
2026-02-05 12:59:47 - slack_bot.dispatcher - INFO - [fae5112a] Calling Gemini for initial response...
2026-02-05 13:00:02 - slack_bot.dispatcher - WARNING - [fae5112a] Forcing get_daily_detailed_stats for 2026-02-05
2026-02-05 13:00:02 - slack_bot.dispatcher - INFO - [fae5112a] Gemini response in 14.74s: 1691 chars, 1 tools
2026-02-05 13:00:02 - slack_bot.dispatcher - INFO - [fae5112a] Executing 1 tools
2026-02-05 13:00:02 - slack_bot.dispatcher - INFO - [fae5112a] Tool: get_daily_detailed_stats Args: {'target_date': '2026-02-05'}
2026-02-05 13:00:02 - health.services.query - INFO - Querying health data summary for 2026-02-05
2026-02-05 13:00:02 - health.services.query - INFO - Found 0 metrics and 0 activities
2026-02-05 13:00:02 - slack_bot.tools.health_read - INFO - Data missing for 2026-02-05, attempting auto-sync...
2026-02-05 13:00:02 - health.services.data_sync - INFO - Authenticating with Garmin...
2026-02-05 13:00:02 - health.services.garmin_client - INFO - Authenticating with Garmin Connect China for 350134531@qq.com
2026-02-05 13:00:03 - health.services.garmin_client - INFO - Successfully authenticated with Garmin Connect China
2026-02-05 13:00:03 - health.services.data_sync - INFO - Authentication successful
2026-02-05 13:00:03 - health.services.data_sync - INFO - Syncing 13 metric types from 2026-02-05 to 2026-02-05
2026-02-05 13:00:03 - health.services.data_sync - INFO - Syncing steps from 2026-02-05 to 2026-02-05 (1 days)
2026-02-05 13:00:03 - health.services.data_sync - INFO - ✓ Synced steps for 2026-02-05
2026-02-05 13:00:03 - health.services.data_sync - INFO - steps sync complete: 1 synced, 0 skipped, 0 errors
2026-02-05 13:00:03 - health.services.data_sync - INFO - Syncing heart_rate from 2026-02-05 to 2026-02-05 (1 days)
2026-02-05 13:00:03 - health.services.data_sync - INFO - ✓ Synced heart_rate for 2026-02-05
2026-02-05 13:00:03 - health.services.data_sync - INFO - heart_rate sync complete: 1 synced, 0 skipped, 0 errors
2026-02-05 13:00:03 - health.services.data_sync - INFO - Syncing sleep from 2026-02-05 to 2026-02-05 (1 days)
2026-02-05 13:00:03 - health.services.data_sync - INFO - ✓ Synced sleep for 2026-02-05
2026-02-05 13:00:03 - health.services.data_sync - INFO - sleep sync complete: 1 synced, 0 skipped, 0 errors
2026-02-05 13:00:03 - health.services.data_sync - INFO - Syncing stress from 2026-02-05 to 2026-02-05 (1 days)
2026-02-05 13:00:03 - health.services.data_sync - INFO - ✓ Synced stress for 2026-02-05
2026-02-05 13:00:03 - health.services.data_sync - INFO - stress sync complete: 1 synced, 0 skipped, 0 errors
2026-02-05 13:00:04 - health.services.data_sync - INFO - Syncing body_battery from 2026-02-05 to 2026-02-05 (1 days)
2026-02-05 13:00:04 - health.services.data_sync - INFO - ✓ Synced body_battery for 2026-02-05
2026-02-05 13:00:04 - health.services.data_sync - INFO - body_battery sync complete: 1 synced, 0 skipped, 0 errors
2026-02-05 13:00:04 - health.services.data_sync - INFO - Syncing spo2 from 2026-02-05 to 2026-02-05 (1 days)
2026-02-05 13:00:04 - health.services.data_sync - INFO - ✓ Synced spo2 for 2026-02-05
2026-02-05 13:00:04 - health.services.data_sync - INFO - spo2 sync complete: 1 synced, 0 skipped, 0 errors
2026-02-05 13:00:04 - health.services.data_sync - INFO - Syncing respiration from 2026-02-05 to 2026-02-05 (1 days)
2026-02-05 13:00:04 - health.services.data_sync - INFO - ✓ Synced respiration for 2026-02-05
2026-02-05 13:00:04 - health.services.data_sync - INFO - respiration sync complete: 1 synced, 0 skipped, 0 errors
2026-02-05 13:00:04 - health.services.data_sync - INFO - Syncing hydration from 2026-02-05 to 2026-02-05 (1 days)
2026-02-05 13:00:04 - health.services.data_sync - INFO - ✓ Synced hydration for 2026-02-05
2026-02-05 13:00:04 - health.services.data_sync - INFO - hydration sync complete: 1 synced, 0 skipped, 0 errors
2026-02-05 13:00:04 - health.services.data_sync - INFO - Syncing floors from 2026-02-05 to 2026-02-05 (1 days)
2026-02-05 13:00:04 - health.services.data_sync - INFO - ✓ Synced floors for 2026-02-05
2026-02-05 13:00:04 - health.services.data_sync - INFO - floors sync complete: 1 synced, 0 skipped, 0 errors
2026-02-05 13:00:04 - health.services.data_sync - INFO - Syncing intensity_minutes from 2026-02-05 to 2026-02-05 (1 days)
2026-02-05 13:00:04 - health.services.data_sync - INFO - ✓ Synced intensity_minutes for 2026-02-05
2026-02-05 13:00:04 - health.services.data_sync - INFO - intensity_minutes sync complete: 1 synced, 0 skipped, 0 errors
2026-02-05 13:00:04 - health.services.data_sync - INFO - Syncing hrv from 2026-02-05 to 2026-02-05 (1 days)
2026-02-05 13:00:04 - health.services.data_sync - INFO - ✓ Synced hrv for 2026-02-05
2026-02-05 13:00:04 - health.services.data_sync - INFO - hrv sync complete: 1 synced, 0 skipped, 0 errors
2026-02-05 13:00:04 - health.services.data_sync - INFO - Syncing rhr from 2026-02-05 to 2026-02-05 (1 days)
2026-02-05 13:00:04 - health.services.data_sync - INFO - ✓ Synced rhr for 2026-02-05
2026-02-05 13:00:04 - health.services.data_sync - INFO - rhr sync complete: 1 synced, 0 skipped, 0 errors
2026-02-05 13:00:04 - health.services.data_sync - INFO - Syncing weight from 2026-02-05 to 2026-02-05 (1 days)
2026-02-05 13:00:04 - health.services.data_sync - INFO - weight sync complete: 0 synced, 1 skipped, 0 errors
2026-02-05 13:00:04 - health.services.data_sync - INFO - Syncing activities from 2026-02-05 to 2026-02-05
2026-02-05 13:00:05 - health.services.data_sync - INFO - Found 0 activities
2026-02-05 13:00:05 - health.services.data_sync - INFO - Activity sync complete: 0 synced, 0 skipped, 0 errors
2026-02-05 13:00:05 - health.services.query - INFO - Querying health data summary for 2026-02-05
2026-02-05 13:00:05 - health.services.query - INFO - Found 12 metrics and 0 activities
2026-02-05 13:00:05 - slack_bot.tools.health_read - INFO - Auto-sync completed, re-queried data.
2026-02-05 13:00:05 - slack_bot.dispatcher - INFO - [fae5112a] ✓ get_daily_detailed_stats finished in 2.99s
2026-02-05 13:00:05 - slack_bot.dispatcher - INFO - [fae5112a] Requesting final analysis...
2026-02-05 13:00:21 - slack_bot.dispatcher - INFO - [fae5112a] Final analysis received in 16.66s
2026-02-05 13:00:21 - slack_bot.dispatcher - INFO - Formatted text (len 921 -> 873)
2026-02-05 13:00:22 - slack_bot.dispatcher - INFO - [fae5112a] 📤 Message updated 1770267587.223259
2026-02-05 13:00:22 - slack_bot.dispatcher - INFO - [fae5112a] Dispatch completed in 35.04s
2026-02-05 13:00:22 - __main__ - INFO - [fae5112a] ✅ Request completed in 35.56s
2026-02-05 13:11:30 - health.utils.env_loader - INFO - Loading extra configuration from: /Users/lili/workspace/bulter/.gemini.current.env
2026-02-05 13:11:30 - __main__ - INFO - Starting Butler Bot with Gemini model: gemini-3-pro-high
2026-02-05 13:11:31 - slack_bot.llm.gemini - INFO - Using proxy: http://127.0.0.1:8045
2026-02-05 13:11:31 - slack_bot.llm.gemini - INFO - Initialized Gemini model: gemini-3-pro-high
2026-02-05 13:11:31 - slack_bot.dispatcher - INFO - Dispatcher initialized with Gemini
2026-02-05 13:11:31 - __main__ - INFO - ⚡️ Butler (Gemini) is connected to Slack!
⚡️ Bolt app is running!
2026-02-05 13:11:41 - __main__ - INFO - [a3c491c4] 📥 Received message from U0A8ZCK7RJM in D0AA4GBQRKK: 过去60天的hrv变化 (Files: 0)
2026-02-05 13:11:41 - slack_bot.dispatcher - INFO - [a3c491c4] Processing message in D0AA4GBQRKK from U0A8ZCK7RJM
2026-02-05 13:11:41 - slack_bot.dispatcher - INFO - [a3c491c4] Calling Gemini for initial response...
2026-02-05 13:11:57 - slack_bot.dispatcher - WARNING - [a3c491c4] Forcing get_metric_history for hrv (2025-12-07 to 2026-02-05, 60 days)
2026-02-05 13:11:57 - slack_bot.dispatcher - INFO - [a3c491c4] Gemini response in 16.15s: 1276 chars, 1 tools
2026-02-05 13:11:57 - slack_bot.dispatcher - INFO - [a3c491c4] Executing 1 tools
2026-02-05 13:11:57 - slack_bot.dispatcher - INFO - [a3c491c4] Tool: get_metric_history Args: {'metric_type': 'hrv', 'start_date': '2025-12-07', 'end_date': '2026-02-05'}
2026-02-05 13:11:57 - slack_bot.tools.health_read - INFO - Time range 61 days - using aggregated analysis
2026-02-05 13:11:57 - health.services.query - INFO - Querying hrv from 2025-12-07 to 2026-02-05
2026-02-05 13:11:57 - health.services.query - INFO - Found 58 records for hrv
2026-02-05 13:11:57 - slack_bot.dispatcher - INFO - [a3c491c4] ✓ get_metric_history finished in 0.05s
2026-02-05 13:11:57 - slack_bot.dispatcher - INFO - [a3c491c4] Requesting final analysis...
2026-02-05 13:12:09 - slack_bot.dispatcher - INFO - [a3c491c4] Final analysis received in 11.67s
2026-02-05 13:12:09 - slack_bot.dispatcher - INFO - Formatted text (len 722 -> 722)
2026-02-05 13:12:10 - slack_bot.dispatcher - INFO - [a3c491c4] 📤 Message updated 1770268301.684389
2026-02-05 13:12:10 - slack_bot.dispatcher - INFO - [a3c491c4] Dispatch completed in 28.59s
2026-02-05 13:12:10 - __main__ - INFO - [a3c491c4] ✅ Request completed in 29.12s
2026-02-05 17:18:27 - __main__ - INFO - [2570a96d] 📥 Received message from U0A8ZCK7RJM in D0AA4GBQRKK: 今天中午没有午休，中午吃了两个卤蛋和两勺蛋白粉，早饭没吃，这是好的选择吗 (Files: 0)
2026-02-05 17:18:28 - slack_bot.dispatcher - INFO - [2570a96d] Processing message in D0AA4GBQRKK from U0A8ZCK7RJM
2026-02-05 17:18:28 - slack_bot.dispatcher - INFO - [2570a96d] Calling Gemini for initial response...
2026-02-05 17:18:48 - slack_bot.dispatcher - WARNING - [2570a96d] Forcing get_daily_detailed_stats for 2026-02-05
2026-02-05 17:18:48 - slack_bot.dispatcher - INFO - [2570a96d] Gemini response in 20.35s: 1026 chars, 1 tools
2026-02-05 17:18:48 - slack_bot.dispatcher - INFO - [2570a96d] Executing 1 tools
2026-02-05 17:18:48 - slack_bot.dispatcher - INFO - [2570a96d] Tool: get_daily_detailed_stats Args: {'target_date': '2026-02-05'}
2026-02-05 17:18:48 - health.services.query - INFO - Querying health data summary for 2026-02-05
2026-02-05 17:18:48 - health.services.query - INFO - Found 12 metrics and 0 activities
2026-02-05 17:18:48 - slack_bot.dispatcher - INFO - [2570a96d] ✓ get_daily_detailed_stats finished in 0.03s
2026-02-05 17:18:48 - slack_bot.dispatcher - INFO - [2570a96d] Requesting final analysis...
2026-02-05 17:19:18 - slack_bot.dispatcher - INFO - [2570a96d] Final analysis received in 29.50s
2026-02-05 17:19:18 - slack_bot.dispatcher - INFO - Formatted text (len 1008 -> 968)
2026-02-05 17:19:18 - slack_bot.dispatcher - INFO - [2570a96d] 📤 Message updated 1770283108.099779
2026-02-05 17:19:18 - slack_bot.dispatcher - INFO - [2570a96d] Dispatch completed in 50.46s
2026-02-05 17:19:18 - __main__ - INFO - [2570a96d] ✅ Request completed in 51.07s
2026-02-05 17:33:35 - __main__ - INFO - [ad2e4276] 📥 Received message from U0A8ZCK7RJM in D0AA4GBQRKK: 好的，可以记录 (Files: 0)
2026-02-05 17:33:36 - slack_bot.dispatcher - INFO - [ad2e4276] Processing message in D0AA4GBQRKK from U0A8ZCK7RJM
2026-02-05 17:33:36 - slack_bot.dispatcher - INFO - [ad2e4276] Calling Gemini for initial response...
2026-02-05 17:33:48 - slack_bot.dispatcher - WARNING - [ad2e4276] Gemini returned empty response_text!
2026-02-05 17:33:48 - slack_bot.dispatcher - INFO - [ad2e4276] Gemini response in 12.18s: 0 chars, 0 tools
2026-02-05 17:33:48 - slack_bot.dispatcher - WARNING - No response text and no tool results - returning error message
2026-02-05 17:33:48 - slack_bot.dispatcher - INFO - [ad2e4276] 📤 Message updated 1770284016.038069
2026-02-05 17:33:48 - slack_bot.dispatcher - INFO - [ad2e4276] Dispatch completed in 12.71s
2026-02-05 17:33:48 - __main__ - INFO - [ad2e4276] ✅ Request completed in 13.24s
2026-02-05 20:49:28 - health.utils.env_loader - INFO - Loading extra configuration from: /Users/lili/workspace/bulter/.gemini.current.env
2026-02-05 20:49:28 - __main__ - INFO - Starting Butler Bot with Gemini model: google/gemini-3-flash-preview
2026-02-05 20:49:29 - slack_bot.llm.gemini - INFO - Using OpenRouter: https://openrouter.ai/api
2026-02-05 20:49:29 - slack_bot.llm.gemini - INFO - Initialized Gemini model: google/gemini-3-flash-preview
2026-02-05 20:49:29 - slack_bot.dispatcher - INFO - Dispatcher initialized with Gemini
2026-02-05 20:49:29 - __main__ - INFO - ⚡️ Butler (Gemini) is connected to Slack!
2026-02-05 20:57:53 - health.utils.env_loader - INFO - Loading extra configuration from: /Users/lili/workspace/bulter/.gemini.current.env
2026-02-05 20:57:53 - __main__ - INFO - Starting Butler Bot with Gemini model: gemini-3-flash
2026-02-05 20:57:54 - slack_bot.llm.gemini - INFO - Using proxy: http://127.0.0.1:8045
2026-02-05 20:57:54 - slack_bot.llm.gemini - INFO - Initialized Gemini model: gemini-3-flash
2026-02-05 20:57:54 - slack_bot.dispatcher - INFO - Dispatcher initialized with Gemini
2026-02-05 20:57:54 - __main__ - INFO - ⚡️ Butler (Gemini) is connected to Slack!
⚡️ Bolt app is running!
2026-02-05 20:58:03 - __main__ - INFO - [6e2acc5d] 📥 Received message from U0A8ZCK7RJM in D0AA4GBQRKK: 今晚睡前还什么可以干预的吗 (Files: 0)
2026-02-05 20:58:04 - slack_bot.dispatcher - INFO - [6e2acc5d] Processing message in D0AA4GBQRKK from U0A8ZCK7RJM
2026-02-05 20:58:04 - slack_bot.dispatcher - INFO - [6e2acc5d] Calling Gemini for initial response...
2026-02-05 20:58:15 - slack_bot.dispatcher - INFO - [6e2acc5d] Gemini response in 11.21s: 1142 chars, 0 tools
2026-02-05 20:58:15 - slack_bot.dispatcher - INFO - Formatted text (len 1142 -> 1088)
2026-02-05 20:58:16 - slack_bot.dispatcher - INFO - [6e2acc5d] 📤 Message updated 1770296284.373509
2026-02-05 20:58:16 - slack_bot.dispatcher - INFO - [6e2acc5d] Dispatch completed in 11.75s
2026-02-05 20:58:16 - __main__ - INFO - [6e2acc5d] ✅ Request completed in 12.36s
2026-02-05 20:58:57 - health.utils.env_loader - INFO - Loading extra configuration from: /Users/lili/workspace/bulter/.gemini.current.env
2026-02-05 20:58:57 - __main__ - INFO - Starting Butler Bot with Gemini model: gemini-3-flash
2026-02-05 20:58:58 - slack_bot.llm.gemini - INFO - Using proxy: http://127.0.0.1:8045
2026-02-05 20:58:58 - slack_bot.llm.gemini - INFO - Initialized Gemini model: gemini-3-flash
2026-02-05 20:58:58 - slack_bot.dispatcher - INFO - Dispatcher initialized with Gemini
2026-02-05 20:58:58 - __main__ - INFO - ⚡️ Butler (Gemini) is connected to Slack!
⚡️ Bolt app is running!
2026-02-05 20:59:32 - __main__ - INFO - [ba92be1d] 📥 Received message from U0A8ZCK7RJM in D0AA4GBQRKK: 最近都没有胸闷，我估计以前是断食期间钠流失且没补充为主要原因 (Files: 0)
2026-02-05 20:59:33 - slack_bot.dispatcher - INFO - [ba92be1d] Processing message in D0AA4GBQRKK from U0A8ZCK7RJM
2026-02-05 20:59:33 - slack_bot.dispatcher - INFO - [ba92be1d] Calling Gemini for initial response...
2026-02-05 20:59:44 - slack_bot.dispatcher - INFO - [ba92be1d] Gemini response in 11.55s: 1075 chars, 0 tools
2026-02-05 20:59:44 - slack_bot.dispatcher - INFO - Formatted text (len 1075 -> 1041)
2026-02-05 20:59:45 - slack_bot.dispatcher - INFO - [ba92be1d] 📤 Message updated 1770296373.053139
2026-02-05 20:59:45 - slack_bot.dispatcher - INFO - [ba92be1d] Dispatch completed in 12.21s
2026-02-05 20:59:45 - __main__ - INFO - [ba92be1d] ✅ Request completed in 12.75s
2026-02-05 21:00:38 - __main__ - INFO - [e879de2d] 📥 Received message from U0A8ZCK7RJM in D0AA4GBQRKK: 每日步数最近一年有什么变化趋势 (Files: 0)
2026-02-05 21:00:38 - slack_bot.dispatcher - INFO - [e879de2d] Processing message in D0AA4GBQRKK from U0A8ZCK7RJM
2026-02-05 21:00:38 - slack_bot.dispatcher - INFO - [e879de2d] Calling Gemini for initial response...
2026-02-05 21:00:41 - slack_bot.dispatcher - WARNING - [e879de2d] Gemini returned empty response_text!
2026-02-05 21:00:41 - slack_bot.dispatcher - INFO - [e879de2d] Gemini response in 2.32s: 0 chars, 0 tools
2026-02-05 21:00:41 - slack_bot.dispatcher - WARNING - No response text and no tool results - returning error message
2026-02-05 21:00:41 - slack_bot.dispatcher - INFO - [e879de2d] 📤 Message updated 1770296438.762829
2026-02-05 21:00:41 - slack_bot.dispatcher - INFO - [e879de2d] Dispatch completed in 3.04s
2026-02-05 21:00:41 - __main__ - INFO - [e879de2d] ✅ Request completed in 3.52s
2026-02-05 21:01:23 - __main__ - INFO - [5c6fd212] 📥 Received message from U0A8ZCK7RJM in D0AA4GBQRKK: 每日步数最近一年有什么变化趋势 (Files: 0)
2026-02-05 21:01:24 - slack_bot.dispatcher - INFO - [5c6fd212] Processing message in D0AA4GBQRKK from U0A8ZCK7RJM
2026-02-05 21:01:24 - slack_bot.dispatcher - INFO - [5c6fd212] Calling Gemini for initial response...
2026-02-05 21:01:26 - slack_bot.dispatcher - WARNING - [5c6fd212] Gemini returned empty response_text!
2026-02-05 21:01:26 - slack_bot.dispatcher - INFO - [5c6fd212] Gemini response in 2.45s: 0 chars, 0 tools
2026-02-05 21:01:26 - slack_bot.dispatcher - WARNING - No response text and no tool results - returning error message
2026-02-05 21:01:27 - slack_bot.dispatcher - INFO - [5c6fd212] 📤 Message updated 1770296484.303889
2026-02-05 21:01:27 - slack_bot.dispatcher - INFO - [5c6fd212] Dispatch completed in 2.96s
2026-02-05 21:01:27 - __main__ - INFO - [5c6fd212] ✅ Request completed in 3.49s
2026-02-05 21:06:08 - health.utils.env_loader - INFO - Loading extra configuration from: /Users/lili/workspace/bulter/.gemini.current.env
2026-02-05 21:06:08 - __main__ - INFO - Starting Butler Bot with Gemini model: gemini-3-flash
2026-02-05 21:06:09 - slack_bot.llm.gemini - INFO - Using proxy: http://127.0.0.1:8045
2026-02-05 21:06:09 - slack_bot.llm.gemini - INFO - Initialized Gemini model: gemini-3-flash
2026-02-05 21:06:09 - slack_bot.dispatcher - INFO - Dispatcher initialized with Gemini
2026-02-05 21:06:09 - __main__ - INFO - ⚡️ Butler (Gemini) is connected to Slack!
⚡️ Bolt app is running!
2026-02-05 21:06:15 - __main__ - INFO - [d41751ee] 📥 Received message from U0A8ZCK7RJM in D0AA4GBQRKK: 每日步数最近一年有什么变化趋势 (Files: 0)
2026-02-05 21:06:15 - slack_bot.dispatcher - INFO - [d41751ee] Processing message in D0AA4GBQRKK from U0A8ZCK7RJM
2026-02-05 21:06:15 - slack_bot.dispatcher - INFO - [d41751ee] Calling Gemini for initial response...
2026-02-05 21:06:18 - slack_bot.dispatcher - WARNING - [d41751ee] Gemini returned empty response_text!
2026-02-05 21:06:18 - slack_bot.dispatcher - INFO - [d41751ee] Gemini response in 2.69s: 0 chars, 0 tools
2026-02-05 21:06:18 - slack_bot.dispatcher - WARNING - No response text and no tool results - returning error message
2026-02-05 21:06:19 - slack_bot.dispatcher - INFO - [d41751ee] 📤 Message updated 1770296775.538239
2026-02-05 21:06:19 - slack_bot.dispatcher - INFO - [d41751ee] Dispatch completed in 3.53s
2026-02-05 21:06:19 - __main__ - INFO - [d41751ee] ✅ Request completed in 4.02s
2026-02-05 21:06:40 - health.utils.env_loader - INFO - Loading extra configuration from: /Users/lili/workspace/bulter/.gemini.current.env
2026-02-05 21:06:40 - __main__ - INFO - Starting Butler Bot with Gemini model: google/gemini-3-flash-preview
2026-02-05 21:06:41 - slack_bot.llm.gemini - INFO - Using OpenRouter: https://openrouter.ai/api
2026-02-05 21:06:41 - slack_bot.llm.gemini - INFO - Initialized Gemini model: google/gemini-3-flash-preview
2026-02-05 21:06:41 - slack_bot.dispatcher - INFO - Dispatcher initialized with Gemini
2026-02-05 21:06:41 - __main__ - INFO - ⚡️ Butler (Gemini) is connected to Slack!
⚡️ Bolt app is running!
2026-02-05 21:06:48 - __main__ - INFO - [9d8e5505] 📥 Received message from U0A8ZCK7RJM in D0AA4GBQRKK: 每日步数最近一年有什么变化趋势 (Files: 0)
2026-02-05 21:06:48 - slack_bot.dispatcher - INFO - [9d8e5505] Processing message in D0AA4GBQRKK from U0A8ZCK7RJM
2026-02-05 21:06:48 - slack_bot.dispatcher - INFO - [9d8e5505] Calling Gemini for initial response...
2026-02-05 21:06:51 - slack_bot.dispatcher - WARNING - [9d8e5505] Gemini returned empty response_text!
2026-02-05 21:06:51 - slack_bot.dispatcher - INFO - [9d8e5505] Gemini response in 2.68s: 0 chars, 1 tools
2026-02-05 21:06:51 - slack_bot.dispatcher - INFO - [9d8e5505] Executing 1 tools
2026-02-05 21:06:51 - slack_bot.dispatcher - INFO - [9d8e5505] Tool: get_aggregated_analysis Args: {'start_date': '2025-02-05', 'metrics': ['steps']}
2026-02-05 21:06:51 - health.services.query - INFO - Querying steps from 2025-02-05 to 2026-02-05
2026-02-05 21:06:51 - health.services.query - INFO - Found 363 records for steps
2026-02-05 21:06:51 - slack_bot.dispatcher - INFO - [9d8e5505] ✓ get_aggregated_analysis finished in 0.22s
2026-02-05 21:06:51 - slack_bot.dispatcher - INFO - [9d8e5505] Requesting final analysis...
2026-02-05 21:07:18 - slack_bot.dispatcher - INFO - [9d8e5505] Final analysis received in 26.43s
2026-02-05 21:07:18 - slack_bot.dispatcher - INFO - Formatted text (len 603 -> 577)
2026-02-05 21:07:18 - slack_bot.dispatcher - INFO - [9d8e5505] 📤 Message updated 1770296808.711549
2026-02-05 21:07:18 - slack_bot.dispatcher - INFO - [9d8e5505] Dispatch completed in 29.82s
2026-02-05 21:07:18 - __main__ - INFO - [9d8e5505] ✅ Request completed in 30.37s
2026-02-05 21:44:13 - __main__ - INFO - [1ceacf1b] 📥 Received message from U0A8ZCK7RJM in D0AA4GBQRKK: 玩电子游戏对健康的影响是怎么样的 (Files: 0)
2026-02-05 21:44:14 - slack_bot.dispatcher - INFO - [1ceacf1b] Processing message in D0AA4GBQRKK from U0A8ZCK7RJM
2026-02-05 21:44:14 - slack_bot.dispatcher - INFO - [1ceacf1b] Calling Gemini for initial response...
2026-02-05 21:44:19 - slack_bot.dispatcher - WARNING - [1ceacf1b] Gemini returned empty response_text!
2026-02-05 21:44:19 - slack_bot.dispatcher - INFO - [1ceacf1b] Gemini response in 5.51s: 0 chars, 1 tools
2026-02-05 21:44:19 - slack_bot.dispatcher - INFO - [1ceacf1b] Executing 1 tools
2026-02-05 21:44:19 - slack_bot.dispatcher - INFO - [1ceacf1b] Tool: search_web Args: {'query': 'impact of electronic games on health pros and cons biohacking perspective'}
2026-02-05 21:44:19 - slack_bot.tools.web - INFO - Searching web for: impact of electronic games on health pros and cons biohacking perspective
/Users/lili/workspace/bulter/slack_bot/tools/web.py:27: RuntimeWarning: This package (`duckduckgo_search`) has been renamed to `ddgs`! Use `pip install ddgs` instead.
  results = DDGS().text(query, max_results=max_results)
2026-02-05 21:44:20 - slack_bot.dispatcher - INFO - [1ceacf1b] ✓ search_web finished in 0.42s
2026-02-05 21:44:20 - slack_bot.dispatcher - INFO - [1ceacf1b] Requesting final analysis...
2026-02-05 21:44:32 - slack_bot.dispatcher - INFO - [1ceacf1b] Final analysis received in 12.84s
2026-02-05 21:44:32 - slack_bot.dispatcher - INFO - Formatted text (len 955 -> 915)
2026-02-05 21:44:33 - slack_bot.dispatcher - INFO - [1ceacf1b] 📤 Message updated 1770299053.959449
2026-02-05 21:44:33 - slack_bot.dispatcher - INFO - [1ceacf1b] Dispatch completed in 19.40s
2026-02-05 21:44:33 - __main__ - INFO - [1ceacf1b] ✅ Request completed in 19.93s
2026-02-06 09:57:30 - health.utils.env_loader - INFO - Loading extra configuration from: /Users/lili/workspace/bulter/.gemini.current.env
2026-02-06 09:57:30 - __main__ - INFO - Starting Butler Bot with Gemini model: gemini-3-flash
2026-02-06 09:57:31 - slack_bot.llm.gemini - INFO - Using proxy: http://127.0.0.1:8045
2026-02-06 09:57:31 - slack_bot.llm.gemini - INFO - Initialized Gemini model: gemini-3-flash
2026-02-06 09:57:31 - slack_bot.dispatcher - INFO - Dispatcher initialized with Gemini
2026-02-06 09:57:31 - __main__ - INFO - ⚡️ Butler (Gemini) is connected to Slack!
⚡️ Bolt app is running!
2026-02-06 10:00:44 - __main__ - INFO - [5da7fdac] 📥 Received message from U0A8ZCK7RJM in D0AA4GBQRKK: 昨晚睡眠情况如何 (Files: 0)
2026-02-06 10:00:44 - slack_bot.dispatcher - INFO - [5da7fdac] Processing message in D0AA4GBQRKK from U0A8ZCK7RJM
2026-02-06 10:00:44 - slack_bot.dispatcher - INFO - [5da7fdac] Calling Gemini for initial response...
2026-02-06 10:00:48 - slack_bot.dispatcher - WARNING - [5da7fdac] Gemini returned empty response_text!
2026-02-06 10:00:48 - slack_bot.dispatcher - INFO - [5da7fdac] Gemini response in 3.27s: 0 chars, 0 tools
2026-02-06 10:00:48 - slack_bot.dispatcher - WARNING - No response text and no tool results - returning error message
2026-02-06 10:00:48 - slack_bot.dispatcher - INFO - [5da7fdac] 📤 Message updated 1770343244.690379
2026-02-06 10:00:48 - slack_bot.dispatcher - INFO - [5da7fdac] Dispatch completed in 3.82s
2026-02-06 10:00:48 - __main__ - INFO - [5da7fdac] ✅ Request completed in 4.31s
2026-02-06 10:22:46 - health.utils.env_loader - INFO - Loading extra configuration from: /Users/lili/workspace/bulter/.gemini.current.env
2026-02-06 10:22:46 - __main__ - INFO - Starting Butler Bot with Gemini model: gemini-3-flash
2026-02-06 10:22:47 - slack_bot.llm.gemini - INFO - Using proxy: http://127.0.0.1:8045
2026-02-06 10:22:47 - slack_bot.llm.gemini - INFO - Initialized Gemini model: gemini-3-flash
2026-02-06 10:22:47 - slack_bot.dispatcher - INFO - Dispatcher initialized with Gemini
2026-02-06 10:22:47 - __main__ - INFO - ⚡️ Butler (Gemini) is connected to Slack!
⚡️ Bolt app is running!
2026-02-06 10:51:02 - slack_bot.context.storage - INFO - Cleared context for D0AA4GBQRKK
2026-02-06 10:51:02 - __main__ - INFO - ✅ Context cleared for channel D0AA4GBQRKK (removed 40 messages)
2026-02-06 10:51:09 - __main__ - INFO - [d9defb82] 📥 Received message from U0A8ZCK7RJM in D0AA4GBQRKK: 昨晚睡眠情况如何 (Files: 0)
2026-02-06 10:51:10 - slack_bot.dispatcher - INFO - [d9defb82] Processing message in D0AA4GBQRKK from U0A8ZCK7RJM
2026-02-06 10:51:10 - slack_bot.dispatcher - INFO - [d9defb82] Calling Gemini for initial response...
2026-02-06 10:51:13 - slack_bot.dispatcher - WARNING - [d9defb82] Gemini returned empty response_text!
2026-02-06 10:51:13 - slack_bot.dispatcher - INFO - [d9defb82] Gemini response in 3.56s: 0 chars, 0 tools
2026-02-06 10:51:13 - slack_bot.dispatcher - WARNING - No response text and no tool results - returning error message
2026-02-06 10:51:14 - slack_bot.dispatcher - INFO - [d9defb82] 📤 Message updated 1770346270.357069
2026-02-06 10:51:14 - slack_bot.dispatcher - INFO - [d9defb82] Dispatch completed in 4.04s
2026-02-06 10:51:14 - __main__ - INFO - [d9defb82] ✅ Request completed in 4.56s
2026-02-06 10:52:36 - __main__ - INFO - Context stats for D0AA4GBQRKK: 2 messages, ~43 tokens
2026-02-06 11:09:27 - __main__ - INFO - [86875832] 📥 Received message from U0A8ZCK7RJM in D0AA4GBQRKK: 高碳水饮食的危害有哪些 (Files: 0)
2026-02-06 11:09:28 - slack_bot.dispatcher - INFO - [86875832] Processing message in D0AA4GBQRKK from U0A8ZCK7RJM
2026-02-06 11:09:28 - slack_bot.dispatcher - INFO - [86875832] Calling Gemini for initial response...
2026-02-06 11:09:32 - slack_bot.dispatcher - WARNING - [86875832] Gemini returned empty response_text!
2026-02-06 11:09:32 - slack_bot.dispatcher - INFO - [86875832] Gemini response in 4.21s: 0 chars, 0 tools
2026-02-06 11:09:32 - slack_bot.dispatcher - WARNING - No response text and no tool results - returning error message
2026-02-06 11:09:33 - slack_bot.dispatcher - INFO - [86875832] 📤 Message updated 1770347368.290809
2026-02-06 11:09:33 - slack_bot.dispatcher - INFO - [86875832] Dispatch completed in 4.74s
2026-02-06 11:09:33 - __main__ - INFO - [86875832] ✅ Request completed in 5.35s
2026-02-06 11:34:43 - health.utils.env_loader - INFO - Loading extra configuration from: /Users/lili/workspace/bulter/.gemini.current.env
2026-02-06 11:34:43 - __main__ - INFO - Starting Butler Bot with Gemini model: gemini-3-flash
2026-02-06 11:34:44 - slack_bot.llm.gemini - INFO - Using proxy: http://127.0.0.1:8045
2026-02-06 11:34:44 - slack_bot.llm.gemini - INFO - Initialized Gemini model: gemini-3-flash
2026-02-06 11:34:44 - slack_bot.dispatcher - INFO - Using tool preset: light (5 tools)
2026-02-06 11:34:44 - slack_bot.dispatcher - INFO - Dispatcher initialized with Gemini
2026-02-06 11:34:44 - __main__ - INFO - Dispatcher initialized in 'light' mode
2026-02-06 11:34:44 - __main__ - INFO - ⚡️ Butler (Gemini) is connected to Slack!
⚡️ Bolt app is running!
2026-02-06 11:34:55 - __main__ - INFO - [20ef2320] 📥 Received message from U0A8ZCK7RJM in D0AA4GBQRKK: 昨晚睡眠情况如何 (Files: 0)
2026-02-06 11:34:56 - slack_bot.dispatcher - INFO - [20ef2320] Processing message in D0AA4GBQRKK from U0A8ZCK7RJM
2026-02-06 11:34:56 - slack_bot.dispatcher - INFO - [20ef2320] Calling Gemini for initial response...
2026-02-06 11:34:59 - slack_bot.dispatcher - WARNING - [20ef2320] Gemini returned empty response_text!
2026-02-06 11:34:59 - slack_bot.dispatcher - WARNING - [20ef2320] Forcing get_daily_detailed_stats for 2026-02-05
2026-02-06 11:34:59 - slack_bot.dispatcher - INFO - [20ef2320] Gemini response in 2.88s: 0 chars, 1 tools
2026-02-06 11:34:59 - slack_bot.dispatcher - INFO - [20ef2320] Executing 1 tools
2026-02-06 11:34:59 - slack_bot.dispatcher - INFO - [20ef2320] Tool: get_daily_detailed_stats Args: {'target_date': '2026-02-05'}
2026-02-06 11:34:59 - health.services.query - INFO - Querying health data summary for 2026-02-05
2026-02-06 11:34:59 - health.services.query - INFO - Found 12 metrics and 0 activities
2026-02-06 11:34:59 - slack_bot.dispatcher - INFO - [20ef2320] ✓ get_daily_detailed_stats finished in 0.02s
2026-02-06 11:34:59 - slack_bot.dispatcher - INFO - [20ef2320] Requesting final analysis...
2026-02-06 11:35:11 - slack_bot.dispatcher - INFO - [20ef2320] Final analysis received in 12.22s
2026-02-06 11:35:11 - slack_bot.dispatcher - INFO - Formatted text (len 958 -> 934)
2026-02-06 11:35:12 - slack_bot.dispatcher - INFO - [20ef2320] 📤 Message updated 1770348896.421219
2026-02-06 11:35:12 - slack_bot.dispatcher - INFO - [20ef2320] Dispatch completed in 15.70s
2026-02-06 11:35:12 - __main__ - INFO - [20ef2320] ✅ Request completed in 16.26s
2026-02-06 11:36:03 - __main__ - INFO - [6d63bfc6] 📥 Received message from U0A8ZCK7RJM in D0AA4GBQRKK: 今天上午的运动数据分析一下 (Files: 0)
2026-02-06 11:36:03 - slack_bot.dispatcher - INFO - [6d63bfc6] Processing message in D0AA4GBQRKK from U0A8ZCK7RJM
2026-02-06 11:36:03 - slack_bot.dispatcher - INFO - [6d63bfc6] Calling Gemini for initial response...
2026-02-06 11:36:06 - slack_bot.dispatcher - WARNING - [6d63bfc6] Gemini returned empty response_text!
2026-02-06 11:36:06 - slack_bot.dispatcher - WARNING - [6d63bfc6] Forcing get_activity_history for 2026-02-06
2026-02-06 11:36:06 - slack_bot.dispatcher - INFO - [6d63bfc6] Gemini response in 2.90s: 0 chars, 1 tools
2026-02-06 11:36:06 - slack_bot.dispatcher - INFO - [6d63bfc6] Executing 1 tools
2026-02-06 11:36:06 - slack_bot.dispatcher - INFO - [6d63bfc6] Tool: get_activity_history Args: {'start_date': '2026-02-06', 'end_date': '2026-02-06'}
2026-02-06 11:36:06 - slack_bot.dispatcher - WARNING - [6d63bfc6] Unknown tool: get_activity_history
2026-02-06 11:36:06 - slack_bot.dispatcher - INFO - [6d63bfc6] Requesting final analysis...
2026-02-06 11:36:10 - slack_bot.dispatcher - INFO - [6d63bfc6] Final analysis received in 3.44s
2026-02-06 11:36:10 - slack_bot.dispatcher - INFO - Formatted text (len 34 -> 34)
2026-02-06 11:36:10 - slack_bot.dispatcher - INFO - [6d63bfc6] 📤 Message updated 1770348963.833439
2026-02-06 11:36:10 - slack_bot.dispatcher - INFO - [6d63bfc6] Dispatch completed in 6.97s
2026-02-06 11:36:10 - __main__ - INFO - [6d63bfc6] ✅ Request completed in 7.55s
2026-02-06 11:37:00 - __main__ - INFO - [aa7eb54e] 📥 Received message from U0A8ZCK7RJM in D0AA4GBQRKK: 高碳水饮食的危害有哪些 (Files: 0)
2026-02-06 11:37:00 - slack_bot.dispatcher - INFO - [aa7eb54e] Processing message in D0AA4GBQRKK from U0A8ZCK7RJM
2026-02-06 11:37:00 - slack_bot.dispatcher - INFO - [aa7eb54e] Calling Gemini for initial response...
2026-02-06 11:37:02 - slack_bot.dispatcher - WARNING - [aa7eb54e] Gemini returned empty response_text!
2026-02-06 11:37:02 - slack_bot.dispatcher - INFO - [aa7eb54e] Gemini response in 2.11s: 0 chars, 0 tools
2026-02-06 11:37:02 - slack_bot.dispatcher - WARNING - No response text and no tool results - returning error message
2026-02-06 11:37:03 - slack_bot.dispatcher - INFO - [aa7eb54e] 📤 Message updated 1770349020.481539
2026-02-06 11:37:03 - slack_bot.dispatcher - INFO - [aa7eb54e] Dispatch completed in 2.66s
2026-02-06 11:37:03 - __main__ - INFO - [aa7eb54e] ✅ Request completed in 3.22s
2026-02-06 11:50:58 - health.utils.env_loader - INFO - Loading extra configuration from: /Users/lili/workspace/bulter/.gemini.current.env
2026-02-06 11:50:58 - __main__ - INFO - Starting Butler Bot with Gemini model: google/gemini-3-flash-preview
2026-02-06 11:50:59 - slack_bot.llm.gemini - INFO - Using OpenRouter: https://openrouter.ai/api
2026-02-06 11:50:59 - slack_bot.llm.gemini - INFO - Initialized Gemini model: google/gemini-3-flash-preview
2026-02-06 11:50:59 - slack_bot.dispatcher - INFO - Using tool preset: light (5 tools)
2026-02-06 11:50:59 - slack_bot.dispatcher - INFO - Dispatcher initialized with Gemini
2026-02-06 11:50:59 - __main__ - INFO - Dispatcher initialized in 'light' mode
2026-02-06 11:50:59 - __main__ - INFO - ⚡️ Butler (Gemini) is connected to Slack!
⚡️ Bolt app is running!
2026-02-06 11:51:20 - __main__ - INFO - [d327a027] 📥 Received message from U0A8ZCK7RJM in D0AA4GBQRKK: 今天上午的运动数据分析一下 (Files: 0)
2026-02-06 11:51:21 - slack_bot.dispatcher - INFO - [d327a027] Processing message in D0AA4GBQRKK from U0A8ZCK7RJM
2026-02-06 11:51:21 - slack_bot.dispatcher - INFO - [d327a027] Calling Gemini for initial response...
2026-02-06 11:51:23 - slack_bot.dispatcher - WARNING - [d327a027] Gemini returned empty response_text!
2026-02-06 11:51:23 - slack_bot.dispatcher - INFO - [d327a027] Gemini response in 2.21s: 0 chars, 1 tools
2026-02-06 11:51:23 - slack_bot.dispatcher - INFO - [d327a027] Executing 1 tools
2026-02-06 11:51:23 - slack_bot.dispatcher - INFO - [d327a027] Tool: get_daily_detailed_stats Args: {'target_date': '2026-02-06'}
2026-02-06 11:51:23 - health.services.query - INFO - Querying health data summary for 2026-02-06
2026-02-06 11:51:23 - health.services.query - INFO - Found 0 metrics and 0 activities
2026-02-06 11:51:23 - slack_bot.tools.health_read - INFO - Data missing for 2026-02-06, attempting auto-sync...
2026-02-06 11:51:23 - health.services.data_sync - INFO - Authenticating with Garmin...
2026-02-06 11:51:23 - health.services.garmin_client - INFO - Authenticating with Garmin Connect China for 350134531@qq.com
2026-02-06 11:51:24 - health.services.garmin_client - INFO - Successfully authenticated with Garmin Connect China
2026-02-06 11:51:24 - health.services.data_sync - INFO - Authentication successful
2026-02-06 11:51:24 - health.services.data_sync - INFO - Syncing 13 metric types from 2026-02-06 to 2026-02-06
2026-02-06 11:51:24 - health.services.data_sync - INFO - Syncing steps from 2026-02-06 to 2026-02-06 (1 days)
2026-02-06 11:51:24 - health.services.data_sync - INFO - ✓ Synced steps for 2026-02-06
2026-02-06 11:51:24 - health.services.data_sync - INFO - steps sync complete: 1 synced, 0 skipped, 0 errors
2026-02-06 11:51:24 - health.services.data_sync - INFO - Syncing heart_rate from 2026-02-06 to 2026-02-06 (1 days)
2026-02-06 11:51:24 - health.services.data_sync - INFO - ✓ Synced heart_rate for 2026-02-06
2026-02-06 11:51:24 - health.services.data_sync - INFO - heart_rate sync complete: 1 synced, 0 skipped, 0 errors
2026-02-06 11:51:24 - health.services.data_sync - INFO - Syncing sleep from 2026-02-06 to 2026-02-06 (1 days)
2026-02-06 11:51:25 - health.services.data_sync - INFO - ✓ Synced sleep for 2026-02-06
2026-02-06 11:51:25 - health.services.data_sync - INFO - sleep sync complete: 1 synced, 0 skipped, 0 errors
2026-02-06 11:51:25 - health.services.data_sync - INFO - Syncing stress from 2026-02-06 to 2026-02-06 (1 days)
2026-02-06 11:51:25 - health.services.data_sync - INFO - ✓ Synced stress for 2026-02-06
2026-02-06 11:51:25 - health.services.data_sync - INFO - stress sync complete: 1 synced, 0 skipped, 0 errors
2026-02-06 11:51:25 - health.services.data_sync - INFO - Syncing body_battery from 2026-02-06 to 2026-02-06 (1 days)
2026-02-06 11:51:25 - health.services.data_sync - INFO - ✓ Synced body_battery for 2026-02-06
2026-02-06 11:51:25 - health.services.data_sync - INFO - body_battery sync complete: 1 synced, 0 skipped, 0 errors
2026-02-06 11:51:25 - health.services.data_sync - INFO - Syncing spo2 from 2026-02-06 to 2026-02-06 (1 days)
2026-02-06 11:51:25 - health.services.data_sync - INFO - ✓ Synced spo2 for 2026-02-06
2026-02-06 11:51:25 - health.services.data_sync - INFO - spo2 sync complete: 1 synced, 0 skipped, 0 errors
2026-02-06 11:51:25 - health.services.data_sync - INFO - Syncing respiration from 2026-02-06 to 2026-02-06 (1 days)
2026-02-06 11:51:25 - health.services.data_sync - INFO - ✓ Synced respiration for 2026-02-06
2026-02-06 11:51:25 - health.services.data_sync - INFO - respiration sync complete: 1 synced, 0 skipped, 0 errors
2026-02-06 11:51:25 - health.services.data_sync - INFO - Syncing hydration from 2026-02-06 to 2026-02-06 (1 days)
2026-02-06 11:51:25 - health.services.data_sync - INFO - ✓ Synced hydration for 2026-02-06
2026-02-06 11:51:25 - health.services.data_sync - INFO - hydration sync complete: 1 synced, 0 skipped, 0 errors
2026-02-06 11:51:25 - health.services.data_sync - INFO - Syncing floors from 2026-02-06 to 2026-02-06 (1 days)
2026-02-06 11:51:25 - health.services.data_sync - INFO - ✓ Synced floors for 2026-02-06
2026-02-06 11:51:25 - health.services.data_sync - INFO - floors sync complete: 1 synced, 0 skipped, 0 errors
2026-02-06 11:51:25 - health.services.data_sync - INFO - Syncing intensity_minutes from 2026-02-06 to 2026-02-06 (1 days)
2026-02-06 11:51:25 - health.services.data_sync - INFO - ✓ Synced intensity_minutes for 2026-02-06
2026-02-06 11:51:25 - health.services.data_sync - INFO - intensity_minutes sync complete: 1 synced, 0 skipped, 0 errors
2026-02-06 11:51:25 - health.services.data_sync - INFO - Syncing hrv from 2026-02-06 to 2026-02-06 (1 days)
2026-02-06 11:51:25 - health.services.data_sync - INFO - ✓ Synced hrv for 2026-02-06
2026-02-06 11:51:25 - health.services.data_sync - INFO - hrv sync complete: 1 synced, 0 skipped, 0 errors
2026-02-06 11:51:25 - health.services.data_sync - INFO - Syncing rhr from 2026-02-06 to 2026-02-06 (1 days)
2026-02-06 11:51:25 - health.services.data_sync - INFO - ✓ Synced rhr for 2026-02-06
2026-02-06 11:51:25 - health.services.data_sync - INFO - rhr sync complete: 1 synced, 0 skipped, 0 errors
2026-02-06 11:51:25 - health.services.data_sync - INFO - Syncing weight from 2026-02-06 to 2026-02-06 (1 days)
2026-02-06 11:51:25 - health.services.data_sync - INFO - weight sync complete: 0 synced, 1 skipped, 0 errors
2026-02-06 11:51:25 - health.services.data_sync - INFO - Syncing activities from 2026-02-06 to 2026-02-06
2026-02-06 11:51:26 - health.services.garmin_client - INFO - Fetched 1 activities
2026-02-06 11:51:26 - health.services.data_sync - INFO - Found 1 activities
2026-02-06 11:51:26 - health.services.data_sync - INFO - ✓ Synced activity 563640738 (elliptical) on 2026-02-06
2026-02-06 11:51:26 - health.services.data_sync - INFO - Activity sync complete: 1 synced, 0 skipped, 0 errors
2026-02-06 11:51:26 - health.services.query - INFO - Querying health data summary for 2026-02-06
2026-02-06 11:51:26 - health.services.query - INFO - Found 12 metrics and 1 activities
2026-02-06 11:51:26 - slack_bot.tools.health_read - INFO - Auto-sync completed, re-queried data.
2026-02-06 11:51:26 - slack_bot.dispatcher - INFO - [d327a027] ✓ get_daily_detailed_stats finished in 2.63s
2026-02-06 11:51:26 - slack_bot.dispatcher - INFO - [d327a027] Requesting final analysis...
2026-02-06 11:51:30 - slack_bot.dispatcher - INFO - [d327a027] Final analysis received in 4.38s
2026-02-06 11:51:30 - slack_bot.dispatcher - INFO - Formatted text (len 778 -> 722)
2026-02-06 11:51:31 - slack_bot.dispatcher - INFO - [d327a027] 📤 Message updated 1770349881.284859
2026-02-06 11:51:31 - slack_bot.dispatcher - INFO - [d327a027] Dispatch completed in 9.74s
2026-02-06 11:51:31 - __main__ - INFO - [d327a027] ✅ Request completed in 10.24s
2026-02-06 11:52:42 - __main__ - INFO - [a9ad4ef1] 📥 Received message from U0A8ZCK7RJM in D0AA4GBQRKK: 好的，我喝了600ml水，没吃早饭到现在，中午怎么补充营养 (Files: 0)
2026-02-06 11:52:42 - slack_bot.dispatcher - INFO - [a9ad4ef1] Processing message in D0AA4GBQRKK from U0A8ZCK7RJM
2026-02-06 11:52:42 - slack_bot.dispatcher - INFO - [a9ad4ef1] Calling Gemini for initial response...
2026-02-06 11:52:44 - slack_bot.dispatcher - WARNING - [a9ad4ef1] Gemini returned empty response_text!
2026-02-06 11:52:44 - slack_bot.dispatcher - INFO - [a9ad4ef1] Gemini response in 2.27s: 0 chars, 1 tools
2026-02-06 11:52:44 - slack_bot.dispatcher - INFO - [a9ad4ef1] Executing 1 tools
2026-02-06 11:52:44 - slack_bot.dispatcher - INFO - [a9ad4ef1] Tool: get_manual_history Args: {'end_date': '2026-02-06', 'start_date': '2026-02-02'}
2026-02-06 11:52:44 - slack_bot.dispatcher - WARNING - [a9ad4ef1] Unknown tool: get_manual_history
2026-02-06 11:52:44 - slack_bot.dispatcher - INFO - [a9ad4ef1] Requesting final analysis...
2026-02-06 11:52:49 - slack_bot.dispatcher - INFO - [a9ad4ef1] Final analysis received in 4.52s
2026-02-06 11:52:49 - slack_bot.dispatcher - INFO - Formatted text (len 726 -> 688)
2026-02-06 11:52:49 - slack_bot.dispatcher - INFO - [a9ad4ef1] 📤 Message updated 1770349962.569369
2026-02-06 11:52:49 - slack_bot.dispatcher - INFO - [a9ad4ef1] Dispatch completed in 7.31s
2026-02-06 11:52:49 - __main__ - INFO - [a9ad4ef1] ✅ Request completed in 7.77s
2026-02-06 11:52:59 - __main__ - INFO - [159310c6] 📥 Received message from U0A8ZCK7RJM in D0AA4GBQRKK: 好的，记录 (Files: 0)
2026-02-06 11:53:00 - slack_bot.dispatcher - INFO - [159310c6] Processing message in D0AA4GBQRKK from U0A8ZCK7RJM
2026-02-06 11:53:00 - slack_bot.dispatcher - INFO - [159310c6] Calling Gemini for initial response...
2026-02-06 11:53:02 - slack_bot.dispatcher - WARNING - [159310c6] Gemini returned empty response_text!
2026-02-06 11:53:02 - slack_bot.dispatcher - INFO - [159310c6] Gemini response in 2.11s: 0 chars, 1 tools
2026-02-06 11:53:02 - slack_bot.dispatcher - INFO - [159310c6] Executing 1 tools
2026-02-06 11:53:02 - slack_bot.dispatcher - INFO - [159310c6] Tool: log_diet Args: {'meal_type': 'snack', 'target_date': '2026-02-06', 'description': '600ml water', 'time': '11:51'}
2026-02-06 11:53:02 - health.services.manual_log_storage - INFO - Saved manual log for 2026-02-06 to /Users/lili/workspace/bulter/data/health/manual_logs/2026/02/2026-02-06.json
2026-02-06 11:53:02 - health.services.manual_log_storage - INFO - Added diet entry for 2026-02-06 at 11:51
2026-02-06 11:53:02 - slack_bot.dispatcher - INFO - [159310c6] ✓ log_diet finished in 0.00s
2026-02-06 11:53:02 - slack_bot.dispatcher - INFO - [159310c6] Requesting final analysis...
2026-02-06 11:53:03 - slack_bot.dispatcher - INFO - [159310c6] Final analysis received in 1.81s
2026-02-06 11:53:03 - slack_bot.dispatcher - INFO - Formatted text (len 135 -> 133)
2026-02-06 11:53:04 - slack_bot.dispatcher - INFO - [159310c6] 📤 Message updated 1770349979.919029
2026-02-06 11:53:04 - slack_bot.dispatcher - INFO - [159310c6] Dispatch completed in 4.41s
2026-02-06 11:53:04 - __main__ - INFO - [159310c6] ✅ Request completed in 4.94s
2026-02-06 14:12:09 - health.utils.env_loader - INFO - Loading extra configuration from: /Users/lili/workspace/bulter/.gemini.current.env
2026-02-06 14:12:09 - __main__ - INFO - Starting Butler Bot with Gemini model: gemini-3-flash
2026-02-06 14:12:10 - slack_bot.llm.gemini - INFO - Using proxy: http://127.0.0.1:8045
2026-02-06 14:12:10 - slack_bot.llm.gemini - INFO - Initialized Gemini model: gemini-3-flash
2026-02-06 14:12:10 - slack_bot.dispatcher - INFO - Using tool preset: light (5 tools)
2026-02-06 14:12:10 - slack_bot.dispatcher - INFO - Dispatcher initialized with Gemini
2026-02-06 14:12:10 - __main__ - INFO - Dispatcher initialized in 'light' mode
2026-02-06 14:12:10 - __main__ - INFO - ⚡️ Butler (Gemini) is connected to Slack!
2026-02-06 14:34:08 - health.utils.env_loader - INFO - Loading extra configuration from: /Users/lili/workspace/bulter/.gemini.current.env
2026-02-06 14:34:08 - __main__ - INFO - Starting Butler Bot with Gemini model: gemini-3-pro-high
2026-02-06 14:34:09 - slack_bot.llm.gemini - INFO - Using proxy: http://127.0.0.1:8045
2026-02-06 14:34:09 - slack_bot.llm.gemini - INFO - Initialized Gemini model: gemini-3-pro-high
2026-02-06 14:34:09 - slack_bot.dispatcher - INFO - Using tool preset: light (5 tools)
2026-02-06 14:34:09 - slack_bot.dispatcher - INFO - Dispatcher initialized with Gemini
2026-02-06 14:34:09 - __main__ - INFO - Dispatcher initialized in 'light' mode
2026-02-06 14:34:09 - __main__ - INFO - ⚡️ Butler (Gemini) is connected to Slack!
⚡️ Bolt app is running!
2026-02-06 14:34:42 - __main__ - INFO - [9b0d39bc] 📥 Received message from U0A8ZCK7RJM in D0AA4GBQRKK: 中午摄入了大量蛋白质，但是也有烤鸭这种比较油腻的食品 (Files: 0)
2026-02-06 14:34:43 - slack_bot.dispatcher - INFO - [9b0d39bc] Processing message in D0AA4GBQRKK from U0A8ZCK7RJM
2026-02-06 14:34:43 - slack_bot.dispatcher - INFO - [9b0d39bc] Calling Gemini for initial response...
2026-02-06 14:34:55 - slack_bot.llm.gemini - WARNING - Empty response with tools - retrying WITHOUT tools as workaround
2026-02-06 14:35:12 - slack_bot.llm.gemini - INFO - Retry without tools: got 755 chars
2026-02-06 14:35:12 - slack_bot.dispatcher - INFO - [9b0d39bc] Gemini response in 29.12s: 755 chars, 0 tools
2026-02-06 14:35:12 - slack_bot.dispatcher - INFO - Formatted text (len 755 -> 729)
2026-02-06 14:35:12 - slack_bot.dispatcher - INFO - [9b0d39bc] 📤 Message updated 1770359683.136199
2026-02-06 14:35:12 - slack_bot.dispatcher - INFO - [9b0d39bc] Dispatch completed in 29.61s
2026-02-06 14:35:12 - __main__ - INFO - [9b0d39bc] ✅ Request completed in 30.28s
2026-02-06 14:38:10 - __main__ - INFO - [cdd2271f] 📥 Received message from U0A8ZCK7RJM in D0AA4GBQRKK: 如果晚上要喝酒，可以吃小檗碱吗 (Files: 0)
2026-02-06 14:38:11 - slack_bot.dispatcher - INFO - [cdd2271f] Processing message in D0AA4GBQRKK from U0A8ZCK7RJM
2026-02-06 14:38:11 - slack_bot.dispatcher - INFO - [cdd2271f] Calling Gemini for initial response...
2026-02-06 14:38:27 - slack_bot.dispatcher - INFO - [cdd2271f] Gemini response in 16.77s: 676 chars, 0 tools
2026-02-06 14:38:27 - slack_bot.dispatcher - INFO - Formatted text (len 676 -> 642)
2026-02-06 14:38:28 - slack_bot.dispatcher - INFO - [cdd2271f] 📤 Message updated 1770359890.983859
2026-02-06 14:38:28 - slack_bot.dispatcher - INFO - [cdd2271f] Dispatch completed in 17.43s
2026-02-06 14:38:28 - __main__ - INFO - [cdd2271f] ✅ Request completed in 18.02s
2026-02-06 14:40:03 - __main__ - INFO - [d9a102b7] 📥 Received message from U0A8ZCK7RJM in D0AA4GBQRKK: 好的，请记录 (Files: 0)
2026-02-06 14:40:04 - slack_bot.dispatcher - INFO - [d9a102b7] Processing message in D0AA4GBQRKK from U0A8ZCK7RJM
2026-02-06 14:40:04 - slack_bot.dispatcher - INFO - [d9a102b7] Calling Gemini for initial response...
2026-02-06 14:40:11 - slack_bot.llm.gemini - WARNING - Empty response with tools - retrying WITHOUT tools as workaround
2026-02-06 14:40:22 - slack_bot.llm.gemini - INFO - Retry without tools: got 500 chars
2026-02-06 14:40:22 - slack_bot.dispatcher - INFO - [d9a102b7] Gemini response in 18.29s: 500 chars, 0 tools
2026-02-06 14:40:22 - slack_bot.dispatcher - INFO - Formatted text (len 500 -> 490)
2026-02-06 14:40:22 - slack_bot.dispatcher - INFO - [d9a102b7] 📤 Message updated 1770360003.850969
2026-02-06 14:40:22 - slack_bot.dispatcher - INFO - [d9a102b7] Dispatch completed in 18.86s
2026-02-06 14:40:22 - __main__ - INFO - [d9a102b7] ✅ Request completed in 19.44s
2026-02-06 14:47:46 - health.utils.env_loader - INFO - Loading extra configuration from: /Users/lili/workspace/bulter/.gemini.current.env
2026-02-06 14:47:46 - __main__ - INFO - Starting Butler Bot with configuration:
2026-02-06 14:47:46 - __main__ - INFO -   Config file: .gemini.current.env
2026-02-06 14:47:46 - __main__ - INFO -   Model: gemini-3-pro-high
2026-02-06 14:47:46 - __main__ - INFO -   Base URL: http://127.0.0.1:8045
2026-02-06 14:47:46 - __main__ - INFO -   Using proxy: Yes
2026-02-06 14:47:47 - slack_bot.llm.gemini - INFO - Using proxy: http://127.0.0.1:8045
2026-02-06 14:47:47 - slack_bot.llm.gemini - INFO - Initialized Gemini model: gemini-3-pro-high
2026-02-06 14:47:47 - slack_bot.dispatcher - INFO - Using tool preset: light (5 tools)
2026-02-06 14:47:47 - slack_bot.dispatcher - INFO - Dispatcher initialized with Gemini
2026-02-06 14:47:47 - __main__ - INFO - Dispatcher initialized in 'light' mode
2026-02-06 14:47:47 - __main__ - INFO - ⚡️ Butler (Gemini) is connected to Slack!
⚡️ Bolt app is running!
2026-02-06 14:48:48 - __main__ - INFO - [6757b8be] 📥 Received message from U0A8ZCK7RJM in D0AA4GBQRKK: 今天睡得怎么样 (Files: 0)
2026-02-06 14:48:48 - slack_bot.dispatcher - INFO - [6757b8be] Processing message in D0AA4GBQRKK from U0A8ZCK7RJM
2026-02-06 14:48:48 - slack_bot.dispatcher - INFO - [6757b8be] Calling Gemini for initial response...
2026-02-06 14:48:48 - slack_bot.dispatcher - INFO - [6757b8be] Request config: model=gemini-3-pro-high, tools=5, context=27 msgs
2026-02-06 14:48:55 - slack_bot.llm.gemini - WARNING - Empty response with tools - retrying WITHOUT tools as workaround
2026-02-06 14:49:10 - slack_bot.llm.gemini - INFO - Retry without tools: got 1639 chars
2026-02-06 14:49:10 - slack_bot.dispatcher - INFO - [6757b8be] Gemini response: text=1639 chars, tool_calls=0
2026-02-06 14:49:10 - slack_bot.dispatcher - INFO - [6757b8be] No tool calls from Gemini - checking SAFETY OVERRIDE keywords...
2026-02-06 14:49:10 - slack_bot.dispatcher - WARNING - [6757b8be] 🔧 SAFETY OVERRIDE: Forcing get_daily_detailed_stats for 2026-02-06
2026-02-06 14:49:10 - slack_bot.dispatcher - INFO - [6757b8be] No SAFETY OVERRIDE match found - will return empty response or text
2026-02-06 14:49:10 - slack_bot.dispatcher - INFO - [6757b8be] Gemini response in 22.32s: 1639 chars, 1 tools
2026-02-06 14:49:10 - slack_bot.dispatcher - INFO - [6757b8be] Executing 1 tools
2026-02-06 14:49:10 - slack_bot.dispatcher - INFO - [6757b8be] Tool: get_daily_detailed_stats Args: {'target_date': '2026-02-06'}
2026-02-06 14:49:10 - health.services.query - INFO - Querying health data summary for 2026-02-06
2026-02-06 14:49:10 - health.services.query - INFO - Found 12 metrics and 1 activities
2026-02-06 14:49:10 - slack_bot.dispatcher - INFO - [6757b8be] ✓ get_daily_detailed_stats finished in 0.02s
2026-02-06 14:49:10 - slack_bot.dispatcher - INFO - [6757b8be] Requesting final analysis...
2026-02-06 14:49:24 - slack_bot.dispatcher - INFO - [6757b8be] Final analysis received in 13.63s
2026-02-06 14:49:24 - slack_bot.dispatcher - INFO - Formatted text (len 651 -> 627)
2026-02-06 14:49:25 - slack_bot.dispatcher - INFO - [6757b8be] 📤 Message updated 1770360528.454949
2026-02-06 14:49:25 - slack_bot.dispatcher - INFO - [6757b8be] Dispatch completed in 36.48s
2026-02-06 14:49:25 - __main__ - INFO - [6757b8be] ✅ Request completed in 36.96s
2026-02-06 14:49:49 - __main__ - INFO - [8a6d4fe6] 📥 Received message from U0A8ZCK7RJM in D0AA4GBQRKK: 昨天的步数是多少 (Files: 0)
2026-02-06 14:49:50 - slack_bot.dispatcher - INFO - [8a6d4fe6] Processing message in D0AA4GBQRKK from U0A8ZCK7RJM
2026-02-06 14:49:50 - slack_bot.dispatcher - INFO - [8a6d4fe6] Calling Gemini for initial response...
2026-02-06 14:49:50 - slack_bot.dispatcher - INFO - [8a6d4fe6] Request config: model=gemini-3-pro-high, tools=5, context=30 msgs
2026-02-06 14:50:01 - slack_bot.dispatcher - INFO - [8a6d4fe6] Gemini response: text=1343 chars, tool_calls=0
2026-02-06 14:50:01 - slack_bot.dispatcher - INFO - [8a6d4fe6] No tool calls from Gemini - checking SAFETY OVERRIDE keywords...
2026-02-06 14:50:01 - slack_bot.dispatcher - WARNING - [8a6d4fe6] 🔧 SAFETY OVERRIDE: Forcing get_daily_detailed_stats for 2026-02-05
2026-02-06 14:50:01 - slack_bot.dispatcher - INFO - [8a6d4fe6] No SAFETY OVERRIDE match found - will return empty response or text
2026-02-06 14:50:01 - slack_bot.dispatcher - INFO - [8a6d4fe6] Gemini response in 11.52s: 1343 chars, 1 tools
2026-02-06 14:50:01 - slack_bot.dispatcher - INFO - [8a6d4fe6] Executing 1 tools
2026-02-06 14:50:01 - slack_bot.dispatcher - INFO - [8a6d4fe6] Tool: get_daily_detailed_stats Args: {'target_date': '2026-02-05'}
2026-02-06 14:50:01 - health.services.query - INFO - Querying health data summary for 2026-02-05
2026-02-06 14:50:01 - health.services.query - INFO - Found 12 metrics and 0 activities
2026-02-06 14:50:01 - slack_bot.dispatcher - INFO - [8a6d4fe6] ✓ get_daily_detailed_stats finished in 0.01s
2026-02-06 14:50:01 - slack_bot.dispatcher - INFO - [8a6d4fe6] Requesting final analysis...
2026-02-06 14:50:07 - slack_bot.dispatcher - INFO - [8a6d4fe6] Final analysis received in 5.67s
2026-02-06 14:50:07 - slack_bot.dispatcher - INFO - Formatted text (len 174 -> 168)
2026-02-06 14:50:07 - slack_bot.dispatcher - INFO - [8a6d4fe6] 📤 Message updated 1770360590.048239
2026-02-06 14:50:07 - slack_bot.dispatcher - INFO - [8a6d4fe6] Dispatch completed in 17.77s
2026-02-06 14:50:07 - __main__ - INFO - [8a6d4fe6] ✅ Request completed in 18.39s
2026-02-06 14:51:04 - __main__ - INFO - [91529489] 📥 Received message from U0A8ZCK7RJM in D0AA4GBQRKK: 搜索一下最新的NMN研究 (Files: 0)
2026-02-06 14:51:05 - slack_bot.dispatcher - INFO - [91529489] Processing message in D0AA4GBQRKK from U0A8ZCK7RJM
2026-02-06 14:51:05 - slack_bot.dispatcher - INFO - [91529489] Calling Gemini for initial response...
2026-02-06 14:51:05 - slack_bot.dispatcher - INFO - [91529489] Request config: model=gemini-3-pro-high, tools=5, context=33 msgs
2026-02-06 14:51:10 - slack_bot.llm.gemini - WARNING - Empty response with tools - retrying WITHOUT tools as workaround
2026-02-06 14:51:28 - slack_bot.llm.gemini - INFO - Retry without tools: got 2368 chars
2026-02-06 14:51:28 - slack_bot.dispatcher - INFO - [91529489] Gemini response: text=2368 chars, tool_calls=0
2026-02-06 14:51:28 - slack_bot.dispatcher - INFO - [91529489] No tool calls from Gemini - checking SAFETY OVERRIDE keywords...
2026-02-06 14:51:28 - slack_bot.dispatcher - WARNING - [91529489] 🔧 SAFETY OVERRIDE: Forcing search_web
2026-02-06 14:51:28 - slack_bot.dispatcher - INFO - [91529489] No SAFETY OVERRIDE match found - will return empty response or text
2026-02-06 14:51:28 - slack_bot.dispatcher - INFO - [91529489] Gemini response in 22.92s: 2368 chars, 1 tools
2026-02-06 14:51:28 - slack_bot.dispatcher - INFO - [91529489] Executing 1 tools
2026-02-06 14:51:28 - slack_bot.dispatcher - INFO - [91529489] Tool: search_web Args: {'query': '搜索一下最新的NMN研究'}
2026-02-06 14:51:28 - slack_bot.dispatcher - WARNING - [91529489] Unknown tool: search_web
2026-02-06 14:51:28 - slack_bot.dispatcher - INFO - [91529489] Requesting final analysis...
2026-02-06 14:51:52 - slack_bot.dispatcher - INFO - [91529489] Final analysis received in 24.68s
2026-02-06 14:51:52 - slack_bot.dispatcher - INFO - Formatted text (len 92 -> 92)
2026-02-06 14:51:53 - slack_bot.dispatcher - INFO - [91529489] 📤 Message updated 1770360665.279659
2026-02-06 14:51:53 - slack_bot.dispatcher - INFO - [91529489] Dispatch completed in 48.09s
2026-02-06 14:51:53 - __main__ - INFO - [91529489] ✅ Request completed in 48.58s
2026-02-06 15:33:36 - health.utils.env_loader - INFO - Loading extra configuration from: /Users/lili/workspace/bulter/.gemini.current.env
2026-02-06 15:33:36 - __main__ - INFO - Starting Butler Bot with configuration:
2026-02-06 15:33:36 - __main__ - INFO -   Config file: .gemini.current.env
2026-02-06 15:33:36 - __main__ - INFO -   Model: google/gemini-3-flash-preview
2026-02-06 15:33:36 - __main__ - INFO -   Base URL: https://openrouter.ai/api
2026-02-06 15:33:36 - __main__ - INFO -   Using proxy: Yes
2026-02-06 15:33:37 - slack_bot.llm.gemini - INFO - Using OpenRouter: https://openrouter.ai/api
2026-02-06 15:33:37 - slack_bot.llm.gemini - INFO - Initialized Gemini model: google/gemini-3-flash-preview
2026-02-06 15:33:37 - slack_bot.dispatcher - INFO - Using tool preset: all (21 tools)
2026-02-06 15:33:37 - slack_bot.dispatcher - INFO - Dispatcher initialized with Gemini
2026-02-06 15:33:37 - __main__ - INFO - Dispatcher initialized in 'all' mode
2026-02-06 15:33:37 - __main__ - INFO - ⚡️ Butler (Gemini) is connected to Slack!
⚡️ Bolt app is running!
2026-02-06 15:33:53 - __main__ - INFO - [e5af3a3c] 📥 Received message from U0A8ZCK7RJM in D0AA4GBQRKK: 搜索一下最新的NMN研究 (Files: 0)
2026-02-06 15:33:53 - slack_bot.dispatcher - INFO - [e5af3a3c] Processing message in D0AA4GBQRKK from U0A8ZCK7RJM
2026-02-06 15:33:53 - slack_bot.dispatcher - INFO - [e5af3a3c] Calling Gemini for initial response...
2026-02-06 15:33:53 - slack_bot.dispatcher - INFO - [e5af3a3c] Request config: model=google/gemini-3-flash-preview, tools=21, context=36 msgs
2026-02-06 15:33:56 - slack_bot.dispatcher - WARNING - [e5af3a3c] Gemini returned empty response_text! (This usually means the proxy has issues)
2026-02-06 15:33:56 - slack_bot.dispatcher - INFO - [e5af3a3c] Gemini response: text=0 chars, tool_calls=1
2026-02-06 15:33:56 - slack_bot.dispatcher - INFO - [e5af3a3c] Tool calls successfully generated by Gemini (no SAFETY OVERRIDE needed)
2026-02-06 15:33:56 - slack_bot.dispatcher - INFO - [e5af3a3c] Gemini response in 3.03s: 0 chars, 1 tools
2026-02-06 15:33:56 - slack_bot.dispatcher - INFO - [e5af3a3c] Executing 1 tools
2026-02-06 15:33:56 - slack_bot.dispatcher - INFO - [e5af3a3c] Tool: search_web Args: {'query': 'latest NMN research 2024 2025 clinical trials benefits longevity human studies'}
2026-02-06 15:33:56 - slack_bot.tools.web - INFO - Searching web for: latest NMN research 2024 2025 clinical trials benefits longevity human studies
/Users/lili/workspace/bulter/slack_bot/tools/web.py:27: RuntimeWarning: This package (`duckduckgo_search`) has been renamed to `ddgs`! Use `pip install ddgs` instead.
  results = DDGS().text(query, max_results=max_results)
2026-02-06 15:33:57 - slack_bot.dispatcher - INFO - [e5af3a3c] ✓ search_web finished in 0.40s
2026-02-06 15:33:57 - slack_bot.dispatcher - INFO - [e5af3a3c] Requesting final analysis...
2026-02-06 15:34:00 - slack_bot.dispatcher - INFO - [e5af3a3c] Final analysis received in 3.24s
2026-02-06 15:34:00 - slack_bot.dispatcher - INFO - Formatted text (len 408 -> 396)
2026-02-06 15:34:01 - slack_bot.dispatcher - INFO - [e5af3a3c] 📤 Message updated 1770363233.809689
2026-02-06 15:34:01 - slack_bot.dispatcher - INFO - [e5af3a3c] Dispatch completed in 7.32s
2026-02-06 15:34:01 - __main__ - INFO - [e5af3a3c] ✅ Request completed in 7.79s
2026-02-06 15:37:41 - __main__ - INFO - [0fcf9386] 📥 Received message from U0A8ZCK7RJM in D0AA4GBQRKK: 我最近静息心率好像有一些提升，请问应该注意一些什么 (Files: 0)
2026-02-06 15:37:42 - slack_bot.dispatcher - INFO - [0fcf9386] Processing message in D0AA4GBQRKK from U0A8ZCK7RJM
2026-02-06 15:37:42 - slack_bot.dispatcher - INFO - [0fcf9386] Calling Gemini for initial response...
2026-02-06 15:37:42 - slack_bot.dispatcher - INFO - [0fcf9386] Request config: model=google/gemini-3-flash-preview, tools=21, context=39 msgs
2026-02-06 15:37:45 - slack_bot.dispatcher - WARNING - [0fcf9386] Gemini returned empty response_text! (This usually means the proxy has issues)
2026-02-06 15:37:45 - slack_bot.dispatcher - INFO - [0fcf9386] Gemini response: text=0 chars, tool_calls=2
2026-02-06 15:37:45 - slack_bot.dispatcher - INFO - [0fcf9386] Tool calls successfully generated by Gemini (no SAFETY OVERRIDE needed)
2026-02-06 15:37:45 - slack_bot.dispatcher - INFO - [0fcf9386] Gemini response in 3.16s: 0 chars, 2 tools
2026-02-06 15:37:45 - slack_bot.dispatcher - INFO - [0fcf9386] Executing 2 tools
2026-02-06 15:37:45 - slack_bot.dispatcher - INFO - [0fcf9386] Tool: get_aggregated_analysis Args: {'start_date': '2026-01-07', 'metrics': ['rhr', 'stress', 'sleep']}
2026-02-06 15:37:45 - health.services.query - INFO - Querying rhr from 2026-01-07 to 2026-02-06
2026-02-06 15:37:45 - health.services.query - INFO - Found 28 records for rhr
2026-02-06 15:37:45 - health.services.query - INFO - Querying stress from 2026-01-07 to 2026-02-06
2026-02-06 15:37:45 - health.services.query - INFO - Found 28 records for stress
2026-02-06 15:37:45 - health.services.query - INFO - Querying sleep from 2026-01-07 to 2026-02-06
2026-02-06 15:37:45 - health.services.query - INFO - Found 28 records for sleep
2026-02-06 15:37:45 - slack_bot.dispatcher - INFO - [0fcf9386] ✓ get_aggregated_analysis finished in 0.30s
2026-02-06 15:37:45 - slack_bot.dispatcher - INFO - [0fcf9386] Tool: get_manual_history Args: {'category': 'alcohol', 'start_date': '2026-01-07', 'end_date': '2026-02-06'}
2026-02-06 15:37:45 - slack_bot.dispatcher - INFO - [0fcf9386] ✓ get_manual_history finished in 0.00s
2026-02-06 15:37:45 - slack_bot.dispatcher - INFO - [0fcf9386] Requesting final analysis...
2026-02-06 15:37:51 - slack_bot.dispatcher - INFO - [0fcf9386] Final analysis received in 5.97s
2026-02-06 15:37:51 - slack_bot.dispatcher - INFO - Formatted text (len 953 -> 919)
2026-02-06 15:37:52 - slack_bot.dispatcher - INFO - [0fcf9386] 📤 Message updated 1770363462.243069
2026-02-06 15:37:52 - slack_bot.dispatcher - INFO - [0fcf9386] Dispatch completed in 10.07s
2026-02-06 15:37:52 - __main__ - INFO - [0fcf9386] ✅ Request completed in 10.72s
2026-02-06 15:40:28 - __main__ - INFO - [4fe8a068] 📥 Received message from U0A8ZCK7RJM in D0AA4GBQRKK: 可以的，可以设定这个 (Files: 0)
2026-02-06 15:40:28 - slack_bot.dispatcher - INFO - [4fe8a068] Processing message in D0AA4GBQRKK from U0A8ZCK7RJM
2026-02-06 15:40:28 - slack_bot.dispatcher - INFO - [4fe8a068] Calling Gemini for initial response...
2026-02-06 15:40:28 - slack_bot.dispatcher - INFO - [4fe8a068] Request config: model=google/gemini-3-flash-preview, tools=21, context=39 msgs
2026-02-06 15:40:32 - slack_bot.dispatcher - INFO - [4fe8a068] Gemini response: text=522 chars, tool_calls=0
2026-02-06 15:40:32 - slack_bot.dispatcher - INFO - [4fe8a068] No tool calls from Gemini - checking SAFETY OVERRIDE keywords...
2026-02-06 15:40:32 - slack_bot.dispatcher - INFO - [4fe8a068] No SAFETY OVERRIDE match found - will return empty response or text
2026-02-06 15:40:32 - slack_bot.dispatcher - INFO - [4fe8a068] Gemini response in 4.16s: 522 chars, 0 tools
2026-02-06 15:40:32 - slack_bot.dispatcher - INFO - Formatted text (len 522 -> 506)
2026-02-06 15:40:33 - slack_bot.dispatcher - INFO - [4fe8a068] 📤 Message updated 1770363628.506729
2026-02-06 15:40:33 - slack_bot.dispatcher - INFO - [4fe8a068] Dispatch completed in 4.72s
2026-02-06 15:40:33 - __main__ - INFO - [4fe8a068] ✅ Request completed in 5.30s
2026-02-06 15:45:33 - __main__ - INFO - [8bf64c3a] 📥 Received message from U0A8ZCK7RJM in D0AA4GBQRKK: 目前的有氧运动和无氧运动的量级是否合理，有没有优化建议 (Files: 0)
2026-02-06 15:45:34 - slack_bot.dispatcher - INFO - [8bf64c3a] Processing message in D0AA4GBQRKK from U0A8ZCK7RJM
2026-02-06 15:45:34 - slack_bot.dispatcher - INFO - [8bf64c3a] Calling Gemini for initial response...
2026-02-06 15:45:34 - slack_bot.dispatcher - INFO - [8bf64c3a] Request config: model=google/gemini-3-flash-preview, tools=21, context=39 msgs
2026-02-06 15:45:38 - slack_bot.dispatcher - WARNING - [8bf64c3a] Gemini returned empty response_text! (This usually means the proxy has issues)
2026-02-06 15:45:38 - slack_bot.dispatcher - INFO - [8bf64c3a] Gemini response: text=0 chars, tool_calls=3
2026-02-06 15:45:38 - slack_bot.dispatcher - INFO - [8bf64c3a] Tool calls successfully generated by Gemini (no SAFETY OVERRIDE needed)
2026-02-06 15:45:38 - slack_bot.dispatcher - INFO - [8bf64c3a] Gemini response in 4.37s: 0 chars, 3 tools
2026-02-06 15:45:38 - slack_bot.dispatcher - INFO - [8bf64c3a] Executing 3 tools
2026-02-06 15:45:38 - slack_bot.dispatcher - INFO - [8bf64c3a] Tool: get_aggregated_analysis Args: {'start_date': '2026-01-23', 'metrics': ['steps', 'rhr', 'hrv', 'sleep']}
2026-02-06 15:45:38 - health.services.query - INFO - Querying steps from 2026-01-23 to 2026-02-06
2026-02-06 15:45:38 - health.services.query - INFO - Found 12 records for steps
2026-02-06 15:45:38 - health.services.query - INFO - Querying rhr from 2026-01-23 to 2026-02-06
2026-02-06 15:45:38 - health.services.query - INFO - Found 12 records for rhr
2026-02-06 15:45:38 - health.services.query - INFO - Querying hrv from 2026-01-23 to 2026-02-06
2026-02-06 15:45:38 - health.services.query - INFO - Found 12 records for hrv
2026-02-06 15:45:38 - health.services.query - INFO - Querying sleep from 2026-01-23 to 2026-02-06
2026-02-06 15:45:38 - health.services.query - INFO - Found 12 records for sleep
2026-02-06 15:45:38 - slack_bot.dispatcher - INFO - [8bf64c3a] ✓ get_aggregated_analysis finished in 0.08s
2026-02-06 15:45:38 - slack_bot.dispatcher - INFO - [8bf64c3a] Tool: get_activity_history Args: {'start_date': '2026-01-23', 'end_date': '2026-02-06'}
2026-02-06 15:45:38 - health.services.query - INFO - Querying activities from 2026-01-23 to 2026-02-06
2026-02-06 15:45:38 - health.services.query - INFO - Found 4 activities
2026-02-06 15:45:38 - slack_bot.dispatcher - INFO - [8bf64c3a] ✓ get_activity_history finished in 0.01s
2026-02-06 15:45:38 - slack_bot.dispatcher - INFO - [8bf64c3a] Tool: get_manual_history Args: {'category': 'feelings', 'start_date': '2026-01-23', 'end_date': '2026-02-06'}
2026-02-06 15:45:38 - slack_bot.dispatcher - INFO - [8bf64c3a] ✓ get_manual_history finished in 0.00s
2026-02-06 15:45:38 - slack_bot.dispatcher - INFO - [8bf64c3a] Requesting final analysis...
2026-02-06 15:45:44 - slack_bot.dispatcher - INFO - [8bf64c3a] Final analysis received in 5.83s
2026-02-06 15:45:44 - slack_bot.dispatcher - INFO - Formatted text (len 912 -> 868)
2026-02-06 15:45:45 - slack_bot.dispatcher - WARNING - [8bf64c3a] Update failed, posting new: The request to the Slack API failed. (url: https://slack.com/api/chat.update)
The server responded with: {'ok': False, 'error': 'msg_too_long'}
2026-02-06 15:45:45 - slack_bot.dispatcher - INFO - [8bf64c3a] Dispatch completed in 11.47s
2026-02-06 15:45:45 - __main__ - INFO - [8bf64c3a] ✅ Request completed in 12.52s
2026-02-06 15:48:46 - __main__ - INFO - [dc59a8a0] 📥 Received message from U0A8ZCK7RJM in D0AA4GBQRKK: 不对，我每周至少三次椭圆机，每次50分钟以上 (Files: 0)
2026-02-06 15:48:46 - slack_bot.dispatcher - INFO - [dc59a8a0] Processing message in D0AA4GBQRKK from U0A8ZCK7RJM
2026-02-06 15:48:46 - slack_bot.dispatcher - INFO - [dc59a8a0] Calling Gemini for initial response...
2026-02-06 15:48:46 - slack_bot.dispatcher - INFO - [dc59a8a0] Request config: model=google/gemini-3-flash-preview, tools=21, context=39 msgs
2026-02-06 15:48:54 - slack_bot.dispatcher - INFO - [dc59a8a0] Gemini response: text=1326 chars, tool_calls=0
2026-02-06 15:48:54 - slack_bot.dispatcher - INFO - [dc59a8a0] No tool calls from Gemini - checking SAFETY OVERRIDE keywords...
2026-02-06 15:48:54 - slack_bot.dispatcher - INFO - [dc59a8a0] No SAFETY OVERRIDE match found - will return empty response or text
2026-02-06 15:48:54 - slack_bot.dispatcher - INFO - [dc59a8a0] Gemini response in 7.97s: 1326 chars, 0 tools
2026-02-06 15:48:54 - slack_bot.dispatcher - INFO - Formatted text (len 1326 -> 1298)
2026-02-06 15:48:55 - slack_bot.dispatcher - INFO - [dc59a8a0] 📤 Message updated 1770364126.602249
2026-02-06 15:48:55 - slack_bot.dispatcher - INFO - [dc59a8a0] Dispatch completed in 8.57s
2026-02-06 15:48:55 - __main__ - INFO - [dc59a8a0] ✅ Request completed in 9.09s
2026-02-06 17:08:02 - __main__ - INFO - [74047d7c] 📥 Received message from U0A8ZCK7RJM in D0AA4GBQRKK: 为了应对等会儿的应酬，已经喝了一杯酸奶，一块全麦面包，0.3g b族维生素和0.6g nac (Files: 0)
2026-02-06 17:08:03 - slack_bot.dispatcher - INFO - [74047d7c] Processing message in D0AA4GBQRKK from U0A8ZCK7RJM
2026-02-06 17:08:03 - slack_bot.dispatcher - INFO - [74047d7c] Calling Gemini for initial response...
2026-02-06 17:08:03 - slack_bot.dispatcher - INFO - [74047d7c] Request config: model=google/gemini-3-flash-preview, tools=21, context=39 msgs
2026-02-06 17:08:09 - slack_bot.dispatcher - INFO - [74047d7c] Gemini response: text=862 chars, tool_calls=0
2026-02-06 17:08:09 - slack_bot.dispatcher - INFO - [74047d7c] No tool calls from Gemini - checking SAFETY OVERRIDE keywords...
2026-02-06 17:08:09 - slack_bot.dispatcher - INFO - [74047d7c] No SAFETY OVERRIDE match found - will return empty response or text
2026-02-06 17:08:09 - slack_bot.dispatcher - INFO - [74047d7c] Gemini response in 6.11s: 862 chars, 0 tools
2026-02-06 17:08:09 - slack_bot.dispatcher - INFO - Formatted text (len 862 -> 842)
2026-02-06 17:08:10 - slack_bot.dispatcher - INFO - [74047d7c] 📤 Message updated 1770368883.352309
2026-02-06 17:08:10 - slack_bot.dispatcher - INFO - [74047d7c] Dispatch completed in 6.79s
2026-02-06 17:08:10 - __main__ - INFO - [74047d7c] ✅ Request completed in 7.29s
Failed to check the state of sock (session id: 83c53970-4f9e-4c4c-b88c-bf819fd55faa, error: SSLError, message: [SYS] unknown error (_ssl.c:2406))
Failed to check the state of sock (session id: 83c53970-4f9e-4c4c-b88c-bf819fd55faa, error: SSLError, message: [SSL: BAD_LENGTH] bad length (_ssl.c:2406))
Failed to check the state of sock (session id: 4e4085c1-0d14-457c-9410-fe1b20f547eb, error: SSLError, message: [SYS] unknown error (_ssl.c:2406))
Failed to check the state of sock (session id: 4e4085c1-0d14-457c-9410-fe1b20f547eb, error: SSLError, message: [SSL: BAD_LENGTH] bad length (_ssl.c:2406))
2026-02-07 09:13:46 - __main__ - INFO - [bc16a5cd] 📥 Received message from U0A8ZCK7RJM in D0AA4GBQRKK: 昨晚睡眠怎么样 (Files: 0)
2026-02-07 09:13:47 - slack_bot.dispatcher - INFO - [bc16a5cd] Processing message in D0AA4GBQRKK from U0A8ZCK7RJM
2026-02-07 09:13:47 - slack_bot.dispatcher - INFO - [bc16a5cd] Calling Gemini for initial response...
2026-02-07 09:13:47 - slack_bot.dispatcher - INFO - [bc16a5cd] Request config: model=google/gemini-3-flash-preview, tools=21, context=39 msgs
2026-02-07 09:13:50 - slack_bot.dispatcher - WARNING - [bc16a5cd] Gemini returned empty response_text! (This usually means the proxy has issues)
2026-02-07 09:13:50 - slack_bot.dispatcher - INFO - [bc16a5cd] Gemini response: text=0 chars, tool_calls=3
2026-02-07 09:13:50 - slack_bot.dispatcher - INFO - [bc16a5cd] Tool calls successfully generated by Gemini (no SAFETY OVERRIDE needed)
2026-02-07 09:13:50 - slack_bot.dispatcher - INFO - [bc16a5cd] Gemini response in 2.96s: 0 chars, 3 tools
2026-02-07 09:13:50 - slack_bot.dispatcher - INFO - [bc16a5cd] Executing 3 tools
2026-02-07 09:13:50 - slack_bot.dispatcher - INFO - [bc16a5cd] Tool: get_daily_detailed_stats Args: {'target_date': '2026-02-06'}
2026-02-07 09:13:50 - health.services.query - INFO - Querying health data summary for 2026-02-06
2026-02-07 09:13:50 - health.services.query - INFO - Found 12 metrics and 1 activities
2026-02-07 09:13:50 - slack_bot.dispatcher - INFO - [bc16a5cd] ✓ get_daily_detailed_stats finished in 0.04s
2026-02-07 09:13:50 - slack_bot.dispatcher - INFO - [bc16a5cd] Tool: get_manual_history Args: {'start_date': '2026-02-06', 'end_date': '2026-02-06', 'category': 'all'}
2026-02-07 09:13:50 - slack_bot.dispatcher - INFO - [bc16a5cd] ✓ get_manual_history finished in 0.00s
2026-02-07 09:13:50 - slack_bot.dispatcher - INFO - [bc16a5cd] Tool: get_activity_history Args: {'end_date': '2026-02-06', 'start_date': '2026-02-06'}
2026-02-07 09:13:50 - health.services.query - INFO - Querying activities from 2026-02-06 to 2026-02-06
2026-02-07 09:13:50 - health.services.query - INFO - Found 1 activities
2026-02-07 09:13:50 - slack_bot.dispatcher - INFO - [bc16a5cd] ✓ get_activity_history finished in 0.00s
2026-02-07 09:13:50 - slack_bot.dispatcher - INFO - [bc16a5cd] Requesting final analysis...
2026-02-07 09:14:00 - slack_bot.dispatcher - INFO - [bc16a5cd] Final analysis received in 10.32s
2026-02-07 09:14:00 - slack_bot.dispatcher - INFO - Formatted text (len 582 -> 552)
2026-02-07 09:14:01 - slack_bot.dispatcher - INFO - [bc16a5cd] 📤 Message updated 1770426827.113019
2026-02-07 09:14:01 - slack_bot.dispatcher - INFO - [bc16a5cd] Dispatch completed in 13.87s
2026-02-07 09:14:01 - __main__ - INFO - [bc16a5cd] ✅ Request completed in 14.39s
2026-02-07 09:14:54 - __main__ - INFO - [2b25f0e7] 📥 Received message from U0A8ZCK7RJM in D0AA4GBQRKK: 应该查询2月7日数据 (Files: 0)
2026-02-07 09:14:55 - slack_bot.dispatcher - INFO - [2b25f0e7] Processing message in D0AA4GBQRKK from U0A8ZCK7RJM
2026-02-07 09:14:55 - slack_bot.dispatcher - INFO - [2b25f0e7] Calling Gemini for initial response...
2026-02-07 09:14:55 - slack_bot.dispatcher - INFO - [2b25f0e7] Request config: model=google/gemini-3-flash-preview, tools=21, context=39 msgs
2026-02-07 09:14:57 - slack_bot.dispatcher - WARNING - [2b25f0e7] Gemini returned empty response_text! (This usually means the proxy has issues)
2026-02-07 09:14:57 - slack_bot.dispatcher - INFO - [2b25f0e7] Gemini response: text=0 chars, tool_calls=2
2026-02-07 09:14:57 - slack_bot.dispatcher - INFO - [2b25f0e7] Tool calls successfully generated by Gemini (no SAFETY OVERRIDE needed)
2026-02-07 09:14:57 - slack_bot.dispatcher - INFO - [2b25f0e7] Gemini response in 2.60s: 0 chars, 2 tools
2026-02-07 09:14:57 - slack_bot.dispatcher - INFO - [2b25f0e7] Executing 2 tools
2026-02-07 09:14:57 - slack_bot.dispatcher - INFO - [2b25f0e7] Tool: sync_garmin Args: {'target_date': '2026-02-07'}
2026-02-07 09:14:57 - slack_bot.tools.garmin - INFO - Starting Garmin sync for 2026-02-07...
2026-02-07 09:14:57 - health.services.data_sync - INFO - Authenticating with Garmin...
2026-02-07 09:14:57 - health.services.garmin_client - INFO - Authenticating with Garmin Connect China for 350134531@qq.com
2026-02-07 09:14:59 - health.services.garmin_client - INFO - Successfully authenticated with Garmin Connect China
2026-02-07 09:14:59 - health.services.data_sync - INFO - Authentication successful
2026-02-07 09:14:59 - health.services.data_sync - INFO - Syncing 13 metric types from 2026-02-07 to 2026-02-07
2026-02-07 09:14:59 - health.services.data_sync - INFO - Syncing steps from 2026-02-07 to 2026-02-07 (1 days)
2026-02-07 09:14:59 - health.services.data_sync - INFO - ✓ Synced steps for 2026-02-07
2026-02-07 09:14:59 - health.services.data_sync - INFO - steps sync complete: 1 synced, 0 skipped, 0 errors
2026-02-07 09:14:59 - health.services.data_sync - INFO - Syncing heart_rate from 2026-02-07 to 2026-02-07 (1 days)
2026-02-07 09:14:59 - health.services.data_sync - INFO - ✓ Synced heart_rate for 2026-02-07
2026-02-07 09:14:59 - health.services.data_sync - INFO - heart_rate sync complete: 1 synced, 0 skipped, 0 errors
2026-02-07 09:14:59 - health.services.data_sync - INFO - Syncing sleep from 2026-02-07 to 2026-02-07 (1 days)
2026-02-07 09:14:59 - health.services.data_sync - INFO - ✓ Synced sleep for 2026-02-07
2026-02-07 09:14:59 - health.services.data_sync - INFO - sleep sync complete: 1 synced, 0 skipped, 0 errors
2026-02-07 09:14:59 - health.services.data_sync - INFO - Syncing stress from 2026-02-07 to 2026-02-07 (1 days)
2026-02-07 09:14:59 - health.services.data_sync - INFO - ✓ Synced stress for 2026-02-07
2026-02-07 09:14:59 - health.services.data_sync - INFO - stress sync complete: 1 synced, 0 skipped, 0 errors
2026-02-07 09:14:59 - health.services.data_sync - INFO - Syncing body_battery from 2026-02-07 to 2026-02-07 (1 days)
2026-02-07 09:15:00 - health.services.data_sync - INFO - ✓ Synced body_battery for 2026-02-07
2026-02-07 09:15:00 - health.services.data_sync - INFO - body_battery sync complete: 1 synced, 0 skipped, 0 errors
2026-02-07 09:15:00 - health.services.data_sync - INFO - Syncing spo2 from 2026-02-07 to 2026-02-07 (1 days)
2026-02-07 09:15:00 - health.services.data_sync - INFO - ✓ Synced spo2 for 2026-02-07
2026-02-07 09:15:00 - health.services.data_sync - INFO - spo2 sync complete: 1 synced, 0 skipped, 0 errors
2026-02-07 09:15:00 - health.services.data_sync - INFO - Syncing respiration from 2026-02-07 to 2026-02-07 (1 days)
2026-02-07 09:15:00 - health.services.data_sync - INFO - ✓ Synced respiration for 2026-02-07
2026-02-07 09:15:00 - health.services.data_sync - INFO - respiration sync complete: 1 synced, 0 skipped, 0 errors
2026-02-07 09:15:00 - health.services.data_sync - INFO - Syncing hydration from 2026-02-07 to 2026-02-07 (1 days)
2026-02-07 09:15:00 - health.services.data_sync - INFO - ✓ Synced hydration for 2026-02-07
2026-02-07 09:15:00 - health.services.data_sync - INFO - hydration sync complete: 1 synced, 0 skipped, 0 errors
2026-02-07 09:15:00 - health.services.data_sync - INFO - Syncing floors from 2026-02-07 to 2026-02-07 (1 days)
2026-02-07 09:15:00 - health.services.data_sync - INFO - ✓ Synced floors for 2026-02-07
2026-02-07 09:15:00 - health.services.data_sync - INFO - floors sync complete: 1 synced, 0 skipped, 0 errors
2026-02-07 09:15:00 - health.services.data_sync - INFO - Syncing intensity_minutes from 2026-02-07 to 2026-02-07 (1 days)
2026-02-07 09:15:00 - health.services.data_sync - INFO - ✓ Synced intensity_minutes for 2026-02-07
2026-02-07 09:15:00 - health.services.data_sync - INFO - intensity_minutes sync complete: 1 synced, 0 skipped, 0 errors
2026-02-07 09:15:00 - health.services.data_sync - INFO - Syncing hrv from 2026-02-07 to 2026-02-07 (1 days)
2026-02-07 09:15:00 - health.services.data_sync - INFO - ✓ Synced hrv for 2026-02-07
2026-02-07 09:15:00 - health.services.data_sync - INFO - hrv sync complete: 1 synced, 0 skipped, 0 errors
2026-02-07 09:15:00 - health.services.data_sync - INFO - Syncing rhr from 2026-02-07 to 2026-02-07 (1 days)
2026-02-07 09:15:00 - health.services.data_sync - INFO - ✓ Synced rhr for 2026-02-07
2026-02-07 09:15:00 - health.services.data_sync - INFO - rhr sync complete: 1 synced, 0 skipped, 0 errors
2026-02-07 09:15:00 - health.services.data_sync - INFO - Syncing weight from 2026-02-07 to 2026-02-07 (1 days)
2026-02-07 09:15:00 - health.services.data_sync - INFO - weight sync complete: 0 synced, 1 skipped, 0 errors
2026-02-07 09:15:00 - health.services.data_sync - INFO - Syncing activities from 2026-02-07 to 2026-02-07
2026-02-07 09:15:00 - health.services.data_sync - INFO - Found 0 activities
2026-02-07 09:15:00 - health.services.data_sync - INFO - Activity sync complete: 0 synced, 0 skipped, 0 errors
2026-02-07 09:15:00 - health.services.query - INFO - Querying health data summary for 2026-02-07
2026-02-07 09:15:00 - health.services.query - INFO - Found 12 metrics and 0 activities
2026-02-07 09:15:00 - slack_bot.dispatcher - INFO - [2b25f0e7] ✓ sync_garmin finished in 3.07s
2026-02-07 09:15:00 - slack_bot.dispatcher - INFO - [2b25f0e7] Tool: get_daily_detailed_stats Args: {'target_date': '2026-02-07'}
2026-02-07 09:15:00 - health.services.query - INFO - Querying health data summary for 2026-02-07
2026-02-07 09:15:00 - health.services.query - INFO - Found 12 metrics and 0 activities
2026-02-07 09:15:00 - slack_bot.dispatcher - INFO - [2b25f0e7] ✓ get_daily_detailed_stats finished in 0.01s
2026-02-07 09:15:00 - slack_bot.dispatcher - INFO - [2b25f0e7] Requesting final analysis...
2026-02-07 09:15:06 - slack_bot.dispatcher - INFO - [2b25f0e7] Final analysis received in 5.18s
2026-02-07 09:15:06 - slack_bot.dispatcher - INFO - Formatted text (len 717 -> 681)
2026-02-07 09:15:06 - slack_bot.dispatcher - INFO - [2b25f0e7] 📤 Message updated 1770426895.186089
2026-02-07 09:15:06 - slack_bot.dispatcher - INFO - [2b25f0e7] Dispatch completed in 11.52s
2026-02-07 09:15:06 - __main__ - INFO - [2b25f0e7] ✅ Request completed in 12.06s
2026-02-07 09:18:15 - __main__ - INFO - [645550a9] 📥 Received message from U0A8ZCK7RJM in D0AA4GBQRKK: 虽然分数很低，但我自我感觉还不错。我认为酒精防御效果很好，不过睡眠分数降低太多了，我同有可能实际上还好 (Files: 0)
2026-02-07 09:18:16 - slack_bot.dispatcher - INFO - [645550a9] Processing message in D0AA4GBQRKK from U0A8ZCK7RJM
2026-02-07 09:18:16 - slack_bot.dispatcher - INFO - [645550a9] Calling Gemini for initial response...
2026-02-07 09:18:16 - slack_bot.dispatcher - INFO - [645550a9] Request config: model=google/gemini-3-flash-preview, tools=21, context=39 msgs
2026-02-07 09:18:24 - slack_bot.dispatcher - INFO - [645550a9] Gemini response: text=1188 chars, tool_calls=0
2026-02-07 09:18:24 - slack_bot.dispatcher - INFO - [645550a9] No tool calls from Gemini - checking SAFETY OVERRIDE keywords...
2026-02-07 09:18:24 - slack_bot.dispatcher - WARNING - [645550a9] 🔧 SAFETY OVERRIDE: Forcing get_daily_detailed_stats for 2026-02-07
2026-02-07 09:18:24 - slack_bot.dispatcher - INFO - [645550a9] No SAFETY OVERRIDE match found - will return empty response or text
2026-02-07 09:18:24 - slack_bot.dispatcher - INFO - [645550a9] Gemini response in 8.78s: 1188 chars, 1 tools
2026-02-07 09:18:24 - slack_bot.dispatcher - INFO - [645550a9] Executing 1 tools
2026-02-07 09:18:24 - slack_bot.dispatcher - INFO - [645550a9] Tool: get_daily_detailed_stats Args: {'target_date': '2026-02-07'}
2026-02-07 09:18:24 - health.services.query - INFO - Querying health data summary for 2026-02-07
2026-02-07 09:18:24 - health.services.query - INFO - Found 12 metrics and 0 activities
2026-02-07 09:18:24 - slack_bot.dispatcher - INFO - [645550a9] ✓ get_daily_detailed_stats finished in 0.01s
2026-02-07 09:18:24 - slack_bot.dispatcher - INFO - [645550a9] Requesting final analysis...
2026-02-07 09:18:29 - slack_bot.dispatcher - INFO - [645550a9] Final analysis received in 5.14s
2026-02-07 09:18:29 - slack_bot.dispatcher - INFO - Formatted text (len 708 -> 682)
2026-02-07 09:18:30 - slack_bot.dispatcher - INFO - [645550a9] 📤 Message updated 1770427095.971079
2026-02-07 09:18:30 - slack_bot.dispatcher - INFO - [645550a9] Dispatch completed in 14.49s
2026-02-07 09:18:30 - __main__ - INFO - [645550a9] ✅ Request completed in 15.02s
2026-02-07 09:22:25 - __main__ - INFO - [f3e6cc14] 📥 Received message from U0A8ZCK7RJM in D0AA4GBQRKK: 先不用，因为我早就学会了。比起原来相同分数是头疼头晕，今天早上起床的感觉跟平时其实差不多，当然我肯定不会因此剧烈运动或者继续喝酒，只是想表达一下实际体感的角度的惊喜，以及对这个数据的深入分析，有一些睡眠时间应该是因为心率的原因被佳明认为是清醒状态 (Files: 0)
2026-02-07 09:22:26 - slack_bot.dispatcher - INFO - [f3e6cc14] Processing message in D0AA4GBQRKK from U0A8ZCK7RJM
2026-02-07 09:22:26 - slack_bot.dispatcher - INFO - [f3e6cc14] Calling Gemini for initial response...
2026-02-07 09:22:26 - slack_bot.dispatcher - INFO - [f3e6cc14] Request config: model=google/gemini-3-flash-preview, tools=21, context=39 msgs
2026-02-07 09:22:34 - slack_bot.dispatcher - INFO - [f3e6cc14] Gemini response: text=1095 chars, tool_calls=0
2026-02-07 09:22:34 - slack_bot.dispatcher - INFO - [f3e6cc14] No tool calls from Gemini - checking SAFETY OVERRIDE keywords...
2026-02-07 09:22:34 - slack_bot.dispatcher - WARNING - [f3e6cc14] 🔧 SAFETY OVERRIDE: Forcing get_activity_history for 2026-02-07
2026-02-07 09:22:34 - slack_bot.dispatcher - INFO - [f3e6cc14] No SAFETY OVERRIDE match found - will return empty response or text
2026-02-07 09:22:34 - slack_bot.dispatcher - INFO - [f3e6cc14] Gemini response in 7.87s: 1095 chars, 1 tools
2026-02-07 09:22:34 - slack_bot.dispatcher - INFO - [f3e6cc14] Executing 1 tools
2026-02-07 09:22:34 - slack_bot.dispatcher - INFO - [f3e6cc14] Tool: get_activity_history Args: {'start_date': '2026-02-07', 'end_date': '2026-02-07'}
2026-02-07 09:22:34 - health.services.query - INFO - Querying activities from 2026-02-07 to 2026-02-07
2026-02-07 09:22:34 - health.services.query - INFO - Found 0 activities
2026-02-07 09:22:34 - slack_bot.dispatcher - INFO - [f3e6cc14] ✓ get_activity_history finished in 0.00s
2026-02-07 09:22:34 - slack_bot.dispatcher - INFO - [f3e6cc14] Requesting final analysis...
2026-02-07 09:22:39 - slack_bot.dispatcher - INFO - [f3e6cc14] Final analysis received in 4.71s
2026-02-07 09:22:39 - slack_bot.dispatcher - INFO - Formatted text (len 779 -> 763)
2026-02-07 09:22:39 - slack_bot.dispatcher - INFO - [f3e6cc14] 📤 Message updated 1770427346.653919
2026-02-07 09:22:39 - slack_bot.dispatcher - INFO - [f3e6cc14] Dispatch completed in 13.19s
2026-02-07 09:22:39 - __main__ - INFO - [f3e6cc14] ✅ Request completed in 13.97s
2026-02-07 09:40:26 - __main__ - INFO - [e26cb6d2] 📥 Received message from U0A8ZCK7RJM in D0AA4GBQRKK: 那么对于身体的实际伤害，现在这样是不是会小很多 (Files: 0)
2026-02-07 09:40:27 - slack_bot.dispatcher - INFO - [e26cb6d2] Processing message in D0AA4GBQRKK from U0A8ZCK7RJM
2026-02-07 09:40:27 - slack_bot.dispatcher - INFO - [e26cb6d2] Calling Gemini for initial response...
2026-02-07 09:40:27 - slack_bot.dispatcher - INFO - [e26cb6d2] Request config: model=google/gemini-3-flash-preview, tools=21, context=39 msgs
2026-02-07 09:40:34 - slack_bot.dispatcher - INFO - [e26cb6d2] Gemini response: text=1158 chars, tool_calls=0
2026-02-07 09:40:34 - slack_bot.dispatcher - INFO - [e26cb6d2] No tool calls from Gemini - checking SAFETY OVERRIDE keywords...
2026-02-07 09:40:34 - slack_bot.dispatcher - INFO - [e26cb6d2] No SAFETY OVERRIDE match found - will return empty response or text
2026-02-07 09:40:34 - slack_bot.dispatcher - INFO - [e26cb6d2] Gemini response in 7.69s: 1158 chars, 0 tools
2026-02-07 09:40:34 - slack_bot.dispatcher - INFO - Formatted text (len 1158 -> 1110)
2026-02-07 09:40:35 - slack_bot.dispatcher - INFO - [e26cb6d2] 📤 Message updated 1770428427.180759
2026-02-07 09:40:35 - slack_bot.dispatcher - INFO - [e26cb6d2] Dispatch completed in 8.36s
2026-02-07 09:40:35 - __main__ - INFO - [e26cb6d2] ✅ Request completed in 8.86s
2026-02-07 11:34:54 - __main__ - INFO - [a2872b5a] 📥 Received message from U0A8ZCK7RJM in D0AA4GBQRKK: 今天饮食应该怎么规划 (Files: 0)
2026-02-07 11:34:54 - slack_bot.dispatcher - INFO - [a2872b5a] Processing message in D0AA4GBQRKK from U0A8ZCK7RJM
2026-02-07 11:34:54 - slack_bot.dispatcher - INFO - [a2872b5a] Calling Gemini for initial response...
2026-02-07 11:34:54 - slack_bot.dispatcher - INFO - [a2872b5a] Request config: model=google/gemini-3-flash-preview, tools=21, context=39 msgs
2026-02-07 11:35:07 - slack_bot.dispatcher - INFO - [a2872b5a] Gemini response: text=1303 chars, tool_calls=0
2026-02-07 11:35:07 - slack_bot.dispatcher - INFO - [a2872b5a] No tool calls from Gemini - checking SAFETY OVERRIDE keywords...
2026-02-07 11:35:07 - slack_bot.dispatcher - WARNING - [a2872b5a] 🔧 SAFETY OVERRIDE: Forcing get_daily_detailed_stats for 2026-02-07
2026-02-07 11:35:07 - slack_bot.dispatcher - INFO - [a2872b5a] No SAFETY OVERRIDE match found - will return empty response or text
2026-02-07 11:35:07 - slack_bot.dispatcher - INFO - [a2872b5a] Gemini response in 13.11s: 1303 chars, 1 tools
2026-02-07 11:35:07 - slack_bot.dispatcher - INFO - [a2872b5a] Executing 1 tools
2026-02-07 11:35:07 - slack_bot.dispatcher - INFO - [a2872b5a] Tool: get_daily_detailed_stats Args: {'target_date': '2026-02-07'}
2026-02-07 11:35:07 - health.services.query - INFO - Querying health data summary for 2026-02-07
2026-02-07 11:35:08 - health.services.query - INFO - Found 12 metrics and 0 activities
2026-02-07 11:35:08 - slack_bot.dispatcher - INFO - [a2872b5a] ✓ get_daily_detailed_stats finished in 0.03s
2026-02-07 11:35:08 - slack_bot.dispatcher - INFO - [a2872b5a] Requesting final analysis...
2026-02-07 11:35:13 - slack_bot.dispatcher - INFO - [a2872b5a] Final analysis received in 5.22s
2026-02-07 11:35:13 - slack_bot.dispatcher - INFO - Formatted text (len 959 -> 913)
2026-02-07 11:35:13 - slack_bot.dispatcher - INFO - [a2872b5a] 📤 Message updated 1770435294.830469
2026-02-07 11:35:13 - slack_bot.dispatcher - INFO - [a2872b5a] Dispatch completed in 18.90s
2026-02-07 11:35:13 - __main__ - INFO - [a2872b5a] ✅ Request completed in 19.40s
2026-02-08 08:42:09 - __main__ - INFO - [76f33ae4] 📥 Received message from U0A8ZCK7RJM in D0AA4GBQRKK: 2月8日睡眠情况如何 (Files: 0)
2026-02-08 08:42:10 - slack_bot.dispatcher - INFO - [76f33ae4] Processing message in D0AA4GBQRKK from U0A8ZCK7RJM
2026-02-08 08:42:10 - slack_bot.dispatcher - INFO - [76f33ae4] Calling Gemini for initial response...
2026-02-08 08:42:10 - slack_bot.dispatcher - INFO - [76f33ae4] Request config: model=google/gemini-3-flash-preview, tools=21, context=39 msgs
2026-02-08 08:42:13 - slack_bot.dispatcher - WARNING - [76f33ae4] Gemini returned empty response_text! (This usually means the proxy has issues)
2026-02-08 08:42:13 - slack_bot.dispatcher - INFO - [76f33ae4] Gemini response: text=0 chars, tool_calls=2
2026-02-08 08:42:13 - slack_bot.dispatcher - INFO - [76f33ae4] Tool calls successfully generated by Gemini (no SAFETY OVERRIDE needed)
2026-02-08 08:42:13 - slack_bot.dispatcher - INFO - [76f33ae4] Gemini response in 2.84s: 0 chars, 2 tools
2026-02-08 08:42:13 - slack_bot.dispatcher - INFO - [76f33ae4] Executing 2 tools
2026-02-08 08:42:13 - slack_bot.dispatcher - INFO - [76f33ae4] Tool: sync_garmin Args: {'target_date': '2026-02-08'}
2026-02-08 08:42:13 - slack_bot.tools.garmin - INFO - Starting Garmin sync for 2026-02-08...
2026-02-08 08:42:13 - health.services.data_sync - INFO - Authenticating with Garmin...
2026-02-08 08:42:13 - health.services.garmin_client - INFO - Authenticating with Garmin Connect China for 350134531@qq.com
2026-02-08 08:42:13 - health.services.garmin_client - INFO - Successfully authenticated with Garmin Connect China
2026-02-08 08:42:13 - health.services.data_sync - INFO - Authentication successful
2026-02-08 08:42:13 - health.services.data_sync - INFO - Syncing 13 metric types from 2026-02-08 to 2026-02-08
2026-02-08 08:42:13 - health.services.data_sync - INFO - Syncing steps from 2026-02-08 to 2026-02-08 (1 days)
2026-02-08 08:42:13 - health.services.data_sync - INFO - ✓ Synced steps for 2026-02-08
2026-02-08 08:42:13 - health.services.data_sync - INFO - steps sync complete: 1 synced, 0 skipped, 0 errors
2026-02-08 08:42:13 - health.services.data_sync - INFO - Syncing heart_rate from 2026-02-08 to 2026-02-08 (1 days)
2026-02-08 08:42:13 - health.services.data_sync - INFO - ✓ Synced heart_rate for 2026-02-08
2026-02-08 08:42:13 - health.services.data_sync - INFO - heart_rate sync complete: 1 synced, 0 skipped, 0 errors
2026-02-08 08:42:13 - health.services.data_sync - INFO - Syncing sleep from 2026-02-08 to 2026-02-08 (1 days)
2026-02-08 08:42:14 - health.services.data_sync - INFO - ✓ Synced sleep for 2026-02-08
2026-02-08 08:42:14 - health.services.data_sync - INFO - sleep sync complete: 1 synced, 0 skipped, 0 errors
2026-02-08 08:42:14 - health.services.data_sync - INFO - Syncing stress from 2026-02-08 to 2026-02-08 (1 days)
2026-02-08 08:42:14 - health.services.data_sync - INFO - ✓ Synced stress for 2026-02-08
2026-02-08 08:42:14 - health.services.data_sync - INFO - stress sync complete: 1 synced, 0 skipped, 0 errors
2026-02-08 08:42:14 - health.services.data_sync - INFO - Syncing body_battery from 2026-02-08 to 2026-02-08 (1 days)
2026-02-08 08:42:14 - health.services.data_sync - INFO - ✓ Synced body_battery for 2026-02-08
2026-02-08 08:42:14 - health.services.data_sync - INFO - body_battery sync complete: 1 synced, 0 skipped, 0 errors
2026-02-08 08:42:14 - health.services.data_sync - INFO - Syncing spo2 from 2026-02-08 to 2026-02-08 (1 days)
2026-02-08 08:42:15 - health.services.data_sync - INFO - ✓ Synced spo2 for 2026-02-08
2026-02-08 08:42:15 - health.services.data_sync - INFO - spo2 sync complete: 1 synced, 0 skipped, 0 errors
2026-02-08 08:42:15 - health.services.data_sync - INFO - Syncing respiration from 2026-02-08 to 2026-02-08 (1 days)
2026-02-08 08:42:15 - health.services.data_sync - INFO - ✓ Synced respiration for 2026-02-08
2026-02-08 08:42:15 - health.services.data_sync - INFO - respiration sync complete: 1 synced, 0 skipped, 0 errors
2026-02-08 08:42:15 - health.services.data_sync - INFO - Syncing hydration from 2026-02-08 to 2026-02-08 (1 days)
2026-02-08 08:42:15 - health.services.data_sync - INFO - ✓ Synced hydration for 2026-02-08
2026-02-08 08:42:15 - health.services.data_sync - INFO - hydration sync complete: 1 synced, 0 skipped, 0 errors
2026-02-08 08:42:15 - health.services.data_sync - INFO - Syncing floors from 2026-02-08 to 2026-02-08 (1 days)
2026-02-08 08:42:16 - health.services.data_sync - INFO - ✓ Synced floors for 2026-02-08
2026-02-08 08:42:16 - health.services.data_sync - INFO - floors sync complete: 1 synced, 0 skipped, 0 errors
2026-02-08 08:42:16 - health.services.data_sync - INFO - Syncing intensity_minutes from 2026-02-08 to 2026-02-08 (1 days)
2026-02-08 08:42:16 - health.services.data_sync - INFO - ✓ Synced intensity_minutes for 2026-02-08
2026-02-08 08:42:16 - health.services.data_sync - INFO - intensity_minutes sync complete: 1 synced, 0 skipped, 0 errors
2026-02-08 08:42:16 - health.services.data_sync - INFO - Syncing hrv from 2026-02-08 to 2026-02-08 (1 days)
2026-02-08 08:42:16 - health.services.data_sync - INFO - ✓ Synced hrv for 2026-02-08
2026-02-08 08:42:16 - health.services.data_sync - INFO - hrv sync complete: 1 synced, 0 skipped, 0 errors
2026-02-08 08:42:16 - health.services.data_sync - INFO - Syncing rhr from 2026-02-08 to 2026-02-08 (1 days)
2026-02-08 08:42:16 - health.services.data_sync - INFO - ✓ Synced rhr for 2026-02-08
2026-02-08 08:42:16 - health.services.data_sync - INFO - rhr sync complete: 1 synced, 0 skipped, 0 errors
2026-02-08 08:42:16 - health.services.data_sync - INFO - Syncing weight from 2026-02-08 to 2026-02-08 (1 days)
2026-02-08 08:42:17 - health.services.data_sync - INFO - weight sync complete: 0 synced, 1 skipped, 0 errors
2026-02-08 08:42:17 - health.services.data_sync - INFO - Syncing activities from 2026-02-08 to 2026-02-08
2026-02-08 08:42:17 - health.services.data_sync - INFO - Found 0 activities
2026-02-08 08:42:17 - health.services.data_sync - INFO - Activity sync complete: 0 synced, 0 skipped, 0 errors
2026-02-08 08:42:17 - health.services.query - INFO - Querying health data summary for 2026-02-08
2026-02-08 08:42:17 - health.services.query - INFO - Found 12 metrics and 0 activities
2026-02-08 08:42:17 - slack_bot.dispatcher - INFO - [76f33ae4] ✓ sync_garmin finished in 4.34s
2026-02-08 08:42:17 - slack_bot.dispatcher - INFO - [76f33ae4] Tool: get_daily_detailed_stats Args: {'target_date': '2026-02-08'}
2026-02-08 08:42:17 - health.services.query - INFO - Querying health data summary for 2026-02-08
2026-02-08 08:42:17 - health.services.query - INFO - Found 12 metrics and 0 activities
2026-02-08 08:42:17 - slack_bot.dispatcher - INFO - [76f33ae4] ✓ get_daily_detailed_stats finished in 0.01s
2026-02-08 08:42:17 - slack_bot.dispatcher - INFO - [76f33ae4] Requesting final analysis...
2026-02-08 08:42:22 - slack_bot.dispatcher - INFO - [76f33ae4] Final analysis received in 5.47s
2026-02-08 08:42:22 - slack_bot.dispatcher - INFO - Formatted text (len 567 -> 549)
2026-02-08 08:42:23 - slack_bot.dispatcher - INFO - [76f33ae4] 📤 Message updated 1770511330.114189
2026-02-08 08:42:23 - slack_bot.dispatcher - INFO - [76f33ae4] Dispatch completed in 13.24s
2026-02-08 08:42:23 - __main__ - INFO - [76f33ae4] ✅ Request completed in 13.91s
2026-02-08 19:53:35 - __main__ - INFO - [9e8ccce9] 📥 Received message from U0A8ZCK7RJM in D0AA4GBQRKK: 明天早上因为有会议不能椭圆机了，可不可以中午11点50左右去，有什么注意事项，包括饮食上有何建议 (Files: 0)
2026-02-08 19:53:36 - slack_bot.dispatcher - INFO - [9e8ccce9] Processing message in D0AA4GBQRKK from U0A8ZCK7RJM
2026-02-08 19:53:36 - slack_bot.dispatcher - INFO - [9e8ccce9] Calling Gemini for initial response...
2026-02-08 19:53:36 - slack_bot.dispatcher - INFO - [9e8ccce9] Request config: model=google/gemini-3-flash-preview, tools=21, context=39 msgs
2026-02-08 19:53:44 - slack_bot.dispatcher - INFO - [9e8ccce9] Gemini response: text=1167 chars, tool_calls=0
2026-02-08 19:53:44 - slack_bot.dispatcher - INFO - [9e8ccce9] No tool calls from Gemini - checking SAFETY OVERRIDE keywords...
2026-02-08 19:53:44 - slack_bot.dispatcher - INFO - [9e8ccce9] No SAFETY OVERRIDE match found - will return empty response or text
2026-02-08 19:53:44 - slack_bot.dispatcher - INFO - [9e8ccce9] Gemini response in 8.23s: 1167 chars, 0 tools
2026-02-08 19:53:44 - slack_bot.dispatcher - INFO - Formatted text (len 1167 -> 1113)
2026-02-08 19:53:45 - slack_bot.dispatcher - INFO - [9e8ccce9] 📤 Message updated 1770551616.080319
2026-02-08 19:53:45 - slack_bot.dispatcher - INFO - [9e8ccce9] Dispatch completed in 9.00s
2026-02-08 19:53:45 - __main__ - INFO - [9e8ccce9] ✅ Request completed in 9.62s
2026-02-08 19:57:40 - __main__ - INFO - [0023e9a3] 📥 Received message from U0A8ZCK7RJM in D0AA4GBQRKK: 好的，请提醒 (Files: 0)
2026-02-08 19:57:41 - slack_bot.dispatcher - INFO - [0023e9a3] Processing message in D0AA4GBQRKK from U0A8ZCK7RJM
2026-02-08 19:57:41 - slack_bot.dispatcher - INFO - [0023e9a3] Calling Gemini for initial response...
2026-02-08 19:57:41 - slack_bot.dispatcher - INFO - [0023e9a3] Request config: model=google/gemini-3-flash-preview, tools=21, context=39 msgs
2026-02-08 19:57:45 - slack_bot.dispatcher - INFO - [0023e9a3] Gemini response: text=312 chars, tool_calls=0
2026-02-08 19:57:45 - slack_bot.dispatcher - INFO - [0023e9a3] No tool calls from Gemini - checking SAFETY OVERRIDE keywords...
2026-02-08 19:57:45 - slack_bot.dispatcher - INFO - [0023e9a3] No SAFETY OVERRIDE match found - will return empty response or text
2026-02-08 19:57:45 - slack_bot.dispatcher - INFO - [0023e9a3] Gemini response in 4.33s: 312 chars, 0 tools
2026-02-08 19:57:45 - slack_bot.dispatcher - INFO - Formatted text (len 312 -> 292)
2026-02-08 19:57:46 - slack_bot.dispatcher - INFO - [0023e9a3] 📤 Message updated 1770551861.090069
2026-02-08 19:57:46 - slack_bot.dispatcher - INFO - [0023e9a3] Dispatch completed in 4.83s
2026-02-08 19:57:46 - __main__ - INFO - [0023e9a3] ✅ Request completed in 5.32s
2026-02-08 22:46:58 - __main__ - INFO - [b7b8fd97] 📥 Received message from U0A8ZCK7RJM in D0AA4GBQRKK: 刚才做了卧推，请评估一下。另外，我明天打算轻断食，早上不吃饭，中午去做椭圆机zone2，是否合理。有没有什么饮食建议 (Files: 0)
2026-02-08 22:46:59 - slack_bot.dispatcher - INFO - [b7b8fd97] Processing message in D0AA4GBQRKK from U0A8ZCK7RJM
2026-02-08 22:46:59 - slack_bot.dispatcher - INFO - [b7b8fd97] Calling Gemini for initial response...
2026-02-08 22:46:59 - slack_bot.dispatcher - INFO - [b7b8fd97] Request config: model=google/gemini-3-flash-preview, tools=21, context=39 msgs
2026-02-08 22:47:02 - slack_bot.dispatcher - WARNING - [b7b8fd97] Gemini returned empty response_text! (This usually means the proxy has issues)
2026-02-08 22:47:02 - slack_bot.dispatcher - INFO - [b7b8fd97] Gemini response: text=0 chars, tool_calls=2
2026-02-08 22:47:02 - slack_bot.dispatcher - INFO - [b7b8fd97] Tool calls successfully generated by Gemini (no SAFETY OVERRIDE needed)
2026-02-08 22:47:02 - slack_bot.dispatcher - INFO - [b7b8fd97] Gemini response in 3.44s: 0 chars, 2 tools
2026-02-08 22:47:02 - slack_bot.dispatcher - INFO - [b7b8fd97] Executing 2 tools
2026-02-08 22:47:02 - slack_bot.dispatcher - INFO - [b7b8fd97] Tool: sync_garmin Args: {'target_date': '2026-02-08'}
2026-02-08 22:47:02 - slack_bot.tools.garmin - INFO - Starting Garmin sync for 2026-02-08...
2026-02-08 22:47:02 - health.services.data_sync - INFO - Authenticating with Garmin...
2026-02-08 22:47:02 - health.services.garmin_client - INFO - Authenticating with Garmin Connect China for 350134531@qq.com
2026-02-08 22:47:03 - health.services.garmin_client - INFO - Successfully authenticated with Garmin Connect China
2026-02-08 22:47:03 - health.services.data_sync - INFO - Authentication successful
2026-02-08 22:47:03 - health.services.data_sync - INFO - Syncing 13 metric types from 2026-02-08 to 2026-02-08
2026-02-08 22:47:03 - health.services.data_sync - INFO - Syncing steps from 2026-02-08 to 2026-02-08 (1 days)
2026-02-08 22:47:03 - health.services.data_sync - INFO - ✓ Synced steps for 2026-02-08
2026-02-08 22:47:03 - health.services.data_sync - INFO - steps sync complete: 1 synced, 0 skipped, 0 errors
2026-02-08 22:47:03 - health.services.data_sync - INFO - Syncing heart_rate from 2026-02-08 to 2026-02-08 (1 days)
2026-02-08 22:47:03 - health.services.data_sync - INFO - ✓ Synced heart_rate for 2026-02-08
2026-02-08 22:47:03 - health.services.data_sync - INFO - heart_rate sync complete: 1 synced, 0 skipped, 0 errors
2026-02-08 22:47:03 - health.services.data_sync - INFO - Syncing sleep from 2026-02-08 to 2026-02-08 (1 days)
2026-02-08 22:47:03 - health.services.data_sync - INFO - ✓ Synced sleep for 2026-02-08
2026-02-08 22:47:03 - health.services.data_sync - INFO - sleep sync complete: 1 synced, 0 skipped, 0 errors
2026-02-08 22:47:03 - health.services.data_sync - INFO - Syncing stress from 2026-02-08 to 2026-02-08 (1 days)
2026-02-08 22:47:03 - health.services.data_sync - INFO - ✓ Synced stress for 2026-02-08
2026-02-08 22:47:03 - health.services.data_sync - INFO - stress sync complete: 1 synced, 0 skipped, 0 errors
2026-02-08 22:47:03 - health.services.data_sync - INFO - Syncing body_battery from 2026-02-08 to 2026-02-08 (1 days)
2026-02-08 22:47:04 - health.services.data_sync - INFO - ✓ Synced body_battery for 2026-02-08
2026-02-08 22:47:04 - health.services.data_sync - INFO - body_battery sync complete: 1 synced, 0 skipped, 0 errors
2026-02-08 22:47:04 - health.services.data_sync - INFO - Syncing spo2 from 2026-02-08 to 2026-02-08 (1 days)
2026-02-08 22:47:04 - health.services.data_sync - INFO - ✓ Synced spo2 for 2026-02-08
2026-02-08 22:47:04 - health.services.data_sync - INFO - spo2 sync complete: 1 synced, 0 skipped, 0 errors
2026-02-08 22:47:04 - health.services.data_sync - INFO - Syncing respiration from 2026-02-08 to 2026-02-08 (1 days)
2026-02-08 22:47:04 - health.services.data_sync - INFO - ✓ Synced respiration for 2026-02-08
2026-02-08 22:47:04 - health.services.data_sync - INFO - respiration sync complete: 1 synced, 0 skipped, 0 errors
2026-02-08 22:47:04 - health.services.data_sync - INFO - Syncing hydration from 2026-02-08 to 2026-02-08 (1 days)
2026-02-08 22:47:04 - health.services.data_sync - INFO - ✓ Synced hydration for 2026-02-08
2026-02-08 22:47:04 - health.services.data_sync - INFO - hydration sync complete: 1 synced, 0 skipped, 0 errors
2026-02-08 22:47:04 - health.services.data_sync - INFO - Syncing floors from 2026-02-08 to 2026-02-08 (1 days)
2026-02-08 22:47:04 - health.services.data_sync - INFO - ✓ Synced floors for 2026-02-08
2026-02-08 22:47:04 - health.services.data_sync - INFO - floors sync complete: 1 synced, 0 skipped, 0 errors
2026-02-08 22:47:04 - health.services.data_sync - INFO - Syncing intensity_minutes from 2026-02-08 to 2026-02-08 (1 days)
2026-02-08 22:47:04 - health.services.data_sync - INFO - ✓ Synced intensity_minutes for 2026-02-08
2026-02-08 22:47:04 - health.services.data_sync - INFO - intensity_minutes sync complete: 1 synced, 0 skipped, 0 errors
2026-02-08 22:47:04 - health.services.data_sync - INFO - Syncing hrv from 2026-02-08 to 2026-02-08 (1 days)
2026-02-08 22:47:04 - health.services.data_sync - INFO - ✓ Synced hrv for 2026-02-08
2026-02-08 22:47:04 - health.services.data_sync - INFO - hrv sync complete: 1 synced, 0 skipped, 0 errors
2026-02-08 22:47:04 - health.services.data_sync - INFO - Syncing rhr from 2026-02-08 to 2026-02-08 (1 days)
2026-02-08 22:47:04 - health.services.data_sync - INFO - ✓ Synced rhr for 2026-02-08
2026-02-08 22:47:04 - health.services.data_sync - INFO - rhr sync complete: 1 synced, 0 skipped, 0 errors
2026-02-08 22:47:04 - health.services.data_sync - INFO - Syncing weight from 2026-02-08 to 2026-02-08 (1 days)
2026-02-08 22:47:04 - health.services.data_sync - INFO - ✓ Synced weight for 2026-02-08
2026-02-08 22:47:04 - health.services.data_sync - INFO - weight sync complete: 1 synced, 0 skipped, 0 errors
2026-02-08 22:47:04 - health.services.data_sync - INFO - Syncing activities from 2026-02-08 to 2026-02-08
2026-02-08 22:47:05 - health.services.garmin_client - INFO - Fetched 1 activities
2026-02-08 22:47:05 - health.services.data_sync - INFO - Found 1 activities
2026-02-08 22:47:05 - health.services.data_sync - INFO - ✓ Synced activity 564291614 (strength_training) on 2026-02-08
2026-02-08 22:47:05 - health.services.data_sync - INFO - Activity sync complete: 1 synced, 0 skipped, 0 errors
2026-02-08 22:47:05 - health.services.query - INFO - Querying health data summary for 2026-02-08
2026-02-08 22:47:05 - health.services.query - INFO - Found 13 metrics and 1 activities
2026-02-08 22:47:05 - slack_bot.dispatcher - INFO - [b7b8fd97] ✓ sync_garmin finished in 2.25s
2026-02-08 22:47:05 - slack_bot.dispatcher - INFO - [b7b8fd97] Tool: get_activity_history Args: {'end_date': '2026-02-08', 'start_date': '2026-02-08'}
2026-02-08 22:47:05 - health.services.query - INFO - Querying activities from 2026-02-08 to 2026-02-08
2026-02-08 22:47:05 - health.services.query - INFO - Found 1 activities
2026-02-08 22:47:05 - slack_bot.dispatcher - INFO - [b7b8fd97] ✓ get_activity_history finished in 0.00s
2026-02-08 22:47:05 - slack_bot.dispatcher - INFO - [b7b8fd97] Requesting final analysis...
2026-02-08 22:47:11 - slack_bot.dispatcher - INFO - [b7b8fd97] Final analysis received in 6.09s
2026-02-08 22:47:11 - slack_bot.dispatcher - INFO - Formatted text (len 893 -> 851)
2026-02-08 22:47:11 - slack_bot.dispatcher - INFO - [b7b8fd97] 📤 Message updated 1770562019.291839
2026-02-08 22:47:11 - slack_bot.dispatcher - INFO - [b7b8fd97] Dispatch completed in 12.51s
2026-02-08 22:47:11 - __main__ - INFO - [b7b8fd97] ✅ Request completed in 13.15s
2026-02-09 09:39:43 - __main__ - INFO - [d3162528] 📥 Received message from U0A8ZCK7RJM in D0AA4GBQRKK: 2月9日的睡眠情况如何 (Files: 0)
2026-02-09 09:39:43 - slack_bot.dispatcher - INFO - [d3162528] Processing message in D0AA4GBQRKK from U0A8ZCK7RJM
2026-02-09 09:39:43 - slack_bot.dispatcher - INFO - [d3162528] Calling Gemini for initial response...
2026-02-09 09:39:43 - slack_bot.dispatcher - INFO - [d3162528] Request config: model=google/gemini-3-flash-preview, tools=21, context=39 msgs
2026-02-09 09:39:46 - slack_bot.dispatcher - WARNING - [d3162528] Gemini returned empty response_text! (This usually means the proxy has issues)
2026-02-09 09:39:46 - slack_bot.dispatcher - INFO - [d3162528] Gemini response: text=0 chars, tool_calls=2
2026-02-09 09:39:46 - slack_bot.dispatcher - INFO - [d3162528] Tool calls successfully generated by Gemini (no SAFETY OVERRIDE needed)
2026-02-09 09:39:46 - slack_bot.dispatcher - INFO - [d3162528] Gemini response in 2.79s: 0 chars, 2 tools
2026-02-09 09:39:46 - slack_bot.dispatcher - INFO - [d3162528] Executing 2 tools
2026-02-09 09:39:46 - slack_bot.dispatcher - INFO - [d3162528] Tool: sync_garmin Args: {'target_date': '2026-02-09'}
2026-02-09 09:39:46 - slack_bot.tools.garmin - INFO - Starting Garmin sync for 2026-02-09...
2026-02-09 09:39:46 - health.services.data_sync - INFO - Authenticating with Garmin...
2026-02-09 09:39:46 - health.services.garmin_client - INFO - Authenticating with Garmin Connect China for 350134531@qq.com
2026-02-09 09:39:47 - health.services.garmin_client - INFO - Successfully authenticated with Garmin Connect China
2026-02-09 09:39:47 - health.services.data_sync - INFO - Authentication successful
2026-02-09 09:39:47 - health.services.data_sync - INFO - Syncing 13 metric types from 2026-02-09 to 2026-02-09
2026-02-09 09:39:47 - health.services.data_sync - INFO - Syncing steps from 2026-02-09 to 2026-02-09 (1 days)
2026-02-09 09:39:47 - health.services.data_sync - INFO - ✓ Synced steps for 2026-02-09
2026-02-09 09:39:47 - health.services.data_sync - INFO - steps sync complete: 1 synced, 0 skipped, 0 errors
2026-02-09 09:39:47 - health.services.data_sync - INFO - Syncing heart_rate from 2026-02-09 to 2026-02-09 (1 days)
2026-02-09 09:39:47 - health.services.data_sync - INFO - ✓ Synced heart_rate for 2026-02-09
2026-02-09 09:39:47 - health.services.data_sync - INFO - heart_rate sync complete: 1 synced, 0 skipped, 0 errors
2026-02-09 09:39:47 - health.services.data_sync - INFO - Syncing sleep from 2026-02-09 to 2026-02-09 (1 days)
2026-02-09 09:39:47 - health.services.data_sync - INFO - ✓ Synced sleep for 2026-02-09
2026-02-09 09:39:47 - health.services.data_sync - INFO - sleep sync complete: 1 synced, 0 skipped, 0 errors
2026-02-09 09:39:47 - health.services.data_sync - INFO - Syncing stress from 2026-02-09 to 2026-02-09 (1 days)
2026-02-09 09:39:47 - health.services.data_sync - INFO - ✓ Synced stress for 2026-02-09
2026-02-09 09:39:47 - health.services.data_sync - INFO - stress sync complete: 1 synced, 0 skipped, 0 errors
2026-02-09 09:39:47 - health.services.data_sync - INFO - Syncing body_battery from 2026-02-09 to 2026-02-09 (1 days)
2026-02-09 09:39:48 - health.services.data_sync - INFO - ✓ Synced body_battery for 2026-02-09
2026-02-09 09:39:48 - health.services.data_sync - INFO - body_battery sync complete: 1 synced, 0 skipped, 0 errors
2026-02-09 09:39:48 - health.services.data_sync - INFO - Syncing spo2 from 2026-02-09 to 2026-02-09 (1 days)
2026-02-09 09:39:48 - health.services.data_sync - INFO - ✓ Synced spo2 for 2026-02-09
2026-02-09 09:39:48 - health.services.data_sync - INFO - spo2 sync complete: 1 synced, 0 skipped, 0 errors
2026-02-09 09:39:48 - health.services.data_sync - INFO - Syncing respiration from 2026-02-09 to 2026-02-09 (1 days)
2026-02-09 09:39:48 - health.services.data_sync - INFO - ✓ Synced respiration for 2026-02-09
2026-02-09 09:39:48 - health.services.data_sync - INFO - respiration sync complete: 1 synced, 0 skipped, 0 errors
2026-02-09 09:39:48 - health.services.data_sync - INFO - Syncing hydration from 2026-02-09 to 2026-02-09 (1 days)
2026-02-09 09:39:48 - health.services.data_sync - INFO - ✓ Synced hydration for 2026-02-09
2026-02-09 09:39:48 - health.services.data_sync - INFO - hydration sync complete: 1 synced, 0 skipped, 0 errors
2026-02-09 09:39:48 - health.services.data_sync - INFO - Syncing floors from 2026-02-09 to 2026-02-09 (1 days)
2026-02-09 09:39:48 - health.services.data_sync - INFO - ✓ Synced floors for 2026-02-09
2026-02-09 09:39:48 - health.services.data_sync - INFO - floors sync complete: 1 synced, 0 skipped, 0 errors
2026-02-09 09:39:48 - health.services.data_sync - INFO - Syncing intensity_minutes from 2026-02-09 to 2026-02-09 (1 days)
2026-02-09 09:39:48 - health.services.data_sync - INFO - ✓ Synced intensity_minutes for 2026-02-09
2026-02-09 09:39:48 - health.services.data_sync - INFO - intensity_minutes sync complete: 1 synced, 0 skipped, 0 errors
2026-02-09 09:39:48 - health.services.data_sync - INFO - Syncing hrv from 2026-02-09 to 2026-02-09 (1 days)
2026-02-09 09:39:48 - health.services.data_sync - INFO - ✓ Synced hrv for 2026-02-09
2026-02-09 09:39:48 - health.services.data_sync - INFO - hrv sync complete: 1 synced, 0 skipped, 0 errors
2026-02-09 09:39:48 - health.services.data_sync - INFO - Syncing rhr from 2026-02-09 to 2026-02-09 (1 days)
2026-02-09 09:39:48 - health.services.data_sync - INFO - ✓ Synced rhr for 2026-02-09
2026-02-09 09:39:48 - health.services.data_sync - INFO - rhr sync complete: 1 synced, 0 skipped, 0 errors
2026-02-09 09:39:48 - health.services.data_sync - INFO - Syncing weight from 2026-02-09 to 2026-02-09 (1 days)
2026-02-09 09:39:48 - health.services.data_sync - INFO - weight sync complete: 0 synced, 1 skipped, 0 errors
2026-02-09 09:39:48 - health.services.data_sync - INFO - Syncing activities from 2026-02-09 to 2026-02-09
2026-02-09 09:39:49 - health.services.data_sync - INFO - Found 0 activities
2026-02-09 09:39:49 - health.services.data_sync - INFO - Activity sync complete: 0 synced, 0 skipped, 0 errors
2026-02-09 09:39:49 - health.services.query - INFO - Querying health data summary for 2026-02-09
2026-02-09 09:39:49 - health.services.query - INFO - Found 12 metrics and 0 activities
2026-02-09 09:39:49 - slack_bot.dispatcher - INFO - [d3162528] ✓ sync_garmin finished in 2.32s
2026-02-09 09:39:49 - slack_bot.dispatcher - INFO - [d3162528] Tool: get_daily_detailed_stats Args: {'target_date': '2026-02-09'}
2026-02-09 09:39:49 - health.services.query - INFO - Querying health data summary for 2026-02-09
2026-02-09 09:39:49 - health.services.query - INFO - Found 12 metrics and 0 activities
2026-02-09 09:39:49 - slack_bot.dispatcher - INFO - [d3162528] ✓ get_daily_detailed_stats finished in 0.01s
2026-02-09 09:39:49 - slack_bot.dispatcher - INFO - [d3162528] Requesting final analysis...
2026-02-09 09:39:52 - slack_bot.dispatcher - INFO - [d3162528] Final analysis received in 3.77s
2026-02-09 09:39:52 - slack_bot.dispatcher - INFO - Formatted text (len 523 -> 499)
2026-02-09 09:39:53 - slack_bot.dispatcher - INFO - [d3162528] 📤 Message updated 1770601183.766069
2026-02-09 09:39:53 - slack_bot.dispatcher - INFO - [d3162528] Dispatch completed in 9.50s
2026-02-09 09:39:53 - __main__ - INFO - [d3162528] ✅ Request completed in 10.14s
2026-02-09 10:20:55 - __main__ - INFO - [43fb671b] 📥 Received message from U0A8ZCK7RJM in D0AA4GBQRKK: 48ms的hrv虽然不低，但也不算高，感觉最近整体hrv即使是在睡眠条件比较好的情况下仍然不高，可能会有下降的趋势，这是否意味着最近的酒精压力带来了长效的负担，对此有何建议 (Files: 0)
2026-02-09 10:20:55 - slack_bot.dispatcher - INFO - [43fb671b] Processing message in D0AA4GBQRKK from U0A8ZCK7RJM
2026-02-09 10:20:55 - slack_bot.dispatcher - INFO - [43fb671b] Calling Gemini for initial response...
2026-02-09 10:20:55 - slack_bot.dispatcher - INFO - [43fb671b] Request config: model=google/gemini-3-flash-preview, tools=21, context=39 msgs
2026-02-09 10:21:05 - slack_bot.dispatcher - INFO - [43fb671b] Gemini response: text=1421 chars, tool_calls=0
2026-02-09 10:21:05 - slack_bot.dispatcher - INFO - [43fb671b] No tool calls from Gemini - checking SAFETY OVERRIDE keywords...
2026-02-09 10:21:05 - slack_bot.dispatcher - WARNING - [43fb671b] 🔧 SAFETY OVERRIDE: Forcing get_metric_history for hrv (2026-01-10 to 2026-02-09)
2026-02-09 10:21:05 - slack_bot.dispatcher - INFO - [43fb671b] No SAFETY OVERRIDE match found - will return empty response or text
2026-02-09 10:21:05 - slack_bot.dispatcher - INFO - [43fb671b] Gemini response in 9.95s: 1421 chars, 1 tools
2026-02-09 10:21:05 - slack_bot.dispatcher - INFO - [43fb671b] Executing 1 tools
2026-02-09 10:21:05 - slack_bot.dispatcher - INFO - [43fb671b] Tool: get_metric_history Args: {'metric_type': 'hrv', 'start_date': '2026-01-10', 'end_date': '2026-02-09'}
2026-02-09 10:21:05 - slack_bot.tools.health_read - INFO - Time range 31 days - using aggregated analysis
2026-02-09 10:21:05 - health.services.query - INFO - Querying hrv from 2026-01-10 to 2026-02-09
2026-02-09 10:21:05 - health.services.query - INFO - Found 28 records for hrv
2026-02-09 10:21:05 - slack_bot.dispatcher - INFO - [43fb671b] ✓ get_metric_history finished in 0.06s
2026-02-09 10:21:05 - slack_bot.dispatcher - INFO - [43fb671b] Requesting final analysis...
2026-02-09 10:21:13 - slack_bot.dispatcher - INFO - [43fb671b] Final analysis received in 7.83s
2026-02-09 10:21:13 - slack_bot.dispatcher - INFO - Formatted text (len 1238 -> 1198)
2026-02-09 10:21:14 - slack_bot.dispatcher - INFO - [43fb671b] 📤 Message updated 1770603655.588789
2026-02-09 10:21:14 - slack_bot.dispatcher - INFO - [43fb671b] Dispatch completed in 18.48s
2026-02-09 10:21:14 - __main__ - INFO - [43fb671b] ✅ Request completed in 19.01s
2026-02-09 10:32:30 - __main__ - INFO - [3da99c82] 📥 Received message from U0A8ZCK7RJM in D0AA4GBQRKK: 我现在又有点怀疑是咖啡因导致略微胸闷，这个有没有科学依据 (Files: 0)
2026-02-09 10:32:31 - slack_bot.dispatcher - INFO - [3da99c82] Processing message in D0AA4GBQRKK from U0A8ZCK7RJM
2026-02-09 10:32:31 - slack_bot.dispatcher - INFO - [3da99c82] Calling Gemini for initial response...
2026-02-09 10:32:31 - slack_bot.dispatcher - INFO - [3da99c82] Request config: model=google/gemini-3-flash-preview, tools=21, context=39 msgs
2026-02-09 10:32:42 - slack_bot.dispatcher - INFO - [3da99c82] Gemini response: text=1046 chars, tool_calls=0
2026-02-09 10:32:42 - slack_bot.dispatcher - INFO - [3da99c82] No tool calls from Gemini - checking SAFETY OVERRIDE keywords...
2026-02-09 10:32:42 - slack_bot.dispatcher - INFO - [3da99c82] No SAFETY OVERRIDE match found - will return empty response or text
2026-02-09 10:32:42 - slack_bot.dispatcher - INFO - [3da99c82] Gemini response in 10.62s: 1046 chars, 0 tools
2026-02-09 10:32:42 - slack_bot.dispatcher - INFO - Formatted text (len 1046 -> 1004)
2026-02-09 10:32:42 - slack_bot.dispatcher - INFO - [3da99c82] 📤 Message updated 1770604351.532609
2026-02-09 10:32:42 - slack_bot.dispatcher - INFO - [3da99c82] Dispatch completed in 11.25s
2026-02-09 10:32:42 - __main__ - INFO - [3da99c82] ✅ Request completed in 11.94s
2026-02-09 10:41:22 - __main__ - INFO - [5560ce6b] 📥 Received message from U0A8ZCK7RJM in D0AA4GBQRKK: 前一天卧推，第二天轻断食，会不会不大好 (Files: 0)
2026-02-09 10:41:23 - slack_bot.dispatcher - INFO - [5560ce6b] Processing message in D0AA4GBQRKK from U0A8ZCK7RJM
2026-02-09 10:41:23 - slack_bot.dispatcher - INFO - [5560ce6b] Calling Gemini for initial response...
2026-02-09 10:41:23 - slack_bot.dispatcher - INFO - [5560ce6b] Request config: model=google/gemini-3-flash-preview, tools=21, context=39 msgs
2026-02-09 10:41:34 - slack_bot.dispatcher - INFO - [5560ce6b] Gemini response: text=1390 chars, tool_calls=0
2026-02-09 10:41:34 - slack_bot.dispatcher - INFO - [5560ce6b] No tool calls from Gemini - checking SAFETY OVERRIDE keywords...
2026-02-09 10:41:34 - slack_bot.dispatcher - INFO - [5560ce6b] No SAFETY OVERRIDE match found - will return empty response or text
2026-02-09 10:41:34 - slack_bot.dispatcher - INFO - [5560ce6b] Gemini response in 11.73s: 1390 chars, 0 tools
2026-02-09 10:41:34 - slack_bot.dispatcher - INFO - Formatted text (len 1390 -> 1332)
2026-02-09 10:41:35 - slack_bot.dispatcher - INFO - [5560ce6b] 📤 Message updated 1770604883.027099
2026-02-09 10:41:35 - slack_bot.dispatcher - INFO - [5560ce6b] Dispatch completed in 12.42s
2026-02-09 10:41:35 - __main__ - INFO - [5560ce6b] ✅ Request completed in 12.97s
2026-02-09 17:38:41 - __main__ - INFO - [38d55796] 📥 Received message from U0A8ZCK7RJM in D0AA4GBQRKK: 下午四点半喝了一勺蛋白粉，现在是五点半，吃金枪鱼沙拉 (Files: 0)
2026-02-09 17:38:42 - slack_bot.dispatcher - INFO - [38d55796] Processing message in D0AA4GBQRKK from U0A8ZCK7RJM
2026-02-09 17:38:42 - slack_bot.dispatcher - INFO - [38d55796] Calling Gemini for initial response...
2026-02-09 17:38:42 - slack_bot.dispatcher - INFO - [38d55796] Request config: model=google/gemini-3-flash-preview, tools=21, context=39 msgs
2026-02-09 17:38:48 - slack_bot.dispatcher - INFO - [38d55796] Gemini response: text=869 chars, tool_calls=0
2026-02-09 17:38:48 - slack_bot.dispatcher - INFO - [38d55796] No tool calls from Gemini - checking SAFETY OVERRIDE keywords...
2026-02-09 17:38:48 - slack_bot.dispatcher - WARNING - [38d55796] 🔧 SAFETY OVERRIDE: Forcing get_daily_detailed_stats for 2026-02-09
2026-02-09 17:38:48 - slack_bot.dispatcher - INFO - [38d55796] No SAFETY OVERRIDE match found - will return empty response or text
2026-02-09 17:38:48 - slack_bot.dispatcher - INFO - [38d55796] Gemini response in 6.22s: 869 chars, 1 tools
2026-02-09 17:38:48 - slack_bot.dispatcher - INFO - [38d55796] Executing 1 tools
2026-02-09 17:38:48 - slack_bot.dispatcher - INFO - [38d55796] Tool: get_daily_detailed_stats Args: {'target_date': '2026-02-09'}
2026-02-09 17:38:48 - health.services.query - INFO - Querying health data summary for 2026-02-09
2026-02-09 17:38:48 - health.services.query - INFO - Found 12 metrics and 0 activities
2026-02-09 17:38:48 - slack_bot.dispatcher - INFO - [38d55796] ✓ get_daily_detailed_stats finished in 0.05s
2026-02-09 17:38:48 - slack_bot.dispatcher - INFO - [38d55796] Requesting final analysis...
2026-02-09 17:38:53 - slack_bot.dispatcher - INFO - [38d55796] Final analysis received in 4.93s
2026-02-09 17:38:53 - slack_bot.dispatcher - INFO - Formatted text (len 627 -> 607)
2026-02-09 17:38:53 - slack_bot.dispatcher - INFO - [38d55796] 📤 Message updated 1770629921.934459
2026-02-09 17:38:53 - slack_bot.dispatcher - INFO - [38d55796] Dispatch completed in 11.88s
2026-02-09 17:38:53 - __main__ - INFO - [38d55796] ✅ Request completed in 12.54s
2026-02-10 09:58:56 - __main__ - INFO - [920347c9] 📥 Received message from U0A8ZCK7RJM in D0AA4GBQRKK: 2月10日的睡眠和椭圆机运动怎么样，请分析一下 (Files: 0)
2026-02-10 09:58:57 - slack_bot.dispatcher - INFO - [920347c9] Processing message in D0AA4GBQRKK from U0A8ZCK7RJM
2026-02-10 09:58:57 - slack_bot.dispatcher - INFO - [920347c9] Calling Gemini for initial response...
2026-02-10 09:58:57 - slack_bot.dispatcher - INFO - [920347c9] Request config: model=google/gemini-3-flash-preview, tools=21, context=39 msgs
2026-02-10 09:59:00 - slack_bot.dispatcher - WARNING - [920347c9] Gemini returned empty response_text! (This usually means the proxy has issues)
2026-02-10 09:59:00 - slack_bot.dispatcher - INFO - [920347c9] Gemini response: text=0 chars, tool_calls=2
2026-02-10 09:59:00 - slack_bot.dispatcher - INFO - [920347c9] Tool calls successfully generated by Gemini (no SAFETY OVERRIDE needed)
2026-02-10 09:59:00 - slack_bot.dispatcher - INFO - [920347c9] Gemini response in 3.49s: 0 chars, 2 tools
2026-02-10 09:59:00 - slack_bot.dispatcher - INFO - [920347c9] Executing 2 tools
2026-02-10 09:59:00 - slack_bot.dispatcher - INFO - [920347c9] Tool: sync_garmin Args: {'target_date': '2026-02-10'}
2026-02-10 09:59:00 - slack_bot.tools.garmin - INFO - Starting Garmin sync for 2026-02-10...
2026-02-10 09:59:00 - health.services.data_sync - INFO - Authenticating with Garmin...
2026-02-10 09:59:00 - health.services.garmin_client - INFO - Authenticating with Garmin Connect China for 350134531@qq.com
2026-02-10 09:59:01 - health.services.garmin_client - INFO - Successfully authenticated with Garmin Connect China
2026-02-10 09:59:01 - health.services.data_sync - INFO - Authentication successful
2026-02-10 09:59:01 - health.services.data_sync - INFO - Syncing 13 metric types from 2026-02-10 to 2026-02-10
2026-02-10 09:59:01 - health.services.data_sync - INFO - Syncing steps from 2026-02-10 to 2026-02-10 (1 days)
2026-02-10 09:59:01 - health.services.data_sync - INFO - ✓ Synced steps for 2026-02-10
2026-02-10 09:59:01 - health.services.data_sync - INFO - steps sync complete: 1 synced, 0 skipped, 0 errors
2026-02-10 09:59:01 - health.services.data_sync - INFO - Syncing heart_rate from 2026-02-10 to 2026-02-10 (1 days)
2026-02-10 09:59:01 - health.services.data_sync - INFO - ✓ Synced heart_rate for 2026-02-10
2026-02-10 09:59:01 - health.services.data_sync - INFO - heart_rate sync complete: 1 synced, 0 skipped, 0 errors
2026-02-10 09:59:01 - health.services.data_sync - INFO - Syncing sleep from 2026-02-10 to 2026-02-10 (1 days)
2026-02-10 09:59:02 - health.services.data_sync - INFO - ✓ Synced sleep for 2026-02-10
2026-02-10 09:59:02 - health.services.data_sync - INFO - sleep sync complete: 1 synced, 0 skipped, 0 errors
2026-02-10 09:59:02 - health.services.data_sync - INFO - Syncing stress from 2026-02-10 to 2026-02-10 (1 days)
2026-02-10 09:59:02 - health.services.data_sync - INFO - ✓ Synced stress for 2026-02-10
2026-02-10 09:59:02 - health.services.data_sync - INFO - stress sync complete: 1 synced, 0 skipped, 0 errors
2026-02-10 09:59:02 - health.services.data_sync - INFO - Syncing body_battery from 2026-02-10 to 2026-02-10 (1 days)
2026-02-10 09:59:02 - health.services.data_sync - INFO - ✓ Synced body_battery for 2026-02-10
2026-02-10 09:59:02 - health.services.data_sync - INFO - body_battery sync complete: 1 synced, 0 skipped, 0 errors
2026-02-10 09:59:02 - health.services.data_sync - INFO - Syncing spo2 from 2026-02-10 to 2026-02-10 (1 days)
2026-02-10 09:59:02 - health.services.data_sync - INFO - ✓ Synced spo2 for 2026-02-10
2026-02-10 09:59:02 - health.services.data_sync - INFO - spo2 sync complete: 1 synced, 0 skipped, 0 errors
2026-02-10 09:59:02 - health.services.data_sync - INFO - Syncing respiration from 2026-02-10 to 2026-02-10 (1 days)
2026-02-10 09:59:02 - health.services.data_sync - INFO - ✓ Synced respiration for 2026-02-10
2026-02-10 09:59:02 - health.services.data_sync - INFO - respiration sync complete: 1 synced, 0 skipped, 0 errors
2026-02-10 09:59:02 - health.services.data_sync - INFO - Syncing hydration from 2026-02-10 to 2026-02-10 (1 days)
2026-02-10 09:59:02 - health.services.data_sync - INFO - ✓ Synced hydration for 2026-02-10
2026-02-10 09:59:02 - health.services.data_sync - INFO - hydration sync complete: 1 synced, 0 skipped, 0 errors
2026-02-10 09:59:02 - health.services.data_sync - INFO - Syncing floors from 2026-02-10 to 2026-02-10 (1 days)
2026-02-10 09:59:02 - health.services.data_sync - INFO - ✓ Synced floors for 2026-02-10
2026-02-10 09:59:02 - health.services.data_sync - INFO - floors sync complete: 1 synced, 0 skipped, 0 errors
2026-02-10 09:59:02 - health.services.data_sync - INFO - Syncing intensity_minutes from 2026-02-10 to 2026-02-10 (1 days)
2026-02-10 09:59:02 - health.services.data_sync - INFO - ✓ Synced intensity_minutes for 2026-02-10
2026-02-10 09:59:02 - health.services.data_sync - INFO - intensity_minutes sync complete: 1 synced, 0 skipped, 0 errors
2026-02-10 09:59:02 - health.services.data_sync - INFO - Syncing hrv from 2026-02-10 to 2026-02-10 (1 days)
2026-02-10 09:59:02 - health.services.data_sync - INFO - ✓ Synced hrv for 2026-02-10
2026-02-10 09:59:02 - health.services.data_sync - INFO - hrv sync complete: 1 synced, 0 skipped, 0 errors
2026-02-10 09:59:02 - health.services.data_sync - INFO - Syncing rhr from 2026-02-10 to 2026-02-10 (1 days)
2026-02-10 09:59:03 - health.services.data_sync - INFO - ✓ Synced rhr for 2026-02-10
2026-02-10 09:59:03 - health.services.data_sync - INFO - rhr sync complete: 1 synced, 0 skipped, 0 errors
2026-02-10 09:59:03 - health.services.data_sync - INFO - Syncing weight from 2026-02-10 to 2026-02-10 (1 days)
2026-02-10 09:59:03 - health.services.data_sync - INFO - weight sync complete: 0 synced, 1 skipped, 0 errors
2026-02-10 09:59:03 - health.services.data_sync - INFO - Syncing activities from 2026-02-10 to 2026-02-10
2026-02-10 09:59:03 - health.services.garmin_client - INFO - Fetched 1 activities
2026-02-10 09:59:03 - health.services.data_sync - INFO - Found 1 activities
2026-02-10 09:59:03 - health.services.data_sync - INFO - ✓ Synced activity 564591536 (elliptical) on 2026-02-10
2026-02-10 09:59:03 - health.services.data_sync - INFO - Activity sync complete: 1 synced, 0 skipped, 0 errors
2026-02-10 09:59:03 - health.services.query - INFO - Querying health data summary for 2026-02-10
2026-02-10 09:59:03 - health.services.query - INFO - Found 12 metrics and 1 activities
2026-02-10 09:59:03 - slack_bot.dispatcher - INFO - [920347c9] ✓ sync_garmin finished in 2.40s
2026-02-10 09:59:03 - slack_bot.dispatcher - INFO - [920347c9] Tool: get_daily_detailed_stats Args: {'target_date': '2026-02-10'}
2026-02-10 09:59:03 - health.services.query - INFO - Querying health data summary for 2026-02-10
2026-02-10 09:59:03 - health.services.query - INFO - Found 12 metrics and 1 activities
2026-02-10 09:59:03 - slack_bot.dispatcher - INFO - [920347c9] ✓ get_daily_detailed_stats finished in 0.01s
2026-02-10 09:59:03 - slack_bot.dispatcher - INFO - [920347c9] Requesting final analysis...
2026-02-10 09:59:08 - slack_bot.dispatcher - INFO - [920347c9] Final analysis received in 5.05s
2026-02-10 09:59:08 - slack_bot.dispatcher - INFO - Formatted text (len 742 -> 714)
2026-02-10 09:59:08 - slack_bot.dispatcher - WARNING - [920347c9] Update failed, posting new: The request to the Slack API failed. (url: https://slack.com/api/chat.update)
The server responded with: {'ok': False, 'error': 'msg_too_long'}
2026-02-10 09:59:09 - slack_bot.dispatcher - INFO - [920347c9] Dispatch completed in 12.19s
2026-02-10 09:59:09 - __main__ - INFO - [920347c9] ✅ Request completed in 12.79s
2026-02-10 10:02:34 - __main__ - INFO - [8dfb8710] 📥 Received message from U0A8ZCK7RJM in D0AA4GBQRKK: 今天十点喝了两勺蛋白粉 (Files: 0)
2026-02-10 10:02:35 - slack_bot.dispatcher - INFO - [8dfb8710] Processing message in D0AA4GBQRKK from U0A8ZCK7RJM
2026-02-10 10:02:35 - slack_bot.dispatcher - INFO - [8dfb8710] Calling Gemini for initial response...
2026-02-10 10:02:35 - slack_bot.dispatcher - INFO - [8dfb8710] Request config: model=google/gemini-3-flash-preview, tools=21, context=39 msgs
2026-02-10 10:02:37 - slack_bot.dispatcher - WARNING - [8dfb8710] Gemini returned empty response_text! (This usually means the proxy has issues)
2026-02-10 10:02:37 - slack_bot.dispatcher - INFO - [8dfb8710] Gemini response: text=0 chars, tool_calls=1
2026-02-10 10:02:37 - slack_bot.dispatcher - INFO - [8dfb8710] Tool calls successfully generated by Gemini (no SAFETY OVERRIDE needed)
2026-02-10 10:02:37 - slack_bot.dispatcher - INFO - [8dfb8710] Gemini response in 2.62s: 0 chars, 1 tools
2026-02-10 10:02:37 - slack_bot.dispatcher - INFO - [8dfb8710] Executing 1 tools
2026-02-10 10:02:37 - slack_bot.dispatcher - INFO - [8dfb8710] Tool: log_supplement Args: {'dosage': '2 scoops', 'target_date': '2026-02-10', 'time': '10:00', 'name': 'Protein Powder'}
2026-02-10 10:02:37 - health.services.manual_log_storage - INFO - Saved manual log for 2026-02-10 to /Users/lili/workspace/bulter/data/health/manual_logs/2026/02/2026-02-10.json
2026-02-10 10:02:37 - health.services.manual_log_storage - INFO - Added supplement entry for 2026-02-10: Protein Powder
2026-02-10 10:02:37 - slack_bot.dispatcher - INFO - [8dfb8710] ✓ log_supplement finished in 0.00s
2026-02-10 10:02:37 - slack_bot.dispatcher - INFO - [8dfb8710] Requesting final analysis...
2026-02-10 10:02:39 - slack_bot.dispatcher - INFO - [8dfb8710] Final analysis received in 2.33s
2026-02-10 10:02:39 - slack_bot.dispatcher - INFO - Formatted text (len 246 -> 240)
2026-02-10 10:02:40 - slack_bot.dispatcher - INFO - [8dfb8710] 📤 Message updated 1770688954.957619
2026-02-10 10:02:40 - slack_bot.dispatcher - INFO - [8dfb8710] Dispatch completed in 5.68s
2026-02-10 10:02:40 - __main__ - INFO - [8dfb8710] ✅ Request completed in 6.22s
2026-02-11 07:43:17 - __main__ - INFO - [ce4fd88b] 📥 Received message from U0A8ZCK7RJM in D0AA4GBQRKK: 2月11日睡得怎么样 (Files: 0)
2026-02-11 07:43:18 - slack_bot.dispatcher - INFO - [ce4fd88b] Processing message in D0AA4GBQRKK from U0A8ZCK7RJM
2026-02-11 07:43:18 - slack_bot.dispatcher - INFO - [ce4fd88b] Calling Gemini for initial response...
2026-02-11 07:43:18 - slack_bot.dispatcher - INFO - [ce4fd88b] Request config: model=google/gemini-3-flash-preview, tools=21, context=39 msgs
2026-02-11 07:43:21 - slack_bot.dispatcher - WARNING - [ce4fd88b] Gemini returned empty response_text! (This usually means the proxy has issues)
2026-02-11 07:43:21 - slack_bot.dispatcher - INFO - [ce4fd88b] Gemini response: text=0 chars, tool_calls=2
2026-02-11 07:43:21 - slack_bot.dispatcher - INFO - [ce4fd88b] Tool calls successfully generated by Gemini (no SAFETY OVERRIDE needed)
2026-02-11 07:43:21 - slack_bot.dispatcher - INFO - [ce4fd88b] Gemini response in 3.08s: 0 chars, 2 tools
2026-02-11 07:43:21 - slack_bot.dispatcher - INFO - [ce4fd88b] Executing 2 tools
2026-02-11 07:43:21 - slack_bot.dispatcher - INFO - [ce4fd88b] Tool: sync_garmin Args: {'target_date': '2026-02-11'}
2026-02-11 07:43:21 - slack_bot.tools.garmin - INFO - Starting Garmin sync for 2026-02-11...
2026-02-11 07:43:21 - health.services.data_sync - INFO - Authenticating with Garmin...
2026-02-11 07:43:21 - health.services.garmin_client - INFO - Authenticating with Garmin Connect China for 350134531@qq.com
2026-02-11 07:43:22 - health.services.garmin_client - INFO - Successfully authenticated with Garmin Connect China
2026-02-11 07:43:22 - health.services.data_sync - INFO - Authentication successful
2026-02-11 07:43:22 - health.services.data_sync - INFO - Syncing 13 metric types from 2026-02-11 to 2026-02-11
2026-02-11 07:43:22 - health.services.data_sync - INFO - Syncing steps from 2026-02-11 to 2026-02-11 (1 days)
2026-02-11 07:43:22 - health.services.data_sync - INFO - ✓ Synced steps for 2026-02-11
2026-02-11 07:43:22 - health.services.data_sync - INFO - steps sync complete: 1 synced, 0 skipped, 0 errors
2026-02-11 07:43:22 - health.services.data_sync - INFO - Syncing heart_rate from 2026-02-11 to 2026-02-11 (1 days)
2026-02-11 07:43:22 - health.services.data_sync - INFO - ✓ Synced heart_rate for 2026-02-11
2026-02-11 07:43:22 - health.services.data_sync - INFO - heart_rate sync complete: 1 synced, 0 skipped, 0 errors
2026-02-11 07:43:22 - health.services.data_sync - INFO - Syncing sleep from 2026-02-11 to 2026-02-11 (1 days)
2026-02-11 07:43:22 - health.services.data_sync - INFO - ✓ Synced sleep for 2026-02-11
2026-02-11 07:43:22 - health.services.data_sync - INFO - sleep sync complete: 1 synced, 0 skipped, 0 errors
2026-02-11 07:43:22 - health.services.data_sync - INFO - Syncing stress from 2026-02-11 to 2026-02-11 (1 days)
2026-02-11 07:43:22 - health.services.data_sync - INFO - ✓ Synced stress for 2026-02-11
2026-02-11 07:43:22 - health.services.data_sync - INFO - stress sync complete: 1 synced, 0 skipped, 0 errors
2026-02-11 07:43:22 - health.services.data_sync - INFO - Syncing body_battery from 2026-02-11 to 2026-02-11 (1 days)
2026-02-11 07:43:22 - health.services.data_sync - INFO - ✓ Synced body_battery for 2026-02-11
2026-02-11 07:43:22 - health.services.data_sync - INFO - body_battery sync complete: 1 synced, 0 skipped, 0 errors
2026-02-11 07:43:22 - health.services.data_sync - INFO - Syncing spo2 from 2026-02-11 to 2026-02-11 (1 days)
2026-02-11 07:43:23 - health.services.data_sync - INFO - ✓ Synced spo2 for 2026-02-11
2026-02-11 07:43:23 - health.services.data_sync - INFO - spo2 sync complete: 1 synced, 0 skipped, 0 errors
2026-02-11 07:43:23 - health.services.data_sync - INFO - Syncing respiration from 2026-02-11 to 2026-02-11 (1 days)
2026-02-11 07:43:23 - health.services.data_sync - INFO - ✓ Synced respiration for 2026-02-11
2026-02-11 07:43:23 - health.services.data_sync - INFO - respiration sync complete: 1 synced, 0 skipped, 0 errors
2026-02-11 07:43:23 - health.services.data_sync - INFO - Syncing hydration from 2026-02-11 to 2026-02-11 (1 days)
2026-02-11 07:43:23 - health.services.data_sync - INFO - ✓ Synced hydration for 2026-02-11
2026-02-11 07:43:23 - health.services.data_sync - INFO - hydration sync complete: 1 synced, 0 skipped, 0 errors
2026-02-11 07:43:23 - health.services.data_sync - INFO - Syncing floors from 2026-02-11 to 2026-02-11 (1 days)
2026-02-11 07:43:23 - health.services.data_sync - INFO - ✓ Synced floors for 2026-02-11
2026-02-11 07:43:23 - health.services.data_sync - INFO - floors sync complete: 1 synced, 0 skipped, 0 errors
2026-02-11 07:43:23 - health.services.data_sync - INFO - Syncing intensity_minutes from 2026-02-11 to 2026-02-11 (1 days)
2026-02-11 07:43:23 - health.services.data_sync - INFO - ✓ Synced intensity_minutes for 2026-02-11
2026-02-11 07:43:23 - health.services.data_sync - INFO - intensity_minutes sync complete: 1 synced, 0 skipped, 0 errors
2026-02-11 07:43:23 - health.services.data_sync - INFO - Syncing hrv from 2026-02-11 to 2026-02-11 (1 days)
2026-02-11 07:43:23 - health.services.data_sync - INFO - ✓ Synced hrv for 2026-02-11
2026-02-11 07:43:23 - health.services.data_sync - INFO - hrv sync complete: 1 synced, 0 skipped, 0 errors
2026-02-11 07:43:23 - health.services.data_sync - INFO - Syncing rhr from 2026-02-11 to 2026-02-11 (1 days)
2026-02-11 07:43:23 - health.services.data_sync - INFO - ✓ Synced rhr for 2026-02-11
2026-02-11 07:43:23 - health.services.data_sync - INFO - rhr sync complete: 1 synced, 0 skipped, 0 errors
2026-02-11 07:43:23 - health.services.data_sync - INFO - Syncing weight from 2026-02-11 to 2026-02-11 (1 days)
2026-02-11 07:43:23 - health.services.data_sync - INFO - weight sync complete: 0 synced, 1 skipped, 0 errors
2026-02-11 07:43:23 - health.services.data_sync - INFO - Syncing activities from 2026-02-11 to 2026-02-11
2026-02-11 07:43:23 - health.services.data_sync - INFO - Found 0 activities
2026-02-11 07:43:23 - health.services.data_sync - INFO - Activity sync complete: 0 synced, 0 skipped, 0 errors
2026-02-11 07:43:23 - health.services.query - INFO - Querying health data summary for 2026-02-11
2026-02-11 07:43:23 - health.services.query - INFO - Found 12 metrics and 0 activities
2026-02-11 07:43:23 - slack_bot.dispatcher - INFO - [ce4fd88b] ✓ sync_garmin finished in 2.16s
2026-02-11 07:43:23 - slack_bot.dispatcher - INFO - [ce4fd88b] Tool: get_daily_detailed_stats Args: {'target_date': '2026-02-11'}
2026-02-11 07:43:23 - health.services.query - INFO - Querying health data summary for 2026-02-11
2026-02-11 07:43:23 - health.services.query - INFO - Found 12 metrics and 0 activities
2026-02-11 07:43:23 - slack_bot.dispatcher - INFO - [ce4fd88b] ✓ get_daily_detailed_stats finished in 0.01s
2026-02-11 07:43:23 - slack_bot.dispatcher - INFO - [ce4fd88b] Requesting final analysis...
2026-02-11 07:43:28 - slack_bot.dispatcher - INFO - [ce4fd88b] Final analysis received in 4.99s
2026-02-11 07:43:28 - slack_bot.dispatcher - INFO - Formatted text (len 532 -> 508)
2026-02-11 07:43:29 - slack_bot.dispatcher - INFO - [ce4fd88b] 📤 Message updated 1770766998.524329
2026-02-11 07:43:29 - slack_bot.dispatcher - INFO - [ce4fd88b] Dispatch completed in 11.01s
2026-02-11 07:43:29 - __main__ - INFO - [ce4fd88b] ✅ Request completed in 11.72s
2026-02-11 07:44:46 - __main__ - INFO - [1b5b20b1] 📥 Received message from U0A8ZCK7RJM in D0AA4GBQRKK: 今天是否可以椭圆机，饮食应该怎么样 (Files: 0)
2026-02-11 07:44:47 - slack_bot.dispatcher - INFO - [1b5b20b1] Processing message in D0AA4GBQRKK from U0A8ZCK7RJM
2026-02-11 07:44:47 - slack_bot.dispatcher - INFO - [1b5b20b1] Calling Gemini for initial response...
2026-02-11 07:44:47 - slack_bot.dispatcher - INFO - [1b5b20b1] Request config: model=google/gemini-3-flash-preview, tools=21, context=39 msgs
2026-02-11 07:44:55 - slack_bot.dispatcher - INFO - [1b5b20b1] Gemini response: text=1097 chars, tool_calls=0
2026-02-11 07:44:55 - slack_bot.dispatcher - INFO - [1b5b20b1] No tool calls from Gemini - checking SAFETY OVERRIDE keywords...
2026-02-11 07:44:55 - slack_bot.dispatcher - WARNING - [1b5b20b1] 🔧 SAFETY OVERRIDE: Forcing get_daily_detailed_stats for 2026-02-11
2026-02-11 07:44:55 - slack_bot.dispatcher - INFO - [1b5b20b1] No SAFETY OVERRIDE match found - will return empty response or text
2026-02-11 07:44:55 - slack_bot.dispatcher - INFO - [1b5b20b1] Gemini response in 7.98s: 1097 chars, 1 tools
2026-02-11 07:44:55 - slack_bot.dispatcher - INFO - [1b5b20b1] Executing 1 tools
2026-02-11 07:44:55 - slack_bot.dispatcher - INFO - [1b5b20b1] Tool: get_daily_detailed_stats Args: {'target_date': '2026-02-11'}
2026-02-11 07:44:55 - health.services.query - INFO - Querying health data summary for 2026-02-11
2026-02-11 07:44:55 - health.services.query - INFO - Found 12 metrics and 0 activities
2026-02-11 07:44:55 - slack_bot.dispatcher - INFO - [1b5b20b1] ✓ get_daily_detailed_stats finished in 0.02s
2026-02-11 07:44:55 - slack_bot.dispatcher - INFO - [1b5b20b1] Requesting final analysis...
2026-02-11 07:45:01 - slack_bot.dispatcher - INFO - [1b5b20b1] Final analysis received in 5.60s
2026-02-11 07:45:01 - slack_bot.dispatcher - INFO - Formatted text (len 776 -> 742)
2026-02-11 07:45:01 - slack_bot.dispatcher - INFO - [1b5b20b1] 📤 Message updated 1770767087.443789
2026-02-11 07:45:01 - slack_bot.dispatcher - INFO - [1b5b20b1] Dispatch completed in 14.38s
2026-02-11 07:45:01 - __main__ - INFO - [1b5b20b1] ✅ Request completed in 15.15s
2026-02-11 07:51:24 - __main__ - INFO - [1f9b8336] 📥 Received message from U0A8ZCK7RJM in D0AA4GBQRKK: 是因为昨晚喝酒了，心率也提升了，但是自我感觉睡得还可以，不知道是否应该运动 (Files: 0)
2026-02-11 07:51:25 - slack_bot.dispatcher - INFO - [1f9b8336] Processing message in D0AA4GBQRKK from U0A8ZCK7RJM
2026-02-11 07:51:25 - slack_bot.dispatcher - INFO - [1f9b8336] Calling Gemini for initial response...
2026-02-11 07:51:25 - slack_bot.dispatcher - INFO - [1f9b8336] Request config: model=google/gemini-3-flash-preview, tools=21, context=39 msgs
2026-02-11 07:51:34 - slack_bot.dispatcher - INFO - [1f9b8336] Gemini response: text=919 chars, tool_calls=0
2026-02-11 07:51:34 - slack_bot.dispatcher - INFO - [1f9b8336] No tool calls from Gemini - checking SAFETY OVERRIDE keywords...
2026-02-11 07:51:34 - slack_bot.dispatcher - WARNING - [1f9b8336] 🔧 SAFETY OVERRIDE: Forcing get_activity_history for 2026-02-10
2026-02-11 07:51:34 - slack_bot.dispatcher - INFO - [1f9b8336] No SAFETY OVERRIDE match found - will return empty response or text
2026-02-11 07:51:34 - slack_bot.dispatcher - INFO - [1f9b8336] Gemini response in 8.96s: 919 chars, 1 tools
2026-02-11 07:51:34 - slack_bot.dispatcher - INFO - [1f9b8336] Executing 1 tools
2026-02-11 07:51:34 - slack_bot.dispatcher - INFO - [1f9b8336] Tool: get_activity_history Args: {'start_date': '2026-02-10', 'end_date': '2026-02-10'}
2026-02-11 07:51:34 - health.services.query - INFO - Querying activities from 2026-02-10 to 2026-02-10
2026-02-11 07:51:34 - health.services.query - INFO - Found 1 activities
2026-02-11 07:51:34 - slack_bot.dispatcher - INFO - [1f9b8336] ✓ get_activity_history finished in 0.00s
2026-02-11 07:51:34 - slack_bot.dispatcher - INFO - [1f9b8336] Requesting final analysis...
2026-02-11 07:51:40 - slack_bot.dispatcher - INFO - [1f9b8336] Final analysis received in 6.12s
2026-02-11 07:51:40 - slack_bot.dispatcher - INFO - Formatted text (len 684 -> 650)
2026-02-11 07:51:41 - slack_bot.dispatcher - INFO - [1f9b8336] 📤 Message updated 1770767485.418559
2026-02-11 07:51:41 - slack_bot.dispatcher - INFO - [1f9b8336] Dispatch completed in 15.83s
2026-02-11 07:51:41 - __main__ - INFO - [1f9b8336] ✅ Request completed in 16.58s
2026-02-11 07:57:46 - __main__ - INFO - [ca5050e3] 📥 Received message from U0A8ZCK7RJM in D0AA4GBQRKK: 好的，那就不做了，饮食上呢。我发现昨天下午也有点胸闷，不确定是不是吃少了 (Files: 0)
2026-02-11 07:57:47 - slack_bot.dispatcher - INFO - [ca5050e3] Processing message in D0AA4GBQRKK from U0A8ZCK7RJM
2026-02-11 07:57:47 - slack_bot.dispatcher - INFO - [ca5050e3] Calling Gemini for initial response...
2026-02-11 07:57:47 - slack_bot.dispatcher - INFO - [ca5050e3] Request config: model=google/gemini-3-flash-preview, tools=21, context=39 msgs
2026-02-11 07:57:58 - slack_bot.dispatcher - INFO - [ca5050e3] Gemini response: text=2355 chars, tool_calls=0
2026-02-11 07:57:58 - slack_bot.dispatcher - INFO - [ca5050e3] No tool calls from Gemini - checking SAFETY OVERRIDE keywords...
2026-02-11 07:57:58 - slack_bot.dispatcher - WARNING - [ca5050e3] 🔧 SAFETY OVERRIDE: Forcing get_daily_detailed_stats for 2026-02-10
2026-02-11 07:57:58 - slack_bot.dispatcher - INFO - [ca5050e3] No SAFETY OVERRIDE match found - will return empty response or text
2026-02-11 07:57:58 - slack_bot.dispatcher - INFO - [ca5050e3] Gemini response in 11.40s: 2355 chars, 1 tools
2026-02-11 07:57:58 - slack_bot.dispatcher - INFO - [ca5050e3] Executing 1 tools
2026-02-11 07:57:58 - slack_bot.dispatcher - INFO - [ca5050e3] Tool: get_daily_detailed_stats Args: {'target_date': '2026-02-10'}
2026-02-11 07:57:58 - health.services.query - INFO - Querying health data summary for 2026-02-10
2026-02-11 07:57:58 - health.services.query - INFO - Found 12 metrics and 1 activities
2026-02-11 07:57:58 - slack_bot.dispatcher - INFO - [ca5050e3] ✓ get_daily_detailed_stats finished in 0.03s
2026-02-11 07:57:58 - slack_bot.dispatcher - INFO - [ca5050e3] Requesting final analysis...
2026-02-11 07:58:05 - slack_bot.dispatcher - INFO - [ca5050e3] Final analysis received in 7.07s
2026-02-11 07:58:05 - slack_bot.dispatcher - INFO - Formatted text (len 961 -> 919)
2026-02-11 07:58:06 - slack_bot.dispatcher - INFO - [ca5050e3] 📤 Message updated 1770767867.149879
2026-02-11 07:58:06 - slack_bot.dispatcher - INFO - [ca5050e3] Dispatch completed in 19.35s
2026-02-11 07:58:06 - __main__ - INFO - [ca5050e3] ✅ Request completed in 20.13s
2026-02-11 16:00:29 - __main__ - INFO - [38c80845] 📥 Received message from U0A8ZCK7RJM in D0AA4GBQRKK: 如果今天恢复良好，明天可以轻断食吗，如果要防止胸闷，需要考虑什么 (Files: 0)
2026-02-11 16:00:31 - slack_bot.dispatcher - INFO - [38c80845] Processing message in D0AA4GBQRKK from U0A8ZCK7RJM
2026-02-11 16:00:31 - slack_bot.dispatcher - INFO - [38c80845] Calling Gemini for initial response...
2026-02-11 16:00:31 - slack_bot.dispatcher - INFO - [38c80845] Request config: model=google/gemini-3-flash-preview, tools=21, context=39 msgs
2026-02-11 16:00:40 - slack_bot.dispatcher - INFO - [38c80845] Gemini response: text=1236 chars, tool_calls=0
2026-02-11 16:00:40 - slack_bot.dispatcher - INFO - [38c80845] No tool calls from Gemini - checking SAFETY OVERRIDE keywords...
2026-02-11 16:00:40 - slack_bot.dispatcher - WARNING - [38c80845] 🔧 SAFETY OVERRIDE: Forcing get_daily_detailed_stats for 2026-02-11
2026-02-11 16:00:40 - slack_bot.dispatcher - INFO - [38c80845] No SAFETY OVERRIDE match found - will return empty response or text
2026-02-11 16:00:40 - slack_bot.dispatcher - INFO - [38c80845] Gemini response in 9.09s: 1236 chars, 1 tools
2026-02-11 16:00:40 - slack_bot.dispatcher - INFO - [38c80845] Executing 1 tools
2026-02-11 16:00:40 - slack_bot.dispatcher - INFO - [38c80845] Tool: get_daily_detailed_stats Args: {'target_date': '2026-02-11'}
2026-02-11 16:00:40 - health.services.query - INFO - Querying health data summary for 2026-02-11
2026-02-11 16:00:40 - health.services.query - INFO - Found 12 metrics and 0 activities
2026-02-11 16:00:40 - slack_bot.dispatcher - INFO - [38c80845] ✓ get_daily_detailed_stats finished in 0.04s
2026-02-11 16:00:40 - slack_bot.dispatcher - INFO - [38c80845] Requesting final analysis...
2026-02-11 16:00:47 - slack_bot.dispatcher - INFO - [38c80845] Final analysis received in 7.34s
2026-02-11 16:00:47 - slack_bot.dispatcher - INFO - Formatted text (len 983 -> 933)
2026-02-11 16:00:48 - slack_bot.dispatcher - INFO - [38c80845] 📤 Message updated 1770796830.942759
2026-02-11 16:00:48 - slack_bot.dispatcher - INFO - [38c80845] Dispatch completed in 17.44s
2026-02-11 16:00:48 - __main__ - INFO - [38c80845] ✅ Request completed in 18.62s
2026-02-12 08:29:21 - __main__ - INFO - [836697f1] 📥 Received message from U0A8ZCK7RJM in D0AA4GBQRKK: 二月十二日晚上睡眠怎么样 (Files: 0)
2026-02-12 08:29:21 - slack_bot.dispatcher - INFO - [836697f1] Processing message in D0AA4GBQRKK from U0A8ZCK7RJM
2026-02-12 08:29:21 - slack_bot.dispatcher - INFO - [836697f1] Calling Gemini for initial response...
2026-02-12 08:29:21 - slack_bot.dispatcher - INFO - [836697f1] Request config: model=google/gemini-3-flash-preview, tools=21, context=39 msgs
2026-02-12 08:29:24 - slack_bot.dispatcher - WARNING - [836697f1] Gemini returned empty response_text! (This usually means the proxy has issues)
2026-02-12 08:29:24 - slack_bot.dispatcher - INFO - [836697f1] Gemini response: text=0 chars, tool_calls=2
2026-02-12 08:29:24 - slack_bot.dispatcher - INFO - [836697f1] Tool calls successfully generated by Gemini (no SAFETY OVERRIDE needed)
2026-02-12 08:29:24 - slack_bot.dispatcher - INFO - [836697f1] Gemini response in 2.56s: 0 chars, 2 tools
2026-02-12 08:29:24 - slack_bot.dispatcher - INFO - [836697f1] Executing 2 tools
2026-02-12 08:29:24 - slack_bot.dispatcher - INFO - [836697f1] Tool: sync_garmin Args: {'target_date': '2026-02-12'}
2026-02-12 08:29:24 - slack_bot.tools.garmin - INFO - Starting Garmin sync for 2026-02-12...
2026-02-12 08:29:24 - health.services.data_sync - INFO - Authenticating with Garmin...
2026-02-12 08:29:24 - health.services.garmin_client - INFO - Authenticating with Garmin Connect China for 350134531@qq.com
2026-02-12 08:29:24 - health.services.garmin_client - INFO - Successfully authenticated with Garmin Connect China
2026-02-12 08:29:24 - health.services.data_sync - INFO - Authentication successful
2026-02-12 08:29:24 - health.services.data_sync - INFO - Syncing 13 metric types from 2026-02-12 to 2026-02-12
2026-02-12 08:29:24 - health.services.data_sync - INFO - Syncing steps from 2026-02-12 to 2026-02-12 (1 days)
2026-02-12 08:29:24 - health.services.data_sync - INFO - ✓ Synced steps for 2026-02-12
2026-02-12 08:29:24 - health.services.data_sync - INFO - steps sync complete: 1 synced, 0 skipped, 0 errors
2026-02-12 08:29:24 - health.services.data_sync - INFO - Syncing heart_rate from 2026-02-12 to 2026-02-12 (1 days)
2026-02-12 08:29:24 - health.services.data_sync - INFO - ✓ Synced heart_rate for 2026-02-12
2026-02-12 08:29:24 - health.services.data_sync - INFO - heart_rate sync complete: 1 synced, 0 skipped, 0 errors
2026-02-12 08:29:24 - health.services.data_sync - INFO - Syncing sleep from 2026-02-12 to 2026-02-12 (1 days)
2026-02-12 08:29:25 - health.services.data_sync - INFO - ✓ Synced sleep for 2026-02-12
2026-02-12 08:29:25 - health.services.data_sync - INFO - sleep sync complete: 1 synced, 0 skipped, 0 errors
2026-02-12 08:29:25 - health.services.data_sync - INFO - Syncing stress from 2026-02-12 to 2026-02-12 (1 days)
2026-02-12 08:29:25 - health.services.data_sync - INFO - ✓ Synced stress for 2026-02-12
2026-02-12 08:29:25 - health.services.data_sync - INFO - stress sync complete: 1 synced, 0 skipped, 0 errors
2026-02-12 08:29:25 - health.services.data_sync - INFO - Syncing body_battery from 2026-02-12 to 2026-02-12 (1 days)
2026-02-12 08:29:25 - health.services.data_sync - INFO - ✓ Synced body_battery for 2026-02-12
2026-02-12 08:29:25 - health.services.data_sync - INFO - body_battery sync complete: 1 synced, 0 skipped, 0 errors
2026-02-12 08:29:25 - health.services.data_sync - INFO - Syncing spo2 from 2026-02-12 to 2026-02-12 (1 days)
2026-02-12 08:29:25 - health.services.data_sync - INFO - ✓ Synced spo2 for 2026-02-12
2026-02-12 08:29:25 - health.services.data_sync - INFO - spo2 sync complete: 1 synced, 0 skipped, 0 errors
2026-02-12 08:29:25 - health.services.data_sync - INFO - Syncing respiration from 2026-02-12 to 2026-02-12 (1 days)
2026-02-12 08:29:25 - health.services.data_sync - INFO - ✓ Synced respiration for 2026-02-12
2026-02-12 08:29:25 - health.services.data_sync - INFO - respiration sync complete: 1 synced, 0 skipped, 0 errors
2026-02-12 08:29:25 - health.services.data_sync - INFO - Syncing hydration from 2026-02-12 to 2026-02-12 (1 days)
2026-02-12 08:29:25 - health.services.data_sync - INFO - ✓ Synced hydration for 2026-02-12
2026-02-12 08:29:25 - health.services.data_sync - INFO - hydration sync complete: 1 synced, 0 skipped, 0 errors
2026-02-12 08:29:25 - health.services.data_sync - INFO - Syncing floors from 2026-02-12 to 2026-02-12 (1 days)
2026-02-12 08:29:25 - health.services.data_sync - INFO - ✓ Synced floors for 2026-02-12
2026-02-12 08:29:25 - health.services.data_sync - INFO - floors sync complete: 1 synced, 0 skipped, 0 errors
2026-02-12 08:29:25 - health.services.data_sync - INFO - Syncing intensity_minutes from 2026-02-12 to 2026-02-12 (1 days)
2026-02-12 08:29:25 - health.services.data_sync - INFO - ✓ Synced intensity_minutes for 2026-02-12
2026-02-12 08:29:25 - health.services.data_sync - INFO - intensity_minutes sync complete: 1 synced, 0 skipped, 0 errors
2026-02-12 08:29:25 - health.services.data_sync - INFO - Syncing hrv from 2026-02-12 to 2026-02-12 (1 days)
2026-02-12 08:29:25 - health.services.data_sync - INFO - ✓ Synced hrv for 2026-02-12
2026-02-12 08:29:25 - health.services.data_sync - INFO - hrv sync complete: 1 synced, 0 skipped, 0 errors
2026-02-12 08:29:25 - health.services.data_sync - INFO - Syncing rhr from 2026-02-12 to 2026-02-12 (1 days)
2026-02-12 08:29:26 - health.services.data_sync - INFO - ✓ Synced rhr for 2026-02-12
2026-02-12 08:29:26 - health.services.data_sync - INFO - rhr sync complete: 1 synced, 0 skipped, 0 errors
2026-02-12 08:29:26 - health.services.data_sync - INFO - Syncing weight from 2026-02-12 to 2026-02-12 (1 days)
2026-02-12 08:29:26 - health.services.data_sync - INFO - weight sync complete: 0 synced, 1 skipped, 0 errors
2026-02-12 08:29:26 - health.services.data_sync - INFO - Syncing activities from 2026-02-12 to 2026-02-12
2026-02-12 08:29:26 - health.services.data_sync - INFO - Found 0 activities
2026-02-12 08:29:26 - health.services.data_sync - INFO - Activity sync complete: 0 synced, 0 skipped, 0 errors
2026-02-12 08:29:26 - health.services.query - INFO - Querying health data summary for 2026-02-12
2026-02-12 08:29:26 - health.services.query - INFO - Found 12 metrics and 0 activities
2026-02-12 08:29:26 - slack_bot.dispatcher - INFO - [836697f1] ✓ sync_garmin finished in 2.06s
2026-02-12 08:29:26 - slack_bot.dispatcher - INFO - [836697f1] Tool: get_daily_detailed_stats Args: {'target_date': '2026-02-12'}
2026-02-12 08:29:26 - health.services.query - INFO - Querying health data summary for 2026-02-12
2026-02-12 08:29:26 - health.services.query - INFO - Found 12 metrics and 0 activities
2026-02-12 08:29:26 - slack_bot.dispatcher - INFO - [836697f1] ✓ get_daily_detailed_stats finished in 0.01s
2026-02-12 08:29:26 - slack_bot.dispatcher - INFO - [836697f1] Requesting final analysis...
2026-02-12 08:29:30 - slack_bot.dispatcher - INFO - [836697f1] Final analysis received in 4.26s
2026-02-12 08:29:30 - slack_bot.dispatcher - INFO - Formatted text (len 612 -> 588)
2026-02-12 08:29:31 - slack_bot.dispatcher - INFO - [836697f1] 📤 Message updated 1770856161.571539
2026-02-12 08:29:31 - slack_bot.dispatcher - INFO - [836697f1] Dispatch completed in 9.76s
2026-02-12 08:29:31 - __main__ - INFO - [836697f1] ✅ Request completed in 10.27s
2026-02-12 10:04:26 - __main__ - INFO - [f93a15b8] 📥 Received message from U0A8ZCK7RJM in D0AA4GBQRKK: 早上的椭圆机运动数据深入分析一下 (Files: 0)
2026-02-12 10:04:27 - slack_bot.dispatcher - INFO - [f93a15b8] Processing message in D0AA4GBQRKK from U0A8ZCK7RJM
2026-02-12 10:04:27 - slack_bot.dispatcher - INFO - [f93a15b8] Calling Gemini for initial response...
2026-02-12 10:04:27 - slack_bot.dispatcher - INFO - [f93a15b8] Request config: model=google/gemini-3-flash-preview, tools=21, context=39 msgs
2026-02-12 10:04:30 - slack_bot.dispatcher - WARNING - [f93a15b8] Gemini returned empty response_text! (This usually means the proxy has issues)
2026-02-12 10:04:30 - slack_bot.dispatcher - INFO - [f93a15b8] Gemini response: text=0 chars, tool_calls=1
2026-02-12 10:04:30 - slack_bot.dispatcher - INFO - [f93a15b8] Tool calls successfully generated by Gemini (no SAFETY OVERRIDE needed)
2026-02-12 10:04:30 - slack_bot.dispatcher - INFO - [f93a15b8] Gemini response in 2.62s: 0 chars, 1 tools
2026-02-12 10:04:30 - slack_bot.dispatcher - INFO - [f93a15b8] Executing 1 tools
2026-02-12 10:04:30 - slack_bot.dispatcher - INFO - [f93a15b8] Tool: get_activity_history Args: {'end_date': '2026-02-12', 'start_date': '2026-02-12'}
2026-02-12 10:04:30 - health.services.query - INFO - Querying activities from 2026-02-12 to 2026-02-12
2026-02-12 10:04:30 - health.services.query - INFO - Found 0 activities
2026-02-12 10:04:30 - slack_bot.dispatcher - INFO - [f93a15b8] ✓ get_activity_history finished in 0.00s
2026-02-12 10:04:30 - slack_bot.dispatcher - INFO - [f93a15b8] Requesting final analysis...
2026-02-12 10:04:32 - slack_bot.dispatcher - INFO - [f93a15b8] Final analysis received in 2.65s
2026-02-12 10:04:32 - slack_bot.dispatcher - INFO - Formatted text (len 350 -> 340)
2026-02-12 10:04:33 - slack_bot.dispatcher - INFO - [f93a15b8] 📤 Message updated 1770861867.346169
2026-02-12 10:04:33 - slack_bot.dispatcher - INFO - [f93a15b8] Dispatch completed in 6.00s
2026-02-12 10:04:33 - __main__ - INFO - [f93a15b8] ✅ Request completed in 7.00s
2026-02-12 10:25:17 - __main__ - INFO - [301e6913] 📥 Received message from U0A8ZCK7RJM in D0AA4GBQRKK: 再试一下呢 (Files: 0)
2026-02-12 10:25:18 - slack_bot.dispatcher - INFO - [301e6913] Processing message in D0AA4GBQRKK from U0A8ZCK7RJM
2026-02-12 10:25:18 - slack_bot.dispatcher - INFO - [301e6913] Calling Gemini for initial response...
2026-02-12 10:25:18 - slack_bot.dispatcher - INFO - [301e6913] Request config: model=google/gemini-3-flash-preview, tools=21, context=39 msgs
2026-02-12 10:25:42 - slack_bot.dispatcher - WARNING - [301e6913] Gemini returned empty response_text! (This usually means the proxy has issues)
2026-02-12 10:25:42 - slack_bot.dispatcher - INFO - [301e6913] Gemini response: text=0 chars, tool_calls=2
2026-02-12 10:25:42 - slack_bot.dispatcher - INFO - [301e6913] Tool calls successfully generated by Gemini (no SAFETY OVERRIDE needed)
2026-02-12 10:25:42 - slack_bot.dispatcher - INFO - [301e6913] Gemini response in 24.71s: 0 chars, 2 tools
2026-02-12 10:25:42 - slack_bot.dispatcher - INFO - [301e6913] Executing 2 tools
2026-02-12 10:25:42 - slack_bot.dispatcher - INFO - [301e6913] Tool: sync_garmin Args: {'target_date': '2026-02-12'}
2026-02-12 10:25:42 - slack_bot.tools.garmin - INFO - Starting Garmin sync for 2026-02-12...
2026-02-12 10:25:42 - health.services.data_sync - INFO - Authenticating with Garmin...
2026-02-12 10:25:42 - health.services.garmin_client - INFO - Authenticating with Garmin Connect China for 350134531@qq.com
2026-02-12 10:25:43 - health.services.garmin_client - INFO - Successfully authenticated with Garmin Connect China
2026-02-12 10:25:43 - health.services.data_sync - INFO - Authentication successful
2026-02-12 10:25:43 - health.services.data_sync - INFO - Syncing 13 metric types from 2026-02-12 to 2026-02-12
2026-02-12 10:25:43 - health.services.data_sync - INFO - Syncing steps from 2026-02-12 to 2026-02-12 (1 days)
2026-02-12 10:25:43 - health.services.data_sync - INFO - ✓ Synced steps for 2026-02-12
2026-02-12 10:25:43 - health.services.data_sync - INFO - steps sync complete: 1 synced, 0 skipped, 0 errors
2026-02-12 10:25:43 - health.services.data_sync - INFO - Syncing heart_rate from 2026-02-12 to 2026-02-12 (1 days)
2026-02-12 10:25:43 - health.services.data_sync - INFO - ✓ Synced heart_rate for 2026-02-12
2026-02-12 10:25:43 - health.services.data_sync - INFO - heart_rate sync complete: 1 synced, 0 skipped, 0 errors
2026-02-12 10:25:43 - health.services.data_sync - INFO - Syncing sleep from 2026-02-12 to 2026-02-12 (1 days)
2026-02-12 10:25:44 - health.services.data_sync - INFO - ✓ Synced sleep for 2026-02-12
2026-02-12 10:25:44 - health.services.data_sync - INFO - sleep sync complete: 1 synced, 0 skipped, 0 errors
2026-02-12 10:25:44 - health.services.data_sync - INFO - Syncing stress from 2026-02-12 to 2026-02-12 (1 days)
2026-02-12 10:25:44 - health.services.data_sync - INFO - ✓ Synced stress for 2026-02-12
2026-02-12 10:25:44 - health.services.data_sync - INFO - stress sync complete: 1 synced, 0 skipped, 0 errors
2026-02-12 10:25:44 - health.services.data_sync - INFO - Syncing body_battery from 2026-02-12 to 2026-02-12 (1 days)
2026-02-12 10:25:44 - health.services.data_sync - INFO - ✓ Synced body_battery for 2026-02-12
2026-02-12 10:25:44 - health.services.data_sync - INFO - body_battery sync complete: 1 synced, 0 skipped, 0 errors
2026-02-12 10:25:44 - health.services.data_sync - INFO - Syncing spo2 from 2026-02-12 to 2026-02-12 (1 days)
2026-02-12 10:25:44 - health.services.data_sync - INFO - ✓ Synced spo2 for 2026-02-12
2026-02-12 10:25:44 - health.services.data_sync - INFO - spo2 sync complete: 1 synced, 0 skipped, 0 errors
2026-02-12 10:25:44 - health.services.data_sync - INFO - Syncing respiration from 2026-02-12 to 2026-02-12 (1 days)
2026-02-12 10:25:44 - health.services.data_sync - INFO - ✓ Synced respiration for 2026-02-12
2026-02-12 10:25:44 - health.services.data_sync - INFO - respiration sync complete: 1 synced, 0 skipped, 0 errors
2026-02-12 10:25:44 - health.services.data_sync - INFO - Syncing hydration from 2026-02-12 to 2026-02-12 (1 days)
2026-02-12 10:25:44 - health.services.data_sync - INFO - ✓ Synced hydration for 2026-02-12
2026-02-12 10:25:44 - health.services.data_sync - INFO - hydration sync complete: 1 synced, 0 skipped, 0 errors
2026-02-12 10:25:44 - health.services.data_sync - INFO - Syncing floors from 2026-02-12 to 2026-02-12 (1 days)
2026-02-12 10:25:44 - health.services.data_sync - INFO - ✓ Synced floors for 2026-02-12
2026-02-12 10:25:44 - health.services.data_sync - INFO - floors sync complete: 1 synced, 0 skipped, 0 errors
2026-02-12 10:25:44 - health.services.data_sync - INFO - Syncing intensity_minutes from 2026-02-12 to 2026-02-12 (1 days)
2026-02-12 10:25:44 - health.services.data_sync - INFO - ✓ Synced intensity_minutes for 2026-02-12
2026-02-12 10:25:45 - health.services.data_sync - INFO - intensity_minutes sync complete: 1 synced, 0 skipped, 0 errors
2026-02-12 10:25:45 - health.services.data_sync - INFO - Syncing hrv from 2026-02-12 to 2026-02-12 (1 days)
2026-02-12 10:25:45 - health.services.data_sync - INFO - ✓ Synced hrv for 2026-02-12
2026-02-12 10:25:45 - health.services.data_sync - INFO - hrv sync complete: 1 synced, 0 skipped, 0 errors
2026-02-12 10:25:45 - health.services.data_sync - INFO - Syncing rhr from 2026-02-12 to 2026-02-12 (1 days)
2026-02-12 10:25:45 - health.services.data_sync - INFO - ✓ Synced rhr for 2026-02-12
2026-02-12 10:25:45 - health.services.data_sync - INFO - rhr sync complete: 1 synced, 0 skipped, 0 errors
2026-02-12 10:25:45 - health.services.data_sync - INFO - Syncing weight from 2026-02-12 to 2026-02-12 (1 days)
2026-02-12 10:25:45 - health.services.data_sync - INFO - weight sync complete: 0 synced, 1 skipped, 0 errors
2026-02-12 10:25:45 - health.services.data_sync - INFO - Syncing activities from 2026-02-12 to 2026-02-12
2026-02-12 10:25:45 - health.services.garmin_client - INFO - Fetched 1 activities
2026-02-12 10:25:45 - health.services.data_sync - INFO - Found 1 activities
2026-02-12 10:25:45 - health.services.data_sync - INFO - ✓ Synced activity 565115528 (elliptical) on 2026-02-12
2026-02-12 10:25:45 - health.services.data_sync - INFO - Activity sync complete: 1 synced, 0 skipped, 0 errors
2026-02-12 10:25:45 - health.services.query - INFO - Querying health data summary for 2026-02-12
2026-02-12 10:25:45 - health.services.query - INFO - Found 12 metrics and 1 activities
2026-02-12 10:25:45 - slack_bot.dispatcher - INFO - [301e6913] ✓ sync_garmin finished in 2.60s
2026-02-12 10:25:45 - slack_bot.dispatcher - INFO - [301e6913] Tool: get_activity_history Args: {'end_date': '2026-02-12', 'start_date': '2026-02-12'}
2026-02-12 10:25:45 - health.services.query - INFO - Querying activities from 2026-02-12 to 2026-02-12
2026-02-12 10:25:45 - health.services.query - INFO - Found 1 activities
2026-02-12 10:25:45 - slack_bot.dispatcher - INFO - [301e6913] ✓ get_activity_history finished in 0.00s
2026-02-12 10:25:45 - slack_bot.dispatcher - INFO - [301e6913] Requesting final analysis...
2026-02-12 10:25:49 - slack_bot.dispatcher - INFO - [301e6913] Final analysis received in 4.21s
2026-02-12 10:25:49 - slack_bot.dispatcher - INFO - Formatted text (len 567 -> 549)
2026-02-12 10:25:50 - slack_bot.dispatcher - INFO - [301e6913] 📤 Message updated 1770863118.186339
2026-02-12 10:25:50 - slack_bot.dispatcher - INFO - [301e6913] Dispatch completed in 32.47s
2026-02-12 10:25:50 - __main__ - INFO - [301e6913] ✅ Request completed in 33.66s
2026-02-12 10:55:24 - __main__ - INFO - [aebb566a] 📥 Received message from U0A8ZCK7RJM in D0AA4GBQRKK: 运动的时候打电话，导致在同等心率之下踩得更慢，这会影响运动效果吗 (Files: 0)
2026-02-12 10:55:25 - slack_bot.dispatcher - INFO - [aebb566a] Processing message in D0AA4GBQRKK from U0A8ZCK7RJM
2026-02-12 10:55:25 - slack_bot.dispatcher - INFO - [aebb566a] Calling Gemini for initial response...
2026-02-12 10:55:25 - slack_bot.dispatcher - INFO - [aebb566a] Request config: model=google/gemini-3-flash-preview, tools=21, context=39 msgs
2026-02-12 10:55:46 - slack_bot.dispatcher - INFO - [aebb566a] Gemini response: text=1153 chars, tool_calls=0
2026-02-12 10:55:46 - slack_bot.dispatcher - INFO - [aebb566a] No tool calls from Gemini - checking SAFETY OVERRIDE keywords...
2026-02-12 10:55:46 - slack_bot.dispatcher - WARNING - [aebb566a] 🔧 SAFETY OVERRIDE: Forcing get_activity_history for 2026-02-12
2026-02-12 10:55:46 - slack_bot.dispatcher - INFO - [aebb566a] No SAFETY OVERRIDE match found - will return empty response or text
2026-02-12 10:55:46 - slack_bot.dispatcher - INFO - [aebb566a] Gemini response in 21.08s: 1153 chars, 1 tools
2026-02-12 10:55:46 - slack_bot.dispatcher - INFO - [aebb566a] Executing 1 tools
2026-02-12 10:55:46 - slack_bot.dispatcher - INFO - [aebb566a] Tool: get_activity_history Args: {'start_date': '2026-02-12', 'end_date': '2026-02-12'}
2026-02-12 10:55:46 - health.services.query - INFO - Querying activities from 2026-02-12 to 2026-02-12
2026-02-12 10:55:46 - health.services.query - INFO - Found 1 activities
2026-02-12 10:55:46 - slack_bot.dispatcher - INFO - [aebb566a] ✓ get_activity_history finished in 0.00s
2026-02-12 10:55:46 - slack_bot.dispatcher - INFO - [aebb566a] Requesting final analysis...
2026-02-12 10:55:51 - slack_bot.dispatcher - INFO - [aebb566a] Final analysis received in 5.09s
2026-02-12 10:55:51 - slack_bot.dispatcher - INFO - Formatted text (len 599 -> 583)
2026-02-12 10:55:51 - slack_bot.dispatcher - INFO - [aebb566a] 📤 Message updated 1770864925.058459
2026-02-12 10:55:51 - slack_bot.dispatcher - INFO - [aebb566a] Dispatch completed in 26.88s
2026-02-12 10:55:51 - __main__ - INFO - [aebb566a] ✅ Request completed in 27.67s
2026-02-12 13:48:35 - __main__ - INFO - [f510bf90] 📥 Received message from U0A8ZCK7RJM in D0AA4GBQRKK: 中午吃了两勺蛋白粉，两个鸡蛋和三个巧克力 (Files: 0)
2026-02-12 13:48:35 - slack_bot.dispatcher - INFO - [f510bf90] Processing message in D0AA4GBQRKK from U0A8ZCK7RJM
2026-02-12 13:48:35 - slack_bot.dispatcher - INFO - [f510bf90] Calling Gemini for initial response...
2026-02-12 13:48:35 - slack_bot.dispatcher - INFO - [f510bf90] Request config: model=google/gemini-3-flash-preview, tools=21, context=39 msgs
2026-02-12 13:48:38 - slack_bot.dispatcher - WARNING - [f510bf90] Gemini returned empty response_text! (This usually means the proxy has issues)
2026-02-12 13:48:38 - slack_bot.dispatcher - INFO - [f510bf90] Gemini response: text=0 chars, tool_calls=1
2026-02-12 13:48:38 - slack_bot.dispatcher - INFO - [f510bf90] Tool calls successfully generated by Gemini (no SAFETY OVERRIDE needed)
2026-02-12 13:48:38 - slack_bot.dispatcher - INFO - [f510bf90] Gemini response in 2.55s: 0 chars, 1 tools
2026-02-12 13:48:38 - slack_bot.dispatcher - INFO - [f510bf90] Executing 1 tools
2026-02-12 13:48:38 - slack_bot.dispatcher - INFO - [f510bf90] Tool: log_diet Args: {'target_date': '2026-02-12', 'meal_type': 'lunch', 'description': '2 scoops protein powder, 2 eggs, 3 chocolates'}
2026-02-12 13:48:38 - health.services.manual_log_storage - INFO - Saved manual log for 2026-02-12 to /Users/lili/workspace/bulter/data/health/manual_logs/2026/02/2026-02-12.json
2026-02-12 13:48:38 - health.services.manual_log_storage - INFO - Added diet entry for 2026-02-12 at 13:48
2026-02-12 13:48:38 - slack_bot.dispatcher - INFO - [f510bf90] ✓ log_diet finished in 0.01s
2026-02-12 13:48:38 - slack_bot.dispatcher - INFO - [f510bf90] Requesting final analysis...
2026-02-12 13:48:41 - slack_bot.dispatcher - INFO - [f510bf90] Final analysis received in 3.17s
2026-02-12 13:48:41 - slack_bot.dispatcher - INFO - Formatted text (len 335 -> 327)
2026-02-12 13:48:42 - slack_bot.dispatcher - INFO - [f510bf90] 📤 Message updated 1770875315.799259
2026-02-12 13:48:42 - slack_bot.dispatcher - INFO - [f510bf90] Dispatch completed in 6.50s
2026-02-12 13:48:42 - __main__ - INFO - [f510bf90] ✅ Request completed in 7.18s
2026-02-13 08:28:12 - __main__ - INFO - [c26a858a] 📥 Received message from U0A8ZCK7RJM in D0AA4GBQRKK: 最近一次睡眠怎么样 (Files: 0)
2026-02-13 08:28:13 - slack_bot.dispatcher - INFO - [c26a858a] Processing message in D0AA4GBQRKK from U0A8ZCK7RJM
2026-02-13 08:28:13 - slack_bot.dispatcher - INFO - [c26a858a] Calling Gemini for initial response...
2026-02-13 08:28:13 - slack_bot.dispatcher - INFO - [c26a858a] Request config: model=google/gemini-3-flash-preview, tools=21, context=39 msgs
2026-02-13 08:28:15 - slack_bot.dispatcher - WARNING - [c26a858a] Gemini returned empty response_text! (This usually means the proxy has issues)
2026-02-13 08:28:15 - slack_bot.dispatcher - INFO - [c26a858a] Gemini response: text=0 chars, tool_calls=1
2026-02-13 08:28:15 - slack_bot.dispatcher - INFO - [c26a858a] Tool calls successfully generated by Gemini (no SAFETY OVERRIDE needed)
2026-02-13 08:28:15 - slack_bot.dispatcher - INFO - [c26a858a] Gemini response in 2.46s: 0 chars, 1 tools
2026-02-13 08:28:15 - slack_bot.dispatcher - INFO - [c26a858a] Executing 1 tools
2026-02-13 08:28:15 - slack_bot.dispatcher - INFO - [c26a858a] Tool: get_daily_detailed_stats Args: {'target_date': '2026-02-14'}
2026-02-13 08:28:15 - health.services.query - INFO - Querying health data summary for 2026-02-14
2026-02-13 08:28:15 - health.services.query - INFO - Found 0 metrics and 0 activities
2026-02-13 08:28:15 - slack_bot.tools.health_read - INFO - Data missing for 2026-02-14, attempting auto-sync...
2026-02-13 08:28:15 - health.services.data_sync - INFO - Authenticating with Garmin...
2026-02-13 08:28:15 - health.services.garmin_client - INFO - Authenticating with Garmin Connect China for 350134531@qq.com
2026-02-13 08:28:16 - health.services.garmin_client - INFO - Successfully authenticated with Garmin Connect China
2026-02-13 08:28:16 - health.services.data_sync - INFO - Authentication successful
2026-02-13 08:28:16 - health.services.data_sync - INFO - Syncing 13 metric types from 2026-02-14 to 2026-02-14
2026-02-13 08:28:16 - health.services.data_sync - INFO - Syncing steps from 2026-02-14 to 2026-02-14 (1 days)
2026-02-13 08:28:16 - health.services.data_sync - INFO - steps sync complete: 0 synced, 1 skipped, 0 errors
2026-02-13 08:28:16 - health.services.data_sync - INFO - Syncing heart_rate from 2026-02-14 to 2026-02-14 (1 days)
2026-02-13 08:28:16 - health.services.data_sync - INFO - ✓ Synced heart_rate for 2026-02-14
2026-02-13 08:28:16 - health.services.data_sync - INFO - heart_rate sync complete: 1 synced, 0 skipped, 0 errors
2026-02-13 08:28:16 - health.services.data_sync - INFO - Syncing sleep from 2026-02-14 to 2026-02-14 (1 days)
2026-02-13 08:28:16 - health.services.data_sync - INFO - ✓ Synced sleep for 2026-02-14
2026-02-13 08:28:16 - health.services.data_sync - INFO - sleep sync complete: 1 synced, 0 skipped, 0 errors
2026-02-13 08:28:16 - health.services.data_sync - INFO - Syncing stress from 2026-02-14 to 2026-02-14 (1 days)
2026-02-13 08:28:16 - health.services.data_sync - INFO - ✓ Synced stress for 2026-02-14
2026-02-13 08:28:16 - health.services.data_sync - INFO - stress sync complete: 1 synced, 0 skipped, 0 errors
2026-02-13 08:28:16 - health.services.data_sync - INFO - Syncing body_battery from 2026-02-14 to 2026-02-14 (1 days)
2026-02-13 08:28:16 - health.services.data_sync - INFO - ✓ Synced body_battery for 2026-02-14
2026-02-13 08:28:16 - health.services.data_sync - INFO - body_battery sync complete: 1 synced, 0 skipped, 0 errors
2026-02-13 08:28:16 - health.services.data_sync - INFO - Syncing spo2 from 2026-02-14 to 2026-02-14 (1 days)
2026-02-13 08:28:16 - health.services.data_sync - INFO - ✓ Synced spo2 for 2026-02-14
2026-02-13 08:28:16 - health.services.data_sync - INFO - spo2 sync complete: 1 synced, 0 skipped, 0 errors
2026-02-13 08:28:16 - health.services.data_sync - INFO - Syncing respiration from 2026-02-14 to 2026-02-14 (1 days)
2026-02-13 08:28:16 - health.services.data_sync - INFO - ✓ Synced respiration for 2026-02-14
2026-02-13 08:28:16 - health.services.data_sync - INFO - respiration sync complete: 1 synced, 0 skipped, 0 errors
2026-02-13 08:28:16 - health.services.data_sync - INFO - Syncing hydration from 2026-02-14 to 2026-02-14 (1 days)
2026-02-13 08:28:17 - health.services.data_sync - INFO - ✓ Synced hydration for 2026-02-14
2026-02-13 08:28:17 - health.services.data_sync - INFO - hydration sync complete: 1 synced, 0 skipped, 0 errors
2026-02-13 08:28:17 - health.services.data_sync - INFO - Syncing floors from 2026-02-14 to 2026-02-14 (1 days)
2026-02-13 08:28:17 - health.services.data_sync - INFO - ✓ Synced floors for 2026-02-14
2026-02-13 08:28:17 - health.services.data_sync - INFO - floors sync complete: 1 synced, 0 skipped, 0 errors
2026-02-13 08:28:17 - health.services.data_sync - INFO - Syncing intensity_minutes from 2026-02-14 to 2026-02-14 (1 days)
2026-02-13 08:28:17 - health.services.data_sync - INFO - ✓ Synced intensity_minutes for 2026-02-14
2026-02-13 08:28:17 - health.services.data_sync - INFO - intensity_minutes sync complete: 1 synced, 0 skipped, 0 errors
2026-02-13 08:28:17 - health.services.data_sync - INFO - Syncing hrv from 2026-02-14 to 2026-02-14 (1 days)
2026-02-13 08:28:17 - health.services.data_sync - INFO - hrv sync complete: 0 synced, 1 skipped, 0 errors
2026-02-13 08:28:17 - health.services.data_sync - INFO - Syncing rhr from 2026-02-14 to 2026-02-14 (1 days)
2026-02-13 08:28:17 - health.services.data_sync - INFO - ✓ Synced rhr for 2026-02-14
2026-02-13 08:28:17 - health.services.data_sync - INFO - rhr sync complete: 1 synced, 0 skipped, 0 errors
2026-02-13 08:28:17 - health.services.data_sync - INFO - Syncing weight from 2026-02-14 to 2026-02-14 (1 days)
2026-02-13 08:28:17 - health.services.data_sync - INFO - weight sync complete: 0 synced, 1 skipped, 0 errors
2026-02-13 08:28:17 - health.services.data_sync - INFO - Syncing activities from 2026-02-14 to 2026-02-14
2026-02-13 08:28:17 - health.services.data_sync - INFO - Found 0 activities
2026-02-13 08:28:17 - health.services.data_sync - INFO - Activity sync complete: 0 synced, 0 skipped, 0 errors
2026-02-13 08:28:17 - health.services.query - INFO - Querying health data summary for 2026-02-14
2026-02-13 08:28:17 - health.services.query - INFO - Found 10 metrics and 0 activities
2026-02-13 08:28:17 - slack_bot.tools.health_read - INFO - Auto-sync completed, re-queried data.
2026-02-13 08:28:17 - slack_bot.dispatcher - INFO - [c26a858a] ✓ get_daily_detailed_stats finished in 2.04s
2026-02-13 08:28:17 - slack_bot.dispatcher - INFO - [c26a858a] Requesting final analysis...
2026-02-13 08:28:20 - slack_bot.dispatcher - INFO - [c26a858a] Final analysis received in 2.60s
2026-02-13 08:28:20 - slack_bot.dispatcher - INFO - Formatted text (len 272 -> 262)
2026-02-13 08:28:21 - slack_bot.dispatcher - INFO - [c26a858a] 📤 Message updated 1770942493.106369
2026-02-13 08:28:21 - slack_bot.dispatcher - INFO - [c26a858a] Dispatch completed in 7.82s
2026-02-13 08:28:21 - __main__ - INFO - [c26a858a] ✅ Request completed in 8.57s
2026-02-13 08:30:35 - __main__ - INFO - [c594d0f2] 📥 Received message from U0A8ZCK7RJM in D0AA4GBQRKK: 今天是2月13日 (Files: 0)
2026-02-13 08:30:36 - slack_bot.dispatcher - INFO - [c594d0f2] Processing message in D0AA4GBQRKK from U0A8ZCK7RJM
2026-02-13 08:30:36 - slack_bot.dispatcher - INFO - [c594d0f2] Calling Gemini for initial response...
2026-02-13 08:30:36 - slack_bot.dispatcher - INFO - [c594d0f2] Request config: model=google/gemini-3-flash-preview, tools=21, context=39 msgs
2026-02-13 08:30:49 - slack_bot.dispatcher - WARNING - [c594d0f2] Gemini returned empty response_text! (This usually means the proxy has issues)
2026-02-13 08:30:49 - slack_bot.dispatcher - INFO - [c594d0f2] Gemini response: text=0 chars, tool_calls=2
2026-02-13 08:30:49 - slack_bot.dispatcher - INFO - [c594d0f2] Tool calls successfully generated by Gemini (no SAFETY OVERRIDE needed)
2026-02-13 08:30:49 - slack_bot.dispatcher - INFO - [c594d0f2] Gemini response in 13.10s: 0 chars, 2 tools
2026-02-13 08:30:49 - slack_bot.dispatcher - INFO - [c594d0f2] Executing 2 tools
2026-02-13 08:30:49 - slack_bot.dispatcher - INFO - [c594d0f2] Tool: sync_garmin Args: {'target_date': '2026-02-13'}
2026-02-13 08:30:49 - slack_bot.tools.garmin - INFO - Starting Garmin sync for 2026-02-13...
2026-02-13 08:30:49 - health.services.data_sync - INFO - Authenticating with Garmin...
2026-02-13 08:30:49 - health.services.garmin_client - INFO - Authenticating with Garmin Connect China for 350134531@qq.com
2026-02-13 08:30:50 - health.services.garmin_client - INFO - Successfully authenticated with Garmin Connect China
2026-02-13 08:30:50 - health.services.data_sync - INFO - Authentication successful
2026-02-13 08:30:50 - health.services.data_sync - INFO - Syncing 13 metric types from 2026-02-13 to 2026-02-13
2026-02-13 08:30:50 - health.services.data_sync - INFO - Syncing steps from 2026-02-13 to 2026-02-13 (1 days)
2026-02-13 08:30:50 - health.services.data_sync - INFO - ✓ Synced steps for 2026-02-13
2026-02-13 08:30:50 - health.services.data_sync - INFO - steps sync complete: 1 synced, 0 skipped, 0 errors
2026-02-13 08:30:50 - health.services.data_sync - INFO - Syncing heart_rate from 2026-02-13 to 2026-02-13 (1 days)
2026-02-13 08:30:50 - health.services.data_sync - INFO - ✓ Synced heart_rate for 2026-02-13
2026-02-13 08:30:50 - health.services.data_sync - INFO - heart_rate sync complete: 1 synced, 0 skipped, 0 errors
2026-02-13 08:30:50 - health.services.data_sync - INFO - Syncing sleep from 2026-02-13 to 2026-02-13 (1 days)
2026-02-13 08:30:50 - health.services.data_sync - INFO - ✓ Synced sleep for 2026-02-13
2026-02-13 08:30:50 - health.services.data_sync - INFO - sleep sync complete: 1 synced, 0 skipped, 0 errors
2026-02-13 08:30:50 - health.services.data_sync - INFO - Syncing stress from 2026-02-13 to 2026-02-13 (1 days)
2026-02-13 08:30:50 - health.services.data_sync - INFO - ✓ Synced stress for 2026-02-13
2026-02-13 08:30:50 - health.services.data_sync - INFO - stress sync complete: 1 synced, 0 skipped, 0 errors
2026-02-13 08:30:50 - health.services.data_sync - INFO - Syncing body_battery from 2026-02-13 to 2026-02-13 (1 days)
2026-02-13 08:30:50 - health.services.data_sync - INFO - ✓ Synced body_battery for 2026-02-13
2026-02-13 08:30:50 - health.services.data_sync - INFO - body_battery sync complete: 1 synced, 0 skipped, 0 errors
2026-02-13 08:30:50 - health.services.data_sync - INFO - Syncing spo2 from 2026-02-13 to 2026-02-13 (1 days)
2026-02-13 08:30:50 - health.services.data_sync - INFO - ✓ Synced spo2 for 2026-02-13
2026-02-13 08:30:50 - health.services.data_sync - INFO - spo2 sync complete: 1 synced, 0 skipped, 0 errors
2026-02-13 08:30:50 - health.services.data_sync - INFO - Syncing respiration from 2026-02-13 to 2026-02-13 (1 days)
2026-02-13 08:30:51 - health.services.data_sync - INFO - ✓ Synced respiration for 2026-02-13
2026-02-13 08:30:51 - health.services.data_sync - INFO - respiration sync complete: 1 synced, 0 skipped, 0 errors
2026-02-13 08:30:51 - health.services.data_sync - INFO - Syncing hydration from 2026-02-13 to 2026-02-13 (1 days)
2026-02-13 08:30:51 - health.services.data_sync - INFO - ✓ Synced hydration for 2026-02-13
2026-02-13 08:30:51 - health.services.data_sync - INFO - hydration sync complete: 1 synced, 0 skipped, 0 errors
2026-02-13 08:30:51 - health.services.data_sync - INFO - Syncing floors from 2026-02-13 to 2026-02-13 (1 days)
2026-02-13 08:30:51 - health.services.data_sync - INFO - ✓ Synced floors for 2026-02-13
2026-02-13 08:30:51 - health.services.data_sync - INFO - floors sync complete: 1 synced, 0 skipped, 0 errors
2026-02-13 08:30:51 - health.services.data_sync - INFO - Syncing intensity_minutes from 2026-02-13 to 2026-02-13 (1 days)
2026-02-13 08:30:51 - health.services.data_sync - INFO - ✓ Synced intensity_minutes for 2026-02-13
2026-02-13 08:30:51 - health.services.data_sync - INFO - intensity_minutes sync complete: 1 synced, 0 skipped, 0 errors
2026-02-13 08:30:51 - health.services.data_sync - INFO - Syncing hrv from 2026-02-13 to 2026-02-13 (1 days)
2026-02-13 08:30:51 - health.services.data_sync - INFO - ✓ Synced hrv for 2026-02-13
2026-02-13 08:30:51 - health.services.data_sync - INFO - hrv sync complete: 1 synced, 0 skipped, 0 errors
2026-02-13 08:30:51 - health.services.data_sync - INFO - Syncing rhr from 2026-02-13 to 2026-02-13 (1 days)
2026-02-13 08:30:51 - health.services.data_sync - INFO - ✓ Synced rhr for 2026-02-13
2026-02-13 08:30:51 - health.services.data_sync - INFO - rhr sync complete: 1 synced, 0 skipped, 0 errors
2026-02-13 08:30:51 - health.services.data_sync - INFO - Syncing weight from 2026-02-13 to 2026-02-13 (1 days)
2026-02-13 08:30:51 - health.services.data_sync - INFO - weight sync complete: 0 synced, 1 skipped, 0 errors
2026-02-13 08:30:51 - health.services.data_sync - INFO - Syncing activities from 2026-02-13 to 2026-02-13
2026-02-13 08:30:51 - health.services.data_sync - INFO - Found 0 activities
2026-02-13 08:30:51 - health.services.data_sync - INFO - Activity sync complete: 0 synced, 0 skipped, 0 errors
2026-02-13 08:30:51 - health.services.query - INFO - Querying health data summary for 2026-02-13
2026-02-13 08:30:51 - health.services.query - INFO - Found 12 metrics and 0 activities
2026-02-13 08:30:51 - slack_bot.dispatcher - INFO - [c594d0f2] ✓ sync_garmin finished in 2.02s
2026-02-13 08:30:51 - slack_bot.dispatcher - INFO - [c594d0f2] Tool: get_daily_detailed_stats Args: {'target_date': '2026-02-13'}
2026-02-13 08:30:51 - health.services.query - INFO - Querying health data summary for 2026-02-13
2026-02-13 08:30:51 - health.services.query - INFO - Found 12 metrics and 0 activities
2026-02-13 08:30:51 - slack_bot.dispatcher - INFO - [c594d0f2] ✓ get_daily_detailed_stats finished in 0.01s
2026-02-13 08:30:51 - slack_bot.dispatcher - INFO - [c594d0f2] Requesting final analysis...
2026-02-13 08:30:55 - slack_bot.dispatcher - INFO - [c594d0f2] Final analysis received in 3.73s
2026-02-13 08:30:55 - slack_bot.dispatcher - INFO - Formatted text (len 619 -> 597)
2026-02-13 08:30:56 - slack_bot.dispatcher - INFO - [c594d0f2] 📤 Message updated 1770942636.302599
2026-02-13 08:30:56 - slack_bot.dispatcher - INFO - [c594d0f2] Dispatch completed in 19.61s
2026-02-13 08:30:56 - __main__ - INFO - [c594d0f2] ✅ Request completed in 20.58s
Failed to check the state of sock (session id: 1028f9ac-16b6-4750-8adb-343861bf56a0, error: SSLError, message: [SYS] unknown error (_ssl.c:2406))
Failed to check the state of sock (session id: 1028f9ac-16b6-4750-8adb-343861bf56a0, error: SSLError, message: [SYS] unknown error (_ssl.c:2406))
Failed to check the state of sock (session id: 1028f9ac-16b6-4750-8adb-343861bf56a0, error: SSLError, message: [SYS] unknown error (_ssl.c:2406))
Failed to check the state of sock (session id: 1028f9ac-16b6-4750-8adb-343861bf56a0, error: SSLError, message: [SYS] unknown error (_ssl.c:2406))
Failed to check the state of sock (session id: 1028f9ac-16b6-4750-8adb-343861bf56a0, error: SSLError, message: [SYS] unknown error (_ssl.c:2406))
2026-02-13 10:31:36 - __main__ - INFO - [4de654cc] 📥 Received message from U0A8ZCK7RJM in D0AA4GBQRKK: 今天的椭圆机训练请分析一下 (Files: 0)
2026-02-13 10:31:37 - slack_bot.dispatcher - INFO - [4de654cc] Processing message in D0AA4GBQRKK from U0A8ZCK7RJM
2026-02-13 10:31:37 - slack_bot.dispatcher - INFO - [4de654cc] Calling Gemini for initial response...
2026-02-13 10:31:37 - slack_bot.dispatcher - INFO - [4de654cc] Request config: model=google/gemini-3-flash-preview, tools=21, context=39 msgs
2026-02-13 10:31:41 - slack_bot.dispatcher - WARNING - [4de654cc] Gemini returned empty response_text! (This usually means the proxy has issues)
2026-02-13 10:31:41 - slack_bot.dispatcher - INFO - [4de654cc] Gemini response: text=0 chars, tool_calls=2
2026-02-13 10:31:41 - slack_bot.dispatcher - INFO - [4de654cc] Tool calls successfully generated by Gemini (no SAFETY OVERRIDE needed)
2026-02-13 10:31:41 - slack_bot.dispatcher - INFO - [4de654cc] Gemini response in 4.17s: 0 chars, 2 tools
2026-02-13 10:31:41 - slack_bot.dispatcher - INFO - [4de654cc] Executing 2 tools
2026-02-13 10:31:41 - slack_bot.dispatcher - INFO - [4de654cc] Tool: sync_garmin Args: {'target_date': '2026-02-13'}
2026-02-13 10:31:41 - slack_bot.tools.garmin - INFO - Starting Garmin sync for 2026-02-13...
2026-02-13 10:31:41 - health.services.data_sync - INFO - Authenticating with Garmin...
2026-02-13 10:31:41 - health.services.garmin_client - INFO - Authenticating with Garmin Connect China for 350134531@qq.com
2026-02-13 10:31:42 - health.services.garmin_client - INFO - Successfully authenticated with Garmin Connect China
2026-02-13 10:31:42 - health.services.data_sync - INFO - Authentication successful
2026-02-13 10:31:42 - health.services.data_sync - INFO - Syncing 13 metric types from 2026-02-13 to 2026-02-13
2026-02-13 10:31:42 - health.services.data_sync - INFO - Syncing steps from 2026-02-13 to 2026-02-13 (1 days)
2026-02-13 10:31:42 - health.services.data_sync - INFO - ✓ Synced steps for 2026-02-13
2026-02-13 10:31:42 - health.services.data_sync - INFO - steps sync complete: 1 synced, 0 skipped, 0 errors
2026-02-13 10:31:42 - health.services.data_sync - INFO - Syncing heart_rate from 2026-02-13 to 2026-02-13 (1 days)
2026-02-13 10:31:42 - health.services.data_sync - INFO - ✓ Synced heart_rate for 2026-02-13
2026-02-13 10:31:42 - health.services.data_sync - INFO - heart_rate sync complete: 1 synced, 0 skipped, 0 errors
2026-02-13 10:31:42 - health.services.data_sync - INFO - Syncing sleep from 2026-02-13 to 2026-02-13 (1 days)
2026-02-13 10:31:42 - health.services.data_sync - INFO - ✓ Synced sleep for 2026-02-13
2026-02-13 10:31:42 - health.services.data_sync - INFO - sleep sync complete: 1 synced, 0 skipped, 0 errors
2026-02-13 10:31:42 - health.services.data_sync - INFO - Syncing stress from 2026-02-13 to 2026-02-13 (1 days)
2026-02-13 10:31:43 - health.services.data_sync - INFO - ✓ Synced stress for 2026-02-13
2026-02-13 10:31:43 - health.services.data_sync - INFO - stress sync complete: 1 synced, 0 skipped, 0 errors
2026-02-13 10:31:43 - health.services.data_sync - INFO - Syncing body_battery from 2026-02-13 to 2026-02-13 (1 days)
2026-02-13 10:31:43 - health.services.data_sync - INFO - ✓ Synced body_battery for 2026-02-13
2026-02-13 10:31:43 - health.services.data_sync - INFO - body_battery sync complete: 1 synced, 0 skipped, 0 errors
2026-02-13 10:31:43 - health.services.data_sync - INFO - Syncing spo2 from 2026-02-13 to 2026-02-13 (1 days)
2026-02-13 10:31:43 - health.services.data_sync - INFO - ✓ Synced spo2 for 2026-02-13
2026-02-13 10:31:43 - health.services.data_sync - INFO - spo2 sync complete: 1 synced, 0 skipped, 0 errors
2026-02-13 10:31:43 - health.services.data_sync - INFO - Syncing respiration from 2026-02-13 to 2026-02-13 (1 days)
2026-02-13 10:31:43 - health.services.data_sync - INFO - ✓ Synced respiration for 2026-02-13
2026-02-13 10:31:43 - health.services.data_sync - INFO - respiration sync complete: 1 synced, 0 skipped, 0 errors
2026-02-13 10:31:43 - health.services.data_sync - INFO - Syncing hydration from 2026-02-13 to 2026-02-13 (1 days)
2026-02-13 10:31:43 - health.services.data_sync - INFO - ✓ Synced hydration for 2026-02-13
2026-02-13 10:31:43 - health.services.data_sync - INFO - hydration sync complete: 1 synced, 0 skipped, 0 errors
2026-02-13 10:31:43 - health.services.data_sync - INFO - Syncing floors from 2026-02-13 to 2026-02-13 (1 days)
2026-02-13 10:31:43 - health.services.data_sync - INFO - ✓ Synced floors for 2026-02-13
2026-02-13 10:31:43 - health.services.data_sync - INFO - floors sync complete: 1 synced, 0 skipped, 0 errors
2026-02-13 10:31:43 - health.services.data_sync - INFO - Syncing intensity_minutes from 2026-02-13 to 2026-02-13 (1 days)
2026-02-13 10:31:43 - health.services.data_sync - INFO - ✓ Synced intensity_minutes for 2026-02-13
2026-02-13 10:31:43 - health.services.data_sync - INFO - intensity_minutes sync complete: 1 synced, 0 skipped, 0 errors
2026-02-13 10:31:43 - health.services.data_sync - INFO - Syncing hrv from 2026-02-13 to 2026-02-13 (1 days)
2026-02-13 10:31:43 - health.services.data_sync - INFO - ✓ Synced hrv for 2026-02-13
2026-02-13 10:31:43 - health.services.data_sync - INFO - hrv sync complete: 1 synced, 0 skipped, 0 errors
2026-02-13 10:31:43 - health.services.data_sync - INFO - Syncing rhr from 2026-02-13 to 2026-02-13 (1 days)
2026-02-13 10:31:43 - health.services.data_sync - INFO - ✓ Synced rhr for 2026-02-13
2026-02-13 10:31:43 - health.services.data_sync - INFO - rhr sync complete: 1 synced, 0 skipped, 0 errors
2026-02-13 10:31:43 - health.services.data_sync - INFO - Syncing weight from 2026-02-13 to 2026-02-13 (1 days)
2026-02-13 10:31:44 - health.services.data_sync - INFO - weight sync complete: 0 synced, 1 skipped, 0 errors
2026-02-13 10:31:44 - health.services.data_sync - INFO - Syncing activities from 2026-02-13 to 2026-02-13
2026-02-13 10:31:44 - health.services.garmin_client - INFO - Fetched 1 activities
2026-02-13 10:31:44 - health.services.data_sync - INFO - Found 1 activities
2026-02-13 10:31:44 - health.services.data_sync - INFO - ✓ Synced activity 565373662 (elliptical) on 2026-02-13
2026-02-13 10:31:44 - health.services.data_sync - INFO - Activity sync complete: 1 synced, 0 skipped, 0 errors
2026-02-13 10:31:44 - health.services.query - INFO - Querying health data summary for 2026-02-13
2026-02-13 10:31:44 - health.services.query - INFO - Found 12 metrics and 1 activities
2026-02-13 10:31:44 - slack_bot.dispatcher - INFO - [4de654cc] ✓ sync_garmin finished in 2.36s
2026-02-13 10:31:44 - slack_bot.dispatcher - INFO - [4de654cc] Tool: get_activity_history Args: {'end_date': '2026-02-13', 'start_date': '2026-02-13'}
2026-02-13 10:31:44 - health.services.query - INFO - Querying activities from 2026-02-13 to 2026-02-13
2026-02-13 10:31:44 - health.services.query - INFO - Found 1 activities
2026-02-13 10:31:44 - slack_bot.dispatcher - INFO - [4de654cc] ✓ get_activity_history finished in 0.00s
2026-02-13 10:31:44 - slack_bot.dispatcher - INFO - [4de654cc] Requesting final analysis...
2026-02-13 10:31:48 - slack_bot.dispatcher - INFO - [4de654cc] Final analysis received in 4.29s
2026-02-13 10:31:48 - slack_bot.dispatcher - INFO - Formatted text (len 557 -> 537)
2026-02-13 10:31:49 - slack_bot.dispatcher - INFO - [4de654cc] 📤 Message updated 1770949897.603309
2026-02-13 10:31:49 - slack_bot.dispatcher - INFO - [4de654cc] Dispatch completed in 11.70s
2026-02-13 10:31:49 - __main__ - INFO - [4de654cc] ✅ Request completed in 12.53s
2026-02-15 08:37:40 - __main__ - INFO - [3827b948] 📥 Received message from U0A8ZCK7RJM in D0AA4GBQRKK: 同步佳明数据 (Files: 0)
2026-02-15 08:37:41 - slack_bot.dispatcher - INFO - [3827b948] Processing message in D0AA4GBQRKK from U0A8ZCK7RJM
2026-02-15 08:37:41 - slack_bot.dispatcher - INFO - [3827b948] Calling Gemini for initial response...
2026-02-15 08:37:41 - slack_bot.dispatcher - INFO - [3827b948] Request config: model=google/gemini-3-flash-preview, tools=21, context=39 msgs
2026-02-15 08:37:43 - slack_bot.dispatcher - WARNING - [3827b948] Gemini returned empty response_text! (This usually means the proxy has issues)
2026-02-15 08:37:43 - slack_bot.dispatcher - INFO - [3827b948] Gemini response: text=0 chars, tool_calls=1
2026-02-15 08:37:43 - slack_bot.dispatcher - INFO - [3827b948] Tool calls successfully generated by Gemini (no SAFETY OVERRIDE needed)
2026-02-15 08:37:43 - slack_bot.dispatcher - INFO - [3827b948] Gemini response in 2.55s: 0 chars, 1 tools
2026-02-15 08:37:43 - slack_bot.dispatcher - INFO - [3827b948] Executing 1 tools
2026-02-15 08:37:43 - slack_bot.dispatcher - INFO - [3827b948] Tool: sync_garmin Args: {'target_date': '2026-02-13'}
2026-02-15 08:37:43 - slack_bot.tools.garmin - INFO - Starting Garmin sync for 2026-02-13...
2026-02-15 08:37:43 - health.services.data_sync - INFO - Authenticating with Garmin...
2026-02-15 08:37:43 - health.services.garmin_client - INFO - Authenticating with Garmin Connect China for 350134531@qq.com
2026-02-15 08:37:44 - health.services.garmin_client - INFO - Successfully authenticated with Garmin Connect China
2026-02-15 08:37:44 - health.services.data_sync - INFO - Authentication successful
2026-02-15 08:37:44 - health.services.data_sync - INFO - Syncing 13 metric types from 2026-02-13 to 2026-02-13
2026-02-15 08:37:44 - health.services.data_sync - INFO - Syncing steps from 2026-02-13 to 2026-02-13 (1 days)
2026-02-15 08:37:44 - health.services.data_sync - INFO - ✓ Synced steps for 2026-02-13
2026-02-15 08:37:44 - health.services.data_sync - INFO - steps sync complete: 1 synced, 0 skipped, 0 errors
2026-02-15 08:37:44 - health.services.data_sync - INFO - Syncing heart_rate from 2026-02-13 to 2026-02-13 (1 days)
2026-02-15 08:37:44 - health.services.data_sync - INFO - ✓ Synced heart_rate for 2026-02-13
2026-02-15 08:37:44 - health.services.data_sync - INFO - heart_rate sync complete: 1 synced, 0 skipped, 0 errors
2026-02-15 08:37:44 - health.services.data_sync - INFO - Syncing sleep from 2026-02-13 to 2026-02-13 (1 days)
2026-02-15 08:37:44 - health.services.data_sync - INFO - ✓ Synced sleep for 2026-02-13
2026-02-15 08:37:44 - health.services.data_sync - INFO - sleep sync complete: 1 synced, 0 skipped, 0 errors
2026-02-15 08:37:44 - health.services.data_sync - INFO - Syncing stress from 2026-02-13 to 2026-02-13 (1 days)
2026-02-15 08:37:44 - health.services.data_sync - INFO - ✓ Synced stress for 2026-02-13
2026-02-15 08:37:44 - health.services.data_sync - INFO - stress sync complete: 1 synced, 0 skipped, 0 errors
2026-02-15 08:37:44 - health.services.data_sync - INFO - Syncing body_battery from 2026-02-13 to 2026-02-13 (1 days)
2026-02-15 08:37:45 - health.services.data_sync - INFO - ✓ Synced body_battery for 2026-02-13
2026-02-15 08:37:45 - health.services.data_sync - INFO - body_battery sync complete: 1 synced, 0 skipped, 0 errors
2026-02-15 08:37:45 - health.services.data_sync - INFO - Syncing spo2 from 2026-02-13 to 2026-02-13 (1 days)
2026-02-15 08:37:45 - health.services.data_sync - INFO - ✓ Synced spo2 for 2026-02-13
2026-02-15 08:37:45 - health.services.data_sync - INFO - spo2 sync complete: 1 synced, 0 skipped, 0 errors
2026-02-15 08:37:45 - health.services.data_sync - INFO - Syncing respiration from 2026-02-13 to 2026-02-13 (1 days)
2026-02-15 08:37:45 - health.services.data_sync - INFO - ✓ Synced respiration for 2026-02-13
2026-02-15 08:37:45 - health.services.data_sync - INFO - respiration sync complete: 1 synced, 0 skipped, 0 errors
2026-02-15 08:37:45 - health.services.data_sync - INFO - Syncing hydration from 2026-02-13 to 2026-02-13 (1 days)
2026-02-15 08:37:45 - health.services.data_sync - INFO - ✓ Synced hydration for 2026-02-13
2026-02-15 08:37:45 - health.services.data_sync - INFO - hydration sync complete: 1 synced, 0 skipped, 0 errors
2026-02-15 08:37:45 - health.services.data_sync - INFO - Syncing floors from 2026-02-13 to 2026-02-13 (1 days)
2026-02-15 08:37:45 - health.services.data_sync - INFO - ✓ Synced floors for 2026-02-13
2026-02-15 08:37:45 - health.services.data_sync - INFO - floors sync complete: 1 synced, 0 skipped, 0 errors
2026-02-15 08:37:45 - health.services.data_sync - INFO - Syncing intensity_minutes from 2026-02-13 to 2026-02-13 (1 days)
2026-02-15 08:37:45 - health.services.data_sync - INFO - ✓ Synced intensity_minutes for 2026-02-13
2026-02-15 08:37:45 - health.services.data_sync - INFO - intensity_minutes sync complete: 1 synced, 0 skipped, 0 errors
2026-02-15 08:37:45 - health.services.data_sync - INFO - Syncing hrv from 2026-02-13 to 2026-02-13 (1 days)
2026-02-15 08:37:45 - health.services.data_sync - INFO - ✓ Synced hrv for 2026-02-13
2026-02-15 08:37:45 - health.services.data_sync - INFO - hrv sync complete: 1 synced, 0 skipped, 0 errors
2026-02-15 08:37:45 - health.services.data_sync - INFO - Syncing rhr from 2026-02-13 to 2026-02-13 (1 days)
2026-02-15 08:37:45 - health.services.data_sync - INFO - ✓ Synced rhr for 2026-02-13
2026-02-15 08:37:45 - health.services.data_sync - INFO - rhr sync complete: 1 synced, 0 skipped, 0 errors
2026-02-15 08:37:45 - health.services.data_sync - INFO - Syncing weight from 2026-02-13 to 2026-02-13 (1 days)
2026-02-15 08:37:45 - health.services.data_sync - INFO - weight sync complete: 0 synced, 1 skipped, 0 errors
2026-02-15 08:37:45 - health.services.data_sync - INFO - Syncing activities from 2026-02-13 to 2026-02-13
2026-02-15 08:37:46 - health.services.garmin_client - INFO - Fetched 1 activities
2026-02-15 08:37:46 - health.services.data_sync - INFO - Found 1 activities
2026-02-15 08:37:46 - health.services.data_sync - INFO - ✓ Synced activity 565373662 (elliptical) on 2026-02-13
2026-02-15 08:37:46 - health.services.data_sync - INFO - Activity sync complete: 1 synced, 0 skipped, 0 errors
2026-02-15 08:37:46 - health.services.query - INFO - Querying health data summary for 2026-02-13
2026-02-15 08:37:46 - health.services.query - INFO - Found 12 metrics and 1 activities
2026-02-15 08:37:46 - slack_bot.dispatcher - INFO - [3827b948] ✓ sync_garmin finished in 2.34s
2026-02-15 08:37:46 - slack_bot.dispatcher - INFO - [3827b948] Requesting final analysis...
2026-02-15 08:37:49 - slack_bot.dispatcher - INFO - [3827b948] Final analysis received in 3.75s
2026-02-15 08:37:49 - slack_bot.dispatcher - INFO - Formatted text (len 489 -> 465)
2026-02-15 08:37:50 - slack_bot.dispatcher - INFO - [3827b948] 📤 Message updated 1771115861.117909
2026-02-15 08:37:50 - slack_bot.dispatcher - INFO - [3827b948] Dispatch completed in 9.32s
2026-02-15 08:37:50 - __main__ - INFO - [3827b948] ✅ Request completed in 10.04s
2026-02-15 08:38:19 - __main__ - INFO - [937b4945] 📥 Received message from U0A8ZCK7RJM in D0AA4GBQRKK: 2月15日睡眠怎么样 (Files: 0)
2026-02-15 08:38:20 - slack_bot.dispatcher - INFO - [937b4945] Processing message in D0AA4GBQRKK from U0A8ZCK7RJM
2026-02-15 08:38:20 - slack_bot.dispatcher - INFO - [937b4945] Calling Gemini for initial response...
2026-02-15 08:38:20 - slack_bot.dispatcher - INFO - [937b4945] Request config: model=google/gemini-3-flash-preview, tools=21, context=39 msgs
2026-02-15 08:38:23 - slack_bot.dispatcher - WARNING - [937b4945] Gemini returned empty response_text! (This usually means the proxy has issues)
2026-02-15 08:38:23 - slack_bot.dispatcher - INFO - [937b4945] Gemini response: text=0 chars, tool_calls=2
2026-02-15 08:38:23 - slack_bot.dispatcher - INFO - [937b4945] Tool calls successfully generated by Gemini (no SAFETY OVERRIDE needed)
2026-02-15 08:38:23 - slack_bot.dispatcher - INFO - [937b4945] Gemini response in 2.81s: 0 chars, 2 tools
2026-02-15 08:38:23 - slack_bot.dispatcher - INFO - [937b4945] Executing 2 tools
2026-02-15 08:38:23 - slack_bot.dispatcher - INFO - [937b4945] Tool: sync_garmin Args: {'target_date': '2026-02-15'}
2026-02-15 08:38:23 - slack_bot.tools.garmin - INFO - Starting Garmin sync for 2026-02-15...
2026-02-15 08:38:23 - health.services.data_sync - INFO - Authenticating with Garmin...
2026-02-15 08:38:23 - health.services.garmin_client - INFO - Authenticating with Garmin Connect China for 350134531@qq.com
2026-02-15 08:38:23 - health.services.garmin_client - INFO - Successfully authenticated with Garmin Connect China
2026-02-15 08:38:23 - health.services.data_sync - INFO - Authentication successful
2026-02-15 08:38:23 - health.services.data_sync - INFO - Syncing 13 metric types from 2026-02-15 to 2026-02-15
2026-02-15 08:38:23 - health.services.data_sync - INFO - Syncing steps from 2026-02-15 to 2026-02-15 (1 days)
2026-02-15 08:38:23 - health.services.data_sync - INFO - ✓ Synced steps for 2026-02-15
2026-02-15 08:38:23 - health.services.data_sync - INFO - steps sync complete: 1 synced, 0 skipped, 0 errors
2026-02-15 08:38:23 - health.services.data_sync - INFO - Syncing heart_rate from 2026-02-15 to 2026-02-15 (1 days)
2026-02-15 08:38:23 - health.services.data_sync - INFO - ✓ Synced heart_rate for 2026-02-15
2026-02-15 08:38:23 - health.services.data_sync - INFO - heart_rate sync complete: 1 synced, 0 skipped, 0 errors
2026-02-15 08:38:23 - health.services.data_sync - INFO - Syncing sleep from 2026-02-15 to 2026-02-15 (1 days)
2026-02-15 08:38:24 - health.services.data_sync - INFO - ✓ Synced sleep for 2026-02-15
2026-02-15 08:38:24 - health.services.data_sync - INFO - sleep sync complete: 1 synced, 0 skipped, 0 errors
2026-02-15 08:38:24 - health.services.data_sync - INFO - Syncing stress from 2026-02-15 to 2026-02-15 (1 days)
2026-02-15 08:38:24 - health.services.data_sync - INFO - ✓ Synced stress for 2026-02-15
2026-02-15 08:38:24 - health.services.data_sync - INFO - stress sync complete: 1 synced, 0 skipped, 0 errors
2026-02-15 08:38:24 - health.services.data_sync - INFO - Syncing body_battery from 2026-02-15 to 2026-02-15 (1 days)
2026-02-15 08:38:24 - health.services.data_sync - INFO - ✓ Synced body_battery for 2026-02-15
2026-02-15 08:38:24 - health.services.data_sync - INFO - body_battery sync complete: 1 synced, 0 skipped, 0 errors
2026-02-15 08:38:24 - health.services.data_sync - INFO - Syncing spo2 from 2026-02-15 to 2026-02-15 (1 days)
2026-02-15 08:38:24 - health.services.data_sync - INFO - ✓ Synced spo2 for 2026-02-15
2026-02-15 08:38:24 - health.services.data_sync - INFO - spo2 sync complete: 1 synced, 0 skipped, 0 errors
2026-02-15 08:38:24 - health.services.data_sync - INFO - Syncing respiration from 2026-02-15 to 2026-02-15 (1 days)
2026-02-15 08:38:24 - health.services.data_sync - INFO - ✓ Synced respiration for 2026-02-15
2026-02-15 08:38:24 - health.services.data_sync - INFO - respiration sync complete: 1 synced, 0 skipped, 0 errors
2026-02-15 08:38:24 - health.services.data_sync - INFO - Syncing hydration from 2026-02-15 to 2026-02-15 (1 days)
2026-02-15 08:38:24 - health.services.data_sync - INFO - ✓ Synced hydration for 2026-02-15
2026-02-15 08:38:24 - health.services.data_sync - INFO - hydration sync complete: 1 synced, 0 skipped, 0 errors
2026-02-15 08:38:24 - health.services.data_sync - INFO - Syncing floors from 2026-02-15 to 2026-02-15 (1 days)
2026-02-15 08:38:24 - health.services.data_sync - INFO - ✓ Synced floors for 2026-02-15
2026-02-15 08:38:24 - health.services.data_sync - INFO - floors sync complete: 1 synced, 0 skipped, 0 errors
2026-02-15 08:38:24 - health.services.data_sync - INFO - Syncing intensity_minutes from 2026-02-15 to 2026-02-15 (1 days)
2026-02-15 08:38:24 - health.services.data_sync - INFO - ✓ Synced intensity_minutes for 2026-02-15
2026-02-15 08:38:24 - health.services.data_sync - INFO - intensity_minutes sync complete: 1 synced, 0 skipped, 0 errors
2026-02-15 08:38:24 - health.services.data_sync - INFO - Syncing hrv from 2026-02-15 to 2026-02-15 (1 days)
2026-02-15 08:38:24 - health.services.data_sync - INFO - ✓ Synced hrv for 2026-02-15
2026-02-15 08:38:24 - health.services.data_sync - INFO - hrv sync complete: 1 synced, 0 skipped, 0 errors
2026-02-15 08:38:24 - health.services.data_sync - INFO - Syncing rhr from 2026-02-15 to 2026-02-15 (1 days)
2026-02-15 08:38:24 - health.services.data_sync - INFO - ✓ Synced rhr for 2026-02-15
2026-02-15 08:38:24 - health.services.data_sync - INFO - rhr sync complete: 1 synced, 0 skipped, 0 errors
2026-02-15 08:38:24 - health.services.data_sync - INFO - Syncing weight from 2026-02-15 to 2026-02-15 (1 days)
2026-02-15 08:38:25 - health.services.data_sync - INFO - weight sync complete: 0 synced, 1 skipped, 0 errors
2026-02-15 08:38:25 - health.services.data_sync - INFO - Syncing activities from 2026-02-15 to 2026-02-15
2026-02-15 08:38:25 - health.services.data_sync - INFO - Found 0 activities
2026-02-15 08:38:25 - health.services.data_sync - INFO - Activity sync complete: 0 synced, 0 skipped, 0 errors
2026-02-15 08:38:25 - health.services.query - INFO - Querying health data summary for 2026-02-15
2026-02-15 08:38:25 - health.services.query - INFO - Found 12 metrics and 0 activities
2026-02-15 08:38:25 - slack_bot.dispatcher - INFO - [937b4945] ✓ sync_garmin finished in 1.72s
2026-02-15 08:38:25 - slack_bot.dispatcher - INFO - [937b4945] Tool: get_daily_detailed_stats Args: {'target_date': '2026-02-15'}
2026-02-15 08:38:25 - health.services.query - INFO - Querying health data summary for 2026-02-15
2026-02-15 08:38:25 - health.services.query - INFO - Found 12 metrics and 0 activities
2026-02-15 08:38:25 - slack_bot.dispatcher - INFO - [937b4945] ✓ get_daily_detailed_stats finished in 0.01s
2026-02-15 08:38:25 - slack_bot.dispatcher - INFO - [937b4945] Requesting final analysis...
2026-02-15 08:38:28 - slack_bot.dispatcher - INFO - [937b4945] Final analysis received in 3.38s
2026-02-15 08:38:28 - slack_bot.dispatcher - INFO - Formatted text (len 460 -> 438)
2026-02-15 08:38:29 - slack_bot.dispatcher - INFO - [937b4945] 📤 Message updated 1771115900.514389
2026-02-15 08:38:29 - slack_bot.dispatcher - INFO - [937b4945] Dispatch completed in 8.94s
2026-02-15 08:38:29 - __main__ - INFO - [937b4945] ✅ Request completed in 9.66s
2026-02-17 09:10:20 - __main__ - INFO - [70a83f45] 📥 Received message from U0A8ZCK7RJM in D0AA4GBQRKK: 同步佳明数据 (Files: 0)
2026-02-17 09:10:21 - slack_bot.dispatcher - INFO - [70a83f45] Processing message in D0AA4GBQRKK from U0A8ZCK7RJM
2026-02-17 09:10:21 - slack_bot.dispatcher - INFO - [70a83f45] Calling Gemini for initial response...
2026-02-17 09:10:21 - slack_bot.dispatcher - INFO - [70a83f45] Request config: model=google/gemini-3-flash-preview, tools=21, context=39 msgs
2026-02-17 09:10:24 - slack_bot.dispatcher - WARNING - [70a83f45] Gemini returned empty response_text! (This usually means the proxy has issues)
2026-02-17 09:10:24 - slack_bot.dispatcher - INFO - [70a83f45] Gemini response: text=0 chars, tool_calls=1
2026-02-17 09:10:24 - slack_bot.dispatcher - INFO - [70a83f45] Tool calls successfully generated by Gemini (no SAFETY OVERRIDE needed)
2026-02-17 09:10:24 - slack_bot.dispatcher - INFO - [70a83f45] Gemini response in 2.62s: 0 chars, 1 tools
2026-02-17 09:10:24 - slack_bot.dispatcher - INFO - [70a83f45] Executing 1 tools
2026-02-17 09:10:24 - slack_bot.dispatcher - INFO - [70a83f45] Tool: sync_garmin Args: {'target_date': '2026-02-15'}
2026-02-17 09:10:24 - slack_bot.tools.garmin - INFO - Starting Garmin sync for 2026-02-15...
2026-02-17 09:10:24 - health.services.data_sync - INFO - Authenticating with Garmin...
2026-02-17 09:10:24 - health.services.garmin_client - INFO - Authenticating with Garmin Connect China for 350134531@qq.com
2026-02-17 09:10:24 - health.services.garmin_client - INFO - Successfully authenticated with Garmin Connect China
2026-02-17 09:10:24 - health.services.data_sync - INFO - Authentication successful
2026-02-17 09:10:24 - health.services.data_sync - INFO - Syncing 13 metric types from 2026-02-15 to 2026-02-15
2026-02-17 09:10:24 - health.services.data_sync - INFO - Syncing steps from 2026-02-15 to 2026-02-15 (1 days)
2026-02-17 09:10:24 - health.services.data_sync - INFO - ✓ Synced steps for 2026-02-15
2026-02-17 09:10:24 - health.services.data_sync - INFO - steps sync complete: 1 synced, 0 skipped, 0 errors
2026-02-17 09:10:24 - health.services.data_sync - INFO - Syncing heart_rate from 2026-02-15 to 2026-02-15 (1 days)
2026-02-17 09:10:24 - health.services.data_sync - INFO - ✓ Synced heart_rate for 2026-02-15
2026-02-17 09:10:24 - health.services.data_sync - INFO - heart_rate sync complete: 1 synced, 0 skipped, 0 errors
2026-02-17 09:10:24 - health.services.data_sync - INFO - Syncing sleep from 2026-02-15 to 2026-02-15 (1 days)
2026-02-17 09:10:25 - health.services.data_sync - INFO - ✓ Synced sleep for 2026-02-15
2026-02-17 09:10:25 - health.services.data_sync - INFO - sleep sync complete: 1 synced, 0 skipped, 0 errors
2026-02-17 09:10:25 - health.services.data_sync - INFO - Syncing stress from 2026-02-15 to 2026-02-15 (1 days)
2026-02-17 09:10:25 - health.services.data_sync - INFO - ✓ Synced stress for 2026-02-15
2026-02-17 09:10:25 - health.services.data_sync - INFO - stress sync complete: 1 synced, 0 skipped, 0 errors
2026-02-17 09:10:25 - health.services.data_sync - INFO - Syncing body_battery from 2026-02-15 to 2026-02-15 (1 days)
2026-02-17 09:10:25 - health.services.data_sync - INFO - ✓ Synced body_battery for 2026-02-15
2026-02-17 09:10:25 - health.services.data_sync - INFO - body_battery sync complete: 1 synced, 0 skipped, 0 errors
2026-02-17 09:10:25 - health.services.data_sync - INFO - Syncing spo2 from 2026-02-15 to 2026-02-15 (1 days)
2026-02-17 09:10:25 - health.services.data_sync - INFO - ✓ Synced spo2 for 2026-02-15
2026-02-17 09:10:25 - health.services.data_sync - INFO - spo2 sync complete: 1 synced, 0 skipped, 0 errors
2026-02-17 09:10:25 - health.services.data_sync - INFO - Syncing respiration from 2026-02-15 to 2026-02-15 (1 days)
2026-02-17 09:10:25 - health.services.data_sync - INFO - ✓ Synced respiration for 2026-02-15
2026-02-17 09:10:25 - health.services.data_sync - INFO - respiration sync complete: 1 synced, 0 skipped, 0 errors
2026-02-17 09:10:25 - health.services.data_sync - INFO - Syncing hydration from 2026-02-15 to 2026-02-15 (1 days)
2026-02-17 09:10:25 - health.services.data_sync - INFO - ✓ Synced hydration for 2026-02-15
2026-02-17 09:10:25 - health.services.data_sync - INFO - hydration sync complete: 1 synced, 0 skipped, 0 errors
2026-02-17 09:10:25 - health.services.data_sync - INFO - Syncing floors from 2026-02-15 to 2026-02-15 (1 days)
2026-02-17 09:10:25 - health.services.data_sync - INFO - ✓ Synced floors for 2026-02-15
2026-02-17 09:10:25 - health.services.data_sync - INFO - floors sync complete: 1 synced, 0 skipped, 0 errors
2026-02-17 09:10:25 - health.services.data_sync - INFO - Syncing intensity_minutes from 2026-02-15 to 2026-02-15 (1 days)
2026-02-17 09:10:25 - health.services.data_sync - INFO - ✓ Synced intensity_minutes for 2026-02-15
2026-02-17 09:10:25 - health.services.data_sync - INFO - intensity_minutes sync complete: 1 synced, 0 skipped, 0 errors
2026-02-17 09:10:25 - health.services.data_sync - INFO - Syncing hrv from 2026-02-15 to 2026-02-15 (1 days)
2026-02-17 09:10:25 - health.services.data_sync - INFO - ✓ Synced hrv for 2026-02-15
2026-02-17 09:10:25 - health.services.data_sync - INFO - hrv sync complete: 1 synced, 0 skipped, 0 errors
2026-02-17 09:10:25 - health.services.data_sync - INFO - Syncing rhr from 2026-02-15 to 2026-02-15 (1 days)
2026-02-17 09:10:26 - health.services.data_sync - INFO - ✓ Synced rhr for 2026-02-15
2026-02-17 09:10:26 - health.services.data_sync - INFO - rhr sync complete: 1 synced, 0 skipped, 0 errors
2026-02-17 09:10:26 - health.services.data_sync - INFO - Syncing weight from 2026-02-15 to 2026-02-15 (1 days)
2026-02-17 09:10:26 - health.services.data_sync - INFO - weight sync complete: 0 synced, 1 skipped, 0 errors
2026-02-17 09:10:26 - health.services.data_sync - INFO - Syncing activities from 2026-02-15 to 2026-02-15
2026-02-17 09:10:26 - health.services.garmin_client - INFO - Fetched 1 activities
2026-02-17 09:10:26 - health.services.data_sync - INFO - Found 1 activities
2026-02-17 09:10:26 - health.services.data_sync - INFO - ✓ Synced activity 566036647 (strength_training) on 2026-02-15
2026-02-17 09:10:26 - health.services.data_sync - INFO - Activity sync complete: 1 synced, 0 skipped, 0 errors
2026-02-17 09:10:26 - health.services.query - INFO - Querying health data summary for 2026-02-15
2026-02-17 09:10:26 - health.services.query - INFO - Found 12 metrics and 1 activities
2026-02-17 09:10:26 - slack_bot.dispatcher - INFO - [70a83f45] ✓ sync_garmin finished in 2.22s
2026-02-17 09:10:26 - slack_bot.dispatcher - INFO - [70a83f45] Requesting final analysis...
2026-02-17 09:10:29 - slack_bot.dispatcher - INFO - [70a83f45] Final analysis received in 3.30s
2026-02-17 09:10:29 - slack_bot.dispatcher - INFO - Formatted text (len 489 -> 469)
2026-02-17 09:10:30 - slack_bot.dispatcher - INFO - [70a83f45] 📤 Message updated 1771290621.374159
2026-02-17 09:10:30 - slack_bot.dispatcher - INFO - [70a83f45] Dispatch completed in 8.90s
2026-02-17 09:10:30 - __main__ - INFO - [70a83f45] ✅ Request completed in 9.60s
2026-02-17 09:16:24 - __main__ - INFO - [d4c8347d] 📥 Received message from U0A8ZCK7RJM in D0AA4GBQRKK: 今天2月17日了，还可以同步更多数据 (Files: 0)
2026-02-17 09:16:24 - slack_bot.dispatcher - INFO - [d4c8347d] Processing message in D0AA4GBQRKK from U0A8ZCK7RJM
2026-02-17 09:16:24 - slack_bot.dispatcher - INFO - [d4c8347d] Calling Gemini for initial response...
2026-02-17 09:16:24 - slack_bot.dispatcher - INFO - [d4c8347d] Request config: model=google/gemini-3-flash-preview, tools=21, context=39 msgs
2026-02-17 09:16:28 - slack_bot.dispatcher - WARNING - [d4c8347d] Gemini returned empty response_text! (This usually means the proxy has issues)
2026-02-17 09:16:28 - slack_bot.dispatcher - INFO - [d4c8347d] Gemini response: text=0 chars, tool_calls=3
2026-02-17 09:16:28 - slack_bot.dispatcher - INFO - [d4c8347d] Tool calls successfully generated by Gemini (no SAFETY OVERRIDE needed)
2026-02-17 09:16:28 - slack_bot.dispatcher - INFO - [d4c8347d] Gemini response in 3.32s: 0 chars, 3 tools
2026-02-17 09:16:28 - slack_bot.dispatcher - INFO - [d4c8347d] Executing 3 tools
2026-02-17 09:16:28 - slack_bot.dispatcher - INFO - [d4c8347d] Tool: sync_garmin Args: {'target_date': '2026-02-17'}
2026-02-17 09:16:28 - slack_bot.tools.garmin - INFO - Starting Garmin sync for 2026-02-17...
2026-02-17 09:16:28 - health.services.data_sync - INFO - Authenticating with Garmin...
2026-02-17 09:16:28 - health.services.garmin_client - INFO - Authenticating with Garmin Connect China for 350134531@qq.com
2026-02-17 09:16:28 - health.services.garmin_client - INFO - Successfully authenticated with Garmin Connect China
2026-02-17 09:16:28 - health.services.data_sync - INFO - Authentication successful
2026-02-17 09:16:28 - health.services.data_sync - INFO - Syncing 13 metric types from 2026-02-17 to 2026-02-17
2026-02-17 09:16:28 - health.services.data_sync - INFO - Syncing steps from 2026-02-17 to 2026-02-17 (1 days)
2026-02-17 09:16:28 - health.services.data_sync - INFO - ✓ Synced steps for 2026-02-17
2026-02-17 09:16:28 - health.services.data_sync - INFO - steps sync complete: 1 synced, 0 skipped, 0 errors
2026-02-17 09:16:28 - health.services.data_sync - INFO - Syncing heart_rate from 2026-02-17 to 2026-02-17 (1 days)
2026-02-17 09:16:28 - health.services.data_sync - INFO - ✓ Synced heart_rate for 2026-02-17
2026-02-17 09:16:28 - health.services.data_sync - INFO - heart_rate sync complete: 1 synced, 0 skipped, 0 errors
2026-02-17 09:16:28 - health.services.data_sync - INFO - Syncing sleep from 2026-02-17 to 2026-02-17 (1 days)
2026-02-17 09:16:29 - health.services.data_sync - INFO - ✓ Synced sleep for 2026-02-17
2026-02-17 09:16:29 - health.services.data_sync - INFO - sleep sync complete: 1 synced, 0 skipped, 0 errors
2026-02-17 09:16:29 - health.services.data_sync - INFO - Syncing stress from 2026-02-17 to 2026-02-17 (1 days)
2026-02-17 09:16:29 - health.services.data_sync - INFO - ✓ Synced stress for 2026-02-17
2026-02-17 09:16:29 - health.services.data_sync - INFO - stress sync complete: 1 synced, 0 skipped, 0 errors
2026-02-17 09:16:29 - health.services.data_sync - INFO - Syncing body_battery from 2026-02-17 to 2026-02-17 (1 days)
2026-02-17 09:16:29 - health.services.data_sync - INFO - ✓ Synced body_battery for 2026-02-17
2026-02-17 09:16:29 - health.services.data_sync - INFO - body_battery sync complete: 1 synced, 0 skipped, 0 errors
2026-02-17 09:16:29 - health.services.data_sync - INFO - Syncing spo2 from 2026-02-17 to 2026-02-17 (1 days)
2026-02-17 09:16:29 - health.services.data_sync - INFO - ✓ Synced spo2 for 2026-02-17
2026-02-17 09:16:29 - health.services.data_sync - INFO - spo2 sync complete: 1 synced, 0 skipped, 0 errors
2026-02-17 09:16:29 - health.services.data_sync - INFO - Syncing respiration from 2026-02-17 to 2026-02-17 (1 days)
2026-02-17 09:16:29 - health.services.data_sync - INFO - ✓ Synced respiration for 2026-02-17
2026-02-17 09:16:29 - health.services.data_sync - INFO - respiration sync complete: 1 synced, 0 skipped, 0 errors
2026-02-17 09:16:29 - health.services.data_sync - INFO - Syncing hydration from 2026-02-17 to 2026-02-17 (1 days)
2026-02-17 09:16:29 - health.services.data_sync - INFO - ✓ Synced hydration for 2026-02-17
2026-02-17 09:16:29 - health.services.data_sync - INFO - hydration sync complete: 1 synced, 0 skipped, 0 errors
2026-02-17 09:16:29 - health.services.data_sync - INFO - Syncing floors from 2026-02-17 to 2026-02-17 (1 days)
2026-02-17 09:16:29 - health.services.data_sync - INFO - ✓ Synced floors for 2026-02-17
2026-02-17 09:16:29 - health.services.data_sync - INFO - floors sync complete: 1 synced, 0 skipped, 0 errors
2026-02-17 09:16:29 - health.services.data_sync - INFO - Syncing intensity_minutes from 2026-02-17 to 2026-02-17 (1 days)
2026-02-17 09:16:29 - health.services.data_sync - INFO - ✓ Synced intensity_minutes for 2026-02-17
2026-02-17 09:16:29 - health.services.data_sync - INFO - intensity_minutes sync complete: 1 synced, 0 skipped, 0 errors
2026-02-17 09:16:29 - health.services.data_sync - INFO - Syncing hrv from 2026-02-17 to 2026-02-17 (1 days)
2026-02-17 09:16:29 - health.services.data_sync - INFO - ✓ Synced hrv for 2026-02-17
2026-02-17 09:16:29 - health.services.data_sync - INFO - hrv sync complete: 1 synced, 0 skipped, 0 errors
2026-02-17 09:16:30 - health.services.data_sync - INFO - Syncing rhr from 2026-02-17 to 2026-02-17 (1 days)
2026-02-17 09:16:30 - health.services.data_sync - INFO - ✓ Synced rhr for 2026-02-17
2026-02-17 09:16:30 - health.services.data_sync - INFO - rhr sync complete: 1 synced, 0 skipped, 0 errors
2026-02-17 09:16:30 - health.services.data_sync - INFO - Syncing weight from 2026-02-17 to 2026-02-17 (1 days)
2026-02-17 09:16:30 - health.services.data_sync - INFO - weight sync complete: 0 synced, 1 skipped, 0 errors
2026-02-17 09:16:30 - health.services.data_sync - INFO - Syncing activities from 2026-02-17 to 2026-02-17
2026-02-17 09:16:30 - health.services.data_sync - INFO - Found 0 activities
2026-02-17 09:16:30 - health.services.data_sync - INFO - Activity sync complete: 0 synced, 0 skipped, 0 errors
2026-02-17 09:16:30 - health.services.query - INFO - Querying health data summary for 2026-02-17
2026-02-17 09:16:30 - health.services.query - INFO - Found 12 metrics and 0 activities
2026-02-17 09:16:30 - slack_bot.dispatcher - INFO - [d4c8347d] ✓ sync_garmin finished in 1.95s
2026-02-17 09:16:30 - slack_bot.dispatcher - INFO - [d4c8347d] Tool: get_daily_detailed_stats Args: {'target_date': '2026-02-17'}
2026-02-17 09:16:30 - health.services.query - INFO - Querying health data summary for 2026-02-17
2026-02-17 09:16:30 - health.services.query - INFO - Found 12 metrics and 0 activities
2026-02-17 09:16:30 - slack_bot.dispatcher - INFO - [d4c8347d] ✓ get_daily_detailed_stats finished in 0.01s
2026-02-17 09:16:30 - slack_bot.dispatcher - INFO - [d4c8347d] Tool: get_activity_history Args: {'end_date': '2026-02-17', 'start_date': '2026-02-16'}
2026-02-17 09:16:30 - health.services.query - INFO - Querying activities from 2026-02-16 to 2026-02-17
2026-02-17 09:16:30 - health.services.query - INFO - Found 0 activities
2026-02-17 09:16:30 - slack_bot.dispatcher - INFO - [d4c8347d] ✓ get_activity_history finished in 0.00s
2026-02-17 09:16:30 - slack_bot.dispatcher - INFO - [d4c8347d] Requesting final analysis...
2026-02-17 09:16:35 - slack_bot.dispatcher - INFO - [d4c8347d] Final analysis received in 4.94s
2026-02-17 09:16:35 - slack_bot.dispatcher - INFO - Formatted text (len 470 -> 454)
2026-02-17 09:16:36 - slack_bot.dispatcher - INFO - [d4c8347d] 📤 Message updated 1771290984.852899
2026-02-17 09:16:36 - slack_bot.dispatcher - INFO - [d4c8347d] Dispatch completed in 11.12s
2026-02-17 09:16:36 - __main__ - INFO - [d4c8347d] ✅ Request completed in 11.84s
2026-02-19 10:06:47 - __main__ - INFO - [96cf81b5] 📥 Received message from U0A8ZCK7RJM in D0AA4GBQRKK: 同步2月19日的睡眠和运动情况，并深入分析一下 (Files: 0)
2026-02-19 10:06:48 - slack_bot.dispatcher - INFO - [96cf81b5] Processing message in D0AA4GBQRKK from U0A8ZCK7RJM
2026-02-19 10:06:48 - slack_bot.dispatcher - INFO - [96cf81b5] Calling Gemini for initial response...
2026-02-19 10:06:48 - slack_bot.dispatcher - INFO - [96cf81b5] Request config: model=google/gemini-3-flash-preview, tools=21, context=39 msgs
2026-02-19 10:06:51 - slack_bot.dispatcher - WARNING - [96cf81b5] Gemini returned empty response_text! (This usually means the proxy has issues)
2026-02-19 10:06:51 - slack_bot.dispatcher - INFO - [96cf81b5] Gemini response: text=0 chars, tool_calls=3
2026-02-19 10:06:51 - slack_bot.dispatcher - INFO - [96cf81b5] Tool calls successfully generated by Gemini (no SAFETY OVERRIDE needed)
2026-02-19 10:06:51 - slack_bot.dispatcher - INFO - [96cf81b5] Gemini response in 3.14s: 0 chars, 3 tools
2026-02-19 10:06:51 - slack_bot.dispatcher - INFO - [96cf81b5] Executing 3 tools
2026-02-19 10:06:51 - slack_bot.dispatcher - INFO - [96cf81b5] Tool: sync_garmin Args: {'target_date': '2026-02-19'}
2026-02-19 10:06:51 - slack_bot.tools.garmin - INFO - Starting Garmin sync for 2026-02-19...
2026-02-19 10:06:51 - health.services.data_sync - INFO - Authenticating with Garmin...
2026-02-19 10:06:51 - health.services.garmin_client - INFO - Authenticating with Garmin Connect China for 350134531@qq.com
2026-02-19 10:06:52 - health.services.garmin_client - INFO - Successfully authenticated with Garmin Connect China
2026-02-19 10:06:52 - health.services.data_sync - INFO - Authentication successful
2026-02-19 10:06:52 - health.services.data_sync - INFO - Syncing 13 metric types from 2026-02-19 to 2026-02-19
2026-02-19 10:06:52 - health.services.data_sync - INFO - Syncing steps from 2026-02-19 to 2026-02-19 (1 days)
2026-02-19 10:06:52 - health.services.data_sync - INFO - ✓ Synced steps for 2026-02-19
2026-02-19 10:06:52 - health.services.data_sync - INFO - steps sync complete: 1 synced, 0 skipped, 0 errors
2026-02-19 10:06:52 - health.services.data_sync - INFO - Syncing heart_rate from 2026-02-19 to 2026-02-19 (1 days)
2026-02-19 10:06:52 - health.services.data_sync - INFO - ✓ Synced heart_rate for 2026-02-19
2026-02-19 10:06:52 - health.services.data_sync - INFO - heart_rate sync complete: 1 synced, 0 skipped, 0 errors
2026-02-19 10:06:52 - health.services.data_sync - INFO - Syncing sleep from 2026-02-19 to 2026-02-19 (1 days)
2026-02-19 10:06:52 - health.services.data_sync - INFO - ✓ Synced sleep for 2026-02-19
2026-02-19 10:06:52 - health.services.data_sync - INFO - sleep sync complete: 1 synced, 0 skipped, 0 errors
2026-02-19 10:06:52 - health.services.data_sync - INFO - Syncing stress from 2026-02-19 to 2026-02-19 (1 days)
2026-02-19 10:06:52 - health.services.data_sync - INFO - ✓ Synced stress for 2026-02-19
2026-02-19 10:06:52 - health.services.data_sync - INFO - stress sync complete: 1 synced, 0 skipped, 0 errors
2026-02-19 10:06:52 - health.services.data_sync - INFO - Syncing body_battery from 2026-02-19 to 2026-02-19 (1 days)
2026-02-19 10:06:52 - health.services.data_sync - INFO - ✓ Synced body_battery for 2026-02-19
2026-02-19 10:06:52 - health.services.data_sync - INFO - body_battery sync complete: 1 synced, 0 skipped, 0 errors
2026-02-19 10:06:52 - health.services.data_sync - INFO - Syncing spo2 from 2026-02-19 to 2026-02-19 (1 days)
2026-02-19 10:06:52 - health.services.data_sync - INFO - ✓ Synced spo2 for 2026-02-19
2026-02-19 10:06:52 - health.services.data_sync - INFO - spo2 sync complete: 1 synced, 0 skipped, 0 errors
2026-02-19 10:06:52 - health.services.data_sync - INFO - Syncing respiration from 2026-02-19 to 2026-02-19 (1 days)
2026-02-19 10:06:53 - health.services.data_sync - INFO - ✓ Synced respiration for 2026-02-19
2026-02-19 10:06:53 - health.services.data_sync - INFO - respiration sync complete: 1 synced, 0 skipped, 0 errors
2026-02-19 10:06:53 - health.services.data_sync - INFO - Syncing hydration from 2026-02-19 to 2026-02-19 (1 days)
2026-02-19 10:06:53 - health.services.data_sync - INFO - ✓ Synced hydration for 2026-02-19
2026-02-19 10:06:53 - health.services.data_sync - INFO - hydration sync complete: 1 synced, 0 skipped, 0 errors
2026-02-19 10:06:53 - health.services.data_sync - INFO - Syncing floors from 2026-02-19 to 2026-02-19 (1 days)
2026-02-19 10:06:53 - health.services.data_sync - INFO - ✓ Synced floors for 2026-02-19
2026-02-19 10:06:53 - health.services.data_sync - INFO - floors sync complete: 1 synced, 0 skipped, 0 errors
2026-02-19 10:06:53 - health.services.data_sync - INFO - Syncing intensity_minutes from 2026-02-19 to 2026-02-19 (1 days)
2026-02-19 10:06:53 - health.services.data_sync - INFO - ✓ Synced intensity_minutes for 2026-02-19
2026-02-19 10:06:53 - health.services.data_sync - INFO - intensity_minutes sync complete: 1 synced, 0 skipped, 0 errors
2026-02-19 10:06:53 - health.services.data_sync - INFO - Syncing hrv from 2026-02-19 to 2026-02-19 (1 days)
2026-02-19 10:06:53 - health.services.data_sync - INFO - ✓ Synced hrv for 2026-02-19
2026-02-19 10:06:53 - health.services.data_sync - INFO - hrv sync complete: 1 synced, 0 skipped, 0 errors
2026-02-19 10:06:53 - health.services.data_sync - INFO - Syncing rhr from 2026-02-19 to 2026-02-19 (1 days)
2026-02-19 10:06:53 - health.services.data_sync - INFO - ✓ Synced rhr for 2026-02-19
2026-02-19 10:06:53 - health.services.data_sync - INFO - rhr sync complete: 1 synced, 0 skipped, 0 errors
2026-02-19 10:06:53 - health.services.data_sync - INFO - Syncing weight from 2026-02-19 to 2026-02-19 (1 days)
2026-02-19 10:06:53 - health.services.data_sync - INFO - weight sync complete: 0 synced, 1 skipped, 0 errors
2026-02-19 10:06:53 - health.services.data_sync - INFO - Syncing activities from 2026-02-19 to 2026-02-19
2026-02-19 10:06:53 - health.services.garmin_client - INFO - Fetched 1 activities
2026-02-19 10:06:53 - health.services.data_sync - INFO - Found 1 activities
2026-02-19 10:06:53 - health.services.data_sync - INFO - ✓ Synced activity 566708796 (elliptical) on 2026-02-19
2026-02-19 10:06:53 - health.services.data_sync - INFO - Activity sync complete: 1 synced, 0 skipped, 0 errors
2026-02-19 10:06:53 - health.services.query - INFO - Querying health data summary for 2026-02-19
2026-02-19 10:06:53 - health.services.query - INFO - Found 12 metrics and 1 activities
2026-02-19 10:06:53 - slack_bot.dispatcher - INFO - [96cf81b5] ✓ sync_garmin finished in 1.99s
2026-02-19 10:06:53 - slack_bot.dispatcher - INFO - [96cf81b5] Tool: get_daily_detailed_stats Args: {'target_date': '2026-02-19'}
2026-02-19 10:06:53 - health.services.query - INFO - Querying health data summary for 2026-02-19
2026-02-19 10:06:53 - health.services.query - INFO - Found 12 metrics and 1 activities
2026-02-19 10:06:53 - slack_bot.dispatcher - INFO - [96cf81b5] ✓ get_daily_detailed_stats finished in 0.01s
2026-02-19 10:06:53 - slack_bot.dispatcher - INFO - [96cf81b5] Tool: get_activity_history Args: {'start_date': '2026-02-19', 'end_date': '2026-02-19'}
2026-02-19 10:06:53 - health.services.query - INFO - Querying activities from 2026-02-19 to 2026-02-19
2026-02-19 10:06:53 - health.services.query - INFO - Found 1 activities
2026-02-19 10:06:53 - slack_bot.dispatcher - INFO - [96cf81b5] ✓ get_activity_history finished in 0.00s
2026-02-19 10:06:53 - slack_bot.dispatcher - INFO - [96cf81b5] Requesting final analysis...
2026-02-19 10:06:58 - slack_bot.dispatcher - INFO - [96cf81b5] Final analysis received in 5.19s
2026-02-19 10:06:58 - slack_bot.dispatcher - INFO - Formatted text (len 754 -> 718)
2026-02-19 10:06:59 - slack_bot.dispatcher - WARNING - [96cf81b5] Update failed, posting new: The request to the Slack API failed. (url: https://slack.com/api/chat.update)
The server responded with: {'ok': False, 'error': 'msg_too_long'}
2026-02-19 10:07:00 - slack_bot.dispatcher - INFO - [96cf81b5] Dispatch completed in 11.72s
2026-02-19 10:07:00 - __main__ - INFO - [96cf81b5] ✅ Request completed in 12.40s
2026-02-19 10:08:58 - __main__ - INFO - [edbda192] 📥 Received message from U0A8ZCK7RJM in D0AA4GBQRKK: 可能是因为有好几天没有运动了，并且前几天回老家摄入的热量比较多，今天椭圆机需要更大的阻力和速度才能达到zone2，这是正常的现象吗 (Files: 0)
2026-02-19 10:08:58 - slack_bot.dispatcher - INFO - [edbda192] Processing message in D0AA4GBQRKK from U0A8ZCK7RJM
2026-02-19 10:08:58 - slack_bot.dispatcher - INFO - [edbda192] Calling Gemini for initial response...
2026-02-19 10:08:58 - slack_bot.dispatcher - INFO - [edbda192] Request config: model=google/gemini-3-flash-preview, tools=21, context=39 msgs
2026-02-19 10:09:07 - slack_bot.dispatcher - INFO - [edbda192] Gemini response: text=1176 chars, tool_calls=0
2026-02-19 10:09:07 - slack_bot.dispatcher - INFO - [edbda192] No tool calls from Gemini - checking SAFETY OVERRIDE keywords...
2026-02-19 10:09:07 - slack_bot.dispatcher - WARNING - [edbda192] 🔧 SAFETY OVERRIDE: Forcing get_activity_history for 2026-02-19
2026-02-19 10:09:07 - slack_bot.dispatcher - INFO - [edbda192] No SAFETY OVERRIDE match found - will return empty response or text
2026-02-19 10:09:07 - slack_bot.dispatcher - INFO - [edbda192] Gemini response in 9.13s: 1176 chars, 1 tools
2026-02-19 10:09:07 - slack_bot.dispatcher - INFO - [edbda192] Executing 1 tools
2026-02-19 10:09:07 - slack_bot.dispatcher - INFO - [edbda192] Tool: get_activity_history Args: {'start_date': '2026-02-19', 'end_date': '2026-02-19'}
2026-02-19 10:09:07 - health.services.query - INFO - Querying activities from 2026-02-19 to 2026-02-19
2026-02-19 10:09:07 - health.services.query - INFO - Found 1 activities
2026-02-19 10:09:07 - slack_bot.dispatcher - INFO - [edbda192] ✓ get_activity_history finished in 0.00s
2026-02-19 10:09:07 - slack_bot.dispatcher - INFO - [edbda192] Requesting final analysis...
2026-02-19 10:09:13 - slack_bot.dispatcher - INFO - [edbda192] Final analysis received in 5.91s
2026-02-19 10:09:13 - slack_bot.dispatcher - INFO - Formatted text (len 823 -> 799)
2026-02-19 10:09:14 - slack_bot.dispatcher - INFO - [edbda192] 📤 Message updated 1771466938.715299
2026-02-19 10:09:14 - slack_bot.dispatcher - INFO - [edbda192] Dispatch completed in 15.79s
2026-02-19 10:09:14 - __main__ - INFO - [edbda192] ✅ Request completed in 16.49s
2026-02-19 10:14:54 - __main__ - INFO - [90a0ea5e] 📥 Received message from U0A8ZCK7RJM in D0AA4GBQRKK: 运动时已经补水600ml，现在继续装了600ml，加了一些盐，因为没时间买咖啡，还放了两个茶包，凉水直接泡。这是健康的做法吗 (Files: 0)
2026-02-19 10:14:55 - slack_bot.dispatcher - INFO - [90a0ea5e] Processing message in D0AA4GBQRKK from U0A8ZCK7RJM
2026-02-19 10:14:55 - slack_bot.dispatcher - INFO - [90a0ea5e] Calling Gemini for initial response...
2026-02-19 10:14:55 - slack_bot.dispatcher - INFO - [90a0ea5e] Request config: model=google/gemini-3-flash-preview, tools=21, context=39 msgs
2026-02-19 10:15:04 - slack_bot.dispatcher - INFO - [90a0ea5e] Gemini response: text=1036 chars, tool_calls=0
2026-02-19 10:15:04 - slack_bot.dispatcher - INFO - [90a0ea5e] No tool calls from Gemini - checking SAFETY OVERRIDE keywords...
2026-02-19 10:15:04 - slack_bot.dispatcher - WARNING - [90a0ea5e] 🔧 SAFETY OVERRIDE: Forcing get_activity_history for 2026-02-19
2026-02-19 10:15:04 - slack_bot.dispatcher - INFO - [90a0ea5e] No SAFETY OVERRIDE match found - will return empty response or text
2026-02-19 10:15:04 - slack_bot.dispatcher - INFO - [90a0ea5e] Gemini response in 8.71s: 1036 chars, 1 tools
2026-02-19 10:15:04 - slack_bot.dispatcher - INFO - [90a0ea5e] Executing 1 tools
2026-02-19 10:15:04 - slack_bot.dispatcher - INFO - [90a0ea5e] Tool: get_activity_history Args: {'start_date': '2026-02-19', 'end_date': '2026-02-19'}
2026-02-19 10:15:04 - health.services.query - INFO - Querying activities from 2026-02-19 to 2026-02-19
2026-02-19 10:15:04 - health.services.query - INFO - Found 1 activities
2026-02-19 10:15:04 - slack_bot.dispatcher - INFO - [90a0ea5e] ✓ get_activity_history finished in 0.00s
2026-02-19 10:15:04 - slack_bot.dispatcher - INFO - [90a0ea5e] Requesting final analysis...
2026-02-19 10:15:09 - slack_bot.dispatcher - INFO - [90a0ea5e] Final analysis received in 5.40s
2026-02-19 10:15:09 - slack_bot.dispatcher - INFO - Formatted text (len 689 -> 669)
2026-02-19 10:15:10 - slack_bot.dispatcher - INFO - [90a0ea5e] 📤 Message updated 1771467295.541999
2026-02-19 10:15:10 - slack_bot.dispatcher - INFO - [90a0ea5e] Dispatch completed in 14.83s
2026-02-19 10:15:10 - __main__ - INFO - [90a0ea5e] ✅ Request completed in 15.56s
2026-02-19 10:18:14 - __main__ - INFO - [94d982c5] 📥 Received message from U0A8ZCK7RJM in D0AA4GBQRKK: 现在是2月19日上午十点十八分，还没有吃饭，今日饮食如何建议 (Files: 0)
2026-02-19 10:18:15 - slack_bot.dispatcher - INFO - [94d982c5] Processing message in D0AA4GBQRKK from U0A8ZCK7RJM
2026-02-19 10:18:15 - slack_bot.dispatcher - INFO - [94d982c5] Calling Gemini for initial response...
2026-02-19 10:18:15 - slack_bot.dispatcher - INFO - [94d982c5] Request config: model=google/gemini-3-flash-preview, tools=21, context=39 msgs
2026-02-19 10:18:23 - slack_bot.dispatcher - INFO - [94d982c5] Gemini response: text=1040 chars, tool_calls=0
2026-02-19 10:18:23 - slack_bot.dispatcher - INFO - [94d982c5] No tool calls from Gemini - checking SAFETY OVERRIDE keywords...
2026-02-19 10:18:23 - slack_bot.dispatcher - WARNING - [94d982c5] 🔧 SAFETY OVERRIDE: Forcing get_daily_detailed_stats for 2026-02-19
2026-02-19 10:18:23 - slack_bot.dispatcher - INFO - [94d982c5] No SAFETY OVERRIDE match found - will return empty response or text
2026-02-19 10:18:23 - slack_bot.dispatcher - INFO - [94d982c5] Gemini response in 8.15s: 1040 chars, 1 tools
2026-02-19 10:18:23 - slack_bot.dispatcher - INFO - [94d982c5] Executing 1 tools
2026-02-19 10:18:23 - slack_bot.dispatcher - INFO - [94d982c5] Tool: get_daily_detailed_stats Args: {'target_date': '2026-02-19'}
2026-02-19 10:18:23 - health.services.query - INFO - Querying health data summary for 2026-02-19
2026-02-19 10:18:23 - health.services.query - INFO - Found 12 metrics and 1 activities
2026-02-19 10:18:23 - slack_bot.dispatcher - INFO - [94d982c5] ✓ get_daily_detailed_stats finished in 0.01s
2026-02-19 10:18:23 - slack_bot.dispatcher - INFO - [94d982c5] Requesting final analysis...
2026-02-19 10:18:28 - slack_bot.dispatcher - INFO - [94d982c5] Final analysis received in 5.06s
2026-02-19 10:18:28 - slack_bot.dispatcher - INFO - Formatted text (len 761 -> 727)
2026-02-19 10:18:30 - slack_bot.dispatcher - INFO - [94d982c5] 📤 Message updated 1771467495.568809
2026-02-19 10:18:30 - slack_bot.dispatcher - INFO - [94d982c5] Dispatch completed in 14.78s
2026-02-19 10:18:30 - __main__ - INFO - [94d982c5] ✅ Request completed in 15.49s
2026-02-19 11:11:30 - __main__ - INFO - [174d80ec] 📥 Received message from U0A8ZCK7RJM in D0AA4GBQRKK: 茶包碎在杯子里了，把碎茶叶喝进肚子，会有什么利弊吗 (Files: 0)
2026-02-19 11:11:31 - slack_bot.dispatcher - INFO - [174d80ec] Processing message in D0AA4GBQRKK from U0A8ZCK7RJM
2026-02-19 11:11:31 - slack_bot.dispatcher - INFO - [174d80ec] Calling Gemini for initial response...
2026-02-19 11:11:31 - slack_bot.dispatcher - INFO - [174d80ec] Request config: model=google/gemini-3-flash-preview, tools=21, context=39 msgs
2026-02-19 11:11:38 - slack_bot.dispatcher - INFO - [174d80ec] Gemini response: text=875 chars, tool_calls=0
2026-02-19 11:11:38 - slack_bot.dispatcher - INFO - [174d80ec] No tool calls from Gemini - checking SAFETY OVERRIDE keywords...
2026-02-19 11:11:38 - slack_bot.dispatcher - INFO - [174d80ec] No SAFETY OVERRIDE match found - will return empty response or text
2026-02-19 11:11:38 - slack_bot.dispatcher - INFO - [174d80ec] Gemini response in 6.97s: 875 chars, 0 tools
2026-02-19 11:11:38 - slack_bot.dispatcher - INFO - Formatted text (len 875 -> 841)
2026-02-19 11:11:42 - slack_bot.dispatcher - INFO - [174d80ec] 📤 Message updated 1771470691.518869
2026-02-19 11:11:42 - slack_bot.dispatcher - INFO - [174d80ec] Dispatch completed in 10.68s
2026-02-19 11:11:42 - __main__ - INFO - [174d80ec] ✅ Request completed in 11.33s
2026-02-20 09:56:34 - __main__ - INFO - [8fd96b9e] 📥 Received message from U0A8ZCK7RJM in D0AA4GBQRKK: 同步2月20日睡眠数据 (Files: 0)
2026-02-20 09:56:35 - slack_bot.dispatcher - INFO - [8fd96b9e] Processing message in D0AA4GBQRKK from U0A8ZCK7RJM
2026-02-20 09:56:35 - slack_bot.dispatcher - INFO - [8fd96b9e] Calling Gemini for initial response...
2026-02-20 09:56:35 - slack_bot.dispatcher - INFO - [8fd96b9e] Request config: model=google/gemini-3-flash-preview, tools=21, context=39 msgs
2026-02-20 09:56:37 - slack_bot.dispatcher - WARNING - [8fd96b9e] Gemini returned empty response_text! (This usually means the proxy has issues)
2026-02-20 09:56:37 - slack_bot.dispatcher - INFO - [8fd96b9e] Gemini response: text=0 chars, tool_calls=2
2026-02-20 09:56:37 - slack_bot.dispatcher - INFO - [8fd96b9e] Tool calls successfully generated by Gemini (no SAFETY OVERRIDE needed)
2026-02-20 09:56:37 - slack_bot.dispatcher - INFO - [8fd96b9e] Gemini response in 2.55s: 0 chars, 2 tools
2026-02-20 09:56:37 - slack_bot.dispatcher - INFO - [8fd96b9e] Executing 2 tools
2026-02-20 09:56:37 - slack_bot.dispatcher - INFO - [8fd96b9e] Tool: sync_garmin Args: {'target_date': '2026-02-20'}
2026-02-20 09:56:37 - slack_bot.tools.garmin - INFO - Starting Garmin sync for 2026-02-20...
2026-02-20 09:56:37 - health.services.data_sync - INFO - Authenticating with Garmin...
2026-02-20 09:56:37 - health.services.garmin_client - INFO - Authenticating with Garmin Connect China for 350134531@qq.com
2026-02-20 09:56:38 - health.services.garmin_client - INFO - Successfully authenticated with Garmin Connect China
2026-02-20 09:56:38 - health.services.data_sync - INFO - Authentication successful
2026-02-20 09:56:38 - health.services.data_sync - INFO - Syncing 13 metric types from 2026-02-20 to 2026-02-20
2026-02-20 09:56:38 - health.services.data_sync - INFO - Syncing steps from 2026-02-20 to 2026-02-20 (1 days)
2026-02-20 09:56:38 - health.services.data_sync - INFO - ✓ Synced steps for 2026-02-20
2026-02-20 09:56:38 - health.services.data_sync - INFO - steps sync complete: 1 synced, 0 skipped, 0 errors
2026-02-20 09:56:38 - health.services.data_sync - INFO - Syncing heart_rate from 2026-02-20 to 2026-02-20 (1 days)
2026-02-20 09:56:38 - health.services.data_sync - INFO - ✓ Synced heart_rate for 2026-02-20
2026-02-20 09:56:38 - health.services.data_sync - INFO - heart_rate sync complete: 1 synced, 0 skipped, 0 errors
2026-02-20 09:56:38 - health.services.data_sync - INFO - Syncing sleep from 2026-02-20 to 2026-02-20 (1 days)
2026-02-20 09:56:38 - health.services.data_sync - INFO - ✓ Synced sleep for 2026-02-20
2026-02-20 09:56:38 - health.services.data_sync - INFO - sleep sync complete: 1 synced, 0 skipped, 0 errors
2026-02-20 09:56:38 - health.services.data_sync - INFO - Syncing stress from 2026-02-20 to 2026-02-20 (1 days)
2026-02-20 09:56:38 - health.services.data_sync - INFO - ✓ Synced stress for 2026-02-20
2026-02-20 09:56:38 - health.services.data_sync - INFO - stress sync complete: 1 synced, 0 skipped, 0 errors
2026-02-20 09:56:38 - health.services.data_sync - INFO - Syncing body_battery from 2026-02-20 to 2026-02-20 (1 days)
2026-02-20 09:56:38 - health.services.data_sync - INFO - ✓ Synced body_battery for 2026-02-20
2026-02-20 09:56:38 - health.services.data_sync - INFO - body_battery sync complete: 1 synced, 0 skipped, 0 errors
2026-02-20 09:56:38 - health.services.data_sync - INFO - Syncing spo2 from 2026-02-20 to 2026-02-20 (1 days)
2026-02-20 09:56:38 - health.services.data_sync - INFO - ✓ Synced spo2 for 2026-02-20
2026-02-20 09:56:38 - health.services.data_sync - INFO - spo2 sync complete: 1 synced, 0 skipped, 0 errors
2026-02-20 09:56:38 - health.services.data_sync - INFO - Syncing respiration from 2026-02-20 to 2026-02-20 (1 days)
2026-02-20 09:56:38 - health.services.data_sync - INFO - ✓ Synced respiration for 2026-02-20
2026-02-20 09:56:38 - health.services.data_sync - INFO - respiration sync complete: 1 synced, 0 skipped, 0 errors
2026-02-20 09:56:38 - health.services.data_sync - INFO - Syncing hydration from 2026-02-20 to 2026-02-20 (1 days)
2026-02-20 09:56:38 - health.services.data_sync - INFO - ✓ Synced hydration for 2026-02-20
2026-02-20 09:56:38 - health.services.data_sync - INFO - hydration sync complete: 1 synced, 0 skipped, 0 errors
2026-02-20 09:56:38 - health.services.data_sync - INFO - Syncing floors from 2026-02-20 to 2026-02-20 (1 days)
2026-02-20 09:56:39 - health.services.data_sync - INFO - ✓ Synced floors for 2026-02-20
2026-02-20 09:56:39 - health.services.data_sync - INFO - floors sync complete: 1 synced, 0 skipped, 0 errors
2026-02-20 09:56:39 - health.services.data_sync - INFO - Syncing intensity_minutes from 2026-02-20 to 2026-02-20 (1 days)
2026-02-20 09:56:39 - health.services.data_sync - INFO - ✓ Synced intensity_minutes for 2026-02-20
2026-02-20 09:56:39 - health.services.data_sync - INFO - intensity_minutes sync complete: 1 synced, 0 skipped, 0 errors
2026-02-20 09:56:39 - health.services.data_sync - INFO - Syncing hrv from 2026-02-20 to 2026-02-20 (1 days)
2026-02-20 09:56:39 - health.services.data_sync - INFO - ✓ Synced hrv for 2026-02-20
2026-02-20 09:56:39 - health.services.data_sync - INFO - hrv sync complete: 1 synced, 0 skipped, 0 errors
2026-02-20 09:56:39 - health.services.data_sync - INFO - Syncing rhr from 2026-02-20 to 2026-02-20 (1 days)
2026-02-20 09:56:39 - health.services.data_sync - INFO - ✓ Synced rhr for 2026-02-20
2026-02-20 09:56:39 - health.services.data_sync - INFO - rhr sync complete: 1 synced, 0 skipped, 0 errors
2026-02-20 09:56:39 - health.services.data_sync - INFO - Syncing weight from 2026-02-20 to 2026-02-20 (1 days)
2026-02-20 09:56:39 - health.services.data_sync - INFO - weight sync complete: 0 synced, 1 skipped, 0 errors
2026-02-20 09:56:39 - health.services.data_sync - INFO - Syncing activities from 2026-02-20 to 2026-02-20
2026-02-20 09:56:39 - health.services.data_sync - INFO - Found 0 activities
2026-02-20 09:56:39 - health.services.data_sync - INFO - Activity sync complete: 0 synced, 0 skipped, 0 errors
2026-02-20 09:56:39 - health.services.query - INFO - Querying health data summary for 2026-02-20
2026-02-20 09:56:39 - health.services.query - INFO - Found 12 metrics and 0 activities
2026-02-20 09:56:39 - slack_bot.dispatcher - INFO - [8fd96b9e] ✓ sync_garmin finished in 1.85s
2026-02-20 09:56:39 - slack_bot.dispatcher - INFO - [8fd96b9e] Tool: get_daily_detailed_stats Args: {'target_date': '2026-02-20'}
2026-02-20 09:56:39 - health.services.query - INFO - Querying health data summary for 2026-02-20
2026-02-20 09:56:39 - health.services.query - INFO - Found 12 metrics and 0 activities
2026-02-20 09:56:39 - slack_bot.dispatcher - INFO - [8fd96b9e] ✓ get_daily_detailed_stats finished in 0.01s
2026-02-20 09:56:39 - slack_bot.dispatcher - INFO - [8fd96b9e] Requesting final analysis...
2026-02-20 09:56:44 - slack_bot.dispatcher - INFO - [8fd96b9e] Final analysis received in 5.34s
2026-02-20 09:56:44 - slack_bot.dispatcher - INFO - Formatted text (len 651 -> 629)
2026-02-20 09:56:45 - slack_bot.dispatcher - INFO - [8fd96b9e] 📤 Message updated 1771552594.964919
2026-02-20 09:56:45 - slack_bot.dispatcher - INFO - [8fd96b9e] Dispatch completed in 10.49s
2026-02-20 09:56:45 - __main__ - INFO - [8fd96b9e] ✅ Request completed in 11.18s
2026-02-20 09:57:51 - __main__ - INFO - [6318301c] 📥 Received message from U0A8ZCK7RJM in D0AA4GBQRKK: rem睡眠变短可能是什么原因，自我感觉是睡前喝水太多，导致尿意明显，还是说因为昨天喝了茶叶 (Files: 0)
2026-02-20 09:57:52 - slack_bot.dispatcher - INFO - [6318301c] Processing message in D0AA4GBQRKK from U0A8ZCK7RJM
2026-02-20 09:57:52 - slack_bot.dispatcher - INFO - [6318301c] Calling Gemini for initial response...
2026-02-20 09:57:52 - slack_bot.dispatcher - INFO - [6318301c] Request config: model=google/gemini-3-flash-preview, tools=21, context=39 msgs
2026-02-20 09:58:00 - slack_bot.dispatcher - INFO - [6318301c] Gemini response: text=1067 chars, tool_calls=0
2026-02-20 09:58:00 - slack_bot.dispatcher - INFO - [6318301c] No tool calls from Gemini - checking SAFETY OVERRIDE keywords...
2026-02-20 09:58:00 - slack_bot.dispatcher - WARNING - [6318301c] 🔧 SAFETY OVERRIDE: Forcing get_daily_detailed_stats for 2026-02-19
2026-02-20 09:58:00 - slack_bot.dispatcher - INFO - [6318301c] No SAFETY OVERRIDE match found - will return empty response or text
2026-02-20 09:58:00 - slack_bot.dispatcher - INFO - [6318301c] Gemini response in 7.92s: 1067 chars, 1 tools
2026-02-20 09:58:00 - slack_bot.dispatcher - INFO - [6318301c] Executing 1 tools
2026-02-20 09:58:00 - slack_bot.dispatcher - INFO - [6318301c] Tool: get_daily_detailed_stats Args: {'target_date': '2026-02-19'}
2026-02-20 09:58:00 - health.services.query - INFO - Querying health data summary for 2026-02-19
2026-02-20 09:58:00 - health.services.query - INFO - Found 12 metrics and 1 activities
2026-02-20 09:58:00 - slack_bot.dispatcher - INFO - [6318301c] ✓ get_daily_detailed_stats finished in 0.01s
2026-02-20 09:58:00 - slack_bot.dispatcher - INFO - [6318301c] Requesting final analysis...
2026-02-20 09:58:05 - slack_bot.dispatcher - INFO - [6318301c] Final analysis received in 5.42s
2026-02-20 09:58:05 - slack_bot.dispatcher - INFO - Formatted text (len 741 -> 725)
2026-02-20 09:58:06 - slack_bot.dispatcher - INFO - [6318301c] 📤 Message updated 1771552672.281199
2026-02-20 09:58:06 - slack_bot.dispatcher - INFO - [6318301c] Dispatch completed in 14.12s
2026-02-20 09:58:06 - __main__ - INFO - [6318301c] ✅ Request completed in 14.76s
2026-02-20 09:59:38 - __main__ - INFO - [e26921aa] 📥 Received message from U0A8ZCK7RJM in D0AA4GBQRKK: 现在马上坐飞机去昆明了，有没有什么饮食建议 (Files: 0)
2026-02-20 09:59:38 - slack_bot.dispatcher - INFO - [e26921aa] Processing message in D0AA4GBQRKK from U0A8ZCK7RJM
2026-02-20 09:59:38 - slack_bot.dispatcher - INFO - [e26921aa] Calling Gemini for initial response...
2026-02-20 09:59:38 - slack_bot.dispatcher - INFO - [e26921aa] Request config: model=google/gemini-3-flash-preview, tools=21, context=39 msgs
2026-02-20 09:59:46 - slack_bot.dispatcher - INFO - [e26921aa] Gemini response: text=1109 chars, tool_calls=0
2026-02-20 09:59:46 - slack_bot.dispatcher - INFO - [e26921aa] No tool calls from Gemini - checking SAFETY OVERRIDE keywords...
2026-02-20 09:59:46 - slack_bot.dispatcher - INFO - [e26921aa] No SAFETY OVERRIDE match found - will return empty response or text
2026-02-20 09:59:46 - slack_bot.dispatcher - INFO - [e26921aa] Gemini response in 8.02s: 1109 chars, 0 tools
2026-02-20 09:59:46 - slack_bot.dispatcher - INFO - Formatted text (len 1109 -> 1055)
2026-02-20 09:59:47 - slack_bot.dispatcher - INFO - [e26921aa] 📤 Message updated 1771552778.725259
2026-02-20 09:59:47 - slack_bot.dispatcher - INFO - [e26921aa] Dispatch completed in 8.73s
2026-02-20 09:59:47 - __main__ - INFO - [e26921aa] ✅ Request completed in 9.39s
Failed to establish a connection (session id: 7fd709cc-8071-43e1-8751-5a378bfea9ed, error: The read operation timed out)
on_error invoked (session id: a2f3e50d-e807-44cd-b588-2472093d3fd6, error: TimeoutError, message: The read operation timed out)
/Users/lili/workspace/bulter/venv/lib/python3.12/site-packages/slack_sdk/socket_mode/builtin/client.py:178: ResourceWarning: unclosed <ssl.SSLSocket fd=22, family=2, type=1, proto=0, laddr=('192.168.255.10', 54041), raddr=('3.108.35.59', 443)>
  current_session.connect()
ResourceWarning: Enable tracemalloc to get the object allocation traceback
Failed to establish a connection (session id: 5ba542c4-846c-498e-9e10-1cd3b3021a6b, error: The read operation timed out)
on_error invoked (session id: 7fd709cc-8071-43e1-8751-5a378bfea9ed, error: TimeoutError, message: The read operation timed out)
/Users/lili/workspace/bulter/venv/lib/python3.12/site-packages/slack_sdk/socket_mode/builtin/client.py:178: ResourceWarning: unclosed <ssl.SSLSocket fd=22, family=2, type=1, proto=0, laddr=('192.168.255.10', 54048), raddr=('3.108.35.59', 443)>
  current_session.connect()
ResourceWarning: Enable tracemalloc to get the object allocation traceback
2026-02-22 08:26:53 - __main__ - INFO - [70558859] 📥 Received message from U0A8ZCK7RJM in D0AA4GBQRKK: 同步2月22日睡眠数据 (Files: 0)
2026-02-22 08:26:53 - slack_bot.dispatcher - INFO - [70558859] Processing message in D0AA4GBQRKK from U0A8ZCK7RJM
2026-02-22 08:26:53 - slack_bot.dispatcher - INFO - [70558859] Calling Gemini for initial response...
2026-02-22 08:26:53 - slack_bot.dispatcher - INFO - [70558859] Request config: model=google/gemini-3-flash-preview, tools=21, context=39 msgs
2026-02-22 08:26:56 - slack_bot.dispatcher - WARNING - [70558859] Gemini returned empty response_text! (This usually means the proxy has issues)
2026-02-22 08:26:56 - slack_bot.dispatcher - INFO - [70558859] Gemini response: text=0 chars, tool_calls=2
2026-02-22 08:26:56 - slack_bot.dispatcher - INFO - [70558859] Tool calls successfully generated by Gemini (no SAFETY OVERRIDE needed)
2026-02-22 08:26:56 - slack_bot.dispatcher - INFO - [70558859] Gemini response in 2.73s: 0 chars, 2 tools
2026-02-22 08:26:56 - slack_bot.dispatcher - INFO - [70558859] Executing 2 tools
2026-02-22 08:26:56 - slack_bot.dispatcher - INFO - [70558859] Tool: sync_garmin Args: {'target_date': '2026-02-22'}
2026-02-22 08:26:56 - slack_bot.tools.garmin - INFO - Starting Garmin sync for 2026-02-22...
2026-02-22 08:26:56 - health.services.data_sync - INFO - Authenticating with Garmin...
2026-02-22 08:26:56 - health.services.garmin_client - INFO - Authenticating with Garmin Connect China for 350134531@qq.com
2026-02-22 08:26:57 - health.services.garmin_client - INFO - Successfully authenticated with Garmin Connect China
2026-02-22 08:26:57 - health.services.data_sync - INFO - Authentication successful
2026-02-22 08:26:57 - health.services.data_sync - INFO - Syncing 13 metric types from 2026-02-22 to 2026-02-22
2026-02-22 08:26:57 - health.services.data_sync - INFO - Syncing steps from 2026-02-22 to 2026-02-22 (1 days)
2026-02-22 08:26:57 - health.services.data_sync - INFO - ✓ Synced steps for 2026-02-22
2026-02-22 08:26:57 - health.services.data_sync - INFO - steps sync complete: 1 synced, 0 skipped, 0 errors
2026-02-22 08:26:57 - health.services.data_sync - INFO - Syncing heart_rate from 2026-02-22 to 2026-02-22 (1 days)
2026-02-22 08:26:57 - health.services.data_sync - INFO - ✓ Synced heart_rate for 2026-02-22
2026-02-22 08:26:57 - health.services.data_sync - INFO - heart_rate sync complete: 1 synced, 0 skipped, 0 errors
2026-02-22 08:26:57 - health.services.data_sync - INFO - Syncing sleep from 2026-02-22 to 2026-02-22 (1 days)
2026-02-22 08:26:57 - health.services.data_sync - INFO - ✓ Synced sleep for 2026-02-22
2026-02-22 08:26:57 - health.services.data_sync - INFO - sleep sync complete: 1 synced, 0 skipped, 0 errors
2026-02-22 08:26:57 - health.services.data_sync - INFO - Syncing stress from 2026-02-22 to 2026-02-22 (1 days)
2026-02-22 08:26:57 - health.services.data_sync - INFO - ✓ Synced stress for 2026-02-22
2026-02-22 08:26:57 - health.services.data_sync - INFO - stress sync complete: 1 synced, 0 skipped, 0 errors
2026-02-22 08:26:57 - health.services.data_sync - INFO - Syncing body_battery from 2026-02-22 to 2026-02-22 (1 days)
2026-02-22 08:26:57 - health.services.data_sync - INFO - ✓ Synced body_battery for 2026-02-22
2026-02-22 08:26:57 - health.services.data_sync - INFO - body_battery sync complete: 1 synced, 0 skipped, 0 errors
2026-02-22 08:26:57 - health.services.data_sync - INFO - Syncing spo2 from 2026-02-22 to 2026-02-22 (1 days)
2026-02-22 08:26:57 - health.services.data_sync - INFO - ✓ Synced spo2 for 2026-02-22
2026-02-22 08:26:57 - health.services.data_sync - INFO - spo2 sync complete: 1 synced, 0 skipped, 0 errors
2026-02-22 08:26:57 - health.services.data_sync - INFO - Syncing respiration from 2026-02-22 to 2026-02-22 (1 days)
2026-02-22 08:26:57 - health.services.data_sync - INFO - ✓ Synced respiration for 2026-02-22
2026-02-22 08:26:57 - health.services.data_sync - INFO - respiration sync complete: 1 synced, 0 skipped, 0 errors
2026-02-22 08:26:57 - health.services.data_sync - INFO - Syncing hydration from 2026-02-22 to 2026-02-22 (1 days)
2026-02-22 08:26:58 - health.services.data_sync - INFO - ✓ Synced hydration for 2026-02-22
2026-02-22 08:26:58 - health.services.data_sync - INFO - hydration sync complete: 1 synced, 0 skipped, 0 errors
2026-02-22 08:26:58 - health.services.data_sync - INFO - Syncing floors from 2026-02-22 to 2026-02-22 (1 days)
2026-02-22 08:26:58 - health.services.data_sync - INFO - ✓ Synced floors for 2026-02-22
2026-02-22 08:26:58 - health.services.data_sync - INFO - floors sync complete: 1 synced, 0 skipped, 0 errors
2026-02-22 08:26:58 - health.services.data_sync - INFO - Syncing intensity_minutes from 2026-02-22 to 2026-02-22 (1 days)
2026-02-22 08:26:58 - health.services.data_sync - INFO - ✓ Synced intensity_minutes for 2026-02-22
2026-02-22 08:26:58 - health.services.data_sync - INFO - intensity_minutes sync complete: 1 synced, 0 skipped, 0 errors
2026-02-22 08:26:58 - health.services.data_sync - INFO - Syncing hrv from 2026-02-22 to 2026-02-22 (1 days)
2026-02-22 08:26:58 - health.services.data_sync - INFO - ✓ Synced hrv for 2026-02-22
2026-02-22 08:26:58 - health.services.data_sync - INFO - hrv sync complete: 1 synced, 0 skipped, 0 errors
2026-02-22 08:26:58 - health.services.data_sync - INFO - Syncing rhr from 2026-02-22 to 2026-02-22 (1 days)
2026-02-22 08:26:58 - health.services.data_sync - INFO - ✓ Synced rhr for 2026-02-22
2026-02-22 08:26:58 - health.services.data_sync - INFO - rhr sync complete: 1 synced, 0 skipped, 0 errors
2026-02-22 08:26:58 - health.services.data_sync - INFO - Syncing weight from 2026-02-22 to 2026-02-22 (1 days)
2026-02-22 08:26:58 - health.services.data_sync - INFO - weight sync complete: 0 synced, 1 skipped, 0 errors
2026-02-22 08:26:58 - health.services.data_sync - INFO - Syncing activities from 2026-02-22 to 2026-02-22
2026-02-22 08:26:58 - health.services.data_sync - INFO - Found 0 activities
2026-02-22 08:26:58 - health.services.data_sync - INFO - Activity sync complete: 0 synced, 0 skipped, 0 errors
2026-02-22 08:26:58 - health.services.query - INFO - Querying health data summary for 2026-02-22
2026-02-22 08:26:58 - health.services.query - INFO - Found 12 metrics and 0 activities
2026-02-22 08:26:58 - slack_bot.dispatcher - INFO - [70558859] ✓ sync_garmin finished in 1.91s
2026-02-22 08:26:58 - slack_bot.dispatcher - INFO - [70558859] Tool: get_daily_detailed_stats Args: {'target_date': '2026-02-22'}
2026-02-22 08:26:58 - health.services.query - INFO - Querying health data summary for 2026-02-22
2026-02-22 08:26:58 - health.services.query - INFO - Found 12 metrics and 0 activities
2026-02-22 08:26:58 - slack_bot.dispatcher - INFO - [70558859] ✓ get_daily_detailed_stats finished in 0.01s
2026-02-22 08:26:58 - slack_bot.dispatcher - INFO - [70558859] Requesting final analysis...
2026-02-22 08:27:04 - slack_bot.dispatcher - INFO - [70558859] Final analysis received in 5.98s
2026-02-22 08:27:04 - slack_bot.dispatcher - INFO - Formatted text (len 717 -> 687)
2026-02-22 08:27:05 - slack_bot.dispatcher - WARNING - [70558859] Update failed, posting new: The request to the Slack API failed. (url: https://slack.com/api/chat.update)
The server responded with: {'ok': False, 'error': 'msg_too_long'}
2026-02-22 08:27:05 - slack_bot.dispatcher - INFO - [70558859] Dispatch completed in 12.00s
2026-02-22 08:27:05 - __main__ - INFO - [70558859] ✅ Request completed in 12.78s
2026-02-22 08:29:57 - __main__ - INFO - [febcb9c5] 📥 Received message from U0A8ZCK7RJM in D0AA4GBQRKK: 昨晚经历了一个我经常遇到但一直无法理解的过程。也许是因为昨晚去健身房锻炼喝水多了，导致晚上起夜次数过多。喝水导致尿意很正常，但昨晚起来太多次了，甚至我认为排出的尿液远大于喝的水。这种情况以前也经常有，让我备受困扰，同时也无法理解。当然还有一个疑惑就是，往往这种情况下hrv都还可以 (Files: 0)
2026-02-22 08:29:58 - slack_bot.dispatcher - INFO - [febcb9c5] Processing message in D0AA4GBQRKK from U0A8ZCK7RJM
2026-02-22 08:29:58 - slack_bot.dispatcher - INFO - [febcb9c5] Calling Gemini for initial response...
2026-02-22 08:29:58 - slack_bot.dispatcher - INFO - [febcb9c5] Request config: model=google/gemini-3-flash-preview, tools=21, context=39 msgs
2026-02-22 08:30:21 - slack_bot.dispatcher - INFO - [febcb9c5] Gemini response: text=1468 chars, tool_calls=0
2026-02-22 08:30:21 - slack_bot.dispatcher - INFO - [febcb9c5] No tool calls from Gemini - checking SAFETY OVERRIDE keywords...
2026-02-22 08:30:21 - slack_bot.dispatcher - WARNING - [febcb9c5] 🔧 SAFETY OVERRIDE: Forcing get_activity_history for 2026-02-21
2026-02-22 08:30:21 - slack_bot.dispatcher - INFO - [febcb9c5] No SAFETY OVERRIDE match found - will return empty response or text
2026-02-22 08:30:21 - slack_bot.dispatcher - INFO - [febcb9c5] Gemini response in 22.66s: 1468 chars, 1 tools
2026-02-22 08:30:21 - slack_bot.dispatcher - INFO - [febcb9c5] Executing 1 tools
2026-02-22 08:30:21 - slack_bot.dispatcher - INFO - [febcb9c5] Tool: get_activity_history Args: {'start_date': '2026-02-21', 'end_date': '2026-02-21'}
2026-02-22 08:30:21 - health.services.query - INFO - Querying activities from 2026-02-21 to 2026-02-21
2026-02-22 08:30:21 - health.services.query - INFO - Found 0 activities
2026-02-22 08:30:21 - slack_bot.dispatcher - INFO - [febcb9c5] ✓ get_activity_history finished in 0.00s
2026-02-22 08:30:21 - slack_bot.dispatcher - INFO - [febcb9c5] Requesting final analysis...
2026-02-22 08:30:42 - slack_bot.dispatcher - INFO - [febcb9c5] Final analysis received in 21.65s
2026-02-22 08:30:42 - slack_bot.dispatcher - INFO - Formatted text (len 1009 -> 965)
2026-02-22 08:30:43 - slack_bot.dispatcher - INFO - [febcb9c5] 📤 Message updated 1771720198.528389
2026-02-22 08:30:43 - slack_bot.dispatcher - INFO - [febcb9c5] Dispatch completed in 45.02s
2026-02-22 08:30:43 - __main__ - INFO - [febcb9c5] ✅ Request completed in 45.68s
2026-02-22 08:33:55 - __main__ - INFO - [33467886] 📥 Received message from U0A8ZCK7RJM in D0AA4GBQRKK: 这种情况经常有，所以先排除掉高原的原因，为什么会有时候晚上起夜次数非常多，一般与喝酒和锻炼似乎有关。或者不说晚上，就算是白天，有时候似乎会进入一种状态，总是想排尿，虽然确实也摄入了更多水，但是排的更多，而且好像更像是进入了一种不同的状态，就是总是会有充盈的尿液需要排出 (Files: 0)
2026-02-22 08:33:56 - slack_bot.dispatcher - INFO - [33467886] Processing message in D0AA4GBQRKK from U0A8ZCK7RJM
2026-02-22 08:33:56 - slack_bot.dispatcher - INFO - [33467886] Calling Gemini for initial response...
2026-02-22 08:33:56 - slack_bot.dispatcher - INFO - [33467886] Request config: model=google/gemini-3-flash-preview, tools=21, context=39 msgs
2026-02-22 08:34:06 - slack_bot.dispatcher - INFO - [33467886] Gemini response: text=1517 chars, tool_calls=0
2026-02-22 08:34:06 - slack_bot.dispatcher - INFO - [33467886] No tool calls from Gemini - checking SAFETY OVERRIDE keywords...
2026-02-22 08:34:06 - slack_bot.dispatcher - WARNING - [33467886] 🔧 SAFETY OVERRIDE: Forcing get_activity_history for 2026-02-22
2026-02-22 08:34:06 - slack_bot.dispatcher - INFO - [33467886] No SAFETY OVERRIDE match found - will return empty response or text
2026-02-22 08:34:06 - slack_bot.dispatcher - INFO - [33467886] Gemini response in 10.81s: 1517 chars, 1 tools
2026-02-22 08:34:06 - slack_bot.dispatcher - INFO - [33467886] Executing 1 tools
2026-02-22 08:34:06 - slack_bot.dispatcher - INFO - [33467886] Tool: get_activity_history Args: {'start_date': '2026-02-22', 'end_date': '2026-02-22'}
2026-02-22 08:34:06 - health.services.query - INFO - Querying activities from 2026-02-22 to 2026-02-22
2026-02-22 08:34:06 - health.services.query - INFO - Found 0 activities
2026-02-22 08:34:06 - slack_bot.dispatcher - INFO - [33467886] ✓ get_activity_history finished in 0.00s
2026-02-22 08:34:06 - slack_bot.dispatcher - INFO - [33467886] Requesting final analysis...
2026-02-22 08:34:15 - slack_bot.dispatcher - INFO - [33467886] Final analysis received in 8.89s
2026-02-22 08:34:15 - slack_bot.dispatcher - INFO - Formatted text (len 1024 -> 1004)
2026-02-22 08:34:16 - slack_bot.dispatcher - INFO - [33467886] 📤 Message updated 1771720435.915319
2026-02-22 08:34:16 - slack_bot.dispatcher - INFO - [33467886] Dispatch completed in 20.57s
2026-02-22 08:34:16 - __main__ - INFO - [33467886] ✅ Request completed in 21.26s
2026-02-22 08:37:27 - __main__ - INFO - [5c7a6213] 📥 Received message from U0A8ZCK7RJM in D0AA4GBQRKK: 除了影响睡眠和常跑厕所的尴尬，这对身体有没有负面影响，需要如何调理 (Files: 0)
2026-02-22 08:37:28 - slack_bot.dispatcher - INFO - [5c7a6213] Processing message in D0AA4GBQRKK from U0A8ZCK7RJM
2026-02-22 08:37:28 - slack_bot.dispatcher - INFO - [5c7a6213] Calling Gemini for initial response...
2026-02-22 08:37:28 - slack_bot.dispatcher - INFO - [5c7a6213] Request config: model=google/gemini-3-flash-preview, tools=21, context=39 msgs
2026-02-22 08:37:38 - slack_bot.dispatcher - INFO - [5c7a6213] Gemini response: text=1503 chars, tool_calls=0
2026-02-22 08:37:38 - slack_bot.dispatcher - INFO - [5c7a6213] No tool calls from Gemini - checking SAFETY OVERRIDE keywords...
2026-02-22 08:37:38 - slack_bot.dispatcher - WARNING - [5c7a6213] 🔧 SAFETY OVERRIDE: Forcing get_daily_detailed_stats for 2026-02-22
2026-02-22 08:37:38 - slack_bot.dispatcher - INFO - [5c7a6213] No SAFETY OVERRIDE match found - will return empty response or text
2026-02-22 08:37:38 - slack_bot.dispatcher - INFO - [5c7a6213] Gemini response in 10.33s: 1503 chars, 1 tools
2026-02-22 08:37:38 - slack_bot.dispatcher - INFO - [5c7a6213] Executing 1 tools
2026-02-22 08:37:38 - slack_bot.dispatcher - INFO - [5c7a6213] Tool: get_daily_detailed_stats Args: {'target_date': '2026-02-22'}
2026-02-22 08:37:38 - health.services.query - INFO - Querying health data summary for 2026-02-22
2026-02-22 08:37:38 - health.services.query - INFO - Found 12 metrics and 0 activities
2026-02-22 08:37:38 - slack_bot.dispatcher - INFO - [5c7a6213] ✓ get_daily_detailed_stats finished in 0.02s
2026-02-22 08:37:38 - slack_bot.dispatcher - INFO - [5c7a6213] Requesting final analysis...
2026-02-22 08:37:46 - slack_bot.dispatcher - INFO - [5c7a6213] Final analysis received in 7.84s
2026-02-22 08:37:46 - slack_bot.dispatcher - INFO - Formatted text (len 1039 -> 999)
2026-02-22 08:37:47 - slack_bot.dispatcher - INFO - [5c7a6213] 📤 Message updated 1771720647.999199
2026-02-22 08:37:47 - slack_bot.dispatcher - INFO - [5c7a6213] Dispatch completed in 18.99s
2026-02-22 08:37:47 - __main__ - INFO - [5c7a6213] ✅ Request completed in 19.64s
2026-02-22 08:40:56 - __main__ - INFO - [1ba9b6bb] 📥 Received message from U0A8ZCK7RJM in D0AA4GBQRKK: 我是2月20日12:30分落地昆明，请看看我在昆明的心率有何不一样，是否体现了高原的什么影响 (Files: 0)
2026-02-22 08:40:57 - slack_bot.dispatcher - INFO - [1ba9b6bb] Processing message in D0AA4GBQRKK from U0A8ZCK7RJM
2026-02-22 08:40:57 - slack_bot.dispatcher - INFO - [1ba9b6bb] Calling Gemini for initial response...
2026-02-22 08:40:57 - slack_bot.dispatcher - INFO - [1ba9b6bb] Request config: model=google/gemini-3-flash-preview, tools=21, context=39 msgs
2026-02-22 08:41:01 - slack_bot.dispatcher - WARNING - [1ba9b6bb] Gemini returned empty response_text! (This usually means the proxy has issues)
2026-02-22 08:41:01 - slack_bot.dispatcher - INFO - [1ba9b6bb] Gemini response: text=0 chars, tool_calls=3
2026-02-22 08:41:01 - slack_bot.dispatcher - INFO - [1ba9b6bb] Tool calls successfully generated by Gemini (no SAFETY OVERRIDE needed)
2026-02-22 08:41:01 - slack_bot.dispatcher - INFO - [1ba9b6bb] Gemini response in 3.76s: 0 chars, 3 tools
2026-02-22 08:41:01 - slack_bot.dispatcher - INFO - [1ba9b6bb] Executing 3 tools
2026-02-22 08:41:01 - slack_bot.dispatcher - INFO - [1ba9b6bb] Tool: get_metric_history Args: {'end_date': '2026-02-23', 'start_date': '2026-02-17', 'metric_type': 'rhr'}
2026-02-22 08:41:01 - health.services.query - INFO - Querying rhr from 2026-02-17 to 2026-02-23
2026-02-22 08:41:01 - health.services.query - INFO - Found 4 records for rhr
2026-02-22 08:41:01 - slack_bot.dispatcher - INFO - [1ba9b6bb] ✓ get_metric_history finished in 0.01s
2026-02-22 08:41:01 - slack_bot.dispatcher - INFO - [1ba9b6bb] Tool: get_metric_history Args: {'start_date': '2026-02-17', 'metric_type': 'hrv', 'end_date': '2026-02-23'}
2026-02-22 08:41:01 - health.services.query - INFO - Querying hrv from 2026-02-17 to 2026-02-23
2026-02-22 08:41:01 - health.services.query - INFO - Found 4 records for hrv
2026-02-22 08:41:01 - slack_bot.dispatcher - INFO - [1ba9b6bb] ✓ get_metric_history finished in 0.01s
2026-02-22 08:41:01 - slack_bot.dispatcher - INFO - [1ba9b6bb] Tool: get_metric_history Args: {'metric_type': 'heart_rate', 'start_date': '2026-02-17', 'end_date': '2026-02-23'}
2026-02-22 08:41:01 - health.services.query - INFO - Querying heart_rate from 2026-02-17 to 2026-02-23
2026-02-22 08:41:01 - health.services.query - INFO - Found 4 records for heart_rate
2026-02-22 08:41:01 - slack_bot.dispatcher - INFO - [1ba9b6bb] ✓ get_metric_history finished in 0.01s
2026-02-22 08:41:01 - slack_bot.dispatcher - INFO - [1ba9b6bb] Requesting final analysis...
2026-02-22 08:41:07 - slack_bot.dispatcher - INFO - [1ba9b6bb] Final analysis received in 5.98s
2026-02-22 08:41:07 - slack_bot.dispatcher - INFO - Formatted text (len 764 -> 736)
2026-02-22 08:41:07 - slack_bot.dispatcher - WARNING - Final response truncated from 12000 to 12000 chars
2026-02-22 08:41:07 - slack_bot.dispatcher - INFO - [1ba9b6bb] 📤 Message updated 1771720857.285869
2026-02-22 08:41:09 - slack_bot.dispatcher - INFO - [1ba9b6bb] 📤 Continuation message posted
2026-02-22 08:41:10 - slack_bot.dispatcher - INFO - [1ba9b6bb] 📤 Continuation message posted
2026-02-22 08:41:10 - slack_bot.dispatcher - INFO - [1ba9b6bb] Dispatch completed in 12.95s
2026-02-22 08:41:10 - __main__ - INFO - [1ba9b6bb] ✅ Request completed in 13.64s
2026-02-22 08:41:56 - __main__ - INFO - [309b33b0] 📥 Received message from U0A8ZCK7RJM in D0AA4GBQRKK: 内容太多被截断，刚才的结论是什么，不用调用工具。直接给我结果 (Files: 0)
2026-02-22 08:41:56 - slack_bot.dispatcher - INFO - [309b33b0] Processing message in D0AA4GBQRKK from U0A8ZCK7RJM
2026-02-22 08:41:56 - slack_bot.dispatcher - INFO - [309b33b0] Calling Gemini for initial response...
2026-02-22 08:41:56 - slack_bot.dispatcher - INFO - [309b33b0] Request config: model=google/gemini-3-flash-preview, tools=21, context=39 msgs
2026-02-22 08:42:01 - slack_bot.dispatcher - INFO - [309b33b0] Gemini response: text=419 chars, tool_calls=0
2026-02-22 08:42:01 - slack_bot.dispatcher - INFO - [309b33b0] No tool calls from Gemini - checking SAFETY OVERRIDE keywords...
2026-02-22 08:42:01 - slack_bot.dispatcher - INFO - [309b33b0] No SAFETY OVERRIDE match found - will return empty response or text
2026-02-22 08:42:01 - slack_bot.dispatcher - INFO - [309b33b0] Gemini response in 4.73s: 419 chars, 0 tools
2026-02-22 08:42:01 - slack_bot.dispatcher - INFO - Formatted text (len 419 -> 399)
2026-02-22 08:42:02 - slack_bot.dispatcher - INFO - [309b33b0] 📤 Message updated 1771720916.611759
2026-02-22 08:42:02 - slack_bot.dispatcher - INFO - [309b33b0] Dispatch completed in 5.41s
2026-02-22 08:42:02 - __main__ - INFO - [309b33b0] ✅ Request completed in 6.07s
2026-02-26 09:57:03 - health.utils.env_loader - INFO - Loading extra configuration from: /Users/lili/workspace/bulter/.gemini.current.env
2026-02-26 09:57:03 - __main__ - INFO - Starting Butler Bot with configuration:
2026-02-26 09:57:03 - __main__ - INFO -   Config file: .gemini.current.env
2026-02-26 09:57:03 - __main__ - INFO -   Model: google/gemini-3-flash-preview
2026-02-26 09:57:03 - __main__ - INFO -   Base URL: https://openrouter.ai/api
2026-02-26 09:57:03 - __main__ - INFO -   Using proxy: Yes
2026-02-26 09:57:04 - slack_bot.llm.gemini - INFO - Using OpenRouter: https://openrouter.ai/api
2026-02-26 09:57:04 - slack_bot.llm.gemini - INFO - Initialized Gemini model: google/gemini-3-flash-preview
2026-02-26 09:57:04 - slack_bot.dispatcher - INFO - Using tool preset: all (21 tools)
2026-02-26 09:57:04 - slack_bot.dispatcher - INFO - Dispatcher initialized with Gemini
2026-02-26 09:57:04 - __main__ - INFO - Dispatcher initialized in 'all' mode
2026-02-26 09:57:04 - __main__ - INFO - ⚡️ Butler (Gemini) is connected to Slack!
⚡️ Bolt app is running!
2026-02-26 09:57:18 - __main__ - INFO - [a08b3564] 📥 Received message from U0A8ZCK7RJM in D0AA4GBQRKK: 同步最近几天的佳明数据 (Files: 0)
2026-02-26 09:57:19 - slack_bot.dispatcher - INFO - [a08b3564] Processing message in D0AA4GBQRKK from U0A8ZCK7RJM
2026-02-26 09:57:19 - slack_bot.dispatcher - INFO - [a08b3564] Calling Gemini for initial response...
2026-02-26 09:57:19 - slack_bot.dispatcher - INFO - [a08b3564] Request config: model=google/gemini-3-flash-preview, tools=21, context=39 msgs
2026-02-26 09:57:22 - slack_bot.dispatcher - WARNING - [a08b3564] Gemini returned empty response_text! (This usually means the proxy has issues)
2026-02-26 09:57:22 - slack_bot.dispatcher - INFO - [a08b3564] Gemini response: text=0 chars, tool_calls=4
2026-02-26 09:57:22 - slack_bot.dispatcher - INFO - [a08b3564] Tool calls successfully generated by Gemini (no SAFETY OVERRIDE needed)
2026-02-26 09:57:22 - slack_bot.dispatcher - INFO - [a08b3564] Gemini response in 3.62s: 0 chars, 4 tools
2026-02-26 09:57:22 - slack_bot.dispatcher - INFO - [a08b3564] Executing 4 tools
2026-02-26 09:57:22 - slack_bot.dispatcher - INFO - [a08b3564] Tool: sync_garmin Args: {'target_date': '2026-02-23'}
2026-02-26 09:57:22 - slack_bot.tools.garmin - INFO - Starting Garmin sync for 2026-02-23...
2026-02-26 09:57:22 - health.services.data_sync - INFO - Authenticating with Garmin...
2026-02-26 09:57:22 - health.services.garmin_client - INFO - Authenticating with Garmin Connect China for 350134531@qq.com
2026-02-26 09:57:24 - health.services.garmin_client - INFO - Successfully authenticated with Garmin Connect China
2026-02-26 09:57:24 - health.services.data_sync - INFO - Authentication successful
2026-02-26 09:57:24 - health.services.data_sync - INFO - Syncing 13 metric types from 2026-02-23 to 2026-02-23
2026-02-26 09:57:24 - health.services.data_sync - INFO - Syncing steps from 2026-02-23 to 2026-02-23 (1 days)
2026-02-26 09:57:24 - health.services.data_sync - INFO - ✓ Synced steps for 2026-02-23
2026-02-26 09:57:24 - health.services.data_sync - INFO - steps sync complete: 1 synced, 0 skipped, 0 errors
2026-02-26 09:57:24 - health.services.data_sync - INFO - Syncing heart_rate from 2026-02-23 to 2026-02-23 (1 days)
2026-02-26 09:57:24 - health.services.data_sync - INFO - ✓ Synced heart_rate for 2026-02-23
2026-02-26 09:57:24 - health.services.data_sync - INFO - heart_rate sync complete: 1 synced, 0 skipped, 0 errors
2026-02-26 09:57:24 - health.services.data_sync - INFO - Syncing sleep from 2026-02-23 to 2026-02-23 (1 days)
2026-02-26 09:57:24 - health.services.data_sync - INFO - ✓ Synced sleep for 2026-02-23
2026-02-26 09:57:24 - health.services.data_sync - INFO - sleep sync complete: 1 synced, 0 skipped, 0 errors
2026-02-26 09:57:24 - health.services.data_sync - INFO - Syncing stress from 2026-02-23 to 2026-02-23 (1 days)
2026-02-26 09:57:25 - health.services.data_sync - INFO - ✓ Synced stress for 2026-02-23
2026-02-26 09:57:25 - health.services.data_sync - INFO - stress sync complete: 1 synced, 0 skipped, 0 errors
2026-02-26 09:57:25 - health.services.data_sync - INFO - Syncing body_battery from 2026-02-23 to 2026-02-23 (1 days)
2026-02-26 09:57:25 - health.services.data_sync - INFO - ✓ Synced body_battery for 2026-02-23
2026-02-26 09:57:25 - health.services.data_sync - INFO - body_battery sync complete: 1 synced, 0 skipped, 0 errors
2026-02-26 09:57:25 - health.services.data_sync - INFO - Syncing spo2 from 2026-02-23 to 2026-02-23 (1 days)
2026-02-26 09:57:25 - health.services.data_sync - INFO - ✓ Synced spo2 for 2026-02-23
2026-02-26 09:57:25 - health.services.data_sync - INFO - spo2 sync complete: 1 synced, 0 skipped, 0 errors
2026-02-26 09:57:25 - health.services.data_sync - INFO - Syncing respiration from 2026-02-23 to 2026-02-23 (1 days)
2026-02-26 09:57:25 - health.services.data_sync - INFO - ✓ Synced respiration for 2026-02-23
2026-02-26 09:57:25 - health.services.data_sync - INFO - respiration sync complete: 1 synced, 0 skipped, 0 errors
2026-02-26 09:57:25 - health.services.data_sync - INFO - Syncing hydration from 2026-02-23 to 2026-02-23 (1 days)
2026-02-26 09:57:25 - health.services.data_sync - INFO - ✓ Synced hydration for 2026-02-23
2026-02-26 09:57:25 - health.services.data_sync - INFO - hydration sync complete: 1 synced, 0 skipped, 0 errors
2026-02-26 09:57:25 - health.services.data_sync - INFO - Syncing floors from 2026-02-23 to 2026-02-23 (1 days)
2026-02-26 09:57:25 - health.services.data_sync - INFO - ✓ Synced floors for 2026-02-23
2026-02-26 09:57:25 - health.services.data_sync - INFO - floors sync complete: 1 synced, 0 skipped, 0 errors
2026-02-26 09:57:25 - health.services.data_sync - INFO - Syncing intensity_minutes from 2026-02-23 to 2026-02-23 (1 days)
2026-02-26 09:57:25 - health.services.data_sync - INFO - ✓ Synced intensity_minutes for 2026-02-23
2026-02-26 09:57:25 - health.services.data_sync - INFO - intensity_minutes sync complete: 1 synced, 0 skipped, 0 errors
2026-02-26 09:57:25 - health.services.data_sync - INFO - Syncing hrv from 2026-02-23 to 2026-02-23 (1 days)
2026-02-26 09:57:25 - health.services.data_sync - INFO - ✓ Synced hrv for 2026-02-23
2026-02-26 09:57:25 - health.services.data_sync - INFO - hrv sync complete: 1 synced, 0 skipped, 0 errors
2026-02-26 09:57:25 - health.services.data_sync - INFO - Syncing rhr from 2026-02-23 to 2026-02-23 (1 days)
2026-02-26 09:57:25 - health.services.data_sync - INFO - ✓ Synced rhr for 2026-02-23
2026-02-26 09:57:25 - health.services.data_sync - INFO - rhr sync complete: 1 synced, 0 skipped, 0 errors
2026-02-26 09:57:25 - health.services.data_sync - INFO - Syncing weight from 2026-02-23 to 2026-02-23 (1 days)
2026-02-26 09:57:26 - health.services.data_sync - INFO - weight sync complete: 0 synced, 1 skipped, 0 errors
2026-02-26 09:57:26 - health.services.data_sync - INFO - Syncing activities from 2026-02-23 to 2026-02-23
2026-02-26 09:57:26 - health.services.data_sync - INFO - Found 0 activities
2026-02-26 09:57:26 - health.services.data_sync - INFO - Activity sync complete: 0 synced, 0 skipped, 0 errors
2026-02-26 09:57:26 - health.services.query - INFO - Querying health data summary for 2026-02-23
2026-02-26 09:57:26 - health.services.query - INFO - Found 12 metrics and 0 activities
2026-02-26 09:57:26 - slack_bot.dispatcher - INFO - [a08b3564] ✓ sync_garmin finished in 3.15s
2026-02-26 09:57:26 - slack_bot.dispatcher - INFO - [a08b3564] Tool: sync_garmin Args: {'target_date': '2026-02-24'}
2026-02-26 09:57:26 - slack_bot.tools.garmin - INFO - Starting Garmin sync for 2026-02-24...
2026-02-26 09:57:26 - health.services.data_sync - INFO - Authenticating with Garmin...
2026-02-26 09:57:26 - health.services.garmin_client - INFO - Authenticating with Garmin Connect China for 350134531@qq.com
2026-02-26 09:57:26 - health.services.garmin_client - INFO - Successfully authenticated with Garmin Connect China
2026-02-26 09:57:26 - health.services.data_sync - INFO - Authentication successful
2026-02-26 09:57:26 - health.services.data_sync - INFO - Syncing 13 metric types from 2026-02-24 to 2026-02-24
2026-02-26 09:57:26 - health.services.data_sync - INFO - Syncing steps from 2026-02-24 to 2026-02-24 (1 days)
2026-02-26 09:57:26 - health.services.data_sync - INFO - ✓ Synced steps for 2026-02-24
2026-02-26 09:57:26 - health.services.data_sync - INFO - steps sync complete: 1 synced, 0 skipped, 0 errors
2026-02-26 09:57:26 - health.services.data_sync - INFO - Syncing heart_rate from 2026-02-24 to 2026-02-24 (1 days)
2026-02-26 09:57:26 - health.services.data_sync - INFO - ✓ Synced heart_rate for 2026-02-24
2026-02-26 09:57:26 - health.services.data_sync - INFO - heart_rate sync complete: 1 synced, 0 skipped, 0 errors
2026-02-26 09:57:26 - health.services.data_sync - INFO - Syncing sleep from 2026-02-24 to 2026-02-24 (1 days)
2026-02-26 09:57:26 - health.services.data_sync - INFO - ✓ Synced sleep for 2026-02-24
2026-02-26 09:57:26 - health.services.data_sync - INFO - sleep sync complete: 1 synced, 0 skipped, 0 errors
2026-02-26 09:57:26 - health.services.data_sync - INFO - Syncing stress from 2026-02-24 to 2026-02-24 (1 days)
2026-02-26 09:57:27 - health.services.data_sync - INFO - ✓ Synced stress for 2026-02-24
2026-02-26 09:57:27 - health.services.data_sync - INFO - stress sync complete: 1 synced, 0 skipped, 0 errors
2026-02-26 09:57:27 - health.services.data_sync - INFO - Syncing body_battery from 2026-02-24 to 2026-02-24 (1 days)
2026-02-26 09:57:27 - health.services.data_sync - INFO - ✓ Synced body_battery for 2026-02-24
2026-02-26 09:57:27 - health.services.data_sync - INFO - body_battery sync complete: 1 synced, 0 skipped, 0 errors
2026-02-26 09:57:27 - health.services.data_sync - INFO - Syncing spo2 from 2026-02-24 to 2026-02-24 (1 days)
2026-02-26 09:57:27 - health.services.data_sync - INFO - ✓ Synced spo2 for 2026-02-24
2026-02-26 09:57:27 - health.services.data_sync - INFO - spo2 sync complete: 1 synced, 0 skipped, 0 errors
2026-02-26 09:57:27 - health.services.data_sync - INFO - Syncing respiration from 2026-02-24 to 2026-02-24 (1 days)
2026-02-26 09:57:27 - health.services.data_sync - INFO - ✓ Synced respiration for 2026-02-24
2026-02-26 09:57:27 - health.services.data_sync - INFO - respiration sync complete: 1 synced, 0 skipped, 0 errors
2026-02-26 09:57:27 - health.services.data_sync - INFO - Syncing hydration from 2026-02-24 to 2026-02-24 (1 days)
2026-02-26 09:57:27 - health.services.data_sync - INFO - ✓ Synced hydration for 2026-02-24
2026-02-26 09:57:27 - health.services.data_sync - INFO - hydration sync complete: 1 synced, 0 skipped, 0 errors
2026-02-26 09:57:27 - health.services.data_sync - INFO - Syncing floors from 2026-02-24 to 2026-02-24 (1 days)
2026-02-26 09:57:27 - health.services.data_sync - INFO - ✓ Synced floors for 2026-02-24
2026-02-26 09:57:27 - health.services.data_sync - INFO - floors sync complete: 1 synced, 0 skipped, 0 errors
2026-02-26 09:57:27 - health.services.data_sync - INFO - Syncing intensity_minutes from 2026-02-24 to 2026-02-24 (1 days)
2026-02-26 09:57:27 - health.services.data_sync - INFO - ✓ Synced intensity_minutes for 2026-02-24
2026-02-26 09:57:27 - health.services.data_sync - INFO - intensity_minutes sync complete: 1 synced, 0 skipped, 0 errors
2026-02-26 09:57:27 - health.services.data_sync - INFO - Syncing hrv from 2026-02-24 to 2026-02-24 (1 days)
2026-02-26 09:57:27 - health.services.data_sync - INFO - ✓ Synced hrv for 2026-02-24
2026-02-26 09:57:27 - health.services.data_sync - INFO - hrv sync complete: 1 synced, 0 skipped, 0 errors
2026-02-26 09:57:27 - health.services.data_sync - INFO - Syncing rhr from 2026-02-24 to 2026-02-24 (1 days)
2026-02-26 09:57:27 - health.services.data_sync - INFO - ✓ Synced rhr for 2026-02-24
2026-02-26 09:57:27 - health.services.data_sync - INFO - rhr sync complete: 1 synced, 0 skipped, 0 errors
2026-02-26 09:57:27 - health.services.data_sync - INFO - Syncing weight from 2026-02-24 to 2026-02-24 (1 days)
2026-02-26 09:57:27 - health.services.data_sync - INFO - weight sync complete: 0 synced, 1 skipped, 0 errors
2026-02-26 09:57:27 - health.services.data_sync - INFO - Syncing activities from 2026-02-24 to 2026-02-24
2026-02-26 09:57:27 - health.services.data_sync - INFO - Found 0 activities
2026-02-26 09:57:27 - health.services.data_sync - INFO - Activity sync complete: 0 synced, 0 skipped, 0 errors
2026-02-26 09:57:27 - health.services.query - INFO - Querying health data summary for 2026-02-24
2026-02-26 09:57:27 - health.services.query - INFO - Found 12 metrics and 0 activities
2026-02-26 09:57:27 - slack_bot.dispatcher - INFO - [a08b3564] ✓ sync_garmin finished in 1.87s
2026-02-26 09:57:27 - slack_bot.dispatcher - INFO - [a08b3564] Tool: sync_garmin Args: {'target_date': '2026-02-25'}
2026-02-26 09:57:27 - slack_bot.tools.garmin - INFO - Starting Garmin sync for 2026-02-25...
2026-02-26 09:57:27 - health.services.data_sync - INFO - Authenticating with Garmin...
2026-02-26 09:57:27 - health.services.garmin_client - INFO - Authenticating with Garmin Connect China for 350134531@qq.com
2026-02-26 09:57:28 - health.services.garmin_client - INFO - Successfully authenticated with Garmin Connect China
2026-02-26 09:57:28 - health.services.data_sync - INFO - Authentication successful
2026-02-26 09:57:28 - health.services.data_sync - INFO - Syncing 13 metric types from 2026-02-25 to 2026-02-25
2026-02-26 09:57:28 - health.services.data_sync - INFO - Syncing steps from 2026-02-25 to 2026-02-25 (1 days)
2026-02-26 09:57:28 - health.services.data_sync - INFO - ✓ Synced steps for 2026-02-25
2026-02-26 09:57:28 - health.services.data_sync - INFO - steps sync complete: 1 synced, 0 skipped, 0 errors
2026-02-26 09:57:28 - health.services.data_sync - INFO - Syncing heart_rate from 2026-02-25 to 2026-02-25 (1 days)
2026-02-26 09:57:28 - health.services.data_sync - INFO - ✓ Synced heart_rate for 2026-02-25
2026-02-26 09:57:28 - health.services.data_sync - INFO - heart_rate sync complete: 1 synced, 0 skipped, 0 errors
2026-02-26 09:57:28 - health.services.data_sync - INFO - Syncing sleep from 2026-02-25 to 2026-02-25 (1 days)
2026-02-26 09:57:28 - health.services.data_sync - INFO - ✓ Synced sleep for 2026-02-25
2026-02-26 09:57:28 - health.services.data_sync - INFO - sleep sync complete: 1 synced, 0 skipped, 0 errors
2026-02-26 09:57:28 - health.services.data_sync - INFO - Syncing stress from 2026-02-25 to 2026-02-25 (1 days)
2026-02-26 09:57:28 - health.services.data_sync - INFO - ✓ Synced stress for 2026-02-25
2026-02-26 09:57:28 - health.services.data_sync - INFO - stress sync complete: 1 synced, 0 skipped, 0 errors
2026-02-26 09:57:28 - health.services.data_sync - INFO - Syncing body_battery from 2026-02-25 to 2026-02-25 (1 days)
2026-02-26 09:57:29 - health.services.data_sync - INFO - ✓ Synced body_battery for 2026-02-25
2026-02-26 09:57:29 - health.services.data_sync - INFO - body_battery sync complete: 1 synced, 0 skipped, 0 errors
2026-02-26 09:57:29 - health.services.data_sync - INFO - Syncing spo2 from 2026-02-25 to 2026-02-25 (1 days)
2026-02-26 09:57:29 - health.services.data_sync - INFO - ✓ Synced spo2 for 2026-02-25
2026-02-26 09:57:29 - health.services.data_sync - INFO - spo2 sync complete: 1 synced, 0 skipped, 0 errors
2026-02-26 09:57:29 - health.services.data_sync - INFO - Syncing respiration from 2026-02-25 to 2026-02-25 (1 days)
2026-02-26 09:57:29 - health.services.data_sync - INFO - ✓ Synced respiration for 2026-02-25
2026-02-26 09:57:29 - health.services.data_sync - INFO - respiration sync complete: 1 synced, 0 skipped, 0 errors
2026-02-26 09:57:29 - health.services.data_sync - INFO - Syncing hydration from 2026-02-25 to 2026-02-25 (1 days)
2026-02-26 09:57:29 - health.services.data_sync - INFO - ✓ Synced hydration for 2026-02-25
2026-02-26 09:57:29 - health.services.data_sync - INFO - hydration sync complete: 1 synced, 0 skipped, 0 errors
2026-02-26 09:57:29 - health.services.data_sync - INFO - Syncing floors from 2026-02-25 to 2026-02-25 (1 days)
2026-02-26 09:57:29 - health.services.data_sync - INFO - ✓ Synced floors for 2026-02-25
2026-02-26 09:57:29 - health.services.data_sync - INFO - floors sync complete: 1 synced, 0 skipped, 0 errors
2026-02-26 09:57:29 - health.services.data_sync - INFO - Syncing intensity_minutes from 2026-02-25 to 2026-02-25 (1 days)
2026-02-26 09:57:29 - health.services.data_sync - INFO - ✓ Synced intensity_minutes for 2026-02-25
2026-02-26 09:57:29 - health.services.data_sync - INFO - intensity_minutes sync complete: 1 synced, 0 skipped, 0 errors
2026-02-26 09:57:29 - health.services.data_sync - INFO - Syncing hrv from 2026-02-25 to 2026-02-25 (1 days)
2026-02-26 09:57:29 - health.services.data_sync - INFO - ✓ Synced hrv for 2026-02-25
2026-02-26 09:57:29 - health.services.data_sync - INFO - hrv sync complete: 1 synced, 0 skipped, 0 errors
2026-02-26 09:57:29 - health.services.data_sync - INFO - Syncing rhr from 2026-02-25 to 2026-02-25 (1 days)
2026-02-26 09:57:29 - health.services.data_sync - INFO - ✓ Synced rhr for 2026-02-25
2026-02-26 09:57:29 - health.services.data_sync - INFO - rhr sync complete: 1 synced, 0 skipped, 0 errors
2026-02-26 09:57:29 - health.services.data_sync - INFO - Syncing weight from 2026-02-25 to 2026-02-25 (1 days)
2026-02-26 09:57:29 - health.services.data_sync - INFO - weight sync complete: 0 synced, 1 skipped, 0 errors
2026-02-26 09:57:29 - health.services.data_sync - INFO - Syncing activities from 2026-02-25 to 2026-02-25
2026-02-26 09:57:30 - health.services.data_sync - INFO - Found 0 activities
2026-02-26 09:57:30 - health.services.data_sync - INFO - Activity sync complete: 0 synced, 0 skipped, 0 errors
2026-02-26 09:57:30 - health.services.query - INFO - Querying health data summary for 2026-02-25
2026-02-26 09:57:30 - health.services.query - INFO - Found 12 metrics and 0 activities
2026-02-26 09:57:30 - slack_bot.dispatcher - INFO - [a08b3564] ✓ sync_garmin finished in 2.06s
2026-02-26 09:57:30 - slack_bot.dispatcher - INFO - [a08b3564] Tool: sync_garmin Args: {'target_date': '2026-02-26'}
2026-02-26 09:57:30 - slack_bot.tools.garmin - INFO - Starting Garmin sync for 2026-02-26...
2026-02-26 09:57:30 - health.services.data_sync - INFO - Authenticating with Garmin...
2026-02-26 09:57:30 - health.services.garmin_client - INFO - Authenticating with Garmin Connect China for 350134531@qq.com
2026-02-26 09:57:30 - health.services.garmin_client - INFO - Successfully authenticated with Garmin Connect China
2026-02-26 09:57:30 - health.services.data_sync - INFO - Authentication successful
2026-02-26 09:57:30 - health.services.data_sync - INFO - Syncing 13 metric types from 2026-02-26 to 2026-02-26
2026-02-26 09:57:30 - health.services.data_sync - INFO - Syncing steps from 2026-02-26 to 2026-02-26 (1 days)
2026-02-26 09:57:30 - health.services.data_sync - INFO - ✓ Synced steps for 2026-02-26
2026-02-26 09:57:30 - health.services.data_sync - INFO - steps sync complete: 1 synced, 0 skipped, 0 errors
2026-02-26 09:57:30 - health.services.data_sync - INFO - Syncing heart_rate from 2026-02-26 to 2026-02-26 (1 days)
2026-02-26 09:57:30 - health.services.data_sync - INFO - ✓ Synced heart_rate for 2026-02-26
2026-02-26 09:57:30 - health.services.data_sync - INFO - heart_rate sync complete: 1 synced, 0 skipped, 0 errors
2026-02-26 09:57:30 - health.services.data_sync - INFO - Syncing sleep from 2026-02-26 to 2026-02-26 (1 days)
2026-02-26 09:57:30 - health.services.data_sync - INFO - ✓ Synced sleep for 2026-02-26
2026-02-26 09:57:30 - health.services.data_sync - INFO - sleep sync complete: 1 synced, 0 skipped, 0 errors
2026-02-26 09:57:30 - health.services.data_sync - INFO - Syncing stress from 2026-02-26 to 2026-02-26 (1 days)
2026-02-26 09:57:30 - health.services.data_sync - INFO - ✓ Synced stress for 2026-02-26
2026-02-26 09:57:30 - health.services.data_sync - INFO - stress sync complete: 1 synced, 0 skipped, 0 errors
2026-02-26 09:57:30 - health.services.data_sync - INFO - Syncing body_battery from 2026-02-26 to 2026-02-26 (1 days)
2026-02-26 09:57:30 - health.services.data_sync - INFO - ✓ Synced body_battery for 2026-02-26
2026-02-26 09:57:30 - health.services.data_sync - INFO - body_battery sync complete: 1 synced, 0 skipped, 0 errors
2026-02-26 09:57:30 - health.services.data_sync - INFO - Syncing spo2 from 2026-02-26 to 2026-02-26 (1 days)
2026-02-26 09:57:31 - health.services.data_sync - INFO - ✓ Synced spo2 for 2026-02-26
2026-02-26 09:57:31 - health.services.data_sync - INFO - spo2 sync complete: 1 synced, 0 skipped, 0 errors
2026-02-26 09:57:31 - health.services.data_sync - INFO - Syncing respiration from 2026-02-26 to 2026-02-26 (1 days)
2026-02-26 09:57:31 - health.services.data_sync - INFO - ✓ Synced respiration for 2026-02-26
2026-02-26 09:57:31 - health.services.data_sync - INFO - respiration sync complete: 1 synced, 0 skipped, 0 errors
2026-02-26 09:57:31 - health.services.data_sync - INFO - Syncing hydration from 2026-02-26 to 2026-02-26 (1 days)
2026-02-26 09:57:31 - health.services.data_sync - INFO - ✓ Synced hydration for 2026-02-26
2026-02-26 09:57:31 - health.services.data_sync - INFO - hydration sync complete: 1 synced, 0 skipped, 0 errors
2026-02-26 09:57:31 - health.services.data_sync - INFO - Syncing floors from 2026-02-26 to 2026-02-26 (1 days)
2026-02-26 09:57:31 - health.services.data_sync - INFO - ✓ Synced floors for 2026-02-26
2026-02-26 09:57:31 - health.services.data_sync - INFO - floors sync complete: 1 synced, 0 skipped, 0 errors
2026-02-26 09:57:31 - health.services.data_sync - INFO - Syncing intensity_minutes from 2026-02-26 to 2026-02-26 (1 days)
2026-02-26 09:57:31 - health.services.data_sync - INFO - ✓ Synced intensity_minutes for 2026-02-26
2026-02-26 09:57:31 - health.services.data_sync - INFO - intensity_minutes sync complete: 1 synced, 0 skipped, 0 errors
2026-02-26 09:57:31 - health.services.data_sync - INFO - Syncing hrv from 2026-02-26 to 2026-02-26 (1 days)
2026-02-26 09:57:31 - health.services.data_sync - INFO - ✓ Synced hrv for 2026-02-26
2026-02-26 09:57:31 - health.services.data_sync - INFO - hrv sync complete: 1 synced, 0 skipped, 0 errors
2026-02-26 09:57:31 - health.services.data_sync - INFO - Syncing rhr from 2026-02-26 to 2026-02-26 (1 days)
2026-02-26 09:57:31 - health.services.data_sync - INFO - ✓ Synced rhr for 2026-02-26
2026-02-26 09:57:31 - health.services.data_sync - INFO - rhr sync complete: 1 synced, 0 skipped, 0 errors
2026-02-26 09:57:31 - health.services.data_sync - INFO - Syncing weight from 2026-02-26 to 2026-02-26 (1 days)
2026-02-26 09:57:31 - health.services.data_sync - INFO - weight sync complete: 0 synced, 1 skipped, 0 errors
2026-02-26 09:57:31 - health.services.data_sync - INFO - Syncing activities from 2026-02-26 to 2026-02-26
2026-02-26 09:57:31 - health.services.garmin_client - INFO - Fetched 1 activities
2026-02-26 09:57:31 - health.services.data_sync - INFO - Found 1 activities
2026-02-26 09:57:31 - health.services.data_sync - INFO - ✓ Synced activity 568490790 (elliptical) on 2026-02-26
2026-02-26 09:57:31 - health.services.data_sync - INFO - Activity sync complete: 1 synced, 0 skipped, 0 errors
2026-02-26 09:57:31 - health.services.query - INFO - Querying health data summary for 2026-02-26
2026-02-26 09:57:31 - health.services.query - INFO - Found 12 metrics and 1 activities
2026-02-26 09:57:31 - slack_bot.dispatcher - INFO - [a08b3564] ✓ sync_garmin finished in 1.95s
2026-02-26 09:57:31 - slack_bot.dispatcher - INFO - [a08b3564] Requesting final analysis...
2026-02-26 09:57:37 - slack_bot.dispatcher - INFO - [a08b3564] Final analysis received in 5.74s
2026-02-26 09:57:37 - slack_bot.dispatcher - INFO - Formatted text (len 669 -> 647)
2026-02-26 09:57:38 - slack_bot.dispatcher - INFO - [a08b3564] 📤 Message updated 1772071039.270379
2026-02-26 09:57:40 - slack_bot.dispatcher - INFO - [a08b3564] 📤 Continuation message posted
2026-02-26 09:57:40 - slack_bot.dispatcher - INFO - [a08b3564] Dispatch completed in 20.68s
2026-02-26 09:57:40 - __main__ - INFO - [a08b3564] ✅ Request completed in 21.40s
2026-02-27 07:38:58 - __main__ - INFO - [dcf87dce] 📥 Received message from U0A8ZCK7RJM in D0AA4GBQRKK: 2月27日的睡眠情况 (Files: 0)
2026-02-27 07:38:59 - slack_bot.dispatcher - INFO - [dcf87dce] Processing message in D0AA4GBQRKK from U0A8ZCK7RJM
2026-02-27 07:38:59 - slack_bot.dispatcher - INFO - [dcf87dce] Calling Gemini for initial response...
2026-02-27 07:38:59 - slack_bot.dispatcher - INFO - [dcf87dce] Request config: model=google/gemini-3-flash-preview, tools=21, context=39 msgs
2026-02-27 07:39:02 - slack_bot.dispatcher - WARNING - [dcf87dce] Gemini returned empty response_text! (This usually means the proxy has issues)
2026-02-27 07:39:02 - slack_bot.dispatcher - INFO - [dcf87dce] Gemini response: text=0 chars, tool_calls=2
2026-02-27 07:39:02 - slack_bot.dispatcher - INFO - [dcf87dce] Tool calls successfully generated by Gemini (no SAFETY OVERRIDE needed)
2026-02-27 07:39:02 - slack_bot.dispatcher - INFO - [dcf87dce] Gemini response in 3.10s: 0 chars, 2 tools
2026-02-27 07:39:02 - slack_bot.dispatcher - INFO - [dcf87dce] Executing 2 tools
2026-02-27 07:39:02 - slack_bot.dispatcher - INFO - [dcf87dce] Tool: sync_garmin Args: {'target_date': '2026-02-27'}
2026-02-27 07:39:02 - slack_bot.tools.garmin - INFO - Starting Garmin sync for 2026-02-27...
2026-02-27 07:39:02 - health.services.data_sync - INFO - Authenticating with Garmin...
2026-02-27 07:39:02 - health.services.garmin_client - INFO - Authenticating with Garmin Connect China for 350134531@qq.com
2026-02-27 07:39:03 - health.services.garmin_client - INFO - Successfully authenticated with Garmin Connect China
2026-02-27 07:39:03 - health.services.data_sync - INFO - Authentication successful
2026-02-27 07:39:03 - health.services.data_sync - INFO - Syncing 13 metric types from 2026-02-27 to 2026-02-27
2026-02-27 07:39:03 - health.services.data_sync - INFO - Syncing steps from 2026-02-27 to 2026-02-27 (1 days)
2026-02-27 07:39:03 - health.services.data_sync - INFO - ✓ Synced steps for 2026-02-27
2026-02-27 07:39:03 - health.services.data_sync - INFO - steps sync complete: 1 synced, 0 skipped, 0 errors
2026-02-27 07:39:03 - health.services.data_sync - INFO - Syncing heart_rate from 2026-02-27 to 2026-02-27 (1 days)
2026-02-27 07:39:03 - health.services.data_sync - INFO - ✓ Synced heart_rate for 2026-02-27
2026-02-27 07:39:03 - health.services.data_sync - INFO - heart_rate sync complete: 1 synced, 0 skipped, 0 errors
2026-02-27 07:39:03 - health.services.data_sync - INFO - Syncing sleep from 2026-02-27 to 2026-02-27 (1 days)
2026-02-27 07:39:03 - health.services.data_sync - INFO - ✓ Synced sleep for 2026-02-27
2026-02-27 07:39:03 - health.services.data_sync - INFO - sleep sync complete: 1 synced, 0 skipped, 0 errors
2026-02-27 07:39:03 - health.services.data_sync - INFO - Syncing stress from 2026-02-27 to 2026-02-27 (1 days)
2026-02-27 07:39:03 - health.services.data_sync - INFO - ✓ Synced stress for 2026-02-27
2026-02-27 07:39:03 - health.services.data_sync - INFO - stress sync complete: 1 synced, 0 skipped, 0 errors
2026-02-27 07:39:03 - health.services.data_sync - INFO - Syncing body_battery from 2026-02-27 to 2026-02-27 (1 days)
2026-02-27 07:39:03 - health.services.data_sync - INFO - ✓ Synced body_battery for 2026-02-27
2026-02-27 07:39:03 - health.services.data_sync - INFO - body_battery sync complete: 1 synced, 0 skipped, 0 errors
2026-02-27 07:39:03 - health.services.data_sync - INFO - Syncing spo2 from 2026-02-27 to 2026-02-27 (1 days)
2026-02-27 07:39:03 - health.services.data_sync - INFO - ✓ Synced spo2 for 2026-02-27
2026-02-27 07:39:03 - health.services.data_sync - INFO - spo2 sync complete: 1 synced, 0 skipped, 0 errors
2026-02-27 07:39:03 - health.services.data_sync - INFO - Syncing respiration from 2026-02-27 to 2026-02-27 (1 days)
2026-02-27 07:39:03 - health.services.data_sync - INFO - ✓ Synced respiration for 2026-02-27
2026-02-27 07:39:03 - health.services.data_sync - INFO - respiration sync complete: 1 synced, 0 skipped, 0 errors
2026-02-27 07:39:03 - health.services.data_sync - INFO - Syncing hydration from 2026-02-27 to 2026-02-27 (1 days)
2026-02-27 07:39:04 - health.services.data_sync - INFO - ✓ Synced hydration for 2026-02-27
2026-02-27 07:39:04 - health.services.data_sync - INFO - hydration sync complete: 1 synced, 0 skipped, 0 errors
2026-02-27 07:39:04 - health.services.data_sync - INFO - Syncing floors from 2026-02-27 to 2026-02-27 (1 days)
2026-02-27 07:39:04 - health.services.data_sync - INFO - ✓ Synced floors for 2026-02-27
2026-02-27 07:39:04 - health.services.data_sync - INFO - floors sync complete: 1 synced, 0 skipped, 0 errors
2026-02-27 07:39:04 - health.services.data_sync - INFO - Syncing intensity_minutes from 2026-02-27 to 2026-02-27 (1 days)
2026-02-27 07:39:04 - health.services.data_sync - INFO - ✓ Synced intensity_minutes for 2026-02-27
2026-02-27 07:39:04 - health.services.data_sync - INFO - intensity_minutes sync complete: 1 synced, 0 skipped, 0 errors
2026-02-27 07:39:04 - health.services.data_sync - INFO - Syncing hrv from 2026-02-27 to 2026-02-27 (1 days)
2026-02-27 07:39:04 - health.services.data_sync - INFO - ✓ Synced hrv for 2026-02-27
2026-02-27 07:39:04 - health.services.data_sync - INFO - hrv sync complete: 1 synced, 0 skipped, 0 errors
2026-02-27 07:39:04 - health.services.data_sync - INFO - Syncing rhr from 2026-02-27 to 2026-02-27 (1 days)
2026-02-27 07:39:04 - health.services.data_sync - INFO - ✓ Synced rhr for 2026-02-27
2026-02-27 07:39:04 - health.services.data_sync - INFO - rhr sync complete: 1 synced, 0 skipped, 0 errors
2026-02-27 07:39:04 - health.services.data_sync - INFO - Syncing weight from 2026-02-27 to 2026-02-27 (1 days)
2026-02-27 07:39:04 - health.services.data_sync - INFO - weight sync complete: 0 synced, 1 skipped, 0 errors
2026-02-27 07:39:04 - health.services.data_sync - INFO - Syncing activities from 2026-02-27 to 2026-02-27
2026-02-27 07:39:04 - health.services.data_sync - INFO - Found 0 activities
2026-02-27 07:39:04 - health.services.data_sync - INFO - Activity sync complete: 0 synced, 0 skipped, 0 errors
2026-02-27 07:39:04 - health.services.query - INFO - Querying health data summary for 2026-02-27
2026-02-27 07:39:04 - health.services.query - INFO - Found 12 metrics and 0 activities
2026-02-27 07:39:04 - slack_bot.dispatcher - INFO - [dcf87dce] ✓ sync_garmin finished in 2.21s
2026-02-27 07:39:04 - slack_bot.dispatcher - INFO - [dcf87dce] Tool: get_daily_detailed_stats Args: {'target_date': '2026-02-27'}
2026-02-27 07:39:04 - health.services.query - INFO - Querying health data summary for 2026-02-27
2026-02-27 07:39:04 - health.services.query - INFO - Found 12 metrics and 0 activities
2026-02-27 07:39:04 - slack_bot.dispatcher - INFO - [dcf87dce] ✓ get_daily_detailed_stats finished in 0.01s
2026-02-27 07:39:04 - slack_bot.dispatcher - INFO - [dcf87dce] Requesting final analysis...
2026-02-27 07:39:08 - slack_bot.dispatcher - INFO - [dcf87dce] Final analysis received in 4.16s
2026-02-27 07:39:08 - slack_bot.dispatcher - INFO - Formatted text (len 532 -> 508)
2026-02-27 07:39:09 - slack_bot.dispatcher - INFO - [dcf87dce] 📤 Message updated 1772149139.157909
2026-02-27 07:39:09 - slack_bot.dispatcher - INFO - [dcf87dce] Dispatch completed in 10.04s
2026-02-27 07:39:09 - __main__ - INFO - [dcf87dce] ✅ Request completed in 10.47s
2026-02-27 07:40:33 - __main__ - INFO - [d56b266a] 📥 Received message from U0A8ZCK7RJM in D0AA4GBQRKK: 前天就已经回深圳了，看看心率是不是恢复到以前水平了 (Files: 0)
2026-02-27 07:40:33 - slack_bot.dispatcher - INFO - [d56b266a] Processing message in D0AA4GBQRKK from U0A8ZCK7RJM
2026-02-27 07:40:33 - slack_bot.dispatcher - INFO - [d56b266a] Calling Gemini for initial response...
2026-02-27 07:40:33 - slack_bot.dispatcher - INFO - [d56b266a] Request config: model=google/gemini-3-flash-preview, tools=21, context=39 msgs
2026-02-27 07:40:36 - slack_bot.dispatcher - WARNING - [d56b266a] Gemini returned empty response_text! (This usually means the proxy has issues)
2026-02-27 07:40:36 - slack_bot.dispatcher - INFO - [d56b266a] Gemini response: text=0 chars, tool_calls=1
2026-02-27 07:40:36 - slack_bot.dispatcher - INFO - [d56b266a] Tool calls successfully generated by Gemini (no SAFETY OVERRIDE needed)
2026-02-27 07:40:36 - slack_bot.dispatcher - INFO - [d56b266a] Gemini response in 2.84s: 0 chars, 1 tools
2026-02-27 07:40:36 - slack_bot.dispatcher - INFO - [d56b266a] Executing 1 tools
2026-02-27 07:40:36 - slack_bot.dispatcher - INFO - [d56b266a] Tool: get_metric_history Args: {'metric_type': 'rhr', 'end_date': '2026-02-27', 'start_date': '2026-02-23'}
2026-02-27 07:40:36 - health.services.query - INFO - Querying rhr from 2026-02-23 to 2026-02-27
2026-02-27 07:40:36 - health.services.query - INFO - Found 5 records for rhr
2026-02-27 07:40:36 - slack_bot.dispatcher - INFO - [d56b266a] ✓ get_metric_history finished in 0.00s
2026-02-27 07:40:36 - slack_bot.dispatcher - INFO - [d56b266a] Requesting final analysis...
2026-02-27 07:40:40 - slack_bot.dispatcher - INFO - [d56b266a] Final analysis received in 3.36s
2026-02-27 07:40:40 - slack_bot.dispatcher - INFO - Formatted text (len 445 -> 427)
2026-02-27 07:40:40 - slack_bot.dispatcher - INFO - [d56b266a] 📤 Message updated 1772149233.756599
2026-02-27 07:40:40 - slack_bot.dispatcher - INFO - [d56b266a] Dispatch completed in 6.73s
2026-02-27 07:40:40 - __main__ - INFO - [d56b266a] ✅ Request completed in 7.25s
2026-02-27 11:32:34 - __main__ - INFO - [218e6f98] 📥 Received message from U0A8ZCK7RJM in D0AA4GBQRKK: 现在体重70公斤，目标体重多少比较合理 (Files: 0)
2026-02-27 11:32:35 - slack_bot.dispatcher - INFO - [218e6f98] Processing message in D0AA4GBQRKK from U0A8ZCK7RJM
2026-02-27 11:32:35 - slack_bot.dispatcher - INFO - [218e6f98] Calling Gemini for initial response...
2026-02-27 11:32:35 - slack_bot.dispatcher - INFO - [218e6f98] Request config: model=google/gemini-3-flash-preview, tools=21, context=39 msgs
2026-02-27 11:32:44 - slack_bot.dispatcher - INFO - [218e6f98] Gemini response: text=1025 chars, tool_calls=0
2026-02-27 11:32:44 - slack_bot.dispatcher - INFO - [218e6f98] No tool calls from Gemini - checking SAFETY OVERRIDE keywords...
2026-02-27 11:32:44 - slack_bot.dispatcher - INFO - [218e6f98] No SAFETY OVERRIDE match found - will return empty response or text
2026-02-27 11:32:44 - slack_bot.dispatcher - INFO - [218e6f98] Gemini response in 8.55s: 1025 chars, 0 tools
2026-02-27 11:32:44 - slack_bot.dispatcher - INFO - Formatted text (len 1025 -> 981)
2026-02-27 11:32:45 - slack_bot.dispatcher - INFO - [218e6f98] 📤 Message updated 1772163155.530619
2026-02-27 11:32:45 - slack_bot.dispatcher - INFO - [218e6f98] Dispatch completed in 9.38s
2026-02-27 11:32:45 - __main__ - INFO - [218e6f98] ✅ Request completed in 10.19s
Failed to check the state of sock (session id: 2ffe22a4-906b-4d28-93b5-7b0311707c3f, error: SSLError, message: [SYS] unknown error (_ssl.c:2406))
Failed to check the state of sock (session id: 2ffe22a4-906b-4d28-93b5-7b0311707c3f, error: SSLError, message: [SSL: BAD_LENGTH] bad length (_ssl.c:2406))
2026-02-28 11:04:47 - __main__ - INFO - [f659569c] 📥 Received message from U0A8ZCK7RJM in D0AA4GBQRKK: 同步佳明数据 (Files: 0)
2026-02-28 11:04:47 - slack_bot.dispatcher - INFO - [f659569c] Processing message in D0AA4GBQRKK from U0A8ZCK7RJM
2026-02-28 11:04:47 - slack_bot.dispatcher - INFO - [f659569c] Calling Gemini for initial response...
2026-02-28 11:04:47 - slack_bot.dispatcher - INFO - [f659569c] Request config: model=google/gemini-3-flash-preview, tools=21, context=39 msgs
2026-02-28 11:04:51 - slack_bot.dispatcher - WARNING - [f659569c] Gemini returned empty response_text! (This usually means the proxy has issues)
2026-02-28 11:04:51 - slack_bot.dispatcher - INFO - [f659569c] Gemini response: text=0 chars, tool_calls=2
2026-02-28 11:04:51 - slack_bot.dispatcher - INFO - [f659569c] Tool calls successfully generated by Gemini (no SAFETY OVERRIDE needed)
2026-02-28 11:04:51 - slack_bot.dispatcher - INFO - [f659569c] Gemini response in 3.14s: 0 chars, 2 tools
2026-02-28 11:04:51 - slack_bot.dispatcher - INFO - [f659569c] Executing 2 tools
2026-02-28 11:04:51 - slack_bot.dispatcher - INFO - [f659569c] Tool: sync_garmin Args: {'target_date': '2026-02-27'}
2026-02-28 11:04:51 - slack_bot.tools.garmin - INFO - Starting Garmin sync for 2026-02-27...
2026-02-28 11:04:51 - health.services.data_sync - INFO - Authenticating with Garmin...
2026-02-28 11:04:51 - health.services.garmin_client - INFO - Authenticating with Garmin Connect China for 350134531@qq.com
2026-02-28 11:04:51 - health.services.garmin_client - INFO - Successfully authenticated with Garmin Connect China
2026-02-28 11:04:51 - health.services.data_sync - INFO - Authentication successful
2026-02-28 11:04:51 - health.services.data_sync - INFO - Syncing 13 metric types from 2026-02-27 to 2026-02-27
2026-02-28 11:04:51 - health.services.data_sync - INFO - Syncing steps from 2026-02-27 to 2026-02-27 (1 days)
2026-02-28 11:04:51 - health.services.data_sync - INFO - ✓ Synced steps for 2026-02-27
2026-02-28 11:04:51 - health.services.data_sync - INFO - steps sync complete: 1 synced, 0 skipped, 0 errors
2026-02-28 11:04:51 - health.services.data_sync - INFO - Syncing heart_rate from 2026-02-27 to 2026-02-27 (1 days)
2026-02-28 11:04:51 - health.services.data_sync - INFO - ✓ Synced heart_rate for 2026-02-27
2026-02-28 11:04:51 - health.services.data_sync - INFO - heart_rate sync complete: 1 synced, 0 skipped, 0 errors
2026-02-28 11:04:51 - health.services.data_sync - INFO - Syncing sleep from 2026-02-27 to 2026-02-27 (1 days)
2026-02-28 11:04:51 - health.services.data_sync - INFO - ✓ Synced sleep for 2026-02-27
2026-02-28 11:04:51 - health.services.data_sync - INFO - sleep sync complete: 1 synced, 0 skipped, 0 errors
2026-02-28 11:04:51 - health.services.data_sync - INFO - Syncing stress from 2026-02-27 to 2026-02-27 (1 days)
2026-02-28 11:04:52 - health.services.data_sync - INFO - ✓ Synced stress for 2026-02-27
2026-02-28 11:04:52 - health.services.data_sync - INFO - stress sync complete: 1 synced, 0 skipped, 0 errors
2026-02-28 11:04:52 - health.services.data_sync - INFO - Syncing body_battery from 2026-02-27 to 2026-02-27 (1 days)
2026-02-28 11:04:52 - health.services.data_sync - INFO - ✓ Synced body_battery for 2026-02-27
2026-02-28 11:04:52 - health.services.data_sync - INFO - body_battery sync complete: 1 synced, 0 skipped, 0 errors
2026-02-28 11:04:52 - health.services.data_sync - INFO - Syncing spo2 from 2026-02-27 to 2026-02-27 (1 days)
2026-02-28 11:04:52 - health.services.data_sync - INFO - ✓ Synced spo2 for 2026-02-27
2026-02-28 11:04:52 - health.services.data_sync - INFO - spo2 sync complete: 1 synced, 0 skipped, 0 errors
2026-02-28 11:04:52 - health.services.data_sync - INFO - Syncing respiration from 2026-02-27 to 2026-02-27 (1 days)
2026-02-28 11:04:52 - health.services.data_sync - INFO - ✓ Synced respiration for 2026-02-27
2026-02-28 11:04:52 - health.services.data_sync - INFO - respiration sync complete: 1 synced, 0 skipped, 0 errors
2026-02-28 11:04:52 - health.services.data_sync - INFO - Syncing hydration from 2026-02-27 to 2026-02-27 (1 days)
2026-02-28 11:04:52 - health.services.data_sync - INFO - ✓ Synced hydration for 2026-02-27
2026-02-28 11:04:52 - health.services.data_sync - INFO - hydration sync complete: 1 synced, 0 skipped, 0 errors
2026-02-28 11:04:52 - health.services.data_sync - INFO - Syncing floors from 2026-02-27 to 2026-02-27 (1 days)
2026-02-28 11:04:52 - health.services.data_sync - INFO - ✓ Synced floors for 2026-02-27
2026-02-28 11:04:52 - health.services.data_sync - INFO - floors sync complete: 1 synced, 0 skipped, 0 errors
2026-02-28 11:04:52 - health.services.data_sync - INFO - Syncing intensity_minutes from 2026-02-27 to 2026-02-27 (1 days)
2026-02-28 11:04:52 - health.services.data_sync - INFO - ✓ Synced intensity_minutes for 2026-02-27
2026-02-28 11:04:52 - health.services.data_sync - INFO - intensity_minutes sync complete: 1 synced, 0 skipped, 0 errors
2026-02-28 11:04:52 - health.services.data_sync - INFO - Syncing hrv from 2026-02-27 to 2026-02-27 (1 days)
2026-02-28 11:04:52 - health.services.data_sync - INFO - ✓ Synced hrv for 2026-02-27
2026-02-28 11:04:52 - health.services.data_sync - INFO - hrv sync complete: 1 synced, 0 skipped, 0 errors
2026-02-28 11:04:52 - health.services.data_sync - INFO - Syncing rhr from 2026-02-27 to 2026-02-27 (1 days)
2026-02-28 11:04:53 - health.services.data_sync - INFO - ✓ Synced rhr for 2026-02-27
2026-02-28 11:04:53 - health.services.data_sync - INFO - rhr sync complete: 1 synced, 0 skipped, 0 errors
2026-02-28 11:04:53 - health.services.data_sync - INFO - Syncing weight from 2026-02-27 to 2026-02-27 (1 days)
2026-02-28 11:04:53 - health.services.data_sync - INFO - weight sync complete: 0 synced, 1 skipped, 0 errors
2026-02-28 11:04:53 - health.services.data_sync - INFO - Syncing activities from 2026-02-27 to 2026-02-27
2026-02-28 11:04:53 - health.services.data_sync - INFO - Found 0 activities
2026-02-28 11:04:53 - health.services.data_sync - INFO - Activity sync complete: 0 synced, 0 skipped, 0 errors
2026-02-28 11:04:53 - health.services.query - INFO - Querying health data summary for 2026-02-27
2026-02-28 11:04:53 - health.services.query - INFO - Found 12 metrics and 0 activities
2026-02-28 11:04:53 - slack_bot.dispatcher - INFO - [f659569c] ✓ sync_garmin finished in 2.18s
2026-02-28 11:04:53 - slack_bot.dispatcher - INFO - [f659569c] Tool: get_daily_detailed_stats Args: {'target_date': '2026-02-27'}
2026-02-28 11:04:53 - health.services.query - INFO - Querying health data summary for 2026-02-27
2026-02-28 11:04:53 - health.services.query - INFO - Found 12 metrics and 0 activities
2026-02-28 11:04:53 - slack_bot.dispatcher - INFO - [f659569c] ✓ get_daily_detailed_stats finished in 0.01s
2026-02-28 11:04:53 - slack_bot.dispatcher - INFO - [f659569c] Requesting final analysis...
2026-02-28 11:04:57 - slack_bot.dispatcher - INFO - [f659569c] Final analysis received in 3.79s
2026-02-28 11:04:57 - slack_bot.dispatcher - INFO - Formatted text (len 536 -> 508)
2026-02-28 11:04:57 - slack_bot.dispatcher - INFO - [f659569c] 📤 Message updated 1772247887.767819
2026-02-28 11:04:57 - slack_bot.dispatcher - INFO - [f659569c] Dispatch completed in 9.86s
2026-02-28 11:04:57 - __main__ - INFO - [f659569c] ✅ Request completed in 10.39s
2026-02-28 11:08:27 - __main__ - INFO - [76aa0c78] 📥 Received message from U0A8ZCK7RJM in D0AA4GBQRKK: 2月28日的运动数据分析一下 (Files: 0)
2026-02-28 11:08:28 - slack_bot.dispatcher - INFO - [76aa0c78] Processing message in D0AA4GBQRKK from U0A8ZCK7RJM
2026-02-28 11:08:28 - slack_bot.dispatcher - INFO - [76aa0c78] Calling Gemini for initial response...
2026-02-28 11:08:28 - slack_bot.dispatcher - INFO - [76aa0c78] Request config: model=google/gemini-3-flash-preview, tools=21, context=39 msgs
2026-02-28 11:08:31 - slack_bot.dispatcher - WARNING - [76aa0c78] Gemini returned empty response_text! (This usually means the proxy has issues)
2026-02-28 11:08:31 - slack_bot.dispatcher - INFO - [76aa0c78] Gemini response: text=0 chars, tool_calls=2
2026-02-28 11:08:31 - slack_bot.dispatcher - INFO - [76aa0c78] Tool calls successfully generated by Gemini (no SAFETY OVERRIDE needed)
2026-02-28 11:08:31 - slack_bot.dispatcher - INFO - [76aa0c78] Gemini response in 3.61s: 0 chars, 2 tools
2026-02-28 11:08:31 - slack_bot.dispatcher - INFO - [76aa0c78] Executing 2 tools
2026-02-28 11:08:31 - slack_bot.dispatcher - INFO - [76aa0c78] Tool: sync_garmin Args: {'target_date': '2026-02-28'}
2026-02-28 11:08:31 - slack_bot.tools.garmin - INFO - Starting Garmin sync for 2026-02-28...
2026-02-28 11:08:31 - health.services.data_sync - INFO - Authenticating with Garmin...
2026-02-28 11:08:31 - health.services.garmin_client - INFO - Authenticating with Garmin Connect China for 350134531@qq.com
2026-02-28 11:08:32 - health.services.garmin_client - INFO - Successfully authenticated with Garmin Connect China
2026-02-28 11:08:32 - health.services.data_sync - INFO - Authentication successful
2026-02-28 11:08:32 - health.services.data_sync - INFO - Syncing 13 metric types from 2026-02-28 to 2026-02-28
2026-02-28 11:08:32 - health.services.data_sync - INFO - Syncing steps from 2026-02-28 to 2026-02-28 (1 days)
2026-02-28 11:08:32 - health.services.data_sync - INFO - ✓ Synced steps for 2026-02-28
2026-02-28 11:08:32 - health.services.data_sync - INFO - steps sync complete: 1 synced, 0 skipped, 0 errors
2026-02-28 11:08:32 - health.services.data_sync - INFO - Syncing heart_rate from 2026-02-28 to 2026-02-28 (1 days)
2026-02-28 11:08:32 - health.services.data_sync - INFO - ✓ Synced heart_rate for 2026-02-28
2026-02-28 11:08:32 - health.services.data_sync - INFO - heart_rate sync complete: 1 synced, 0 skipped, 0 errors
2026-02-28 11:08:32 - health.services.data_sync - INFO - Syncing sleep from 2026-02-28 to 2026-02-28 (1 days)
2026-02-28 11:08:32 - health.services.data_sync - INFO - ✓ Synced sleep for 2026-02-28
2026-02-28 11:08:32 - health.services.data_sync - INFO - sleep sync complete: 1 synced, 0 skipped, 0 errors
2026-02-28 11:08:32 - health.services.data_sync - INFO - Syncing stress from 2026-02-28 to 2026-02-28 (1 days)
2026-02-28 11:08:32 - health.services.data_sync - INFO - ✓ Synced stress for 2026-02-28
2026-02-28 11:08:32 - health.services.data_sync - INFO - stress sync complete: 1 synced, 0 skipped, 0 errors
2026-02-28 11:08:32 - health.services.data_sync - INFO - Syncing body_battery from 2026-02-28 to 2026-02-28 (1 days)
2026-02-28 11:08:32 - health.services.data_sync - INFO - ✓ Synced body_battery for 2026-02-28
2026-02-28 11:08:32 - health.services.data_sync - INFO - body_battery sync complete: 1 synced, 0 skipped, 0 errors
2026-02-28 11:08:32 - health.services.data_sync - INFO - Syncing spo2 from 2026-02-28 to 2026-02-28 (1 days)
2026-02-28 11:08:32 - health.services.data_sync - INFO - ✓ Synced spo2 for 2026-02-28
2026-02-28 11:08:32 - health.services.data_sync - INFO - spo2 sync complete: 1 synced, 0 skipped, 0 errors
2026-02-28 11:08:32 - health.services.data_sync - INFO - Syncing respiration from 2026-02-28 to 2026-02-28 (1 days)
2026-02-28 11:08:33 - health.services.data_sync - INFO - ✓ Synced respiration for 2026-02-28
2026-02-28 11:08:33 - health.services.data_sync - INFO - respiration sync complete: 1 synced, 0 skipped, 0 errors
2026-02-28 11:08:33 - health.services.data_sync - INFO - Syncing hydration from 2026-02-28 to 2026-02-28 (1 days)
2026-02-28 11:08:33 - health.services.data_sync - INFO - ✓ Synced hydration for 2026-02-28
2026-02-28 11:08:33 - health.services.data_sync - INFO - hydration sync complete: 1 synced, 0 skipped, 0 errors
2026-02-28 11:08:33 - health.services.data_sync - INFO - Syncing floors from 2026-02-28 to 2026-02-28 (1 days)
2026-02-28 11:08:33 - health.services.data_sync - INFO - ✓ Synced floors for 2026-02-28
2026-02-28 11:08:33 - health.services.data_sync - INFO - floors sync complete: 1 synced, 0 skipped, 0 errors
2026-02-28 11:08:33 - health.services.data_sync - INFO - Syncing intensity_minutes from 2026-02-28 to 2026-02-28 (1 days)
2026-02-28 11:08:33 - health.services.data_sync - INFO - ✓ Synced intensity_minutes for 2026-02-28
2026-02-28 11:08:33 - health.services.data_sync - INFO - intensity_minutes sync complete: 1 synced, 0 skipped, 0 errors
2026-02-28 11:08:33 - health.services.data_sync - INFO - Syncing hrv from 2026-02-28 to 2026-02-28 (1 days)
2026-02-28 11:08:33 - health.services.data_sync - INFO - ✓ Synced hrv for 2026-02-28
2026-02-28 11:08:33 - health.services.data_sync - INFO - hrv sync complete: 1 synced, 0 skipped, 0 errors
2026-02-28 11:08:33 - health.services.data_sync - INFO - Syncing rhr from 2026-02-28 to 2026-02-28 (1 days)
2026-02-28 11:08:33 - health.services.data_sync - INFO - ✓ Synced rhr for 2026-02-28
2026-02-28 11:08:33 - health.services.data_sync - INFO - rhr sync complete: 1 synced, 0 skipped, 0 errors
2026-02-28 11:08:33 - health.services.data_sync - INFO - Syncing weight from 2026-02-28 to 2026-02-28 (1 days)
2026-02-28 11:08:33 - health.services.data_sync - INFO - weight sync complete: 0 synced, 1 skipped, 0 errors
2026-02-28 11:08:33 - health.services.data_sync - INFO - Syncing activities from 2026-02-28 to 2026-02-28
2026-02-28 11:08:33 - health.services.garmin_client - INFO - Fetched 1 activities
2026-02-28 11:08:33 - health.services.data_sync - INFO - Found 1 activities
2026-02-28 11:08:33 - health.services.data_sync - INFO - ✓ Synced activity 569031445 (elliptical) on 2026-02-28
2026-02-28 11:08:33 - health.services.data_sync - INFO - Activity sync complete: 1 synced, 0 skipped, 0 errors
2026-02-28 11:08:33 - health.services.query - INFO - Querying health data summary for 2026-02-28
2026-02-28 11:08:33 - health.services.query - INFO - Found 12 metrics and 1 activities
2026-02-28 11:08:33 - slack_bot.dispatcher - INFO - [76aa0c78] ✓ sync_garmin finished in 1.97s
2026-02-28 11:08:33 - slack_bot.dispatcher - INFO - [76aa0c78] Tool: get_daily_detailed_stats Args: {'target_date': '2026-02-28'}
2026-02-28 11:08:33 - health.services.query - INFO - Querying health data summary for 2026-02-28
2026-02-28 11:08:33 - health.services.query - INFO - Found 12 metrics and 1 activities
2026-02-28 11:08:33 - slack_bot.dispatcher - INFO - [76aa0c78] ✓ get_daily_detailed_stats finished in 0.01s
2026-02-28 11:08:33 - slack_bot.dispatcher - INFO - [76aa0c78] Requesting final analysis...
2026-02-28 11:08:38 - slack_bot.dispatcher - INFO - [76aa0c78] Final analysis received in 5.02s
2026-02-28 11:08:38 - slack_bot.dispatcher - INFO - Formatted text (len 625 -> 597)
2026-02-28 11:08:39 - slack_bot.dispatcher - WARNING - [76aa0c78] Update failed, posting new: The request to the Slack API failed. (url: https://slack.com/api/chat.update)
The server responded with: {'ok': False, 'error': 'msg_too_long'}
2026-02-28 11:08:39 - slack_bot.dispatcher - INFO - [76aa0c78] Dispatch completed in 11.72s
2026-02-28 11:08:39 - __main__ - INFO - [76aa0c78] ✅ Request completed in 12.25s
2026-02-28 14:01:05 - __main__ - INFO - [06a5b51f] 📥 Received message from U0A8ZCK7RJM in D0AA4GBQRKK: 新买的椭圆机感觉更容易心率升高，也就是说更慢的步频就能达到zone2，这样的运动效果是不是一样的，还是说健身房那种zone2并且步频更高会对锻炼更有帮助 (Files: 0)
2026-02-28 14:01:05 - slack_bot.dispatcher - INFO - [06a5b51f] Processing message in D0AA4GBQRKK from U0A8ZCK7RJM
2026-02-28 14:01:05 - slack_bot.dispatcher - INFO - [06a5b51f] Calling Gemini for initial response...
2026-02-28 14:01:05 - slack_bot.dispatcher - INFO - [06a5b51f] Request config: model=google/gemini-3-flash-preview, tools=21, context=39 msgs
2026-02-28 14:01:15 - slack_bot.dispatcher - INFO - [06a5b51f] Gemini response: text=1244 chars, tool_calls=0
2026-02-28 14:01:15 - slack_bot.dispatcher - INFO - [06a5b51f] No tool calls from Gemini - checking SAFETY OVERRIDE keywords...
2026-02-28 14:01:15 - slack_bot.dispatcher - WARNING - [06a5b51f] 🔧 SAFETY OVERRIDE: Forcing get_activity_history for 2026-02-28
2026-02-28 14:01:15 - slack_bot.dispatcher - INFO - [06a5b51f] No SAFETY OVERRIDE match found - will return empty response or text
2026-02-28 14:01:15 - slack_bot.dispatcher - INFO - [06a5b51f] Gemini response in 9.95s: 1244 chars, 1 tools
2026-02-28 14:01:15 - slack_bot.dispatcher - INFO - [06a5b51f] Executing 1 tools
2026-02-28 14:01:15 - slack_bot.dispatcher - INFO - [06a5b51f] Tool: get_activity_history Args: {'start_date': '2026-02-28', 'end_date': '2026-02-28'}
2026-02-28 14:01:15 - health.services.query - INFO - Querying activities from 2026-02-28 to 2026-02-28
2026-02-28 14:01:15 - health.services.query - INFO - Found 1 activities
2026-02-28 14:01:15 - slack_bot.dispatcher - INFO - [06a5b51f] ✓ get_activity_history finished in 0.00s
2026-02-28 14:01:15 - slack_bot.dispatcher - INFO - [06a5b51f] Requesting final analysis...
2026-02-28 14:01:23 - slack_bot.dispatcher - INFO - [06a5b51f] Final analysis received in 7.65s
2026-02-28 14:01:23 - slack_bot.dispatcher - INFO - Formatted text (len 858 -> 836)
2026-02-28 14:01:24 - slack_bot.dispatcher - INFO - [06a5b51f] 📤 Message updated 1772258465.764629
2026-02-28 14:01:24 - slack_bot.dispatcher - INFO - [06a5b51f] Dispatch completed in 18.20s
2026-02-28 14:01:24 - __main__ - INFO - [06a5b51f] ✅ Request completed in 18.70s
2026-03-01 11:49:10 - __main__ - INFO - [3a68f614] 📥 Received message from U0A8ZCK7RJM in D0AA4GBQRKK: 同步三月一日的睡眠和运动数据，并深入分析 (Files: 0)
2026-03-01 11:49:10 - slack_bot.dispatcher - INFO - [3a68f614] Processing message in D0AA4GBQRKK from U0A8ZCK7RJM
2026-03-01 11:49:10 - slack_bot.dispatcher - INFO - [3a68f614] Calling Gemini for initial response...
2026-03-01 11:49:10 - slack_bot.dispatcher - INFO - [3a68f614] Request config: model=google/gemini-3-flash-preview, tools=21, context=39 msgs
2026-03-01 11:49:13 - slack_bot.dispatcher - WARNING - [3a68f614] Gemini returned empty response_text! (This usually means the proxy has issues)
2026-03-01 11:49:13 - slack_bot.dispatcher - INFO - [3a68f614] Gemini response: text=0 chars, tool_calls=1
2026-03-01 11:49:13 - slack_bot.dispatcher - INFO - [3a68f614] Tool calls successfully generated by Gemini (no SAFETY OVERRIDE needed)
2026-03-01 11:49:13 - slack_bot.dispatcher - INFO - [3a68f614] Gemini response in 2.85s: 0 chars, 1 tools
2026-03-01 11:49:13 - slack_bot.dispatcher - INFO - [3a68f614] Executing 1 tools
2026-03-01 11:49:13 - slack_bot.dispatcher - INFO - [3a68f614] Tool: sync_garmin Args: {'target_date': '2026-03-01'}
2026-03-01 11:49:13 - slack_bot.tools.garmin - INFO - Starting Garmin sync for 2026-03-01...
2026-03-01 11:49:13 - health.services.data_sync - INFO - Authenticating with Garmin...
2026-03-01 11:49:13 - health.services.garmin_client - INFO - Authenticating with Garmin Connect China for 350134531@qq.com
2026-03-01 11:49:14 - health.services.garmin_client - INFO - Successfully authenticated with Garmin Connect China
2026-03-01 11:49:14 - health.services.data_sync - INFO - Authentication successful
2026-03-01 11:49:14 - health.services.data_sync - INFO - Syncing 13 metric types from 2026-03-01 to 2026-03-01
2026-03-01 11:49:14 - health.services.data_sync - INFO - Syncing steps from 2026-03-01 to 2026-03-01 (1 days)
2026-03-01 11:49:14 - health.services.data_sync - INFO - ✓ Synced steps for 2026-03-01
2026-03-01 11:49:14 - health.services.data_sync - INFO - steps sync complete: 1 synced, 0 skipped, 0 errors
2026-03-01 11:49:14 - health.services.data_sync - INFO - Syncing heart_rate from 2026-03-01 to 2026-03-01 (1 days)
2026-03-01 11:49:14 - health.services.data_sync - INFO - ✓ Synced heart_rate for 2026-03-01
2026-03-01 11:49:14 - health.services.data_sync - INFO - heart_rate sync complete: 1 synced, 0 skipped, 0 errors
2026-03-01 11:49:14 - health.services.data_sync - INFO - Syncing sleep from 2026-03-01 to 2026-03-01 (1 days)
2026-03-01 11:49:14 - health.services.data_sync - INFO - ✓ Synced sleep for 2026-03-01
2026-03-01 11:49:14 - health.services.data_sync - INFO - sleep sync complete: 1 synced, 0 skipped, 0 errors
2026-03-01 11:49:14 - health.services.data_sync - INFO - Syncing stress from 2026-03-01 to 2026-03-01 (1 days)
2026-03-01 11:49:14 - health.services.data_sync - INFO - ✓ Synced stress for 2026-03-01
2026-03-01 11:49:14 - health.services.data_sync - INFO - stress sync complete: 1 synced, 0 skipped, 0 errors
2026-03-01 11:49:14 - health.services.data_sync - INFO - Syncing body_battery from 2026-03-01 to 2026-03-01 (1 days)
2026-03-01 11:49:14 - health.services.data_sync - INFO - ✓ Synced body_battery for 2026-03-01
2026-03-01 11:49:14 - health.services.data_sync - INFO - body_battery sync complete: 1 synced, 0 skipped, 0 errors
2026-03-01 11:49:14 - health.services.data_sync - INFO - Syncing spo2 from 2026-03-01 to 2026-03-01 (1 days)
2026-03-01 11:49:14 - health.services.data_sync - INFO - ✓ Synced spo2 for 2026-03-01
2026-03-01 11:49:14 - health.services.data_sync - INFO - spo2 sync complete: 1 synced, 0 skipped, 0 errors
2026-03-01 11:49:14 - health.services.data_sync - INFO - Syncing respiration from 2026-03-01 to 2026-03-01 (1 days)
2026-03-01 11:49:14 - health.services.data_sync - INFO - ✓ Synced respiration for 2026-03-01
2026-03-01 11:49:14 - health.services.data_sync - INFO - respiration sync complete: 1 synced, 0 skipped, 0 errors
2026-03-01 11:49:14 - health.services.data_sync - INFO - Syncing hydration from 2026-03-01 to 2026-03-01 (1 days)
2026-03-01 11:49:15 - health.services.data_sync - INFO - ✓ Synced hydration for 2026-03-01
2026-03-01 11:49:15 - health.services.data_sync - INFO - hydration sync complete: 1 synced, 0 skipped, 0 errors
2026-03-01 11:49:15 - health.services.data_sync - INFO - Syncing floors from 2026-03-01 to 2026-03-01 (1 days)
2026-03-01 11:49:15 - health.services.data_sync - INFO - ✓ Synced floors for 2026-03-01
2026-03-01 11:49:15 - health.services.data_sync - INFO - floors sync complete: 1 synced, 0 skipped, 0 errors
2026-03-01 11:49:15 - health.services.data_sync - INFO - Syncing intensity_minutes from 2026-03-01 to 2026-03-01 (1 days)
2026-03-01 11:49:15 - health.services.data_sync - INFO - ✓ Synced intensity_minutes for 2026-03-01
2026-03-01 11:49:15 - health.services.data_sync - INFO - intensity_minutes sync complete: 1 synced, 0 skipped, 0 errors
2026-03-01 11:49:15 - health.services.data_sync - INFO - Syncing hrv from 2026-03-01 to 2026-03-01 (1 days)
2026-03-01 11:49:15 - health.services.data_sync - INFO - ✓ Synced hrv for 2026-03-01
2026-03-01 11:49:15 - health.services.data_sync - INFO - hrv sync complete: 1 synced, 0 skipped, 0 errors
2026-03-01 11:49:15 - health.services.data_sync - INFO - Syncing rhr from 2026-03-01 to 2026-03-01 (1 days)
2026-03-01 11:49:15 - health.services.data_sync - INFO - ✓ Synced rhr for 2026-03-01
2026-03-01 11:49:15 - health.services.data_sync - INFO - rhr sync complete: 1 synced, 0 skipped, 0 errors
2026-03-01 11:49:15 - health.services.data_sync - INFO - Syncing weight from 2026-03-01 to 2026-03-01 (1 days)
2026-03-01 11:49:15 - health.services.data_sync - INFO - weight sync complete: 0 synced, 1 skipped, 0 errors
2026-03-01 11:49:15 - health.services.data_sync - INFO - Syncing activities from 2026-03-01 to 2026-03-01
2026-03-01 11:49:15 - health.services.garmin_client - INFO - Fetched 1 activities
2026-03-01 11:49:15 - health.services.data_sync - INFO - Found 1 activities
2026-03-01 11:49:15 - health.services.data_sync - INFO - ✓ Synced activity 569256212 (elliptical) on 2026-03-01
2026-03-01 11:49:15 - health.services.data_sync - INFO - Activity sync complete: 1 synced, 0 skipped, 0 errors
2026-03-01 11:49:15 - health.services.query - INFO - Querying health data summary for 2026-03-01
2026-03-01 11:49:15 - health.services.query - INFO - Found 12 metrics and 1 activities
2026-03-01 11:49:15 - slack_bot.dispatcher - INFO - [3a68f614] ✓ sync_garmin finished in 1.87s
2026-03-01 11:49:15 - slack_bot.dispatcher - INFO - [3a68f614] Requesting final analysis...
2026-03-01 11:49:20 - slack_bot.dispatcher - INFO - [3a68f614] Final analysis received in 4.98s
2026-03-01 11:49:20 - slack_bot.dispatcher - INFO - Formatted text (len 846 -> 796)
2026-03-01 11:49:21 - slack_bot.dispatcher - INFO - [3a68f614] 📤 Message updated 1772336950.797139
2026-03-01 11:49:21 - slack_bot.dispatcher - INFO - [3a68f614] Dispatch completed in 10.23s
2026-03-01 11:49:21 - __main__ - INFO - [3a68f614] ✅ Request completed in 10.71s
2026-03-01 11:53:38 - __main__ - INFO - [85f27e26] 📥 Received message from U0A8ZCK7RJM in D0AA4GBQRKK: 对于这次椭圆机运动的数据我不大懂，手表上显示无氧运动的效果是1.9，但是一般这种运动都是0或0.1左右。如果从实际感受上看，现在这个家用椭圆机会让大腿更酸，确实有无氧的可能，但是手表不应该知道吧 (Files: 0)
2026-03-01 11:53:38 - slack_bot.dispatcher - INFO - [85f27e26] Processing message in D0AA4GBQRKK from U0A8ZCK7RJM
2026-03-01 11:53:38 - slack_bot.dispatcher - INFO - [85f27e26] Calling Gemini for initial response...
2026-03-01 11:53:38 - slack_bot.dispatcher - INFO - [85f27e26] Request config: model=google/gemini-3-flash-preview, tools=21, context=39 msgs
2026-03-01 11:53:46 - slack_bot.dispatcher - INFO - [85f27e26] Gemini response: text=1252 chars, tool_calls=0
2026-03-01 11:53:46 - slack_bot.dispatcher - INFO - [85f27e26] No tool calls from Gemini - checking SAFETY OVERRIDE keywords...
2026-03-01 11:53:46 - slack_bot.dispatcher - WARNING - [85f27e26] 🔧 SAFETY OVERRIDE: Forcing get_activity_history for 2026-03-01
2026-03-01 11:53:46 - slack_bot.dispatcher - INFO - [85f27e26] No SAFETY OVERRIDE match found - will return empty response or text
2026-03-01 11:53:46 - slack_bot.dispatcher - INFO - [85f27e26] Gemini response in 8.28s: 1252 chars, 1 tools
2026-03-01 11:53:46 - slack_bot.dispatcher - INFO - [85f27e26] Executing 1 tools
2026-03-01 11:53:46 - slack_bot.dispatcher - INFO - [85f27e26] Tool: get_activity_history Args: {'start_date': '2026-03-01', 'end_date': '2026-03-01'}
2026-03-01 11:53:46 - health.services.query - INFO - Querying activities from 2026-03-01 to 2026-03-01
2026-03-01 11:53:46 - health.services.query - INFO - Found 1 activities
2026-03-01 11:53:46 - slack_bot.dispatcher - INFO - [85f27e26] ✓ get_activity_history finished in 0.00s
2026-03-01 11:53:46 - slack_bot.dispatcher - INFO - [85f27e26] Requesting final analysis...
2026-03-01 11:53:52 - slack_bot.dispatcher - INFO - [85f27e26] Final analysis received in 5.79s
2026-03-01 11:53:52 - slack_bot.dispatcher - INFO - Formatted text (len 641 -> 625)
2026-03-01 11:53:54 - slack_bot.dispatcher - INFO - [85f27e26] 📤 Message updated 1772337218.604729
2026-03-01 11:53:54 - slack_bot.dispatcher - INFO - [85f27e26] Dispatch completed in 15.64s
2026-03-01 11:53:54 - __main__ - INFO - [85f27e26] ✅ Request completed in 16.16s
2026-03-01 11:56:12 - __main__ - INFO - [df0f5ee3] 📥 Received message from U0A8ZCK7RJM in D0AA4GBQRKK: 那么对于我的zone2训练和轻断食减重需求，这也是更好的吗？我的体感是操作更困难了，但如果不影响效果的情况下还能锻炼大腿肌肉，那就非常好了 (Files: 0)
2026-03-01 11:56:13 - slack_bot.dispatcher - INFO - [df0f5ee3] Processing message in D0AA4GBQRKK from U0A8ZCK7RJM
2026-03-01 11:56:13 - slack_bot.dispatcher - INFO - [df0f5ee3] Calling Gemini for initial response...
2026-03-01 11:56:13 - slack_bot.dispatcher - INFO - [df0f5ee3] Request config: model=google/gemini-3-flash-preview, tools=21, context=39 msgs
2026-03-01 11:56:21 - slack_bot.dispatcher - INFO - [df0f5ee3] Gemini response: text=1068 chars, tool_calls=0
2026-03-01 11:56:21 - slack_bot.dispatcher - INFO - [df0f5ee3] No tool calls from Gemini - checking SAFETY OVERRIDE keywords...
2026-03-01 11:56:21 - slack_bot.dispatcher - WARNING - [df0f5ee3] 🔧 SAFETY OVERRIDE: Forcing get_activity_history for 2026-03-01
2026-03-01 11:56:21 - slack_bot.dispatcher - INFO - [df0f5ee3] No SAFETY OVERRIDE match found - will return empty response or text
2026-03-01 11:56:21 - slack_bot.dispatcher - INFO - [df0f5ee3] Gemini response in 8.09s: 1068 chars, 1 tools
2026-03-01 11:56:21 - slack_bot.dispatcher - INFO - [df0f5ee3] Executing 1 tools
2026-03-01 11:56:21 - slack_bot.dispatcher - INFO - [df0f5ee3] Tool: get_activity_history Args: {'start_date': '2026-03-01', 'end_date': '2026-03-01'}
2026-03-01 11:56:21 - health.services.query - INFO - Querying activities from 2026-03-01 to 2026-03-01
2026-03-01 11:56:21 - health.services.query - INFO - Found 1 activities
2026-03-01 11:56:21 - slack_bot.dispatcher - INFO - [df0f5ee3] ✓ get_activity_history finished in 0.00s
2026-03-01 11:56:21 - slack_bot.dispatcher - INFO - [df0f5ee3] Requesting final analysis...
2026-03-01 11:56:26 - slack_bot.dispatcher - INFO - [df0f5ee3] Final analysis received in 5.45s
2026-03-01 11:56:26 - slack_bot.dispatcher - INFO - Formatted text (len 704 -> 688)
2026-03-01 11:56:27 - slack_bot.dispatcher - INFO - [df0f5ee3] 📤 Message updated 1772337373.280989
2026-03-01 11:56:27 - slack_bot.dispatcher - INFO - [df0f5ee3] Dispatch completed in 14.02s
2026-03-01 11:56:27 - __main__ - INFO - [df0f5ee3] ✅ Request completed in 14.49s
2026-03-01 12:27:10 - __main__ - INFO - [88e825c7] 📥 Received message from U0A8ZCK7RJM in D0AA4GBQRKK: 这种训练会不会增加大腿肌肉，以后如果大腿肌肉强壮了，是不是也可以做到更轻松完成，提高步频 (Files: 0)
2026-03-01 12:27:10 - slack_bot.dispatcher - INFO - [88e825c7] Processing message in D0AA4GBQRKK from U0A8ZCK7RJM
2026-03-01 12:27:10 - slack_bot.dispatcher - INFO - [88e825c7] Calling Gemini for initial response...
2026-03-01 12:27:10 - slack_bot.dispatcher - INFO - [88e825c7] Request config: model=google/gemini-3-flash-preview, tools=21, context=39 msgs
2026-03-01 12:27:18 - slack_bot.dispatcher - INFO - [88e825c7] Gemini response: text=914 chars, tool_calls=0
2026-03-01 12:27:18 - slack_bot.dispatcher - INFO - [88e825c7] No tool calls from Gemini - checking SAFETY OVERRIDE keywords...
2026-03-01 12:27:18 - slack_bot.dispatcher - INFO - [88e825c7] No SAFETY OVERRIDE match found - will return empty response or text
2026-03-01 12:27:18 - slack_bot.dispatcher - INFO - [88e825c7] Gemini response in 7.93s: 914 chars, 0 tools
2026-03-01 12:27:18 - slack_bot.dispatcher - INFO - Formatted text (len 914 -> 912)
2026-03-01 12:27:19 - slack_bot.dispatcher - INFO - [88e825c7] 📤 Message updated 1772339230.666739
2026-03-01 12:27:19 - slack_bot.dispatcher - INFO - [88e825c7] Dispatch completed in 8.41s
2026-03-01 12:27:19 - __main__ - INFO - [88e825c7] ✅ Request completed in 8.87s
2026-03-02 10:08:00 - health.utils.env_loader - INFO - Loading extra configuration from: /root/projects/butler/.gemini.current.env
2026-03-02 10:08:00 - __main__ - INFO - Starting Butler Bot with configuration:
2026-03-02 10:08:00 - __main__ - INFO -   Config file: .gemini.current.env
2026-03-02 10:08:00 - __main__ - INFO -   Model: google/gemini-3-flash-preview
2026-03-02 10:08:00 - __main__ - INFO -   Base URL: https://openrouter.ai/api
2026-03-02 10:08:00 - __main__ - INFO -   Using proxy: Yes
2026-03-02 10:08:01 - slack_bot.llm.gemini - INFO - Using OpenRouter: https://openrouter.ai/api
2026-03-02 10:08:01 - slack_bot.llm.gemini - INFO - Initialized Gemini model: google/gemini-3-flash-preview
2026-03-02 10:08:01 - slack_bot.dispatcher - INFO - Using tool preset: all (21 tools)
2026-03-02 10:08:01 - slack_bot.dispatcher - INFO - Dispatcher initialized with Gemini
2026-03-02 10:08:01 - __main__ - INFO - Dispatcher initialized in 'all' mode
2026-03-02 10:08:01 - __main__ - INFO - ⚡️ Butler (Gemini) is connected to Slack!
⚡️ Bolt app is running!
2026-03-02 10:09:25 - __main__ - INFO - [64823544] 📥 Received message from U0A8ZCK7RJM in D0AA4GBQRKK: 今天打算轻断食，需要注意什么 (Files: 0)
2026-03-02 10:09:25 - slack_bot.dispatcher - INFO - [64823544] Processing message in D0AA4GBQRKK from U0A8ZCK7RJM
2026-03-02 10:09:25 - slack_bot.dispatcher - INFO - [64823544] Calling Gemini for initial response...
2026-03-02 10:09:25 - slack_bot.dispatcher - INFO - [64823544] Request config: model=google/gemini-3-flash-preview, tools=21, context=39 msgs
2026-03-02 10:09:33 - slack_bot.dispatcher - INFO - [64823544] Gemini response: text=1063 chars, tool_calls=0
2026-03-02 10:09:33 - slack_bot.dispatcher - INFO - [64823544] No tool calls from Gemini - checking SAFETY OVERRIDE keywords...
2026-03-02 10:09:33 - slack_bot.dispatcher - WARNING - [64823544] 🔧 SAFETY OVERRIDE: Forcing get_daily_detailed_stats for 2026-03-02
2026-03-02 10:09:33 - slack_bot.dispatcher - INFO - [64823544] No SAFETY OVERRIDE match found - will return empty response or text
2026-03-02 10:09:33 - slack_bot.dispatcher - INFO - [64823544] Gemini response in 8.06s: 1063 chars, 1 tools
2026-03-02 10:09:33 - slack_bot.dispatcher - INFO - [64823544] Executing 1 tools
2026-03-02 10:09:33 - slack_bot.dispatcher - INFO - [64823544] Tool: get_daily_detailed_stats Args: {'target_date': '2026-03-02'}
2026-03-02 10:09:33 - health.services.query - INFO - Querying health data summary for 2026-03-02
2026-03-02 10:09:33 - health.services.query - INFO - Found 0 metrics and 0 activities
2026-03-02 10:09:33 - slack_bot.tools.health_read - INFO - Data missing for 2026-03-02, attempting auto-sync...
2026-03-02 10:09:33 - health.services.data_sync - INFO - Authenticating with Garmin...
2026-03-02 10:09:33 - health.services.garmin_client - INFO - Authenticating with Garmin Connect China for 350134531@qq.com
2026-03-02 10:09:35 - health.services.garmin_client - INFO - Successfully authenticated with Garmin Connect China
2026-03-02 10:09:35 - health.services.data_sync - INFO - Authentication successful
2026-03-02 10:09:35 - health.services.data_sync - INFO - Syncing 13 metric types from 2026-03-02 to 2026-03-02
2026-03-02 10:09:35 - health.services.data_sync - INFO - Syncing steps from 2026-03-02 to 2026-03-02 (1 days)
2026-03-02 10:09:35 - health.services.data_sync - INFO - ✓ Synced steps for 2026-03-02
2026-03-02 10:09:35 - health.services.data_sync - INFO - steps sync complete: 1 synced, 0 skipped, 0 errors
2026-03-02 10:09:35 - health.services.data_sync - INFO - Syncing heart_rate from 2026-03-02 to 2026-03-02 (1 days)
2026-03-02 10:09:35 - health.services.data_sync - INFO - ✓ Synced heart_rate for 2026-03-02
2026-03-02 10:09:35 - health.services.data_sync - INFO - heart_rate sync complete: 1 synced, 0 skipped, 0 errors
2026-03-02 10:09:35 - health.services.data_sync - INFO - Syncing sleep from 2026-03-02 to 2026-03-02 (1 days)
2026-03-02 10:09:35 - health.services.data_sync - INFO - ✓ Synced sleep for 2026-03-02
2026-03-02 10:09:35 - health.services.data_sync - INFO - sleep sync complete: 1 synced, 0 skipped, 0 errors
2026-03-02 10:09:35 - health.services.data_sync - INFO - Syncing stress from 2026-03-02 to 2026-03-02 (1 days)
2026-03-02 10:09:35 - health.services.data_sync - INFO - ✓ Synced stress for 2026-03-02
2026-03-02 10:09:35 - health.services.data_sync - INFO - stress sync complete: 1 synced, 0 skipped, 0 errors
2026-03-02 10:09:35 - health.services.data_sync - INFO - Syncing body_battery from 2026-03-02 to 2026-03-02 (1 days)
2026-03-02 10:09:35 - health.services.data_sync - INFO - ✓ Synced body_battery for 2026-03-02
2026-03-02 10:09:35 - health.services.data_sync - INFO - body_battery sync complete: 1 synced, 0 skipped, 0 errors
2026-03-02 10:09:35 - health.services.data_sync - INFO - Syncing spo2 from 2026-03-02 to 2026-03-02 (1 days)
2026-03-02 10:09:36 - health.services.data_sync - INFO - ✓ Synced spo2 for 2026-03-02
2026-03-02 10:09:36 - health.services.data_sync - INFO - spo2 sync complete: 1 synced, 0 skipped, 0 errors
2026-03-02 10:09:36 - health.services.data_sync - INFO - Syncing respiration from 2026-03-02 to 2026-03-02 (1 days)
2026-03-02 10:09:36 - health.services.data_sync - INFO - ✓ Synced respiration for 2026-03-02
2026-03-02 10:09:36 - health.services.data_sync - INFO - respiration sync complete: 1 synced, 0 skipped, 0 errors
2026-03-02 10:09:36 - health.services.data_sync - INFO - Syncing hydration from 2026-03-02 to 2026-03-02 (1 days)
2026-03-02 10:09:36 - health.services.data_sync - INFO - ✓ Synced hydration for 2026-03-02
2026-03-02 10:09:36 - health.services.data_sync - INFO - hydration sync complete: 1 synced, 0 skipped, 0 errors
2026-03-02 10:09:36 - health.services.data_sync - INFO - Syncing floors from 2026-03-02 to 2026-03-02 (1 days)
2026-03-02 10:09:36 - health.services.data_sync - INFO - ✓ Synced floors for 2026-03-02
2026-03-02 10:09:36 - health.services.data_sync - INFO - floors sync complete: 1 synced, 0 skipped, 0 errors
2026-03-02 10:09:36 - health.services.data_sync - INFO - Syncing intensity_minutes from 2026-03-02 to 2026-03-02 (1 days)
2026-03-02 10:09:36 - health.services.data_sync - INFO - ✓ Synced intensity_minutes for 2026-03-02
2026-03-02 10:09:36 - health.services.data_sync - INFO - intensity_minutes sync complete: 1 synced, 0 skipped, 0 errors
2026-03-02 10:09:36 - health.services.data_sync - INFO - Syncing hrv from 2026-03-02 to 2026-03-02 (1 days)
2026-03-02 10:09:36 - health.services.data_sync - INFO - ✓ Synced hrv for 2026-03-02
2026-03-02 10:09:36 - health.services.data_sync - INFO - hrv sync complete: 1 synced, 0 skipped, 0 errors
2026-03-02 10:09:36 - health.services.data_sync - INFO - Syncing rhr from 2026-03-02 to 2026-03-02 (1 days)
2026-03-02 10:09:36 - health.services.data_sync - INFO - ✓ Synced rhr for 2026-03-02
2026-03-02 10:09:36 - health.services.data_sync - INFO - rhr sync complete: 1 synced, 0 skipped, 0 errors
2026-03-02 10:09:36 - health.services.data_sync - INFO - Syncing weight from 2026-03-02 to 2026-03-02 (1 days)
2026-03-02 10:09:36 - health.services.data_sync - INFO - weight sync complete: 0 synced, 1 skipped, 0 errors
2026-03-02 10:09:36 - health.services.data_sync - INFO - Syncing activities from 2026-03-02 to 2026-03-02
2026-03-02 10:09:36 - health.services.data_sync - INFO - Found 0 activities
2026-03-02 10:09:36 - health.services.data_sync - INFO - Activity sync complete: 0 synced, 0 skipped, 0 errors
2026-03-02 10:09:36 - health.services.query - INFO - Querying health data summary for 2026-03-02
2026-03-02 10:09:36 - health.services.query - INFO - Found 12 metrics and 0 activities
2026-03-02 10:09:36 - slack_bot.tools.health_read - INFO - Auto-sync completed, re-queried data.
2026-03-02 10:09:36 - slack_bot.dispatcher - INFO - [64823544] ✓ get_daily_detailed_stats finished in 2.95s
2026-03-02 10:09:36 - slack_bot.dispatcher - INFO - [64823544] Requesting final analysis...
2026-03-02 10:09:41 - slack_bot.dispatcher - INFO - [64823544] Final analysis received in 5.03s
2026-03-02 10:09:41 - slack_bot.dispatcher - INFO - Formatted text (len 660 -> 636)
2026-03-02 10:09:42 - slack_bot.dispatcher - INFO - [64823544] 📤 Message updated 1772417365.758139
2026-03-02 10:09:42 - slack_bot.dispatcher - INFO - [64823544] Dispatch completed in 16.41s
2026-03-02 10:09:42 - __main__ - INFO - [64823544] ✅ Request completed in 16.74s
2026-03-02 10:16:13 - health.utils.env_loader - INFO - Loading extra configuration from: /root/projects/butler/.gemini.current.env
2026-03-02 10:16:13 - __main__ - INFO - Starting Butler Bot with configuration:
2026-03-02 10:16:13 - __main__ - INFO -   Config file: .gemini.current.env
2026-03-02 10:16:13 - __main__ - INFO -   Model: google/gemini-3-flash-preview
2026-03-02 10:16:13 - __main__ - INFO -   Base URL: https://openrouter.ai/api
2026-03-02 10:16:13 - __main__ - INFO -   Using proxy: Yes
2026-03-02 10:16:14 - slack_bot.llm.gemini - INFO - Using OpenRouter: https://openrouter.ai/api
2026-03-02 10:16:14 - slack_bot.llm.gemini - INFO - Initialized Gemini model: google/gemini-3-flash-preview
2026-03-02 10:16:14 - slack_bot.dispatcher - INFO - Using tool preset: all (21 tools)
2026-03-02 10:16:14 - slack_bot.dispatcher - INFO - Dispatcher initialized with Gemini
2026-03-02 10:16:14 - __main__ - INFO - Dispatcher initialized in 'all' mode
2026-03-02 10:16:14 - __main__ - INFO - ⚡️ Butler (Gemini) is connected to Slack!
⚡️ Bolt app is running!
2026-03-02 10:18:00 - __main__ - INFO - [25195eb6] 📥 Received message from U0A8ZCK7RJM in D0AA4GBQRKK: 好的，因为昨天有点胸闷，今天先不运动了，明天再开始。可能是因为昨天喝了一大杯美式导致的胸闷 (Files: 0)
2026-03-02 10:18:01 - slack_bot.dispatcher - INFO - [25195eb6] Processing message in D0AA4GBQRKK from U0A8ZCK7RJM
2026-03-02 10:18:01 - slack_bot.dispatcher - INFO - [25195eb6] Calling Gemini for initial response...
2026-03-02 10:18:01 - slack_bot.dispatcher - INFO - [25195eb6] Request config: model=google/gemini-3-flash-preview, tools=21, context=39 msgs
2026-03-02 10:18:09 - slack_bot.dispatcher - INFO - [25195eb6] Gemini response: text=1050 chars, tool_calls=0
2026-03-02 10:18:09 - slack_bot.dispatcher - INFO - [25195eb6] No tool calls from Gemini - checking SAFETY OVERRIDE keywords...
2026-03-02 10:18:09 - slack_bot.dispatcher - WARNING - [25195eb6] 🔧 SAFETY OVERRIDE: Forcing get_activity_history for 2026-03-01
2026-03-02 10:18:09 - slack_bot.dispatcher - INFO - [25195eb6] No SAFETY OVERRIDE match found - will return empty response or text
2026-03-02 10:18:09 - slack_bot.dispatcher - INFO - [25195eb6] Gemini response in 8.38s: 1050 chars, 1 tools
2026-03-02 10:18:09 - slack_bot.dispatcher - INFO - [25195eb6] Executing 1 tools
2026-03-02 10:18:09 - slack_bot.dispatcher - INFO - [25195eb6] Tool: get_activity_history Args: {'start_date': '2026-03-01', 'end_date': '2026-03-01'}
2026-03-02 10:18:09 - health.services.query - INFO - Querying activities from 2026-03-01 to 2026-03-01
2026-03-02 10:18:09 - health.services.storage - WARNING - Activity 569256212 indexed but file not found: /Users/lili/workspace/bulter/data/health/activities/2026/03/569256212.json
2026-03-02 10:18:09 - health.services.query - INFO - Found 0 activities
2026-03-02 10:18:09 - slack_bot.dispatcher - INFO - [25195eb6] ✓ get_activity_history finished in 0.00s
2026-03-02 10:18:09 - slack_bot.dispatcher - INFO - [25195eb6] Requesting final analysis...
2026-03-02 10:18:14 - slack_bot.dispatcher - INFO - [25195eb6] Final analysis received in 4.36s
2026-03-02 10:18:14 - slack_bot.dispatcher - INFO - Formatted text (len 481 -> 463)
2026-03-02 10:18:14 - slack_bot.dispatcher - INFO - [25195eb6] 📤 Message updated 1772417881.150569
2026-03-02 10:18:14 - slack_bot.dispatcher - INFO - [25195eb6] Dispatch completed in 13.06s
2026-03-02 10:18:14 - __main__ - INFO - [25195eb6] ✅ Request completed in 13.39s
2026-03-02 14:01:23 - __main__ - INFO - [1cd5ae4b] 📥 Received message from U0A8ZCK7RJM in D0AA4GBQRKK: 今天轻断食失败，中午晚上都有应酬，不过好在是早上没吃 (Files: 0)
2026-03-02 14:01:23 - slack_bot.dispatcher - INFO - [1cd5ae4b] Processing message in D0AA4GBQRKK from U0A8ZCK7RJM
2026-03-02 14:01:23 - slack_bot.dispatcher - INFO - [1cd5ae4b] Calling Gemini for initial response...
2026-03-02 14:01:23 - slack_bot.dispatcher - INFO - [1cd5ae4b] Request config: model=google/gemini-3-flash-preview, tools=21, context=39 msgs
2026-03-02 14:01:30 - slack_bot.dispatcher - INFO - [1cd5ae4b] Gemini response: text=788 chars, tool_calls=0
2026-03-02 14:01:30 - slack_bot.dispatcher - INFO - [1cd5ae4b] No tool calls from Gemini - checking SAFETY OVERRIDE keywords...
2026-03-02 14:01:30 - slack_bot.dispatcher - WARNING - [1cd5ae4b] 🔧 SAFETY OVERRIDE: Forcing get_daily_detailed_stats for 2026-03-02
2026-03-02 14:01:30 - slack_bot.dispatcher - INFO - [1cd5ae4b] No SAFETY OVERRIDE match found - will return empty response or text
2026-03-02 14:01:30 - slack_bot.dispatcher - INFO - [1cd5ae4b] Gemini response in 6.83s: 788 chars, 1 tools
2026-03-02 14:01:30 - slack_bot.dispatcher - INFO - [1cd5ae4b] Executing 1 tools
2026-03-02 14:01:30 - slack_bot.dispatcher - INFO - [1cd5ae4b] Tool: get_daily_detailed_stats Args: {'target_date': '2026-03-02'}
2026-03-02 14:01:30 - health.services.query - INFO - Querying health data summary for 2026-03-02
2026-03-02 14:01:30 - health.services.query - INFO - Found 12 metrics and 0 activities
2026-03-02 14:01:30 - slack_bot.dispatcher - INFO - [1cd5ae4b] ✓ get_daily_detailed_stats finished in 0.01s
2026-03-02 14:01:30 - slack_bot.dispatcher - INFO - [1cd5ae4b] Requesting final analysis...
2026-03-02 14:01:35 - slack_bot.dispatcher - INFO - [1cd5ae4b] Final analysis received in 4.68s
2026-03-02 14:01:35 - slack_bot.dispatcher - INFO - Formatted text (len 538 -> 514)
2026-03-02 14:01:35 - slack_bot.dispatcher - INFO - [1cd5ae4b] 📤 Message updated 1772431283.717909
2026-03-02 14:01:35 - slack_bot.dispatcher - INFO - [1cd5ae4b] Dispatch completed in 11.85s
2026-03-02 14:01:35 - __main__ - INFO - [1cd5ae4b] ✅ Request completed in 12.16s
2026-03-02 16:28:45 - health.utils.env_loader - INFO - Loading extra configuration from: /root/projects/butler/.gemini.current.env
2026-03-02 16:28:45 - __main__ - INFO - Starting Butler Bot with configuration:
2026-03-02 16:28:45 - __main__ - INFO -   Config file: .gemini.current.env
2026-03-02 16:28:45 - __main__ - INFO -   Model: google/gemini-3-flash-preview
2026-03-02 16:28:45 - __main__ - INFO -   Base URL: https://openrouter.ai/api
2026-03-02 16:28:45 - __main__ - INFO -   Using proxy: Yes
2026-03-02 16:28:46 - slack_bot.llm.gemini - INFO - Using OpenRouter: https://openrouter.ai/api
2026-03-02 16:28:46 - slack_bot.llm.gemini - INFO - Initialized Gemini model: google/gemini-3-flash-preview
2026-03-02 16:28:46 - slack_bot.dispatcher - INFO - Using tool preset: all (21 tools)
2026-03-02 16:28:46 - slack_bot.dispatcher - INFO - Dispatcher initialized with Gemini
2026-03-02 16:28:46 - __main__ - INFO - Dispatcher initialized in 'all' mode
2026-03-02 16:28:46 - __main__ - INFO - ⚡️ Butler (Gemini) is connected to Slack!
⚡️ Bolt app is running!
2026-03-02 16:29:26 - __main__ - INFO - [f55ace3f] 📥 Received message from U0A8ZCK7RJM in D0AA4GBQRKK: 同步佳明数据，看下今日步数 (Files: 0)
2026-03-02 16:29:26 - slack_bot.dispatcher - INFO - [f55ace3f] Processing message in D0AA4GBQRKK from U0A8ZCK7RJM
2026-03-02 16:29:26 - slack_bot.dispatcher - INFO - [f55ace3f] Calling Gemini for initial response...
2026-03-02 16:29:26 - slack_bot.dispatcher - INFO - [f55ace3f] Request config: model=google/gemini-3-flash-preview, tools=21, context=39 msgs
2026-03-02 16:29:29 - slack_bot.dispatcher - WARNING - [f55ace3f] Gemini returned empty response_text! (This usually means the proxy has issues)
2026-03-02 16:29:29 - slack_bot.dispatcher - INFO - [f55ace3f] Gemini response: text=0 chars, tool_calls=2
2026-03-02 16:29:29 - slack_bot.dispatcher - INFO - [f55ace3f] Tool calls successfully generated by Gemini (no SAFETY OVERRIDE needed)
2026-03-02 16:29:29 - slack_bot.dispatcher - INFO - [f55ace3f] Gemini response in 2.93s: 0 chars, 2 tools
2026-03-02 16:29:29 - slack_bot.dispatcher - INFO - [f55ace3f] Executing 2 tools
2026-03-02 16:29:29 - slack_bot.dispatcher - INFO - [f55ace3f] Tool: sync_garmin Args: {'target_date': '2026-03-02'}
2026-03-02 16:29:29 - slack_bot.tools.garmin - INFO - Starting Garmin sync for 2026-03-02...
2026-03-02 16:29:29 - health.services.data_sync - INFO - Authenticating with Garmin...
2026-03-02 16:29:29 - health.services.garmin_client - INFO - Authenticating with Garmin Connect China for 350134531@qq.com
2026-03-02 16:29:30 - health.services.garmin_client - INFO - Successfully authenticated with Garmin Connect China
2026-03-02 16:29:30 - health.services.data_sync - INFO - Authentication successful
2026-03-02 16:29:30 - health.services.data_sync - INFO - Syncing 13 metric types from 2026-03-02 to 2026-03-02
2026-03-02 16:29:30 - health.services.data_sync - INFO - Syncing steps from 2026-03-02 to 2026-03-02 (1 days)
2026-03-02 16:29:30 - health.services.data_sync - INFO - ✓ Synced steps for 2026-03-02
2026-03-02 16:29:30 - health.services.data_sync - INFO - steps sync complete: 1 synced, 0 skipped, 0 errors
2026-03-02 16:29:30 - health.services.data_sync - INFO - Syncing heart_rate from 2026-03-02 to 2026-03-02 (1 days)
2026-03-02 16:29:30 - health.services.data_sync - INFO - ✓ Synced heart_rate for 2026-03-02
2026-03-02 16:29:30 - health.services.data_sync - INFO - heart_rate sync complete: 1 synced, 0 skipped, 0 errors
2026-03-02 16:29:30 - health.services.data_sync - INFO - Syncing sleep from 2026-03-02 to 2026-03-02 (1 days)
2026-03-02 16:29:31 - health.services.data_sync - INFO - ✓ Synced sleep for 2026-03-02
2026-03-02 16:29:31 - health.services.data_sync - INFO - sleep sync complete: 1 synced, 0 skipped, 0 errors
2026-03-02 16:29:31 - health.services.data_sync - INFO - Syncing stress from 2026-03-02 to 2026-03-02 (1 days)
2026-03-02 16:29:31 - health.services.data_sync - INFO - ✓ Synced stress for 2026-03-02
2026-03-02 16:29:31 - health.services.data_sync - INFO - stress sync complete: 1 synced, 0 skipped, 0 errors
2026-03-02 16:29:31 - health.services.data_sync - INFO - Syncing body_battery from 2026-03-02 to 2026-03-02 (1 days)
2026-03-02 16:29:31 - health.services.data_sync - INFO - ✓ Synced body_battery for 2026-03-02
2026-03-02 16:29:31 - health.services.data_sync - INFO - body_battery sync complete: 1 synced, 0 skipped, 0 errors
2026-03-02 16:29:31 - health.services.data_sync - INFO - Syncing spo2 from 2026-03-02 to 2026-03-02 (1 days)
2026-03-02 16:29:31 - health.services.data_sync - INFO - ✓ Synced spo2 for 2026-03-02
2026-03-02 16:29:31 - health.services.data_sync - INFO - spo2 sync complete: 1 synced, 0 skipped, 0 errors
2026-03-02 16:29:31 - health.services.data_sync - INFO - Syncing respiration from 2026-03-02 to 2026-03-02 (1 days)
2026-03-02 16:29:31 - health.services.data_sync - INFO - ✓ Synced respiration for 2026-03-02
2026-03-02 16:29:31 - health.services.data_sync - INFO - respiration sync complete: 1 synced, 0 skipped, 0 errors
2026-03-02 16:29:31 - health.services.data_sync - INFO - Syncing hydration from 2026-03-02 to 2026-03-02 (1 days)
2026-03-02 16:29:32 - health.services.data_sync - INFO - ✓ Synced hydration for 2026-03-02
2026-03-02 16:29:32 - health.services.data_sync - INFO - hydration sync complete: 1 synced, 0 skipped, 0 errors
2026-03-02 16:29:32 - health.services.data_sync - INFO - Syncing floors from 2026-03-02 to 2026-03-02 (1 days)
2026-03-02 16:29:32 - health.services.data_sync - INFO - ✓ Synced floors for 2026-03-02
2026-03-02 16:29:32 - health.services.data_sync - INFO - floors sync complete: 1 synced, 0 skipped, 0 errors
2026-03-02 16:29:32 - health.services.data_sync - INFO - Syncing intensity_minutes from 2026-03-02 to 2026-03-02 (1 days)
2026-03-02 16:29:32 - health.services.data_sync - INFO - ✓ Synced intensity_minutes for 2026-03-02
2026-03-02 16:29:32 - health.services.data_sync - INFO - intensity_minutes sync complete: 1 synced, 0 skipped, 0 errors
2026-03-02 16:29:32 - health.services.data_sync - INFO - Syncing hrv from 2026-03-02 to 2026-03-02 (1 days)
2026-03-02 16:29:32 - health.services.data_sync - INFO - ✓ Synced hrv for 2026-03-02
2026-03-02 16:29:32 - health.services.data_sync - INFO - hrv sync complete: 1 synced, 0 skipped, 0 errors
2026-03-02 16:29:32 - health.services.data_sync - INFO - Syncing rhr from 2026-03-02 to 2026-03-02 (1 days)
2026-03-02 16:29:32 - health.services.data_sync - INFO - ✓ Synced rhr for 2026-03-02
2026-03-02 16:29:32 - health.services.data_sync - INFO - rhr sync complete: 1 synced, 0 skipped, 0 errors
2026-03-02 16:29:32 - health.services.data_sync - INFO - Syncing weight from 2026-03-02 to 2026-03-02 (1 days)
2026-03-02 16:29:32 - health.services.data_sync - INFO - weight sync complete: 0 synced, 1 skipped, 0 errors
2026-03-02 16:29:32 - health.services.data_sync - INFO - Syncing activities from 2026-03-02 to 2026-03-02
2026-03-02 16:29:32 - health.services.data_sync - INFO - Found 0 activities
2026-03-02 16:29:32 - health.services.data_sync - INFO - Activity sync complete: 0 synced, 0 skipped, 0 errors
2026-03-02 16:29:32 - health.services.query - INFO - Querying health data summary for 2026-03-02
2026-03-02 16:29:32 - health.services.query - INFO - Found 12 metrics and 0 activities
2026-03-02 16:29:32 - slack_bot.dispatcher - INFO - [f55ace3f] ✓ sync_garmin finished in 3.43s
2026-03-02 16:29:32 - slack_bot.dispatcher - INFO - [f55ace3f] Tool: get_daily_detailed_stats Args: {'target_date': '2026-03-02'}
2026-03-02 16:29:32 - health.services.query - INFO - Querying health data summary for 2026-03-02
2026-03-02 16:29:32 - health.services.query - INFO - Found 12 metrics and 0 activities
2026-03-02 16:29:32 - slack_bot.dispatcher - INFO - [f55ace3f] ✓ get_daily_detailed_stats finished in 0.01s
2026-03-02 16:29:32 - slack_bot.dispatcher - INFO - [f55ace3f] Requesting final analysis...
2026-03-02 16:29:36 - slack_bot.dispatcher - INFO - [f55ace3f] Final analysis received in 3.44s
2026-03-02 16:29:36 - slack_bot.dispatcher - INFO - Formatted text (len 329 -> 319)
2026-03-02 16:29:36 - slack_bot.dispatcher - INFO - [f55ace3f] 📤 Message updated 1772440166.189969
2026-03-02 16:29:36 - slack_bot.dispatcher - INFO - [f55ace3f] Dispatch completed in 10.16s
2026-03-02 16:29:36 - __main__ - INFO - [f55ace3f] ✅ Request completed in 10.49s
2026-03-02 19:08:03 - health.utils.env_loader - INFO - Loading extra configuration from: /root/projects/butler/.gemini.current.env
2026-03-02 19:08:03 - __main__ - INFO - Starting Butler Bot with configuration:
2026-03-02 19:08:03 - __main__ - INFO -   Config file: .gemini.current.env
2026-03-02 19:08:03 - __main__ - INFO -   Model: google/gemini-3-flash-preview
2026-03-02 19:08:03 - __main__ - INFO -   Base URL: https://openrouter.ai/api
2026-03-02 19:08:03 - __main__ - INFO -   Using proxy: Yes
2026-03-02 19:08:03 - slack_bot.llm.gemini - INFO - Using OpenRouter: https://openrouter.ai/api
2026-03-02 19:08:03 - slack_bot.llm.gemini - INFO - Initialized Gemini model: google/gemini-3-flash-preview
2026-03-02 19:08:03 - slack_bot.dispatcher - INFO - Using tool preset: all (21 tools)
2026-03-02 19:08:03 - slack_bot.dispatcher - INFO - Dispatcher initialized with Gemini
2026-03-02 19:08:03 - __main__ - INFO - Dispatcher initialized in 'all' mode
2026-03-02 19:08:03 - __main__ - INFO - ⚡️ Butler (Gemini) is connected to Slack!
⚡️ Bolt app is running!
2026-03-02 19:09:01 - __main__ - INFO - [70762336] 📥 Received message from U0A8ZCK7RJM in D0AA4GBQRKK: 晚饭吃湘菜，有什么建议 (Files: 0)
2026-03-02 19:09:02 - slack_bot.dispatcher - INFO - [70762336] Processing message in D0AA4GBQRKK from U0A8ZCK7RJM
2026-03-02 19:09:02 - slack_bot.dispatcher - INFO - [70762336] Calling Gemini for initial response...
2026-03-02 19:09:02 - slack_bot.dispatcher - INFO - [70762336] Request config: model=google/gemini-3-flash-preview, tools=21, context=39 msgs
2026-03-02 19:09:09 - slack_bot.dispatcher - INFO - [70762336] Gemini response: text=814 chars, tool_calls=0
2026-03-02 19:09:09 - slack_bot.dispatcher - INFO - [70762336] No tool calls from Gemini - checking SAFETY OVERRIDE keywords...
2026-03-02 19:09:09 - slack_bot.dispatcher - INFO - [70762336] No SAFETY OVERRIDE match found - will return empty response or text
2026-03-02 19:09:09 - slack_bot.dispatcher - INFO - [70762336] Gemini response in 7.31s: 814 chars, 0 tools
2026-03-02 19:09:09 - slack_bot.dispatcher - INFO - Formatted text (len 814 -> 778)
2026-03-02 19:09:09 - slack_bot.dispatcher - INFO - [70762336] 📤 Message updated 1772449741.999599
2026-03-02 19:09:09 - slack_bot.dispatcher - INFO - [70762336] Dispatch completed in 7.64s
2026-03-02 19:09:09 - __main__ - INFO - [70762336] ✅ Request completed in 7.97s
2026-03-03 09:59:40 - __main__ - INFO - [c78ca8ba] 📥 Received message from U0A8ZCK7RJM in D0AA4GBQRKK: 同步佳明数据并分析 (Files: 0)
2026-03-03 09:59:40 - slack_bot.dispatcher - INFO - [c78ca8ba] Processing message in D0AA4GBQRKK from U0A8ZCK7RJM
2026-03-03 09:59:40 - slack_bot.dispatcher - INFO - [c78ca8ba] Calling Gemini for initial response...
2026-03-03 09:59:40 - slack_bot.dispatcher - INFO - [c78ca8ba] Request config: model=google/gemini-3-flash-preview, tools=21, context=39 msgs
2026-03-03 09:59:43 - slack_bot.dispatcher - WARNING - [c78ca8ba] Gemini returned empty response_text! (This usually means the proxy has issues)
2026-03-03 09:59:43 - slack_bot.dispatcher - INFO - [c78ca8ba] Gemini response: text=0 chars, tool_calls=3
2026-03-03 09:59:43 - slack_bot.dispatcher - INFO - [c78ca8ba] Tool calls successfully generated by Gemini (no SAFETY OVERRIDE needed)
2026-03-03 09:59:43 - slack_bot.dispatcher - INFO - [c78ca8ba] Gemini response in 2.60s: 0 chars, 3 tools
2026-03-03 09:59:43 - slack_bot.dispatcher - INFO - [c78ca8ba] Executing 3 tools
2026-03-03 09:59:43 - slack_bot.dispatcher - INFO - [c78ca8ba] Tool: sync_garmin Args: {'target_date': '2026-03-03'}
2026-03-03 09:59:43 - slack_bot.tools.garmin - INFO - Starting Garmin sync for 2026-03-03...
2026-03-03 09:59:43 - health.services.data_sync - INFO - Authenticating with Garmin...
2026-03-03 09:59:43 - health.services.garmin_client - INFO - Authenticating with Garmin Connect China for 350134531@qq.com
2026-03-03 09:59:44 - health.services.garmin_client - INFO - Successfully authenticated with Garmin Connect China
2026-03-03 09:59:44 - health.services.data_sync - INFO - Authentication successful
2026-03-03 09:59:44 - health.services.data_sync - INFO - Syncing 14 metric types from 2026-03-03 to 2026-03-03
2026-03-03 09:59:44 - health.services.data_sync - INFO - Syncing steps from 2026-03-03 to 2026-03-03 (1 days)
2026-03-03 09:59:44 - health.services.data_sync - INFO - ✓ Synced steps for 2026-03-03
2026-03-03 09:59:44 - health.services.data_sync - INFO - steps sync complete: 1 synced, 0 skipped, 0 errors
2026-03-03 09:59:44 - health.services.data_sync - INFO - Syncing heart_rate from 2026-03-03 to 2026-03-03 (1 days)
2026-03-03 09:59:44 - health.services.data_sync - INFO - ✓ Synced heart_rate for 2026-03-03
2026-03-03 09:59:44 - health.services.data_sync - INFO - heart_rate sync complete: 1 synced, 0 skipped, 0 errors
2026-03-03 09:59:44 - health.services.data_sync - INFO - Syncing sleep from 2026-03-03 to 2026-03-03 (1 days)
2026-03-03 09:59:44 - health.services.data_sync - INFO - ✓ Synced sleep for 2026-03-03
2026-03-03 09:59:44 - health.services.data_sync - INFO - sleep sync complete: 1 synced, 0 skipped, 0 errors
2026-03-03 09:59:44 - health.services.data_sync - INFO - Syncing stress from 2026-03-03 to 2026-03-03 (1 days)
2026-03-03 09:59:45 - health.services.data_sync - INFO - ✓ Synced stress for 2026-03-03
2026-03-03 09:59:45 - health.services.data_sync - INFO - stress sync complete: 1 synced, 0 skipped, 0 errors
2026-03-03 09:59:45 - health.services.data_sync - INFO - Syncing body_battery from 2026-03-03 to 2026-03-03 (1 days)
2026-03-03 09:59:45 - health.services.data_sync - INFO - ✓ Synced body_battery for 2026-03-03
2026-03-03 09:59:45 - health.services.data_sync - INFO - body_battery sync complete: 1 synced, 0 skipped, 0 errors
2026-03-03 09:59:45 - health.services.data_sync - INFO - Syncing spo2 from 2026-03-03 to 2026-03-03 (1 days)
2026-03-03 09:59:45 - health.services.data_sync - INFO - ✓ Synced spo2 for 2026-03-03
2026-03-03 09:59:45 - health.services.data_sync - INFO - spo2 sync complete: 1 synced, 0 skipped, 0 errors
2026-03-03 09:59:45 - health.services.data_sync - INFO - Syncing respiration from 2026-03-03 to 2026-03-03 (1 days)
2026-03-03 09:59:45 - health.services.data_sync - INFO - ✓ Synced respiration for 2026-03-03
2026-03-03 09:59:45 - health.services.data_sync - INFO - respiration sync complete: 1 synced, 0 skipped, 0 errors
2026-03-03 09:59:45 - health.services.data_sync - INFO - Syncing hydration from 2026-03-03 to 2026-03-03 (1 days)
2026-03-03 09:59:45 - health.services.data_sync - INFO - ✓ Synced hydration for 2026-03-03
2026-03-03 09:59:45 - health.services.data_sync - INFO - hydration sync complete: 1 synced, 0 skipped, 0 errors
2026-03-03 09:59:45 - health.services.data_sync - INFO - Syncing floors from 2026-03-03 to 2026-03-03 (1 days)
2026-03-03 09:59:45 - health.services.data_sync - INFO - ✓ Synced floors for 2026-03-03
2026-03-03 09:59:45 - health.services.data_sync - INFO - floors sync complete: 1 synced, 0 skipped, 0 errors
2026-03-03 09:59:45 - health.services.data_sync - INFO - Syncing intensity_minutes from 2026-03-03 to 2026-03-03 (1 days)
2026-03-03 09:59:45 - health.services.data_sync - INFO - ✓ Synced intensity_minutes for 2026-03-03
2026-03-03 09:59:45 - health.services.data_sync - INFO - intensity_minutes sync complete: 1 synced, 0 skipped, 0 errors
2026-03-03 09:59:45 - health.services.data_sync - INFO - Syncing hrv from 2026-03-03 to 2026-03-03 (1 days)
2026-03-03 09:59:45 - health.services.data_sync - INFO - ✓ Synced hrv for 2026-03-03
2026-03-03 09:59:45 - health.services.data_sync - INFO - hrv sync complete: 1 synced, 0 skipped, 0 errors
2026-03-03 09:59:45 - health.services.data_sync - INFO - Syncing rhr from 2026-03-03 to 2026-03-03 (1 days)
2026-03-03 09:59:45 - health.services.data_sync - INFO - ✓ Synced rhr for 2026-03-03
2026-03-03 09:59:45 - health.services.data_sync - INFO - rhr sync complete: 1 synced, 0 skipped, 0 errors
2026-03-03 09:59:45 - health.services.data_sync - INFO - Syncing weight from 2026-03-03 to 2026-03-03 (1 days)
2026-03-03 09:59:45 - health.services.data_sync - INFO - weight sync complete: 0 synced, 1 skipped, 0 errors
2026-03-03 09:59:45 - health.services.data_sync - INFO - Syncing lifestyle_logging from 2026-03-03 to 2026-03-03 (1 days)
2026-03-03 09:59:46 - health.services.data_sync - INFO - lifestyle_logging sync complete: 0 synced, 1 skipped, 0 errors
2026-03-03 09:59:46 - health.services.data_sync - INFO - Syncing activities from 2026-03-03 to 2026-03-03
2026-03-03 09:59:46 - health.services.garmin_client - INFO - Fetched 1 activities
2026-03-03 09:59:46 - health.services.data_sync - INFO - Found 1 activities
2026-03-03 09:59:46 - health.services.data_sync - INFO - ✓ Synced activity 569783601 (elliptical) on 2026-03-03
2026-03-03 09:59:46 - health.services.data_sync - INFO - Activity sync complete: 1 synced, 0 skipped, 0 errors
2026-03-03 09:59:46 - health.services.query - INFO - Querying health data summary for 2026-03-03
2026-03-03 09:59:46 - health.services.query - INFO - Found 12 metrics and 1 activities
2026-03-03 09:59:46 - slack_bot.dispatcher - INFO - [c78ca8ba] ✓ sync_garmin finished in 3.08s
2026-03-03 09:59:46 - slack_bot.dispatcher - INFO - [c78ca8ba] Tool: get_daily_detailed_stats Args: {'target_date': '2026-03-03'}
2026-03-03 09:59:46 - health.services.query - INFO - Querying health data summary for 2026-03-03
2026-03-03 09:59:46 - health.services.query - INFO - Found 12 metrics and 1 activities
2026-03-03 09:59:46 - slack_bot.dispatcher - INFO - [c78ca8ba] ✓ get_daily_detailed_stats finished in 0.01s
2026-03-03 09:59:46 - slack_bot.dispatcher - INFO - [c78ca8ba] Tool: get_activity_history Args: {'end_date': '2026-03-03', 'start_date': '2026-03-03'}
2026-03-03 09:59:46 - health.services.query - INFO - Querying activities from 2026-03-03 to 2026-03-03
2026-03-03 09:59:46 - health.services.query - INFO - Found 1 activities
2026-03-03 09:59:46 - slack_bot.dispatcher - INFO - [c78ca8ba] ✓ get_activity_history finished in 0.00s
2026-03-03 09:59:46 - slack_bot.dispatcher - INFO - [c78ca8ba] Requesting final analysis...
2026-03-03 09:59:53 - slack_bot.dispatcher - INFO - [c78ca8ba] Final analysis received in 7.56s
2026-03-03 09:59:53 - slack_bot.dispatcher - INFO - Formatted text (len 957 -> 911)
2026-03-03 09:59:54 - slack_bot.dispatcher - WARNING - [c78ca8ba] Update failed, posting new: The request to the Slack API failed. (url: https://slack.com/api/chat.update)
The server responded with: {'ok': False, 'error': 'msg_too_long'}
2026-03-03 09:59:54 - slack_bot.dispatcher - INFO - [c78ca8ba] Dispatch completed in 13.94s
2026-03-03 09:59:54 - __main__ - INFO - [c78ca8ba] ✅ Request completed in 14.27s
2026-03-03 16:26:19 - health.utils.env_loader - INFO - Loading extra configuration from: /root/projects/butler/.gemini.current.env
2026-03-03 16:26:19 - __main__ - INFO - Starting Butler Bot with configuration:
2026-03-03 16:26:19 - __main__ - INFO -   Config file: .gemini.current.env
2026-03-03 16:26:19 - __main__ - INFO -   Model: google/gemini-3-flash-preview
2026-03-03 16:26:19 - __main__ - INFO -   Base URL: https://openrouter.ai/api
2026-03-03 16:26:19 - __main__ - INFO -   Using proxy: Yes
2026-03-03 16:26:20 - slack_bot.llm.gemini - INFO - Using OpenRouter: https://openrouter.ai/api
2026-03-03 16:26:20 - slack_bot.llm.gemini - INFO - Initialized Gemini model: google/gemini-3-flash-preview
2026-03-03 16:26:20 - slack_bot.dispatcher - INFO - Using tool preset: all (21 tools)
2026-03-03 16:26:20 - slack_bot.dispatcher - INFO - Dispatcher initialized with Gemini
2026-03-03 16:26:20 - __main__ - INFO - Dispatcher initialized in 'all' mode
2026-03-03 16:26:20 - __main__ - INFO - ⚡️ Butler (Gemini) is connected to Slack!
⚡️ Bolt app is running!
2026-03-04 10:22:38 - __main__ - INFO - [3b16fd9e] 📥 Received message from U0A8ZCK7RJM in D0AA4GBQRKK: 同步佳明数据 (Files: 0)
2026-03-04 10:22:38 - slack_bot.dispatcher - INFO - [3b16fd9e] Processing message in D0AA4GBQRKK from U0A8ZCK7RJM
2026-03-04 10:22:38 - slack_bot.dispatcher - INFO - [3b16fd9e] Calling Gemini for initial response...
2026-03-04 10:22:38 - slack_bot.dispatcher - INFO - [3b16fd9e] Request config: model=google/gemini-3-flash-preview, tools=21, context=39 msgs
2026-03-04 10:22:41 - slack_bot.dispatcher - WARNING - [3b16fd9e] Gemini returned empty response_text! (This usually means the proxy has issues)
2026-03-04 10:22:41 - slack_bot.dispatcher - INFO - [3b16fd9e] Gemini response: text=0 chars, tool_calls=2
2026-03-04 10:22:41 - slack_bot.dispatcher - INFO - [3b16fd9e] Tool calls successfully generated by Gemini (no SAFETY OVERRIDE needed)
2026-03-04 10:22:41 - slack_bot.dispatcher - INFO - [3b16fd9e] Gemini response in 2.52s: 0 chars, 2 tools
2026-03-04 10:22:41 - slack_bot.dispatcher - INFO - [3b16fd9e] Executing 2 tools
2026-03-04 10:22:41 - slack_bot.dispatcher - INFO - [3b16fd9e] Tool: sync_garmin Args: {'target_date': '2026-03-04'}
2026-03-04 10:22:41 - slack_bot.tools.garmin - INFO - Starting Garmin sync for 2026-03-04...
2026-03-04 10:22:41 - health.services.data_sync - INFO - Authenticating with Garmin...
2026-03-04 10:22:41 - health.services.garmin_client - INFO - Authenticating with Garmin Connect China for 350134531@qq.com
2026-03-04 10:22:42 - health.services.garmin_client - INFO - Successfully authenticated with Garmin Connect China
2026-03-04 10:22:42 - health.services.data_sync - INFO - Authentication successful
2026-03-04 10:22:42 - health.services.data_sync - INFO - Syncing 14 metric types from 2026-03-04 to 2026-03-04
2026-03-04 10:22:42 - health.services.data_sync - INFO - Syncing steps from 2026-03-04 to 2026-03-04 (1 days)
2026-03-04 10:22:42 - health.services.data_sync - INFO - ✓ Synced steps for 2026-03-04
2026-03-04 10:22:42 - health.services.data_sync - INFO - steps sync complete: 1 synced, 0 skipped, 0 errors
2026-03-04 10:22:42 - health.services.data_sync - INFO - Syncing heart_rate from 2026-03-04 to 2026-03-04 (1 days)
2026-03-04 10:22:42 - health.services.data_sync - INFO - ✓ Synced heart_rate for 2026-03-04
2026-03-04 10:22:42 - health.services.data_sync - INFO - heart_rate sync complete: 1 synced, 0 skipped, 0 errors
2026-03-04 10:22:42 - health.services.data_sync - INFO - Syncing sleep from 2026-03-04 to 2026-03-04 (1 days)
2026-03-04 10:22:43 - health.services.data_sync - INFO - ✓ Synced sleep for 2026-03-04
2026-03-04 10:22:43 - health.services.data_sync - INFO - sleep sync complete: 1 synced, 0 skipped, 0 errors
2026-03-04 10:22:43 - health.services.data_sync - INFO - Syncing stress from 2026-03-04 to 2026-03-04 (1 days)
2026-03-04 10:22:43 - health.services.data_sync - INFO - ✓ Synced stress for 2026-03-04
2026-03-04 10:22:43 - health.services.data_sync - INFO - stress sync complete: 1 synced, 0 skipped, 0 errors
2026-03-04 10:22:43 - health.services.data_sync - INFO - Syncing body_battery from 2026-03-04 to 2026-03-04 (1 days)
2026-03-04 10:22:43 - health.services.data_sync - INFO - ✓ Synced body_battery for 2026-03-04
2026-03-04 10:22:43 - health.services.data_sync - INFO - body_battery sync complete: 1 synced, 0 skipped, 0 errors
2026-03-04 10:22:43 - health.services.data_sync - INFO - Syncing spo2 from 2026-03-04 to 2026-03-04 (1 days)
2026-03-04 10:22:43 - health.services.data_sync - INFO - ✓ Synced spo2 for 2026-03-04
2026-03-04 10:22:43 - health.services.data_sync - INFO - spo2 sync complete: 1 synced, 0 skipped, 0 errors
2026-03-04 10:22:43 - health.services.data_sync - INFO - Syncing respiration from 2026-03-04 to 2026-03-04 (1 days)
2026-03-04 10:22:43 - health.services.data_sync - INFO - ✓ Synced respiration for 2026-03-04
2026-03-04 10:22:43 - health.services.data_sync - INFO - respiration sync complete: 1 synced, 0 skipped, 0 errors
2026-03-04 10:22:43 - health.services.data_sync - INFO - Syncing hydration from 2026-03-04 to 2026-03-04 (1 days)
2026-03-04 10:22:43 - health.services.data_sync - INFO - ✓ Synced hydration for 2026-03-04
2026-03-04 10:22:43 - health.services.data_sync - INFO - hydration sync complete: 1 synced, 0 skipped, 0 errors
2026-03-04 10:22:43 - health.services.data_sync - INFO - Syncing floors from 2026-03-04 to 2026-03-04 (1 days)
2026-03-04 10:22:43 - health.services.data_sync - INFO - ✓ Synced floors for 2026-03-04
2026-03-04 10:22:43 - health.services.data_sync - INFO - floors sync complete: 1 synced, 0 skipped, 0 errors
2026-03-04 10:22:43 - health.services.data_sync - INFO - Syncing intensity_minutes from 2026-03-04 to 2026-03-04 (1 days)
2026-03-04 10:22:44 - health.services.data_sync - INFO - ✓ Synced intensity_minutes for 2026-03-04
2026-03-04 10:22:44 - health.services.data_sync - INFO - intensity_minutes sync complete: 1 synced, 0 skipped, 0 errors
2026-03-04 10:22:44 - health.services.data_sync - INFO - Syncing hrv from 2026-03-04 to 2026-03-04 (1 days)
2026-03-04 10:22:44 - health.services.data_sync - INFO - ✓ Synced hrv for 2026-03-04
2026-03-04 10:22:44 - health.services.data_sync - INFO - hrv sync complete: 1 synced, 0 skipped, 0 errors
2026-03-04 10:22:44 - health.services.data_sync - INFO - Syncing rhr from 2026-03-04 to 2026-03-04 (1 days)
2026-03-04 10:22:44 - health.services.data_sync - INFO - ✓ Synced rhr for 2026-03-04
2026-03-04 10:22:44 - health.services.data_sync - INFO - rhr sync complete: 1 synced, 0 skipped, 0 errors
2026-03-04 10:22:44 - health.services.data_sync - INFO - Syncing weight from 2026-03-04 to 2026-03-04 (1 days)
2026-03-04 10:22:44 - health.services.data_sync - INFO - weight sync complete: 0 synced, 1 skipped, 0 errors
2026-03-04 10:22:44 - health.services.data_sync - INFO - Syncing lifestyle_logging from 2026-03-04 to 2026-03-04 (1 days)
2026-03-04 10:22:44 - health.services.data_sync - INFO - lifestyle_logging sync complete: 0 synced, 1 skipped, 0 errors
2026-03-04 10:22:44 - health.services.data_sync - INFO - Syncing activities from 2026-03-04 to 2026-03-04
2026-03-04 10:22:44 - health.services.garmin_client - INFO - Fetched 1 activities
2026-03-04 10:22:44 - health.services.data_sync - INFO - Found 1 activities
2026-03-04 10:22:44 - health.services.data_sync - INFO - ✓ Synced activity 570064993 (elliptical) on 2026-03-04
2026-03-04 10:22:44 - health.services.data_sync - INFO - Activity sync complete: 1 synced, 0 skipped, 0 errors
2026-03-04 10:22:44 - health.services.query - INFO - Querying health data summary for 2026-03-04
2026-03-04 10:22:44 - health.services.query - INFO - Found 12 metrics and 1 activities
2026-03-04 10:22:44 - slack_bot.dispatcher - INFO - [3b16fd9e] ✓ sync_garmin finished in 3.22s
2026-03-04 10:22:44 - slack_bot.dispatcher - INFO - [3b16fd9e] Tool: get_daily_detailed_stats Args: {'target_date': '2026-03-04'}
2026-03-04 10:22:44 - health.services.query - INFO - Querying health data summary for 2026-03-04
2026-03-04 10:22:44 - health.services.query - INFO - Found 12 metrics and 1 activities
2026-03-04 10:22:44 - slack_bot.dispatcher - INFO - [3b16fd9e] ✓ get_daily_detailed_stats finished in 0.01s
2026-03-04 10:22:44 - slack_bot.dispatcher - INFO - [3b16fd9e] Requesting final analysis...
2026-03-04 10:22:50 - slack_bot.dispatcher - INFO - [3b16fd9e] Final analysis received in 5.71s
2026-03-04 10:22:50 - slack_bot.dispatcher - INFO - Formatted text (len 784 -> 742)
2026-03-04 10:22:50 - slack_bot.dispatcher - WARNING - [3b16fd9e] Update failed, posting new: The request to the Slack API failed. (url: https://slack.com/api/chat.update)
The server responded with: {'ok': False, 'error': 'msg_too_long'}
2026-03-04 10:22:51 - slack_bot.dispatcher - INFO - [3b16fd9e] Dispatch completed in 12.09s
2026-03-04 10:22:51 - __main__ - INFO - [3b16fd9e] ✅ Request completed in 12.41s
2026-03-04 10:27:22 - __main__ - INFO - [2372df84] 📥 Received message from U0A8ZCK7RJM in D0AA4GBQRKK: 今天的椭圆机，有10%以上的时间处在zone3了，这是传说中的“垃圾心率“，对我有啥不好的影响吗？还是说只是浪费了 (Files: 0)
2026-03-04 10:27:23 - slack_bot.dispatcher - INFO - [2372df84] Processing message in D0AA4GBQRKK from U0A8ZCK7RJM
2026-03-04 10:27:23 - slack_bot.dispatcher - INFO - [2372df84] Calling Gemini for initial response...
2026-03-04 10:27:23 - slack_bot.dispatcher - INFO - [2372df84] Request config: model=google/gemini-3-flash-preview, tools=21, context=39 msgs
2026-03-04 10:27:31 - slack_bot.dispatcher - INFO - [2372df84] Gemini response: text=1059 chars, tool_calls=0
2026-03-04 10:27:31 - slack_bot.dispatcher - INFO - [2372df84] No tool calls from Gemini - checking SAFETY OVERRIDE keywords...
2026-03-04 10:27:31 - slack_bot.dispatcher - WARNING - [2372df84] 🔧 SAFETY OVERRIDE: Forcing get_daily_detailed_stats for 2026-03-04
2026-03-04 10:27:31 - slack_bot.dispatcher - INFO - [2372df84] No SAFETY OVERRIDE match found - will return empty response or text
2026-03-04 10:27:31 - slack_bot.dispatcher - INFO - [2372df84] Gemini response in 8.09s: 1059 chars, 1 tools
2026-03-04 10:27:31 - slack_bot.dispatcher - INFO - [2372df84] Executing 1 tools
2026-03-04 10:27:31 - slack_bot.dispatcher - INFO - [2372df84] Tool: get_daily_detailed_stats Args: {'target_date': '2026-03-04'}
2026-03-04 10:27:31 - health.services.query - INFO - Querying health data summary for 2026-03-04
2026-03-04 10:27:31 - health.services.query - INFO - Found 12 metrics and 1 activities
2026-03-04 10:27:31 - slack_bot.dispatcher - INFO - [2372df84] ✓ get_daily_detailed_stats finished in 0.01s
2026-03-04 10:27:31 - slack_bot.dispatcher - INFO - [2372df84] Requesting final analysis...
2026-03-04 10:27:36 - slack_bot.dispatcher - INFO - [2372df84] Final analysis received in 5.38s
2026-03-04 10:27:36 - slack_bot.dispatcher - INFO - Formatted text (len 759 -> 739)
2026-03-04 10:27:37 - slack_bot.dispatcher - INFO - [2372df84] 📤 Message updated 1772591243.159289
2026-03-04 10:27:37 - slack_bot.dispatcher - INFO - [2372df84] Dispatch completed in 13.89s
2026-03-04 10:27:37 - __main__ - INFO - [2372df84] ✅ Request completed in 14.22s
2026-03-04 18:49:06 - __main__ - INFO - [b9197eb9] 📥 Received message from U0A8ZCK7RJM in D0AA4GBQRKK: 这两天早上没吃饭，中午吃很少，晚上吃完都觉得心跳较快，可能70多80多，有什么可能的原因吗 (Files: 0)
2026-03-04 18:49:06 - slack_bot.dispatcher - INFO - [b9197eb9] Processing message in D0AA4GBQRKK from U0A8ZCK7RJM
2026-03-04 18:49:06 - slack_bot.dispatcher - INFO - [b9197eb9] Calling Gemini for initial response...
2026-03-04 18:49:06 - slack_bot.dispatcher - INFO - [b9197eb9] Request config: model=google/gemini-3-flash-preview, tools=21, context=39 msgs
2026-03-04 18:49:15 - slack_bot.dispatcher - INFO - [b9197eb9] Gemini response: text=1209 chars, tool_calls=0
2026-03-04 18:49:15 - slack_bot.dispatcher - INFO - [b9197eb9] No tool calls from Gemini - checking SAFETY OVERRIDE keywords...
2026-03-04 18:49:15 - slack_bot.dispatcher - INFO - [b9197eb9] No SAFETY OVERRIDE match found - will return empty response or text
2026-03-04 18:49:15 - slack_bot.dispatcher - INFO - [b9197eb9] Gemini response in 8.58s: 1209 chars, 0 tools
2026-03-04 18:49:15 - slack_bot.dispatcher - INFO - Formatted text (len 1209 -> 1155)
2026-03-04 18:49:15 - slack_bot.dispatcher - INFO - [b9197eb9] 📤 Message updated 1772621346.808429
2026-03-04 18:49:15 - slack_bot.dispatcher - INFO - [b9197eb9] Dispatch completed in 8.93s
2026-03-04 18:49:15 - __main__ - INFO - [b9197eb9] ✅ Request completed in 9.26s
2026-03-05 11:15:45 - __main__ - INFO - [00cefec3] 📥 Received message from U0A8ZCK7RJM in D0AA4GBQRKK: 同步佳明数据 (Files: 0)
2026-03-05 11:15:45 - slack_bot.dispatcher - INFO - [00cefec3] Processing message in D0AA4GBQRKK from U0A8ZCK7RJM
2026-03-05 11:15:45 - slack_bot.dispatcher - INFO - [00cefec3] Calling Gemini for initial response...
2026-03-05 11:15:45 - slack_bot.dispatcher - INFO - [00cefec3] Request config: model=google/gemini-3-flash-preview, tools=21, context=39 msgs
2026-03-05 11:15:48 - slack_bot.dispatcher - WARNING - [00cefec3] Gemini returned empty response_text! (This usually means the proxy has issues)
2026-03-05 11:15:48 - slack_bot.dispatcher - INFO - [00cefec3] Gemini response: text=0 chars, tool_calls=3
2026-03-05 11:15:48 - slack_bot.dispatcher - INFO - [00cefec3] Tool calls successfully generated by Gemini (no SAFETY OVERRIDE needed)
2026-03-05 11:15:48 - slack_bot.dispatcher - INFO - [00cefec3] Gemini response in 2.76s: 0 chars, 3 tools
2026-03-05 11:15:48 - slack_bot.dispatcher - INFO - [00cefec3] Executing 3 tools
2026-03-05 11:15:48 - slack_bot.dispatcher - INFO - [00cefec3] Tool: sync_garmin Args: {'target_date': '2026-03-05'}
2026-03-05 11:15:48 - slack_bot.tools.garmin - INFO - Starting Garmin sync for 2026-03-05...
2026-03-05 11:15:48 - health.services.data_sync - INFO - Authenticating with Garmin...
2026-03-05 11:15:48 - health.services.garmin_client - INFO - Authenticating with Garmin Connect China for 350134531@qq.com
2026-03-05 11:15:49 - health.services.garmin_client - INFO - Successfully authenticated with Garmin Connect China
2026-03-05 11:15:49 - health.services.data_sync - INFO - Authentication successful
2026-03-05 11:15:49 - health.services.data_sync - INFO - Syncing 14 metric types from 2026-03-05 to 2026-03-05
2026-03-05 11:15:49 - health.services.data_sync - INFO - Syncing steps from 2026-03-05 to 2026-03-05 (1 days)
2026-03-05 11:15:49 - health.services.data_sync - INFO - ✓ Synced steps for 2026-03-05
2026-03-05 11:15:49 - health.services.data_sync - INFO - steps sync complete: 1 synced, 0 skipped, 0 errors
2026-03-05 11:15:49 - health.services.data_sync - INFO - Syncing heart_rate from 2026-03-05 to 2026-03-05 (1 days)
2026-03-05 11:15:49 - health.services.data_sync - INFO - ✓ Synced heart_rate for 2026-03-05
2026-03-05 11:15:49 - health.services.data_sync - INFO - heart_rate sync complete: 1 synced, 0 skipped, 0 errors
2026-03-05 11:15:49 - health.services.data_sync - INFO - Syncing sleep from 2026-03-05 to 2026-03-05 (1 days)
2026-03-05 11:15:49 - health.services.data_sync - INFO - ✓ Synced sleep for 2026-03-05
2026-03-05 11:15:49 - health.services.data_sync - INFO - sleep sync complete: 1 synced, 0 skipped, 0 errors
2026-03-05 11:15:49 - health.services.data_sync - INFO - Syncing stress from 2026-03-05 to 2026-03-05 (1 days)
2026-03-05 11:15:49 - health.services.data_sync - INFO - ✓ Synced stress for 2026-03-05
2026-03-05 11:15:49 - health.services.data_sync - INFO - stress sync complete: 1 synced, 0 skipped, 0 errors
2026-03-05 11:15:49 - health.services.data_sync - INFO - Syncing body_battery from 2026-03-05 to 2026-03-05 (1 days)
2026-03-05 11:15:49 - health.services.data_sync - INFO - ✓ Synced body_battery for 2026-03-05
2026-03-05 11:15:49 - health.services.data_sync - INFO - body_battery sync complete: 1 synced, 0 skipped, 0 errors
2026-03-05 11:15:49 - health.services.data_sync - INFO - Syncing spo2 from 2026-03-05 to 2026-03-05 (1 days)
2026-03-05 11:15:50 - health.services.data_sync - INFO - ✓ Synced spo2 for 2026-03-05
2026-03-05 11:15:50 - health.services.data_sync - INFO - spo2 sync complete: 1 synced, 0 skipped, 0 errors
2026-03-05 11:15:50 - health.services.data_sync - INFO - Syncing respiration from 2026-03-05 to 2026-03-05 (1 days)
2026-03-05 11:15:50 - health.services.data_sync - INFO - ✓ Synced respiration for 2026-03-05
2026-03-05 11:15:50 - health.services.data_sync - INFO - respiration sync complete: 1 synced, 0 skipped, 0 errors
2026-03-05 11:15:50 - health.services.data_sync - INFO - Syncing hydration from 2026-03-05 to 2026-03-05 (1 days)
2026-03-05 11:15:50 - health.services.data_sync - INFO - ✓ Synced hydration for 2026-03-05
2026-03-05 11:15:50 - health.services.data_sync - INFO - hydration sync complete: 1 synced, 0 skipped, 0 errors
2026-03-05 11:15:50 - health.services.data_sync - INFO - Syncing floors from 2026-03-05 to 2026-03-05 (1 days)
2026-03-05 11:15:50 - health.services.data_sync - INFO - ✓ Synced floors for 2026-03-05
2026-03-05 11:15:50 - health.services.data_sync - INFO - floors sync complete: 1 synced, 0 skipped, 0 errors
2026-03-05 11:15:50 - health.services.data_sync - INFO - Syncing intensity_minutes from 2026-03-05 to 2026-03-05 (1 days)
2026-03-05 11:15:50 - health.services.data_sync - INFO - ✓ Synced intensity_minutes for 2026-03-05
2026-03-05 11:15:50 - health.services.data_sync - INFO - intensity_minutes sync complete: 1 synced, 0 skipped, 0 errors
2026-03-05 11:15:50 - health.services.data_sync - INFO - Syncing hrv from 2026-03-05 to 2026-03-05 (1 days)
2026-03-05 11:15:50 - health.services.data_sync - INFO - ✓ Synced hrv for 2026-03-05
2026-03-05 11:15:50 - health.services.data_sync - INFO - hrv sync complete: 1 synced, 0 skipped, 0 errors
2026-03-05 11:15:50 - health.services.data_sync - INFO - Syncing rhr from 2026-03-05 to 2026-03-05 (1 days)
2026-03-05 11:15:50 - health.services.data_sync - INFO - ✓ Synced rhr for 2026-03-05
2026-03-05 11:15:50 - health.services.data_sync - INFO - rhr sync complete: 1 synced, 0 skipped, 0 errors
2026-03-05 11:15:50 - health.services.data_sync - INFO - Syncing weight from 2026-03-05 to 2026-03-05 (1 days)
2026-03-05 11:15:50 - health.services.data_sync - INFO - weight sync complete: 0 synced, 1 skipped, 0 errors
2026-03-05 11:15:50 - health.services.data_sync - INFO - Syncing lifestyle_logging from 2026-03-05 to 2026-03-05 (1 days)
2026-03-05 11:15:50 - health.services.data_sync - INFO - lifestyle_logging sync complete: 0 synced, 1 skipped, 0 errors
2026-03-05 11:15:50 - health.services.data_sync - INFO - Syncing activities from 2026-03-05 to 2026-03-05
2026-03-05 11:15:50 - health.services.data_sync - INFO - Found 0 activities
2026-03-05 11:15:50 - health.services.data_sync - INFO - Activity sync complete: 0 synced, 0 skipped, 0 errors
2026-03-05 11:15:50 - health.services.query - INFO - Querying health data summary for 2026-03-05
2026-03-05 11:15:50 - health.services.query - INFO - Found 12 metrics and 0 activities
2026-03-05 11:15:50 - slack_bot.dispatcher - INFO - [00cefec3] ✓ sync_garmin finished in 2.20s
2026-03-05 11:15:50 - slack_bot.dispatcher - INFO - [00cefec3] Tool: get_daily_detailed_stats Args: {'target_date': '2026-03-05'}
2026-03-05 11:15:50 - health.services.query - INFO - Querying health data summary for 2026-03-05
2026-03-05 11:15:50 - health.services.query - INFO - Found 12 metrics and 0 activities
2026-03-05 11:15:50 - slack_bot.dispatcher - INFO - [00cefec3] ✓ get_daily_detailed_stats finished in 0.01s
2026-03-05 11:15:50 - slack_bot.dispatcher - INFO - [00cefec3] Tool: get_activity_history Args: {'end_date': '2026-03-05', 'start_date': '2026-03-05'}
2026-03-05 11:15:50 - health.services.query - INFO - Querying activities from 2026-03-05 to 2026-03-05
2026-03-05 11:15:50 - health.services.query - INFO - Found 0 activities
2026-03-05 11:15:50 - slack_bot.dispatcher - INFO - [00cefec3] ✓ get_activity_history finished in 0.00s
2026-03-05 11:15:50 - slack_bot.dispatcher - INFO - [00cefec3] Requesting final analysis...
2026-03-05 11:15:57 - slack_bot.dispatcher - INFO - [00cefec3] Final analysis received in 6.30s
2026-03-05 11:15:57 - slack_bot.dispatcher - INFO - Formatted text (len 833 -> 793)
2026-03-05 11:15:57 - slack_bot.dispatcher - WARNING - [00cefec3] Update failed, posting new: The request to the Slack API failed. (url: https://slack.com/api/chat.update)
The server responded with: {'ok': False, 'error': 'msg_too_long'}
2026-03-05 11:15:57 - slack_bot.dispatcher - INFO - [00cefec3] Dispatch completed in 11.90s
2026-03-05 11:15:57 - __main__ - INFO - [00cefec3] ✅ Request completed in 12.21s
2026-03-05 18:47:10 - health.utils.env_loader - INFO - Loading extra configuration from: /root/projects/butler/.gemini.current.env
2026-03-05 18:47:10 - __main__ - INFO - Starting Butler Bot with configuration:
2026-03-05 18:47:10 - __main__ - INFO -   Config file: .gemini.current.env
2026-03-05 18:47:10 - __main__ - INFO -   Model: google/gemini-3-flash-preview
2026-03-05 18:47:10 - __main__ - INFO -   Base URL: https://openrouter.ai/api
2026-03-05 18:47:10 - __main__ - INFO -   Using proxy: Yes
2026-03-05 18:47:11 - slack_bot.llm.gemini - INFO - Using OpenRouter: https://openrouter.ai/api
2026-03-05 18:47:11 - slack_bot.llm.gemini - INFO - Initialized Gemini model: google/gemini-3-flash-preview
2026-03-05 18:47:11 - slack_bot.dispatcher - INFO - Using tool preset: all (21 tools)
2026-03-05 18:47:11 - slack_bot.dispatcher - INFO - Dispatcher initialized with Gemini
2026-03-05 18:47:11 - __main__ - INFO - Dispatcher initialized in 'all' mode
2026-03-05 18:47:11 - __main__ - INFO - ⚡️ Butler (Gemini) is connected to Slack!
2026-03-05 18:51:22 - health.utils.env_loader - INFO - Loading extra configuration from: /root/projects/butler/.gemini.current.env
2026-03-05 18:51:22 - __main__ - INFO - Starting Butler Bot with configuration:
2026-03-05 18:51:22 - __main__ - INFO -   Config file: .gemini.current.env
2026-03-05 18:51:22 - __main__ - INFO -   Model: google/gemini-3-flash-preview
2026-03-05 18:51:22 - __main__ - INFO -   Base URL: https://openrouter.ai/api
2026-03-05 18:51:22 - __main__ - INFO -   Using proxy: Yes
2026-03-05 18:51:23 - slack_bot.llm.gemini - INFO - Using OpenRouter: https://openrouter.ai/api
2026-03-05 18:51:23 - slack_bot.llm.gemini - INFO - Initialized Gemini model: google/gemini-3-flash-preview
2026-03-05 18:51:23 - slack_bot.dispatcher - INFO - Using tool preset: all (21 tools)
2026-03-05 18:51:23 - slack_bot.dispatcher - INFO - Dispatcher initialized with Gemini
2026-03-05 18:51:23 - __main__ - INFO - Dispatcher initialized in 'all' mode
2026-03-05 18:51:23 - __main__ - INFO - ⚡️ Butler (Gemini) is connected to Slack!
⚡️ Bolt app is running!
2026-03-05 18:52:01 - __main__ - INFO - [b39b8b18] 📥 Received message from U0A8ZCK7RJM in D0AA4GBQRKK: 昨天是飞机到雅加达太晚了，今天晚上在当地参加应酬，有何建议 (Files: 0)
2026-03-05 18:52:01 - slack_bot.dispatcher - INFO - [b39b8b18] Processing message in D0AA4GBQRKK from U0A8ZCK7RJM
2026-03-05 18:52:01 - slack_bot.dispatcher - INFO - [b39b8b18] Calling Gemini for initial response...
2026-03-05 18:52:01 - slack_bot.dispatcher - INFO - [b39b8b18] Request config: model=google/gemini-3-flash-preview, tools=21, context=39 msgs
2026-03-05 18:52:04 - slack_bot.dispatcher - WARNING - [b39b8b18] Gemini returned empty response_text! (This usually means the proxy has issues)
2026-03-05 18:52:04 - slack_bot.dispatcher - INFO - [b39b8b18] Gemini response: text=0 chars, tool_calls=2
2026-03-05 18:52:04 - slack_bot.dispatcher - INFO - [b39b8b18] Tool calls successfully generated by Gemini (no SAFETY OVERRIDE needed)
2026-03-05 18:52:04 - slack_bot.dispatcher - INFO - [b39b8b18] Gemini response in 2.74s: 0 chars, 2 tools
2026-03-05 18:52:04 - slack_bot.dispatcher - INFO - [b39b8b18] Executing 2 tools
2026-03-05 18:52:04 - slack_bot.dispatcher - INFO - [b39b8b18] Tool: search_web Args: {'query': 'healthy food choices at Indonesian business dinner and alcohol defense'}
2026-03-05 18:52:04 - slack_bot.tools.web - INFO - Searching web for: healthy food choices at Indonesian business dinner and alcohol defense
/root/projects/butler/slack_bot/tools/web.py:27: RuntimeWarning: This package (`duckduckgo_search`) has been renamed to `ddgs`! Use `pip install ddgs` instead.
  results = DDGS().text(query, max_results=max_results)
2026-03-05 18:52:04 - slack_bot.dispatcher - INFO - [b39b8b18] ✓ search_web finished in 0.28s
2026-03-05 18:52:04 - slack_bot.dispatcher - INFO - [b39b8b18] Tool: get_daily_detailed_stats Args: {'target_date': '2026-03-05'}
2026-03-05 18:52:04 - health.services.query - INFO - Querying health data summary for 2026-03-05
2026-03-05 18:52:04 - health.services.query - INFO - Found 12 metrics and 0 activities
2026-03-05 18:52:04 - slack_bot.dispatcher - INFO - [b39b8b18] ✓ get_daily_detailed_stats finished in 0.03s
2026-03-05 18:52:04 - slack_bot.dispatcher - INFO - [b39b8b18] Requesting final analysis...
2026-03-05 18:52:11 - slack_bot.dispatcher - INFO - [b39b8b18] Final analysis received in 6.44s
2026-03-05 18:52:11 - slack_bot.dispatcher - INFO - Formatted text (len 831 -> 801)
2026-03-05 18:52:11 - slack_bot.dispatcher - INFO - [b39b8b18] 📤 Message updated 1772707921.513929
2026-03-05 18:52:11 - slack_bot.dispatcher - INFO - [b39b8b18] Dispatch completed in 9.83s
2026-03-05 18:52:11 - __main__ - INFO - [b39b8b18] ✅ Request completed in 10.15s
2026-03-07 11:24:28 - __main__ - INFO - [1b9c7157] 📥 Received message from U0A8ZCK7RJM in D0AA4GBQRKK: 同步佳明数据 (Files: 0)
2026-03-07 11:24:29 - slack_bot.dispatcher - INFO - [1b9c7157] Processing message in D0AA4GBQRKK from U0A8ZCK7RJM
2026-03-07 11:24:29 - slack_bot.dispatcher - INFO - [1b9c7157] Calling Gemini for initial response...
2026-03-07 11:24:29 - slack_bot.dispatcher - INFO - [1b9c7157] Request config: model=google/gemini-3-flash-preview, tools=21, context=39 msgs
2026-03-07 11:24:31 - slack_bot.dispatcher - WARNING - [1b9c7157] Gemini returned empty response_text! (This usually means the proxy has issues)
2026-03-07 11:24:31 - slack_bot.dispatcher - INFO - [1b9c7157] Gemini response: text=0 chars, tool_calls=2
2026-03-07 11:24:31 - slack_bot.dispatcher - INFO - [1b9c7157] Tool calls successfully generated by Gemini (no SAFETY OVERRIDE needed)
2026-03-07 11:24:31 - slack_bot.dispatcher - INFO - [1b9c7157] Gemini response in 2.45s: 0 chars, 2 tools
2026-03-07 11:24:31 - slack_bot.dispatcher - INFO - [1b9c7157] Executing 2 tools
2026-03-07 11:24:31 - slack_bot.dispatcher - INFO - [1b9c7157] Tool: sync_garmin Args: {'target_date': '2026-03-06'}
2026-03-07 11:24:31 - slack_bot.tools.garmin - INFO - Starting Garmin sync for 2026-03-06...
2026-03-07 11:24:31 - health.services.data_sync - INFO - Authenticating with Garmin...
2026-03-07 11:24:31 - health.services.garmin_client - INFO - Authenticating with Garmin Connect China for 350134531@qq.com
2026-03-07 11:24:32 - health.services.garmin_client - INFO - Successfully authenticated with Garmin Connect China
2026-03-07 11:24:32 - health.services.data_sync - INFO - Authentication successful
2026-03-07 11:24:32 - health.services.data_sync - INFO - Syncing 14 metric types from 2026-03-06 to 2026-03-06
2026-03-07 11:24:32 - health.services.data_sync - INFO - Syncing steps from 2026-03-06 to 2026-03-06 (1 days)
2026-03-07 11:24:32 - health.services.data_sync - INFO - ✓ Synced steps for 2026-03-06
2026-03-07 11:24:32 - health.services.data_sync - INFO - steps sync complete: 1 synced, 0 skipped, 0 errors
2026-03-07 11:24:32 - health.services.data_sync - INFO - Syncing heart_rate from 2026-03-06 to 2026-03-06 (1 days)
2026-03-07 11:24:33 - health.services.data_sync - INFO - ✓ Synced heart_rate for 2026-03-06
2026-03-07 11:24:33 - health.services.data_sync - INFO - heart_rate sync complete: 1 synced, 0 skipped, 0 errors
2026-03-07 11:24:33 - health.services.data_sync - INFO - Syncing sleep from 2026-03-06 to 2026-03-06 (1 days)
2026-03-07 11:24:33 - health.services.data_sync - INFO - ✓ Synced sleep for 2026-03-06
2026-03-07 11:24:33 - health.services.data_sync - INFO - sleep sync complete: 1 synced, 0 skipped, 0 errors
2026-03-07 11:24:33 - health.services.data_sync - INFO - Syncing stress from 2026-03-06 to 2026-03-06 (1 days)
2026-03-07 11:24:33 - health.services.data_sync - INFO - ✓ Synced stress for 2026-03-06
2026-03-07 11:24:33 - health.services.data_sync - INFO - stress sync complete: 1 synced, 0 skipped, 0 errors
2026-03-07 11:24:33 - health.services.data_sync - INFO - Syncing body_battery from 2026-03-06 to 2026-03-06 (1 days)
2026-03-07 11:24:33 - health.services.data_sync - INFO - ✓ Synced body_battery for 2026-03-06
2026-03-07 11:24:33 - health.services.data_sync - INFO - body_battery sync complete: 1 synced, 0 skipped, 0 errors
2026-03-07 11:24:33 - health.services.data_sync - INFO - Syncing spo2 from 2026-03-06 to 2026-03-06 (1 days)
2026-03-07 11:24:33 - health.services.data_sync - INFO - ✓ Synced spo2 for 2026-03-06
2026-03-07 11:24:33 - health.services.data_sync - INFO - spo2 sync complete: 1 synced, 0 skipped, 0 errors
2026-03-07 11:24:33 - health.services.data_sync - INFO - Syncing respiration from 2026-03-06 to 2026-03-06 (1 days)
2026-03-07 11:24:33 - health.services.data_sync - INFO - ✓ Synced respiration for 2026-03-06
2026-03-07 11:24:33 - health.services.data_sync - INFO - respiration sync complete: 1 synced, 0 skipped, 0 errors
2026-03-07 11:24:33 - health.services.data_sync - INFO - Syncing hydration from 2026-03-06 to 2026-03-06 (1 days)
2026-03-07 11:24:33 - health.services.data_sync - INFO - ✓ Synced hydration for 2026-03-06
2026-03-07 11:24:33 - health.services.data_sync - INFO - hydration sync complete: 1 synced, 0 skipped, 0 errors
2026-03-07 11:24:33 - health.services.data_sync - INFO - Syncing floors from 2026-03-06 to 2026-03-06 (1 days)
2026-03-07 11:24:34 - health.services.data_sync - INFO - ✓ Synced floors for 2026-03-06
2026-03-07 11:24:34 - health.services.data_sync - INFO - floors sync complete: 1 synced, 0 skipped, 0 errors
2026-03-07 11:24:34 - health.services.data_sync - INFO - Syncing intensity_minutes from 2026-03-06 to 2026-03-06 (1 days)
2026-03-07 11:24:34 - health.services.data_sync - INFO - ✓ Synced intensity_minutes for 2026-03-06
2026-03-07 11:24:34 - health.services.data_sync - INFO - intensity_minutes sync complete: 1 synced, 0 skipped, 0 errors
2026-03-07 11:24:34 - health.services.data_sync - INFO - Syncing hrv from 2026-03-06 to 2026-03-06 (1 days)
2026-03-07 11:24:34 - health.services.data_sync - INFO - ✓ Synced hrv for 2026-03-06
2026-03-07 11:24:34 - health.services.data_sync - INFO - hrv sync complete: 1 synced, 0 skipped, 0 errors
2026-03-07 11:24:34 - health.services.data_sync - INFO - Syncing rhr from 2026-03-06 to 2026-03-06 (1 days)
2026-03-07 11:24:34 - health.services.data_sync - INFO - ✓ Synced rhr for 2026-03-06
2026-03-07 11:24:34 - health.services.data_sync - INFO - rhr sync complete: 1 synced, 0 skipped, 0 errors
2026-03-07 11:24:34 - health.services.data_sync - INFO - Syncing weight from 2026-03-06 to 2026-03-06 (1 days)
2026-03-07 11:24:34 - health.services.data_sync - INFO - weight sync complete: 0 synced, 1 skipped, 0 errors
2026-03-07 11:24:34 - health.services.data_sync - INFO - Syncing lifestyle_logging from 2026-03-06 to 2026-03-06 (1 days)
2026-03-07 11:24:34 - health.services.data_sync - INFO - ✓ Synced lifestyle_logging for 2026-03-06
2026-03-07 11:24:34 - health.services.data_sync - INFO - lifestyle_logging sync complete: 1 synced, 0 skipped, 0 errors
2026-03-07 11:24:34 - health.services.data_sync - INFO - Syncing activities from 2026-03-06 to 2026-03-06
2026-03-07 11:24:34 - health.services.data_sync - INFO - Found 0 activities
2026-03-07 11:24:34 - health.services.data_sync - INFO - Activity sync complete: 0 synced, 0 skipped, 0 errors
2026-03-07 11:24:34 - health.services.query - INFO - Querying health data summary for 2026-03-06
2026-03-07 11:24:34 - health.services.query - INFO - Found 13 metrics and 0 activities
2026-03-07 11:24:34 - slack_bot.dispatcher - INFO - [1b9c7157] ✓ sync_garmin finished in 2.98s
2026-03-07 11:24:34 - slack_bot.dispatcher - INFO - [1b9c7157] Tool: get_daily_detailed_stats Args: {'target_date': '2026-03-06'}
2026-03-07 11:24:34 - health.services.query - INFO - Querying health data summary for 2026-03-06
2026-03-07 11:24:34 - health.services.query - INFO - Found 13 metrics and 0 activities
2026-03-07 11:24:34 - slack_bot.dispatcher - INFO - [1b9c7157] ✓ get_daily_detailed_stats finished in 0.01s
2026-03-07 11:24:34 - slack_bot.dispatcher - INFO - [1b9c7157] Requesting final analysis...
2026-03-07 11:24:39 - slack_bot.dispatcher - INFO - [1b9c7157] Final analysis received in 4.65s
2026-03-07 11:24:39 - slack_bot.dispatcher - INFO - Formatted text (len 758 -> 730)
2026-03-07 11:24:39 - slack_bot.dispatcher - WARNING - [1b9c7157] Update failed, posting new: The request to the Slack API failed. (url: https://slack.com/api/chat.update)
The server responded with: {'ok': False, 'error': 'msg_too_long'}
2026-03-07 11:24:39 - slack_bot.dispatcher - INFO - [1b9c7157] Dispatch completed in 10.70s
2026-03-07 11:24:39 - __main__ - INFO - [1b9c7157] ✅ Request completed in 11.02s
2026-03-07 11:27:58 - __main__ - INFO - [3b08373b] 📥 Received message from U0A8ZCK7RJM in D0AA4GBQRKK: 现在是3月7日，同步3月7日数据 (Files: 0)
2026-03-07 11:27:58 - slack_bot.dispatcher - INFO - [3b08373b] Processing message in D0AA4GBQRKK from U0A8ZCK7RJM
2026-03-07 11:27:58 - slack_bot.dispatcher - INFO - [3b08373b] Calling Gemini for initial response...
2026-03-07 11:27:58 - slack_bot.dispatcher - INFO - [3b08373b] Request config: model=google/gemini-3-flash-preview, tools=21, context=39 msgs
2026-03-07 11:28:01 - slack_bot.dispatcher - WARNING - [3b08373b] Gemini returned empty response_text! (This usually means the proxy has issues)
2026-03-07 11:28:01 - slack_bot.dispatcher - INFO - [3b08373b] Gemini response: text=0 chars, tool_calls=3
2026-03-07 11:28:01 - slack_bot.dispatcher - INFO - [3b08373b] Tool calls successfully generated by Gemini (no SAFETY OVERRIDE needed)
2026-03-07 11:28:01 - slack_bot.dispatcher - INFO - [3b08373b] Gemini response in 2.60s: 0 chars, 3 tools
2026-03-07 11:28:01 - slack_bot.dispatcher - INFO - [3b08373b] Executing 3 tools
2026-03-07 11:28:01 - slack_bot.dispatcher - INFO - [3b08373b] Tool: sync_garmin Args: {'target_date': '2026-03-07'}
2026-03-07 11:28:01 - slack_bot.tools.garmin - INFO - Starting Garmin sync for 2026-03-07...
2026-03-07 11:28:01 - health.services.data_sync - INFO - Authenticating with Garmin...
2026-03-07 11:28:01 - health.services.garmin_client - INFO - Authenticating with Garmin Connect China for 350134531@qq.com
2026-03-07 11:28:01 - health.services.garmin_client - INFO - Successfully authenticated with Garmin Connect China
2026-03-07 11:28:01 - health.services.data_sync - INFO - Authentication successful
2026-03-07 11:28:01 - health.services.data_sync - INFO - Syncing 14 metric types from 2026-03-07 to 2026-03-07
2026-03-07 11:28:01 - health.services.data_sync - INFO - Syncing steps from 2026-03-07 to 2026-03-07 (1 days)
2026-03-07 11:28:02 - health.services.data_sync - INFO - ✓ Synced steps for 2026-03-07
2026-03-07 11:28:02 - health.services.data_sync - INFO - steps sync complete: 1 synced, 0 skipped, 0 errors
2026-03-07 11:28:02 - health.services.data_sync - INFO - Syncing heart_rate from 2026-03-07 to 2026-03-07 (1 days)
2026-03-07 11:28:02 - health.services.data_sync - INFO - ✓ Synced heart_rate for 2026-03-07
2026-03-07 11:28:02 - health.services.data_sync - INFO - heart_rate sync complete: 1 synced, 0 skipped, 0 errors
2026-03-07 11:28:02 - health.services.data_sync - INFO - Syncing sleep from 2026-03-07 to 2026-03-07 (1 days)
2026-03-07 11:28:02 - health.services.data_sync - INFO - ✓ Synced sleep for 2026-03-07
2026-03-07 11:28:02 - health.services.data_sync - INFO - sleep sync complete: 1 synced, 0 skipped, 0 errors
2026-03-07 11:28:02 - health.services.data_sync - INFO - Syncing stress from 2026-03-07 to 2026-03-07 (1 days)
2026-03-07 11:28:02 - health.services.data_sync - INFO - ✓ Synced stress for 2026-03-07
2026-03-07 11:28:02 - health.services.data_sync - INFO - stress sync complete: 1 synced, 0 skipped, 0 errors
2026-03-07 11:28:02 - health.services.data_sync - INFO - Syncing body_battery from 2026-03-07 to 2026-03-07 (1 days)
2026-03-07 11:28:02 - health.services.data_sync - INFO - ✓ Synced body_battery for 2026-03-07
2026-03-07 11:28:02 - health.services.data_sync - INFO - body_battery sync complete: 1 synced, 0 skipped, 0 errors
2026-03-07 11:28:02 - health.services.data_sync - INFO - Syncing spo2 from 2026-03-07 to 2026-03-07 (1 days)
2026-03-07 11:28:02 - health.services.data_sync - INFO - ✓ Synced spo2 for 2026-03-07
2026-03-07 11:28:02 - health.services.data_sync - INFO - spo2 sync complete: 1 synced, 0 skipped, 0 errors
2026-03-07 11:28:02 - health.services.data_sync - INFO - Syncing respiration from 2026-03-07 to 2026-03-07 (1 days)
2026-03-07 11:28:03 - health.services.data_sync - INFO - ✓ Synced respiration for 2026-03-07
2026-03-07 11:28:03 - health.services.data_sync - INFO - respiration sync complete: 1 synced, 0 skipped, 0 errors
2026-03-07 11:28:03 - health.services.data_sync - INFO - Syncing hydration from 2026-03-07 to 2026-03-07 (1 days)
2026-03-07 11:28:03 - health.services.data_sync - INFO - ✓ Synced hydration for 2026-03-07
2026-03-07 11:28:03 - health.services.data_sync - INFO - hydration sync complete: 1 synced, 0 skipped, 0 errors
2026-03-07 11:28:03 - health.services.data_sync - INFO - Syncing floors from 2026-03-07 to 2026-03-07 (1 days)
2026-03-07 11:28:03 - health.services.data_sync - INFO - ✓ Synced floors for 2026-03-07
2026-03-07 11:28:03 - health.services.data_sync - INFO - floors sync complete: 1 synced, 0 skipped, 0 errors
2026-03-07 11:28:03 - health.services.data_sync - INFO - Syncing intensity_minutes from 2026-03-07 to 2026-03-07 (1 days)
2026-03-07 11:28:03 - health.services.data_sync - INFO - ✓ Synced intensity_minutes for 2026-03-07
2026-03-07 11:28:03 - health.services.data_sync - INFO - intensity_minutes sync complete: 1 synced, 0 skipped, 0 errors
2026-03-07 11:28:03 - health.services.data_sync - INFO - Syncing hrv from 2026-03-07 to 2026-03-07 (1 days)
2026-03-07 11:28:03 - health.services.data_sync - INFO - ✓ Synced hrv for 2026-03-07
2026-03-07 11:28:03 - health.services.data_sync - INFO - hrv sync complete: 1 synced, 0 skipped, 0 errors
2026-03-07 11:28:03 - health.services.data_sync - INFO - Syncing rhr from 2026-03-07 to 2026-03-07 (1 days)
2026-03-07 11:28:03 - health.services.data_sync - INFO - ✓ Synced rhr for 2026-03-07
2026-03-07 11:28:03 - health.services.data_sync - INFO - rhr sync complete: 1 synced, 0 skipped, 0 errors
2026-03-07 11:28:03 - health.services.data_sync - INFO - Syncing weight from 2026-03-07 to 2026-03-07 (1 days)
2026-03-07 11:28:03 - health.services.data_sync - INFO - weight sync complete: 0 synced, 1 skipped, 0 errors
2026-03-07 11:28:03 - health.services.data_sync - INFO - Syncing lifestyle_logging from 2026-03-07 to 2026-03-07 (1 days)
2026-03-07 11:28:03 - health.services.data_sync - INFO - lifestyle_logging sync complete: 0 synced, 1 skipped, 0 errors
2026-03-07 11:28:03 - health.services.data_sync - INFO - Syncing activities from 2026-03-07 to 2026-03-07
2026-03-07 11:28:03 - health.services.data_sync - INFO - Found 0 activities
2026-03-07 11:28:03 - health.services.data_sync - INFO - Activity sync complete: 0 synced, 0 skipped, 0 errors
2026-03-07 11:28:03 - health.services.query - INFO - Querying health data summary for 2026-03-07
2026-03-07 11:28:03 - health.services.query - INFO - Found 12 metrics and 0 activities
2026-03-07 11:28:03 - slack_bot.dispatcher - INFO - [3b08373b] ✓ sync_garmin finished in 2.49s
2026-03-07 11:28:03 - slack_bot.dispatcher - INFO - [3b08373b] Tool: get_daily_detailed_stats Args: {'target_date': '2026-03-07'}
2026-03-07 11:28:03 - health.services.query - INFO - Querying health data summary for 2026-03-07
2026-03-07 11:28:03 - health.services.query - INFO - Found 12 metrics and 0 activities
2026-03-07 11:28:03 - slack_bot.dispatcher - INFO - [3b08373b] ✓ get_daily_detailed_stats finished in 0.01s
2026-03-07 11:28:03 - slack_bot.dispatcher - INFO - [3b08373b] Tool: get_activity_history Args: {'start_date': '2026-03-07', 'end_date': '2026-03-07'}
2026-03-07 11:28:03 - health.services.query - INFO - Querying activities from 2026-03-07 to 2026-03-07
2026-03-07 11:28:03 - health.services.query - INFO - Found 0 activities
2026-03-07 11:28:03 - slack_bot.dispatcher - INFO - [3b08373b] ✓ get_activity_history finished in 0.00s
2026-03-07 11:28:03 - slack_bot.dispatcher - INFO - [3b08373b] Requesting final analysis...
2026-03-07 11:28:08 - slack_bot.dispatcher - INFO - [3b08373b] Final analysis received in 4.57s
2026-03-07 11:28:08 - slack_bot.dispatcher - INFO - Formatted text (len 698 -> 664)
2026-03-07 11:28:08 - slack_bot.dispatcher - WARNING - [3b08373b] Update failed, posting new: The request to the Slack API failed. (url: https://slack.com/api/chat.update)
The server responded with: {'ok': False, 'error': 'msg_too_long'}
2026-03-07 11:28:09 - slack_bot.dispatcher - INFO - [3b08373b] Dispatch completed in 10.27s
2026-03-07 11:28:09 - __main__ - INFO - [3b08373b] ✅ Request completed in 10.57s
2026-03-08 16:56:51 - __main__ - INFO - [2fea8b50] 📥 Received message from U0A8ZCK7RJM in D0AA4GBQRKK: 同步佳明数据 (Files: 0)
2026-03-08 16:56:52 - slack_bot.dispatcher - INFO - [2fea8b50] Processing message in D0AA4GBQRKK from U0A8ZCK7RJM
2026-03-08 16:56:52 - slack_bot.dispatcher - INFO - [2fea8b50] Calling Gemini for initial response...
2026-03-08 16:56:52 - slack_bot.dispatcher - INFO - [2fea8b50] Request config: model=google/gemini-3-flash-preview, tools=21, context=39 msgs
2026-03-08 16:56:55 - slack_bot.dispatcher - WARNING - [2fea8b50] Gemini returned empty response_text! (This usually means the proxy has issues)
2026-03-08 16:56:55 - slack_bot.dispatcher - INFO - [2fea8b50] Gemini response: text=0 chars, tool_calls=3
2026-03-08 16:56:55 - slack_bot.dispatcher - INFO - [2fea8b50] Tool calls successfully generated by Gemini (no SAFETY OVERRIDE needed)
2026-03-08 16:56:55 - slack_bot.dispatcher - INFO - [2fea8b50] Gemini response in 3.23s: 0 chars, 3 tools
2026-03-08 16:56:55 - slack_bot.dispatcher - INFO - [2fea8b50] Executing 3 tools
2026-03-08 16:56:55 - slack_bot.dispatcher - INFO - [2fea8b50] Tool: sync_garmin Args: {'target_date': '2026-03-08'}
2026-03-08 16:56:55 - slack_bot.tools.garmin - INFO - Starting Garmin sync for 2026-03-08...
2026-03-08 16:56:55 - health.services.data_sync - INFO - Authenticating with Garmin...
2026-03-08 16:56:55 - health.services.garmin_client - INFO - Authenticating with Garmin Connect China for 350134531@qq.com
2026-03-08 16:56:55 - health.services.garmin_client - INFO - Successfully authenticated with Garmin Connect China
2026-03-08 16:56:55 - health.services.data_sync - INFO - Authentication successful
2026-03-08 16:56:55 - health.services.data_sync - INFO - Syncing 14 metric types from 2026-03-08 to 2026-03-08
2026-03-08 16:56:55 - health.services.data_sync - INFO - Syncing steps from 2026-03-08 to 2026-03-08 (1 days)
2026-03-08 16:56:56 - health.services.data_sync - INFO - ✓ Synced steps for 2026-03-08
2026-03-08 16:56:56 - health.services.data_sync - INFO - steps sync complete: 1 synced, 0 skipped, 0 errors
2026-03-08 16:56:56 - health.services.data_sync - INFO - Syncing heart_rate from 2026-03-08 to 2026-03-08 (1 days)
2026-03-08 16:56:56 - health.services.data_sync - INFO - ✓ Synced heart_rate for 2026-03-08
2026-03-08 16:56:56 - health.services.data_sync - INFO - heart_rate sync complete: 1 synced, 0 skipped, 0 errors
2026-03-08 16:56:56 - health.services.data_sync - INFO - Syncing sleep from 2026-03-08 to 2026-03-08 (1 days)
2026-03-08 16:56:56 - health.services.data_sync - INFO - ✓ Synced sleep for 2026-03-08
2026-03-08 16:56:56 - health.services.data_sync - INFO - sleep sync complete: 1 synced, 0 skipped, 0 errors
2026-03-08 16:56:56 - health.services.data_sync - INFO - Syncing stress from 2026-03-08 to 2026-03-08 (1 days)
2026-03-08 16:56:56 - health.services.data_sync - INFO - ✓ Synced stress for 2026-03-08
2026-03-08 16:56:56 - health.services.data_sync - INFO - stress sync complete: 1 synced, 0 skipped, 0 errors
2026-03-08 16:56:56 - health.services.data_sync - INFO - Syncing body_battery from 2026-03-08 to 2026-03-08 (1 days)
2026-03-08 16:56:56 - health.services.data_sync - INFO - ✓ Synced body_battery for 2026-03-08
2026-03-08 16:56:56 - health.services.data_sync - INFO - body_battery sync complete: 1 synced, 0 skipped, 0 errors
2026-03-08 16:56:56 - health.services.data_sync - INFO - Syncing spo2 from 2026-03-08 to 2026-03-08 (1 days)
2026-03-08 16:56:56 - health.services.data_sync - INFO - ✓ Synced spo2 for 2026-03-08
2026-03-08 16:56:56 - health.services.data_sync - INFO - spo2 sync complete: 1 synced, 0 skipped, 0 errors
2026-03-08 16:56:56 - health.services.data_sync - INFO - Syncing respiration from 2026-03-08 to 2026-03-08 (1 days)
2026-03-08 16:56:57 - health.services.data_sync - INFO - ✓ Synced respiration for 2026-03-08
2026-03-08 16:56:57 - health.services.data_sync - INFO - respiration sync complete: 1 synced, 0 skipped, 0 errors
2026-03-08 16:56:57 - health.services.data_sync - INFO - Syncing hydration from 2026-03-08 to 2026-03-08 (1 days)
2026-03-08 16:56:57 - health.services.data_sync - INFO - ✓ Synced hydration for 2026-03-08
2026-03-08 16:56:57 - health.services.data_sync - INFO - hydration sync complete: 1 synced, 0 skipped, 0 errors
2026-03-08 16:56:57 - health.services.data_sync - INFO - Syncing floors from 2026-03-08 to 2026-03-08 (1 days)
2026-03-08 16:56:57 - health.services.data_sync - INFO - ✓ Synced floors for 2026-03-08
2026-03-08 16:56:57 - health.services.data_sync - INFO - floors sync complete: 1 synced, 0 skipped, 0 errors
2026-03-08 16:56:57 - health.services.data_sync - INFO - Syncing intensity_minutes from 2026-03-08 to 2026-03-08 (1 days)
2026-03-08 16:56:57 - health.services.data_sync - INFO - ✓ Synced intensity_minutes for 2026-03-08
2026-03-08 16:56:57 - health.services.data_sync - INFO - intensity_minutes sync complete: 1 synced, 0 skipped, 0 errors
2026-03-08 16:56:57 - health.services.data_sync - INFO - Syncing hrv from 2026-03-08 to 2026-03-08 (1 days)
2026-03-08 16:56:57 - health.services.data_sync - INFO - ✓ Synced hrv for 2026-03-08
2026-03-08 16:56:57 - health.services.data_sync - INFO - hrv sync complete: 1 synced, 0 skipped, 0 errors
2026-03-08 16:56:57 - health.services.data_sync - INFO - Syncing rhr from 2026-03-08 to 2026-03-08 (1 days)
2026-03-08 16:56:57 - health.services.data_sync - INFO - ✓ Synced rhr for 2026-03-08
2026-03-08 16:56:57 - health.services.data_sync - INFO - rhr sync complete: 1 synced, 0 skipped, 0 errors
2026-03-08 16:56:57 - health.services.data_sync - INFO - Syncing weight from 2026-03-08 to 2026-03-08 (1 days)
2026-03-08 16:56:57 - health.services.data_sync - INFO - weight sync complete: 0 synced, 1 skipped, 0 errors
2026-03-08 16:56:57 - health.services.data_sync - INFO - Syncing lifestyle_logging from 2026-03-08 to 2026-03-08 (1 days)
2026-03-08 16:56:57 - health.services.data_sync - INFO - lifestyle_logging sync complete: 0 synced, 1 skipped, 0 errors
2026-03-08 16:56:57 - health.services.data_sync - INFO - Syncing activities from 2026-03-08 to 2026-03-08
2026-03-08 16:56:57 - health.services.garmin_client - INFO - Fetched 1 activities
2026-03-08 16:56:57 - health.services.data_sync - INFO - Found 1 activities
2026-03-08 16:56:57 - health.services.data_sync - INFO - ✓ Synced activity 571329096 (elliptical) on 2026-03-08
2026-03-08 16:56:57 - health.services.data_sync - INFO - Activity sync complete: 1 synced, 0 skipped, 0 errors
2026-03-08 16:56:57 - health.services.query - INFO - Querying health data summary for 2026-03-08
2026-03-08 16:56:57 - health.services.query - INFO - Found 12 metrics and 1 activities
2026-03-08 16:56:57 - slack_bot.dispatcher - INFO - [2fea8b50] ✓ sync_garmin finished in 2.51s
2026-03-08 16:56:57 - slack_bot.dispatcher - INFO - [2fea8b50] Tool: get_daily_detailed_stats Args: {'target_date': '2026-03-08'}
2026-03-08 16:56:57 - health.services.query - INFO - Querying health data summary for 2026-03-08
2026-03-08 16:56:57 - health.services.query - INFO - Found 12 metrics and 1 activities
2026-03-08 16:56:57 - slack_bot.dispatcher - INFO - [2fea8b50] ✓ get_daily_detailed_stats finished in 0.01s
2026-03-08 16:56:57 - slack_bot.dispatcher - INFO - [2fea8b50] Tool: get_activity_history Args: {'start_date': '2026-03-08', 'end_date': '2026-03-08'}
2026-03-08 16:56:57 - health.services.query - INFO - Querying activities from 2026-03-08 to 2026-03-08
2026-03-08 16:56:57 - health.services.query - INFO - Found 1 activities
2026-03-08 16:56:57 - slack_bot.dispatcher - INFO - [2fea8b50] ✓ get_activity_history finished in 0.00s
2026-03-08 16:56:57 - slack_bot.dispatcher - INFO - [2fea8b50] Requesting final analysis...
2026-03-08 16:57:01 - slack_bot.dispatcher - INFO - [2fea8b50] Final analysis received in 3.95s
2026-03-08 16:57:01 - slack_bot.dispatcher - INFO - Formatted text (len 619 -> 591)
2026-03-08 16:57:02 - slack_bot.dispatcher - WARNING - [2fea8b50] Update failed, posting new: The request to the Slack API failed. (url: https://slack.com/api/chat.update)
The server responded with: {'ok': False, 'error': 'msg_too_long'}
2026-03-08 16:57:02 - slack_bot.dispatcher - INFO - [2fea8b50] Dispatch completed in 10.56s
2026-03-08 16:57:02 - __main__ - INFO - [2fea8b50] ✅ Request completed in 10.89s
Failed to establish a connection (session id: a8402645-4221-4b3c-944b-3fbaa4b47d01, error: The read operation timed out)
on_error invoked (session id: e6a82843-81d0-4cea-8cb3-452bfd05d742, error: TimeoutError, message: The read operation timed out)
/root/projects/butler/venv/lib64/python3.11/site-packages/slack_sdk/socket_mode/builtin/client.py:178: ResourceWarning: unclosed <ssl.SSLSocket fd=22, family=2, type=1, proto=6, laddr=('10.0.8.2', 57800), raddr=('54.179.65.250', 443)>
  current_session.connect()
ResourceWarning: Enable tracemalloc to get the object allocation traceback
2026-03-10 13:15:58 - __main__ - INFO - [60fb11f4] 📥 Received message from U0A8ZCK7RJM in D0AA4GBQRKK: 同步佳明数据 (Files: 0)
2026-03-10 13:15:58 - slack_bot.dispatcher - INFO - [60fb11f4] Processing message in D0AA4GBQRKK from U0A8ZCK7RJM
2026-03-10 13:15:58 - slack_bot.dispatcher - INFO - [60fb11f4] Calling Gemini for initial response...
2026-03-10 13:15:58 - slack_bot.dispatcher - INFO - [60fb11f4] Request config: model=google/gemini-3-flash-preview, tools=21, context=39 msgs
2026-03-10 13:16:02 - slack_bot.dispatcher - WARNING - [60fb11f4] Gemini returned empty response_text! (This usually means the proxy has issues)
2026-03-10 13:16:02 - slack_bot.dispatcher - INFO - [60fb11f4] Gemini response: text=0 chars, tool_calls=3
2026-03-10 13:16:02 - slack_bot.dispatcher - INFO - [60fb11f4] Tool calls successfully generated by Gemini (no SAFETY OVERRIDE needed)
2026-03-10 13:16:02 - slack_bot.dispatcher - INFO - [60fb11f4] Gemini response in 4.14s: 0 chars, 3 tools
2026-03-10 13:16:02 - slack_bot.dispatcher - INFO - [60fb11f4] Executing 3 tools
2026-03-10 13:16:02 - slack_bot.dispatcher - INFO - [60fb11f4] Tool: sync_garmin Args: {'target_date': '2026-03-09'}
2026-03-10 13:16:02 - slack_bot.tools.garmin - INFO - Starting Garmin sync for 2026-03-09...
2026-03-10 13:16:02 - health.services.data_sync - INFO - Authenticating with Garmin...
2026-03-10 13:16:02 - health.services.garmin_client - INFO - Authenticating with Garmin Connect China for 350134531@qq.com
2026-03-10 13:16:03 - health.services.garmin_client - INFO - Successfully authenticated with Garmin Connect China
2026-03-10 13:16:03 - health.services.data_sync - INFO - Authentication successful
2026-03-10 13:16:03 - health.services.data_sync - INFO - Syncing 14 metric types from 2026-03-09 to 2026-03-09
2026-03-10 13:16:03 - health.services.data_sync - INFO - Syncing steps from 2026-03-09 to 2026-03-09 (1 days)
2026-03-10 13:16:03 - health.services.data_sync - INFO - ✓ Synced steps for 2026-03-09
2026-03-10 13:16:03 - health.services.data_sync - INFO - steps sync complete: 1 synced, 0 skipped, 0 errors
2026-03-10 13:16:03 - health.services.data_sync - INFO - Syncing heart_rate from 2026-03-09 to 2026-03-09 (1 days)
2026-03-10 13:16:04 - health.services.data_sync - INFO - ✓ Synced heart_rate for 2026-03-09
2026-03-10 13:16:04 - health.services.data_sync - INFO - heart_rate sync complete: 1 synced, 0 skipped, 0 errors
2026-03-10 13:16:04 - health.services.data_sync - INFO - Syncing sleep from 2026-03-09 to 2026-03-09 (1 days)
2026-03-10 13:16:04 - health.services.data_sync - INFO - ✓ Synced sleep for 2026-03-09
2026-03-10 13:16:04 - health.services.data_sync - INFO - sleep sync complete: 1 synced, 0 skipped, 0 errors
2026-03-10 13:16:04 - health.services.data_sync - INFO - Syncing stress from 2026-03-09 to 2026-03-09 (1 days)
2026-03-10 13:16:04 - health.services.data_sync - INFO - ✓ Synced stress for 2026-03-09
2026-03-10 13:16:04 - health.services.data_sync - INFO - stress sync complete: 1 synced, 0 skipped, 0 errors
2026-03-10 13:16:04 - health.services.data_sync - INFO - Syncing body_battery from 2026-03-09 to 2026-03-09 (1 days)
2026-03-10 13:16:04 - health.services.data_sync - INFO - ✓ Synced body_battery for 2026-03-09
2026-03-10 13:16:04 - health.services.data_sync - INFO - body_battery sync complete: 1 synced, 0 skipped, 0 errors
2026-03-10 13:16:04 - health.services.data_sync - INFO - Syncing spo2 from 2026-03-09 to 2026-03-09 (1 days)
2026-03-10 13:16:04 - health.services.data_sync - INFO - ✓ Synced spo2 for 2026-03-09
2026-03-10 13:16:04 - health.services.data_sync - INFO - spo2 sync complete: 1 synced, 0 skipped, 0 errors
2026-03-10 13:16:04 - health.services.data_sync - INFO - Syncing respiration from 2026-03-09 to 2026-03-09 (1 days)
2026-03-10 13:16:05 - health.services.data_sync - INFO - ✓ Synced respiration for 2026-03-09
2026-03-10 13:16:05 - health.services.data_sync - INFO - respiration sync complete: 1 synced, 0 skipped, 0 errors
2026-03-10 13:16:05 - health.services.data_sync - INFO - Syncing hydration from 2026-03-09 to 2026-03-09 (1 days)
2026-03-10 13:16:05 - health.services.data_sync - INFO - ✓ Synced hydration for 2026-03-09
2026-03-10 13:16:05 - health.services.data_sync - INFO - hydration sync complete: 1 synced, 0 skipped, 0 errors
2026-03-10 13:16:05 - health.services.data_sync - INFO - Syncing floors from 2026-03-09 to 2026-03-09 (1 days)
2026-03-10 13:16:05 - health.services.data_sync - INFO - ✓ Synced floors for 2026-03-09
2026-03-10 13:16:05 - health.services.data_sync - INFO - floors sync complete: 1 synced, 0 skipped, 0 errors
2026-03-10 13:16:05 - health.services.data_sync - INFO - Syncing intensity_minutes from 2026-03-09 to 2026-03-09 (1 days)
2026-03-10 13:16:05 - health.services.data_sync - INFO - ✓ Synced intensity_minutes for 2026-03-09
2026-03-10 13:16:05 - health.services.data_sync - INFO - intensity_minutes sync complete: 1 synced, 0 skipped, 0 errors
2026-03-10 13:16:05 - health.services.data_sync - INFO - Syncing hrv from 2026-03-09 to 2026-03-09 (1 days)
2026-03-10 13:16:05 - health.services.data_sync - INFO - ✓ Synced hrv for 2026-03-09
2026-03-10 13:16:05 - health.services.data_sync - INFO - hrv sync complete: 1 synced, 0 skipped, 0 errors
2026-03-10 13:16:05 - health.services.data_sync - INFO - Syncing rhr from 2026-03-09 to 2026-03-09 (1 days)
2026-03-10 13:16:05 - health.services.data_sync - INFO - ✓ Synced rhr for 2026-03-09
2026-03-10 13:16:05 - health.services.data_sync - INFO - rhr sync complete: 1 synced, 0 skipped, 0 errors
2026-03-10 13:16:05 - health.services.data_sync - INFO - Syncing weight from 2026-03-09 to 2026-03-09 (1 days)
2026-03-10 13:16:05 - health.services.data_sync - INFO - weight sync complete: 0 synced, 1 skipped, 0 errors
2026-03-10 13:16:05 - health.services.data_sync - INFO - Syncing lifestyle_logging from 2026-03-09 to 2026-03-09 (1 days)
2026-03-10 13:16:05 - health.services.data_sync - INFO - ✓ Synced lifestyle_logging for 2026-03-09
2026-03-10 13:16:05 - health.services.data_sync - INFO - lifestyle_logging sync complete: 1 synced, 0 skipped, 0 errors
2026-03-10 13:16:05 - health.services.data_sync - INFO - Syncing activities from 2026-03-09 to 2026-03-09
2026-03-10 13:16:06 - health.services.garmin_client - INFO - Fetched 1 activities
2026-03-10 13:16:06 - health.services.data_sync - INFO - Found 1 activities
2026-03-10 13:16:06 - health.services.data_sync - INFO - ✓ Synced activity 571649099 (elliptical) on 2026-03-09
2026-03-10 13:16:06 - health.services.data_sync - INFO - Activity sync complete: 1 synced, 0 skipped, 0 errors
2026-03-10 13:16:06 - health.services.query - INFO - Querying health data summary for 2026-03-09
2026-03-10 13:16:06 - health.services.query - INFO - Found 13 metrics and 1 activities
2026-03-10 13:16:06 - slack_bot.dispatcher - INFO - [60fb11f4] ✓ sync_garmin finished in 3.21s
2026-03-10 13:16:06 - slack_bot.dispatcher - INFO - [60fb11f4] Tool: get_daily_detailed_stats Args: {'target_date': '2026-03-09'}
2026-03-10 13:16:06 - health.services.query - INFO - Querying health data summary for 2026-03-09
2026-03-10 13:16:06 - health.services.query - INFO - Found 13 metrics and 1 activities
2026-03-10 13:16:06 - slack_bot.dispatcher - INFO - [60fb11f4] ✓ get_daily_detailed_stats finished in 0.01s
2026-03-10 13:16:06 - slack_bot.dispatcher - INFO - [60fb11f4] Tool: get_activity_history Args: {'end_date': '2026-03-09', 'start_date': '2026-03-09'}
2026-03-10 13:16:06 - health.services.query - INFO - Querying activities from 2026-03-09 to 2026-03-09
2026-03-10 13:16:06 - health.services.query - INFO - Found 1 activities
2026-03-10 13:16:06 - slack_bot.dispatcher - INFO - [60fb11f4] ✓ get_activity_history finished in 0.00s
2026-03-10 13:16:06 - slack_bot.dispatcher - INFO - [60fb11f4] Requesting final analysis...
2026-03-10 13:16:11 - slack_bot.dispatcher - INFO - [60fb11f4] Final analysis received in 5.60s
2026-03-10 13:16:11 - slack_bot.dispatcher - INFO - Formatted text (len 818 -> 776)
2026-03-10 13:16:12 - slack_bot.dispatcher - WARNING - [60fb11f4] Update failed, posting new: The request to the Slack API failed. (url: https://slack.com/api/chat.update)
The server responded with: {'ok': False, 'error': 'msg_too_long'}
2026-03-10 13:16:13 - slack_bot.dispatcher - INFO - [60fb11f4] 📤 Continuation message posted
2026-03-10 13:16:13 - slack_bot.dispatcher - INFO - [60fb11f4] Dispatch completed in 14.40s
2026-03-10 13:16:13 - __main__ - INFO - [60fb11f4] ✅ Request completed in 14.75s
2026-03-10 13:57:03 - health.utils.env_loader - INFO - Loading extra configuration from: /root/projects/butler/.gemini.current.env
2026-03-10 13:57:03 - __main__ - INFO - Starting Butler Bot with configuration:
2026-03-10 13:57:03 - __main__ - INFO -   Config file: .gemini.current.env
2026-03-10 13:57:03 - __main__ - INFO -   Model: google/gemini-3-flash-preview
2026-03-10 13:57:03 - __main__ - INFO -   Base URL: https://openrouter.ai/api
2026-03-10 13:57:03 - __main__ - INFO -   Using proxy: Yes
2026-03-10 13:57:04 - slack_bot.llm.gemini - INFO - Using OpenRouter: https://openrouter.ai/api
2026-03-10 13:57:04 - slack_bot.llm.gemini - INFO - Initialized Gemini model: google/gemini-3-flash-preview
2026-03-10 13:57:04 - slack_bot.dispatcher - INFO - Using tool preset: all (21 tools)
2026-03-10 13:57:04 - slack_bot.dispatcher - INFO - Dispatcher initialized with Gemini
2026-03-10 13:57:04 - __main__ - INFO - Dispatcher initialized in 'all' mode
2026-03-10 13:57:04 - __main__ - INFO - ⚡️ Butler (Gemini) is connected to Slack!
⚡️ Bolt app is running!
2026-03-10 13:57:16 - __main__ - INFO - [6e86e43f] 📥 Received message from U0A8ZCK7RJM in D0AA4GBQRKK: 同步佳明数据 (Files: 0)
2026-03-10 13:57:16 - slack_bot.dispatcher - INFO - [6e86e43f] Processing message in D0AA4GBQRKK from U0A8ZCK7RJM
2026-03-10 13:57:16 - slack_bot.dispatcher - INFO - [6e86e43f] Calling Gemini for initial response...
2026-03-10 13:57:16 - slack_bot.dispatcher - INFO - [6e86e43f] Request config: model=google/gemini-3-flash-preview, tools=21, context=39 msgs
2026-03-10 13:57:19 - slack_bot.dispatcher - WARNING - [6e86e43f] Gemini returned empty response_text! (This usually means the proxy has issues)
2026-03-10 13:57:19 - slack_bot.dispatcher - INFO - [6e86e43f] Gemini response: text=0 chars, tool_calls=3
2026-03-10 13:57:19 - slack_bot.dispatcher - INFO - [6e86e43f] Tool calls successfully generated by Gemini (no SAFETY OVERRIDE needed)
2026-03-10 13:57:19 - slack_bot.dispatcher - INFO - [6e86e43f] Gemini response in 2.67s: 0 chars, 3 tools
2026-03-10 13:57:19 - slack_bot.dispatcher - INFO - [6e86e43f] Executing 3 tools
2026-03-10 13:57:19 - slack_bot.dispatcher - INFO - [6e86e43f] Tool: sync_garmin Args: {'target_date': '2026-03-10'}
2026-03-10 13:57:19 - slack_bot.tools.garmin - INFO - Starting Garmin sync for 2026-03-10...
2026-03-10 13:57:19 - health.services.data_sync - INFO - Authenticating with Garmin...
2026-03-10 13:57:19 - health.services.garmin_client - INFO - Authenticating with Garmin Connect China for 350134531@qq.com
2026-03-10 13:57:20 - health.services.garmin_client - INFO - Successfully authenticated with Garmin Connect China
2026-03-10 13:57:20 - health.services.data_sync - INFO - Authentication successful
2026-03-10 13:57:20 - health.services.data_sync - INFO - Syncing 14 metric types from 2026-03-10 to 2026-03-10
2026-03-10 13:57:20 - health.services.data_sync - INFO - Syncing steps from 2026-03-10 to 2026-03-10 (1 days)
2026-03-10 13:57:20 - health.services.data_sync - INFO - ✓ Synced steps for 2026-03-10
2026-03-10 13:57:20 - health.services.data_sync - INFO - steps sync complete: 1 synced, 0 skipped, 0 errors
2026-03-10 13:57:20 - health.services.data_sync - INFO - Syncing heart_rate from 2026-03-10 to 2026-03-10 (1 days)
2026-03-10 13:57:20 - health.services.data_sync - INFO - ✓ Synced heart_rate for 2026-03-10
2026-03-10 13:57:20 - health.services.data_sync - INFO - heart_rate sync complete: 1 synced, 0 skipped, 0 errors
2026-03-10 13:57:20 - health.services.data_sync - INFO - Syncing sleep from 2026-03-10 to 2026-03-10 (1 days)
2026-03-10 13:57:21 - health.services.data_sync - INFO - ✓ Synced sleep for 2026-03-10
2026-03-10 13:57:21 - health.services.data_sync - INFO - sleep sync complete: 1 synced, 0 skipped, 0 errors
2026-03-10 13:57:21 - health.services.data_sync - INFO - Syncing stress from 2026-03-10 to 2026-03-10 (1 days)
2026-03-10 13:57:21 - health.services.data_sync - INFO - ✓ Synced stress for 2026-03-10
2026-03-10 13:57:21 - health.services.data_sync - INFO - stress sync complete: 1 synced, 0 skipped, 0 errors
2026-03-10 13:57:21 - health.services.data_sync - INFO - Syncing body_battery from 2026-03-10 to 2026-03-10 (1 days)
2026-03-10 13:57:21 - health.services.data_sync - INFO - ✓ Synced body_battery for 2026-03-10
2026-03-10 13:57:21 - health.services.data_sync - INFO - body_battery sync complete: 1 synced, 0 skipped, 0 errors
2026-03-10 13:57:21 - health.services.data_sync - INFO - Syncing spo2 from 2026-03-10 to 2026-03-10 (1 days)
2026-03-10 13:57:21 - health.services.data_sync - INFO - ✓ Synced spo2 for 2026-03-10
2026-03-10 13:57:21 - health.services.data_sync - INFO - spo2 sync complete: 1 synced, 0 skipped, 0 errors
2026-03-10 13:57:21 - health.services.data_sync - INFO - Syncing respiration from 2026-03-10 to 2026-03-10 (1 days)
2026-03-10 13:57:21 - health.services.data_sync - INFO - ✓ Synced respiration for 2026-03-10
2026-03-10 13:57:21 - health.services.data_sync - INFO - respiration sync complete: 1 synced, 0 skipped, 0 errors
2026-03-10 13:57:21 - health.services.data_sync - INFO - Syncing hydration from 2026-03-10 to 2026-03-10 (1 days)
2026-03-10 13:57:21 - health.services.data_sync - INFO - ✓ Synced hydration for 2026-03-10
2026-03-10 13:57:21 - health.services.data_sync - INFO - hydration sync complete: 1 synced, 0 skipped, 0 errors
2026-03-10 13:57:21 - health.services.data_sync - INFO - Syncing floors from 2026-03-10 to 2026-03-10 (1 days)
2026-03-10 13:57:22 - health.services.data_sync - INFO - ✓ Synced floors for 2026-03-10
2026-03-10 13:57:22 - health.services.data_sync - INFO - floors sync complete: 1 synced, 0 skipped, 0 errors
2026-03-10 13:57:22 - health.services.data_sync - INFO - Syncing intensity_minutes from 2026-03-10 to 2026-03-10 (1 days)
2026-03-10 13:57:22 - health.services.data_sync - INFO - ✓ Synced intensity_minutes for 2026-03-10
2026-03-10 13:57:22 - health.services.data_sync - INFO - intensity_minutes sync complete: 1 synced, 0 skipped, 0 errors
2026-03-10 13:57:22 - health.services.data_sync - INFO - Syncing hrv from 2026-03-10 to 2026-03-10 (1 days)
2026-03-10 13:57:22 - health.services.data_sync - INFO - ✓ Synced hrv for 2026-03-10
2026-03-10 13:57:22 - health.services.data_sync - INFO - hrv sync complete: 1 synced, 0 skipped, 0 errors
2026-03-10 13:57:22 - health.services.data_sync - INFO - Syncing rhr from 2026-03-10 to 2026-03-10 (1 days)
2026-03-10 13:57:22 - health.services.data_sync - INFO - ✓ Synced rhr for 2026-03-10
2026-03-10 13:57:22 - health.services.data_sync - INFO - rhr sync complete: 1 synced, 0 skipped, 0 errors
2026-03-10 13:57:22 - health.services.data_sync - INFO - Syncing weight from 2026-03-10 to 2026-03-10 (1 days)
2026-03-10 13:57:22 - health.services.data_sync - INFO - weight sync complete: 0 synced, 1 skipped, 0 errors
2026-03-10 13:57:22 - health.services.data_sync - INFO - Syncing lifestyle_logging from 2026-03-10 to 2026-03-10 (1 days)
2026-03-10 13:57:22 - health.services.data_sync - INFO - lifestyle_logging sync complete: 0 synced, 1 skipped, 0 errors
2026-03-10 13:57:22 - health.services.data_sync - INFO - Syncing activities from 2026-03-10 to 2026-03-10
2026-03-10 13:57:22 - health.services.data_sync - INFO - Found 0 activities
2026-03-10 13:57:22 - health.services.data_sync - INFO - Activity sync complete: 0 synced, 0 skipped, 0 errors
2026-03-10 13:57:22 - health.services.query - INFO - Querying health data summary for 2026-03-10
2026-03-10 13:57:22 - health.services.query - INFO - Found 12 metrics and 0 activities
2026-03-10 13:57:22 - slack_bot.dispatcher - INFO - [6e86e43f] ✓ sync_garmin finished in 3.30s
2026-03-10 13:57:22 - slack_bot.dispatcher - INFO - [6e86e43f] Tool: get_daily_detailed_stats Args: {'target_date': '2026-03-10'}
2026-03-10 13:57:22 - health.services.query - INFO - Querying health data summary for 2026-03-10
2026-03-10 13:57:22 - health.services.query - INFO - Found 12 metrics and 0 activities
2026-03-10 13:57:22 - slack_bot.dispatcher - INFO - [6e86e43f] ✓ get_daily_detailed_stats finished in 0.01s
2026-03-10 13:57:22 - slack_bot.dispatcher - INFO - [6e86e43f] Tool: get_activity_history Args: {'start_date': '2026-03-10', 'end_date': '2026-03-10'}
2026-03-10 13:57:22 - health.services.query - INFO - Querying activities from 2026-03-10 to 2026-03-10
2026-03-10 13:57:22 - health.services.query - INFO - Found 0 activities
2026-03-10 13:57:22 - slack_bot.dispatcher - INFO - [6e86e43f] ✓ get_activity_history finished in 0.00s
2026-03-10 13:57:22 - slack_bot.dispatcher - INFO - [6e86e43f] Requesting final analysis...
2026-03-10 13:57:26 - slack_bot.dispatcher - INFO - [6e86e43f] Final analysis received in 4.09s
2026-03-10 13:57:26 - slack_bot.dispatcher - INFO - Formatted text (len 618 -> 592)
2026-03-10 13:57:27 - slack_bot.dispatcher - WARNING - [6e86e43f] Update failed, posting new: The request to the Slack API failed. (url: https://slack.com/api/chat.update)
The server responded with: {'ok': False, 'error': 'msg_too_long'}
2026-03-10 13:57:27 - slack_bot.dispatcher - INFO - [6e86e43f] Dispatch completed in 10.72s
2026-03-10 13:57:27 - __main__ - INFO - [6e86e43f] ✅ Request completed in 11.05s
2026-03-10 14:02:20 - __main__ - INFO - [33bfa931] 📥 Received message from U0A8ZCK7RJM in D0AA4GBQRKK: 嗯嗯，我决定椭圆机zone2对我强度即使不大，也可以练二休一，确保不运动过度 (Files: 0)
2026-03-10 14:02:20 - slack_bot.dispatcher - INFO - [33bfa931] Processing message in D0AA4GBQRKK from U0A8ZCK7RJM
2026-03-10 14:02:20 - slack_bot.dispatcher - INFO - [33bfa931] Calling Gemini for initial response...
2026-03-10 14:02:20 - slack_bot.dispatcher - INFO - [33bfa931] Request config: model=google/gemini-3-flash-preview, tools=21, context=39 msgs
2026-03-10 14:02:27 - slack_bot.dispatcher - INFO - [33bfa931] Gemini response: text=861 chars, tool_calls=0
2026-03-10 14:02:27 - slack_bot.dispatcher - INFO - [33bfa931] No tool calls from Gemini - checking SAFETY OVERRIDE keywords...
2026-03-10 14:02:27 - slack_bot.dispatcher - WARNING - [33bfa931] 🔧 SAFETY OVERRIDE: Forcing get_activity_history for 2026-03-10
2026-03-10 14:02:27 - slack_bot.dispatcher - INFO - [33bfa931] No SAFETY OVERRIDE match found - will return empty response or text
2026-03-10 14:02:27 - slack_bot.dispatcher - INFO - [33bfa931] Gemini response in 7.18s: 861 chars, 1 tools
2026-03-10 14:02:27 - slack_bot.dispatcher - INFO - [33bfa931] Executing 1 tools
2026-03-10 14:02:27 - slack_bot.dispatcher - INFO - [33bfa931] Tool: get_activity_history Args: {'start_date': '2026-03-10', 'end_date': '2026-03-10'}
2026-03-10 14:02:27 - health.services.query - INFO - Querying activities from 2026-03-10 to 2026-03-10
2026-03-10 14:02:27 - health.services.query - INFO - Found 0 activities
2026-03-10 14:02:27 - slack_bot.dispatcher - INFO - [33bfa931] ✓ get_activity_history finished in 0.00s
2026-03-10 14:02:27 - slack_bot.dispatcher - INFO - [33bfa931] Requesting final analysis...
2026-03-10 14:02:33 - slack_bot.dispatcher - INFO - [33bfa931] Final analysis received in 5.43s
2026-03-10 14:02:33 - slack_bot.dispatcher - INFO - Formatted text (len 634 -> 610)
2026-03-10 14:02:33 - slack_bot.dispatcher - INFO - [33bfa931] 📤 Message updated 1773122540.547839
2026-03-10 14:02:33 - slack_bot.dispatcher - INFO - [33bfa931] Dispatch completed in 12.99s
2026-03-10 14:02:33 - __main__ - INFO - [33bfa931] ✅ Request completed in 13.31s
Failed to establish a connection (session id: 08f3b705-ad92-4160-83a2-e776f9011e5b, error: The read operation timed out)
on_error invoked (session id: aca8a14f-7eb8-46cc-b4d4-e8c8dc42fbbb, error: TimeoutError, message: The read operation timed out)
Failed to establish a connection (session id: def0a76b-80d2-46f2-a8f7-4324c078b5a5, error: The read operation timed out)
on_error invoked (session id: 08f3b705-ad92-4160-83a2-e776f9011e5b, error: TimeoutError, message: The read operation timed out)
2026-03-12 15:53:38 - __main__ - INFO - [90b6a02e] 📥 Received message from U0A8ZCK7RJM in D0AA4GBQRKK: 同步佳明数据 (Files: 0)
2026-03-12 15:53:39 - slack_bot.dispatcher - INFO - [90b6a02e] Processing message in D0AA4GBQRKK from U0A8ZCK7RJM
2026-03-12 15:53:39 - slack_bot.dispatcher - INFO - [90b6a02e] Calling Gemini for initial response...
2026-03-12 15:53:39 - slack_bot.dispatcher - INFO - [90b6a02e] Request config: model=google/gemini-3-flash-preview, tools=21, context=39 msgs
2026-03-12 15:53:43 - slack_bot.dispatcher - WARNING - [90b6a02e] Gemini returned empty response_text! (This usually means the proxy has issues)
2026-03-12 15:53:43 - slack_bot.dispatcher - INFO - [90b6a02e] Gemini response: text=0 chars, tool_calls=2
2026-03-12 15:53:43 - slack_bot.dispatcher - INFO - [90b6a02e] Tool calls successfully generated by Gemini (no SAFETY OVERRIDE needed)
2026-03-12 15:53:43 - slack_bot.dispatcher - INFO - [90b6a02e] Gemini response in 4.22s: 0 chars, 2 tools
2026-03-12 15:53:43 - slack_bot.dispatcher - INFO - [90b6a02e] Executing 2 tools
2026-03-12 15:53:43 - slack_bot.dispatcher - WARNING - [90b6a02e] 🔧 Fixing sync_garmin target_date from 2026-03-11 to 2026-03-12
2026-03-12 15:53:43 - slack_bot.dispatcher - INFO - [90b6a02e] Tool: sync_garmin Args: {'target_date': '2026-03-12'}
2026-03-12 15:53:43 - slack_bot.tools.garmin - INFO - Starting Garmin sync for 2026-03-12...
2026-03-12 15:53:43 - health.services.data_sync - INFO - Authenticating with Garmin...
2026-03-12 15:53:43 - health.services.garmin_client - INFO - Authenticating with Garmin Connect China for 350134531@qq.com
2026-03-12 15:53:44 - health.services.garmin_client - INFO - Successfully authenticated with Garmin Connect China
2026-03-12 15:53:44 - health.services.data_sync - INFO - Authentication successful
2026-03-12 15:53:44 - health.services.data_sync - INFO - Syncing 14 metric types from 2026-03-12 to 2026-03-12
2026-03-12 15:53:44 - health.services.data_sync - INFO - Syncing steps from 2026-03-12 to 2026-03-12 (1 days)
2026-03-12 15:53:44 - health.services.data_sync - INFO - ✓ Synced steps for 2026-03-12
2026-03-12 15:53:44 - health.services.data_sync - INFO - steps sync complete: 1 synced, 0 skipped, 0 errors
2026-03-12 15:53:44 - health.services.data_sync - INFO - Syncing heart_rate from 2026-03-12 to 2026-03-12 (1 days)
2026-03-12 15:53:44 - health.services.data_sync - INFO - ✓ Synced heart_rate for 2026-03-12
2026-03-12 15:53:44 - health.services.data_sync - INFO - heart_rate sync complete: 1 synced, 0 skipped, 0 errors
2026-03-12 15:53:44 - health.services.data_sync - INFO - Syncing sleep from 2026-03-12 to 2026-03-12 (1 days)
2026-03-12 15:53:44 - health.services.data_sync - INFO - ✓ Synced sleep for 2026-03-12
2026-03-12 15:53:44 - health.services.data_sync - INFO - sleep sync complete: 1 synced, 0 skipped, 0 errors
2026-03-12 15:53:44 - health.services.data_sync - INFO - Syncing stress from 2026-03-12 to 2026-03-12 (1 days)
2026-03-12 15:53:45 - health.services.data_sync - INFO - ✓ Synced stress for 2026-03-12
2026-03-12 15:53:45 - health.services.data_sync - INFO - stress sync complete: 1 synced, 0 skipped, 0 errors
2026-03-12 15:53:45 - health.services.data_sync - INFO - Syncing body_battery from 2026-03-12 to 2026-03-12 (1 days)
2026-03-12 15:53:45 - health.services.data_sync - INFO - ✓ Synced body_battery for 2026-03-12
2026-03-12 15:53:45 - health.services.data_sync - INFO - body_battery sync complete: 1 synced, 0 skipped, 0 errors
2026-03-12 15:53:45 - health.services.data_sync - INFO - Syncing spo2 from 2026-03-12 to 2026-03-12 (1 days)
2026-03-12 15:53:45 - health.services.data_sync - INFO - ✓ Synced spo2 for 2026-03-12
2026-03-12 15:53:45 - health.services.data_sync - INFO - spo2 sync complete: 1 synced, 0 skipped, 0 errors
2026-03-12 15:53:45 - health.services.data_sync - INFO - Syncing respiration from 2026-03-12 to 2026-03-12 (1 days)
2026-03-12 15:53:45 - health.services.data_sync - INFO - ✓ Synced respiration for 2026-03-12
2026-03-12 15:53:45 - health.services.data_sync - INFO - respiration sync complete: 1 synced, 0 skipped, 0 errors
2026-03-12 15:53:45 - health.services.data_sync - INFO - Syncing hydration from 2026-03-12 to 2026-03-12 (1 days)
2026-03-12 15:53:45 - health.services.data_sync - INFO - ✓ Synced hydration for 2026-03-12
2026-03-12 15:53:45 - health.services.data_sync - INFO - hydration sync complete: 1 synced, 0 skipped, 0 errors
2026-03-12 15:53:45 - health.services.data_sync - INFO - Syncing floors from 2026-03-12 to 2026-03-12 (1 days)
2026-03-12 15:53:45 - health.services.data_sync - INFO - ✓ Synced floors for 2026-03-12
2026-03-12 15:53:45 - health.services.data_sync - INFO - floors sync complete: 1 synced, 0 skipped, 0 errors
2026-03-12 15:53:45 - health.services.data_sync - INFO - Syncing intensity_minutes from 2026-03-12 to 2026-03-12 (1 days)
2026-03-12 15:53:45 - health.services.data_sync - INFO - ✓ Synced intensity_minutes for 2026-03-12
2026-03-12 15:53:45 - health.services.data_sync - INFO - intensity_minutes sync complete: 1 synced, 0 skipped, 0 errors
2026-03-12 15:53:45 - health.services.data_sync - INFO - Syncing hrv from 2026-03-12 to 2026-03-12 (1 days)
2026-03-12 15:53:46 - health.services.data_sync - INFO - ✓ Synced hrv for 2026-03-12
2026-03-12 15:53:46 - health.services.data_sync - INFO - hrv sync complete: 1 synced, 0 skipped, 0 errors
2026-03-12 15:53:46 - health.services.data_sync - INFO - Syncing rhr from 2026-03-12 to 2026-03-12 (1 days)
2026-03-12 15:53:46 - health.services.data_sync - INFO - ✓ Synced rhr for 2026-03-12
2026-03-12 15:53:46 - health.services.data_sync - INFO - rhr sync complete: 1 synced, 0 skipped, 0 errors
2026-03-12 15:53:46 - health.services.data_sync - INFO - Syncing weight from 2026-03-12 to 2026-03-12 (1 days)
2026-03-12 15:53:46 - health.services.data_sync - INFO - weight sync complete: 0 synced, 1 skipped, 0 errors
2026-03-12 15:53:46 - health.services.data_sync - INFO - Syncing lifestyle_logging from 2026-03-12 to 2026-03-12 (1 days)
2026-03-12 15:53:46 - health.services.data_sync - INFO - lifestyle_logging sync complete: 0 synced, 1 skipped, 0 errors
2026-03-12 15:53:46 - health.services.data_sync - INFO - Syncing activities from 2026-03-12 to 2026-03-12
2026-03-12 15:53:46 - health.services.garmin_client - INFO - Fetched 1 activities
2026-03-12 15:53:46 - health.services.data_sync - INFO - Found 1 activities
2026-03-12 15:53:46 - health.services.data_sync - INFO - ✓ Synced activity 572701920 (elliptical) on 2026-03-12
2026-03-12 15:53:46 - health.services.data_sync - INFO - Activity sync complete: 1 synced, 0 skipped, 0 errors
2026-03-12 15:53:46 - health.services.query - INFO - Querying health data summary for 2026-03-12
2026-03-12 15:53:46 - health.services.query - INFO - Found 12 metrics and 1 activities
2026-03-12 15:53:46 - slack_bot.dispatcher - INFO - [90b6a02e] ✓ sync_garmin finished in 3.33s
2026-03-12 15:53:46 - slack_bot.dispatcher - INFO - [90b6a02e] Tool: get_daily_detailed_stats Args: {'target_date': '2026-03-11'}
2026-03-12 15:53:46 - health.services.query - INFO - Querying health data summary for 2026-03-11
2026-03-12 15:53:46 - health.services.query - INFO - Found 12 metrics and 1 activities
2026-03-12 15:53:46 - slack_bot.dispatcher - INFO - [90b6a02e] ✓ get_daily_detailed_stats finished in 0.02s
2026-03-12 15:53:46 - slack_bot.dispatcher - INFO - [90b6a02e] Requesting final analysis...
2026-03-12 15:53:51 - slack_bot.dispatcher - INFO - [90b6a02e] Final analysis received in 4.96s
2026-03-12 15:53:51 - slack_bot.dispatcher - INFO - Formatted text (len 638 -> 612)
2026-03-12 15:53:51 - slack_bot.dispatcher - WARNING - [90b6a02e] Update failed, posting new: The request to the Slack API failed. (url: https://slack.com/api/chat.update)
The server responded with: {'ok': False, 'error': 'msg_too_long'}
2026-03-12 15:53:52 - slack_bot.dispatcher - INFO - [90b6a02e] Dispatch completed in 13.18s
2026-03-12 15:53:52 - __main__ - INFO - [90b6a02e] ✅ Request completed in 13.49s
2026-03-12 15:55:16 - __main__ - INFO - [8b035fa7] 📥 Received message from U0A8ZCK7RJM in D0AA4GBQRKK: 有较长一段时间（可能两到三周）没有进行力量训练，引体向上和卧推都没做，对身体会有什么影响，是否应该开始恢复锻炼 (Files: 0)
2026-03-12 15:55:16 - slack_bot.dispatcher - INFO - [8b035fa7] Processing message in D0AA4GBQRKK from U0A8ZCK7RJM
2026-03-12 15:55:16 - slack_bot.dispatcher - INFO - [8b035fa7] Calling Gemini for initial response...
2026-03-12 15:55:16 - slack_bot.dispatcher - INFO - [8b035fa7] Request config: model=google/gemini-3-flash-preview, tools=21, context=39 msgs
2026-03-12 15:55:26 - slack_bot.dispatcher - INFO - [8b035fa7] Gemini response: text=1377 chars, tool_calls=0
2026-03-12 15:55:26 - slack_bot.dispatcher - INFO - [8b035fa7] No tool calls from Gemini - checking SAFETY OVERRIDE keywords...
2026-03-12 15:55:26 - slack_bot.dispatcher - WARNING - [8b035fa7] 🔧 SAFETY OVERRIDE: Forcing get_metric_history for rhr (2026-02-10 to 2026-03-12)
2026-03-12 15:55:26 - slack_bot.dispatcher - INFO - [8b035fa7] No SAFETY OVERRIDE match found - will return empty response or text
2026-03-12 15:55:26 - slack_bot.dispatcher - INFO - [8b035fa7] Gemini response in 9.62s: 1377 chars, 1 tools
2026-03-12 15:55:26 - slack_bot.dispatcher - INFO - [8b035fa7] Executing 1 tools
2026-03-12 15:55:26 - slack_bot.dispatcher - INFO - [8b035fa7] Tool: get_metric_history Args: {'metric_type': 'rhr', 'start_date': '2026-02-10', 'end_date': '2026-03-12'}
2026-03-12 15:55:26 - slack_bot.tools.health_read - INFO - Time range 31 days - using aggregated analysis
2026-03-12 15:55:26 - health.services.query - INFO - Querying rhr from 2026-02-10 to 2026-03-12
2026-03-12 15:55:26 - health.services.query - INFO - Found 28 records for rhr
2026-03-12 15:55:26 - slack_bot.dispatcher - INFO - [8b035fa7] ✓ get_metric_history finished in 0.01s
2026-03-12 15:55:26 - slack_bot.dispatcher - INFO - [8b035fa7] Requesting final analysis...
2026-03-12 15:55:33 - slack_bot.dispatcher - INFO - [8b035fa7] Final analysis received in 7.21s
2026-03-12 15:55:33 - slack_bot.dispatcher - INFO - Formatted text (len 985 -> 947)
2026-03-12 15:55:33 - slack_bot.dispatcher - INFO - [8b035fa7] 📤 Message updated 1773302116.347739
2026-03-12 15:55:33 - slack_bot.dispatcher - INFO - [8b035fa7] Dispatch completed in 17.17s
2026-03-12 15:55:33 - __main__ - INFO - [8b035fa7] ✅ Request completed in 17.47s
2026-03-14 12:36:35 - __main__ - INFO - [4c0d6bd5] 📥 Received message from U0A8ZCK7RJM in D0AA4GBQRKK: 同步佳明数据 (Files: 0)
2026-03-14 12:36:35 - slack_bot.dispatcher - INFO - [4c0d6bd5] Processing message in D0AA4GBQRKK from U0A8ZCK7RJM
2026-03-14 12:36:35 - slack_bot.dispatcher - INFO - [4c0d6bd5] Calling Gemini for initial response...
2026-03-14 12:36:35 - slack_bot.dispatcher - INFO - [4c0d6bd5] Request config: model=google/gemini-3-flash-preview, tools=21, context=39 msgs
2026-03-14 12:36:38 - slack_bot.dispatcher - WARNING - [4c0d6bd5] Gemini returned empty response_text! (This usually means the proxy has issues)
2026-03-14 12:36:38 - slack_bot.dispatcher - INFO - [4c0d6bd5] Gemini response: text=0 chars, tool_calls=2
2026-03-14 12:36:38 - slack_bot.dispatcher - INFO - [4c0d6bd5] Tool calls successfully generated by Gemini (no SAFETY OVERRIDE needed)
2026-03-14 12:36:38 - slack_bot.dispatcher - INFO - [4c0d6bd5] Gemini response in 2.49s: 0 chars, 2 tools
2026-03-14 12:36:38 - slack_bot.dispatcher - INFO - [4c0d6bd5] Executing 2 tools
2026-03-14 12:36:38 - slack_bot.dispatcher - INFO - [4c0d6bd5] Tool: sync_garmin Args: {'target_date': '2026-03-14'}
2026-03-14 12:36:38 - slack_bot.tools.garmin - INFO - Starting Garmin sync for 2026-03-14...
2026-03-14 12:36:38 - health.services.data_sync - INFO - Authenticating with Garmin...
2026-03-14 12:36:38 - health.services.garmin_client - INFO - Authenticating with Garmin Connect China for 350134531@qq.com
2026-03-14 12:36:38 - health.services.garmin_client - INFO - Successfully authenticated with Garmin Connect China
2026-03-14 12:36:38 - health.services.data_sync - INFO - Authentication successful
2026-03-14 12:36:38 - health.services.data_sync - INFO - Syncing 14 metric types from 2026-03-14 to 2026-03-14
2026-03-14 12:36:38 - health.services.data_sync - INFO - Syncing steps from 2026-03-14 to 2026-03-14 (1 days)
2026-03-14 12:36:38 - health.services.data_sync - INFO - ✓ Synced steps for 2026-03-14
2026-03-14 12:36:38 - health.services.data_sync - INFO - steps sync complete: 1 synced, 0 skipped, 0 errors
2026-03-14 12:36:38 - health.services.data_sync - INFO - Syncing heart_rate from 2026-03-14 to 2026-03-14 (1 days)
2026-03-14 12:36:38 - health.services.data_sync - INFO - ✓ Synced heart_rate for 2026-03-14
2026-03-14 12:36:38 - health.services.data_sync - INFO - heart_rate sync complete: 1 synced, 0 skipped, 0 errors
2026-03-14 12:36:38 - health.services.data_sync - INFO - Syncing sleep from 2026-03-14 to 2026-03-14 (1 days)
2026-03-14 12:36:39 - health.services.data_sync - INFO - ✓ Synced sleep for 2026-03-14
2026-03-14 12:36:39 - health.services.data_sync - INFO - sleep sync complete: 1 synced, 0 skipped, 0 errors
2026-03-14 12:36:39 - health.services.data_sync - INFO - Syncing stress from 2026-03-14 to 2026-03-14 (1 days)
2026-03-14 12:36:39 - health.services.data_sync - INFO - ✓ Synced stress for 2026-03-14
2026-03-14 12:36:39 - health.services.data_sync - INFO - stress sync complete: 1 synced, 0 skipped, 0 errors
2026-03-14 12:36:39 - health.services.data_sync - INFO - Syncing body_battery from 2026-03-14 to 2026-03-14 (1 days)
2026-03-14 12:36:39 - health.services.data_sync - INFO - ✓ Synced body_battery for 2026-03-14
2026-03-14 12:36:39 - health.services.data_sync - INFO - body_battery sync complete: 1 synced, 0 skipped, 0 errors
2026-03-14 12:36:39 - health.services.data_sync - INFO - Syncing spo2 from 2026-03-14 to 2026-03-14 (1 days)
2026-03-14 12:36:39 - health.services.data_sync - INFO - ✓ Synced spo2 for 2026-03-14
2026-03-14 12:36:39 - health.services.data_sync - INFO - spo2 sync complete: 1 synced, 0 skipped, 0 errors
2026-03-14 12:36:39 - health.services.data_sync - INFO - Syncing respiration from 2026-03-14 to 2026-03-14 (1 days)
2026-03-14 12:36:39 - health.services.data_sync - INFO - ✓ Synced respiration for 2026-03-14
2026-03-14 12:36:39 - health.services.data_sync - INFO - respiration sync complete: 1 synced, 0 skipped, 0 errors
2026-03-14 12:36:39 - health.services.data_sync - INFO - Syncing hydration from 2026-03-14 to 2026-03-14 (1 days)
2026-03-14 12:36:39 - health.services.data_sync - INFO - ✓ Synced hydration for 2026-03-14
2026-03-14 12:36:39 - health.services.data_sync - INFO - hydration sync complete: 1 synced, 0 skipped, 0 errors
2026-03-14 12:36:39 - health.services.data_sync - INFO - Syncing floors from 2026-03-14 to 2026-03-14 (1 days)
2026-03-14 12:36:40 - health.services.data_sync - INFO - ✓ Synced floors for 2026-03-14
2026-03-14 12:36:40 - health.services.data_sync - INFO - floors sync complete: 1 synced, 0 skipped, 0 errors
2026-03-14 12:36:40 - health.services.data_sync - INFO - Syncing intensity_minutes from 2026-03-14 to 2026-03-14 (1 days)
2026-03-14 12:36:40 - health.services.data_sync - INFO - ✓ Synced intensity_minutes for 2026-03-14
2026-03-14 12:36:40 - health.services.data_sync - INFO - intensity_minutes sync complete: 1 synced, 0 skipped, 0 errors
2026-03-14 12:36:40 - health.services.data_sync - INFO - Syncing hrv from 2026-03-14 to 2026-03-14 (1 days)
2026-03-14 12:36:40 - health.services.data_sync - INFO - ✓ Synced hrv for 2026-03-14
2026-03-14 12:36:40 - health.services.data_sync - INFO - hrv sync complete: 1 synced, 0 skipped, 0 errors
2026-03-14 12:36:40 - health.services.data_sync - INFO - Syncing rhr from 2026-03-14 to 2026-03-14 (1 days)
2026-03-14 12:36:40 - health.services.data_sync - INFO - ✓ Synced rhr for 2026-03-14
2026-03-14 12:36:40 - health.services.data_sync - INFO - rhr sync complete: 1 synced, 0 skipped, 0 errors
2026-03-14 12:36:40 - health.services.data_sync - INFO - Syncing weight from 2026-03-14 to 2026-03-14 (1 days)
2026-03-14 12:36:40 - health.services.data_sync - INFO - weight sync complete: 0 synced, 1 skipped, 0 errors
2026-03-14 12:36:40 - health.services.data_sync - INFO - Syncing lifestyle_logging from 2026-03-14 to 2026-03-14 (1 days)
2026-03-14 12:36:40 - health.services.data_sync - INFO - lifestyle_logging sync complete: 0 synced, 1 skipped, 0 errors
2026-03-14 12:36:40 - health.services.data_sync - INFO - Syncing activities from 2026-03-14 to 2026-03-14
2026-03-14 12:36:40 - health.services.garmin_client - INFO - Fetched 1 activities
2026-03-14 12:36:40 - health.services.data_sync - INFO - Found 1 activities
2026-03-14 12:36:40 - health.services.data_sync - INFO - ✓ Synced activity 573377101 (elliptical) on 2026-03-14
2026-03-14 12:36:40 - health.services.data_sync - INFO - Activity sync complete: 1 synced, 0 skipped, 0 errors
2026-03-14 12:36:40 - health.services.query - INFO - Querying health data summary for 2026-03-14
2026-03-14 12:36:40 - health.services.query - INFO - Found 12 metrics and 1 activities
2026-03-14 12:36:40 - slack_bot.dispatcher - INFO - [4c0d6bd5] ✓ sync_garmin finished in 2.50s
2026-03-14 12:36:40 - slack_bot.dispatcher - INFO - [4c0d6bd5] Tool: get_daily_detailed_stats Args: {'target_date': '2026-03-14'}
2026-03-14 12:36:40 - health.services.query - INFO - Querying health data summary for 2026-03-14
2026-03-14 12:36:40 - health.services.query - INFO - Found 12 metrics and 1 activities
2026-03-14 12:36:40 - slack_bot.dispatcher - INFO - [4c0d6bd5] ✓ get_daily_detailed_stats finished in 0.01s
2026-03-14 12:36:40 - slack_bot.dispatcher - INFO - [4c0d6bd5] Requesting final analysis...
2026-03-14 12:36:45 - slack_bot.dispatcher - INFO - [4c0d6bd5] Final analysis received in 4.44s
2026-03-14 12:36:45 - slack_bot.dispatcher - INFO - Formatted text (len 661 -> 623)
2026-03-14 12:36:45 - slack_bot.dispatcher - WARNING - [4c0d6bd5] Update failed, posting new: The request to the Slack API failed. (url: https://slack.com/api/chat.update)
The server responded with: {'ok': False, 'error': 'msg_too_long'}
2026-03-14 12:36:45 - slack_bot.dispatcher - INFO - [4c0d6bd5] Dispatch completed in 10.19s
2026-03-14 12:36:45 - __main__ - INFO - [4c0d6bd5] ✅ Request completed in 10.53s
2026-03-15 10:13:23 - __main__ - INFO - [54983e12] 📥 Received message from U0A8ZCK7RJM in D0AA4GBQRKK: 同步佳明数据，并深入分析睡眠和运动情况 (Files: 0)
2026-03-15 10:13:23 - slack_bot.dispatcher - INFO - [54983e12] Processing message in D0AA4GBQRKK from U0A8ZCK7RJM
2026-03-15 10:13:23 - slack_bot.dispatcher - INFO - [54983e12] Calling Gemini for initial response...
2026-03-15 10:13:23 - slack_bot.dispatcher - INFO - [54983e12] Request config: model=google/gemini-3-flash-preview, tools=21, context=39 msgs
2026-03-15 10:13:26 - slack_bot.dispatcher - WARNING - [54983e12] Gemini returned empty response_text! (This usually means the proxy has issues)
2026-03-15 10:13:26 - slack_bot.dispatcher - INFO - [54983e12] Gemini response: text=0 chars, tool_calls=3
2026-03-15 10:13:26 - slack_bot.dispatcher - INFO - [54983e12] Tool calls successfully generated by Gemini (no SAFETY OVERRIDE needed)
2026-03-15 10:13:26 - slack_bot.dispatcher - INFO - [54983e12] Gemini response in 2.53s: 0 chars, 3 tools
2026-03-15 10:13:26 - slack_bot.dispatcher - INFO - [54983e12] Executing 3 tools
2026-03-15 10:13:26 - slack_bot.dispatcher - INFO - [54983e12] Tool: sync_garmin Args: {'target_date': '2026-03-15'}
2026-03-15 10:13:26 - slack_bot.tools.garmin - INFO - Starting Garmin sync for 2026-03-15...
2026-03-15 10:13:26 - health.services.data_sync - INFO - Authenticating with Garmin...
2026-03-15 10:13:26 - health.services.garmin_client - INFO - Authenticating with Garmin Connect China for 350134531@qq.com
2026-03-15 10:13:26 - health.services.garmin_client - INFO - Successfully authenticated with Garmin Connect China
2026-03-15 10:13:26 - health.services.data_sync - INFO - Authentication successful
2026-03-15 10:13:26 - health.services.data_sync - INFO - Syncing 14 metric types from 2026-03-15 to 2026-03-15
2026-03-15 10:13:26 - health.services.data_sync - INFO - Syncing steps from 2026-03-15 to 2026-03-15 (1 days)
2026-03-15 10:13:26 - health.services.data_sync - INFO - ✓ Synced steps for 2026-03-15
2026-03-15 10:13:26 - health.services.data_sync - INFO - steps sync complete: 1 synced, 0 skipped, 0 errors
2026-03-15 10:13:26 - health.services.data_sync - INFO - Syncing heart_rate from 2026-03-15 to 2026-03-15 (1 days)
2026-03-15 10:13:27 - health.services.data_sync - INFO - ✓ Synced heart_rate for 2026-03-15
2026-03-15 10:13:27 - health.services.data_sync - INFO - heart_rate sync complete: 1 synced, 0 skipped, 0 errors
2026-03-15 10:13:27 - health.services.data_sync - INFO - Syncing sleep from 2026-03-15 to 2026-03-15 (1 days)
2026-03-15 10:13:27 - health.services.data_sync - INFO - ✓ Synced sleep for 2026-03-15
2026-03-15 10:13:27 - health.services.data_sync - INFO - sleep sync complete: 1 synced, 0 skipped, 0 errors
2026-03-15 10:13:27 - health.services.data_sync - INFO - Syncing stress from 2026-03-15 to 2026-03-15 (1 days)
2026-03-15 10:13:27 - health.services.data_sync - INFO - ✓ Synced stress for 2026-03-15
2026-03-15 10:13:27 - health.services.data_sync - INFO - stress sync complete: 1 synced, 0 skipped, 0 errors
2026-03-15 10:13:27 - health.services.data_sync - INFO - Syncing body_battery from 2026-03-15 to 2026-03-15 (1 days)
2026-03-15 10:13:27 - health.services.data_sync - INFO - ✓ Synced body_battery for 2026-03-15
2026-03-15 10:13:27 - health.services.data_sync - INFO - body_battery sync complete: 1 synced, 0 skipped, 0 errors
2026-03-15 10:13:27 - health.services.data_sync - INFO - Syncing spo2 from 2026-03-15 to 2026-03-15 (1 days)
2026-03-15 10:13:27 - health.services.data_sync - INFO - ✓ Synced spo2 for 2026-03-15
2026-03-15 10:13:27 - health.services.data_sync - INFO - spo2 sync complete: 1 synced, 0 skipped, 0 errors
2026-03-15 10:13:27 - health.services.data_sync - INFO - Syncing respiration from 2026-03-15 to 2026-03-15 (1 days)
2026-03-15 10:13:27 - health.services.data_sync - INFO - ✓ Synced respiration for 2026-03-15
2026-03-15 10:13:27 - health.services.data_sync - INFO - respiration sync complete: 1 synced, 0 skipped, 0 errors
2026-03-15 10:13:27 - health.services.data_sync - INFO - Syncing hydration from 2026-03-15 to 2026-03-15 (1 days)
2026-03-15 10:13:28 - health.services.data_sync - INFO - ✓ Synced hydration for 2026-03-15
2026-03-15 10:13:28 - health.services.data_sync - INFO - hydration sync complete: 1 synced, 0 skipped, 0 errors
2026-03-15 10:13:28 - health.services.data_sync - INFO - Syncing floors from 2026-03-15 to 2026-03-15 (1 days)
2026-03-15 10:13:28 - health.services.data_sync - INFO - ✓ Synced floors for 2026-03-15
2026-03-15 10:13:28 - health.services.data_sync - INFO - floors sync complete: 1 synced, 0 skipped, 0 errors
2026-03-15 10:13:28 - health.services.data_sync - INFO - Syncing intensity_minutes from 2026-03-15 to 2026-03-15 (1 days)
2026-03-15 10:13:28 - health.services.data_sync - INFO - ✓ Synced intensity_minutes for 2026-03-15
2026-03-15 10:13:28 - health.services.data_sync - INFO - intensity_minutes sync complete: 1 synced, 0 skipped, 0 errors
2026-03-15 10:13:28 - health.services.data_sync - INFO - Syncing hrv from 2026-03-15 to 2026-03-15 (1 days)
2026-03-15 10:13:28 - health.services.data_sync - INFO - ✓ Synced hrv for 2026-03-15
2026-03-15 10:13:28 - health.services.data_sync - INFO - hrv sync complete: 1 synced, 0 skipped, 0 errors
2026-03-15 10:13:28 - health.services.data_sync - INFO - Syncing rhr from 2026-03-15 to 2026-03-15 (1 days)
2026-03-15 10:13:28 - health.services.data_sync - INFO - ✓ Synced rhr for 2026-03-15
2026-03-15 10:13:28 - health.services.data_sync - INFO - rhr sync complete: 1 synced, 0 skipped, 0 errors
2026-03-15 10:13:28 - health.services.data_sync - INFO - Syncing weight from 2026-03-15 to 2026-03-15 (1 days)
2026-03-15 10:13:28 - health.services.data_sync - INFO - weight sync complete: 0 synced, 1 skipped, 0 errors
2026-03-15 10:13:28 - health.services.data_sync - INFO - Syncing lifestyle_logging from 2026-03-15 to 2026-03-15 (1 days)
2026-03-15 10:13:28 - health.services.data_sync - INFO - lifestyle_logging sync complete: 0 synced, 1 skipped, 0 errors
2026-03-15 10:13:28 - health.services.data_sync - INFO - Syncing activities from 2026-03-15 to 2026-03-15
2026-03-15 10:13:28 - health.services.garmin_client - INFO - Fetched 1 activities
2026-03-15 10:13:28 - health.services.data_sync - INFO - Found 1 activities
2026-03-15 10:13:28 - health.services.data_sync - INFO - ✓ Synced activity 573715755 (elliptical) on 2026-03-15
2026-03-15 10:13:28 - health.services.data_sync - INFO - Activity sync complete: 1 synced, 0 skipped, 0 errors
2026-03-15 10:13:28 - health.services.query - INFO - Querying health data summary for 2026-03-15
2026-03-15 10:13:28 - health.services.query - INFO - Found 12 metrics and 1 activities
2026-03-15 10:13:28 - slack_bot.dispatcher - INFO - [54983e12] ✓ sync_garmin finished in 2.45s
2026-03-15 10:13:28 - slack_bot.dispatcher - INFO - [54983e12] Tool: get_daily_detailed_stats Args: {'target_date': '2026-03-15'}
2026-03-15 10:13:28 - health.services.query - INFO - Querying health data summary for 2026-03-15
2026-03-15 10:13:28 - health.services.query - INFO - Found 12 metrics and 1 activities
2026-03-15 10:13:28 - slack_bot.dispatcher - INFO - [54983e12] ✓ get_daily_detailed_stats finished in 0.01s
2026-03-15 10:13:28 - slack_bot.dispatcher - INFO - [54983e12] Tool: get_activity_history Args: {'end_date': '2026-03-15', 'start_date': '2026-03-14'}
2026-03-15 10:13:28 - health.services.query - INFO - Querying activities from 2026-03-14 to 2026-03-15
2026-03-15 10:13:28 - health.services.query - INFO - Found 2 activities
2026-03-15 10:13:28 - slack_bot.dispatcher - INFO - [54983e12] ✓ get_activity_history finished in 0.01s
2026-03-15 10:13:28 - slack_bot.dispatcher - INFO - [54983e12] Requesting final analysis...
2026-03-15 10:13:35 - slack_bot.dispatcher - INFO - [54983e12] Final analysis received in 6.56s
2026-03-15 10:13:35 - slack_bot.dispatcher - INFO - Formatted text (len 919 -> 877)
2026-03-15 10:13:35 - slack_bot.dispatcher - WARNING - [54983e12] Update failed, posting new: The request to the Slack API failed. (url: https://slack.com/api/chat.update)
The server responded with: {'ok': False, 'error': 'msg_too_long'}
2026-03-15 10:13:36 - slack_bot.dispatcher - INFO - [54983e12] Dispatch completed in 12.17s
2026-03-15 10:13:36 - __main__ - INFO - [54983e12] ✅ Request completed in 12.50s
2026-03-16 11:33:52 - __main__ - INFO - [c9a21ece] 📥 Received message from U0A8ZCK7RJM in D0AA4GBQRKK: 同步佳明数据 (Files: 0)
2026-03-16 11:33:53 - slack_bot.dispatcher - INFO - [c9a21ece] Processing message in D0AA4GBQRKK from U0A8ZCK7RJM
2026-03-16 11:33:53 - slack_bot.dispatcher - INFO - [c9a21ece] Calling Gemini for initial response...
2026-03-16 11:33:53 - slack_bot.dispatcher - INFO - [c9a21ece] Request config: model=google/gemini-3-flash-preview, tools=21, context=39 msgs
2026-03-16 11:33:56 - slack_bot.dispatcher - WARNING - [c9a21ece] Gemini returned empty response_text! (This usually means the proxy has issues)
2026-03-16 11:33:56 - slack_bot.dispatcher - INFO - [c9a21ece] Gemini response: text=0 chars, tool_calls=3
2026-03-16 11:33:56 - slack_bot.dispatcher - INFO - [c9a21ece] Tool calls successfully generated by Gemini (no SAFETY OVERRIDE needed)
2026-03-16 11:33:56 - slack_bot.dispatcher - INFO - [c9a21ece] Gemini response in 3.33s: 0 chars, 3 tools
2026-03-16 11:33:56 - slack_bot.dispatcher - INFO - [c9a21ece] Executing 3 tools
2026-03-16 11:33:56 - slack_bot.dispatcher - INFO - [c9a21ece] Tool: sync_garmin Args: {'target_date': '2026-03-16'}
2026-03-16 11:33:56 - slack_bot.tools.garmin - INFO - Starting Garmin sync for 2026-03-16...
2026-03-16 11:33:56 - health.services.data_sync - INFO - Authenticating with Garmin...
2026-03-16 11:33:56 - health.services.garmin_client - INFO - Authenticating with Garmin Connect China for 350134531@qq.com
2026-03-16 11:33:57 - health.services.garmin_client - INFO - Successfully authenticated with Garmin Connect China
2026-03-16 11:33:57 - health.services.data_sync - INFO - Authentication successful
2026-03-16 11:33:57 - health.services.data_sync - INFO - Syncing 14 metric types from 2026-03-16 to 2026-03-16
2026-03-16 11:33:57 - health.services.data_sync - INFO - Syncing steps from 2026-03-16 to 2026-03-16 (1 days)
2026-03-16 11:33:57 - health.services.data_sync - INFO - ✓ Synced steps for 2026-03-16
2026-03-16 11:33:57 - health.services.data_sync - INFO - steps sync complete: 1 synced, 0 skipped, 0 errors
2026-03-16 11:33:57 - health.services.data_sync - INFO - Syncing heart_rate from 2026-03-16 to 2026-03-16 (1 days)
2026-03-16 11:33:57 - health.services.data_sync - INFO - ✓ Synced heart_rate for 2026-03-16
2026-03-16 11:33:57 - health.services.data_sync - INFO - heart_rate sync complete: 1 synced, 0 skipped, 0 errors
2026-03-16 11:33:57 - health.services.data_sync - INFO - Syncing sleep from 2026-03-16 to 2026-03-16 (1 days)
2026-03-16 11:33:58 - health.services.data_sync - INFO - ✓ Synced sleep for 2026-03-16
2026-03-16 11:33:58 - health.services.data_sync - INFO - sleep sync complete: 1 synced, 0 skipped, 0 errors
2026-03-16 11:33:58 - health.services.data_sync - INFO - Syncing stress from 2026-03-16 to 2026-03-16 (1 days)
2026-03-16 11:33:58 - health.services.data_sync - INFO - ✓ Synced stress for 2026-03-16
2026-03-16 11:33:58 - health.services.data_sync - INFO - stress sync complete: 1 synced, 0 skipped, 0 errors
2026-03-16 11:33:58 - health.services.data_sync - INFO - Syncing body_battery from 2026-03-16 to 2026-03-16 (1 days)
2026-03-16 11:33:58 - health.services.data_sync - INFO - ✓ Synced body_battery for 2026-03-16
2026-03-16 11:33:58 - health.services.data_sync - INFO - body_battery sync complete: 1 synced, 0 skipped, 0 errors
2026-03-16 11:33:58 - health.services.data_sync - INFO - Syncing spo2 from 2026-03-16 to 2026-03-16 (1 days)
2026-03-16 11:33:58 - health.services.data_sync - INFO - ✓ Synced spo2 for 2026-03-16
2026-03-16 11:33:58 - health.services.data_sync - INFO - spo2 sync complete: 1 synced, 0 skipped, 0 errors
2026-03-16 11:33:58 - health.services.data_sync - INFO - Syncing respiration from 2026-03-16 to 2026-03-16 (1 days)
2026-03-16 11:33:58 - health.services.data_sync - INFO - ✓ Synced respiration for 2026-03-16
2026-03-16 11:33:58 - health.services.data_sync - INFO - respiration sync complete: 1 synced, 0 skipped, 0 errors
2026-03-16 11:33:58 - health.services.data_sync - INFO - Syncing hydration from 2026-03-16 to 2026-03-16 (1 days)
2026-03-16 11:33:58 - health.services.data_sync - INFO - ✓ Synced hydration for 2026-03-16
2026-03-16 11:33:58 - health.services.data_sync - INFO - hydration sync complete: 1 synced, 0 skipped, 0 errors
2026-03-16 11:33:58 - health.services.data_sync - INFO - Syncing floors from 2026-03-16 to 2026-03-16 (1 days)
2026-03-16 11:33:59 - health.services.data_sync - INFO - ✓ Synced floors for 2026-03-16
2026-03-16 11:33:59 - health.services.data_sync - INFO - floors sync complete: 1 synced, 0 skipped, 0 errors
2026-03-16 11:33:59 - health.services.data_sync - INFO - Syncing intensity_minutes from 2026-03-16 to 2026-03-16 (1 days)
2026-03-16 11:33:59 - health.services.data_sync - INFO - ✓ Synced intensity_minutes for 2026-03-16
2026-03-16 11:33:59 - health.services.data_sync - INFO - intensity_minutes sync complete: 1 synced, 0 skipped, 0 errors
2026-03-16 11:33:59 - health.services.data_sync - INFO - Syncing hrv from 2026-03-16 to 2026-03-16 (1 days)
2026-03-16 11:33:59 - health.services.data_sync - INFO - ✓ Synced hrv for 2026-03-16
2026-03-16 11:33:59 - health.services.data_sync - INFO - hrv sync complete: 1 synced, 0 skipped, 0 errors
2026-03-16 11:33:59 - health.services.data_sync - INFO - Syncing rhr from 2026-03-16 to 2026-03-16 (1 days)
2026-03-16 11:33:59 - health.services.data_sync - INFO - ✓ Synced rhr for 2026-03-16
2026-03-16 11:33:59 - health.services.data_sync - INFO - rhr sync complete: 1 synced, 0 skipped, 0 errors
2026-03-16 11:33:59 - health.services.data_sync - INFO - Syncing weight from 2026-03-16 to 2026-03-16 (1 days)
2026-03-16 11:33:59 - health.services.data_sync - INFO - weight sync complete: 0 synced, 1 skipped, 0 errors
2026-03-16 11:33:59 - health.services.data_sync - INFO - Syncing lifestyle_logging from 2026-03-16 to 2026-03-16 (1 days)
2026-03-16 11:33:59 - health.services.data_sync - INFO - lifestyle_logging sync complete: 0 synced, 1 skipped, 0 errors
2026-03-16 11:33:59 - health.services.data_sync - INFO - Syncing activities from 2026-03-16 to 2026-03-16
2026-03-16 11:33:59 - health.services.garmin_client - INFO - Fetched 1 activities
2026-03-16 11:33:59 - health.services.data_sync - INFO - Found 1 activities
2026-03-16 11:33:59 - health.services.data_sync - INFO - ✓ Synced activity 574065942 (elliptical) on 2026-03-16
2026-03-16 11:33:59 - health.services.data_sync - INFO - Activity sync complete: 1 synced, 0 skipped, 0 errors
2026-03-16 11:33:59 - health.services.query - INFO - Querying health data summary for 2026-03-16
2026-03-16 11:33:59 - health.services.query - INFO - Found 12 metrics and 1 activities
2026-03-16 11:33:59 - slack_bot.dispatcher - INFO - [c9a21ece] ✓ sync_garmin finished in 3.28s
2026-03-16 11:33:59 - slack_bot.dispatcher - INFO - [c9a21ece] Tool: get_daily_detailed_stats Args: {'target_date': '2026-03-16'}
2026-03-16 11:33:59 - health.services.query - INFO - Querying health data summary for 2026-03-16
2026-03-16 11:33:59 - health.services.query - INFO - Found 12 metrics and 1 activities
2026-03-16 11:33:59 - slack_bot.dispatcher - INFO - [c9a21ece] ✓ get_daily_detailed_stats finished in 0.01s
2026-03-16 11:33:59 - slack_bot.dispatcher - INFO - [c9a21ece] Tool: get_activity_history Args: {'start_date': '2026-03-16', 'end_date': '2026-03-16'}
2026-03-16 11:33:59 - health.services.query - INFO - Querying activities from 2026-03-16 to 2026-03-16
2026-03-16 11:33:59 - health.services.query - INFO - Found 1 activities
2026-03-16 11:33:59 - slack_bot.dispatcher - INFO - [c9a21ece] ✓ get_activity_history finished in 0.00s
2026-03-16 11:33:59 - slack_bot.dispatcher - INFO - [c9a21ece] Requesting final analysis...
2026-03-16 11:34:04 - slack_bot.dispatcher - INFO - [c9a21ece] Final analysis received in 5.09s
2026-03-16 11:34:04 - slack_bot.dispatcher - INFO - Formatted text (len 710 -> 674)
2026-03-16 11:34:05 - slack_bot.dispatcher - WARNING - [c9a21ece] Update failed, posting new: The request to the Slack API failed. (url: https://slack.com/api/chat.update)
The server responded with: {'ok': False, 'error': 'msg_too_long'}
2026-03-16 11:34:05 - slack_bot.dispatcher - INFO - [c9a21ece] Dispatch completed in 12.47s
2026-03-16 11:34:05 - __main__ - INFO - [c9a21ece] ✅ Request completed in 13.05s
2026-03-20 07:33:38 - __main__ - INFO - [0a90d27c] 📥 Received message from U0A8ZCK7RJM in D0AA4GBQRKK: 昨晚喝酒，睡眠似乎不好，请同步看看 (Files: 0)
2026-03-20 07:33:39 - slack_bot.dispatcher - INFO - [0a90d27c] Processing message in D0AA4GBQRKK from U0A8ZCK7RJM
2026-03-20 07:33:39 - slack_bot.dispatcher - INFO - [0a90d27c] Calling Gemini for initial response...
2026-03-20 07:33:39 - slack_bot.dispatcher - INFO - [0a90d27c] Request config: model=google/gemini-3-flash-preview, tools=21, context=39 msgs
2026-03-20 07:33:42 - slack_bot.dispatcher - WARNING - [0a90d27c] Gemini returned empty response_text! (This usually means the proxy has issues)
2026-03-20 07:33:42 - slack_bot.dispatcher - INFO - [0a90d27c] Gemini response: text=0 chars, tool_calls=2
2026-03-20 07:33:42 - slack_bot.dispatcher - INFO - [0a90d27c] Tool calls successfully generated by Gemini (no SAFETY OVERRIDE needed)
2026-03-20 07:33:42 - slack_bot.dispatcher - INFO - [0a90d27c] Gemini response in 3.46s: 0 chars, 2 tools
2026-03-20 07:33:42 - slack_bot.dispatcher - INFO - [0a90d27c] Executing 2 tools
2026-03-20 07:33:42 - slack_bot.dispatcher - INFO - [0a90d27c] Tool: sync_garmin Args: {'target_date': '2026-03-20'}
2026-03-20 07:33:43 - slack_bot.tools.garmin - INFO - Starting Garmin sync for 2026-03-20...
2026-03-20 07:33:43 - health.services.data_sync - INFO - Authenticating with Garmin...
2026-03-20 07:33:43 - health.services.garmin_client - INFO - Authenticating with Garmin Connect China for 350134531@qq.com
2026-03-20 07:33:44 - health.services.garmin_client - INFO - Successfully authenticated with Garmin Connect China
2026-03-20 07:33:44 - health.services.data_sync - INFO - Authentication successful
2026-03-20 07:33:44 - health.services.data_sync - INFO - Syncing 14 metric types from 2026-03-20 to 2026-03-20
2026-03-20 07:33:44 - health.services.data_sync - INFO - Syncing steps from 2026-03-20 to 2026-03-20 (1 days)
2026-03-20 07:33:44 - health.services.data_sync - INFO - ✓ Synced steps for 2026-03-20
2026-03-20 07:33:44 - health.services.data_sync - INFO - steps sync complete: 1 synced, 0 skipped, 0 errors
2026-03-20 07:33:44 - health.services.data_sync - INFO - Syncing heart_rate from 2026-03-20 to 2026-03-20 (1 days)
2026-03-20 07:33:44 - health.services.data_sync - INFO - ✓ Synced heart_rate for 2026-03-20
2026-03-20 07:33:44 - health.services.data_sync - INFO - heart_rate sync complete: 1 synced, 0 skipped, 0 errors
2026-03-20 07:33:44 - health.services.data_sync - INFO - Syncing sleep from 2026-03-20 to 2026-03-20 (1 days)
2026-03-20 07:33:44 - health.services.data_sync - INFO - ✓ Synced sleep for 2026-03-20
2026-03-20 07:33:44 - health.services.data_sync - INFO - sleep sync complete: 1 synced, 0 skipped, 0 errors
2026-03-20 07:33:44 - health.services.data_sync - INFO - Syncing stress from 2026-03-20 to 2026-03-20 (1 days)
2026-03-20 07:33:45 - health.services.data_sync - INFO - ✓ Synced stress for 2026-03-20
2026-03-20 07:33:45 - health.services.data_sync - INFO - stress sync complete: 1 synced, 0 skipped, 0 errors
2026-03-20 07:33:45 - health.services.data_sync - INFO - Syncing body_battery from 2026-03-20 to 2026-03-20 (1 days)
2026-03-20 07:33:45 - health.services.data_sync - INFO - ✓ Synced body_battery for 2026-03-20
2026-03-20 07:33:45 - health.services.data_sync - INFO - body_battery sync complete: 1 synced, 0 skipped, 0 errors
2026-03-20 07:33:45 - health.services.data_sync - INFO - Syncing spo2 from 2026-03-20 to 2026-03-20 (1 days)
2026-03-20 07:33:45 - health.services.data_sync - INFO - ✓ Synced spo2 for 2026-03-20
2026-03-20 07:33:45 - health.services.data_sync - INFO - spo2 sync complete: 1 synced, 0 skipped, 0 errors
2026-03-20 07:33:45 - health.services.data_sync - INFO - Syncing respiration from 2026-03-20 to 2026-03-20 (1 days)
2026-03-20 07:33:45 - health.services.data_sync - INFO - ✓ Synced respiration for 2026-03-20
2026-03-20 07:33:45 - health.services.data_sync - INFO - respiration sync complete: 1 synced, 0 skipped, 0 errors
2026-03-20 07:33:45 - health.services.data_sync - INFO - Syncing hydration from 2026-03-20 to 2026-03-20 (1 days)
2026-03-20 07:33:45 - health.services.data_sync - INFO - ✓ Synced hydration for 2026-03-20
2026-03-20 07:33:45 - health.services.data_sync - INFO - hydration sync complete: 1 synced, 0 skipped, 0 errors
2026-03-20 07:33:45 - health.services.data_sync - INFO - Syncing floors from 2026-03-20 to 2026-03-20 (1 days)
2026-03-20 07:33:45 - health.services.data_sync - INFO - ✓ Synced floors for 2026-03-20
2026-03-20 07:33:45 - health.services.data_sync - INFO - floors sync complete: 1 synced, 0 skipped, 0 errors
2026-03-20 07:33:45 - health.services.data_sync - INFO - Syncing intensity_minutes from 2026-03-20 to 2026-03-20 (1 days)
2026-03-20 07:33:45 - health.services.data_sync - INFO - ✓ Synced intensity_minutes for 2026-03-20
2026-03-20 07:33:45 - health.services.data_sync - INFO - intensity_minutes sync complete: 1 synced, 0 skipped, 0 errors
2026-03-20 07:33:45 - health.services.data_sync - INFO - Syncing hrv from 2026-03-20 to 2026-03-20 (1 days)
2026-03-20 07:33:45 - health.services.data_sync - INFO - ✓ Synced hrv for 2026-03-20
2026-03-20 07:33:45 - health.services.data_sync - INFO - hrv sync complete: 1 synced, 0 skipped, 0 errors
2026-03-20 07:33:45 - health.services.data_sync - INFO - Syncing rhr from 2026-03-20 to 2026-03-20 (1 days)
2026-03-20 07:33:46 - health.services.data_sync - INFO - ✓ Synced rhr for 2026-03-20
2026-03-20 07:33:46 - health.services.data_sync - INFO - rhr sync complete: 1 synced, 0 skipped, 0 errors
2026-03-20 07:33:46 - health.services.data_sync - INFO - Syncing weight from 2026-03-20 to 2026-03-20 (1 days)
2026-03-20 07:33:46 - health.services.data_sync - INFO - weight sync complete: 0 synced, 1 skipped, 0 errors
2026-03-20 07:33:46 - health.services.data_sync - INFO - Syncing lifestyle_logging from 2026-03-20 to 2026-03-20 (1 days)
2026-03-20 07:33:46 - health.services.data_sync - INFO - lifestyle_logging sync complete: 0 synced, 1 skipped, 0 errors
2026-03-20 07:33:46 - health.services.data_sync - INFO - Syncing activities from 2026-03-20 to 2026-03-20
2026-03-20 07:33:46 - health.services.data_sync - INFO - Found 0 activities
2026-03-20 07:33:46 - health.services.data_sync - INFO - Activity sync complete: 0 synced, 0 skipped, 0 errors
2026-03-20 07:33:46 - health.services.query - INFO - Querying health data summary for 2026-03-20
2026-03-20 07:33:46 - health.services.query - INFO - Found 12 metrics and 0 activities
2026-03-20 07:33:46 - slack_bot.dispatcher - INFO - [0a90d27c] ✓ sync_garmin finished in 3.35s
2026-03-20 07:33:46 - slack_bot.dispatcher - INFO - [0a90d27c] Tool: get_daily_detailed_stats Args: {'target_date': '2026-03-20'}
2026-03-20 07:33:46 - health.services.query - INFO - Querying health data summary for 2026-03-20
2026-03-20 07:33:46 - health.services.query - INFO - Found 12 metrics and 0 activities
2026-03-20 07:33:46 - slack_bot.dispatcher - INFO - [0a90d27c] ✓ get_daily_detailed_stats finished in 0.01s
2026-03-20 07:33:46 - slack_bot.dispatcher - INFO - [0a90d27c] Requesting final analysis...
2026-03-20 07:33:51 - slack_bot.dispatcher - INFO - [0a90d27c] Final analysis received in 5.49s
2026-03-20 07:33:51 - slack_bot.dispatcher - INFO - Formatted text (len 825 -> 779)
2026-03-20 07:33:52 - slack_bot.dispatcher - WARNING - [0a90d27c] Update failed, posting new: The request to the Slack API failed. (url: https://slack.com/api/chat.update)
The server responded with: {'ok': False, 'error': 'msg_too_long'}
2026-03-20 07:33:52 - slack_bot.dispatcher - INFO - [0a90d27c] Dispatch completed in 13.09s
2026-03-20 07:33:52 - __main__ - INFO - [0a90d27c] ✅ Request completed in 13.71s
2026-03-20 07:34:35 - __main__ - INFO - [a8daa0f4] 📥 Received message from U0A8ZCK7RJM in D0AA4GBQRKK: 其实自我感觉还可以，基本上都没有醒来 (Files: 0)
2026-03-20 07:34:35 - slack_bot.dispatcher - INFO - [a8daa0f4] Processing message in D0AA4GBQRKK from U0A8ZCK7RJM
2026-03-20 07:34:35 - slack_bot.dispatcher - INFO - [a8daa0f4] Calling Gemini for initial response...
2026-03-20 07:34:35 - slack_bot.dispatcher - INFO - [a8daa0f4] Request config: model=google/gemini-3-flash-preview, tools=21, context=39 msgs
2026-03-20 07:34:42 - slack_bot.dispatcher - INFO - [a8daa0f4] Gemini response: text=877 chars, tool_calls=0
2026-03-20 07:34:42 - slack_bot.dispatcher - INFO - [a8daa0f4] No tool calls from Gemini - checking SAFETY OVERRIDE keywords...
2026-03-20 07:34:42 - slack_bot.dispatcher - INFO - [a8daa0f4] No SAFETY OVERRIDE match found - will return empty response or text
2026-03-20 07:34:42 - slack_bot.dispatcher - INFO - [a8daa0f4] Gemini response in 6.69s: 877 chars, 0 tools
2026-03-20 07:34:42 - slack_bot.dispatcher - INFO - Formatted text (len 877 -> 841)
2026-03-20 07:34:42 - slack_bot.dispatcher - INFO - [a8daa0f4] 📤 Message updated 1773963275.303139
2026-03-20 07:34:42 - slack_bot.dispatcher - INFO - [a8daa0f4] Dispatch completed in 7.02s
2026-03-20 07:34:42 - __main__ - INFO - [a8daa0f4] ✅ Request completed in 7.36s
2026-03-20 07:38:34 - __main__ - INFO - [e362c180] 📥 Received message from U0A8ZCK7RJM in D0AA4GBQRKK: 好的，中午是否需要午睡一会儿，饮食应该如何建议 (Files: 0)
2026-03-20 07:38:34 - slack_bot.dispatcher - INFO - [e362c180] Processing message in D0AA4GBQRKK from U0A8ZCK7RJM
2026-03-20 07:38:34 - slack_bot.dispatcher - INFO - [e362c180] Calling Gemini for initial response...
2026-03-20 07:38:34 - slack_bot.dispatcher - INFO - [e362c180] Request config: model=google/gemini-3-flash-preview, tools=21, context=39 msgs
2026-03-20 07:38:42 - slack_bot.dispatcher - INFO - [e362c180] Gemini response: text=1150 chars, tool_calls=0
2026-03-20 07:38:42 - slack_bot.dispatcher - INFO - [e362c180] No tool calls from Gemini - checking SAFETY OVERRIDE keywords...
2026-03-20 07:38:42 - slack_bot.dispatcher - INFO - [e362c180] No SAFETY OVERRIDE match found - will return empty response or text
2026-03-20 07:38:42 - slack_bot.dispatcher - INFO - [e362c180] Gemini response in 8.19s: 1150 chars, 0 tools
2026-03-20 07:38:42 - slack_bot.dispatcher - INFO - Formatted text (len 1150 -> 1094)
2026-03-20 07:38:42 - slack_bot.dispatcher - INFO - [e362c180] 📤 Message updated 1773963514.187779
2026-03-20 07:38:42 - slack_bot.dispatcher - INFO - [e362c180] Dispatch completed in 8.51s
2026-03-20 07:38:42 - __main__ - INFO - [e362c180] ✅ Request completed in 8.82s
2026-03-20 13:58:47 - __main__ - INFO - [9a6b1644] 📥 Received message from U0A8ZCK7RJM in D0AA4GBQRKK: 早上吃了肠粉(可能是不是碳水多了)，中午直接睡了一个小时，感觉恢复了很多，中午没有吃饭 (Files: 0)
2026-03-20 13:58:47 - slack_bot.dispatcher - INFO - [9a6b1644] Processing message in D0AA4GBQRKK from U0A8ZCK7RJM
2026-03-20 13:58:47 - slack_bot.dispatcher - INFO - [9a6b1644] Calling Gemini for initial response...
2026-03-20 13:58:47 - slack_bot.dispatcher - INFO - [9a6b1644] Request config: model=google/gemini-3-flash-preview, tools=21, context=39 msgs
2026-03-20 13:58:57 - slack_bot.dispatcher - INFO - [9a6b1644] Gemini response: text=1196 chars, tool_calls=0
2026-03-20 13:58:57 - slack_bot.dispatcher - INFO - [9a6b1644] No tool calls from Gemini - checking SAFETY OVERRIDE keywords...
2026-03-20 13:58:57 - slack_bot.dispatcher - WARNING - [9a6b1644] Detected diet logging intent: ate=True, meal=False, food=True
2026-03-20 13:58:57 - slack_bot.dispatcher - INFO - [9a6b1644] Gemini response in 9.65s: 1196 chars, 0 tools
2026-03-20 13:58:57 - slack_bot.dispatcher - INFO - Formatted text (len 1196 -> 1140)
2026-03-20 13:58:57 - slack_bot.dispatcher - INFO - [9a6b1644] 📤 Message updated 1773986327.227739
2026-03-20 13:58:57 - slack_bot.dispatcher - INFO - [9a6b1644] Dispatch completed in 9.98s
2026-03-20 13:58:57 - __main__ - INFO - [9a6b1644] ✅ Request completed in 10.29s
Failed to establish a connection (session id: a6f8c831-5b0f-404f-90c6-acfb5141563d, error: The read operation timed out)
on_error invoked (session id: b8d61544-1217-4b77-a421-38d1e65f4fc5, error: TimeoutError, message: The read operation timed out)
2026-03-21 08:40:03 - __main__ - INFO - [9370931c] 📥 Received message from U0A8ZCK7RJM in D0AA4GBQRKK: 同步佳明数据 (Files: 0)
2026-03-21 08:40:03 - slack_bot.dispatcher - INFO - [9370931c] Processing message in D0AA4GBQRKK from U0A8ZCK7RJM
2026-03-21 08:40:03 - slack_bot.dispatcher - INFO - [9370931c] Calling Gemini for initial response...
2026-03-21 08:40:03 - slack_bot.dispatcher - INFO - [9370931c] Request config: model=google/gemini-3-flash-preview, tools=21, context=39 msgs
2026-03-21 08:40:06 - slack_bot.dispatcher - WARNING - [9370931c] Gemini returned empty response_text! (This usually means the proxy has issues)
2026-03-21 08:40:06 - slack_bot.dispatcher - INFO - [9370931c] Gemini response: text=0 chars, tool_calls=3
2026-03-21 08:40:06 - slack_bot.dispatcher - INFO - [9370931c] Tool calls successfully generated by Gemini (no SAFETY OVERRIDE needed)
2026-03-21 08:40:06 - slack_bot.dispatcher - INFO - [9370931c] Gemini response in 2.60s: 0 chars, 3 tools
2026-03-21 08:40:06 - slack_bot.dispatcher - INFO - [9370931c] Executing 3 tools
2026-03-21 08:40:06 - slack_bot.dispatcher - INFO - [9370931c] Tool: sync_garmin Args: {'target_date': '2026-03-21'}
2026-03-21 08:40:06 - slack_bot.tools.garmin - INFO - Starting Garmin sync for 2026-03-21...
2026-03-21 08:40:06 - health.services.data_sync - INFO - Authenticating with Garmin...
2026-03-21 08:40:06 - health.services.garmin_client - INFO - Authenticating with Garmin Connect China for 350134531@qq.com
2026-03-21 08:40:06 - health.services.garmin_client - INFO - Successfully authenticated with Garmin Connect China
2026-03-21 08:40:06 - health.services.data_sync - INFO - Authentication successful
2026-03-21 08:40:06 - health.services.data_sync - INFO - Syncing 14 metric types from 2026-03-21 to 2026-03-21
2026-03-21 08:40:06 - health.services.data_sync - INFO - Syncing steps from 2026-03-21 to 2026-03-21 (1 days)
2026-03-21 08:40:06 - health.services.data_sync - INFO - ✓ Synced steps for 2026-03-21
2026-03-21 08:40:06 - health.services.data_sync - INFO - steps sync complete: 1 synced, 0 skipped, 0 errors
2026-03-21 08:40:06 - health.services.data_sync - INFO - Syncing heart_rate from 2026-03-21 to 2026-03-21 (1 days)
2026-03-21 08:40:07 - health.services.data_sync - INFO - ✓ Synced heart_rate for 2026-03-21
2026-03-21 08:40:07 - health.services.data_sync - INFO - heart_rate sync complete: 1 synced, 0 skipped, 0 errors
2026-03-21 08:40:07 - health.services.data_sync - INFO - Syncing sleep from 2026-03-21 to 2026-03-21 (1 days)
2026-03-21 08:40:07 - health.services.data_sync - INFO - ✓ Synced sleep for 2026-03-21
2026-03-21 08:40:07 - health.services.data_sync - INFO - sleep sync complete: 1 synced, 0 skipped, 0 errors
2026-03-21 08:40:07 - health.services.data_sync - INFO - Syncing stress from 2026-03-21 to 2026-03-21 (1 days)
2026-03-21 08:40:07 - health.services.data_sync - INFO - ✓ Synced stress for 2026-03-21
2026-03-21 08:40:07 - health.services.data_sync - INFO - stress sync complete: 1 synced, 0 skipped, 0 errors
2026-03-21 08:40:07 - health.services.data_sync - INFO - Syncing body_battery from 2026-03-21 to 2026-03-21 (1 days)
2026-03-21 08:40:07 - health.services.data_sync - INFO - ✓ Synced body_battery for 2026-03-21
2026-03-21 08:40:07 - health.services.data_sync - INFO - body_battery sync complete: 1 synced, 0 skipped, 0 errors
2026-03-21 08:40:07 - health.services.data_sync - INFO - Syncing spo2 from 2026-03-21 to 2026-03-21 (1 days)
2026-03-21 08:40:07 - health.services.data_sync - INFO - ✓ Synced spo2 for 2026-03-21
2026-03-21 08:40:07 - health.services.data_sync - INFO - spo2 sync complete: 1 synced, 0 skipped, 0 errors
2026-03-21 08:40:07 - health.services.data_sync - INFO - Syncing respiration from 2026-03-21 to 2026-03-21 (1 days)
2026-03-21 08:40:07 - health.services.data_sync - INFO - ✓ Synced respiration for 2026-03-21
2026-03-21 08:40:07 - health.services.data_sync - INFO - respiration sync complete: 1 synced, 0 skipped, 0 errors
2026-03-21 08:40:07 - health.services.data_sync - INFO - Syncing hydration from 2026-03-21 to 2026-03-21 (1 days)
2026-03-21 08:40:08 - health.services.data_sync - INFO - ✓ Synced hydration for 2026-03-21
2026-03-21 08:40:08 - health.services.data_sync - INFO - hydration sync complete: 1 synced, 0 skipped, 0 errors
2026-03-21 08:40:08 - health.services.data_sync - INFO - Syncing floors from 2026-03-21 to 2026-03-21 (1 days)
2026-03-21 08:40:08 - health.services.data_sync - INFO - ✓ Synced floors for 2026-03-21
2026-03-21 08:40:08 - health.services.data_sync - INFO - floors sync complete: 1 synced, 0 skipped, 0 errors
2026-03-21 08:40:08 - health.services.data_sync - INFO - Syncing intensity_minutes from 2026-03-21 to 2026-03-21 (1 days)
2026-03-21 08:40:08 - health.services.data_sync - INFO - ✓ Synced intensity_minutes for 2026-03-21
2026-03-21 08:40:08 - health.services.data_sync - INFO - intensity_minutes sync complete: 1 synced, 0 skipped, 0 errors
2026-03-21 08:40:08 - health.services.data_sync - INFO - Syncing hrv from 2026-03-21 to 2026-03-21 (1 days)
2026-03-21 08:40:08 - health.services.data_sync - INFO - ✓ Synced hrv for 2026-03-21
2026-03-21 08:40:08 - health.services.data_sync - INFO - hrv sync complete: 1 synced, 0 skipped, 0 errors
2026-03-21 08:40:08 - health.services.data_sync - INFO - Syncing rhr from 2026-03-21 to 2026-03-21 (1 days)
2026-03-21 08:40:08 - health.services.data_sync - INFO - ✓ Synced rhr for 2026-03-21
2026-03-21 08:40:08 - health.services.data_sync - INFO - rhr sync complete: 1 synced, 0 skipped, 0 errors
2026-03-21 08:40:08 - health.services.data_sync - INFO - Syncing weight from 2026-03-21 to 2026-03-21 (1 days)
2026-03-21 08:40:08 - health.services.data_sync - INFO - weight sync complete: 0 synced, 1 skipped, 0 errors
2026-03-21 08:40:08 - health.services.data_sync - INFO - Syncing lifestyle_logging from 2026-03-21 to 2026-03-21 (1 days)
2026-03-21 08:40:08 - health.services.data_sync - INFO - lifestyle_logging sync complete: 0 synced, 1 skipped, 0 errors
2026-03-21 08:40:08 - health.services.data_sync - INFO - Syncing activities from 2026-03-21 to 2026-03-21
2026-03-21 08:40:08 - health.services.data_sync - INFO - Found 0 activities
2026-03-21 08:40:08 - health.services.data_sync - INFO - Activity sync complete: 0 synced, 0 skipped, 0 errors
2026-03-21 08:40:08 - health.services.query - INFO - Querying health data summary for 2026-03-21
2026-03-21 08:40:08 - health.services.query - INFO - Found 12 metrics and 0 activities
2026-03-21 08:40:08 - slack_bot.dispatcher - INFO - [9370931c] ✓ sync_garmin finished in 2.24s
2026-03-21 08:40:08 - slack_bot.dispatcher - INFO - [9370931c] Tool: get_daily_detailed_stats Args: {'target_date': '2026-03-21'}
2026-03-21 08:40:08 - health.services.query - INFO - Querying health data summary for 2026-03-21
2026-03-21 08:40:08 - health.services.query - INFO - Found 12 metrics and 0 activities
2026-03-21 08:40:08 - slack_bot.dispatcher - INFO - [9370931c] ✓ get_daily_detailed_stats finished in 0.01s
2026-03-21 08:40:08 - slack_bot.dispatcher - INFO - [9370931c] Tool: get_activity_history Args: {'start_date': '2026-03-21', 'end_date': '2026-03-21'}
2026-03-21 08:40:08 - health.services.query - INFO - Querying activities from 2026-03-21 to 2026-03-21
2026-03-21 08:40:08 - health.services.query - INFO - Found 0 activities
2026-03-21 08:40:08 - slack_bot.dispatcher - INFO - [9370931c] ✓ get_activity_history finished in 0.00s
2026-03-21 08:40:08 - slack_bot.dispatcher - INFO - [9370931c] Requesting final analysis...
2026-03-21 08:40:13 - slack_bot.dispatcher - INFO - [9370931c] Final analysis received in 4.57s
2026-03-21 08:40:13 - slack_bot.dispatcher - INFO - Formatted text (len 747 -> 715)
2026-03-21 08:40:13 - slack_bot.dispatcher - WARNING - [9370931c] Update failed, posting new: The request to the Slack API failed. (url: https://slack.com/api/chat.update)
The server responded with: {'ok': False, 'error': 'msg_too_long'}
2026-03-21 08:40:13 - slack_bot.dispatcher - INFO - [9370931c] Dispatch completed in 10.06s
2026-03-21 08:40:13 - __main__ - INFO - [9370931c] ✅ Request completed in 10.37s
2026-03-21 10:46:42 - __main__ - INFO - [681ede87] 📥 Received message from U0A8ZCK7RJM in D0AA4GBQRKK: 同步佳明数据 (Files: 0)
2026-03-21 10:46:43 - slack_bot.dispatcher - INFO - [681ede87] Processing message in D0AA4GBQRKK from U0A8ZCK7RJM
2026-03-21 10:46:43 - slack_bot.dispatcher - INFO - [681ede87] Calling Gemini for initial response...
2026-03-21 10:46:43 - slack_bot.dispatcher - INFO - [681ede87] Request config: model=google/gemini-3-flash-preview, tools=21, context=39 msgs
2026-03-21 10:46:46 - slack_bot.dispatcher - WARNING - [681ede87] Gemini returned empty response_text! (This usually means the proxy has issues)
2026-03-21 10:46:46 - slack_bot.dispatcher - INFO - [681ede87] Gemini response: text=0 chars, tool_calls=3
2026-03-21 10:46:46 - slack_bot.dispatcher - INFO - [681ede87] Tool calls successfully generated by Gemini (no SAFETY OVERRIDE needed)
2026-03-21 10:46:46 - slack_bot.dispatcher - INFO - [681ede87] Gemini response in 3.11s: 0 chars, 3 tools
2026-03-21 10:46:46 - slack_bot.dispatcher - INFO - [681ede87] Executing 3 tools
2026-03-21 10:46:46 - slack_bot.dispatcher - INFO - [681ede87] Tool: sync_garmin Args: {'target_date': '2026-03-21'}
2026-03-21 10:46:46 - slack_bot.tools.garmin - INFO - Starting Garmin sync for 2026-03-21...
2026-03-21 10:46:46 - health.services.data_sync - INFO - Authenticating with Garmin...
2026-03-21 10:46:46 - health.services.garmin_client - INFO - Authenticating with Garmin Connect China for 350134531@qq.com
2026-03-21 10:46:46 - health.services.garmin_client - INFO - Successfully authenticated with Garmin Connect China
2026-03-21 10:46:46 - health.services.data_sync - INFO - Authentication successful
2026-03-21 10:46:46 - health.services.data_sync - INFO - Syncing 14 metric types from 2026-03-21 to 2026-03-21
2026-03-21 10:46:46 - health.services.data_sync - INFO - Syncing steps from 2026-03-21 to 2026-03-21 (1 days)
2026-03-21 10:46:46 - health.services.data_sync - INFO - ✓ Synced steps for 2026-03-21
2026-03-21 10:46:46 - health.services.data_sync - INFO - steps sync complete: 1 synced, 0 skipped, 0 errors
2026-03-21 10:46:46 - health.services.data_sync - INFO - Syncing heart_rate from 2026-03-21 to 2026-03-21 (1 days)
2026-03-21 10:46:47 - health.services.data_sync - INFO - ✓ Synced heart_rate for 2026-03-21
2026-03-21 10:46:47 - health.services.data_sync - INFO - heart_rate sync complete: 1 synced, 0 skipped, 0 errors
2026-03-21 10:46:47 - health.services.data_sync - INFO - Syncing sleep from 2026-03-21 to 2026-03-21 (1 days)
2026-03-21 10:46:47 - health.services.data_sync - INFO - ✓ Synced sleep for 2026-03-21
2026-03-21 10:46:47 - health.services.data_sync - INFO - sleep sync complete: 1 synced, 0 skipped, 0 errors
2026-03-21 10:46:47 - health.services.data_sync - INFO - Syncing stress from 2026-03-21 to 2026-03-21 (1 days)
2026-03-21 10:46:47 - health.services.data_sync - INFO - ✓ Synced stress for 2026-03-21
2026-03-21 10:46:47 - health.services.data_sync - INFO - stress sync complete: 1 synced, 0 skipped, 0 errors
2026-03-21 10:46:47 - health.services.data_sync - INFO - Syncing body_battery from 2026-03-21 to 2026-03-21 (1 days)
2026-03-21 10:46:47 - health.services.data_sync - INFO - ✓ Synced body_battery for 2026-03-21
2026-03-21 10:46:47 - health.services.data_sync - INFO - body_battery sync complete: 1 synced, 0 skipped, 0 errors
2026-03-21 10:46:47 - health.services.data_sync - INFO - Syncing spo2 from 2026-03-21 to 2026-03-21 (1 days)
2026-03-21 10:46:47 - health.services.data_sync - INFO - ✓ Synced spo2 for 2026-03-21
2026-03-21 10:46:47 - health.services.data_sync - INFO - spo2 sync complete: 1 synced, 0 skipped, 0 errors
2026-03-21 10:46:47 - health.services.data_sync - INFO - Syncing respiration from 2026-03-21 to 2026-03-21 (1 days)
2026-03-21 10:46:48 - health.services.data_sync - INFO - ✓ Synced respiration for 2026-03-21
2026-03-21 10:46:48 - health.services.data_sync - INFO - respiration sync complete: 1 synced, 0 skipped, 0 errors
2026-03-21 10:46:48 - health.services.data_sync - INFO - Syncing hydration from 2026-03-21 to 2026-03-21 (1 days)
2026-03-21 10:46:48 - health.services.data_sync - INFO - ✓ Synced hydration for 2026-03-21
2026-03-21 10:46:48 - health.services.data_sync - INFO - hydration sync complete: 1 synced, 0 skipped, 0 errors
2026-03-21 10:46:48 - health.services.data_sync - INFO - Syncing floors from 2026-03-21 to 2026-03-21 (1 days)
2026-03-21 10:46:48 - health.services.data_sync - INFO - ✓ Synced floors for 2026-03-21
2026-03-21 10:46:48 - health.services.data_sync - INFO - floors sync complete: 1 synced, 0 skipped, 0 errors
2026-03-21 10:46:48 - health.services.data_sync - INFO - Syncing intensity_minutes from 2026-03-21 to 2026-03-21 (1 days)
2026-03-21 10:46:48 - health.services.data_sync - INFO - ✓ Synced intensity_minutes for 2026-03-21
2026-03-21 10:46:48 - health.services.data_sync - INFO - intensity_minutes sync complete: 1 synced, 0 skipped, 0 errors
2026-03-21 10:46:48 - health.services.data_sync - INFO - Syncing hrv from 2026-03-21 to 2026-03-21 (1 days)
2026-03-21 10:46:48 - health.services.data_sync - INFO - ✓ Synced hrv for 2026-03-21
2026-03-21 10:46:48 - health.services.data_sync - INFO - hrv sync complete: 1 synced, 0 skipped, 0 errors
2026-03-21 10:46:48 - health.services.data_sync - INFO - Syncing rhr from 2026-03-21 to 2026-03-21 (1 days)
2026-03-21 10:46:48 - health.services.data_sync - INFO - ✓ Synced rhr for 2026-03-21
2026-03-21 10:46:48 - health.services.data_sync - INFO - rhr sync complete: 1 synced, 0 skipped, 0 errors
2026-03-21 10:46:48 - health.services.data_sync - INFO - Syncing weight from 2026-03-21 to 2026-03-21 (1 days)
2026-03-21 10:46:48 - health.services.data_sync - INFO - weight sync complete: 0 synced, 1 skipped, 0 errors
2026-03-21 10:46:48 - health.services.data_sync - INFO - Syncing lifestyle_logging from 2026-03-21 to 2026-03-21 (1 days)
2026-03-21 10:46:48 - health.services.data_sync - INFO - lifestyle_logging sync complete: 0 synced, 1 skipped, 0 errors
2026-03-21 10:46:48 - health.services.data_sync - INFO - Syncing activities from 2026-03-21 to 2026-03-21
2026-03-21 10:46:49 - health.services.garmin_client - INFO - Fetched 1 activities
2026-03-21 10:46:49 - health.services.data_sync - INFO - Found 1 activities
2026-03-21 10:46:49 - health.services.data_sync - INFO - ✓ Synced activity 575707716 (elliptical) on 2026-03-21
2026-03-21 10:46:49 - health.services.data_sync - INFO - Activity sync complete: 1 synced, 0 skipped, 0 errors
2026-03-21 10:46:49 - health.services.query - INFO - Querying health data summary for 2026-03-21
2026-03-21 10:46:49 - health.services.query - INFO - Found 12 metrics and 1 activities
2026-03-21 10:46:49 - slack_bot.dispatcher - INFO - [681ede87] ✓ sync_garmin finished in 2.69s
2026-03-21 10:46:49 - slack_bot.dispatcher - INFO - [681ede87] Tool: get_daily_detailed_stats Args: {'target_date': '2026-03-21'}
2026-03-21 10:46:49 - health.services.query - INFO - Querying health data summary for 2026-03-21
2026-03-21 10:46:49 - health.services.query - INFO - Found 12 metrics and 1 activities
2026-03-21 10:46:49 - slack_bot.dispatcher - INFO - [681ede87] ✓ get_daily_detailed_stats finished in 0.01s
2026-03-21 10:46:49 - slack_bot.dispatcher - INFO - [681ede87] Tool: get_activity_history Args: {'end_date': '2026-03-21', 'start_date': '2026-03-21'}
2026-03-21 10:46:49 - health.services.query - INFO - Querying activities from 2026-03-21 to 2026-03-21
2026-03-21 10:46:49 - health.services.query - INFO - Found 1 activities
2026-03-21 10:46:49 - slack_bot.dispatcher - INFO - [681ede87] ✓ get_activity_history finished in 0.00s
2026-03-21 10:46:49 - slack_bot.dispatcher - INFO - [681ede87] Requesting final analysis...
2026-03-21 10:46:53 - slack_bot.dispatcher - INFO - [681ede87] Final analysis received in 4.76s
2026-03-21 10:46:53 - slack_bot.dispatcher - INFO - Formatted text (len 557 -> 531)
2026-03-21 10:46:54 - slack_bot.dispatcher - WARNING - [681ede87] Update failed, posting new: The request to the Slack API failed. (url: https://slack.com/api/chat.update)
The server responded with: {'ok': False, 'error': 'msg_too_long'}
2026-03-21 10:46:54 - slack_bot.dispatcher - INFO - [681ede87] Dispatch completed in 11.18s
2026-03-21 10:46:54 - __main__ - INFO - [681ede87] ✅ Request completed in 11.50s
2026-03-24 07:41:29 - __main__ - INFO - [02ae3abe] 📥 Received message from U0A8ZCK7RJM in D0AA4GBQRKK: 同步佳明数据 (Files: 0)
2026-03-24 07:41:29 - slack_bot.dispatcher - INFO - [02ae3abe] Processing message in D0AA4GBQRKK from U0A8ZCK7RJM
2026-03-24 07:41:29 - slack_bot.dispatcher - INFO - [02ae3abe] Calling Gemini for initial response...
2026-03-24 07:41:29 - slack_bot.dispatcher - INFO - [02ae3abe] Request config: model=google/gemini-3-flash-preview, tools=21, context=39 msgs
2026-03-24 07:41:32 - slack_bot.dispatcher - WARNING - [02ae3abe] Gemini returned empty response_text! (This usually means the proxy has issues)
2026-03-24 07:41:32 - slack_bot.dispatcher - INFO - [02ae3abe] Gemini response: text=0 chars, tool_calls=3
2026-03-24 07:41:32 - slack_bot.dispatcher - INFO - [02ae3abe] Tool calls successfully generated by Gemini (no SAFETY OVERRIDE needed)
2026-03-24 07:41:32 - slack_bot.dispatcher - INFO - [02ae3abe] Gemini response in 3.15s: 0 chars, 3 tools
2026-03-24 07:41:32 - slack_bot.dispatcher - INFO - [02ae3abe] Executing 3 tools
2026-03-24 07:41:32 - slack_bot.dispatcher - INFO - [02ae3abe] Tool: sync_garmin Args: {'target_date': '2026-03-24'}
2026-03-24 07:41:32 - slack_bot.tools.garmin - INFO - Starting Garmin sync for 2026-03-24...
2026-03-24 07:41:32 - health.services.data_sync - INFO - Authenticating with Garmin...
2026-03-24 07:41:32 - health.services.garmin_client - INFO - Authenticating with Garmin Connect China for 350134531@qq.com
2026-03-24 07:41:33 - health.services.garmin_client - INFO - Successfully authenticated with Garmin Connect China
2026-03-24 07:41:33 - health.services.data_sync - INFO - Authentication successful
2026-03-24 07:41:33 - health.services.data_sync - INFO - Syncing 14 metric types from 2026-03-24 to 2026-03-24
2026-03-24 07:41:33 - health.services.data_sync - INFO - Syncing steps from 2026-03-24 to 2026-03-24 (1 days)
2026-03-24 07:41:33 - health.services.data_sync - INFO - ✓ Synced steps for 2026-03-24
2026-03-24 07:41:33 - health.services.data_sync - INFO - steps sync complete: 1 synced, 0 skipped, 0 errors
2026-03-24 07:41:33 - health.services.data_sync - INFO - Syncing heart_rate from 2026-03-24 to 2026-03-24 (1 days)
2026-03-24 07:41:33 - health.services.data_sync - INFO - ✓ Synced heart_rate for 2026-03-24
2026-03-24 07:41:33 - health.services.data_sync - INFO - heart_rate sync complete: 1 synced, 0 skipped, 0 errors
2026-03-24 07:41:33 - health.services.data_sync - INFO - Syncing sleep from 2026-03-24 to 2026-03-24 (1 days)
2026-03-24 07:41:33 - health.services.data_sync - INFO - ✓ Synced sleep for 2026-03-24
2026-03-24 07:41:33 - health.services.data_sync - INFO - sleep sync complete: 1 synced, 0 skipped, 0 errors
2026-03-24 07:41:33 - health.services.data_sync - INFO - Syncing stress from 2026-03-24 to 2026-03-24 (1 days)
2026-03-24 07:41:34 - health.services.data_sync - INFO - ✓ Synced stress for 2026-03-24
2026-03-24 07:41:34 - health.services.data_sync - INFO - stress sync complete: 1 synced, 0 skipped, 0 errors
2026-03-24 07:41:34 - health.services.data_sync - INFO - Syncing body_battery from 2026-03-24 to 2026-03-24 (1 days)
2026-03-24 07:41:34 - health.services.data_sync - INFO - ✓ Synced body_battery for 2026-03-24
2026-03-24 07:41:34 - health.services.data_sync - INFO - body_battery sync complete: 1 synced, 0 skipped, 0 errors
2026-03-24 07:41:34 - health.services.data_sync - INFO - Syncing spo2 from 2026-03-24 to 2026-03-24 (1 days)
2026-03-24 07:41:34 - health.services.data_sync - INFO - ✓ Synced spo2 for 2026-03-24
2026-03-24 07:41:34 - health.services.data_sync - INFO - spo2 sync complete: 1 synced, 0 skipped, 0 errors
2026-03-24 07:41:34 - health.services.data_sync - INFO - Syncing respiration from 2026-03-24 to 2026-03-24 (1 days)
2026-03-24 07:41:34 - health.services.data_sync - INFO - ✓ Synced respiration for 2026-03-24
2026-03-24 07:41:34 - health.services.data_sync - INFO - respiration sync complete: 1 synced, 0 skipped, 0 errors
2026-03-24 07:41:34 - health.services.data_sync - INFO - Syncing hydration from 2026-03-24 to 2026-03-24 (1 days)
2026-03-24 07:41:34 - health.services.data_sync - INFO - ✓ Synced hydration for 2026-03-24
2026-03-24 07:41:34 - health.services.data_sync - INFO - hydration sync complete: 1 synced, 0 skipped, 0 errors
2026-03-24 07:41:34 - health.services.data_sync - INFO - Syncing floors from 2026-03-24 to 2026-03-24 (1 days)
2026-03-24 07:41:35 - health.services.data_sync - INFO - ✓ Synced floors for 2026-03-24
2026-03-24 07:41:35 - health.services.data_sync - INFO - floors sync complete: 1 synced, 0 skipped, 0 errors
2026-03-24 07:41:35 - health.services.data_sync - INFO - Syncing intensity_minutes from 2026-03-24 to 2026-03-24 (1 days)
2026-03-24 07:41:35 - health.services.data_sync - INFO - ✓ Synced intensity_minutes for 2026-03-24
2026-03-24 07:41:35 - health.services.data_sync - INFO - intensity_minutes sync complete: 1 synced, 0 skipped, 0 errors
2026-03-24 07:41:35 - health.services.data_sync - INFO - Syncing hrv from 2026-03-24 to 2026-03-24 (1 days)
2026-03-24 07:41:35 - health.services.data_sync - INFO - ✓ Synced hrv for 2026-03-24
2026-03-24 07:41:35 - health.services.data_sync - INFO - hrv sync complete: 1 synced, 0 skipped, 0 errors
2026-03-24 07:41:35 - health.services.data_sync - INFO - Syncing rhr from 2026-03-24 to 2026-03-24 (1 days)
2026-03-24 07:41:35 - health.services.data_sync - INFO - ✓ Synced rhr for 2026-03-24
2026-03-24 07:41:35 - health.services.data_sync - INFO - rhr sync complete: 1 synced, 0 skipped, 0 errors
2026-03-24 07:41:35 - health.services.data_sync - INFO - Syncing weight from 2026-03-24 to 2026-03-24 (1 days)
2026-03-24 07:41:35 - health.services.data_sync - INFO - weight sync complete: 0 synced, 1 skipped, 0 errors
2026-03-24 07:41:35 - health.services.data_sync - INFO - Syncing lifestyle_logging from 2026-03-24 to 2026-03-24 (1 days)
2026-03-24 07:41:35 - health.services.data_sync - INFO - lifestyle_logging sync complete: 0 synced, 1 skipped, 0 errors
2026-03-24 07:41:35 - health.services.data_sync - INFO - Syncing activities from 2026-03-24 to 2026-03-24
2026-03-24 07:41:35 - health.services.data_sync - INFO - Found 0 activities
2026-03-24 07:41:35 - health.services.data_sync - INFO - Activity sync complete: 0 synced, 0 skipped, 0 errors
2026-03-24 07:41:35 - health.services.query - INFO - Querying health data summary for 2026-03-24
2026-03-24 07:41:35 - health.services.query - INFO - Found 12 metrics and 0 activities
2026-03-24 07:41:35 - slack_bot.dispatcher - INFO - [02ae3abe] ✓ sync_garmin finished in 3.18s
2026-03-24 07:41:35 - slack_bot.dispatcher - INFO - [02ae3abe] Tool: get_daily_detailed_stats Args: {'target_date': '2026-03-24'}
2026-03-24 07:41:35 - health.services.query - INFO - Querying health data summary for 2026-03-24
2026-03-24 07:41:35 - health.services.query - INFO - Found 12 metrics and 0 activities
2026-03-24 07:41:35 - slack_bot.dispatcher - INFO - [02ae3abe] ✓ get_daily_detailed_stats finished in 0.01s
2026-03-24 07:41:35 - slack_bot.dispatcher - INFO - [02ae3abe] Tool: get_activity_history Args: {'end_date': '2026-03-24', 'start_date': '2026-03-23'}
2026-03-24 07:41:35 - health.services.query - INFO - Querying activities from 2026-03-23 to 2026-03-24
2026-03-24 07:41:35 - health.services.query - INFO - Found 0 activities
2026-03-24 07:41:35 - slack_bot.dispatcher - INFO - [02ae3abe] ✓ get_activity_history finished in 0.00s
2026-03-24 07:41:35 - slack_bot.dispatcher - INFO - [02ae3abe] Requesting final analysis...
2026-03-24 07:41:41 - slack_bot.dispatcher - INFO - [02ae3abe] Final analysis received in 5.34s
2026-03-24 07:41:41 - slack_bot.dispatcher - INFO - Formatted text (len 615 -> 583)
2026-03-24 07:41:41 - slack_bot.dispatcher - INFO - [02ae3abe] 📤 Message updated 1774309289.224359
2026-03-24 07:41:41 - slack_bot.dispatcher - INFO - [02ae3abe] Dispatch completed in 11.99s
2026-03-24 07:41:41 - __main__ - INFO - [02ae3abe] ✅ Request completed in 12.33s
2026-03-25 13:33:27 - __main__ - INFO - [5e81614a] 📥 Received message from U0A8ZCK7RJM in D0AA4GBQRKK: 同步佳明数据 (Files: 0)
2026-03-25 13:33:27 - slack_bot.dispatcher - INFO - [5e81614a] Processing message in D0AA4GBQRKK from U0A8ZCK7RJM
2026-03-25 13:33:27 - slack_bot.dispatcher - INFO - [5e81614a] Calling Gemini for initial response...
2026-03-25 13:33:27 - slack_bot.dispatcher - INFO - [5e81614a] Request config: model=google/gemini-3-flash-preview, tools=21, context=39 msgs
2026-03-25 13:33:30 - slack_bot.dispatcher - WARNING - [5e81614a] Gemini returned empty response_text! (This usually means the proxy has issues)
2026-03-25 13:33:30 - slack_bot.dispatcher - INFO - [5e81614a] Gemini response: text=0 chars, tool_calls=3
2026-03-25 13:33:30 - slack_bot.dispatcher - INFO - [5e81614a] Tool calls successfully generated by Gemini (no SAFETY OVERRIDE needed)
2026-03-25 13:33:30 - slack_bot.dispatcher - INFO - [5e81614a] Gemini response in 2.86s: 0 chars, 3 tools
2026-03-25 13:33:30 - slack_bot.dispatcher - INFO - [5e81614a] Executing 3 tools
2026-03-25 13:33:30 - slack_bot.dispatcher - INFO - [5e81614a] Tool: sync_garmin Args: {'target_date': '2026-03-25'}
2026-03-25 13:33:30 - slack_bot.tools.garmin - INFO - Starting Garmin sync for 2026-03-25...
2026-03-25 13:33:30 - health.services.data_sync - INFO - Authenticating with Garmin...
2026-03-25 13:33:30 - health.services.garmin_client - INFO - Authenticating with Garmin Connect China for 350134531@qq.com
2026-03-25 13:33:30 - health.services.garmin_client - INFO - Successfully authenticated with Garmin Connect China
2026-03-25 13:33:30 - health.services.data_sync - INFO - Authentication successful
2026-03-25 13:33:30 - health.services.data_sync - INFO - Syncing 14 metric types from 2026-03-25 to 2026-03-25
2026-03-25 13:33:30 - health.services.data_sync - INFO - Syncing steps from 2026-03-25 to 2026-03-25 (1 days)
2026-03-25 13:33:31 - health.services.data_sync - INFO - ✓ Synced steps for 2026-03-25
2026-03-25 13:33:31 - health.services.data_sync - INFO - steps sync complete: 1 synced, 0 skipped, 0 errors
2026-03-25 13:33:31 - health.services.data_sync - INFO - Syncing heart_rate from 2026-03-25 to 2026-03-25 (1 days)
2026-03-25 13:33:31 - health.services.data_sync - INFO - ✓ Synced heart_rate for 2026-03-25
2026-03-25 13:33:31 - health.services.data_sync - INFO - heart_rate sync complete: 1 synced, 0 skipped, 0 errors
2026-03-25 13:33:31 - health.services.data_sync - INFO - Syncing sleep from 2026-03-25 to 2026-03-25 (1 days)
2026-03-25 13:33:31 - health.services.data_sync - INFO - ✓ Synced sleep for 2026-03-25
2026-03-25 13:33:31 - health.services.data_sync - INFO - sleep sync complete: 1 synced, 0 skipped, 0 errors
2026-03-25 13:33:31 - health.services.data_sync - INFO - Syncing stress from 2026-03-25 to 2026-03-25 (1 days)
2026-03-25 13:33:32 - health.services.data_sync - INFO - ✓ Synced stress for 2026-03-25
2026-03-25 13:33:32 - health.services.data_sync - INFO - stress sync complete: 1 synced, 0 skipped, 0 errors
2026-03-25 13:33:32 - health.services.data_sync - INFO - Syncing body_battery from 2026-03-25 to 2026-03-25 (1 days)
2026-03-25 13:33:32 - health.services.data_sync - INFO - ✓ Synced body_battery for 2026-03-25
2026-03-25 13:33:32 - health.services.data_sync - INFO - body_battery sync complete: 1 synced, 0 skipped, 0 errors
2026-03-25 13:33:32 - health.services.data_sync - INFO - Syncing spo2 from 2026-03-25 to 2026-03-25 (1 days)
2026-03-25 13:33:32 - health.services.data_sync - INFO - ✓ Synced spo2 for 2026-03-25
2026-03-25 13:33:32 - health.services.data_sync - INFO - spo2 sync complete: 1 synced, 0 skipped, 0 errors
2026-03-25 13:33:32 - health.services.data_sync - INFO - Syncing respiration from 2026-03-25 to 2026-03-25 (1 days)
2026-03-25 13:33:32 - health.services.data_sync - INFO - ✓ Synced respiration for 2026-03-25
2026-03-25 13:33:32 - health.services.data_sync - INFO - respiration sync complete: 1 synced, 0 skipped, 0 errors
2026-03-25 13:33:32 - health.services.data_sync - INFO - Syncing hydration from 2026-03-25 to 2026-03-25 (1 days)
2026-03-25 13:33:32 - health.services.data_sync - INFO - ✓ Synced hydration for 2026-03-25
2026-03-25 13:33:32 - health.services.data_sync - INFO - hydration sync complete: 1 synced, 0 skipped, 0 errors
2026-03-25 13:33:32 - health.services.data_sync - INFO - Syncing floors from 2026-03-25 to 2026-03-25 (1 days)
2026-03-25 13:33:33 - health.services.data_sync - INFO - ✓ Synced floors for 2026-03-25
2026-03-25 13:33:33 - health.services.data_sync - INFO - floors sync complete: 1 synced, 0 skipped, 0 errors
2026-03-25 13:33:33 - health.services.data_sync - INFO - Syncing intensity_minutes from 2026-03-25 to 2026-03-25 (1 days)
2026-03-25 13:33:33 - health.services.data_sync - INFO - ✓ Synced intensity_minutes for 2026-03-25
2026-03-25 13:33:33 - health.services.data_sync - INFO - intensity_minutes sync complete: 1 synced, 0 skipped, 0 errors
2026-03-25 13:33:33 - health.services.data_sync - INFO - Syncing hrv from 2026-03-25 to 2026-03-25 (1 days)
2026-03-25 13:33:33 - health.services.data_sync - INFO - ✓ Synced hrv for 2026-03-25
2026-03-25 13:33:33 - health.services.data_sync - INFO - hrv sync complete: 1 synced, 0 skipped, 0 errors
2026-03-25 13:33:33 - health.services.data_sync - INFO - Syncing rhr from 2026-03-25 to 2026-03-25 (1 days)
2026-03-25 13:33:33 - health.services.data_sync - INFO - ✓ Synced rhr for 2026-03-25
2026-03-25 13:33:33 - health.services.data_sync - INFO - rhr sync complete: 1 synced, 0 skipped, 0 errors
2026-03-25 13:33:33 - health.services.data_sync - INFO - Syncing weight from 2026-03-25 to 2026-03-25 (1 days)
2026-03-25 13:33:33 - health.services.data_sync - INFO - weight sync complete: 0 synced, 1 skipped, 0 errors
2026-03-25 13:33:33 - health.services.data_sync - INFO - Syncing lifestyle_logging from 2026-03-25 to 2026-03-25 (1 days)
2026-03-25 13:33:33 - health.services.data_sync - INFO - lifestyle_logging sync complete: 0 synced, 1 skipped, 0 errors
2026-03-25 13:33:33 - health.services.data_sync - INFO - Syncing activities from 2026-03-25 to 2026-03-25
2026-03-25 13:33:34 - health.services.garmin_client - INFO - Fetched 1 activities
2026-03-25 13:33:34 - health.services.data_sync - INFO - Found 1 activities
2026-03-25 13:33:34 - health.services.data_sync - INFO - ✓ Synced activity 577100990 (elliptical) on 2026-03-25
2026-03-25 13:33:34 - health.services.data_sync - INFO - Activity sync complete: 1 synced, 0 skipped, 0 errors
2026-03-25 13:33:34 - health.services.query - INFO - Querying health data summary for 2026-03-25
2026-03-25 13:33:34 - health.services.query - INFO - Found 12 metrics and 1 activities
2026-03-25 13:33:34 - slack_bot.dispatcher - INFO - [5e81614a] ✓ sync_garmin finished in 3.82s
2026-03-25 13:33:34 - slack_bot.dispatcher - INFO - [5e81614a] Tool: get_daily_detailed_stats Args: {'target_date': '2026-03-25'}
2026-03-25 13:33:34 - health.services.query - INFO - Querying health data summary for 2026-03-25
2026-03-25 13:33:34 - health.services.query - INFO - Found 12 metrics and 1 activities
2026-03-25 13:33:34 - slack_bot.dispatcher - INFO - [5e81614a] ✓ get_daily_detailed_stats finished in 0.01s
2026-03-25 13:33:34 - slack_bot.dispatcher - INFO - [5e81614a] Tool: get_activity_history Args: {'end_date': '2026-03-25', 'start_date': '2026-03-24'}
2026-03-25 13:33:34 - health.services.query - INFO - Querying activities from 2026-03-24 to 2026-03-25
2026-03-25 13:33:34 - health.services.query - INFO - Found 2 activities
2026-03-25 13:33:34 - slack_bot.dispatcher - INFO - [5e81614a] ✓ get_activity_history finished in 0.00s
2026-03-25 13:33:34 - slack_bot.dispatcher - INFO - [5e81614a] Requesting final analysis...
2026-03-25 13:33:39 - slack_bot.dispatcher - INFO - [5e81614a] Final analysis received in 5.08s
2026-03-25 13:33:39 - slack_bot.dispatcher - INFO - Formatted text (len 712 -> 674)
2026-03-25 13:33:39 - slack_bot.dispatcher - WARNING - [5e81614a] Update failed, posting new: The request to the Slack API failed. (url: https://slack.com/api/chat.update)
The server responded with: {'ok': False, 'error': 'msg_too_long'}
2026-03-25 13:33:39 - slack_bot.dispatcher - INFO - [5e81614a] Dispatch completed in 12.38s
2026-03-25 13:33:39 - __main__ - INFO - [5e81614a] ✅ Request completed in 12.69s
2026-03-26 12:10:51 - __main__ - INFO - [c3699e81] 📥 Received message from U0A8ZCK7RJM in D0AA4GBQRKK: 同步佳明数据 (Files: 0)
2026-03-26 12:10:52 - slack_bot.dispatcher - INFO - [c3699e81] Processing message in D0AA4GBQRKK from U0A8ZCK7RJM
2026-03-26 12:10:52 - slack_bot.dispatcher - INFO - [c3699e81] Calling Gemini for initial response...
2026-03-26 12:10:52 - slack_bot.dispatcher - INFO - [c3699e81] Request config: model=google/gemini-3-flash-preview, tools=21, context=39 msgs
2026-03-26 12:10:56 - slack_bot.dispatcher - WARNING - [c3699e81] Gemini returned empty response_text! (This usually means the proxy has issues)
2026-03-26 12:10:56 - slack_bot.dispatcher - INFO - [c3699e81] Gemini response: text=0 chars, tool_calls=3
2026-03-26 12:10:56 - slack_bot.dispatcher - INFO - [c3699e81] Tool calls successfully generated by Gemini (no SAFETY OVERRIDE needed)
2026-03-26 12:10:56 - slack_bot.dispatcher - INFO - [c3699e81] Gemini response in 3.97s: 0 chars, 3 tools
2026-03-26 12:10:56 - slack_bot.dispatcher - INFO - [c3699e81] Executing 3 tools
2026-03-26 12:10:56 - slack_bot.dispatcher - INFO - [c3699e81] Tool: sync_garmin Args: {'target_date': '2026-03-26'}
2026-03-26 12:10:56 - slack_bot.tools.garmin - INFO - Starting Garmin sync for 2026-03-26...
2026-03-26 12:10:56 - health.services.data_sync - INFO - Authenticating with Garmin...
2026-03-26 12:10:56 - health.services.garmin_client - INFO - Authenticating with Garmin Connect China for 350134531@qq.com
2026-03-26 12:10:56 - health.services.garmin_client - INFO - Successfully authenticated with Garmin Connect China
2026-03-26 12:10:56 - health.services.data_sync - INFO - Authentication successful
2026-03-26 12:10:56 - health.services.data_sync - INFO - Syncing 14 metric types from 2026-03-26 to 2026-03-26
2026-03-26 12:10:56 - health.services.data_sync - INFO - Syncing steps from 2026-03-26 to 2026-03-26 (1 days)
2026-03-26 12:10:56 - health.services.data_sync - INFO - ✓ Synced steps for 2026-03-26
2026-03-26 12:10:56 - health.services.data_sync - INFO - steps sync complete: 1 synced, 0 skipped, 0 errors
2026-03-26 12:10:56 - health.services.data_sync - INFO - Syncing heart_rate from 2026-03-26 to 2026-03-26 (1 days)
2026-03-26 12:10:56 - health.services.data_sync - INFO - ✓ Synced heart_rate for 2026-03-26
2026-03-26 12:10:56 - health.services.data_sync - INFO - heart_rate sync complete: 1 synced, 0 skipped, 0 errors
2026-03-26 12:10:56 - health.services.data_sync - INFO - Syncing sleep from 2026-03-26 to 2026-03-26 (1 days)
2026-03-26 12:10:57 - health.services.data_sync - INFO - ✓ Synced sleep for 2026-03-26
2026-03-26 12:10:57 - health.services.data_sync - INFO - sleep sync complete: 1 synced, 0 skipped, 0 errors
2026-03-26 12:10:57 - health.services.data_sync - INFO - Syncing stress from 2026-03-26 to 2026-03-26 (1 days)
2026-03-26 12:10:57 - health.services.data_sync - INFO - ✓ Synced stress for 2026-03-26
2026-03-26 12:10:57 - health.services.data_sync - INFO - stress sync complete: 1 synced, 0 skipped, 0 errors
2026-03-26 12:10:57 - health.services.data_sync - INFO - Syncing body_battery from 2026-03-26 to 2026-03-26 (1 days)
2026-03-26 12:10:57 - health.services.data_sync - INFO - ✓ Synced body_battery for 2026-03-26
2026-03-26 12:10:57 - health.services.data_sync - INFO - body_battery sync complete: 1 synced, 0 skipped, 0 errors
2026-03-26 12:10:57 - health.services.data_sync - INFO - Syncing spo2 from 2026-03-26 to 2026-03-26 (1 days)
2026-03-26 12:10:57 - health.services.data_sync - INFO - ✓ Synced spo2 for 2026-03-26
2026-03-26 12:10:57 - health.services.data_sync - INFO - spo2 sync complete: 1 synced, 0 skipped, 0 errors
2026-03-26 12:10:57 - health.services.data_sync - INFO - Syncing respiration from 2026-03-26 to 2026-03-26 (1 days)
2026-03-26 12:10:57 - health.services.data_sync - INFO - ✓ Synced respiration for 2026-03-26
2026-03-26 12:10:57 - health.services.data_sync - INFO - respiration sync complete: 1 synced, 0 skipped, 0 errors
2026-03-26 12:10:57 - health.services.data_sync - INFO - Syncing hydration from 2026-03-26 to 2026-03-26 (1 days)
2026-03-26 12:10:57 - health.services.data_sync - INFO - ✓ Synced hydration for 2026-03-26
2026-03-26 12:10:57 - health.services.data_sync - INFO - hydration sync complete: 1 synced, 0 skipped, 0 errors
2026-03-26 12:10:57 - health.services.data_sync - INFO - Syncing floors from 2026-03-26 to 2026-03-26 (1 days)
2026-03-26 12:10:57 - health.services.data_sync - INFO - ✓ Synced floors for 2026-03-26
2026-03-26 12:10:57 - health.services.data_sync - INFO - floors sync complete: 1 synced, 0 skipped, 0 errors
2026-03-26 12:10:57 - health.services.data_sync - INFO - Syncing intensity_minutes from 2026-03-26 to 2026-03-26 (1 days)
2026-03-26 12:10:57 - health.services.data_sync - INFO - ✓ Synced intensity_minutes for 2026-03-26
2026-03-26 12:10:57 - health.services.data_sync - INFO - intensity_minutes sync complete: 1 synced, 0 skipped, 0 errors
2026-03-26 12:10:57 - health.services.data_sync - INFO - Syncing hrv from 2026-03-26 to 2026-03-26 (1 days)
2026-03-26 12:10:58 - health.services.data_sync - INFO - ✓ Synced hrv for 2026-03-26
2026-03-26 12:10:58 - health.services.data_sync - INFO - hrv sync complete: 1 synced, 0 skipped, 0 errors
2026-03-26 12:10:58 - health.services.data_sync - INFO - Syncing rhr from 2026-03-26 to 2026-03-26 (1 days)
2026-03-26 12:10:58 - health.services.data_sync - INFO - ✓ Synced rhr for 2026-03-26
2026-03-26 12:10:58 - health.services.data_sync - INFO - rhr sync complete: 1 synced, 0 skipped, 0 errors
2026-03-26 12:10:58 - health.services.data_sync - INFO - Syncing weight from 2026-03-26 to 2026-03-26 (1 days)
2026-03-26 12:10:58 - health.services.data_sync - INFO - weight sync complete: 0 synced, 1 skipped, 0 errors
2026-03-26 12:10:58 - health.services.data_sync - INFO - Syncing lifestyle_logging from 2026-03-26 to 2026-03-26 (1 days)
2026-03-26 12:10:58 - health.services.data_sync - INFO - lifestyle_logging sync complete: 0 synced, 1 skipped, 0 errors
2026-03-26 12:10:58 - health.services.data_sync - INFO - Syncing activities from 2026-03-26 to 2026-03-26
2026-03-26 12:10:58 - health.services.data_sync - INFO - Found 0 activities
2026-03-26 12:10:58 - health.services.data_sync - INFO - Activity sync complete: 0 synced, 0 skipped, 0 errors
2026-03-26 12:10:58 - health.services.query - INFO - Querying health data summary for 2026-03-26
2026-03-26 12:10:58 - health.services.query - INFO - Found 12 metrics and 0 activities
2026-03-26 12:10:58 - slack_bot.dispatcher - INFO - [c3699e81] ✓ sync_garmin finished in 2.37s
2026-03-26 12:10:58 - slack_bot.dispatcher - INFO - [c3699e81] Tool: get_daily_detailed_stats Args: {'target_date': '2026-03-26'}
2026-03-26 12:10:58 - health.services.query - INFO - Querying health data summary for 2026-03-26
2026-03-26 12:10:58 - health.services.query - INFO - Found 12 metrics and 0 activities
2026-03-26 12:10:58 - slack_bot.dispatcher - INFO - [c3699e81] ✓ get_daily_detailed_stats finished in 0.01s
2026-03-26 12:10:58 - slack_bot.dispatcher - INFO - [c3699e81] Tool: get_activity_history Args: {'end_date': '2026-03-26', 'start_date': '2026-03-25'}
2026-03-26 12:10:58 - health.services.query - INFO - Querying activities from 2026-03-25 to 2026-03-26
2026-03-26 12:10:58 - health.services.query - INFO - Found 1 activities
2026-03-26 12:10:58 - slack_bot.dispatcher - INFO - [c3699e81] ✓ get_activity_history finished in 0.00s
2026-03-26 12:10:58 - slack_bot.dispatcher - INFO - [c3699e81] Requesting final analysis...
2026-03-26 12:11:03 - slack_bot.dispatcher - INFO - [c3699e81] Final analysis received in 5.26s
2026-03-26 12:11:03 - slack_bot.dispatcher - INFO - Formatted text (len 659 -> 633)
2026-03-26 12:11:04 - slack_bot.dispatcher - WARNING - [c3699e81] Update failed, posting new: The request to the Slack API failed. (url: https://slack.com/api/chat.update)
The server responded with: {'ok': False, 'error': 'msg_too_long'}
2026-03-26 12:11:04 - slack_bot.dispatcher - INFO - [c3699e81] Dispatch completed in 12.23s
2026-03-26 12:11:04 - __main__ - INFO - [c3699e81] ✅ Request completed in 12.55s
2026-03-27 10:30:10 - __main__ - INFO - [87407592] 📥 Received message from U0A8ZCK7RJM in D0AA4GBQRKK: 同步佳明数据 (Files: 0)
2026-03-27 10:30:11 - slack_bot.dispatcher - INFO - [87407592] Processing message in D0AA4GBQRKK from U0A8ZCK7RJM
2026-03-27 10:30:11 - slack_bot.dispatcher - INFO - [87407592] Calling Gemini for initial response...
2026-03-27 10:30:11 - slack_bot.dispatcher - INFO - [87407592] Request config: model=google/gemini-3-flash-preview, tools=21, context=39 msgs
2026-03-27 10:30:13 - slack_bot.dispatcher - WARNING - [87407592] Gemini returned empty response_text! (This usually means the proxy has issues)
2026-03-27 10:30:13 - slack_bot.dispatcher - INFO - [87407592] Gemini response: text=0 chars, tool_calls=2
2026-03-27 10:30:13 - slack_bot.dispatcher - INFO - [87407592] Tool calls successfully generated by Gemini (no SAFETY OVERRIDE needed)
2026-03-27 10:30:13 - slack_bot.dispatcher - INFO - [87407592] Gemini response in 2.36s: 0 chars, 2 tools
2026-03-27 10:30:13 - slack_bot.dispatcher - INFO - [87407592] Executing 2 tools
2026-03-27 10:30:13 - slack_bot.dispatcher - INFO - [87407592] Tool: sync_garmin Args: {'target_date': '2026-03-27'}
2026-03-27 10:30:13 - slack_bot.tools.garmin - INFO - Starting Garmin sync for 2026-03-27...
2026-03-27 10:30:13 - health.services.data_sync - INFO - Authenticating with Garmin...
2026-03-27 10:30:13 - health.services.garmin_client - INFO - Authenticating with Garmin Connect China for 350134531@qq.com
2026-03-27 10:30:14 - health.services.garmin_client - INFO - Successfully authenticated with Garmin Connect China
2026-03-27 10:30:14 - health.services.data_sync - INFO - Authentication successful
2026-03-27 10:30:14 - health.services.data_sync - INFO - Syncing 14 metric types from 2026-03-27 to 2026-03-27
2026-03-27 10:30:14 - health.services.data_sync - INFO - Syncing steps from 2026-03-27 to 2026-03-27 (1 days)
2026-03-27 10:30:14 - health.services.data_sync - INFO - ✓ Synced steps for 2026-03-27
2026-03-27 10:30:14 - health.services.data_sync - INFO - steps sync complete: 1 synced, 0 skipped, 0 errors
2026-03-27 10:30:14 - health.services.data_sync - INFO - Syncing heart_rate from 2026-03-27 to 2026-03-27 (1 days)
2026-03-27 10:30:14 - health.services.data_sync - INFO - ✓ Synced heart_rate for 2026-03-27
2026-03-27 10:30:14 - health.services.data_sync - INFO - heart_rate sync complete: 1 synced, 0 skipped, 0 errors
2026-03-27 10:30:14 - health.services.data_sync - INFO - Syncing sleep from 2026-03-27 to 2026-03-27 (1 days)
2026-03-27 10:30:14 - health.services.data_sync - INFO - ✓ Synced sleep for 2026-03-27
2026-03-27 10:30:14 - health.services.data_sync - INFO - sleep sync complete: 1 synced, 0 skipped, 0 errors
2026-03-27 10:30:14 - health.services.data_sync - INFO - Syncing stress from 2026-03-27 to 2026-03-27 (1 days)
2026-03-27 10:30:14 - health.services.data_sync - INFO - ✓ Synced stress for 2026-03-27
2026-03-27 10:30:14 - health.services.data_sync - INFO - stress sync complete: 1 synced, 0 skipped, 0 errors
2026-03-27 10:30:14 - health.services.data_sync - INFO - Syncing body_battery from 2026-03-27 to 2026-03-27 (1 days)
2026-03-27 10:30:14 - health.services.data_sync - INFO - ✓ Synced body_battery for 2026-03-27
2026-03-27 10:30:14 - health.services.data_sync - INFO - body_battery sync complete: 1 synced, 0 skipped, 0 errors
2026-03-27 10:30:14 - health.services.data_sync - INFO - Syncing spo2 from 2026-03-27 to 2026-03-27 (1 days)
2026-03-27 10:30:14 - health.services.data_sync - INFO - ✓ Synced spo2 for 2026-03-27
2026-03-27 10:30:14 - health.services.data_sync - INFO - spo2 sync complete: 1 synced, 0 skipped, 0 errors
2026-03-27 10:30:14 - health.services.data_sync - INFO - Syncing respiration from 2026-03-27 to 2026-03-27 (1 days)
2026-03-27 10:30:15 - health.services.data_sync - INFO - ✓ Synced respiration for 2026-03-27
2026-03-27 10:30:15 - health.services.data_sync - INFO - respiration sync complete: 1 synced, 0 skipped, 0 errors
2026-03-27 10:30:15 - health.services.data_sync - INFO - Syncing hydration from 2026-03-27 to 2026-03-27 (1 days)
2026-03-27 10:30:15 - health.services.data_sync - INFO - ✓ Synced hydration for 2026-03-27
2026-03-27 10:30:15 - health.services.data_sync - INFO - hydration sync complete: 1 synced, 0 skipped, 0 errors
2026-03-27 10:30:15 - health.services.data_sync - INFO - Syncing floors from 2026-03-27 to 2026-03-27 (1 days)
2026-03-27 10:30:15 - health.services.data_sync - INFO - ✓ Synced floors for 2026-03-27
2026-03-27 10:30:15 - health.services.data_sync - INFO - floors sync complete: 1 synced, 0 skipped, 0 errors
2026-03-27 10:30:15 - health.services.data_sync - INFO - Syncing intensity_minutes from 2026-03-27 to 2026-03-27 (1 days)
2026-03-27 10:30:15 - health.services.data_sync - INFO - ✓ Synced intensity_minutes for 2026-03-27
2026-03-27 10:30:15 - health.services.data_sync - INFO - intensity_minutes sync complete: 1 synced, 0 skipped, 0 errors
2026-03-27 10:30:15 - health.services.data_sync - INFO - Syncing hrv from 2026-03-27 to 2026-03-27 (1 days)
2026-03-27 10:30:15 - health.services.data_sync - INFO - ✓ Synced hrv for 2026-03-27
2026-03-27 10:30:15 - health.services.data_sync - INFO - hrv sync complete: 1 synced, 0 skipped, 0 errors
2026-03-27 10:30:15 - health.services.data_sync - INFO - Syncing rhr from 2026-03-27 to 2026-03-27 (1 days)
2026-03-27 10:30:15 - health.services.data_sync - INFO - ✓ Synced rhr for 2026-03-27
2026-03-27 10:30:15 - health.services.data_sync - INFO - rhr sync complete: 1 synced, 0 skipped, 0 errors
2026-03-27 10:30:15 - health.services.data_sync - INFO - Syncing weight from 2026-03-27 to 2026-03-27 (1 days)
2026-03-27 10:30:15 - health.services.data_sync - INFO - weight sync complete: 0 synced, 1 skipped, 0 errors
2026-03-27 10:30:15 - health.services.data_sync - INFO - Syncing lifestyle_logging from 2026-03-27 to 2026-03-27 (1 days)
2026-03-27 10:30:15 - health.services.data_sync - INFO - lifestyle_logging sync complete: 0 synced, 1 skipped, 0 errors
2026-03-27 10:30:15 - health.services.data_sync - INFO - Syncing activities from 2026-03-27 to 2026-03-27
2026-03-27 10:30:16 - health.services.garmin_client - INFO - Fetched 1 activities
2026-03-27 10:30:16 - health.services.data_sync - INFO - Found 1 activities
2026-03-27 10:30:16 - health.services.data_sync - INFO - ✓ Synced activity 577810819 (elliptical) on 2026-03-27
2026-03-27 10:30:16 - health.services.data_sync - INFO - Activity sync complete: 1 synced, 0 skipped, 0 errors
2026-03-27 10:30:16 - health.services.query - INFO - Querying health data summary for 2026-03-27
2026-03-27 10:30:16 - health.services.query - INFO - Found 12 metrics and 1 activities
2026-03-27 10:30:16 - slack_bot.dispatcher - INFO - [87407592] ✓ sync_garmin finished in 2.43s
2026-03-27 10:30:16 - slack_bot.dispatcher - INFO - [87407592] Tool: get_daily_detailed_stats Args: {'target_date': '2026-03-27'}
2026-03-27 10:30:16 - health.services.query - INFO - Querying health data summary for 2026-03-27
2026-03-27 10:30:16 - health.services.query - INFO - Found 12 metrics and 1 activities
2026-03-27 10:30:16 - slack_bot.dispatcher - INFO - [87407592] ✓ get_daily_detailed_stats finished in 0.01s
2026-03-27 10:30:16 - slack_bot.dispatcher - INFO - [87407592] Requesting final analysis...
2026-03-27 10:30:21 - slack_bot.dispatcher - INFO - [87407592] Final analysis received in 5.40s
2026-03-27 10:30:21 - slack_bot.dispatcher - INFO - Formatted text (len 672 -> 638)
2026-03-27 10:30:21 - slack_bot.dispatcher - WARNING - [87407592] Update failed, posting new: The request to the Slack API failed. (url: https://slack.com/api/chat.update)
The server responded with: {'ok': False, 'error': 'msg_too_long'}
2026-03-27 10:30:22 - slack_bot.dispatcher - INFO - [87407592] Dispatch completed in 10.82s
2026-03-27 10:30:22 - __main__ - INFO - [87407592] ✅ Request completed in 11.13s
2026-03-27 10:32:05 - __main__ - INFO - [7f5a5df3] 📥 Received message from U0A8ZCK7RJM in D0AA4GBQRKK: 因为有一段时间没有卧推了，而且最近体重掉的比较多，前几天做了一次缩水版的卧推训练，感觉力量少了很多，延迟性肌肉酸痛好几天了还没好，这是否正常，应该怎么处理 (Files: 0)
2026-03-27 10:32:06 - slack_bot.dispatcher - INFO - [7f5a5df3] Processing message in D0AA4GBQRKK from U0A8ZCK7RJM
2026-03-27 10:32:06 - slack_bot.dispatcher - INFO - [7f5a5df3] Calling Gemini for initial response...
2026-03-27 10:32:06 - slack_bot.dispatcher - INFO - [7f5a5df3] Request config: model=google/gemini-3-flash-preview, tools=21, context=39 msgs
2026-03-27 10:32:09 - slack_bot.dispatcher - WARNING - [7f5a5df3] Gemini returned empty response_text! (This usually means the proxy has issues)
2026-03-27 10:32:09 - slack_bot.dispatcher - INFO - [7f5a5df3] Gemini response: text=0 chars, tool_calls=3
2026-03-27 10:32:09 - slack_bot.dispatcher - INFO - [7f5a5df3] Tool calls successfully generated by Gemini (no SAFETY OVERRIDE needed)
2026-03-27 10:32:09 - slack_bot.dispatcher - INFO - [7f5a5df3] Gemini response in 3.05s: 0 chars, 3 tools
2026-03-27 10:32:09 - slack_bot.dispatcher - INFO - [7f5a5df3] Executing 3 tools
2026-03-27 10:32:09 - slack_bot.dispatcher - INFO - [7f5a5df3] Tool: get_manual_history Args: {'start_date': '2026-03-20', 'category': 'diet', 'end_date': '2026-03-27'}
2026-03-27 10:32:09 - slack_bot.dispatcher - INFO - [7f5a5df3] ✓ get_manual_history finished in 0.01s
2026-03-27 10:32:09 - slack_bot.dispatcher - INFO - [7f5a5df3] Tool: get_manual_history Args: {'end_date': '2026-03-27', 'category': 'supplements', 'start_date': '2026-03-20'}
2026-03-27 10:32:09 - slack_bot.dispatcher - INFO - [7f5a5df3] ✓ get_manual_history finished in 0.00s
2026-03-27 10:32:09 - slack_bot.dispatcher - INFO - [7f5a5df3] Tool: get_metric_history Args: {'start_date': '2026-02-27', 'end_date': '2026-03-27', 'metric_type': 'weight'}
2026-03-27 10:32:09 - slack_bot.tools.health_read - INFO - Time range 29 days - using aggregated analysis
2026-03-27 10:32:09 - health.services.query - INFO - Querying weight from 2026-02-27 to 2026-03-27
2026-03-27 10:32:09 - health.services.query - INFO - Found 1 records for weight
2026-03-27 10:32:09 - slack_bot.dispatcher - INFO - [7f5a5df3] ✓ get_metric_history finished in 0.05s
2026-03-27 10:32:09 - slack_bot.dispatcher - INFO - [7f5a5df3] Requesting final analysis...
2026-03-27 10:32:16 - slack_bot.dispatcher - INFO - [7f5a5df3] Final analysis received in 7.12s
2026-03-27 10:32:16 - slack_bot.dispatcher - INFO - Formatted text (len 1017 -> 977)
2026-03-27 10:32:16 - slack_bot.dispatcher - INFO - [7f5a5df3] 📤 Message updated 1774578725.980359
2026-03-27 10:32:16 - slack_bot.dispatcher - INFO - [7f5a5df3] Dispatch completed in 10.57s
2026-03-27 10:32:16 - __main__ - INFO - [7f5a5df3] ✅ Request completed in 10.88s
2026-03-28 08:44:49 - __main__ - INFO - [8d511a80] 📥 Received message from U0A8ZCK7RJM in D0AA4GBQRKK: 同步佳明数据 (Files: 0)
2026-03-28 08:44:49 - slack_bot.dispatcher - INFO - [8d511a80] Processing message in D0AA4GBQRKK from U0A8ZCK7RJM
2026-03-28 08:44:49 - slack_bot.dispatcher - INFO - [8d511a80] Calling Gemini for initial response...
2026-03-28 08:44:49 - slack_bot.dispatcher - INFO - [8d511a80] Request config: model=google/gemini-3-flash-preview, tools=21, context=39 msgs
2026-03-28 08:44:52 - slack_bot.dispatcher - WARNING - [8d511a80] Gemini returned empty response_text! (This usually means the proxy has issues)
2026-03-28 08:44:52 - slack_bot.dispatcher - INFO - [8d511a80] Gemini response: text=0 chars, tool_calls=2
2026-03-28 08:44:52 - slack_bot.dispatcher - INFO - [8d511a80] Tool calls successfully generated by Gemini (no SAFETY OVERRIDE needed)
2026-03-28 08:44:52 - slack_bot.dispatcher - INFO - [8d511a80] Gemini response in 3.11s: 0 chars, 2 tools
2026-03-28 08:44:52 - slack_bot.dispatcher - INFO - [8d511a80] Executing 2 tools
2026-03-28 08:44:52 - slack_bot.dispatcher - INFO - [8d511a80] Tool: sync_garmin Args: {'target_date': '2026-03-28'}
2026-03-28 08:44:52 - slack_bot.tools.garmin - INFO - Starting Garmin sync for 2026-03-28...
2026-03-28 08:44:52 - health.services.data_sync - INFO - Authenticating with Garmin...
2026-03-28 08:44:52 - health.services.garmin_client - INFO - Authenticating with Garmin Connect China for 350134531@qq.com
2026-03-28 08:44:53 - health.services.garmin_client - INFO - Successfully authenticated with Garmin Connect China
2026-03-28 08:44:53 - health.services.data_sync - INFO - Authentication successful
2026-03-28 08:44:53 - health.services.data_sync - INFO - Syncing 14 metric types from 2026-03-28 to 2026-03-28
2026-03-28 08:44:53 - health.services.data_sync - INFO - Syncing steps from 2026-03-28 to 2026-03-28 (1 days)
2026-03-28 08:44:53 - health.services.data_sync - INFO - ✓ Synced steps for 2026-03-28
2026-03-28 08:44:53 - health.services.data_sync - INFO - steps sync complete: 1 synced, 0 skipped, 0 errors
2026-03-28 08:44:53 - health.services.data_sync - INFO - Syncing heart_rate from 2026-03-28 to 2026-03-28 (1 days)
2026-03-28 08:44:53 - health.services.data_sync - INFO - ✓ Synced heart_rate for 2026-03-28
2026-03-28 08:44:53 - health.services.data_sync - INFO - heart_rate sync complete: 1 synced, 0 skipped, 0 errors
2026-03-28 08:44:53 - health.services.data_sync - INFO - Syncing sleep from 2026-03-28 to 2026-03-28 (1 days)
2026-03-28 08:44:54 - health.services.data_sync - INFO - ✓ Synced sleep for 2026-03-28
2026-03-28 08:44:54 - health.services.data_sync - INFO - sleep sync complete: 1 synced, 0 skipped, 0 errors
2026-03-28 08:44:54 - health.services.data_sync - INFO - Syncing stress from 2026-03-28 to 2026-03-28 (1 days)
2026-03-28 08:44:54 - health.services.data_sync - INFO - ✓ Synced stress for 2026-03-28
2026-03-28 08:44:54 - health.services.data_sync - INFO - stress sync complete: 1 synced, 0 skipped, 0 errors
2026-03-28 08:44:54 - health.services.data_sync - INFO - Syncing body_battery from 2026-03-28 to 2026-03-28 (1 days)
2026-03-28 08:44:54 - health.services.data_sync - INFO - ✓ Synced body_battery for 2026-03-28
2026-03-28 08:44:54 - health.services.data_sync - INFO - body_battery sync complete: 1 synced, 0 skipped, 0 errors
2026-03-28 08:44:54 - health.services.data_sync - INFO - Syncing spo2 from 2026-03-28 to 2026-03-28 (1 days)
2026-03-28 08:44:54 - health.services.data_sync - INFO - ✓ Synced spo2 for 2026-03-28
2026-03-28 08:44:54 - health.services.data_sync - INFO - spo2 sync complete: 1 synced, 0 skipped, 0 errors
2026-03-28 08:44:54 - health.services.data_sync - INFO - Syncing respiration from 2026-03-28 to 2026-03-28 (1 days)
2026-03-28 08:44:54 - health.services.data_sync - INFO - ✓ Synced respiration for 2026-03-28
2026-03-28 08:44:54 - health.services.data_sync - INFO - respiration sync complete: 1 synced, 0 skipped, 0 errors
2026-03-28 08:44:54 - health.services.data_sync - INFO - Syncing hydration from 2026-03-28 to 2026-03-28 (1 days)
2026-03-28 08:44:54 - health.services.data_sync - INFO - ✓ Synced hydration for 2026-03-28
2026-03-28 08:44:54 - health.services.data_sync - INFO - hydration sync complete: 1 synced, 0 skipped, 0 errors
2026-03-28 08:44:54 - health.services.data_sync - INFO - Syncing floors from 2026-03-28 to 2026-03-28 (1 days)
2026-03-28 08:44:54 - health.services.data_sync - INFO - ✓ Synced floors for 2026-03-28
2026-03-28 08:44:54 - health.services.data_sync - INFO - floors sync complete: 1 synced, 0 skipped, 0 errors
2026-03-28 08:44:54 - health.services.data_sync - INFO - Syncing intensity_minutes from 2026-03-28 to 2026-03-28 (1 days)
2026-03-28 08:44:54 - health.services.data_sync - INFO - ✓ Synced intensity_minutes for 2026-03-28
2026-03-28 08:44:54 - health.services.data_sync - INFO - intensity_minutes sync complete: 1 synced, 0 skipped, 0 errors
2026-03-28 08:44:54 - health.services.data_sync - INFO - Syncing hrv from 2026-03-28 to 2026-03-28 (1 days)
2026-03-28 08:44:55 - health.services.data_sync - INFO - ✓ Synced hrv for 2026-03-28
2026-03-28 08:44:55 - health.services.data_sync - INFO - hrv sync complete: 1 synced, 0 skipped, 0 errors
2026-03-28 08:44:55 - health.services.data_sync - INFO - Syncing rhr from 2026-03-28 to 2026-03-28 (1 days)
2026-03-28 08:44:55 - health.services.data_sync - INFO - ✓ Synced rhr for 2026-03-28
2026-03-28 08:44:55 - health.services.data_sync - INFO - rhr sync complete: 1 synced, 0 skipped, 0 errors
2026-03-28 08:44:55 - health.services.data_sync - INFO - Syncing weight from 2026-03-28 to 2026-03-28 (1 days)
2026-03-28 08:44:55 - health.services.data_sync - INFO - weight sync complete: 0 synced, 1 skipped, 0 errors
2026-03-28 08:44:55 - health.services.data_sync - INFO - Syncing lifestyle_logging from 2026-03-28 to 2026-03-28 (1 days)
2026-03-28 08:44:55 - health.services.data_sync - INFO - lifestyle_logging sync complete: 0 synced, 1 skipped, 0 errors
2026-03-28 08:44:55 - health.services.data_sync - INFO - Syncing activities from 2026-03-28 to 2026-03-28
2026-03-28 08:44:55 - health.services.data_sync - INFO - Found 0 activities
2026-03-28 08:44:55 - health.services.data_sync - INFO - Activity sync complete: 0 synced, 0 skipped, 0 errors
2026-03-28 08:44:55 - health.services.query - INFO - Querying health data summary for 2026-03-28
2026-03-28 08:44:55 - health.services.query - INFO - Found 12 metrics and 0 activities
2026-03-28 08:44:55 - slack_bot.dispatcher - INFO - [8d511a80] ✓ sync_garmin finished in 2.46s
2026-03-28 08:44:55 - slack_bot.dispatcher - INFO - [8d511a80] Tool: get_daily_detailed_stats Args: {'target_date': '2026-03-28'}
2026-03-28 08:44:55 - health.services.query - INFO - Querying health data summary for 2026-03-28
2026-03-28 08:44:55 - health.services.query - INFO - Found 12 metrics and 0 activities
2026-03-28 08:44:55 - slack_bot.dispatcher - INFO - [8d511a80] ✓ get_daily_detailed_stats finished in 0.01s
2026-03-28 08:44:55 - slack_bot.dispatcher - INFO - [8d511a80] Requesting final analysis...
2026-03-28 08:45:01 - slack_bot.dispatcher - INFO - [8d511a80] Final analysis received in 6.41s
2026-03-28 08:45:01 - slack_bot.dispatcher - INFO - Formatted text (len 846 -> 804)
2026-03-28 08:45:02 - slack_bot.dispatcher - WARNING - [8d511a80] Update failed, posting new: The request to the Slack API failed. (url: https://slack.com/api/chat.update)
The server responded with: {'ok': False, 'error': 'msg_too_long'}
2026-03-28 08:45:02 - slack_bot.dispatcher - INFO - [8d511a80] Dispatch completed in 12.76s
2026-03-28 08:45:02 - __main__ - INFO - [8d511a80] ✅ Request completed in 13.07s
2026-03-28 08:46:09 - __main__ - INFO - [ef7d3b6e] 📥 Received message from U0A8ZCK7RJM in D0AA4GBQRKK: 卧推已经好几天之前了，今天基本不酸痛。为什么还会心率提升，是不是与咖啡有关 (Files: 0)
2026-03-28 08:46:09 - slack_bot.dispatcher - INFO - [ef7d3b6e] Processing message in D0AA4GBQRKK from U0A8ZCK7RJM
2026-03-28 08:46:09 - slack_bot.dispatcher - INFO - [ef7d3b6e] Calling Gemini for initial response...
2026-03-28 08:46:09 - slack_bot.dispatcher - INFO - [ef7d3b6e] Request config: model=google/gemini-3-flash-preview, tools=21, context=39 msgs
2026-03-28 08:46:12 - slack_bot.dispatcher - WARNING - [ef7d3b6e] Gemini returned empty response_text! (This usually means the proxy has issues)
2026-03-28 08:46:12 - slack_bot.dispatcher - INFO - [ef7d3b6e] Gemini response: text=0 chars, tool_calls=3
2026-03-28 08:46:12 - slack_bot.dispatcher - INFO - [ef7d3b6e] Tool calls successfully generated by Gemini (no SAFETY OVERRIDE needed)
2026-03-28 08:46:12 - slack_bot.dispatcher - INFO - [ef7d3b6e] Gemini response in 3.09s: 0 chars, 3 tools
2026-03-28 08:46:12 - slack_bot.dispatcher - INFO - [ef7d3b6e] Executing 3 tools
2026-03-28 08:46:12 - slack_bot.dispatcher - INFO - [ef7d3b6e] Tool: get_manual_history Args: {'category': 'diet', 'start_date': '2026-03-26', 'end_date': '2026-03-28'}
2026-03-28 08:46:12 - slack_bot.dispatcher - INFO - [ef7d3b6e] ✓ get_manual_history finished in 0.00s
2026-03-28 08:46:12 - slack_bot.dispatcher - INFO - [ef7d3b6e] Tool: get_manual_history Args: {'category': 'supplements', 'start_date': '2026-03-26', 'end_date': '2026-03-28'}
2026-03-28 08:46:12 - slack_bot.dispatcher - INFO - [ef7d3b6e] ✓ get_manual_history finished in 0.00s
2026-03-28 08:46:12 - slack_bot.dispatcher - INFO - [ef7d3b6e] Tool: get_metric_history Args: {'start_date': '2026-03-24', 'metric_type': 'stress', 'end_date': '2026-03-28'}
2026-03-28 08:46:12 - health.services.query - INFO - Querying stress from 2026-03-24 to 2026-03-28
2026-03-28 08:46:12 - health.services.query - INFO - Found 5 records for stress
2026-03-28 08:46:12 - slack_bot.dispatcher - INFO - [ef7d3b6e] ✓ get_metric_history finished in 0.01s
2026-03-28 08:46:12 - slack_bot.dispatcher - INFO - [ef7d3b6e] Requesting final analysis...
2026-03-28 08:46:19 - slack_bot.dispatcher - INFO - [ef7d3b6e] Final analysis received in 6.71s
2026-03-28 08:46:19 - slack_bot.dispatcher - INFO - Formatted text (len 745 -> 721)
2026-03-28 08:46:19 - slack_bot.dispatcher - INFO - [ef7d3b6e] 📤 Message updated 1774658769.505189
2026-03-28 08:46:20 - slack_bot.dispatcher - INFO - [ef7d3b6e] 📤 Continuation message posted
2026-03-28 08:46:21 - slack_bot.dispatcher - INFO - [ef7d3b6e] 📤 Continuation message posted
2026-03-28 08:46:21 - slack_bot.dispatcher - INFO - [ef7d3b6e] Dispatch completed in 11.82s
2026-03-28 08:46:21 - __main__ - INFO - [ef7d3b6e] ✅ Request completed in 12.14s
2026-03-29 10:31:06 - __main__ - INFO - [bb72ddbc] 📥 Received message from U0A8ZCK7RJM in D0AA4GBQRKK: 同步佳明数据 (Files: 0)
2026-03-29 10:31:06 - slack_bot.dispatcher - INFO - [bb72ddbc] Processing message in D0AA4GBQRKK from U0A8ZCK7RJM
2026-03-29 10:31:06 - slack_bot.dispatcher - INFO - [bb72ddbc] Calling Gemini for initial response...
2026-03-29 10:31:06 - slack_bot.dispatcher - INFO - [bb72ddbc] Request config: model=google/gemini-3-flash-preview, tools=21, context=39 msgs
2026-03-29 10:31:09 - slack_bot.dispatcher - WARNING - [bb72ddbc] Gemini returned empty response_text! (This usually means the proxy has issues)
2026-03-29 10:31:09 - slack_bot.dispatcher - INFO - [bb72ddbc] Gemini response: text=0 chars, tool_calls=3
2026-03-29 10:31:09 - slack_bot.dispatcher - INFO - [bb72ddbc] Tool calls successfully generated by Gemini (no SAFETY OVERRIDE needed)
2026-03-29 10:31:09 - slack_bot.dispatcher - INFO - [bb72ddbc] Gemini response in 3.37s: 0 chars, 3 tools
2026-03-29 10:31:09 - slack_bot.dispatcher - INFO - [bb72ddbc] Executing 3 tools
2026-03-29 10:31:09 - slack_bot.dispatcher - INFO - [bb72ddbc] Tool: sync_garmin Args: {'target_date': '2026-03-29'}
2026-03-29 10:31:09 - slack_bot.tools.garmin - INFO - Starting Garmin sync for 2026-03-29...
2026-03-29 10:31:09 - health.services.data_sync - INFO - Authenticating with Garmin...
2026-03-29 10:31:09 - health.services.garmin_client - INFO - Authenticating with Garmin Connect China for 350134531@qq.com
2026-03-29 10:31:10 - health.services.garmin_client - INFO - Successfully authenticated with Garmin Connect China
2026-03-29 10:31:10 - health.services.data_sync - INFO - Authentication successful
2026-03-29 10:31:10 - health.services.data_sync - INFO - Syncing 14 metric types from 2026-03-29 to 2026-03-29
2026-03-29 10:31:10 - health.services.data_sync - INFO - Syncing steps from 2026-03-29 to 2026-03-29 (1 days)
2026-03-29 10:31:10 - health.services.data_sync - INFO - ✓ Synced steps for 2026-03-29
2026-03-29 10:31:10 - health.services.data_sync - INFO - steps sync complete: 1 synced, 0 skipped, 0 errors
2026-03-29 10:31:10 - health.services.data_sync - INFO - Syncing heart_rate from 2026-03-29 to 2026-03-29 (1 days)
2026-03-29 10:31:10 - health.services.data_sync - INFO - ✓ Synced heart_rate for 2026-03-29
2026-03-29 10:31:10 - health.services.data_sync - INFO - heart_rate sync complete: 1 synced, 0 skipped, 0 errors
2026-03-29 10:31:10 - health.services.data_sync - INFO - Syncing sleep from 2026-03-29 to 2026-03-29 (1 days)
2026-03-29 10:31:11 - health.services.data_sync - INFO - ✓ Synced sleep for 2026-03-29
2026-03-29 10:31:11 - health.services.data_sync - INFO - sleep sync complete: 1 synced, 0 skipped, 0 errors
2026-03-29 10:31:11 - health.services.data_sync - INFO - Syncing stress from 2026-03-29 to 2026-03-29 (1 days)
2026-03-29 10:31:11 - health.services.data_sync - INFO - ✓ Synced stress for 2026-03-29
2026-03-29 10:31:11 - health.services.data_sync - INFO - stress sync complete: 1 synced, 0 skipped, 0 errors
2026-03-29 10:31:11 - health.services.data_sync - INFO - Syncing body_battery from 2026-03-29 to 2026-03-29 (1 days)
2026-03-29 10:31:11 - health.services.data_sync - INFO - ✓ Synced body_battery for 2026-03-29
2026-03-29 10:31:11 - health.services.data_sync - INFO - body_battery sync complete: 1 synced, 0 skipped, 0 errors
2026-03-29 10:31:11 - health.services.data_sync - INFO - Syncing spo2 from 2026-03-29 to 2026-03-29 (1 days)
2026-03-29 10:31:11 - health.services.data_sync - INFO - ✓ Synced spo2 for 2026-03-29
2026-03-29 10:31:11 - health.services.data_sync - INFO - spo2 sync complete: 1 synced, 0 skipped, 0 errors
2026-03-29 10:31:11 - health.services.data_sync - INFO - Syncing respiration from 2026-03-29 to 2026-03-29 (1 days)
2026-03-29 10:31:11 - health.services.data_sync - INFO - ✓ Synced respiration for 2026-03-29
2026-03-29 10:31:11 - health.services.data_sync - INFO - respiration sync complete: 1 synced, 0 skipped, 0 errors
2026-03-29 10:31:11 - health.services.data_sync - INFO - Syncing hydration from 2026-03-29 to 2026-03-29 (1 days)
2026-03-29 10:31:11 - health.services.data_sync - INFO - ✓ Synced hydration for 2026-03-29
2026-03-29 10:31:11 - health.services.data_sync - INFO - hydration sync complete: 1 synced, 0 skipped, 0 errors
2026-03-29 10:31:11 - health.services.data_sync - INFO - Syncing floors from 2026-03-29 to 2026-03-29 (1 days)
2026-03-29 10:31:11 - health.services.data_sync - INFO - ✓ Synced floors for 2026-03-29
2026-03-29 10:31:11 - health.services.data_sync - INFO - floors sync complete: 1 synced, 0 skipped, 0 errors
2026-03-29 10:31:11 - health.services.data_sync - INFO - Syncing intensity_minutes from 2026-03-29 to 2026-03-29 (1 days)
2026-03-29 10:31:12 - health.services.data_sync - INFO - ✓ Synced intensity_minutes for 2026-03-29
2026-03-29 10:31:12 - health.services.data_sync - INFO - intensity_minutes sync complete: 1 synced, 0 skipped, 0 errors
2026-03-29 10:31:12 - health.services.data_sync - INFO - Syncing hrv from 2026-03-29 to 2026-03-29 (1 days)
2026-03-29 10:31:12 - health.services.data_sync - INFO - ✓ Synced hrv for 2026-03-29
2026-03-29 10:31:12 - health.services.data_sync - INFO - hrv sync complete: 1 synced, 0 skipped, 0 errors
2026-03-29 10:31:12 - health.services.data_sync - INFO - Syncing rhr from 2026-03-29 to 2026-03-29 (1 days)
2026-03-29 10:31:12 - health.services.data_sync - INFO - ✓ Synced rhr for 2026-03-29
2026-03-29 10:31:12 - health.services.data_sync - INFO - rhr sync complete: 1 synced, 0 skipped, 0 errors
2026-03-29 10:31:12 - health.services.data_sync - INFO - Syncing weight from 2026-03-29 to 2026-03-29 (1 days)
2026-03-29 10:31:12 - health.services.data_sync - INFO - weight sync complete: 0 synced, 1 skipped, 0 errors
2026-03-29 10:31:12 - health.services.data_sync - INFO - Syncing lifestyle_logging from 2026-03-29 to 2026-03-29 (1 days)
2026-03-29 10:31:12 - health.services.data_sync - INFO - lifestyle_logging sync complete: 0 synced, 1 skipped, 0 errors
2026-03-29 10:31:12 - health.services.data_sync - INFO - Syncing activities from 2026-03-29 to 2026-03-29
2026-03-29 10:31:12 - health.services.garmin_client - INFO - Fetched 1 activities
2026-03-29 10:31:12 - health.services.data_sync - INFO - Found 1 activities
2026-03-29 10:31:12 - health.services.data_sync - INFO - ✓ Synced activity 578523340 (elliptical) on 2026-03-29
2026-03-29 10:31:12 - health.services.data_sync - INFO - Activity sync complete: 1 synced, 0 skipped, 0 errors
2026-03-29 10:31:12 - health.services.query - INFO - Querying health data summary for 2026-03-29
2026-03-29 10:31:12 - health.services.query - INFO - Found 12 metrics and 1 activities
2026-03-29 10:31:12 - slack_bot.dispatcher - INFO - [bb72ddbc] ✓ sync_garmin finished in 2.75s
2026-03-29 10:31:12 - slack_bot.dispatcher - INFO - [bb72ddbc] Tool: get_daily_detailed_stats Args: {'target_date': '2026-03-29'}
2026-03-29 10:31:12 - health.services.query - INFO - Querying health data summary for 2026-03-29
2026-03-29 10:31:12 - health.services.query - INFO - Found 12 metrics and 1 activities
2026-03-29 10:31:12 - slack_bot.dispatcher - INFO - [bb72ddbc] ✓ get_daily_detailed_stats finished in 0.01s
2026-03-29 10:31:12 - slack_bot.dispatcher - INFO - [bb72ddbc] Tool: get_activity_history Args: {'end_date': '2026-03-29', 'start_date': '2026-03-28'}
2026-03-29 10:31:12 - health.services.query - INFO - Querying activities from 2026-03-28 to 2026-03-29
2026-03-29 10:31:12 - health.services.query - INFO - Found 1 activities
2026-03-29 10:31:12 - slack_bot.dispatcher - INFO - [bb72ddbc] ✓ get_activity_history finished in 0.00s
2026-03-29 10:31:12 - slack_bot.dispatcher - INFO - [bb72ddbc] Requesting final analysis...
2026-03-29 10:31:17 - slack_bot.dispatcher - INFO - [bb72ddbc] Final analysis received in 4.69s
2026-03-29 10:31:17 - slack_bot.dispatcher - INFO - Formatted text (len 698 -> 670)
2026-03-29 10:31:17 - slack_bot.dispatcher - WARNING - [bb72ddbc] Update failed, posting new: The request to the Slack API failed. (url: https://slack.com/api/chat.update)
The server responded with: {'ok': False, 'error': 'msg_too_long'}
2026-03-29 10:31:18 - slack_bot.dispatcher - INFO - [bb72ddbc] Dispatch completed in 11.44s
2026-03-29 10:31:18 - __main__ - INFO - [bb72ddbc] ✅ Request completed in 11.77s
2026-03-29 23:29:07 - __main__ - INFO - [57f82ed5] 📥 Received message from U0A8ZCK7RJM in D0AA4GBQRKK: 同步佳明数据，然后看看我明早是否应该椭圆机训练，因为我明天早上可能时间也不多，我在想是否应该直接休息，后天再做，请帮我分析优劣 (Files: 0)
2026-03-29 23:29:07 - slack_bot.dispatcher - INFO - [57f82ed5] Processing message in D0AA4GBQRKK from U0A8ZCK7RJM
2026-03-29 23:29:07 - slack_bot.dispatcher - INFO - [57f82ed5] Calling Gemini for initial response...
2026-03-29 23:29:07 - slack_bot.dispatcher - INFO - [57f82ed5] Request config: model=google/gemini-3-flash-preview, tools=21, context=39 msgs
2026-03-29 23:29:10 - slack_bot.dispatcher - WARNING - [57f82ed5] Gemini returned empty response_text! (This usually means the proxy has issues)
2026-03-29 23:29:10 - slack_bot.dispatcher - INFO - [57f82ed5] Gemini response: text=0 chars, tool_calls=2
2026-03-29 23:29:10 - slack_bot.dispatcher - INFO - [57f82ed5] Tool calls successfully generated by Gemini (no SAFETY OVERRIDE needed)
2026-03-29 23:29:10 - slack_bot.dispatcher - INFO - [57f82ed5] Gemini response in 2.99s: 0 chars, 2 tools
2026-03-29 23:29:10 - slack_bot.dispatcher - INFO - [57f82ed5] Executing 2 tools
2026-03-29 23:29:10 - slack_bot.dispatcher - INFO - [57f82ed5] Tool: sync_garmin Args: {'target_date': '2026-03-29'}
2026-03-29 23:29:10 - slack_bot.tools.garmin - INFO - Starting Garmin sync for 2026-03-29...
2026-03-29 23:29:10 - health.services.data_sync - INFO - Authenticating with Garmin...
2026-03-29 23:29:10 - health.services.garmin_client - INFO - Authenticating with Garmin Connect China for 350134531@qq.com
2026-03-29 23:29:10 - health.services.garmin_client - INFO - Successfully authenticated with Garmin Connect China
2026-03-29 23:29:10 - health.services.data_sync - INFO - Authentication successful
2026-03-29 23:29:10 - health.services.data_sync - INFO - Syncing 14 metric types from 2026-03-29 to 2026-03-29
2026-03-29 23:29:10 - health.services.data_sync - INFO - Syncing steps from 2026-03-29 to 2026-03-29 (1 days)
2026-03-29 23:29:11 - health.services.data_sync - INFO - ✓ Synced steps for 2026-03-29
2026-03-29 23:29:11 - health.services.data_sync - INFO - steps sync complete: 1 synced, 0 skipped, 0 errors
2026-03-29 23:29:11 - health.services.data_sync - INFO - Syncing heart_rate from 2026-03-29 to 2026-03-29 (1 days)
2026-03-29 23:29:11 - health.services.data_sync - INFO - ✓ Synced heart_rate for 2026-03-29
2026-03-29 23:29:11 - health.services.data_sync - INFO - heart_rate sync complete: 1 synced, 0 skipped, 0 errors
2026-03-29 23:29:11 - health.services.data_sync - INFO - Syncing sleep from 2026-03-29 to 2026-03-29 (1 days)
2026-03-29 23:29:11 - health.services.data_sync - INFO - ✓ Synced sleep for 2026-03-29
2026-03-29 23:29:11 - health.services.data_sync - INFO - sleep sync complete: 1 synced, 0 skipped, 0 errors
2026-03-29 23:29:11 - health.services.data_sync - INFO - Syncing stress from 2026-03-29 to 2026-03-29 (1 days)
2026-03-29 23:29:11 - health.services.data_sync - INFO - ✓ Synced stress for 2026-03-29
2026-03-29 23:29:11 - health.services.data_sync - INFO - stress sync complete: 1 synced, 0 skipped, 0 errors
2026-03-29 23:29:11 - health.services.data_sync - INFO - Syncing body_battery from 2026-03-29 to 2026-03-29 (1 days)
2026-03-29 23:29:11 - health.services.data_sync - INFO - ✓ Synced body_battery for 2026-03-29
2026-03-29 23:29:11 - health.services.data_sync - INFO - body_battery sync complete: 1 synced, 0 skipped, 0 errors
2026-03-29 23:29:11 - health.services.data_sync - INFO - Syncing spo2 from 2026-03-29 to 2026-03-29 (1 days)
2026-03-29 23:29:11 - health.services.data_sync - INFO - ✓ Synced spo2 for 2026-03-29
2026-03-29 23:29:11 - health.services.data_sync - INFO - spo2 sync complete: 1 synced, 0 skipped, 0 errors
2026-03-29 23:29:11 - health.services.data_sync - INFO - Syncing respiration from 2026-03-29 to 2026-03-29 (1 days)
2026-03-29 23:29:12 - health.services.data_sync - INFO - ✓ Synced respiration for 2026-03-29
2026-03-29 23:29:12 - health.services.data_sync - INFO - respiration sync complete: 1 synced, 0 skipped, 0 errors
2026-03-29 23:29:12 - health.services.data_sync - INFO - Syncing hydration from 2026-03-29 to 2026-03-29 (1 days)
2026-03-29 23:29:12 - health.services.data_sync - INFO - ✓ Synced hydration for 2026-03-29
2026-03-29 23:29:12 - health.services.data_sync - INFO - hydration sync complete: 1 synced, 0 skipped, 0 errors
2026-03-29 23:29:12 - health.services.data_sync - INFO - Syncing floors from 2026-03-29 to 2026-03-29 (1 days)
2026-03-29 23:29:12 - health.services.data_sync - INFO - ✓ Synced floors for 2026-03-29
2026-03-29 23:29:12 - health.services.data_sync - INFO - floors sync complete: 1 synced, 0 skipped, 0 errors
2026-03-29 23:29:12 - health.services.data_sync - INFO - Syncing intensity_minutes from 2026-03-29 to 2026-03-29 (1 days)
2026-03-29 23:29:12 - health.services.data_sync - INFO - ✓ Synced intensity_minutes for 2026-03-29
2026-03-29 23:29:12 - health.services.data_sync - INFO - intensity_minutes sync complete: 1 synced, 0 skipped, 0 errors
2026-03-29 23:29:12 - health.services.data_sync - INFO - Syncing hrv from 2026-03-29 to 2026-03-29 (1 days)
2026-03-29 23:29:12 - health.services.data_sync - INFO - ✓ Synced hrv for 2026-03-29
2026-03-29 23:29:12 - health.services.data_sync - INFO - hrv sync complete: 1 synced, 0 skipped, 0 errors
2026-03-29 23:29:12 - health.services.data_sync - INFO - Syncing rhr from 2026-03-29 to 2026-03-29 (1 days)
2026-03-29 23:29:12 - health.services.data_sync - INFO - ✓ Synced rhr for 2026-03-29
2026-03-29 23:29:12 - health.services.data_sync - INFO - rhr sync complete: 1 synced, 0 skipped, 0 errors
2026-03-29 23:29:12 - health.services.data_sync - INFO - Syncing weight from 2026-03-29 to 2026-03-29 (1 days)
2026-03-29 23:29:12 - health.services.data_sync - INFO - weight sync complete: 0 synced, 1 skipped, 0 errors
2026-03-29 23:29:12 - health.services.data_sync - INFO - Syncing lifestyle_logging from 2026-03-29 to 2026-03-29 (1 days)
2026-03-29 23:29:12 - health.services.data_sync - INFO - ✓ Synced lifestyle_logging for 2026-03-29
2026-03-29 23:29:12 - health.services.data_sync - INFO - lifestyle_logging sync complete: 1 synced, 0 skipped, 0 errors
2026-03-29 23:29:12 - health.services.data_sync - INFO - Syncing activities from 2026-03-29 to 2026-03-29
2026-03-29 23:29:13 - health.services.garmin_client - INFO - Fetched 2 activities
2026-03-29 23:29:13 - health.services.data_sync - INFO - Found 2 activities
2026-03-29 23:29:13 - health.services.data_sync - INFO - ✓ Synced activity 578771059 (strength_training) on 2026-03-29
2026-03-29 23:29:13 - health.services.data_sync - INFO - ✓ Synced activity 578523340 (elliptical) on 2026-03-29
2026-03-29 23:29:13 - health.services.data_sync - INFO - Activity sync complete: 2 synced, 0 skipped, 0 errors
2026-03-29 23:29:13 - health.services.query - INFO - Querying health data summary for 2026-03-29
2026-03-29 23:29:13 - health.services.query - INFO - Found 13 metrics and 2 activities
2026-03-29 23:29:13 - slack_bot.dispatcher - INFO - [57f82ed5] ✓ sync_garmin finished in 2.57s
2026-03-29 23:29:13 - slack_bot.dispatcher - INFO - [57f82ed5] Tool: get_daily_detailed_stats Args: {'target_date': '2026-03-29'}
2026-03-29 23:29:13 - health.services.query - INFO - Querying health data summary for 2026-03-29
2026-03-29 23:29:13 - health.services.query - INFO - Found 13 metrics and 2 activities
2026-03-29 23:29:13 - slack_bot.dispatcher - INFO - [57f82ed5] ✓ get_daily_detailed_stats finished in 0.01s
2026-03-29 23:29:13 - slack_bot.dispatcher - INFO - [57f82ed5] Requesting final analysis...
2026-03-29 23:29:19 - slack_bot.dispatcher - INFO - [57f82ed5] Final analysis received in 5.96s
2026-03-29 23:29:19 - slack_bot.dispatcher - INFO - Formatted text (len 753 -> 717)
2026-03-29 23:29:19 - slack_bot.dispatcher - WARNING - [57f82ed5] Update failed, posting new: The request to the Slack API failed. (url: https://slack.com/api/chat.update)
The server responded with: {'ok': False, 'error': 'msg_too_long'}
2026-03-29 23:29:20 - slack_bot.dispatcher - INFO - [57f82ed5] 📤 Continuation message posted
2026-03-29 23:29:20 - slack_bot.dispatcher - INFO - [57f82ed5] Dispatch completed in 12.97s
2026-03-29 23:29:20 - __main__ - INFO - [57f82ed5] ✅ Request completed in 13.29s
2026-03-30 12:45:30 - __main__ - INFO - [1b3e7f46] 📥 Received message from U0A8ZCK7RJM in D0AA4GBQRKK: 今天打算轻断食，至今还没吃东西，打算下午五点半再吃一顿600卡不到的轻食，现在中午喝一杯冰美式是不是好主意 (Files: 0)
2026-03-30 12:45:30 - slack_bot.dispatcher - INFO - [1b3e7f46] Processing message in D0AA4GBQRKK from U0A8ZCK7RJM
2026-03-30 12:45:30 - slack_bot.dispatcher - INFO - [1b3e7f46] Calling Gemini for initial response...
2026-03-30 12:45:30 - slack_bot.dispatcher - INFO - [1b3e7f46] Request config: model=google/gemini-3-flash-preview, tools=21, context=39 msgs
2026-03-30 12:45:39 - slack_bot.dispatcher - INFO - [1b3e7f46] Gemini response: text=996 chars, tool_calls=0
2026-03-30 12:45:39 - slack_bot.dispatcher - INFO - [1b3e7f46] No tool calls from Gemini - checking SAFETY OVERRIDE keywords...
2026-03-30 12:45:39 - slack_bot.dispatcher - WARNING - [1b3e7f46] 🔧 SAFETY OVERRIDE: Forcing get_daily_detailed_stats for 2026-03-30
2026-03-30 12:45:39 - slack_bot.dispatcher - INFO - [1b3e7f46] No SAFETY OVERRIDE match found - will return empty response or text
2026-03-30 12:45:39 - slack_bot.dispatcher - INFO - [1b3e7f46] Gemini response in 8.48s: 996 chars, 1 tools
2026-03-30 12:45:39 - slack_bot.dispatcher - INFO - [1b3e7f46] Executing 1 tools
2026-03-30 12:45:39 - slack_bot.dispatcher - INFO - [1b3e7f46] Tool: get_daily_detailed_stats Args: {'target_date': '2026-03-30'}
2026-03-30 12:45:39 - health.services.query - INFO - Querying health data summary for 2026-03-30
2026-03-30 12:45:39 - health.services.query - INFO - Found 12 metrics and 0 activities
2026-03-30 12:45:39 - slack_bot.dispatcher - INFO - [1b3e7f46] ✓ get_daily_detailed_stats finished in 0.02s
2026-03-30 12:45:39 - slack_bot.dispatcher - INFO - [1b3e7f46] Requesting final analysis...
2026-03-30 12:45:44 - slack_bot.dispatcher - INFO - [1b3e7f46] Final analysis received in 5.12s
2026-03-30 12:45:44 - slack_bot.dispatcher - INFO - Formatted text (len 610 -> 588)
2026-03-30 12:45:44 - slack_bot.dispatcher - INFO - [1b3e7f46] 📤 Message updated 1774845930.660009
2026-03-30 12:45:44 - slack_bot.dispatcher - INFO - [1b3e7f46] Dispatch completed in 13.93s
2026-03-30 12:45:44 - __main__ - INFO - [1b3e7f46] ✅ Request completed in 14.25s
2026-03-31 10:10:35 - __main__ - INFO - [83178f2d] 📥 Received message from U0A8ZCK7RJM in D0AA4GBQRKK: 同步佳明数据 (Files: 0)
2026-03-31 10:10:35 - slack_bot.dispatcher - INFO - [83178f2d] Processing message in D0AA4GBQRKK from U0A8ZCK7RJM
2026-03-31 10:10:35 - slack_bot.dispatcher - INFO - [83178f2d] Calling Gemini for initial response...
2026-03-31 10:10:35 - slack_bot.dispatcher - INFO - [83178f2d] Request config: model=google/gemini-3-flash-preview, tools=21, context=39 msgs
2026-03-31 10:10:38 - slack_bot.dispatcher - WARNING - [83178f2d] Gemini returned empty response_text! (This usually means the proxy has issues)
2026-03-31 10:10:38 - slack_bot.dispatcher - INFO - [83178f2d] Gemini response: text=0 chars, tool_calls=2
2026-03-31 10:10:38 - slack_bot.dispatcher - INFO - [83178f2d] Tool calls successfully generated by Gemini (no SAFETY OVERRIDE needed)
2026-03-31 10:10:38 - slack_bot.dispatcher - INFO - [83178f2d] Gemini response in 2.43s: 0 chars, 2 tools
2026-03-31 10:10:38 - slack_bot.dispatcher - INFO - [83178f2d] Executing 2 tools
2026-03-31 10:10:38 - slack_bot.dispatcher - INFO - [83178f2d] Tool: sync_garmin Args: {'target_date': '2026-03-31'}
2026-03-31 10:10:38 - slack_bot.tools.garmin - INFO - Starting Garmin sync for 2026-03-31...
2026-03-31 10:10:38 - health.services.data_sync - INFO - Authenticating with Garmin...
2026-03-31 10:10:38 - health.services.garmin_client - INFO - Authenticating with Garmin Connect China for 350134531@qq.com
2026-03-31 10:10:38 - health.services.garmin_client - INFO - Successfully authenticated with Garmin Connect China
2026-03-31 10:10:38 - health.services.data_sync - INFO - Authentication successful
2026-03-31 10:10:38 - health.services.data_sync - INFO - Syncing 14 metric types from 2026-03-31 to 2026-03-31
2026-03-31 10:10:38 - health.services.data_sync - INFO - Syncing steps from 2026-03-31 to 2026-03-31 (1 days)
2026-03-31 10:10:38 - health.services.data_sync - INFO - ✓ Synced steps for 2026-03-31
2026-03-31 10:10:38 - health.services.data_sync - INFO - steps sync complete: 1 synced, 0 skipped, 0 errors
2026-03-31 10:10:38 - health.services.data_sync - INFO - Syncing heart_rate from 2026-03-31 to 2026-03-31 (1 days)
2026-03-31 10:10:39 - health.services.data_sync - INFO - ✓ Synced heart_rate for 2026-03-31
2026-03-31 10:10:39 - health.services.data_sync - INFO - heart_rate sync complete: 1 synced, 0 skipped, 0 errors
2026-03-31 10:10:39 - health.services.data_sync - INFO - Syncing sleep from 2026-03-31 to 2026-03-31 (1 days)
2026-03-31 10:10:39 - health.services.data_sync - INFO - ✓ Synced sleep for 2026-03-31
2026-03-31 10:10:39 - health.services.data_sync - INFO - sleep sync complete: 1 synced, 0 skipped, 0 errors
2026-03-31 10:10:39 - health.services.data_sync - INFO - Syncing stress from 2026-03-31 to 2026-03-31 (1 days)
2026-03-31 10:10:39 - health.services.data_sync - INFO - ✓ Synced stress for 2026-03-31
2026-03-31 10:10:39 - health.services.data_sync - INFO - stress sync complete: 1 synced, 0 skipped, 0 errors
2026-03-31 10:10:39 - health.services.data_sync - INFO - Syncing body_battery from 2026-03-31 to 2026-03-31 (1 days)
2026-03-31 10:10:39 - health.services.data_sync - INFO - ✓ Synced body_battery for 2026-03-31
2026-03-31 10:10:39 - health.services.data_sync - INFO - body_battery sync complete: 1 synced, 0 skipped, 0 errors
2026-03-31 10:10:39 - health.services.data_sync - INFO - Syncing spo2 from 2026-03-31 to 2026-03-31 (1 days)
2026-03-31 10:10:39 - health.services.data_sync - INFO - ✓ Synced spo2 for 2026-03-31
2026-03-31 10:10:39 - health.services.data_sync - INFO - spo2 sync complete: 1 synced, 0 skipped, 0 errors
2026-03-31 10:10:39 - health.services.data_sync - INFO - Syncing respiration from 2026-03-31 to 2026-03-31 (1 days)
2026-03-31 10:10:39 - health.services.data_sync - INFO - ✓ Synced respiration for 2026-03-31
2026-03-31 10:10:39 - health.services.data_sync - INFO - respiration sync complete: 1 synced, 0 skipped, 0 errors
2026-03-31 10:10:39 - health.services.data_sync - INFO - Syncing hydration from 2026-03-31 to 2026-03-31 (1 days)
2026-03-31 10:10:40 - health.services.data_sync - INFO - ✓ Synced hydration for 2026-03-31
2026-03-31 10:10:40 - health.services.data_sync - INFO - hydration sync complete: 1 synced, 0 skipped, 0 errors
2026-03-31 10:10:40 - health.services.data_sync - INFO - Syncing floors from 2026-03-31 to 2026-03-31 (1 days)
2026-03-31 10:10:40 - health.services.data_sync - INFO - ✓ Synced floors for 2026-03-31
2026-03-31 10:10:40 - health.services.data_sync - INFO - floors sync complete: 1 synced, 0 skipped, 0 errors
2026-03-31 10:10:40 - health.services.data_sync - INFO - Syncing intensity_minutes from 2026-03-31 to 2026-03-31 (1 days)
2026-03-31 10:10:40 - health.services.data_sync - INFO - ✓ Synced intensity_minutes for 2026-03-31
2026-03-31 10:10:40 - health.services.data_sync - INFO - intensity_minutes sync complete: 1 synced, 0 skipped, 0 errors
2026-03-31 10:10:40 - health.services.data_sync - INFO - Syncing hrv from 2026-03-31 to 2026-03-31 (1 days)
2026-03-31 10:10:40 - health.services.data_sync - INFO - ✓ Synced hrv for 2026-03-31
2026-03-31 10:10:40 - health.services.data_sync - INFO - hrv sync complete: 1 synced, 0 skipped, 0 errors
2026-03-31 10:10:40 - health.services.data_sync - INFO - Syncing rhr from 2026-03-31 to 2026-03-31 (1 days)
2026-03-31 10:10:40 - health.services.data_sync - INFO - ✓ Synced rhr for 2026-03-31
2026-03-31 10:10:40 - health.services.data_sync - INFO - rhr sync complete: 1 synced, 0 skipped, 0 errors
2026-03-31 10:10:40 - health.services.data_sync - INFO - Syncing weight from 2026-03-31 to 2026-03-31 (1 days)
2026-03-31 10:10:40 - health.services.data_sync - INFO - weight sync complete: 0 synced, 1 skipped, 0 errors
2026-03-31 10:10:40 - health.services.data_sync - INFO - Syncing lifestyle_logging from 2026-03-31 to 2026-03-31 (1 days)
2026-03-31 10:10:40 - health.services.data_sync - INFO - lifestyle_logging sync complete: 0 synced, 1 skipped, 0 errors
2026-03-31 10:10:40 - health.services.data_sync - INFO - Syncing activities from 2026-03-31 to 2026-03-31
2026-03-31 10:10:40 - health.services.garmin_client - INFO - Fetched 1 activities
2026-03-31 10:10:40 - health.services.data_sync - INFO - Found 1 activities
2026-03-31 10:10:40 - health.services.data_sync - INFO - ✓ Synced activity 579153129 (elliptical) on 2026-03-31
2026-03-31 10:10:40 - health.services.data_sync - INFO - Activity sync complete: 1 synced, 0 skipped, 0 errors
2026-03-31 10:10:40 - health.services.query - INFO - Querying health data summary for 2026-03-31
2026-03-31 10:10:40 - health.services.query - INFO - Found 12 metrics and 1 activities
2026-03-31 10:10:40 - slack_bot.dispatcher - INFO - [83178f2d] ✓ sync_garmin finished in 2.65s
2026-03-31 10:10:40 - slack_bot.dispatcher - INFO - [83178f2d] Tool: get_daily_detailed_stats Args: {'target_date': '2026-03-31'}
2026-03-31 10:10:40 - health.services.query - INFO - Querying health data summary for 2026-03-31
2026-03-31 10:10:40 - health.services.query - INFO - Found 12 metrics and 1 activities
2026-03-31 10:10:40 - slack_bot.dispatcher - INFO - [83178f2d] ✓ get_daily_detailed_stats finished in 0.01s
2026-03-31 10:10:40 - slack_bot.dispatcher - INFO - [83178f2d] Requesting final analysis...
2026-03-31 10:10:45 - slack_bot.dispatcher - INFO - [83178f2d] Final analysis received in 4.74s
2026-03-31 10:10:45 - slack_bot.dispatcher - INFO - Formatted text (len 618 -> 594)
2026-03-31 10:10:45 - slack_bot.dispatcher - WARNING - [83178f2d] Update failed, posting new: The request to the Slack API failed. (url: https://slack.com/api/chat.update)
The server responded with: {'ok': False, 'error': 'msg_too_long'}
2026-03-31 10:10:46 - slack_bot.dispatcher - INFO - [83178f2d] Dispatch completed in 10.42s
2026-03-31 10:10:46 - __main__ - INFO - [83178f2d] ✅ Request completed in 10.72s
2026-03-31 10:12:26 - __main__ - INFO - [4f3b350e] 📥 Received message from U0A8ZCK7RJM in D0AA4GBQRKK: 今天早上椭圆机的训练也感觉心率很容易掉下去，是心脏变强了，还是昨天断食日吃太少的一个反应 (Files: 0)
2026-03-31 10:12:26 - slack_bot.dispatcher - INFO - [4f3b350e] Processing message in D0AA4GBQRKK from U0A8ZCK7RJM
2026-03-31 10:12:26 - slack_bot.dispatcher - INFO - [4f3b350e] Calling Gemini for initial response...
2026-03-31 10:12:26 - slack_bot.dispatcher - INFO - [4f3b350e] Request config: model=google/gemini-3-flash-preview, tools=21, context=39 msgs
2026-03-31 10:12:35 - slack_bot.dispatcher - INFO - [4f3b350e] Gemini response: text=1336 chars, tool_calls=0
2026-03-31 10:12:35 - slack_bot.dispatcher - INFO - [4f3b350e] No tool calls from Gemini - checking SAFETY OVERRIDE keywords...
2026-03-31 10:12:35 - slack_bot.dispatcher - WARNING - [4f3b350e] 🔧 SAFETY OVERRIDE: Forcing get_daily_detailed_stats for 2026-03-30
2026-03-31 10:12:35 - slack_bot.dispatcher - INFO - [4f3b350e] No SAFETY OVERRIDE match found - will return empty response or text
2026-03-31 10:12:35 - slack_bot.dispatcher - INFO - [4f3b350e] Gemini response in 9.09s: 1336 chars, 1 tools
2026-03-31 10:12:35 - slack_bot.dispatcher - INFO - [4f3b350e] Executing 1 tools
2026-03-31 10:12:35 - slack_bot.dispatcher - INFO - [4f3b350e] Tool: get_daily_detailed_stats Args: {'target_date': '2026-03-30'}
2026-03-31 10:12:35 - health.services.query - INFO - Querying health data summary for 2026-03-30
2026-03-31 10:12:35 - health.services.query - INFO - Found 13 metrics and 0 activities
2026-03-31 10:12:35 - slack_bot.dispatcher - INFO - [4f3b350e] ✓ get_daily_detailed_stats finished in 0.01s
2026-03-31 10:12:35 - slack_bot.dispatcher - INFO - [4f3b350e] Requesting final analysis...
2026-03-31 10:12:41 - slack_bot.dispatcher - INFO - [4f3b350e] Final analysis received in 6.13s
2026-03-31 10:12:41 - slack_bot.dispatcher - INFO - Formatted text (len 845 -> 811)
2026-03-31 10:12:41 - slack_bot.dispatcher - INFO - [4f3b350e] 📤 Message updated 1774923146.230809
2026-03-31 10:12:41 - slack_bot.dispatcher - INFO - [4f3b350e] Dispatch completed in 15.56s
2026-03-31 10:12:41 - __main__ - INFO - [4f3b350e] ✅ Request completed in 15.86s
2026-03-31 10:19:34 - __main__ - INFO - [f4c2a1a2] 📥 Received message from U0A8ZCK7RJM in D0AA4GBQRKK: 今天应该怎么饮食。我早上做完运动之后一个小时（10:00）喝了两勺蛋白粉，接下来呢 (Files: 0)
2026-03-31 10:19:34 - slack_bot.dispatcher - INFO - [f4c2a1a2] Processing message in D0AA4GBQRKK from U0A8ZCK7RJM
2026-03-31 10:19:34 - slack_bot.dispatcher - INFO - [f4c2a1a2] Calling Gemini for initial response...
2026-03-31 10:19:34 - slack_bot.dispatcher - INFO - [f4c2a1a2] Request config: model=google/gemini-3-flash-preview, tools=21, context=39 msgs
2026-03-31 10:19:43 - slack_bot.dispatcher - INFO - [f4c2a1a2] Gemini response: text=1106 chars, tool_calls=0
2026-03-31 10:19:43 - slack_bot.dispatcher - INFO - [f4c2a1a2] No tool calls from Gemini - checking SAFETY OVERRIDE keywords...
2026-03-31 10:19:43 - slack_bot.dispatcher - WARNING - [f4c2a1a2] 🔧 SAFETY OVERRIDE: Forcing get_activity_history for 2026-03-31
2026-03-31 10:19:43 - slack_bot.dispatcher - INFO - [f4c2a1a2] No SAFETY OVERRIDE match found - will return empty response or text
2026-03-31 10:19:43 - slack_bot.dispatcher - INFO - [f4c2a1a2] Gemini response in 8.40s: 1106 chars, 1 tools
2026-03-31 10:19:43 - slack_bot.dispatcher - INFO - [f4c2a1a2] Executing 1 tools
2026-03-31 10:19:43 - slack_bot.dispatcher - INFO - [f4c2a1a2] Tool: get_activity_history Args: {'start_date': '2026-03-31', 'end_date': '2026-03-31'}
2026-03-31 10:19:43 - health.services.query - INFO - Querying activities from 2026-03-31 to 2026-03-31
2026-03-31 10:19:43 - health.services.query - INFO - Found 1 activities
2026-03-31 10:19:43 - slack_bot.dispatcher - INFO - [f4c2a1a2] ✓ get_activity_history finished in 0.00s
2026-03-31 10:19:43 - slack_bot.dispatcher - INFO - [f4c2a1a2] Requesting final analysis...
2026-03-31 10:19:50 - slack_bot.dispatcher - INFO - [f4c2a1a2] Final analysis received in 7.41s
2026-03-31 10:19:50 - slack_bot.dispatcher - INFO - Formatted text (len 907 -> 865)
2026-03-31 10:19:50 - slack_bot.dispatcher - INFO - [f4c2a1a2] 📤 Message updated 1774923574.595339
2026-03-31 10:19:50 - slack_bot.dispatcher - INFO - [f4c2a1a2] Dispatch completed in 16.15s
2026-03-31 10:19:50 - __main__ - INFO - [f4c2a1a2] ✅ Request completed in 16.47s
2026-03-31 10:23:11 - __main__ - INFO - [4f970131] 📥 Received message from U0A8ZCK7RJM in D0AA4GBQRKK: 早上有点饿，我打算10:30吃一个鸡蛋、一个红薯和一个花卷，然后中午喝一杯美式，晚上再吃一顿蛋白质相对高的中式小炒 (Files: 0)
2026-03-31 10:23:11 - slack_bot.dispatcher - INFO - [4f970131] Processing message in D0AA4GBQRKK from U0A8ZCK7RJM
2026-03-31 10:23:11 - slack_bot.dispatcher - INFO - [4f970131] Calling Gemini for initial response...
2026-03-31 10:23:11 - slack_bot.dispatcher - INFO - [4f970131] Request config: model=google/gemini-3-flash-preview, tools=21, context=39 msgs
2026-03-31 10:23:14 - slack_bot.dispatcher - WARNING - [4f970131] Gemini returned empty response_text! (This usually means the proxy has issues)
2026-03-31 10:23:14 - slack_bot.dispatcher - INFO - [4f970131] Gemini response: text=0 chars, tool_calls=1
2026-03-31 10:23:14 - slack_bot.dispatcher - INFO - [4f970131] Tool calls successfully generated by Gemini (no SAFETY OVERRIDE needed)
2026-03-31 10:23:14 - slack_bot.dispatcher - INFO - [4f970131] Gemini response in 2.40s: 0 chars, 1 tools
2026-03-31 10:23:14 - slack_bot.dispatcher - INFO - [4f970131] Executing 1 tools
2026-03-31 10:23:14 - slack_bot.dispatcher - INFO - [4f970131] Tool: get_daily_detailed_stats Args: {'target_date': '2026-03-31'}
2026-03-31 10:23:14 - health.services.query - INFO - Querying health data summary for 2026-03-31
2026-03-31 10:23:14 - health.services.query - INFO - Found 12 metrics and 1 activities
2026-03-31 10:23:14 - slack_bot.dispatcher - INFO - [4f970131] ✓ get_daily_detailed_stats finished in 0.01s
2026-03-31 10:23:14 - slack_bot.dispatcher - INFO - [4f970131] Requesting final analysis...
2026-03-31 10:23:18 - slack_bot.dispatcher - INFO - [4f970131] Final analysis received in 4.73s
2026-03-31 10:23:18 - slack_bot.dispatcher - INFO - Formatted text (len 529 -> 515)
2026-03-31 10:23:19 - slack_bot.dispatcher - INFO - [4f970131] 📤 Message updated 1774923791.518519
2026-03-31 10:23:19 - slack_bot.dispatcher - INFO - [4f970131] Dispatch completed in 7.46s
2026-03-31 10:23:19 - __main__ - INFO - [4f970131] ✅ Request completed in 7.76s
2026-04-02 08:57:15 - __main__ - INFO - [897ddde4] 📥 Received message from U0A8ZCK7RJM in D0AA4GBQRKK: 同步佳明数据 (Files: 0)
2026-04-02 08:57:16 - slack_bot.dispatcher - INFO - [897ddde4] Processing message in D0AA4GBQRKK from U0A8ZCK7RJM
2026-04-02 08:57:16 - slack_bot.dispatcher - INFO - [897ddde4] Calling Gemini for initial response...
2026-04-02 08:57:16 - slack_bot.dispatcher - INFO - [897ddde4] Request config: model=google/gemini-3-flash-preview, tools=21, context=39 msgs
2026-04-02 08:57:19 - slack_bot.dispatcher - WARNING - [897ddde4] Gemini returned empty response_text! (This usually means the proxy has issues)
2026-04-02 08:57:19 - slack_bot.dispatcher - INFO - [897ddde4] Gemini response: text=0 chars, tool_calls=3
2026-04-02 08:57:19 - slack_bot.dispatcher - INFO - [897ddde4] Tool calls successfully generated by Gemini (no SAFETY OVERRIDE needed)
2026-04-02 08:57:19 - slack_bot.dispatcher - INFO - [897ddde4] Gemini response in 3.18s: 0 chars, 3 tools
2026-04-02 08:57:19 - slack_bot.dispatcher - INFO - [897ddde4] Executing 3 tools
2026-04-02 08:57:19 - slack_bot.dispatcher - WARNING - [897ddde4] 🔧 Fixing sync_garmin target_date from 2026-04-01 to 2026-04-02
2026-04-02 08:57:19 - slack_bot.dispatcher - INFO - [897ddde4] Tool: sync_garmin Args: {'target_date': '2026-04-02'}
2026-04-02 08:57:19 - slack_bot.tools.garmin - INFO - Starting Garmin sync for 2026-04-02...
2026-04-02 08:57:19 - health.services.data_sync - INFO - Authenticating with Garmin...
2026-04-02 08:57:19 - health.services.garmin_client - INFO - Authenticating with Garmin Connect China for 350134531@qq.com
2026-04-02 08:57:19 - health.services.garmin_client - INFO - Successfully authenticated with Garmin Connect China
2026-04-02 08:57:19 - health.services.data_sync - INFO - Authentication successful
2026-04-02 08:57:19 - health.services.data_sync - INFO - Syncing 14 metric types from 2026-04-02 to 2026-04-02
2026-04-02 08:57:19 - health.services.data_sync - INFO - Syncing steps from 2026-04-02 to 2026-04-02 (1 days)
2026-04-02 08:57:19 - health.services.data_sync - INFO - ✓ Synced steps for 2026-04-02
2026-04-02 08:57:19 - health.services.data_sync - INFO - steps sync complete: 1 synced, 0 skipped, 0 errors
2026-04-02 08:57:19 - health.services.data_sync - INFO - Syncing heart_rate from 2026-04-02 to 2026-04-02 (1 days)
2026-04-02 08:57:19 - health.services.data_sync - INFO - ✓ Synced heart_rate for 2026-04-02
2026-04-02 08:57:19 - health.services.data_sync - INFO - heart_rate sync complete: 1 synced, 0 skipped, 0 errors
2026-04-02 08:57:19 - health.services.data_sync - INFO - Syncing sleep from 2026-04-02 to 2026-04-02 (1 days)
2026-04-02 08:57:20 - health.services.data_sync - INFO - ✓ Synced sleep for 2026-04-02
2026-04-02 08:57:20 - health.services.data_sync - INFO - sleep sync complete: 1 synced, 0 skipped, 0 errors
2026-04-02 08:57:20 - health.services.data_sync - INFO - Syncing stress from 2026-04-02 to 2026-04-02 (1 days)
2026-04-02 08:57:20 - health.services.data_sync - INFO - ✓ Synced stress for 2026-04-02
2026-04-02 08:57:20 - health.services.data_sync - INFO - stress sync complete: 1 synced, 0 skipped, 0 errors
2026-04-02 08:57:20 - health.services.data_sync - INFO - Syncing body_battery from 2026-04-02 to 2026-04-02 (1 days)
2026-04-02 08:57:20 - health.services.data_sync - INFO - ✓ Synced body_battery for 2026-04-02
2026-04-02 08:57:20 - health.services.data_sync - INFO - body_battery sync complete: 1 synced, 0 skipped, 0 errors
2026-04-02 08:57:20 - health.services.data_sync - INFO - Syncing spo2 from 2026-04-02 to 2026-04-02 (1 days)
2026-04-02 08:57:20 - health.services.data_sync - INFO - ✓ Synced spo2 for 2026-04-02
2026-04-02 08:57:20 - health.services.data_sync - INFO - spo2 sync complete: 1 synced, 0 skipped, 0 errors
2026-04-02 08:57:20 - health.services.data_sync - INFO - Syncing respiration from 2026-04-02 to 2026-04-02 (1 days)
2026-04-02 08:57:20 - health.services.data_sync - INFO - ✓ Synced respiration for 2026-04-02
2026-04-02 08:57:20 - health.services.data_sync - INFO - respiration sync complete: 1 synced, 0 skipped, 0 errors
2026-04-02 08:57:20 - health.services.data_sync - INFO - Syncing hydration from 2026-04-02 to 2026-04-02 (1 days)
2026-04-02 08:57:20 - health.services.data_sync - INFO - ✓ Synced hydration for 2026-04-02
2026-04-02 08:57:20 - health.services.data_sync - INFO - hydration sync complete: 1 synced, 0 skipped, 0 errors
2026-04-02 08:57:20 - health.services.data_sync - INFO - Syncing floors from 2026-04-02 to 2026-04-02 (1 days)
2026-04-02 08:57:21 - health.services.data_sync - INFO - ✓ Synced floors for 2026-04-02
2026-04-02 08:57:21 - health.services.data_sync - INFO - floors sync complete: 1 synced, 0 skipped, 0 errors
2026-04-02 08:57:21 - health.services.data_sync - INFO - Syncing intensity_minutes from 2026-04-02 to 2026-04-02 (1 days)
2026-04-02 08:57:21 - health.services.data_sync - INFO - ✓ Synced intensity_minutes for 2026-04-02
2026-04-02 08:57:21 - health.services.data_sync - INFO - intensity_minutes sync complete: 1 synced, 0 skipped, 0 errors
2026-04-02 08:57:21 - health.services.data_sync - INFO - Syncing hrv from 2026-04-02 to 2026-04-02 (1 days)
2026-04-02 08:57:21 - health.services.data_sync - INFO - ✓ Synced hrv for 2026-04-02
2026-04-02 08:57:21 - health.services.data_sync - INFO - hrv sync complete: 1 synced, 0 skipped, 0 errors
2026-04-02 08:57:21 - health.services.data_sync - INFO - Syncing rhr from 2026-04-02 to 2026-04-02 (1 days)
2026-04-02 08:57:21 - health.services.data_sync - INFO - ✓ Synced rhr for 2026-04-02
2026-04-02 08:57:21 - health.services.data_sync - INFO - rhr sync complete: 1 synced, 0 skipped, 0 errors
2026-04-02 08:57:21 - health.services.data_sync - INFO - Syncing weight from 2026-04-02 to 2026-04-02 (1 days)
2026-04-02 08:57:21 - health.services.data_sync - INFO - weight sync complete: 0 synced, 1 skipped, 0 errors
2026-04-02 08:57:21 - health.services.data_sync - INFO - Syncing lifestyle_logging from 2026-04-02 to 2026-04-02 (1 days)
2026-04-02 08:57:21 - health.services.data_sync - INFO - lifestyle_logging sync complete: 0 synced, 1 skipped, 0 errors
2026-04-02 08:57:21 - health.services.data_sync - INFO - Syncing activities from 2026-04-02 to 2026-04-02
2026-04-02 08:57:21 - health.services.data_sync - INFO - Found 0 activities
2026-04-02 08:57:21 - health.services.data_sync - INFO - Activity sync complete: 0 synced, 0 skipped, 0 errors
2026-04-02 08:57:21 - health.services.query - INFO - Querying health data summary for 2026-04-02
2026-04-02 08:57:21 - health.services.query - INFO - Found 12 metrics and 0 activities
2026-04-02 08:57:21 - slack_bot.dispatcher - INFO - [897ddde4] ✓ sync_garmin finished in 2.44s
2026-04-02 08:57:21 - slack_bot.dispatcher - INFO - [897ddde4] Tool: get_daily_detailed_stats Args: {'target_date': '2026-04-01'}
2026-04-02 08:57:21 - health.services.query - INFO - Querying health data summary for 2026-04-01
2026-04-02 08:57:21 - health.services.query - INFO - Found 13 metrics and 1 activities
2026-04-02 08:57:21 - slack_bot.dispatcher - INFO - [897ddde4] ✓ get_daily_detailed_stats finished in 0.01s
2026-04-02 08:57:21 - slack_bot.dispatcher - INFO - [897ddde4] Tool: get_activity_history Args: {'end_date': '2026-04-01', 'start_date': '2026-03-31'}
2026-04-02 08:57:21 - health.services.query - INFO - Querying activities from 2026-03-31 to 2026-04-01
2026-04-02 08:57:21 - health.services.query - INFO - Found 2 activities
2026-04-02 08:57:21 - slack_bot.dispatcher - INFO - [897ddde4] ✓ get_activity_history finished in 0.00s
2026-04-02 08:57:21 - slack_bot.dispatcher - INFO - [897ddde4] Requesting final analysis...
2026-04-02 08:57:27 - slack_bot.dispatcher - INFO - [897ddde4] Final analysis received in 5.38s
2026-04-02 08:57:27 - slack_bot.dispatcher - INFO - Formatted text (len 881 -> 837)
2026-04-02 08:57:27 - slack_bot.dispatcher - WARNING - [897ddde4] Update failed, posting new: The request to the Slack API failed. (url: https://slack.com/api/chat.update)
The server responded with: {'ok': False, 'error': 'msg_too_long'}
2026-04-02 08:57:27 - slack_bot.dispatcher - INFO - [897ddde4] Dispatch completed in 11.63s
2026-04-02 08:57:27 - __main__ - INFO - [897ddde4] ✅ Request completed in 11.93s
2026-04-02 08:59:54 - __main__ - INFO - [5128205f] 📥 Received message from U0A8ZCK7RJM in D0AA4GBQRKK: 好的，酒精对rhr和hrv的影响的原理是什么，有没有什么干预和缓解的办法。事实上，从体感上看，我睡得还不错，但确实分数很低，有没有可能对我这种基础心率偏低的人来说，上升一点也影响不大？ (Files: 0)
2026-04-02 08:59:55 - slack_bot.dispatcher - INFO - [5128205f] Processing message in D0AA4GBQRKK from U0A8ZCK7RJM
2026-04-02 08:59:55 - slack_bot.dispatcher - INFO - [5128205f] Calling Gemini for initial response...
2026-04-02 08:59:55 - slack_bot.dispatcher - INFO - [5128205f] Request config: model=google/gemini-3-flash-preview, tools=21, context=39 msgs
2026-04-02 09:00:07 - slack_bot.dispatcher - INFO - [5128205f] Gemini response: text=1718 chars, tool_calls=0
2026-04-02 09:00:07 - slack_bot.dispatcher - INFO - [5128205f] No tool calls from Gemini - checking SAFETY OVERRIDE keywords...
2026-04-02 09:00:07 - slack_bot.dispatcher - WARNING - [5128205f] 🔧 SAFETY OVERRIDE: Forcing get_daily_detailed_stats for 2026-04-02
2026-04-02 09:00:07 - slack_bot.dispatcher - INFO - [5128205f] No SAFETY OVERRIDE match found - will return empty response or text
2026-04-02 09:00:07 - slack_bot.dispatcher - INFO - [5128205f] Gemini response in 11.92s: 1718 chars, 1 tools
2026-04-02 09:00:07 - slack_bot.dispatcher - INFO - [5128205f] Executing 1 tools
2026-04-02 09:00:07 - slack_bot.dispatcher - INFO - [5128205f] Tool: get_daily_detailed_stats Args: {'target_date': '2026-04-02'}
2026-04-02 09:00:07 - health.services.query - INFO - Querying health data summary for 2026-04-02
2026-04-02 09:00:07 - health.services.query - INFO - Found 12 metrics and 0 activities
2026-04-02 09:00:07 - slack_bot.dispatcher - INFO - [5128205f] ✓ get_daily_detailed_stats finished in 0.01s
2026-04-02 09:00:07 - slack_bot.dispatcher - INFO - [5128205f] Requesting final analysis...
2026-04-02 09:00:15 - slack_bot.dispatcher - INFO - [5128205f] Final analysis received in 8.05s
2026-04-02 09:00:15 - slack_bot.dispatcher - INFO - Formatted text (len 1263 -> 1219)
2026-04-02 09:00:15 - slack_bot.dispatcher - WARNING - [5128205f] Update failed, posting new: The request to the Slack API failed. (url: https://slack.com/api/chat.update)
The server responded with: {'ok': False, 'error': 'msg_too_long'}
2026-04-02 09:00:15 - slack_bot.dispatcher - INFO - [5128205f] Dispatch completed in 20.62s
2026-04-02 09:00:15 - __main__ - INFO - [5128205f] ✅ Request completed in 20.93s
2026-04-02 09:02:17 - __main__ - INFO - [b20a72c3] 📥 Received message from U0A8ZCK7RJM in D0AA4GBQRKK: 我昨天参加酒局之前已经吃了600mg nac，现在还需要吃吗？今天我打算轻断食，早上和中午尽量不吃东西 (Files: 0)
2026-04-02 09:02:17 - slack_bot.dispatcher - INFO - [b20a72c3] Processing message in D0AA4GBQRKK from U0A8ZCK7RJM
2026-04-02 09:02:17 - slack_bot.dispatcher - INFO - [b20a72c3] Calling Gemini for initial response...
2026-04-02 09:02:17 - slack_bot.dispatcher - INFO - [b20a72c3] Request config: model=google/gemini-3-flash-preview, tools=21, context=39 msgs
2026-04-02 09:02:26 - slack_bot.dispatcher - INFO - [b20a72c3] Gemini response: text=1278 chars, tool_calls=0
2026-04-02 09:02:26 - slack_bot.dispatcher - INFO - [b20a72c3] No tool calls from Gemini - checking SAFETY OVERRIDE keywords...
2026-04-02 09:02:26 - slack_bot.dispatcher - WARNING - [b20a72c3] 🔧 SAFETY OVERRIDE: Forcing get_daily_detailed_stats for 2026-04-01
2026-04-02 09:02:26 - slack_bot.dispatcher - INFO - [b20a72c3] No SAFETY OVERRIDE match found - will return empty response or text
2026-04-02 09:02:26 - slack_bot.dispatcher - INFO - [b20a72c3] Gemini response in 9.24s: 1278 chars, 1 tools
2026-04-02 09:02:26 - slack_bot.dispatcher - INFO - [b20a72c3] Executing 1 tools
2026-04-02 09:02:26 - slack_bot.dispatcher - INFO - [b20a72c3] Tool: get_daily_detailed_stats Args: {'target_date': '2026-04-01'}
2026-04-02 09:02:26 - health.services.query - INFO - Querying health data summary for 2026-04-01
2026-04-02 09:02:26 - health.services.query - INFO - Found 13 metrics and 1 activities
2026-04-02 09:02:26 - slack_bot.dispatcher - INFO - [b20a72c3] ✓ get_daily_detailed_stats finished in 0.01s
2026-04-02 09:02:26 - slack_bot.dispatcher - INFO - [b20a72c3] Requesting final analysis...
2026-04-02 09:02:35 - slack_bot.dispatcher - INFO - [b20a72c3] Final analysis received in 8.48s
2026-04-02 09:02:35 - slack_bot.dispatcher - INFO - Formatted text (len 1024 -> 980)
2026-04-02 09:02:35 - slack_bot.dispatcher - INFO - [b20a72c3] 📤 Message updated 1775091737.384799
2026-04-02 09:02:35 - slack_bot.dispatcher - INFO - [b20a72c3] Dispatch completed in 18.05s
2026-04-02 09:02:35 - __main__ - INFO - [b20a72c3] ✅ Request completed in 18.36s
2026-04-03 12:49:11 - __main__ - INFO - [998ff34a] 📥 Received message from U0A8ZCK7RJM in D0AA4GBQRKK: 同步佳明数据 (Files: 0)
2026-04-03 12:49:11 - slack_bot.dispatcher - INFO - [998ff34a] Processing message in D0AA4GBQRKK from U0A8ZCK7RJM
2026-04-03 12:49:11 - slack_bot.dispatcher - INFO - [998ff34a] Calling Gemini for initial response...
2026-04-03 12:49:11 - slack_bot.dispatcher - INFO - [998ff34a] Request config: model=google/gemini-3-flash-preview, tools=21, context=39 msgs
2026-04-03 12:49:15 - slack_bot.dispatcher - WARNING - [998ff34a] Gemini returned empty response_text! (This usually means the proxy has issues)
2026-04-03 12:49:15 - slack_bot.dispatcher - INFO - [998ff34a] Gemini response: text=0 chars, tool_calls=3
2026-04-03 12:49:15 - slack_bot.dispatcher - INFO - [998ff34a] Tool calls successfully generated by Gemini (no SAFETY OVERRIDE needed)
2026-04-03 12:49:15 - slack_bot.dispatcher - INFO - [998ff34a] Gemini response in 3.38s: 0 chars, 3 tools
2026-04-03 12:49:15 - slack_bot.dispatcher - INFO - [998ff34a] Executing 3 tools
2026-04-03 12:49:15 - slack_bot.dispatcher - INFO - [998ff34a] Tool: sync_garmin Args: {'target_date': '2026-04-03'}
2026-04-03 12:49:15 - slack_bot.tools.garmin - INFO - Starting Garmin sync for 2026-04-03...
2026-04-03 12:49:15 - health.services.data_sync - INFO - Authenticating with Garmin...
2026-04-03 12:49:15 - health.services.garmin_client - INFO - Authenticating with Garmin Connect China for 350134531@qq.com
2026-04-03 12:49:15 - health.services.garmin_client - INFO - Successfully authenticated with Garmin Connect China
2026-04-03 12:49:15 - health.services.data_sync - INFO - Authentication successful
2026-04-03 12:49:15 - health.services.data_sync - INFO - Syncing 14 metric types from 2026-04-03 to 2026-04-03
2026-04-03 12:49:15 - health.services.data_sync - INFO - Syncing steps from 2026-04-03 to 2026-04-03 (1 days)
2026-04-03 12:49:15 - health.services.data_sync - INFO - ✓ Synced steps for 2026-04-03
2026-04-03 12:49:15 - health.services.data_sync - INFO - steps sync complete: 1 synced, 0 skipped, 0 errors
2026-04-03 12:49:15 - health.services.data_sync - INFO - Syncing heart_rate from 2026-04-03 to 2026-04-03 (1 days)
2026-04-03 12:49:15 - health.services.data_sync - INFO - ✓ Synced heart_rate for 2026-04-03
2026-04-03 12:49:15 - health.services.data_sync - INFO - heart_rate sync complete: 1 synced, 0 skipped, 0 errors
2026-04-03 12:49:15 - health.services.data_sync - INFO - Syncing sleep from 2026-04-03 to 2026-04-03 (1 days)
2026-04-03 12:49:16 - health.services.data_sync - INFO - ✓ Synced sleep for 2026-04-03
2026-04-03 12:49:16 - health.services.data_sync - INFO - sleep sync complete: 1 synced, 0 skipped, 0 errors
2026-04-03 12:49:16 - health.services.data_sync - INFO - Syncing stress from 2026-04-03 to 2026-04-03 (1 days)
2026-04-03 12:49:16 - health.services.data_sync - INFO - ✓ Synced stress for 2026-04-03
2026-04-03 12:49:16 - health.services.data_sync - INFO - stress sync complete: 1 synced, 0 skipped, 0 errors
2026-04-03 12:49:16 - health.services.data_sync - INFO - Syncing body_battery from 2026-04-03 to 2026-04-03 (1 days)
2026-04-03 12:49:16 - health.services.data_sync - INFO - ✓ Synced body_battery for 2026-04-03
2026-04-03 12:49:16 - health.services.data_sync - INFO - body_battery sync complete: 1 synced, 0 skipped, 0 errors
2026-04-03 12:49:16 - health.services.data_sync - INFO - Syncing spo2 from 2026-04-03 to 2026-04-03 (1 days)
2026-04-03 12:49:16 - health.services.data_sync - INFO - ✓ Synced spo2 for 2026-04-03
2026-04-03 12:49:16 - health.services.data_sync - INFO - spo2 sync complete: 1 synced, 0 skipped, 0 errors
2026-04-03 12:49:16 - health.services.data_sync - INFO - Syncing respiration from 2026-04-03 to 2026-04-03 (1 days)
2026-04-03 12:49:16 - health.services.data_sync - INFO - ✓ Synced respiration for 2026-04-03
2026-04-03 12:49:16 - health.services.data_sync - INFO - respiration sync complete: 1 synced, 0 skipped, 0 errors
2026-04-03 12:49:16 - health.services.data_sync - INFO - Syncing hydration from 2026-04-03 to 2026-04-03 (1 days)
2026-04-03 12:49:16 - health.services.data_sync - INFO - ✓ Synced hydration for 2026-04-03
2026-04-03 12:49:16 - health.services.data_sync - INFO - hydration sync complete: 1 synced, 0 skipped, 0 errors
2026-04-03 12:49:16 - health.services.data_sync - INFO - Syncing floors from 2026-04-03 to 2026-04-03 (1 days)
2026-04-03 12:49:16 - health.services.data_sync - INFO - ✓ Synced floors for 2026-04-03
2026-04-03 12:49:16 - health.services.data_sync - INFO - floors sync complete: 1 synced, 0 skipped, 0 errors
2026-04-03 12:49:16 - health.services.data_sync - INFO - Syncing intensity_minutes from 2026-04-03 to 2026-04-03 (1 days)
2026-04-03 12:49:17 - health.services.data_sync - INFO - ✓ Synced intensity_minutes for 2026-04-03
2026-04-03 12:49:17 - health.services.data_sync - INFO - intensity_minutes sync complete: 1 synced, 0 skipped, 0 errors
2026-04-03 12:49:17 - health.services.data_sync - INFO - Syncing hrv from 2026-04-03 to 2026-04-03 (1 days)
2026-04-03 12:49:17 - health.services.data_sync - INFO - ✓ Synced hrv for 2026-04-03
2026-04-03 12:49:17 - health.services.data_sync - INFO - hrv sync complete: 1 synced, 0 skipped, 0 errors
2026-04-03 12:49:17 - health.services.data_sync - INFO - Syncing rhr from 2026-04-03 to 2026-04-03 (1 days)
2026-04-03 12:49:17 - health.services.data_sync - INFO - ✓ Synced rhr for 2026-04-03
2026-04-03 12:49:17 - health.services.data_sync - INFO - rhr sync complete: 1 synced, 0 skipped, 0 errors
2026-04-03 12:49:17 - health.services.data_sync - INFO - Syncing weight from 2026-04-03 to 2026-04-03 (1 days)
2026-04-03 12:49:17 - health.services.data_sync - INFO - weight sync complete: 0 synced, 1 skipped, 0 errors
2026-04-03 12:49:17 - health.services.data_sync - INFO - Syncing lifestyle_logging from 2026-04-03 to 2026-04-03 (1 days)
2026-04-03 12:49:17 - health.services.data_sync - INFO - lifestyle_logging sync complete: 0 synced, 1 skipped, 0 errors
2026-04-03 12:49:17 - health.services.data_sync - INFO - Syncing activities from 2026-04-03 to 2026-04-03
2026-04-03 12:49:17 - health.services.garmin_client - INFO - Fetched 1 activities
2026-04-03 12:49:17 - health.services.data_sync - INFO - Found 1 activities
2026-04-03 12:49:17 - health.services.data_sync - INFO - ✓ Synced activity 580203980 (elliptical) on 2026-04-03
2026-04-03 12:49:17 - health.services.data_sync - INFO - Activity sync complete: 1 synced, 0 skipped, 0 errors
2026-04-03 12:49:17 - health.services.query - INFO - Querying health data summary for 2026-04-03
2026-04-03 12:49:17 - health.services.query - INFO - Found 12 metrics and 1 activities
2026-04-03 12:49:17 - slack_bot.dispatcher - INFO - [998ff34a] ✓ sync_garmin finished in 2.56s
2026-04-03 12:49:17 - slack_bot.dispatcher - INFO - [998ff34a] Tool: get_daily_detailed_stats Args: {'target_date': '2026-04-03'}
2026-04-03 12:49:17 - health.services.query - INFO - Querying health data summary for 2026-04-03
2026-04-03 12:49:17 - health.services.query - INFO - Found 12 metrics and 1 activities
2026-04-03 12:49:17 - slack_bot.dispatcher - INFO - [998ff34a] ✓ get_daily_detailed_stats finished in 0.01s
2026-04-03 12:49:17 - slack_bot.dispatcher - INFO - [998ff34a] Tool: get_activity_history Args: {'end_date': '2026-04-03', 'start_date': '2026-04-02'}
2026-04-03 12:49:17 - health.services.query - INFO - Querying activities from 2026-04-02 to 2026-04-03
2026-04-03 12:49:17 - health.services.query - INFO - Found 1 activities
2026-04-03 12:49:17 - slack_bot.dispatcher - INFO - [998ff34a] ✓ get_activity_history finished in 0.00s
2026-04-03 12:49:17 - slack_bot.dispatcher - INFO - [998ff34a] Requesting final analysis...
2026-04-03 12:49:22 - slack_bot.dispatcher - INFO - [998ff34a] Final analysis received in 5.23s
2026-04-03 12:49:22 - slack_bot.dispatcher - INFO - Formatted text (len 621 -> 591)
2026-04-03 12:49:23 - slack_bot.dispatcher - WARNING - [998ff34a] Update failed, posting new: The request to the Slack API failed. (url: https://slack.com/api/chat.update)
The server responded with: {'ok': False, 'error': 'msg_too_long'}
2026-04-03 12:49:23 - slack_bot.dispatcher - INFO - [998ff34a] Dispatch completed in 11.80s
2026-04-03 12:49:23 - __main__ - INFO - [998ff34a] ✅ Request completed in 12.11s
2026-04-03 12:53:40 - __main__ - INFO - [84536f41] 📥 Received message from U0A8ZCK7RJM in D0AA4GBQRKK: 前天做了50个引体，昨天做了25个，都是每次做5个一组。但是昨天中午午休突然脖子后侧疼，像是落枕一样的感觉。查了一下，可能是引体时头往后仰，反而伤害到了颈后的肌肉 (Files: 0)
2026-04-03 12:53:41 - slack_bot.dispatcher - INFO - [84536f41] Processing message in D0AA4GBQRKK from U0A8ZCK7RJM
2026-04-03 12:53:41 - slack_bot.dispatcher - INFO - [84536f41] Calling Gemini for initial response...
2026-04-03 12:53:41 - slack_bot.dispatcher - INFO - [84536f41] Request config: model=google/gemini-3-flash-preview, tools=21, context=39 msgs
2026-04-03 12:53:44 - slack_bot.dispatcher - WARNING - [84536f41] Gemini returned empty response_text! (This usually means the proxy has issues)
2026-04-03 12:53:44 - slack_bot.dispatcher - INFO - [84536f41] Gemini response: text=0 chars, tool_calls=2
2026-04-03 12:53:44 - slack_bot.dispatcher - INFO - [84536f41] Tool calls successfully generated by Gemini (no SAFETY OVERRIDE needed)
2026-04-03 12:53:44 - slack_bot.dispatcher - INFO - [84536f41] Gemini response in 3.23s: 0 chars, 2 tools
2026-04-03 12:53:44 - slack_bot.dispatcher - INFO - [84536f41] Executing 2 tools
2026-04-03 12:53:44 - slack_bot.dispatcher - INFO - [84536f41] Tool: get_manual_history Args: {'start_date': '2026-04-01', 'end_date': '2026-04-03', 'category': 'feelings'}
2026-04-03 12:53:44 - slack_bot.dispatcher - INFO - [84536f41] ✓ get_manual_history finished in 0.00s
2026-04-03 12:53:44 - slack_bot.dispatcher - INFO - [84536f41] Tool: log_feeling Args: {'target_date': '2026-04-02', 'description': '脖子后侧疼，像落枕，怀疑引体向上时头后仰导致颈后肌肉损伤。前天50个引体，昨天25个（5个一组）。', 'feeling_type': 'neck pain/strain', 'severity': 6}
2026-04-03 12:53:44 - health.services.manual_log_storage - INFO - Saved manual log for 2026-04-02 to /root/projects/butler/data/health/manual_logs/2026/04/2026-04-02.json
2026-04-03 12:53:44 - health.services.manual_log_storage - INFO - Added feeling entry for 2026-04-02: neck pain/strain
2026-04-03 12:53:44 - slack_bot.dispatcher - INFO - [84536f41] ✓ log_feeling finished in 0.02s
2026-04-03 12:53:44 - slack_bot.dispatcher - INFO - [84536f41] Requesting final analysis...
2026-04-03 12:53:49 - slack_bot.dispatcher - INFO - [84536f41] Final analysis received in 5.23s
2026-04-03 12:53:49 - slack_bot.dispatcher - INFO - Formatted text (len 601 -> 581)
2026-04-03 12:53:49 - slack_bot.dispatcher - INFO - [84536f41] 📤 Message updated 1775192020.880949
2026-04-03 12:53:49 - slack_bot.dispatcher - INFO - [84536f41] Dispatch completed in 8.79s
2026-04-03 12:53:49 - __main__ - INFO - [84536f41] ✅ Request completed in 9.13s
2026-04-04 18:47:27 - __main__ - INFO - [f4874bf8] 📥 Received message from U0A8ZCK7RJM in D0AA4GBQRKK: 同步佳明数据 (Files: 0)
2026-04-04 18:47:27 - slack_bot.dispatcher - INFO - [f4874bf8] Processing message in D0AA4GBQRKK from U0A8ZCK7RJM
2026-04-04 18:47:27 - slack_bot.dispatcher - INFO - [f4874bf8] Calling Gemini for initial response...
2026-04-04 18:47:27 - slack_bot.dispatcher - INFO - [f4874bf8] Request config: model=google/gemini-3-flash-preview, tools=21, context=39 msgs
2026-04-04 18:47:30 - slack_bot.dispatcher - WARNING - [f4874bf8] Gemini returned empty response_text! (This usually means the proxy has issues)
2026-04-04 18:47:30 - slack_bot.dispatcher - INFO - [f4874bf8] Gemini response: text=0 chars, tool_calls=3
2026-04-04 18:47:30 - slack_bot.dispatcher - INFO - [f4874bf8] Tool calls successfully generated by Gemini (no SAFETY OVERRIDE needed)
2026-04-04 18:47:30 - slack_bot.dispatcher - INFO - [f4874bf8] Gemini response in 2.45s: 0 chars, 3 tools
2026-04-04 18:47:30 - slack_bot.dispatcher - INFO - [f4874bf8] Executing 3 tools
2026-04-04 18:47:30 - slack_bot.dispatcher - INFO - [f4874bf8] Tool: sync_garmin Args: {'target_date': '2026-04-04'}
2026-04-04 18:47:30 - slack_bot.tools.garmin - INFO - Starting Garmin sync for 2026-04-04...
2026-04-04 18:47:30 - health.services.data_sync - INFO - Authenticating with Garmin...
2026-04-04 18:47:30 - health.services.garmin_client - INFO - Authenticating with Garmin Connect China for 350134531@qq.com
2026-04-04 18:47:30 - health.services.garmin_client - INFO - Successfully authenticated with Garmin Connect China
2026-04-04 18:47:30 - health.services.data_sync - INFO - Authentication successful
2026-04-04 18:47:30 - health.services.data_sync - INFO - Syncing 14 metric types from 2026-04-04 to 2026-04-04
2026-04-04 18:47:30 - health.services.data_sync - INFO - Syncing steps from 2026-04-04 to 2026-04-04 (1 days)
2026-04-04 18:47:30 - health.services.data_sync - INFO - ✓ Synced steps for 2026-04-04
2026-04-04 18:47:30 - health.services.data_sync - INFO - steps sync complete: 1 synced, 0 skipped, 0 errors
2026-04-04 18:47:30 - health.services.data_sync - INFO - Syncing heart_rate from 2026-04-04 to 2026-04-04 (1 days)
2026-04-04 18:47:30 - health.services.data_sync - INFO - ✓ Synced heart_rate for 2026-04-04
2026-04-04 18:47:30 - health.services.data_sync - INFO - heart_rate sync complete: 1 synced, 0 skipped, 0 errors
2026-04-04 18:47:30 - health.services.data_sync - INFO - Syncing sleep from 2026-04-04 to 2026-04-04 (1 days)
2026-04-04 18:47:31 - health.services.data_sync - INFO - ✓ Synced sleep for 2026-04-04
2026-04-04 18:47:31 - health.services.data_sync - INFO - sleep sync complete: 1 synced, 0 skipped, 0 errors
2026-04-04 18:47:31 - health.services.data_sync - INFO - Syncing stress from 2026-04-04 to 2026-04-04 (1 days)
2026-04-04 18:47:31 - health.services.data_sync - INFO - ✓ Synced stress for 2026-04-04
2026-04-04 18:47:31 - health.services.data_sync - INFO - stress sync complete: 1 synced, 0 skipped, 0 errors
2026-04-04 18:47:31 - health.services.data_sync - INFO - Syncing body_battery from 2026-04-04 to 2026-04-04 (1 days)
2026-04-04 18:47:31 - health.services.data_sync - INFO - ✓ Synced body_battery for 2026-04-04
2026-04-04 18:47:31 - health.services.data_sync - INFO - body_battery sync complete: 1 synced, 0 skipped, 0 errors
2026-04-04 18:47:31 - health.services.data_sync - INFO - Syncing spo2 from 2026-04-04 to 2026-04-04 (1 days)
2026-04-04 18:47:31 - health.services.data_sync - INFO - ✓ Synced spo2 for 2026-04-04
2026-04-04 18:47:31 - health.services.data_sync - INFO - spo2 sync complete: 1 synced, 0 skipped, 0 errors
2026-04-04 18:47:31 - health.services.data_sync - INFO - Syncing respiration from 2026-04-04 to 2026-04-04 (1 days)
2026-04-04 18:47:31 - health.services.data_sync - INFO - ✓ Synced respiration for 2026-04-04
2026-04-04 18:47:31 - health.services.data_sync - INFO - respiration sync complete: 1 synced, 0 skipped, 0 errors
2026-04-04 18:47:31 - health.services.data_sync - INFO - Syncing hydration from 2026-04-04 to 2026-04-04 (1 days)
2026-04-04 18:47:32 - health.services.data_sync - INFO - ✓ Synced hydration for 2026-04-04
2026-04-04 18:47:32 - health.services.data_sync - INFO - hydration sync complete: 1 synced, 0 skipped, 0 errors
2026-04-04 18:47:32 - health.services.data_sync - INFO - Syncing floors from 2026-04-04 to 2026-04-04 (1 days)
2026-04-04 18:47:32 - health.services.data_sync - INFO - ✓ Synced floors for 2026-04-04
2026-04-04 18:47:32 - health.services.data_sync - INFO - floors sync complete: 1 synced, 0 skipped, 0 errors
2026-04-04 18:47:32 - health.services.data_sync - INFO - Syncing intensity_minutes from 2026-04-04 to 2026-04-04 (1 days)
2026-04-04 18:47:32 - health.services.data_sync - INFO - ✓ Synced intensity_minutes for 2026-04-04
2026-04-04 18:47:32 - health.services.data_sync - INFO - intensity_minutes sync complete: 1 synced, 0 skipped, 0 errors
2026-04-04 18:47:32 - health.services.data_sync - INFO - Syncing hrv from 2026-04-04 to 2026-04-04 (1 days)
2026-04-04 18:47:32 - health.services.data_sync - INFO - ✓ Synced hrv for 2026-04-04
2026-04-04 18:47:32 - health.services.data_sync - INFO - hrv sync complete: 1 synced, 0 skipped, 0 errors
2026-04-04 18:47:32 - health.services.data_sync - INFO - Syncing rhr from 2026-04-04 to 2026-04-04 (1 days)
2026-04-04 18:47:32 - health.services.data_sync - INFO - ✓ Synced rhr for 2026-04-04
2026-04-04 18:47:32 - health.services.data_sync - INFO - rhr sync complete: 1 synced, 0 skipped, 0 errors
2026-04-04 18:47:32 - health.services.data_sync - INFO - Syncing weight from 2026-04-04 to 2026-04-04 (1 days)
2026-04-04 18:47:32 - health.services.data_sync - INFO - weight sync complete: 0 synced, 1 skipped, 0 errors
2026-04-04 18:47:32 - health.services.data_sync - INFO - Syncing lifestyle_logging from 2026-04-04 to 2026-04-04 (1 days)
2026-04-04 18:47:32 - health.services.data_sync - INFO - lifestyle_logging sync complete: 0 synced, 1 skipped, 0 errors
2026-04-04 18:47:32 - health.services.data_sync - INFO - Syncing activities from 2026-04-04 to 2026-04-04
2026-04-04 18:47:32 - health.services.data_sync - INFO - Found 0 activities
2026-04-04 18:47:32 - health.services.data_sync - INFO - Activity sync complete: 0 synced, 0 skipped, 0 errors
2026-04-04 18:47:32 - health.services.query - INFO - Querying health data summary for 2026-04-04
2026-04-04 18:47:32 - health.services.query - INFO - Found 12 metrics and 0 activities
2026-04-04 18:47:32 - slack_bot.dispatcher - INFO - [f4874bf8] ✓ sync_garmin finished in 2.71s
2026-04-04 18:47:32 - slack_bot.dispatcher - INFO - [f4874bf8] Tool: get_daily_detailed_stats Args: {'target_date': '2026-04-04'}
2026-04-04 18:47:32 - health.services.query - INFO - Querying health data summary for 2026-04-04
2026-04-04 18:47:32 - health.services.query - INFO - Found 12 metrics and 0 activities
2026-04-04 18:47:32 - slack_bot.dispatcher - INFO - [f4874bf8] ✓ get_daily_detailed_stats finished in 0.01s
2026-04-04 18:47:32 - slack_bot.dispatcher - INFO - [f4874bf8] Tool: get_activity_history Args: {'end_date': '2026-04-04', 'start_date': '2026-04-03'}
2026-04-04 18:47:32 - health.services.query - INFO - Querying activities from 2026-04-03 to 2026-04-04
2026-04-04 18:47:32 - health.services.query - INFO - Found 1 activities
2026-04-04 18:47:32 - slack_bot.dispatcher - INFO - [f4874bf8] ✓ get_activity_history finished in 0.00s
2026-04-04 18:47:32 - slack_bot.dispatcher - INFO - [f4874bf8] Requesting final analysis...
2026-04-04 18:47:36 - slack_bot.dispatcher - INFO - [f4874bf8] Final analysis received in 4.09s
2026-04-04 18:47:36 - slack_bot.dispatcher - INFO - Formatted text (len 539 -> 525)
2026-04-04 18:47:37 - slack_bot.dispatcher - INFO - [f4874bf8] 📤 Message updated 1775299647.560479
2026-04-04 18:47:37 - slack_bot.dispatcher - INFO - [f4874bf8] Dispatch completed in 9.58s
2026-04-04 18:47:37 - __main__ - INFO - [f4874bf8] ✅ Request completed in 10.09s
2026-04-04 18:54:02 - __main__ - INFO - [a1864e1e] 📥 Received message from U0A8ZCK7RJM in D0AA4GBQRKK: 好的，记录一下现在的颈部疼痛（Level 2），已经基本上快好了 (Files: 0)
2026-04-04 18:54:03 - slack_bot.dispatcher - INFO - [a1864e1e] Processing message in D0AA4GBQRKK from U0A8ZCK7RJM
2026-04-04 18:54:03 - slack_bot.dispatcher - INFO - [a1864e1e] Calling Gemini for initial response...
2026-04-04 18:54:03 - slack_bot.dispatcher - INFO - [a1864e1e] Request config: model=google/gemini-3-flash-preview, tools=21, context=39 msgs
2026-04-04 18:54:05 - slack_bot.dispatcher - WARNING - [a1864e1e] Gemini returned empty response_text! (This usually means the proxy has issues)
2026-04-04 18:54:05 - slack_bot.dispatcher - INFO - [a1864e1e] Gemini response: text=0 chars, tool_calls=1
2026-04-04 18:54:05 - slack_bot.dispatcher - INFO - [a1864e1e] Tool calls successfully generated by Gemini (no SAFETY OVERRIDE needed)
2026-04-04 18:54:05 - slack_bot.dispatcher - INFO - [a1864e1e] Gemini response in 2.78s: 0 chars, 1 tools
2026-04-04 18:54:05 - slack_bot.dispatcher - INFO - [a1864e1e] Executing 1 tools
2026-04-04 18:54:05 - slack_bot.dispatcher - INFO - [a1864e1e] Tool: log_feeling Args: {'description': '颈部疼痛已大幅缓解，基本快好了。昨日落枕感已消退。', 'target_date': '2026-04-04', 'feeling_type': 'neck pain/strain recovery', 'severity': 2}
2026-04-04 18:54:05 - health.services.manual_log_storage - INFO - Saved manual log for 2026-04-04 to /root/projects/butler/data/health/manual_logs/2026/04/2026-04-04.json
2026-04-04 18:54:05 - health.services.manual_log_storage - INFO - Added feeling entry for 2026-04-04: neck pain/strain recovery
2026-04-04 18:54:05 - slack_bot.dispatcher - INFO - [a1864e1e] ✓ log_feeling finished in 0.00s
2026-04-04 18:54:05 - slack_bot.dispatcher - INFO - [a1864e1e] Requesting final analysis...
2026-04-04 18:54:09 - slack_bot.dispatcher - INFO - [a1864e1e] Final analysis received in 3.46s
2026-04-04 18:54:09 - slack_bot.dispatcher - INFO - Formatted text (len 269 -> 259)
2026-04-04 18:54:09 - slack_bot.dispatcher - INFO - [a1864e1e] 📤 Message updated 1775300042.970079
2026-04-04 18:54:09 - slack_bot.dispatcher - INFO - [a1864e1e] Dispatch completed in 6.79s
2026-04-04 18:54:09 - __main__ - INFO - [a1864e1e] ✅ Request completed in 7.11s
2026-04-05 11:10:53 - __main__ - INFO - [d43cca16] 📥 Received message from U0A8ZCK7RJM in D0AA4GBQRKK: 同步佳明数据 (Files: 0)
2026-04-05 11:10:54 - slack_bot.dispatcher - INFO - [d43cca16] Processing message in D0AA4GBQRKK from U0A8ZCK7RJM
2026-04-05 11:10:54 - slack_bot.dispatcher - INFO - [d43cca16] Calling Gemini for initial response...
2026-04-05 11:10:54 - slack_bot.dispatcher - INFO - [d43cca16] Request config: model=google/gemini-3-flash-preview, tools=21, context=39 msgs
2026-04-05 11:10:57 - slack_bot.dispatcher - WARNING - [d43cca16] Gemini returned empty response_text! (This usually means the proxy has issues)
2026-04-05 11:10:57 - slack_bot.dispatcher - INFO - [d43cca16] Gemini response: text=0 chars, tool_calls=3
2026-04-05 11:10:57 - slack_bot.dispatcher - INFO - [d43cca16] Tool calls successfully generated by Gemini (no SAFETY OVERRIDE needed)
2026-04-05 11:10:57 - slack_bot.dispatcher - INFO - [d43cca16] Gemini response in 3.45s: 0 chars, 3 tools
2026-04-05 11:10:57 - slack_bot.dispatcher - INFO - [d43cca16] Executing 3 tools
2026-04-05 11:10:57 - slack_bot.dispatcher - INFO - [d43cca16] Tool: sync_garmin Args: {'target_date': '2026-04-05'}
2026-04-05 11:10:57 - slack_bot.tools.garmin - INFO - Starting Garmin sync for 2026-04-05...
2026-04-05 11:10:57 - health.services.data_sync - INFO - Authenticating with Garmin...
2026-04-05 11:10:57 - health.services.garmin_client - INFO - Authenticating with Garmin Connect China for 350134531@qq.com
2026-04-05 11:10:57 - health.services.garmin_client - INFO - Successfully authenticated with Garmin Connect China
2026-04-05 11:10:57 - health.services.data_sync - INFO - Authentication successful
2026-04-05 11:10:57 - health.services.data_sync - INFO - Syncing 14 metric types from 2026-04-05 to 2026-04-05
2026-04-05 11:10:57 - health.services.data_sync - INFO - Syncing steps from 2026-04-05 to 2026-04-05 (1 days)
2026-04-05 11:10:57 - health.services.data_sync - INFO - ✓ Synced steps for 2026-04-05
2026-04-05 11:10:57 - health.services.data_sync - INFO - steps sync complete: 1 synced, 0 skipped, 0 errors
2026-04-05 11:10:57 - health.services.data_sync - INFO - Syncing heart_rate from 2026-04-05 to 2026-04-05 (1 days)
2026-04-05 11:10:58 - health.services.data_sync - INFO - ✓ Synced heart_rate for 2026-04-05
2026-04-05 11:10:58 - health.services.data_sync - INFO - heart_rate sync complete: 1 synced, 0 skipped, 0 errors
2026-04-05 11:10:58 - health.services.data_sync - INFO - Syncing sleep from 2026-04-05 to 2026-04-05 (1 days)
2026-04-05 11:10:58 - health.services.data_sync - INFO - ✓ Synced sleep for 2026-04-05
2026-04-05 11:10:58 - health.services.data_sync - INFO - sleep sync complete: 1 synced, 0 skipped, 0 errors
2026-04-05 11:10:58 - health.services.data_sync - INFO - Syncing stress from 2026-04-05 to 2026-04-05 (1 days)
2026-04-05 11:10:58 - health.services.data_sync - INFO - ✓ Synced stress for 2026-04-05
2026-04-05 11:10:58 - health.services.data_sync - INFO - stress sync complete: 1 synced, 0 skipped, 0 errors
2026-04-05 11:10:58 - health.services.data_sync - INFO - Syncing body_battery from 2026-04-05 to 2026-04-05 (1 days)
2026-04-05 11:10:58 - health.services.data_sync - INFO - ✓ Synced body_battery for 2026-04-05
2026-04-05 11:10:58 - health.services.data_sync - INFO - body_battery sync complete: 1 synced, 0 skipped, 0 errors
2026-04-05 11:10:58 - health.services.data_sync - INFO - Syncing spo2 from 2026-04-05 to 2026-04-05 (1 days)
2026-04-05 11:10:58 - health.services.data_sync - INFO - ✓ Synced spo2 for 2026-04-05
2026-04-05 11:10:58 - health.services.data_sync - INFO - spo2 sync complete: 1 synced, 0 skipped, 0 errors
2026-04-05 11:10:58 - health.services.data_sync - INFO - Syncing respiration from 2026-04-05 to 2026-04-05 (1 days)
2026-04-05 11:10:58 - health.services.data_sync - INFO - ✓ Synced respiration for 2026-04-05
2026-04-05 11:10:58 - health.services.data_sync - INFO - respiration sync complete: 1 synced, 0 skipped, 0 errors
2026-04-05 11:10:58 - health.services.data_sync - INFO - Syncing hydration from 2026-04-05 to 2026-04-05 (1 days)
2026-04-05 11:10:59 - health.services.data_sync - INFO - ✓ Synced hydration for 2026-04-05
2026-04-05 11:10:59 - health.services.data_sync - INFO - hydration sync complete: 1 synced, 0 skipped, 0 errors
2026-04-05 11:10:59 - health.services.data_sync - INFO - Syncing floors from 2026-04-05 to 2026-04-05 (1 days)
2026-04-05 11:10:59 - health.services.data_sync - INFO - ✓ Synced floors for 2026-04-05
2026-04-05 11:10:59 - health.services.data_sync - INFO - floors sync complete: 1 synced, 0 skipped, 0 errors
2026-04-05 11:10:59 - health.services.data_sync - INFO - Syncing intensity_minutes from 2026-04-05 to 2026-04-05 (1 days)
2026-04-05 11:10:59 - health.services.data_sync - INFO - ✓ Synced intensity_minutes for 2026-04-05
2026-04-05 11:10:59 - health.services.data_sync - INFO - intensity_minutes sync complete: 1 synced, 0 skipped, 0 errors
2026-04-05 11:10:59 - health.services.data_sync - INFO - Syncing hrv from 2026-04-05 to 2026-04-05 (1 days)
2026-04-05 11:10:59 - health.services.data_sync - INFO - ✓ Synced hrv for 2026-04-05
2026-04-05 11:10:59 - health.services.data_sync - INFO - hrv sync complete: 1 synced, 0 skipped, 0 errors
2026-04-05 11:10:59 - health.services.data_sync - INFO - Syncing rhr from 2026-04-05 to 2026-04-05 (1 days)
2026-04-05 11:10:59 - health.services.data_sync - INFO - ✓ Synced rhr for 2026-04-05
2026-04-05 11:10:59 - health.services.data_sync - INFO - rhr sync complete: 1 synced, 0 skipped, 0 errors
2026-04-05 11:10:59 - health.services.data_sync - INFO - Syncing weight from 2026-04-05 to 2026-04-05 (1 days)
2026-04-05 11:10:59 - health.services.data_sync - INFO - weight sync complete: 0 synced, 1 skipped, 0 errors
2026-04-05 11:10:59 - health.services.data_sync - INFO - Syncing lifestyle_logging from 2026-04-05 to 2026-04-05 (1 days)
2026-04-05 11:10:59 - health.services.data_sync - INFO - lifestyle_logging sync complete: 0 synced, 1 skipped, 0 errors
2026-04-05 11:10:59 - health.services.data_sync - INFO - Syncing activities from 2026-04-05 to 2026-04-05
2026-04-05 11:10:59 - health.services.garmin_client - INFO - Fetched 1 activities
2026-04-05 11:10:59 - health.services.data_sync - INFO - Found 1 activities
2026-04-05 11:10:59 - health.services.data_sync - INFO - ✓ Synced activity 580856278 (elliptical) on 2026-04-05
2026-04-05 11:10:59 - health.services.data_sync - INFO - Activity sync complete: 1 synced, 0 skipped, 0 errors
2026-04-05 11:10:59 - health.services.query - INFO - Querying health data summary for 2026-04-05
2026-04-05 11:10:59 - health.services.query - INFO - Found 12 metrics and 1 activities
2026-04-05 11:10:59 - slack_bot.dispatcher - INFO - [d43cca16] ✓ sync_garmin finished in 2.30s
2026-04-05 11:10:59 - slack_bot.dispatcher - INFO - [d43cca16] Tool: get_daily_detailed_stats Args: {'target_date': '2026-04-05'}
2026-04-05 11:10:59 - health.services.query - INFO - Querying health data summary for 2026-04-05
2026-04-05 11:10:59 - health.services.query - INFO - Found 12 metrics and 1 activities
2026-04-05 11:10:59 - slack_bot.dispatcher - INFO - [d43cca16] ✓ get_daily_detailed_stats finished in 0.01s
2026-04-05 11:10:59 - slack_bot.dispatcher - INFO - [d43cca16] Tool: get_activity_history Args: {'start_date': '2026-04-04', 'end_date': '2026-04-05'}
2026-04-05 11:10:59 - health.services.query - INFO - Querying activities from 2026-04-04 to 2026-04-05
2026-04-05 11:10:59 - health.services.query - INFO - Found 1 activities
2026-04-05 11:10:59 - slack_bot.dispatcher - INFO - [d43cca16] ✓ get_activity_history finished in 0.00s
2026-04-05 11:10:59 - slack_bot.dispatcher - INFO - [d43cca16] Requesting final analysis...
2026-04-05 11:11:04 - slack_bot.dispatcher - INFO - [d43cca16] Final analysis received in 4.96s
2026-04-05 11:11:04 - slack_bot.dispatcher - INFO - Formatted text (len 518 -> 496)
2026-04-05 11:11:05 - slack_bot.dispatcher - WARNING - [d43cca16] Update failed, posting new: The request to the Slack API failed. (url: https://slack.com/api/chat.update)
The server responded with: {'ok': False, 'error': 'msg_too_long'}
2026-04-05 11:11:05 - slack_bot.dispatcher - INFO - [d43cca16] Dispatch completed in 11.54s
2026-04-05 11:11:05 - __main__ - INFO - [d43cca16] ✅ Request completed in 12.11s
2026-04-05 11:12:19 - __main__ - INFO - [41919357] 📥 Received message from U0A8ZCK7RJM in D0AA4GBQRKK: 31分钟的椭圆机是有几次心率达到160-170的冲锋，这种锻炼方式是否是有效补充 (Files: 0)
2026-04-05 11:12:19 - slack_bot.dispatcher - INFO - [41919357] Processing message in D0AA4GBQRKK from U0A8ZCK7RJM
2026-04-05 11:12:19 - slack_bot.dispatcher - INFO - [41919357] Calling Gemini for initial response...
2026-04-05 11:12:19 - slack_bot.dispatcher - INFO - [41919357] Request config: model=google/gemini-3-flash-preview, tools=21, context=39 msgs
2026-04-05 11:12:22 - slack_bot.dispatcher - WARNING - [41919357] Gemini returned empty response_text! (This usually means the proxy has issues)
2026-04-05 11:12:22 - slack_bot.dispatcher - INFO - [41919357] Gemini response: text=0 chars, tool_calls=1
2026-04-05 11:12:22 - slack_bot.dispatcher - INFO - [41919357] Tool calls successfully generated by Gemini (no SAFETY OVERRIDE needed)
2026-04-05 11:12:22 - slack_bot.dispatcher - INFO - [41919357] Gemini response in 2.55s: 0 chars, 1 tools
2026-04-05 11:12:22 - slack_bot.dispatcher - INFO - [41919357] Executing 1 tools
2026-04-05 11:12:22 - slack_bot.dispatcher - INFO - [41919357] Tool: get_activity_history Args: {'end_date': '2026-04-05', 'start_date': '2026-04-05'}
2026-04-05 11:12:22 - health.services.query - INFO - Querying activities from 2026-04-05 to 2026-04-05
2026-04-05 11:12:22 - health.services.query - INFO - Found 1 activities
2026-04-05 11:12:22 - slack_bot.dispatcher - INFO - [41919357] ✓ get_activity_history finished in 0.00s
2026-04-05 11:12:22 - slack_bot.dispatcher - INFO - [41919357] Requesting final analysis...
2026-04-05 11:12:26 - slack_bot.dispatcher - INFO - [41919357] Final analysis received in 4.17s
2026-04-05 11:12:26 - slack_bot.dispatcher - INFO - Formatted text (len 613 -> 593)
2026-04-05 11:12:26 - slack_bot.dispatcher - INFO - [41919357] 📤 Message updated 1775358739.649359
2026-04-05 11:12:26 - slack_bot.dispatcher - INFO - [41919357] Dispatch completed in 7.05s
2026-04-05 11:12:26 - __main__ - INFO - [41919357] ✅ Request completed in 7.36s
2026-04-05 17:59:47 - __main__ - INFO - [a94ec135] 📥 Received message from U0A8ZCK7RJM in D0AA4GBQRKK: 同步佳明数据，深入分析今天的锻炼情况 (Files: 0)
2026-04-05 17:59:48 - slack_bot.dispatcher - INFO - [a94ec135] Processing message in D0AA4GBQRKK from U0A8ZCK7RJM
2026-04-05 17:59:48 - slack_bot.dispatcher - INFO - [a94ec135] Calling Gemini for initial response...
2026-04-05 17:59:48 - slack_bot.dispatcher - INFO - [a94ec135] Request config: model=google/gemini-3-flash-preview, tools=21, context=39 msgs
2026-04-05 17:59:51 - slack_bot.dispatcher - WARNING - [a94ec135] Gemini returned empty response_text! (This usually means the proxy has issues)
2026-04-05 17:59:51 - slack_bot.dispatcher - INFO - [a94ec135] Gemini response: text=0 chars, tool_calls=3
2026-04-05 17:59:51 - slack_bot.dispatcher - INFO - [a94ec135] Tool calls successfully generated by Gemini (no SAFETY OVERRIDE needed)
2026-04-05 17:59:51 - slack_bot.dispatcher - INFO - [a94ec135] Gemini response in 3.21s: 0 chars, 3 tools
2026-04-05 17:59:51 - slack_bot.dispatcher - INFO - [a94ec135] Executing 3 tools
2026-04-05 17:59:51 - slack_bot.dispatcher - INFO - [a94ec135] Tool: sync_garmin Args: {'target_date': '2026-04-05'}
2026-04-05 17:59:51 - slack_bot.tools.garmin - INFO - Starting Garmin sync for 2026-04-05...
2026-04-05 17:59:51 - health.services.data_sync - INFO - Authenticating with Garmin...
2026-04-05 17:59:51 - health.services.garmin_client - INFO - Authenticating with Garmin Connect China for 350134531@qq.com
2026-04-05 17:59:51 - health.services.garmin_client - INFO - Successfully authenticated with Garmin Connect China
2026-04-05 17:59:51 - health.services.data_sync - INFO - Authentication successful
2026-04-05 17:59:51 - health.services.data_sync - INFO - Syncing 14 metric types from 2026-04-05 to 2026-04-05
2026-04-05 17:59:51 - health.services.data_sync - INFO - Syncing steps from 2026-04-05 to 2026-04-05 (1 days)
2026-04-05 17:59:52 - health.services.data_sync - INFO - ✓ Synced steps for 2026-04-05
2026-04-05 17:59:52 - health.services.data_sync - INFO - steps sync complete: 1 synced, 0 skipped, 0 errors
2026-04-05 17:59:52 - health.services.data_sync - INFO - Syncing heart_rate from 2026-04-05 to 2026-04-05 (1 days)
2026-04-05 17:59:52 - health.services.data_sync - INFO - ✓ Synced heart_rate for 2026-04-05
2026-04-05 17:59:52 - health.services.data_sync - INFO - heart_rate sync complete: 1 synced, 0 skipped, 0 errors
2026-04-05 17:59:52 - health.services.data_sync - INFO - Syncing sleep from 2026-04-05 to 2026-04-05 (1 days)
2026-04-05 17:59:52 - health.services.data_sync - INFO - ✓ Synced sleep for 2026-04-05
2026-04-05 17:59:52 - health.services.data_sync - INFO - sleep sync complete: 1 synced, 0 skipped, 0 errors
2026-04-05 17:59:52 - health.services.data_sync - INFO - Syncing stress from 2026-04-05 to 2026-04-05 (1 days)
2026-04-05 17:59:52 - health.services.data_sync - INFO - ✓ Synced stress for 2026-04-05
2026-04-05 17:59:52 - health.services.data_sync - INFO - stress sync complete: 1 synced, 0 skipped, 0 errors
2026-04-05 17:59:52 - health.services.data_sync - INFO - Syncing body_battery from 2026-04-05 to 2026-04-05 (1 days)
2026-04-05 17:59:52 - health.services.data_sync - INFO - ✓ Synced body_battery for 2026-04-05
2026-04-05 17:59:52 - health.services.data_sync - INFO - body_battery sync complete: 1 synced, 0 skipped, 0 errors
2026-04-05 17:59:52 - health.services.data_sync - INFO - Syncing spo2 from 2026-04-05 to 2026-04-05 (1 days)
2026-04-05 17:59:52 - health.services.data_sync - INFO - ✓ Synced spo2 for 2026-04-05
2026-04-05 17:59:52 - health.services.data_sync - INFO - spo2 sync complete: 1 synced, 0 skipped, 0 errors
2026-04-05 17:59:52 - health.services.data_sync - INFO - Syncing respiration from 2026-04-05 to 2026-04-05 (1 days)
2026-04-05 17:59:53 - health.services.data_sync - INFO - ✓ Synced respiration for 2026-04-05
2026-04-05 17:59:53 - health.services.data_sync - INFO - respiration sync complete: 1 synced, 0 skipped, 0 errors
2026-04-05 17:59:53 - health.services.data_sync - INFO - Syncing hydration from 2026-04-05 to 2026-04-05 (1 days)
2026-04-05 17:59:53 - health.services.data_sync - INFO - ✓ Synced hydration for 2026-04-05
2026-04-05 17:59:53 - health.services.data_sync - INFO - hydration sync complete: 1 synced, 0 skipped, 0 errors
2026-04-05 17:59:53 - health.services.data_sync - INFO - Syncing floors from 2026-04-05 to 2026-04-05 (1 days)
2026-04-05 17:59:53 - health.services.data_sync - INFO - ✓ Synced floors for 2026-04-05
2026-04-05 17:59:53 - health.services.data_sync - INFO - floors sync complete: 1 synced, 0 skipped, 0 errors
2026-04-05 17:59:53 - health.services.data_sync - INFO - Syncing intensity_minutes from 2026-04-05 to 2026-04-05 (1 days)
2026-04-05 17:59:53 - health.services.data_sync - INFO - ✓ Synced intensity_minutes for 2026-04-05
2026-04-05 17:59:53 - health.services.data_sync - INFO - intensity_minutes sync complete: 1 synced, 0 skipped, 0 errors
2026-04-05 17:59:53 - health.services.data_sync - INFO - Syncing hrv from 2026-04-05 to 2026-04-05 (1 days)
2026-04-05 17:59:53 - health.services.data_sync - INFO - ✓ Synced hrv for 2026-04-05
2026-04-05 17:59:53 - health.services.data_sync - INFO - hrv sync complete: 1 synced, 0 skipped, 0 errors
2026-04-05 17:59:53 - health.services.data_sync - INFO - Syncing rhr from 2026-04-05 to 2026-04-05 (1 days)
2026-04-05 17:59:53 - health.services.data_sync - INFO - ✓ Synced rhr for 2026-04-05
2026-04-05 17:59:53 - health.services.data_sync - INFO - rhr sync complete: 1 synced, 0 skipped, 0 errors
2026-04-05 17:59:53 - health.services.data_sync - INFO - Syncing weight from 2026-04-05 to 2026-04-05 (1 days)
2026-04-05 17:59:53 - health.services.data_sync - INFO - weight sync complete: 0 synced, 1 skipped, 0 errors
2026-04-05 17:59:53 - health.services.data_sync - INFO - Syncing lifestyle_logging from 2026-04-05 to 2026-04-05 (1 days)
2026-04-05 17:59:53 - health.services.data_sync - INFO - ✓ Synced lifestyle_logging for 2026-04-05
2026-04-05 17:59:53 - health.services.data_sync - INFO - lifestyle_logging sync complete: 1 synced, 0 skipped, 0 errors
2026-04-05 17:59:53 - health.services.data_sync - INFO - Syncing activities from 2026-04-05 to 2026-04-05
2026-04-05 17:59:54 - health.services.garmin_client - INFO - Fetched 2 activities
2026-04-05 17:59:54 - health.services.data_sync - INFO - Found 2 activities
2026-04-05 17:59:54 - health.services.data_sync - INFO - ✓ Synced activity 580988246 (strength_training) on 2026-04-05
2026-04-05 17:59:54 - health.services.data_sync - INFO - ✓ Synced activity 580856278 (elliptical) on 2026-04-05
2026-04-05 17:59:54 - health.services.data_sync - INFO - Activity sync complete: 2 synced, 0 skipped, 0 errors
2026-04-05 17:59:54 - health.services.query - INFO - Querying health data summary for 2026-04-05
2026-04-05 17:59:54 - health.services.query - INFO - Found 13 metrics and 2 activities
2026-04-05 17:59:54 - slack_bot.dispatcher - INFO - [a94ec135] ✓ sync_garmin finished in 2.71s
2026-04-05 17:59:54 - slack_bot.dispatcher - INFO - [a94ec135] Tool: get_daily_detailed_stats Args: {'target_date': '2026-04-05'}
2026-04-05 17:59:54 - health.services.query - INFO - Querying health data summary for 2026-04-05
2026-04-05 17:59:54 - health.services.query - INFO - Found 13 metrics and 2 activities
2026-04-05 17:59:54 - slack_bot.dispatcher - INFO - [a94ec135] ✓ get_daily_detailed_stats finished in 0.01s
2026-04-05 17:59:54 - slack_bot.dispatcher - INFO - [a94ec135] Tool: get_activity_history Args: {'start_date': '2026-04-05', 'end_date': '2026-04-05'}
2026-04-05 17:59:54 - health.services.query - INFO - Querying activities from 2026-04-05 to 2026-04-05
2026-04-05 17:59:54 - health.services.query - INFO - Found 2 activities
2026-04-05 17:59:54 - slack_bot.dispatcher - INFO - [a94ec135] ✓ get_activity_history finished in 0.00s
2026-04-05 17:59:54 - slack_bot.dispatcher - INFO - [a94ec135] Requesting final analysis...
2026-04-05 18:00:00 - slack_bot.dispatcher - INFO - [a94ec135] Final analysis received in 6.32s
2026-04-05 18:00:00 - slack_bot.dispatcher - INFO - Formatted text (len 773 -> 749)
2026-04-05 18:00:00 - slack_bot.dispatcher - WARNING - [a94ec135] Update failed, posting new: The request to the Slack API failed. (url: https://slack.com/api/chat.update)
The server responded with: {'ok': False, 'error': 'msg_too_long'}
2026-04-05 18:00:02 - slack_bot.dispatcher - INFO - [a94ec135] 📤 Continuation message posted
2026-04-05 18:00:02 - slack_bot.dispatcher - INFO - [a94ec135] Dispatch completed in 14.32s
2026-04-05 18:00:02 - __main__ - INFO - [a94ec135] ✅ Request completed in 14.87s
2026-04-06 10:32:12 - __main__ - INFO - [e75726a3] 📥 Received message from U0A8ZCK7RJM in D0AA4GBQRKK: 同步佳明数据 (Files: 0)
2026-04-06 10:32:12 - slack_bot.dispatcher - INFO - [e75726a3] Processing message in D0AA4GBQRKK from U0A8ZCK7RJM
2026-04-06 10:32:12 - slack_bot.dispatcher - INFO - [e75726a3] Calling Gemini for initial response...
2026-04-06 10:32:12 - slack_bot.dispatcher - INFO - [e75726a3] Request config: model=google/gemini-3-flash-preview, tools=21, context=39 msgs
2026-04-06 10:32:15 - slack_bot.dispatcher - WARNING - [e75726a3] Gemini returned empty response_text! (This usually means the proxy has issues)
2026-04-06 10:32:15 - slack_bot.dispatcher - INFO - [e75726a3] Gemini response: text=0 chars, tool_calls=3
2026-04-06 10:32:15 - slack_bot.dispatcher - INFO - [e75726a3] Tool calls successfully generated by Gemini (no SAFETY OVERRIDE needed)
2026-04-06 10:32:15 - slack_bot.dispatcher - INFO - [e75726a3] Gemini response in 2.80s: 0 chars, 3 tools
2026-04-06 10:32:15 - slack_bot.dispatcher - INFO - [e75726a3] Executing 3 tools
2026-04-06 10:32:15 - slack_bot.dispatcher - INFO - [e75726a3] Tool: sync_garmin Args: {'target_date': '2026-04-06'}
2026-04-06 10:32:15 - slack_bot.tools.garmin - INFO - Starting Garmin sync for 2026-04-06...
2026-04-06 10:32:15 - health.services.data_sync - INFO - Authenticating with Garmin...
2026-04-06 10:32:15 - health.services.garmin_client - INFO - Authenticating with Garmin Connect China for 350134531@qq.com
2026-04-06 10:32:16 - health.services.garmin_client - INFO - Successfully authenticated with Garmin Connect China
2026-04-06 10:32:16 - health.services.data_sync - INFO - Authentication successful
2026-04-06 10:32:16 - health.services.data_sync - INFO - Syncing 14 metric types from 2026-04-06 to 2026-04-06
2026-04-06 10:32:16 - health.services.data_sync - INFO - Syncing steps from 2026-04-06 to 2026-04-06 (1 days)
2026-04-06 10:32:16 - health.services.data_sync - INFO - ✓ Synced steps for 2026-04-06
2026-04-06 10:32:16 - health.services.data_sync - INFO - steps sync complete: 1 synced, 0 skipped, 0 errors
2026-04-06 10:32:16 - health.services.data_sync - INFO - Syncing heart_rate from 2026-04-06 to 2026-04-06 (1 days)
2026-04-06 10:32:16 - health.services.data_sync - INFO - ✓ Synced heart_rate for 2026-04-06
2026-04-06 10:32:16 - health.services.data_sync - INFO - heart_rate sync complete: 1 synced, 0 skipped, 0 errors
2026-04-06 10:32:16 - health.services.data_sync - INFO - Syncing sleep from 2026-04-06 to 2026-04-06 (1 days)
2026-04-06 10:32:16 - health.services.data_sync - INFO - ✓ Synced sleep for 2026-04-06
2026-04-06 10:32:16 - health.services.data_sync - INFO - sleep sync complete: 1 synced, 0 skipped, 0 errors
2026-04-06 10:32:16 - health.services.data_sync - INFO - Syncing stress from 2026-04-06 to 2026-04-06 (1 days)
2026-04-06 10:32:16 - health.services.data_sync - INFO - ✓ Synced stress for 2026-04-06
2026-04-06 10:32:16 - health.services.data_sync - INFO - stress sync complete: 1 synced, 0 skipped, 0 errors
2026-04-06 10:32:16 - health.services.data_sync - INFO - Syncing body_battery from 2026-04-06 to 2026-04-06 (1 days)
2026-04-06 10:32:17 - health.services.data_sync - INFO - ✓ Synced body_battery for 2026-04-06
2026-04-06 10:32:17 - health.services.data_sync - INFO - body_battery sync complete: 1 synced, 0 skipped, 0 errors
2026-04-06 10:32:17 - health.services.data_sync - INFO - Syncing spo2 from 2026-04-06 to 2026-04-06 (1 days)
2026-04-06 10:32:17 - health.services.data_sync - INFO - ✓ Synced spo2 for 2026-04-06
2026-04-06 10:32:17 - health.services.data_sync - INFO - spo2 sync complete: 1 synced, 0 skipped, 0 errors
2026-04-06 10:32:17 - health.services.data_sync - INFO - Syncing respiration from 2026-04-06 to 2026-04-06 (1 days)
2026-04-06 10:32:17 - health.services.data_sync - INFO - ✓ Synced respiration for 2026-04-06
2026-04-06 10:32:17 - health.services.data_sync - INFO - respiration sync complete: 1 synced, 0 skipped, 0 errors
2026-04-06 10:32:17 - health.services.data_sync - INFO - Syncing hydration from 2026-04-06 to 2026-04-06 (1 days)
2026-04-06 10:32:17 - health.services.data_sync - INFO - ✓ Synced hydration for 2026-04-06
2026-04-06 10:32:17 - health.services.data_sync - INFO - hydration sync complete: 1 synced, 0 skipped, 0 errors
2026-04-06 10:32:17 - health.services.data_sync - INFO - Syncing floors from 2026-04-06 to 2026-04-06 (1 days)
2026-04-06 10:32:17 - health.services.data_sync - INFO - ✓ Synced floors for 2026-04-06
2026-04-06 10:32:17 - health.services.data_sync - INFO - floors sync complete: 1 synced, 0 skipped, 0 errors
2026-04-06 10:32:17 - health.services.data_sync - INFO - Syncing intensity_minutes from 2026-04-06 to 2026-04-06 (1 days)
2026-04-06 10:32:17 - health.services.data_sync - INFO - ✓ Synced intensity_minutes for 2026-04-06
2026-04-06 10:32:17 - health.services.data_sync - INFO - intensity_minutes sync complete: 1 synced, 0 skipped, 0 errors
2026-04-06 10:32:17 - health.services.data_sync - INFO - Syncing hrv from 2026-04-06 to 2026-04-06 (1 days)
2026-04-06 10:32:17 - health.services.data_sync - INFO - ✓ Synced hrv for 2026-04-06
2026-04-06 10:32:17 - health.services.data_sync - INFO - hrv sync complete: 1 synced, 0 skipped, 0 errors
2026-04-06 10:32:17 - health.services.data_sync - INFO - Syncing rhr from 2026-04-06 to 2026-04-06 (1 days)
2026-04-06 10:32:17 - health.services.data_sync - INFO - ✓ Synced rhr for 2026-04-06
2026-04-06 10:32:17 - health.services.data_sync - INFO - rhr sync complete: 1 synced, 0 skipped, 0 errors
2026-04-06 10:32:17 - health.services.data_sync - INFO - Syncing weight from 2026-04-06 to 2026-04-06 (1 days)
2026-04-06 10:32:18 - health.services.data_sync - INFO - weight sync complete: 0 synced, 1 skipped, 0 errors
2026-04-06 10:32:18 - health.services.data_sync - INFO - Syncing lifestyle_logging from 2026-04-06 to 2026-04-06 (1 days)
2026-04-06 10:32:18 - health.services.data_sync - INFO - lifestyle_logging sync complete: 0 synced, 1 skipped, 0 errors
2026-04-06 10:32:18 - health.services.data_sync - INFO - Syncing activities from 2026-04-06 to 2026-04-06
2026-04-06 10:32:18 - health.services.garmin_client - INFO - Fetched 1 activities
2026-04-06 10:32:18 - health.services.data_sync - INFO - Found 1 activities
2026-04-06 10:32:18 - health.services.data_sync - INFO - ✓ Synced activity 581183547 (elliptical) on 2026-04-06
2026-04-06 10:32:18 - health.services.data_sync - INFO - Activity sync complete: 1 synced, 0 skipped, 0 errors
2026-04-06 10:32:18 - health.services.query - INFO - Querying health data summary for 2026-04-06
2026-04-06 10:32:18 - health.services.query - INFO - Found 12 metrics and 1 activities
2026-04-06 10:32:18 - slack_bot.dispatcher - INFO - [e75726a3] ✓ sync_garmin finished in 2.63s
2026-04-06 10:32:18 - slack_bot.dispatcher - INFO - [e75726a3] Tool: get_daily_detailed_stats Args: {'target_date': '2026-04-06'}
2026-04-06 10:32:18 - health.services.query - INFO - Querying health data summary for 2026-04-06
2026-04-06 10:32:18 - health.services.query - INFO - Found 12 metrics and 1 activities
2026-04-06 10:32:18 - slack_bot.dispatcher - INFO - [e75726a3] ✓ get_daily_detailed_stats finished in 0.01s
2026-04-06 10:32:18 - slack_bot.dispatcher - INFO - [e75726a3] Tool: get_activity_history Args: {'start_date': '2026-04-06', 'end_date': '2026-04-06'}
2026-04-06 10:32:18 - health.services.query - INFO - Querying activities from 2026-04-06 to 2026-04-06
2026-04-06 10:32:18 - health.services.query - INFO - Found 1 activities
2026-04-06 10:32:18 - slack_bot.dispatcher - INFO - [e75726a3] ✓ get_activity_history finished in 0.00s
2026-04-06 10:32:18 - slack_bot.dispatcher - INFO - [e75726a3] Requesting final analysis...
2026-04-06 10:32:23 - slack_bot.dispatcher - INFO - [e75726a3] Final analysis received in 4.74s
2026-04-06 10:32:23 - slack_bot.dispatcher - INFO - Formatted text (len 499 -> 471)
2026-04-06 10:32:23 - slack_bot.dispatcher - INFO - [e75726a3] 📤 Message updated 1775442732.756309
2026-04-06 10:32:23 - slack_bot.dispatcher - INFO - [e75726a3] Dispatch completed in 10.49s
2026-04-06 10:32:23 - __main__ - INFO - [e75726a3] ✅ Request completed in 10.81s
Failed to establish a connection (session id: 871582ae-ea6e-4474-8806-a34d0e48c3ae, error: The read operation timed out)
on_error invoked (session id: 61774c2f-6655-472f-b9b3-0ad420d5fc8b, error: TimeoutError, message: The read operation timed out)
Failed to establish a connection (session id: cbb4f4d9-4042-4c71-93a7-48dc3d613d08, error: The read operation timed out)
on_error invoked (session id: 7ae5dcc4-5864-418b-9573-d29dbe8bd8d9, error: TimeoutError, message: The read operation timed out)
2026-04-09 14:09:36 - __main__ - INFO - [d616516d] 📥 Received message from U0A8ZCK7RJM in D0AA4GBQRKK: 同步佳明数据 (Files: 0)
2026-04-09 14:09:36 - slack_bot.dispatcher - INFO - [d616516d] Processing message in D0AA4GBQRKK from U0A8ZCK7RJM
2026-04-09 14:09:36 - slack_bot.dispatcher - INFO - [d616516d] Calling Gemini for initial response...
2026-04-09 14:09:36 - slack_bot.dispatcher - INFO - [d616516d] Request config: model=google/gemini-3-flash-preview, tools=21, context=39 msgs
2026-04-09 14:09:40 - slack_bot.dispatcher - WARNING - [d616516d] Gemini returned empty response_text! (This usually means the proxy has issues)
2026-04-09 14:09:40 - slack_bot.dispatcher - INFO - [d616516d] Gemini response: text=0 chars, tool_calls=3
2026-04-09 14:09:40 - slack_bot.dispatcher - INFO - [d616516d] Tool calls successfully generated by Gemini (no SAFETY OVERRIDE needed)
2026-04-09 14:09:40 - slack_bot.dispatcher - INFO - [d616516d] Gemini response in 3.62s: 0 chars, 3 tools
2026-04-09 14:09:40 - slack_bot.dispatcher - INFO - [d616516d] Executing 3 tools
2026-04-09 14:09:40 - slack_bot.dispatcher - WARNING - [d616516d] 🔧 Fixing sync_garmin target_date from 2026-04-07 to 2026-04-09
2026-04-09 14:09:40 - slack_bot.dispatcher - INFO - [d616516d] Tool: sync_garmin Args: {'target_date': '2026-04-09'}
2026-04-09 14:09:40 - slack_bot.tools.garmin - INFO - Starting Garmin sync for 2026-04-09...
2026-04-09 14:09:40 - health.services.data_sync - INFO - Authenticating with Garmin...
2026-04-09 14:09:40 - health.services.garmin_client - INFO - Authenticating with Garmin Connect China for 350134531@qq.com
2026-04-09 14:09:40 - health.services.garmin_client - INFO - Successfully authenticated with Garmin Connect China
2026-04-09 14:09:40 - health.services.data_sync - INFO - Authentication successful
2026-04-09 14:09:40 - health.services.data_sync - INFO - Syncing 14 metric types from 2026-04-09 to 2026-04-09
2026-04-09 14:09:40 - health.services.data_sync - INFO - Syncing steps from 2026-04-09 to 2026-04-09 (1 days)
2026-04-09 14:09:40 - health.services.data_sync - INFO - ✓ Synced steps for 2026-04-09
2026-04-09 14:09:40 - health.services.data_sync - INFO - steps sync complete: 1 synced, 0 skipped, 0 errors
2026-04-09 14:09:41 - health.services.data_sync - INFO - Syncing heart_rate from 2026-04-09 to 2026-04-09 (1 days)
2026-04-09 14:09:41 - health.services.data_sync - INFO - ✓ Synced heart_rate for 2026-04-09
2026-04-09 14:09:41 - health.services.data_sync - INFO - heart_rate sync complete: 1 synced, 0 skipped, 0 errors
2026-04-09 14:09:41 - health.services.data_sync - INFO - Syncing sleep from 2026-04-09 to 2026-04-09 (1 days)
2026-04-09 14:09:41 - health.services.data_sync - INFO - ✓ Synced sleep for 2026-04-09
2026-04-09 14:09:41 - health.services.data_sync - INFO - sleep sync complete: 1 synced, 0 skipped, 0 errors
2026-04-09 14:09:41 - health.services.data_sync - INFO - Syncing stress from 2026-04-09 to 2026-04-09 (1 days)
2026-04-09 14:09:41 - health.services.data_sync - INFO - ✓ Synced stress for 2026-04-09
2026-04-09 14:09:41 - health.services.data_sync - INFO - stress sync complete: 1 synced, 0 skipped, 0 errors
2026-04-09 14:09:41 - health.services.data_sync - INFO - Syncing body_battery from 2026-04-09 to 2026-04-09 (1 days)
2026-04-09 14:09:41 - health.services.data_sync - INFO - ✓ Synced body_battery for 2026-04-09
2026-04-09 14:09:41 - health.services.data_sync - INFO - body_battery sync complete: 1 synced, 0 skipped, 0 errors
2026-04-09 14:09:41 - health.services.data_sync - INFO - Syncing spo2 from 2026-04-09 to 2026-04-09 (1 days)
2026-04-09 14:09:41 - health.services.data_sync - INFO - ✓ Synced spo2 for 2026-04-09
2026-04-09 14:09:41 - health.services.data_sync - INFO - spo2 sync complete: 1 synced, 0 skipped, 0 errors
2026-04-09 14:09:41 - health.services.data_sync - INFO - Syncing respiration from 2026-04-09 to 2026-04-09 (1 days)
2026-04-09 14:09:41 - health.services.data_sync - INFO - ✓ Synced respiration for 2026-04-09
2026-04-09 14:09:41 - health.services.data_sync - INFO - respiration sync complete: 1 synced, 0 skipped, 0 errors
2026-04-09 14:09:41 - health.services.data_sync - INFO - Syncing hydration from 2026-04-09 to 2026-04-09 (1 days)
2026-04-09 14:09:42 - health.services.data_sync - INFO - ✓ Synced hydration for 2026-04-09
2026-04-09 14:09:42 - health.services.data_sync - INFO - hydration sync complete: 1 synced, 0 skipped, 0 errors
2026-04-09 14:09:42 - health.services.data_sync - INFO - Syncing floors from 2026-04-09 to 2026-04-09 (1 days)
2026-04-09 14:09:42 - health.services.data_sync - INFO - ✓ Synced floors for 2026-04-09
2026-04-09 14:09:42 - health.services.data_sync - INFO - floors sync complete: 1 synced, 0 skipped, 0 errors
2026-04-09 14:09:42 - health.services.data_sync - INFO - Syncing intensity_minutes from 2026-04-09 to 2026-04-09 (1 days)
2026-04-09 14:09:42 - health.services.data_sync - INFO - ✓ Synced intensity_minutes for 2026-04-09
2026-04-09 14:09:42 - health.services.data_sync - INFO - intensity_minutes sync complete: 1 synced, 0 skipped, 0 errors
2026-04-09 14:09:42 - health.services.data_sync - INFO - Syncing hrv from 2026-04-09 to 2026-04-09 (1 days)
2026-04-09 14:09:42 - health.services.data_sync - INFO - ✓ Synced hrv for 2026-04-09
2026-04-09 14:09:42 - health.services.data_sync - INFO - hrv sync complete: 1 synced, 0 skipped, 0 errors
2026-04-09 14:09:42 - health.services.data_sync - INFO - Syncing rhr from 2026-04-09 to 2026-04-09 (1 days)
2026-04-09 14:09:42 - health.services.data_sync - INFO - ✓ Synced rhr for 2026-04-09
2026-04-09 14:09:42 - health.services.data_sync - INFO - rhr sync complete: 1 synced, 0 skipped, 0 errors
2026-04-09 14:09:42 - health.services.data_sync - INFO - Syncing weight from 2026-04-09 to 2026-04-09 (1 days)
2026-04-09 14:09:42 - health.services.data_sync - INFO - weight sync complete: 0 synced, 1 skipped, 0 errors
2026-04-09 14:09:42 - health.services.data_sync - INFO - Syncing lifestyle_logging from 2026-04-09 to 2026-04-09 (1 days)
2026-04-09 14:09:42 - health.services.data_sync - INFO - lifestyle_logging sync complete: 0 synced, 1 skipped, 0 errors
2026-04-09 14:09:42 - health.services.data_sync - INFO - Syncing activities from 2026-04-09 to 2026-04-09
2026-04-09 14:09:42 - health.services.garmin_client - INFO - Fetched 1 activities
2026-04-09 14:09:42 - health.services.data_sync - INFO - Found 1 activities
2026-04-09 14:09:42 - health.services.data_sync - INFO - ✓ Synced activity 582237392 (elliptical) on 2026-04-09
2026-04-09 14:09:42 - health.services.data_sync - INFO - Activity sync complete: 1 synced, 0 skipped, 0 errors
2026-04-09 14:09:42 - health.services.query - INFO - Querying health data summary for 2026-04-09
2026-04-09 14:09:42 - health.services.query - INFO - Found 12 metrics and 1 activities
2026-04-09 14:09:42 - slack_bot.dispatcher - INFO - [d616516d] ✓ sync_garmin finished in 2.52s
2026-04-09 14:09:42 - slack_bot.dispatcher - INFO - [d616516d] Tool: get_daily_detailed_stats Args: {'target_date': '2026-04-07'}
2026-04-09 14:09:42 - health.services.query - INFO - Querying health data summary for 2026-04-07
2026-04-09 14:09:42 - health.services.query - INFO - Found 12 metrics and 1 activities
2026-04-09 14:09:42 - slack_bot.dispatcher - INFO - [d616516d] ✓ get_daily_detailed_stats finished in 0.01s
2026-04-09 14:09:42 - slack_bot.dispatcher - INFO - [d616516d] Tool: get_activity_history Args: {'end_date': '2026-04-07', 'start_date': '2026-04-07'}
2026-04-09 14:09:42 - health.services.query - INFO - Querying activities from 2026-04-07 to 2026-04-07
2026-04-09 14:09:42 - health.services.query - INFO - Found 1 activities
2026-04-09 14:09:42 - slack_bot.dispatcher - INFO - [d616516d] ✓ get_activity_history finished in 0.00s
2026-04-09 14:09:42 - slack_bot.dispatcher - INFO - [d616516d] Requesting final analysis...
2026-04-09 14:09:48 - slack_bot.dispatcher - INFO - [d616516d] Final analysis received in 5.34s
2026-04-09 14:09:48 - slack_bot.dispatcher - INFO - Formatted text (len 548 -> 524)
2026-04-09 14:09:48 - slack_bot.dispatcher - WARNING - [d616516d] Update failed, posting new: The request to the Slack API failed. (url: https://slack.com/api/chat.update)
The server responded with: {'ok': False, 'error': 'msg_too_long'}
2026-04-09 14:09:48 - slack_bot.dispatcher - INFO - [d616516d] Dispatch completed in 12.10s
2026-04-09 14:09:48 - __main__ - INFO - [d616516d] ✅ Request completed in 12.42s
Failed to retrieve WSS URL: The request to the Slack API failed. (url: https://slack.com/api/apps.connections.open)
The server responded with: {'ok': False, 'error': 'internal_error'}
Failed to process a message: The request to the Slack API failed. (url: https://slack.com/api/apps.connections.open)
The server responded with: {'ok': False, 'error': 'internal_error'}
Traceback (most recent call last):
  File "/root/projects/butler/venv/lib64/python3.11/site-packages/slack_sdk/socket_mode/client.py", line 155, in process_messages
    self.process_message()
  File "/root/projects/butler/venv/lib64/python3.11/site-packages/slack_sdk/socket_mode/client.py", line 112, in process_message
    self.connect_to_new_endpoint(force=True)
  File "/root/projects/butler/venv/lib64/python3.11/site-packages/slack_sdk/socket_mode/client.py", line 77, in connect_to_new_endpoint
    self.wss_uri = self.issue_new_wss_url()
                   ^^^^^^^^^^^^^^^^^^^^^^^^
  File "/root/projects/butler/venv/lib64/python3.11/site-packages/slack_sdk/socket_mode/client.py", line 61, in issue_new_wss_url
    raise e
  File "/root/projects/butler/venv/lib64/python3.11/site-packages/slack_sdk/socket_mode/client.py", line 48, in issue_new_wss_url
    response = self.web_client.apps_connections_open(app_token=self.app_token)
               ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "/root/projects/butler/venv/lib64/python3.11/site-packages/slack_sdk/web/client.py", line 1949, in apps_connections_open
    return self.api_call("apps.connections.open", http_verb="POST", params=kwargs)
           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "/root/projects/butler/venv/lib64/python3.11/site-packages/slack_sdk/web/base_client.py", line 169, in api_call
    return self._sync_send(api_url=api_url, req_args=req_args)
           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "/root/projects/butler/venv/lib64/python3.11/site-packages/slack_sdk/web/base_client.py", line 200, in _sync_send
    return self._urllib_api_call(
           ^^^^^^^^^^^^^^^^^^^^^^
  File "/root/projects/butler/venv/lib64/python3.11/site-packages/slack_sdk/web/base_client.py", line 331, in _urllib_api_call
    ).validate()
      ^^^^^^^^^^
  File "/root/projects/butler/venv/lib64/python3.11/site-packages/slack_sdk/web/slack_response.py", line 197, in validate
    raise e.SlackApiError(message=msg, response=self)
slack_sdk.errors.SlackApiError: The request to the Slack API failed. (url: https://slack.com/api/apps.connections.open)
The server responded with: {'ok': False, 'error': 'internal_error'}
2026-04-11 10:00:27 - __main__ - INFO - [e6864cdf] 📥 Received message from U0A8ZCK7RJM in D0AA4GBQRKK: 同步佳明数据 (Files: 0)
2026-04-11 10:00:27 - slack_bot.dispatcher - INFO - [e6864cdf] Processing message in D0AA4GBQRKK from U0A8ZCK7RJM
2026-04-11 10:00:27 - slack_bot.dispatcher - INFO - [e6864cdf] Calling Gemini for initial response...
2026-04-11 10:00:27 - slack_bot.dispatcher - INFO - [e6864cdf] Request config: model=google/gemini-3-flash-preview, tools=21, context=39 msgs
2026-04-11 10:00:30 - slack_bot.dispatcher - WARNING - [e6864cdf] Gemini returned empty response_text! (This usually means the proxy has issues)
2026-04-11 10:00:30 - slack_bot.dispatcher - INFO - [e6864cdf] Gemini response: text=0 chars, tool_calls=3
2026-04-11 10:00:30 - slack_bot.dispatcher - INFO - [e6864cdf] Tool calls successfully generated by Gemini (no SAFETY OVERRIDE needed)
2026-04-11 10:00:30 - slack_bot.dispatcher - INFO - [e6864cdf] Gemini response in 2.55s: 0 chars, 3 tools
2026-04-11 10:00:30 - slack_bot.dispatcher - INFO - [e6864cdf] Executing 3 tools
2026-04-11 10:00:30 - slack_bot.dispatcher - INFO - [e6864cdf] Tool: sync_garmin Args: {'target_date': '2026-04-11'}
2026-04-11 10:00:30 - slack_bot.tools.garmin - INFO - Starting Garmin sync for 2026-04-11...
2026-04-11 10:00:30 - health.services.data_sync - INFO - Authenticating with Garmin...
2026-04-11 10:00:30 - health.services.garmin_client - INFO - Authenticating with Garmin Connect China for 350134531@qq.com
2026-04-11 10:00:30 - health.services.garmin_client - INFO - Successfully authenticated with Garmin Connect China
2026-04-11 10:00:30 - health.services.data_sync - INFO - Authentication successful
2026-04-11 10:00:30 - health.services.data_sync - INFO - Syncing 14 metric types from 2026-04-11 to 2026-04-11
2026-04-11 10:00:30 - health.services.data_sync - INFO - Syncing steps from 2026-04-11 to 2026-04-11 (1 days)
2026-04-11 10:00:30 - health.services.data_sync - INFO - ✓ Synced steps for 2026-04-11
2026-04-11 10:00:30 - health.services.data_sync - INFO - steps sync complete: 1 synced, 0 skipped, 0 errors
2026-04-11 10:00:30 - health.services.data_sync - INFO - Syncing heart_rate from 2026-04-11 to 2026-04-11 (1 days)
2026-04-11 10:00:30 - health.services.data_sync - INFO - ✓ Synced heart_rate for 2026-04-11
2026-04-11 10:00:30 - health.services.data_sync - INFO - heart_rate sync complete: 1 synced, 0 skipped, 0 errors
2026-04-11 10:00:30 - health.services.data_sync - INFO - Syncing sleep from 2026-04-11 to 2026-04-11 (1 days)
2026-04-11 10:00:31 - health.services.data_sync - INFO - ✓ Synced sleep for 2026-04-11
2026-04-11 10:00:31 - health.services.data_sync - INFO - sleep sync complete: 1 synced, 0 skipped, 0 errors
2026-04-11 10:00:31 - health.services.data_sync - INFO - Syncing stress from 2026-04-11 to 2026-04-11 (1 days)
2026-04-11 10:00:31 - health.services.data_sync - INFO - ✓ Synced stress for 2026-04-11
2026-04-11 10:00:31 - health.services.data_sync - INFO - stress sync complete: 1 synced, 0 skipped, 0 errors
2026-04-11 10:00:31 - health.services.data_sync - INFO - Syncing body_battery from 2026-04-11 to 2026-04-11 (1 days)
2026-04-11 10:00:31 - health.services.data_sync - INFO - ✓ Synced body_battery for 2026-04-11
2026-04-11 10:00:31 - health.services.data_sync - INFO - body_battery sync complete: 1 synced, 0 skipped, 0 errors
2026-04-11 10:00:31 - health.services.data_sync - INFO - Syncing spo2 from 2026-04-11 to 2026-04-11 (1 days)
2026-04-11 10:00:31 - health.services.data_sync - INFO - ✓ Synced spo2 for 2026-04-11
2026-04-11 10:00:31 - health.services.data_sync - INFO - spo2 sync complete: 1 synced, 0 skipped, 0 errors
2026-04-11 10:00:31 - health.services.data_sync - INFO - Syncing respiration from 2026-04-11 to 2026-04-11 (1 days)
2026-04-11 10:00:31 - health.services.data_sync - INFO - ✓ Synced respiration for 2026-04-11
2026-04-11 10:00:31 - health.services.data_sync - INFO - respiration sync complete: 1 synced, 0 skipped, 0 errors
2026-04-11 10:00:31 - health.services.data_sync - INFO - Syncing hydration from 2026-04-11 to 2026-04-11 (1 days)
2026-04-11 10:00:31 - health.services.data_sync - INFO - ✓ Synced hydration for 2026-04-11
2026-04-11 10:00:31 - health.services.data_sync - INFO - hydration sync complete: 1 synced, 0 skipped, 0 errors
2026-04-11 10:00:31 - health.services.data_sync - INFO - Syncing floors from 2026-04-11 to 2026-04-11 (1 days)
2026-04-11 10:00:31 - health.services.data_sync - INFO - ✓ Synced floors for 2026-04-11
2026-04-11 10:00:31 - health.services.data_sync - INFO - floors sync complete: 1 synced, 0 skipped, 0 errors
2026-04-11 10:00:31 - health.services.data_sync - INFO - Syncing intensity_minutes from 2026-04-11 to 2026-04-11 (1 days)
2026-04-11 10:00:31 - health.services.data_sync - INFO - ✓ Synced intensity_minutes for 2026-04-11
2026-04-11 10:00:31 - health.services.data_sync - INFO - intensity_minutes sync complete: 1 synced, 0 skipped, 0 errors
2026-04-11 10:00:31 - health.services.data_sync - INFO - Syncing hrv from 2026-04-11 to 2026-04-11 (1 days)
2026-04-11 10:00:32 - health.services.data_sync - INFO - ✓ Synced hrv for 2026-04-11
2026-04-11 10:00:32 - health.services.data_sync - INFO - hrv sync complete: 1 synced, 0 skipped, 0 errors
2026-04-11 10:00:32 - health.services.data_sync - INFO - Syncing rhr from 2026-04-11 to 2026-04-11 (1 days)
2026-04-11 10:00:32 - health.services.data_sync - INFO - ✓ Synced rhr for 2026-04-11
2026-04-11 10:00:32 - health.services.data_sync - INFO - rhr sync complete: 1 synced, 0 skipped, 0 errors
2026-04-11 10:00:32 - health.services.data_sync - INFO - Syncing weight from 2026-04-11 to 2026-04-11 (1 days)
2026-04-11 10:00:32 - health.services.data_sync - INFO - weight sync complete: 0 synced, 1 skipped, 0 errors
2026-04-11 10:00:32 - health.services.data_sync - INFO - Syncing lifestyle_logging from 2026-04-11 to 2026-04-11 (1 days)
2026-04-11 10:00:32 - health.services.data_sync - INFO - lifestyle_logging sync complete: 0 synced, 1 skipped, 0 errors
2026-04-11 10:00:32 - health.services.data_sync - INFO - Syncing activities from 2026-04-11 to 2026-04-11
2026-04-11 10:00:32 - health.services.garmin_client - INFO - Fetched 1 activities
2026-04-11 10:00:32 - health.services.data_sync - INFO - Found 1 activities
2026-04-11 10:00:32 - health.services.data_sync - INFO - ✓ Synced activity 582934801 (elliptical) on 2026-04-11
2026-04-11 10:00:32 - health.services.data_sync - INFO - Activity sync complete: 1 synced, 0 skipped, 0 errors
2026-04-11 10:00:32 - health.services.query - INFO - Querying health data summary for 2026-04-11
2026-04-11 10:00:32 - health.services.query - INFO - Found 12 metrics and 1 activities
2026-04-11 10:00:32 - slack_bot.dispatcher - INFO - [e6864cdf] ✓ sync_garmin finished in 2.25s
2026-04-11 10:00:32 - slack_bot.dispatcher - INFO - [e6864cdf] Tool: get_daily_detailed_stats Args: {'target_date': '2026-04-11'}
2026-04-11 10:00:32 - health.services.query - INFO - Querying health data summary for 2026-04-11
2026-04-11 10:00:32 - health.services.query - INFO - Found 12 metrics and 1 activities
2026-04-11 10:00:32 - slack_bot.dispatcher - INFO - [e6864cdf] ✓ get_daily_detailed_stats finished in 0.01s
2026-04-11 10:00:32 - slack_bot.dispatcher - INFO - [e6864cdf] Tool: get_activity_history Args: {'end_date': '2026-04-11', 'start_date': '2026-04-10'}
2026-04-11 10:00:32 - health.services.query - INFO - Querying activities from 2026-04-10 to 2026-04-11
2026-04-11 10:00:32 - health.services.query - INFO - Found 1 activities
2026-04-11 10:00:32 - slack_bot.dispatcher - INFO - [e6864cdf] ✓ get_activity_history finished in 0.00s
2026-04-11 10:00:32 - slack_bot.dispatcher - INFO - [e6864cdf] Requesting final analysis...
2026-04-11 10:00:37 - slack_bot.dispatcher - INFO - [e6864cdf] Final analysis received in 4.60s
2026-04-11 10:00:37 - slack_bot.dispatcher - INFO - Formatted text (len 587 -> 561)
2026-04-11 10:00:37 - slack_bot.dispatcher - WARNING - [e6864cdf] Update failed, posting new: The request to the Slack API failed. (url: https://slack.com/api/chat.update)
The server responded with: {'ok': False, 'error': 'msg_too_long'}
2026-04-11 10:00:38 - slack_bot.dispatcher - INFO - [e6864cdf] Dispatch completed in 10.44s
2026-04-11 10:00:38 - __main__ - INFO - [e6864cdf] ✅ Request completed in 10.75s
2026-04-11 23:17:59 - __main__ - INFO - [1bf14ba0] 📥 Received message from U0A8ZCK7RJM in D0AA4GBQRKK: 同步佳明数据 (Files: 0)
2026-04-11 23:18:00 - slack_bot.dispatcher - INFO - [1bf14ba0] Processing message in D0AA4GBQRKK from U0A8ZCK7RJM
2026-04-11 23:18:00 - slack_bot.dispatcher - INFO - [1bf14ba0] Calling Gemini for initial response...
2026-04-11 23:18:00 - slack_bot.dispatcher - INFO - [1bf14ba0] Request config: model=google/gemini-3-flash-preview, tools=21, context=39 msgs
2026-04-11 23:18:02 - slack_bot.dispatcher - WARNING - [1bf14ba0] Gemini returned empty response_text! (This usually means the proxy has issues)
2026-04-11 23:18:02 - slack_bot.dispatcher - INFO - [1bf14ba0] Gemini response: text=0 chars, tool_calls=3
2026-04-11 23:18:02 - slack_bot.dispatcher - INFO - [1bf14ba0] Tool calls successfully generated by Gemini (no SAFETY OVERRIDE needed)
2026-04-11 23:18:02 - slack_bot.dispatcher - INFO - [1bf14ba0] Gemini response in 2.36s: 0 chars, 3 tools
2026-04-11 23:18:02 - slack_bot.dispatcher - INFO - [1bf14ba0] Executing 3 tools
2026-04-11 23:18:02 - slack_bot.dispatcher - INFO - [1bf14ba0] Tool: sync_garmin Args: {'target_date': '2026-04-11'}
2026-04-11 23:18:02 - slack_bot.tools.garmin - INFO - Starting Garmin sync for 2026-04-11...
2026-04-11 23:18:02 - health.services.data_sync - INFO - Authenticating with Garmin...
2026-04-11 23:18:02 - health.services.garmin_client - INFO - Authenticating with Garmin Connect China for 350134531@qq.com
2026-04-11 23:18:02 - health.services.garmin_client - INFO - Successfully authenticated with Garmin Connect China
2026-04-11 23:18:02 - health.services.data_sync - INFO - Authentication successful
2026-04-11 23:18:02 - health.services.data_sync - INFO - Syncing 14 metric types from 2026-04-11 to 2026-04-11
2026-04-11 23:18:02 - health.services.data_sync - INFO - Syncing steps from 2026-04-11 to 2026-04-11 (1 days)
2026-04-11 23:18:03 - health.services.data_sync - INFO - ✓ Synced steps for 2026-04-11
2026-04-11 23:18:03 - health.services.data_sync - INFO - steps sync complete: 1 synced, 0 skipped, 0 errors
2026-04-11 23:18:03 - health.services.data_sync - INFO - Syncing heart_rate from 2026-04-11 to 2026-04-11 (1 days)
2026-04-11 23:18:03 - health.services.data_sync - INFO - ✓ Synced heart_rate for 2026-04-11
2026-04-11 23:18:03 - health.services.data_sync - INFO - heart_rate sync complete: 1 synced, 0 skipped, 0 errors
2026-04-11 23:18:03 - health.services.data_sync - INFO - Syncing sleep from 2026-04-11 to 2026-04-11 (1 days)
2026-04-11 23:18:03 - health.services.data_sync - INFO - ✓ Synced sleep for 2026-04-11
2026-04-11 23:18:03 - health.services.data_sync - INFO - sleep sync complete: 1 synced, 0 skipped, 0 errors
2026-04-11 23:18:03 - health.services.data_sync - INFO - Syncing stress from 2026-04-11 to 2026-04-11 (1 days)
2026-04-11 23:18:03 - health.services.data_sync - INFO - ✓ Synced stress for 2026-04-11
2026-04-11 23:18:03 - health.services.data_sync - INFO - stress sync complete: 1 synced, 0 skipped, 0 errors
2026-04-11 23:18:03 - health.services.data_sync - INFO - Syncing body_battery from 2026-04-11 to 2026-04-11 (1 days)
2026-04-11 23:18:03 - health.services.data_sync - INFO - ✓ Synced body_battery for 2026-04-11
2026-04-11 23:18:03 - health.services.data_sync - INFO - body_battery sync complete: 1 synced, 0 skipped, 0 errors
2026-04-11 23:18:03 - health.services.data_sync - INFO - Syncing spo2 from 2026-04-11 to 2026-04-11 (1 days)
2026-04-11 23:18:03 - health.services.data_sync - INFO - ✓ Synced spo2 for 2026-04-11
2026-04-11 23:18:03 - health.services.data_sync - INFO - spo2 sync complete: 1 synced, 0 skipped, 0 errors
2026-04-11 23:18:03 - health.services.data_sync - INFO - Syncing respiration from 2026-04-11 to 2026-04-11 (1 days)
2026-04-11 23:18:04 - health.services.data_sync - INFO - ✓ Synced respiration for 2026-04-11
2026-04-11 23:18:04 - health.services.data_sync - INFO - respiration sync complete: 1 synced, 0 skipped, 0 errors
2026-04-11 23:18:04 - health.services.data_sync - INFO - Syncing hydration from 2026-04-11 to 2026-04-11 (1 days)
2026-04-11 23:18:04 - health.services.data_sync - INFO - ✓ Synced hydration for 2026-04-11
2026-04-11 23:18:04 - health.services.data_sync - INFO - hydration sync complete: 1 synced, 0 skipped, 0 errors
2026-04-11 23:18:04 - health.services.data_sync - INFO - Syncing floors from 2026-04-11 to 2026-04-11 (1 days)
2026-04-11 23:18:04 - health.services.data_sync - INFO - ✓ Synced floors for 2026-04-11
2026-04-11 23:18:04 - health.services.data_sync - INFO - floors sync complete: 1 synced, 0 skipped, 0 errors
2026-04-11 23:18:04 - health.services.data_sync - INFO - Syncing intensity_minutes from 2026-04-11 to 2026-04-11 (1 days)
2026-04-11 23:18:04 - health.services.data_sync - INFO - ✓ Synced intensity_minutes for 2026-04-11
2026-04-11 23:18:04 - health.services.data_sync - INFO - intensity_minutes sync complete: 1 synced, 0 skipped, 0 errors
2026-04-11 23:18:04 - health.services.data_sync - INFO - Syncing hrv from 2026-04-11 to 2026-04-11 (1 days)
2026-04-11 23:18:04 - health.services.data_sync - INFO - ✓ Synced hrv for 2026-04-11
2026-04-11 23:18:04 - health.services.data_sync - INFO - hrv sync complete: 1 synced, 0 skipped, 0 errors
2026-04-11 23:18:04 - health.services.data_sync - INFO - Syncing rhr from 2026-04-11 to 2026-04-11 (1 days)
2026-04-11 23:18:04 - health.services.data_sync - INFO - ✓ Synced rhr for 2026-04-11
2026-04-11 23:18:04 - health.services.data_sync - INFO - rhr sync complete: 1 synced, 0 skipped, 0 errors
2026-04-11 23:18:04 - health.services.data_sync - INFO - Syncing weight from 2026-04-11 to 2026-04-11 (1 days)
2026-04-11 23:18:04 - health.services.data_sync - INFO - weight sync complete: 0 synced, 1 skipped, 0 errors
2026-04-11 23:18:04 - health.services.data_sync - INFO - Syncing lifestyle_logging from 2026-04-11 to 2026-04-11 (1 days)
2026-04-11 23:18:04 - health.services.data_sync - INFO - ✓ Synced lifestyle_logging for 2026-04-11
2026-04-11 23:18:04 - health.services.data_sync - INFO - lifestyle_logging sync complete: 1 synced, 0 skipped, 0 errors
2026-04-11 23:18:04 - health.services.data_sync - INFO - Syncing activities from 2026-04-11 to 2026-04-11
2026-04-11 23:18:04 - health.services.garmin_client - INFO - Fetched 3 activities
2026-04-11 23:18:04 - health.services.data_sync - INFO - Found 3 activities
2026-04-11 23:18:04 - health.services.data_sync - INFO - ✓ Synced activity 583159775 (strength_training) on 2026-04-11
2026-04-11 23:18:04 - health.services.data_sync - INFO - ✓ Synced activity 583152047 (badminton) on 2026-04-11
2026-04-11 23:18:04 - health.services.data_sync - INFO - ✓ Synced activity 582934801 (elliptical) on 2026-04-11
2026-04-11 23:18:04 - health.services.data_sync - INFO - Activity sync complete: 3 synced, 0 skipped, 0 errors
2026-04-11 23:18:04 - health.services.query - INFO - Querying health data summary for 2026-04-11
2026-04-11 23:18:04 - health.services.query - INFO - Found 13 metrics and 3 activities
2026-04-11 23:18:04 - slack_bot.dispatcher - INFO - [1bf14ba0] ✓ sync_garmin finished in 2.41s
2026-04-11 23:18:04 - slack_bot.dispatcher - INFO - [1bf14ba0] Tool: get_daily_detailed_stats Args: {'target_date': '2026-04-11'}
2026-04-11 23:18:04 - health.services.query - INFO - Querying health data summary for 2026-04-11
2026-04-11 23:18:04 - health.services.query - INFO - Found 13 metrics and 3 activities
2026-04-11 23:18:04 - slack_bot.dispatcher - INFO - [1bf14ba0] ✓ get_daily_detailed_stats finished in 0.01s
2026-04-11 23:18:04 - slack_bot.dispatcher - INFO - [1bf14ba0] Tool: get_activity_history Args: {'start_date': '2026-04-11', 'end_date': '2026-04-11'}
2026-04-11 23:18:04 - health.services.query - INFO - Querying activities from 2026-04-11 to 2026-04-11
2026-04-11 23:18:04 - health.services.query - INFO - Found 3 activities
2026-04-11 23:18:04 - slack_bot.dispatcher - INFO - [1bf14ba0] ✓ get_activity_history finished in 0.00s
2026-04-11 23:18:04 - slack_bot.dispatcher - INFO - [1bf14ba0] Requesting final analysis...
2026-04-11 23:18:09 - slack_bot.dispatcher - INFO - [1bf14ba0] Final analysis received in 4.47s
2026-04-11 23:18:09 - slack_bot.dispatcher - INFO - Formatted text (len 663 -> 633)
2026-04-11 23:18:09 - slack_bot.dispatcher - WARNING - [1bf14ba0] Update failed, posting new: The request to the Slack API failed. (url: https://slack.com/api/chat.update)
The server responded with: {'ok': False, 'error': 'msg_too_long'}
2026-04-11 23:18:11 - slack_bot.dispatcher - INFO - [1bf14ba0] 📤 Continuation message posted
2026-04-11 23:18:11 - slack_bot.dispatcher - INFO - [1bf14ba0] Dispatch completed in 11.13s
2026-04-11 23:18:11 - __main__ - INFO - [1bf14ba0] ✅ Request completed in 11.66s
2026-04-15 10:24:00 - __main__ - INFO - [f07e46b6] 📥 Received message from U0A8ZCK7RJM in D0AA4GBQRKK: 同步佳明数据 (Files: 0)
2026-04-15 10:24:01 - slack_bot.dispatcher - INFO - [f07e46b6] Processing message in D0AA4GBQRKK from U0A8ZCK7RJM
2026-04-15 10:24:01 - slack_bot.dispatcher - INFO - [f07e46b6] Calling Gemini for initial response...
2026-04-15 10:24:01 - slack_bot.dispatcher - INFO - [f07e46b6] Request config: model=google/gemini-3-flash-preview, tools=21, context=39 msgs
2026-04-15 10:24:03 - slack_bot.dispatcher - WARNING - [f07e46b6] Gemini returned empty response_text! (This usually means the proxy has issues)
2026-04-15 10:24:03 - slack_bot.dispatcher - INFO - [f07e46b6] Gemini response: text=0 chars, tool_calls=3
2026-04-15 10:24:03 - slack_bot.dispatcher - INFO - [f07e46b6] Tool calls successfully generated by Gemini (no SAFETY OVERRIDE needed)
2026-04-15 10:24:03 - slack_bot.dispatcher - INFO - [f07e46b6] Gemini response in 2.47s: 0 chars, 3 tools
2026-04-15 10:24:03 - slack_bot.dispatcher - INFO - [f07e46b6] Executing 3 tools
2026-04-15 10:24:03 - slack_bot.dispatcher - INFO - [f07e46b6] Tool: sync_garmin Args: {'target_date': '2026-04-15'}
2026-04-15 10:24:03 - slack_bot.tools.garmin - INFO - Starting Garmin sync for 2026-04-15...
2026-04-15 10:24:03 - health.services.data_sync - INFO - Authenticating with Garmin...
2026-04-15 10:24:03 - health.services.garmin_client - INFO - Authenticating with Garmin Connect China for 350134531@qq.com
2026-04-15 10:24:03 - health.services.garmin_client - INFO - Successfully authenticated with Garmin Connect China
2026-04-15 10:24:03 - health.services.data_sync - INFO - Authentication successful
2026-04-15 10:24:03 - health.services.data_sync - INFO - Syncing 14 metric types from 2026-04-15 to 2026-04-15
2026-04-15 10:24:03 - health.services.data_sync - INFO - Syncing steps from 2026-04-15 to 2026-04-15 (1 days)
2026-04-15 10:24:04 - health.services.data_sync - INFO - ✓ Synced steps for 2026-04-15
2026-04-15 10:24:04 - health.services.data_sync - INFO - steps sync complete: 1 synced, 0 skipped, 0 errors
2026-04-15 10:24:04 - health.services.data_sync - INFO - Syncing heart_rate from 2026-04-15 to 2026-04-15 (1 days)
2026-04-15 10:24:04 - health.services.data_sync - INFO - ✓ Synced heart_rate for 2026-04-15
2026-04-15 10:24:04 - health.services.data_sync - INFO - heart_rate sync complete: 1 synced, 0 skipped, 0 errors
2026-04-15 10:24:04 - health.services.data_sync - INFO - Syncing sleep from 2026-04-15 to 2026-04-15 (1 days)
2026-04-15 10:24:04 - health.services.data_sync - INFO - ✓ Synced sleep for 2026-04-15
2026-04-15 10:24:04 - health.services.data_sync - INFO - sleep sync complete: 1 synced, 0 skipped, 0 errors
2026-04-15 10:24:04 - health.services.data_sync - INFO - Syncing stress from 2026-04-15 to 2026-04-15 (1 days)
2026-04-15 10:24:04 - health.services.data_sync - INFO - ✓ Synced stress for 2026-04-15
2026-04-15 10:24:04 - health.services.data_sync - INFO - stress sync complete: 1 synced, 0 skipped, 0 errors
2026-04-15 10:24:04 - health.services.data_sync - INFO - Syncing body_battery from 2026-04-15 to 2026-04-15 (1 days)
2026-04-15 10:24:04 - health.services.data_sync - INFO - ✓ Synced body_battery for 2026-04-15
2026-04-15 10:24:04 - health.services.data_sync - INFO - body_battery sync complete: 1 synced, 0 skipped, 0 errors
2026-04-15 10:24:04 - health.services.data_sync - INFO - Syncing spo2 from 2026-04-15 to 2026-04-15 (1 days)
2026-04-15 10:24:04 - health.services.data_sync - INFO - ✓ Synced spo2 for 2026-04-15
2026-04-15 10:24:04 - health.services.data_sync - INFO - spo2 sync complete: 1 synced, 0 skipped, 0 errors
2026-04-15 10:24:04 - health.services.data_sync - INFO - Syncing respiration from 2026-04-15 to 2026-04-15 (1 days)
2026-04-15 10:24:04 - health.services.data_sync - INFO - ✓ Synced respiration for 2026-04-15
2026-04-15 10:24:04 - health.services.data_sync - INFO - respiration sync complete: 1 synced, 0 skipped, 0 errors
2026-04-15 10:24:04 - health.services.data_sync - INFO - Syncing hydration from 2026-04-15 to 2026-04-15 (1 days)
2026-04-15 10:24:05 - health.services.data_sync - INFO - ✓ Synced hydration for 2026-04-15
2026-04-15 10:24:05 - health.services.data_sync - INFO - hydration sync complete: 1 synced, 0 skipped, 0 errors
2026-04-15 10:24:05 - health.services.data_sync - INFO - Syncing floors from 2026-04-15 to 2026-04-15 (1 days)
2026-04-15 10:24:05 - health.services.data_sync - INFO - ✓ Synced floors for 2026-04-15
2026-04-15 10:24:05 - health.services.data_sync - INFO - floors sync complete: 1 synced, 0 skipped, 0 errors
2026-04-15 10:24:05 - health.services.data_sync - INFO - Syncing intensity_minutes from 2026-04-15 to 2026-04-15 (1 days)
2026-04-15 10:24:05 - health.services.data_sync - INFO - ✓ Synced intensity_minutes for 2026-04-15
2026-04-15 10:24:05 - health.services.data_sync - INFO - intensity_minutes sync complete: 1 synced, 0 skipped, 0 errors
2026-04-15 10:24:05 - health.services.data_sync - INFO - Syncing hrv from 2026-04-15 to 2026-04-15 (1 days)
2026-04-15 10:24:05 - health.services.data_sync - INFO - ✓ Synced hrv for 2026-04-15
2026-04-15 10:24:05 - health.services.data_sync - INFO - hrv sync complete: 1 synced, 0 skipped, 0 errors
2026-04-15 10:24:05 - health.services.data_sync - INFO - Syncing rhr from 2026-04-15 to 2026-04-15 (1 days)
2026-04-15 10:24:05 - health.services.data_sync - INFO - ✓ Synced rhr for 2026-04-15
2026-04-15 10:24:05 - health.services.data_sync - INFO - rhr sync complete: 1 synced, 0 skipped, 0 errors
2026-04-15 10:24:05 - health.services.data_sync - INFO - Syncing weight from 2026-04-15 to 2026-04-15 (1 days)
2026-04-15 10:24:05 - health.services.data_sync - INFO - weight sync complete: 0 synced, 1 skipped, 0 errors
2026-04-15 10:24:05 - health.services.data_sync - INFO - Syncing lifestyle_logging from 2026-04-15 to 2026-04-15 (1 days)
2026-04-15 10:24:05 - health.services.data_sync - INFO - lifestyle_logging sync complete: 0 synced, 1 skipped, 0 errors
2026-04-15 10:24:05 - health.services.data_sync - INFO - Syncing activities from 2026-04-15 to 2026-04-15
2026-04-15 10:24:05 - health.services.garmin_client - INFO - Fetched 1 activities
2026-04-15 10:24:05 - health.services.data_sync - INFO - Found 1 activities
2026-04-15 10:24:05 - health.services.data_sync - INFO - ✓ Synced activity 584345399 (elliptical) on 2026-04-15
2026-04-15 10:24:05 - health.services.data_sync - INFO - Activity sync complete: 1 synced, 0 skipped, 0 errors
2026-04-15 10:24:05 - health.services.query - INFO - Querying health data summary for 2026-04-15
2026-04-15 10:24:05 - health.services.query - INFO - Found 12 metrics and 1 activities
2026-04-15 10:24:05 - slack_bot.dispatcher - INFO - [f07e46b6] ✓ sync_garmin finished in 2.21s
2026-04-15 10:24:05 - slack_bot.dispatcher - INFO - [f07e46b6] Tool: get_daily_detailed_stats Args: {'target_date': '2026-04-15'}
2026-04-15 10:24:05 - health.services.query - INFO - Querying health data summary for 2026-04-15
2026-04-15 10:24:05 - health.services.query - INFO - Found 12 metrics and 1 activities
2026-04-15 10:24:05 - slack_bot.dispatcher - INFO - [f07e46b6] ✓ get_daily_detailed_stats finished in 0.01s
2026-04-15 10:24:05 - slack_bot.dispatcher - INFO - [f07e46b6] Tool: get_activity_history Args: {'end_date': '2026-04-15', 'start_date': '2026-04-14'}
2026-04-15 10:24:05 - health.services.query - INFO - Querying activities from 2026-04-14 to 2026-04-15
2026-04-15 10:24:05 - health.services.query - INFO - Found 1 activities
2026-04-15 10:24:05 - slack_bot.dispatcher - INFO - [f07e46b6] ✓ get_activity_history finished in 0.00s
2026-04-15 10:24:05 - slack_bot.dispatcher - INFO - [f07e46b6] Requesting final analysis...
2026-04-15 10:24:09 - slack_bot.dispatcher - INFO - [f07e46b6] Final analysis received in 4.18s
2026-04-15 10:24:09 - slack_bot.dispatcher - INFO - Formatted text (len 600 -> 566)
2026-04-15 10:24:10 - slack_bot.dispatcher - WARNING - [f07e46b6] Update failed, posting new: The request to the Slack API failed. (url: https://slack.com/api/chat.update)
The server responded with: {'ok': False, 'error': 'msg_too_long'}
2026-04-15 10:24:10 - slack_bot.dispatcher - INFO - [f07e46b6] Dispatch completed in 9.47s
2026-04-15 10:24:10 - __main__ - INFO - [f07e46b6] ✅ Request completed in 9.79s
