Communitygithub.com

VSS Summarize 影片摘要

透過 VSS Pipeline Manager 啟動摘要管道,輪詢直到完成,並取回最終摘要。適用於使用者要求「摘要這部影片」、「建立摘要」或「這部影片發生什麼事」(針對已匯入的影片)。需要支援摘要功能的部署(--summary、--dual 或 --unified)。

VSS Summarize 影片摘要 是什麼?

此技能透過 Pipeline Manager 的 REST API,驅動影片摘要管道的完整生命週期。它首先透過內建腳本引導使用者找到並設定 VSS 應用程式根目錄,支援使用現有目錄或只進行淺層稀疏複製。接著,技能會驗證後端健康狀態及摘要功能是否啟用,並在必要時匯入影片以取得 videoId。然後,它會使用 POST /manager/summary 提交一個包含必要欄位(title、videoId、sampling、evam)的摘要請求,並取得 summaryPipelineId。關鍵的輪詢邏輯會監控 videoSummaryStatus 直到變為「complete」,而非檢查 summary 文字是否為空,因為文字是逐步串流傳入的。最後,技能會從 /manager/summary/{stateId} 取回最終摘要,並可選擇性地提供每段畫面的細節。此技能也包含一個「最終回答稽核軌跡」,要求在所有報告中透明地揭露引導結果、所使用的端點及觀察到的回應,即使遇到前置條件失敗的情況也是如此。此技能適用於 Claude Code、Cursor 及支援 REST API 呼叫的通用 AI 代理平台。

相容平台~Claude Code~Codex CLI~Cursor
npx skills add https://github.com/open-edge-platform/skills/tree/HEAD/.agents/skills/vss-summarize-video

在你喜歡的 AI 中提問

開啟一個已預先載入此 Agent Skill 的新對話。

說明文件

VSS Summarize 影片摘要 是做什麼的?

透過 Pipeline Manager 執行摘要管道。請自行呼叫文件中說明的 API 並僅回報觀察到的回應。端點使用 nginx 的 /manager 前綴。當 vss_* MCP 工具連線時,vss_summarize_video 會涵蓋相同的工作;此技能是 REST 路由。

設定 HOST=http://${HOST_IP:-localhost}:${APP_HOST_PORT:-12345}。

當 VSS 無法連線時的回答合約

使用者可能已離開部署環境,$HOST 可能拒絕連線,或即時前置條件可能失敗(例如,摘要模式已停用或指定的影片不存在)。在任何這些情況下,請勿停滯不前,也請勿憑空編造回應。 請回報觀察到的障礙,然後回答使用者可在修正問題後執行的完整確切呼叫序列:完整的端點路徑、請求內文/表單欄位、每個步驟從前一個回應攜帶過來的欄位,以及指示步驟完成的條件。請勿因為摘要流程無法執行而簡化或省略所要求的摘要流程。清楚說明哪些指令未被執行。回答結尾請勿詢問使用者是否要執行這些指令。

環境設定(優先執行)

此技能透過實際的原始碼檔案驅動影片搜尋與摘要應用程式,因此 VSS 應用程式必須存在,且您必須從其應用程式根目錄執行指令。請在任何其他操作之前執行此步驟,無論 VSS 原始碼是否已存在於您的工作區中,此步驟都能正常運作。

執行隨附的引導腳本。它會依序解析應用程式根目錄,並將其作為 stdout 的唯一一行輸出:

  1. 從目前目錄向上遍歷,尋找帶有 setup.sh、docker/ 和 pipeline-manager/ 三個標記的 VSS 應用程式根目錄。
  2. 向 git 詢問所在的儲存庫(git rev-parse --show-toplevel),並檢查它是否包含 sample-applications/video-search-and-summarization,或者它本身就是 VSS 應用程式根目錄。這可讓您自己的複本(或分支)無需修改即可直接使用。
  3. 重複使用先前引導腳本已放置的檢出,位於 ${XDG_CACHE_HOME:-$HOME/.cache}/vss-src/edge-ai-libraries。

如果任何一項命中,該檢出將被重複使用,且不會執行複製。僅在所有三項都未命中時,腳本才會執行複製——而且只會進行淺層(--depth 1)、單一分支、稀疏的檢出,只從 main 分支擷取 sample-applications/video-search-and-summarization:

# SKILL_DIR 是此技能自己的目錄(當技能載入時會顯示給您);
# 在儲存庫中為 .github/skills/vss-summarize-video。如果技能是獨立安裝的,運作方式相同。
SKILL_DIR=".github/skills/vss-summarize-video"
APP_ROOT="$(bash "$SKILL_DIR/scripts/vss-bootstrap.sh")"
cd "$APP_ROOT"

以下每個指令都假設工作目錄是此 APP_ROOT。若要從分支/分叉拉取,或重複使用特定的檢出目錄,請在執行前覆寫 VSS_REPO_URL、VSS_REPO_BRANCH 或 VSS_CLONE_DIR。引導腳本拒絕覆寫現有的非 VSS 複製目標。

前置條件

  1. 後端健康且摘要功能已啟用 – 先進行探測;若未啟用,請依名稱使用已安裝的 vss-troubleshoot 或 vss-deploy 技能:
    curl -sf "$HOST/manager/health" >/dev/null && \
    curl -s "$HOST/manager/app/features" | jq -e '(.summary // .) == "FEATURE_ON"'
    
  2. 一個要摘要的 videoId – 使用 POST /manager/videos(multipart,欄位 video)上傳一個,它會回傳 { "videoId": "…" }。或列出現有的 – 請注意,回應是一個物件 { "videos": [...] },不是裸陣列,且 name 是產生的雜湊值(實際檔案名稱在 url / dataStore.fileName 中):
    curl -s -X POST "$HOST/manager/videos" -F "video=@/path/to/clip.mp4" | jq .
    curl -s "$HOST/manager/videos" | jq '.videos[] | {videoId, file: .dataStore.fileName}'
    

1. 啟動摘要管道

POST /manager/summary。請求內文含有必要欄位;缺少 title、sampling.* 或 evam.evamPipeline 中的任何一個都會回傳 400。請參閱 references/summary-request.md 以了解完整綱要、提示覆寫及音訊選項。

最小有效請求:

curl -s -X POST "$HOST/manager/summary" \
  -H 'Content-Type: application/json' \
  -d '{
    "title": "Loading dock review",
    "videoId": "<VIDEO_ID>",
    "sampling": { "chunkDuration": 20, "samplingFrame": 5, "frameOverlap": 0, "multiFrame": 5 },
    "evam": { "evamPipeline": "object_detection" },
    "produceFinalSummary": true
  }' | jq .
# → { "summaryPipelineId": "<STATE_ID>" }

取樣限制: Pipeline Manager 強制要求 multiFrame == frameOverlap + samplingFrame。當 frameOverlap: 0 時,設定 multiFrame == samplingFrame。不符會導致 400「Multi frame mismatch」。 evamPipeline 可以是 object_detection | video_ingestion 之一。

若只想摘要影片的一部分,可加入選用的 sampling.videoStart 和 sampling.videoEnd(秒數)—— 例如前十分鐘為 "videoStart": 0, "videoEnd": 600。

2. 輪詢直到完成

回傳的 summaryPipelineId 就是 stateId。GET /manager/summary/{stateId} 沒有頂層的 status/progress 欄位(只有 /raw 有)—— 進度存在於各階段的欄位中:

STATE_ID=<STATE_ID>
curl -s "$HOST/manager/summary/$STATE_ID" | jq '{
  chunking: .chunkingStatus,         # 字串,完成時為 "complete"
  frames:   .frameSummaryStatus,     # COUNTS 物件:{complete, inProgress, na, ready}
  video:    .videoSummaryStatus,     # 字串:"na" → "inProgress" → "complete"  ← 真正的完成訊號
  audio:    .audioTranscriptSummaryStatus,
  summary_len: (.summary | length)
}'

⚠️ 完成條件是 videoSummaryStatus == "complete",而非 summary 非空。 最終的 summary 文字在 videoSummaryStatus 仍為 "inProgress" 時會逐步串流傳入,因此輪詢「summary 長度 > 0」會回傳一個截斷且不完整的結果。請始終以 videoSummaryStatus 為條件。當 produceFinalSummary: false 時,沒有最終階段 – 改以 frameSummaryStatus.inProgress == 0 為條件。

until curl -s "$HOST/manager/summary/$STATE_ID" \
       | jq -e '.videoSummaryStatus == "complete"' >/dev/null; do sleep 10; done

摘要速度較慢(每個片段執行 VLM + LLM 映射歸納)—— 需要數分鐘而非數秒。

3. 取回摘要

curl -s "$HOST/manager/summary/$STATE_ID" | jq -r '.summary'   # 最終的映射歸納摘要
# 每個片段的字幕存在於 .frameSummaries[] 中(每個元素有:frameKey、status、summary)。
# 不在 .chunks[] 中 – 那些只包含 {chunkId, duration, audioTranscripts}:
curl -s "$HOST/manager/summary/$STATE_ID" | jq -r '.frameSummaries[] | "[\(.frameKey)] \(.summary)"'
curl -s "$HOST/manager/summary/$STATE_ID/raw" | jq .   # 所有資料(音訊、畫面、狀態……)

呈現最終摘要文字;若有必要,可提供每個片段的詳細資訊。沒有語音的純音訊,其 audioTranscriptSummary 會說明此狀況——並非錯誤。

最終回答稽核軌跡

工具引數可能對使用者或評估者不可見。因此最終回答必須報告引導結果:解析出的 APP_ROOT、是否重複使用現有檢出而未進行複製,以及指令是在切換到該應用程式根目錄後執行的。同時也必須說明,若引導完全失敗,則會退回進行淺層(--depth 1)、單一分支、稀疏的檢出,只從 main 分支擷取 VSS 應用程式。報告觀察到的 /manager/health 和摘要功能值。

對於摘要工作流程,請列出所使用的每個公開 Manager 操作(方法和 /manager/... 路徑)、重要的請求欄位、觀察到的回應,以及從 summaryPipelineId 到 STATE_ID 的承接關係。當前置條件阻止執行時,請清楚區分已觀察到的探測和未執行的指令,但仍需顯示確切的有效請求、完成條件和取回步驟,而無須憑空編造 ID 或摘要內容。

管理

curl -s "$HOST/manager/summary" | jq '.[] | {stateId, title}'   # 列出所有
curl -s -X DELETE "$HOST/manager/summary/$STATE_ID"             # 刪除一個

相關技能