重新生成摘要 SSE
連線資訊
| 項目 | 值 |
|---|---|
| 基礎路徑 | https://vas-poc.vurbo.ai/api/v1/sse |
| 協定 | HTTP + Server-Sent Events (SSE) |
| 資料格式 | text/event-stream |
| 認證方式 | Header X-API-Key: {KEY},或 Query ?api_key={KEY}(兩者皆可,Query 優先) |
注意:瀏覽器原生 EventSource API 不支援自訂 Header,需使用 fetch API 搭配 ReadableStream,或使用支援 Header 的 SSE 客戶端套件。
端點總覽
拆成預覽 / 存檔兩個端點:
| 方法 | 端點 | 是否保存結果 | 儲存逐字稿 | 計費 | 用途 |
|---|---|---|---|---|---|
| GET | /api/v1/sse/regenerate/summary/{taskId} | 否 | 否 | 是 | 預覽(試跑、比較不同 prompt 結果) |
| POST | /api/v1/sse/regenerate/summary/{taskId} | 是 | 是(並遞增 revision) | 是 | 存檔(正式儲存) |
已知限制:GET 預覽仍會計費 — LLM 真實消耗 token,不能讓 GET 端點白嫖。重複呼叫 GET 會重複計費,但不會改變後端儲存狀態。
共用:請求參數
GET 走 query string、POST 走 JSON body,欄位名與型別相同:
| 參數 | 類型 | 必填 | 限制 | 說明 |
|---|---|---|---|---|
taskId (path) | string | 是 | UUID | 錄音 ID |
mode | string | 是 | enum "builtin" | "custom" | 顯式路徑選擇 |
template | string | builtin 必填 / custom 禁帶 | exists prompt_templates.slug | 內建模板 slug |
prompt | string | custom 必填 / builtin 禁帶 | ≤3000 字元 | 客戶完整 prompt(完整取代內建模板) |
promptSlug | string | custom 必填 / builtin 禁帶 | ≤64 字元、Unicode、禁控制字元 | 客戶自訂識別碼(原樣回傳,不另做處理) |
language | string | 否 | - | 摘要輸出語言代碼(如 zh-TW、en-US),未指定時使用 transcription 第一個語言 |
plainText | boolean | 否 | 預設 false | 要求純文字輸出(後端會額外做 markdown 後處理) |
互斥規則:
mode=builtin下不可帶prompt或promptSlugmode=custom下不可帶template,但prompt與promptSlug必填
違反 → 參數驗證失敗(error 事件,data 只有 message、不含 error_code)
GET /api/v1/sse/regenerate/summary/{taskId}(預覽)
功能說明
跑一次 LLM 重新生成摘要,僅串流回客戶端,不保存結果、不更新逐字稿記錄。
適用情境:客戶端想嘗試不同 prompt / 不同 plain_text 設定,比較結果後再決定是否存檔。
請求範例
builtin mode
curl -N "https://vas-poc.vurbo.ai/api/v1/sse/regenerate/summary/550e8400-e29b-41d4-a716-446655440000?mode=builtin&template=meeting&language=zh-TW&plainText=true" \
-H "X-API-Key: vas_aB3dE5fG7hI9jK1lM3nO5pQ7rS9tU1vW"
custom mode
curl -N "https://vas-poc.vurbo.ai/api/v1/sse/regenerate/summary/550e8400-e29b-41d4-a716-446655440000?mode=custom&prompt=%E8%AB%8B%E5%BC%B7%E8%AA%BFKPI&promptSlug=acme-meeting-v2&plainText=true" \
-H "X-API-Key: vas_aB3dE5fG7hI9jK1lM3nO5pQ7rS9tU1vW"
副作用
- 會產生一筆摘要計費(LLM 真實消耗 token)
- 不會更新
recordings.summary_mode/summary_template/summary_prompt_slug三欄 - 不會覆寫已儲存的摘要
POST /api/v1/sse/regenerate/summary/{taskId}(存檔)
功能說明
GET 預覽的所有動作 + 寫入 DB 與逐字稿記錄。
請求範例
builtin mode
curl -N -X POST "https://vas-poc.vurbo.ai/api/v1/sse/regenerate/summary/550e8400-e29b-41d4-a716-446655440000" \
-H "X-API-Key: vas_..." \
-H "Content-Type: application/json" \
-d '{
"mode": "builtin",
"template": "meeting",
"language": "zh-TW",
"plainText": true
}'
custom mode
curl -N -X POST "https://vas-poc.vurbo.ai/api/v1/sse/regenerate/summary/550e8400-e29b-41d4-a716-446655440000" \
-H "X-API-Key: vas_..." \
-H "Content-Type: application/json" \
-d '{
"mode": "custom",
"prompt": "你是皮膚科專科助手。請從逐字稿萃取 Fitzpatrick 分型...",
"promptSlug": "skin-clinic-acme-v2",
"language": "zh-TW",
"plainText": true
}'
副作用
- 會產生一筆摘要計費
- 依 mode 互斥寫入
recordings三欄:- builtin →
summary_mode='builtin'、summary_template=<slug>、summary_prompt_slug=NULL - custom →
summary_mode='custom'、summary_template=NULL、summary_prompt_slug=<客戶 slug>
- builtin →
- 更新任務的摘要語言:任務列表與歷史紀錄
init_metadata的summary_language會隨之改為本次使用的語言 - 更新逐字稿記錄的 top-level 欄位並
revision += 1:summary(純字串)、summary_language、summary_mode、summary_template(effective slug)、summary_plain_text- custom mode 強制
summary_prompt_snapshot(客戶 prompt 原樣 snapshot,是唯一重建依據)
事件序列(兩端點相同)
1. connected → 連線確認
2. summary_regeneration → 發送摘要片段(重複 N 次,累積式)
3. done → 生成完成
或
3. error → 生成失敗(sse_summary_regeneration_failed,兩個端點都可能出現;
不儲存、不計費,**不會**送出 done)
或
3. error → 儲存失敗或同時有其他寫入(storage_upload_failed/
transcript_revision_conflict,流程中止、**不會**送出 done)
儲存失敗或同時有其他寫入的
error只會出現在儲存端點(POST)。預覽端點(GET)不寫入逐字稿,不會走到這條分支。
connected
{
"message": "Summary regeneration stream connected (taskId: 550e8400-..., mode: custom, endpoint: preview)"
}
注意:避免混淆:message 中的
mode是摘要模式(builtin/custom,即 request 帶入的 mode);endpoint才是端點模式(previewGET /persistPOST)。兩者語義不同,請勿混為一談。
summary_regeneration
{ "text": "本次會議討論了以下議題:\n1. 產品開發進度", "is_final": false }
| 欄位 | 類型 | 說明 |
|---|---|---|
text | string | 累積的摘要內容(plainText=true 時 is_final=true 的 text 為清洗後純文字) |
is_final | boolean | 是否為最終結果 |
done
{
"task_id": "550e8400-e29b-41d4-a716-446655440000",
"tokens_used": 123,
"final_content": "本次會議...(清洗後完整內容)",
"mode": "custom",
"template": "skin-clinic-acme-v2",
"plain_text": true,
"persisted": true,
"summary_language": "zh-TW",
"characters_billed": 12700,
"charged": "1.3",
"billed": true,
"prompt_snapshot": "你是皮膚科專科助手..."
}
| 欄位 | 類型 | 說明 |
|---|---|---|
task_id | string | Recording UUID |
tokens_used | number | 總 token 用量 |
final_content | string | 完整摘要內容(plainText=true 時為清洗後純文字) |
mode | string | 摘要模式:"builtin" 或 "custom" |
template | string | effective slug — builtin → 內建模板 slug;custom → 客戶 slug |
plain_text | boolean | 是否啟用純文字模式 |
persisted | boolean | 本次摘要是否已正式儲存(GET 為 false、POST 為 true) |
summary_language | string | 本次摘要實際使用的語言(BCP 47)。有帶 language 時為該值,未帶時為第一個轉錄語言。預覽(GET)與儲存(POST)都會帶,一定有值(v1.16.5 新增) |
characters_billed | number | 本次計費依據的字元數 |
charged | string | 本次操作依費率計算的消耗點數。此值反映用量:吃到飽方案已涵蓋的用量,此欄位仍回報消耗量 |
billed | boolean | 本次是否產生消耗,恆為 true(未產生消耗時三個欄位皆不出現) |
prompt_snapshot | string | 僅 custom mode 出現,為客戶原樣傳入的 prompt 內容(強制 snapshot,是唯一重建依據) |
truncated | boolean | 僅在摘要未能完整產出時出現(值恆為 true)。摘要完整時此欄位完全不存在。出現時代表 final_content 並非完整的摘要:摘要長度達到輸出上限,或生成時間達到處理時間上限(只回傳已完成的部分)。兩者都照常計費,儲存端點(POST)也會儲存這份不完整的摘要 |
計費欄位:
characters_billed、charged、billed三欄僅在本次實際產生消耗時出現。 未產生消耗時(例如生成失敗)三欄皆不出現。判斷是否計費請以billed為準 (billed為true才是計費)——此判準適用所有帶計費欄位的端點,不需為個別端點寫例外。 代呼叫並向終端用戶計價的整合方,可直接採用charged而不必自行推算。 預覽(GET)與儲存(POST)都會計費,兩者的done皆帶計費欄位。 生成失敗(sse_summary_regeneration_failed),或儲存端點因儲存失敗而送出error(見「事件序列」第 3 步),該次不計費、也不會有done。
特有錯誤碼
| 錯誤碼 | HTTP | 說明 | 處理建議 |
|---|---|---|---|
recording_not_found | 404 | 找不到指定的錄音 | 確認 taskId 正確 |
sse_template_not_found | 404 | 模板存在但已停用(builtin mode) | 改用其他模板 |
sse_transcript_not_found | 404 | 找不到逐字稿 | 錄音可能尚未處理完成 |
summary_text_empty | 400 | 逐字稿沒有可摘要內容 | 錄音內容過短或皆為靜音 |
summary_text_too_long | 400 | 逐字稿超過長度上限(200,000 字元) | 縮短錄音或拆分檔案 |
sse_summary_regeneration_failed | 500 | 摘要重新生成失敗(回應不含內部錯誤細節)。串流中途停住或沒有正常結束也回此碼;這次不儲存、不計費,之前收到的 summary_regeneration 片段不是完整結果,請捨棄 | 稍後重試 |
transcript_revision_conflict | 409 | 同一份逐字稿正有其他寫入在進行(僅儲存端點) | 本次摘要未儲存、不計費;稍後重試即可。收到此碼後不會再收到 done |
storage_upload_failed | 500 | 逐字稿寫回儲存服務失敗(僅儲存端點) | 本次摘要未儲存、不計費;稍後重試。收到此碼後不會再收到 done |
auth_insufficient_credit | 402 | 點數不足 | 這是串流開始前的真 HTTP 402 JSON 回應,不是 SSE 事件;儲值後再試 |
stt_quota_exceeded | 402 | 可用點數不足以支付本次預估消耗 | 同為串流開始前的 JSON 回應;儲值後再試 |
參數驗證失敗沒有錯誤碼。
mode不合法、欄位組合不符、prompt或promptSlug超長/含控制字元等,都在參數驗證階段被擋下,回應是error事件但data只有message一欄、不含error_code。請以message呈現給使用者,不要嘗試比對錯誤碼。
template的 slug 不存在也屬於參數驗證失敗(message為The specified summary template does not exist),不會回 422、也沒有錯誤碼。
內容過濾 — SSE 端的當前狀態:
即時錄音摘要與檔案匯入摘要已支援內容過濾自動降級(標準模式 → 中性模式 → 段落省略模式),被擋時會自動產出簡化摘要。但本端點(SSE
regenerate/summary)尚未支援——觸發內容過濾時本端點一律回sse_summary_regeneration_failed,回應不會區分「被過濾」與其他生成失敗。後續版本將支援自動降級,並於
doneevent 擴充fallback_level/dropped_segments欄位。在此之前,若重試仍失敗,請調整 prompt 或逐字稿內容。
版本:V1.24.1 最後更新:2026-09-28