權杖預算化的觀測差異(變更了什麼)
observation.serialize_observation 渲染*單一整幀*的 UI——每回合都餵給模型會撐爆該模組
原本就要節省的權杖預算,並迫使模型為了發現那一個新對話框而重讀整個畫面。element_diff
提供兩幀之間的穩定 ID 對應,但止於 matched / added / removed 的*元素配對*——它不會渲染出
模型可據以行動的精簡、帶索引、受預算限制的差異。
observation_delta 正是缺少的序列化器:它比對前一幀與當前觀測,將每個配對元素分類為
changed*(role / name / enabled / value / 移動)或 *stable,並只渲染變動部分——
+ [i] role "name"``(出現)/ ``- role "name"``(消失)/ ``~ [i] role "name" (fields)
(變更)——added 與 changed 優先、stable 略去、上限為 max_lines。模型看到的是*變更了什麼*,
而非再次整個畫面。
純標準函式庫,作用於元素字典;重用 element_diff.match_elements 做重疊配對、
observation.observation_index 做閱讀順序索引。不匯入 PySide6。
無頭 API
from je_auto_control import delta_observation, delta_index, summarize_delta
summary = delta_observation(prev_elements, curr_elements, max_lines=40)
# + [12] dialog "Saved"
# ~ [4] button "Submit" (enabled)
# - button "Spinner"
delta = delta_index(prev_elements, curr_elements) # {added, removed, changed, stable}
text = summarize_delta(delta, max_lines=20)
delta_index 回傳 {added, removed, changed, stable}``(``changed 項目為
{"after", "fields"});``summarize_delta`` 把 delta_index 結果渲染為受預算限制的
+ / ~ / - 行;``delta_observation`` 將兩幀索引化(閱讀順序、視口裁切、僅互動元素)
後再比對並渲染,一次完成。
執行器指令
AC_delta_observation``(``prev / curr / viewport / max_elements / max_lines
/ interactive_only → {summary, added, removed, changed})以 MCP 工具
``ac_delta_observation``(唯讀)及 Script Builder 指令 Observation: Delta (what changed)
(位於 Native UI 分類下)形式提供。