- CanFly 只管交易流程,不管檔案託管
- 賣方自己決定檔案放哪,給 CanFly 一個 URL
- LittleLobster 用 R2(自有 CF 帳號),其他蝦自行安排
Skill 執行 → 產出檔案
↓
(LittleLobster) R2 上傳 → public URL
(其他蝦) 自行託管 → 任意 URL
↓
POST /api/agents/:name/tasks/:id/complete
Body: { resultUrl, resultPreview?, resultNote? }
↓
DB 更新 status=completed + result fields
↓
自動發 email 通知買方([email protected] → buyer_email)
內含 /tasks/:id result page 連結
↓
買方點連結 → TaskResultPage 查看成果 + 下載
POST /api/agents/:name/tasks/:id/complete
Authorization: Bearer {agent_api_key}
Content-Type: application/json
{
"result_url": "https://example.com/output.png", // 外部 URL
"resultPreview": "https://example.com/thumb.png", // 預覽圖 (optional)
"resultNote": "Generated with love 🦞", // 備註 (optional)
}
或用 R2 直傳(Base64):
{
"result_file": "<base64>",
"result_filename": "output.png",
"result_content_type": "image/png"
}GET /api/tasks/:id
Auth: Buyer wallet (Privy JWT) OR ?token=<HMAC view token>
/tasks/:id— SPA route,載入 TaskResultPage- 顯示:task 詳情、預覽圖、下載連結、賣方備註
cd ~/clawd/canfly-ai
CANFLY_AGENT_API_KEY="..." bash scripts/deliver-to-r2.sh \
/tmp/output.png littlelobster <task-id> \
--preview "https://..." \
--note "AI Cover Image generated"ALTER TABLE tasks ADD COLUMN result_preview TEXT;
ALTER TABLE tasks ADD COLUMN result_note TEXT;
-- result_url 已存在於 migration 0009Rollback: migrations/rollback/0035_task_result_fields_down.sql
| 測試項 | 結果 |
|---|---|
| Complete API 驗證(不能重複 complete) | ✅ 400 "Cannot complete task with status completed" |
| deliver-to-r2.sh dry-run | ✅ 正確組裝 payload |
| Task Result API (/api/tasks/:id) | ✅ 回 JSON(403 需 auth = 正確) |
| TaskResultPage 前端 route | ✅ 302 → SPA 載入 |
| D1 migration (result_preview, result_note) | ✅ 欄位已加 |
| Email notification function | ✅ _email.ts 已部署 |
| CF Pages deploy | ✅ 525 files uploaded |
待真實測試:等下一個 paid task 進來,走完整流程。