AI 整合 · Agent Skill

🦞 龍蝦圖片辨識 Skill

將 Coze 圖片辨識工作流封裝為 OpenClaw Agent Skill,從 API 探索到自動化調用的完整開發實錄。

使用的技術

Coze Workflow APIOpenClaw Agent SkillBash ScriptingSSE Stream ParsingFile Upload APIPythonJSON

🎯 為什麼做這個

在 OpenClaw Agent 上工作時,需要一個能自動辨識圖片內容的工具。Coze(扣子)平台提供了一個圖片辨識工作流, 但要讓 Agent 能直接調用它,需要把 API 封裝成一個標準的 Skill。這篇文章記錄了從零到完成的全過程。

🧩 Coze 工作流設計

在 Coze(扣子)平台上建立了一個名為「picture」的圖片辨識工作流, 由三個節點組成:開始 → 大模型 → 結束。使用「豆包·2.0·lite」模型, 透過視覺理解能力分析圖片並輸出結構化辨識結果。

Coze 工作流總覽:開始 → 大模型 → 結束

圖 1:工作流總覽 — 開始(input + image)→ 大模型(豆包·2.0·lite)→ 結束

大模型節點設定:輸入綁定與系統提示詞

圖 2:大模型節點 — 輸入綁定(input + image)與系統提示詞

系統提示詞設計

🎭 角色定義

你是圖片辨識助手,專注於精準理解圖片內容,為使用者提供清晰的辨識結果。

⚡ 核心技能

圖片辨識 — 當使用者上傳圖片並請求辨識內容時觸發。

📋 操作步驟
  1. 接收使用者上傳圖片
  2. 調用圖像辨識工具分析
  3. 結構化輸出辨識結果
系統提示詞詳細設定

圖 3:系統提示詞 — 視覺理解輸入綁定與回覆格式

發布與操作選單

圖 4:發布選單 — API、Playground、導出

API 調試頁面

圖 5:API 調試 — stream_run 調用範例

🏗️ 整體架構設計

┌─────────────┐     ┌──────────────┐     ┌─────────────────┐
│  使用者傳圖  │────▶│  OpenClaw     │────▶│  Coze Workflow   │
│  (Telegram)  │     │  Agent Skill  │     │  (圖片辨識)       │
└─────────────┘     └──────┬───────┘     └────────┬────────┘
                           │                      │
                    ┌──────▼───────┐       ┌──────▼────────┐
                    │ 本地檔案?    │       │  SSE Stream    │
                    │ → 先上傳     │       │  解析輸出      │
                    │ URL?        │       └───────────────┘
                    │ → 直接傳     │
                    └──────────────┘

📝 開發過程

第一步:API 探索 — 哪個 Endpoint 能用?

一開始用 /v1/workflow/run 不帶參數測試,成功收到回應「請上傳圖片」, 確認工作流存在且 token 有效。

# 第一次測試 — 確認連通性
curl -X POST 'https://api.coze.cn/v1/workflow/run' \
-H "Authorization: Bearer $TOKEN" \
-H "Content-Type: application/json" \
-d '{"workflow_id": "7644116961798045715"}'
# ✅ 回應:code 0, "請上傳需要識別的圖片"

第二步:踩坑 — parameters 帶 image 就 5000

嘗試在 parameters 裡直接傳"image": "https://...", 結果用 /v1/workflow/run 一直報 5000 錯誤。

後來才發現兩個關鍵問題:

🔑
用錯 API
要用 /v1/workflow/stream_run 而不是 /v1/workflow/run
🏷️
image 類型是 Coze Image
直接傳 URL string 給 stream_run 就行,不用特殊處理

第三步:本地檔案的問題 — Token 權限

工作流只接受 URL,但使用者從 Telegram 傳的圖片是本地檔案。解法是用 Coze 的/v1/files/upload API 先上傳,拿到file_id,再以特殊格式傳入:

# image 參數要用 JSON string 包 file_id
"image": "{\"file_id\": \"7644129594274054153\"}"

但一開始用的 token(cztei_ 開頭)沒有文件上傳權限,報 access token invalid。 需要到 Coze API 後台建立有文件上傳權限的 PAT(pat_ 開頭)才能上傳成功。

第四步:SSE Stream 解析

stream_run 回應是 SSE(Server-Sent Events)格式, 不是普通 JSON。需要解析事件流,找到 node_type: "End"Message 事件才算完成:

id: 0
event: Message
data: {"node_title":"End","node_type":"End",
       "node_is_finish":true,
       "content":"{\"output\":\"識別結果...\"}"}

id: 1
event: Done
data: {"debug_url":"..."}

第五步:Skill 封裝

最終封裝為 OpenClaw Agent Skill,目錄結構:

coze-image-recognition/
├── SKILL.md # Skill 定義與使用說明
└── scripts/
└── recognize.sh # 一鍵辨識腳本

腳本自動判斷輸入類型:

# 公開 URL → 直接傳
bash recognize.sh "https://example.com/photo.jpg"

# 本地檔案 → 先上傳再辨識
bash recognize.sh "/path/to/local/image.jpg"

# 加自訂提示
bash recognize.sh "/path/to/image.jpg" "請描述風格"

✨ 最終效果

在 Telegram 上直接發圖給 Agent,Agent 自動調用 Skill 辨識,幾秒內回傳結構化結果:

# 辨識結果範例
🧪 圖片識別結果:
- 🌐 識別類型:餐飲場景(簡餐食物)
- 🧩 核心元素:黑色塑料餐托盤、脆皮炸雞腿、
干拌方便面、烹製娃娃菜、...
- 📝 文字內容:小票可辨認文字「合計」「折」
- 🎨 風格特徵:暖自然色調,寫實日常餐食實拍

💣 踩坑總結

1
run vs stream_run
Coze 有兩個工作流 API。run 回傳普通 JSON 但傳 Image 類型會 5000;stream_run 用 SSE 但直接傳 URL string 就行。
2
Image 類型 ≠ String
Coze 工作流的 Image 類型變數在 run API 裡不能直接傳 URL string,但在 stream_run 裡可以。file_id 方式則兩者都支援。
3
Token 權限很重要
cztei_ 開頭的 token 可能只有工作流執行權限,上傳文件需要 pat_ 開頭的 PAT 並勾選文件上傳權限。
4
file_id 格式
上傳後拿到的 file_id 要包成 JSON string 傳入:"{\"file_id\": \"xxx\"}",不是直接傳 file_id 字串。