從自訂表格 trigger 提交執行
自訂表格的列 trigger 可以在列被建立或更新時排入一次 Sandbox run。這不是 /private/module/sandbox 端點。Action 活在 custom-tables 的 trigger 設定裡(src/crud/custom_table_triggers.py,型別 submit_sandbox_job)。產生的 run 是普通租戶 run(submission_source="custom_table_trigger"),前端用既有方式輪詢即可。
Trigger 的其餘機制(when 條件、receipt、重試)留在 custom-tables 手冊。本頁只寫 Sandbox 契約。
Action 形狀
{
"type": "submit_sandbox_job",
"chatroom_id": "<room uuid>",
"task_version_id": "<published version id>",
"timeout_seconds": 1800,
"input": {
"order_id": "$row.col_…",
"note": "static"
}
}| 欄位 | 必填 | 說明 |
|---|---|---|
type | 是 | 字面 submit_sandbox_job。 |
task_version_id | 是 | 同公司、state=published、content_state=active。 |
chatroom_id | 見說明 | 預設用表格的 chatroom。部門/公司範圍表格沒有隱含房間,所以必填。 |
timeout_seconds | 否 | 整數 1..604680。預設 = 版本的 timeout_seconds。 |
input | 是 | JSON 物件。可用 $row.col_<hex>(改名穩定的內部鍵)插值。模板本身另有更嚴上限:根物件以下巢狀最多 8 層、每個字串葉節點最多 2000 字元,超過在存檔時就被拒。通過後才以 canonical JSON 規則(≤1 MiB、深度 ≤64)驗證,觸發時再重驗一次。 |
只有 created、updated 事件能帶這個 action。
存檔時檢查(設定者)
編輯者必須是活著的使用者,且對所選任務在所選房間 can_execute_manually。列真正觸發時,會再用造成寫入的行為主體重跑同一套檢查。Action 裡的 id 只是設定,不是授權。
存檔會拒絕:
- 任務版本找不到/不是 published+active/公司不對。
requires_confirmation=true— 背景 trigger 沒有第二則 HumanMessage 可以 commit。- 版本宣告了表格 writeback 的
output_policy(custom_table_writeback)— trigger 路徑永不鑄表格憑證。改用擁有部門房間裡、部門擁有任務的手動 JWT 提交(任務受眾)。Command 輸出的版本(custom_table_command)則可接受,但要符合下面Command 輸出版本的額外規則。 - 設定者不能在該房執行該任務。
- 部門/公司表格缺
chatroom_id。 input不是物件,或 canonical JSON/$row正規化失敗。
觸發時授權
Worker 會解析恰好一個造成寫入的 principal(寫入該列的 user 或 client)。然後:
- 目的地
chatroom_id必須仍在該公司且活著。 - 造成者必須仍活著,且仍是來源行動房間的成員。
- 造成者必須能在目的地房間
can_execute_manually該任務(Command 輸出的版本改為檢查 trigger 的撰寫者——見下)。 - 來源權限語境(當初讓這列可見的 ACL)仍須允許付費工作;principal 變了或來源房死了就拒絕。
- 造成者若是 client(社群媒體與 Agent 通道皆然),目的地
chatroom_id必須就是該 client 自己的聊天室 — worker 以SocialMediaClient.chatroom_id == 目的地房間查詢,查不到就整個觸發被拒。所以部門/公司範圍表格若把目的地指到別的房間,由 client 造成的寫入永遠不會產生 Sandbox run。 - Agent 通道的 client 不會被重對應成社群 Sandbox principal(那會記錯預算)。需要活著的 Agent delegate user(前一條的目的地房間限制通過後才做這個重對應)。
被拒的觸發記在 trigger run receipt 上;不會建立 Sandbox run。
Command 輸出版本
output_policy.kind 為 custom_table_command 的版本(任務輸出交給自訂表格 Command)是 trigger 唯一可以對準的 output_policy 種類。這種版本的規則是:
- **存檔時。**Action 的目的地
chatroom_id必須等於政策的chatroom_id(否則是actions上的設定錯誤),而且設定者與版本的撰寫者都要通過 Command 檢查(失敗時保留各自的 code,例如 403output_policy_author_denied)。 - **觸發時。**run 由 trigger 的撰寫者提交,不是造成寫入的 principal。Worker 會重新對 Command 檢查政策的房間、撰寫者與版本的撰寫者,而且撰寫者必須能在目的地房間
can_execute_manually該任務;失敗就是被拒的觸發(不會有 Sandbox run)。造成者不再需要能執行該任務,但仍必須讀得到來源列與被引用的欄位,同上。 - **輸入。**任務的輸入檔就是渲染後的
action.input物件——不會包在下面那個source/trigger/record/row信封裡——而 receipt 的input_digest就是這個物件的 digest。
前端該呈現什麼
- Trigger 編輯器:從編輯者能執行的房間裡挑已發布任務版本。隱藏/拒絕
requires_confirmation版本。 - 部門/公司表格必須明確填目的地
chatroom_id。 - 列寫入後,看 custom-tables 的 trigger-run receipt。成功長這樣:
{
"type": "submit_sandbox_job",
"ok": true,
"run_id": "...",
"trigger_run_id": "...",
"task_version_id": "...",
"input_digest": "sha256:…",
"run_status": "queued",
"submission_source": "custom_table_trigger"
}Worker 用的冪等鍵:ct-trigger:{trigger_run_id}:{action_id}。保留回顯的 action id,重試才能接同一張 receipt。
sandbox 看到的耐久 run input 不是整列原文。除了 Command 輸出的版本(見上),它是這個信封(只有你在 action.input 下列出的葉子;沒有整列、沒有 diff):
{
"source": "custom_table_trigger",
"trigger": { "run_id": "...", "trigger_id": "...", "action_id": "...", "event": "created|updated", "fired_at": "..." },
"record": { "table_id": "...", "record_id": "...", "record_version": 1 },
"row": { "order_id": "…" }
}設定走 custom-tables 的 trigger 路由(GET/PUT /private/module/custom_tables/{chatroom|department|company}/.../triggers),再 GET .../trigger-runs 與 POST .../trigger-runs/{id}/retry。那些路徑不在 /private/module/sandbox 底下。
- 在目的地聊天室用一般 執行 API 觀察:
GET /chatrooms/{destination_chatroom_id}/runs/{run_id}SandboxRunDetailResponse.submission_source 是 custom_table_trigger。可見性仍是 A-010:你看得到它,是因為你是造成者,或你管理目的地房間。Command 輸出的版本,run 的 principal 是 trigger 的撰寫者,所以不是該撰寫者的造成者,只有以 manager 身分(目的地房間、其部門或公司的 manager)才看得到。
- 輪詢
terminal_at。通知(run_terminal)仍不能取代 GET。
這不是什麼
- 不是 agent 確認。不要等
proposal_receipt。 - 不是繞過分享的後門。
can_execute_manually仍要 live 適用 share(或歷史上的擁有方聊天室任務)。這道閘不要求啟用/binding — 那個開關是給 Agent 選單的。目的地房間不必已啟用該任務。 - 不是 REST 提交。不要替 trigger 去
POST /runs;worker 會提交。
相關
- 執行與取回結果
- Agent toolkit — 需要確認的版本走另一條提交路
- 角色與權限