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
