跳轉到

Google Tasks 資料流

回到 資料流索引

層級結構

檔案 主要類別/函數
Raw models_raw.py GoogleTaskRaw (18 fields), GoogleTaskListRaw
Read models_read.py GoogleTaskRead
Core async_core.py async_get_all_tasks(), async_task_list(), async_tasklists_list(), _to_task_model()
TOON models_read.py to_toon_tasklist(), to_toon_task(), _build_parent_tree(), _deduplicate_tasks()
MCP task_tools.py get_all_tasks(), get_task_from_tasklist(), list_tasklists()

轉換函數詳解

GoogleTaskRead.from_dict(data: Dict, parent_title?) → GoogleTaskRead

  • 輸入:Google Tasks API 原始 JSON dict
  • 做了什麼
  • 提取 due/completed 並用 to_datetime() 轉為 datetime
  • 計算 status:已完成 → "✓ MM-DD",未完成 → "pending"
  • 處理 parent:有父 ID 時組合為 "Title (id=FULL_ID)" 字串
  • format_for_llm() 格式化日期為 "YYYY-MM-DD HH:MM"
  • 全天標記:Tasks 的 due 永遠是 T00:00:00Z(API 限制),all_day 固定為 True
  • Source ID:保留 id 欄位以支持後續操作

_to_task_model(raw: Dict) → Dict (在 async_core.py)

  • 做了什麼:薄包裝,直接呼叫 GoogleTaskRead.from_dict(raw).model_dump()

to_toon_task(task, current_month) → dict

  • 做了什麼:將單一 GoogleTaskRead 轉為 {title: {id, notes, done, done_at, due, p}} 格式

_deduplicate_tasks(tasks) → List[GoogleTaskRead]

  • 做了什麼:掃描重複標題,自動加上 #1, #2 後綴(如 "微積分#1", "微積分#2"

_build_parent_tree(tasks) → dict

  • 做了什麼:解析 parent 欄位建立 {"父任務": {"子任務": "child"}} 的樹狀結構

to_toon_tasklist(tasks, name, id) → dict

  • 輸入List[GoogleTaskRead] + 清單名稱/ID
  • 做了什麼
  • 呼叫 _deduplicate_tasks() 去重
  • 呼叫 _build_parent_tree() 建立父子關係
  • 按月份分組(month),每月再按 done/pending 分類
  • 無日期的任務歸入 undated
  • 回傳 {source: {id, title}, parent_tree, month, undated} 結構

list_tasklists 工具

list_tasklists 不經過 TOON 轉換函數,直接在 Tool 層組裝:

async_tasklists_list()  →  {tasklists: [{id, title}]}  →  safe_encode()

[!NOTE] async_core.async_tasklists_list() 在 Core 層已過濾 API 回傳的 kindetagselfLinkupdated 等欄位,僅回傳 {id, title}。 回傳的 TOON 結構不包含 count 欄位(TOON 的 key[N] 語法已包含數量資訊)。