Skip to content

處理流程(P2-A / B / C)

觸發:每天 4 輪 09:00 / 13:00 / 17:00 / 21:00(cron 0 9,13,17,21 * * *檔案P2-A_v3_with_owner.json 職責:Genesys → GCS → HubSpot pending Call

#節點做什麼
1Schedule每天 4 輪(09/13/17/21:00)觸發
2Get Genesys TokenOAuth 取 access token
3Calculate Time Range算最近 25 小時區間(1500 分鐘)
4Query Conversations撈時間範圍內所有 conversation
5Filter > 5s過濾未接 / 誤撥
6Batch Dedup CheckIN batch search HubSpot,過濾已建 Call
7Get RecordingsSingle Shot 模式:1 次 fetch + AbortController 5s
8Skip if not ready沒拿到錄音 → skip + 下個 cron 重試
9Download ch0/ch1下載雙軌音檔
10Upload to GCSYYYY-MM-DD/HHMM_DIR_PHONE_CONVID/ch0.mp3
11Extract Call Info抽方向、電話、業務員 ID
12Map OwnerGenesys agent → HubSpot Owner ID
13Create HubSpot Callstatus = pending
  • Single Shot vs Polling:原 polling 設計(4 retry × 3 wait)對「HTTP 200 + empty body」會 hang 撞 60s task timeout,改 Single Shot + AbortController 5s + 下個 cron 自動補抓,所有失敗路徑統一為 skip + next cron
  • Batch Dedup:用 HubSpot Search IN batch 一次檢查 100 通,省 API quota
  • 時間窗 25 小時:涵蓋整天 + 1 小時 buffer,跨日通話不會漏

觸發:每天 4 輪 09:30 / 13:30 / 17:30 / 21:30(cron 30 9,13,17,21 * * *檔案P2-B_v3.1_transcribe_only.json 職責:呼叫 VM /transcribe → 寫 transcript_raw

#節點做什麼
1Schedule每天 4 輪(09/13/17/21:30)觸發
2Search Pending Calls撈 transcribe_status = pending(limit 50)
3Lock as TranscribingPATCH status = transcribing
4Get GCS URLs拿 ch0 / ch1 signed URLs
5Call /transcribePOST 到 VM endpoint(含 ffmpeg 切片)
6Merge Channels雙軌穿插時間排序
7Update HubSpot CallPATCH transcript_raw + status = transcribed
  • VM endpointhttp://35.221.152.147:8081/transcribe,自架避開 Whisper API 直接呼叫的延遲
  • ffmpeg chunkSeconds = 60:v3.1 從 300 改為 60,避免 Whisper 對長片段產生 hallucination
  • 並行 Whisper:ch0 / ch1 同時送 Whisper,2x 加速
  • 雙軌時間穿插格式[MM:SS speaker] text,給 P2-C 萃取用

觸發:每天 4 輪 10:00 / 14:00 / 18:00 / 22:00(cron 0 10,14,18,22 * * *檔案P2-C_v3_summarize_only.json 職責:OpenAI 摘要 → HubSpot Call + Contact

#節點做什麼
1Schedule觸發
2Search Transcribed Calls撈 transcribe_status = transcribed(limit 50)
3Extract Call Context抽方向、電話、normalize TW phone
4Lock as SummarizingPATCH status = summarizing
5Has Transcript?過濾未接通 / [UNANSWERED]
6OpenAI Summarizegpt-4o-mini + json_schema response format
7Parse OpenAI解析 JSON、防呆
8Build Call Update Body組 hs_call_body(5 點摘要 + 待辦 + 雙軌逐字稿)
9Update HubSpot CallPATCH summarized
10Search Contact by Phone4 種號碼格式 OR 查詢
11Contact Found?分支:找到→Update / 沒找到→Create
12Build Contact Patchfill-only-empty 邏輯
13Update / Create ContactPATCH or POST
14Associate Call ↔ ContactHubSpot v4 associations API
  • OpenAI response_format = json_schema:strict 模式保證結構化輸出,省 parse error
  • fill-only-empty:業務手寫資料永遠優先,AI 只補空白欄位
  • 4 種電話格式 OR 查詢:E.164、本地、mobilephone 等都查,提高 Contact 匹配率
  • multi-select 結帳方式:v3.2 新增「刷卡」選項
  • 意圖標籤嚴格 4 選 1:詢價 / 售後 / 抱怨 / 一般諮詢,AI 不自創

觸發:任一 workflow 失敗時自動呼叫 檔案P2-Error-Notifier_v2_2026-05-04.json

收到失敗 webhook → 整理錯誤訊息 → 寄 Email / LINE 通知 Ray,包含:

  • 失敗 workflow 名稱
  • 失敗 node
  • 錯誤訊息
  • HubSpot Call ID(如有)

限制上限目前用量Buffer
Executions / 月2,500~9096%
Workflow execution time60 分鐘~30 分鐘最壞50%
Code node task runner60 秒< 5 秒92%
HTTP Request timeout300 秒~3 秒99%
Concurrent workflow runs51(cron 錯開)80%
Active workflows155(A/B/C + P1 + Error)67%
HubSpot Search secondly5 req/10s1 req/cron80%
HubSpot daily call limit250,000~2,40099%

真正撞牆量級:5h 內 150+ 通真實接通(≈ 一天 600 通),屬 Phase 2 規模化議題。