專家模型數
3
OpenAI · Google · Anthropic
主持人
1
Gemini 2.5 Flash 整合
JSON 欄位數
14
結構化裁決輸出
Token 上限 / 專家
4096
主持人 8192
速率限制
30
次 / 分鐘 / IP
歷史 Token 節省
~70%
D2 歷史壓縮決策
§01 請求流程

每一輪對話依序通過身份驗證與速率限制,並行呼叫三個模型,由主持人整合後存入資料庫並回傳。

用戶端
發送請求
POST /api/v1/llm-council/sessions/:id/turns
Cloudflare Worker
身份驗證 + 速率限制
HMAC Session Token · RL_COUNCIL_TURN 30次/分
Cloudflare AI Gateway
統一計費路由
CF_AIG_TOKEN · cf-aig-authorization
專家一 · OpenAI
GPT-5-mini
max_completion_tokens · temp 1
專家二 · Google
Gemini 3.1 Pro
max_tokens 4096 · temp 0.2
專家三 · Anthropic
Claude Sonnet 4.6
max_tokens 4096 · temp 0.2
主持人
Gemini 2.5 Flash
max_tokens 8192 · 整合輸出 14 欄 JSON
Supabase PostgreSQL
council_turns 資料表
INSERT … ON CONFLICT DO NOTHING
回傳用戶端
JSON 回應
composed_answer + expert_opinions[]
§02 三位專家模型

每位專家接收相同問題與對話歷史,從各自專業角度獨立分析。三者以 Promise.all() 並行執行——整體延遲等於最慢那位,而非三者累加。

專家一 · OpenAI

GPT-5-mini

openai/gpt-5-mini
  • 程序正義與正當程序分析
  • 《移民法 1958》條文解釋
  • 管轄錯誤識別
  • 聯邦法院覆核途徑
  • 具約束力先例引用與權重
max_completion_tokens: 4096
temperature: 1 ← 推理模型專用
專家二 · Google

Gemini 3.1 Pro

google-ai-studio/gemini-3.1-pro-preview
  • 難民法與國際保護標準
  • 國別信息與可信度評估
  • 《難民公約》五項理由分析
  • 補充保護途徑
  • 難民身份甄別程序公正性
max_tokens: 4096
temperature: 0.2
專家三 · Anthropic

Claude Sonnet 4.6

anthropic/claude-sonnet-4-6
  • 簽證子類別資格與標準對應
  • AAT / ART 裁判所覆核管轄
  • 品格與健康要求分析
  • 實質性覆核成功因素
  • 代理策略建議
max_tokens: 4096
temperature: 0.2
§03 主持人輸出 Schema

Gemini 2.5 Flash 閱讀三位專家的完整回應與對話歷程後,輸出嚴格的 14 欄位 JSON。主持人負責解決分歧、標示不確定性,並引用最強論據。

moderator_output — council_turns.moderator_output (jsonb) — 最大 8192 tokens
"composed_answer"string對用戶問題的主要整合回答
"outcome_prediction"enum stringlikely_success | likely_failure | uncertain
"confidence_score"number 0–1主持人對整合回答的信心指數
"key_legal_issues"string[]本案涉及的核心法律問題清單
"risk_factors"string[]可能削弱申請人案件的因素
"positive_factors"string[]有利於申請人立場的因素
"recommended_actions"string[]申請人具體可行的下一步行動
"relevant_visa_subclasses"string[]適用的簽證子類別(如 866、785、790)
"case_precedents"string[]各專家分析中引用的相關判例
"expert_consensus"enum stringfull(完全一致)| partial | disputed(有分歧)
"dissenting_views"string專家意見分歧摘要(若有)
"urgency_level"enum stringcritical | high | medium | low
"disclaimer"string標準免責聲明:本分析非法律建議
"follow_up_questions"string[]釐清案情所需的追問問題
§04 對話歷史注入 — 設計決策 D2

buildHistoryMessages(prevTurns) 將每輪主持人的 composed_answer 作為 role: "assistant" 注入,而非重複三份原始輸出。多輪對話 Token 成本壓低約 70%。

每位專家看到的是交替出現的 user / assistant 對話,上下文完整,Token 消耗最小。

第一輪 · role: user
我申請保護簽證的勝算如何?
第一輪 · role: assistant(主持人 composed_answer)
根據您的 AATA 案件歷程,保護簽證前景取決於… 【三位專家整合結果,非任一原文】
第二輪 · role: user(當前輪次)
如果我同時主張補充保護途徑呢?
為何 D2 至關重要:若將三位專家原始輸出全部注入,每輪歷史 Token 達 3 倍。D2 以單一主持人摘要取代,效果等同,成本降至 1/3。
// workers/llm-council/runner.js function buildHistoryMessages(prevTurns) { const msgs = []; for (const turn of prevTurns) { msgs.push({ role: "user", content: turn.user_message }); if (turn.moderator_output?.composed_answer) { msgs.push({ role: "assistant", // 僅注入主持人摘要,非三份原始輸出 content: turn.moderator_output.composed_answer }); } } return msgs; } // 三位專家並行,延遲 = max(e1, e2, e3) const [e1, e2, e3] = await Promise.all([ runExpert(env, EXPERT_1_MODEL, EXPERT_1_SYSTEM, historyMsgs, userMsg), runExpert(env, EXPERT_2_MODEL, EXPERT_2_SYSTEM, historyMsgs, userMsg), runExpert(env, EXPERT_3_MODEL, EXPERT_3_SYSTEM, historyMsgs, userMsg), ]); // 主持人整合三方輸出 → 14 欄 JSON const result = await runModerator( env, e1, e2, e3, historyMsgs, userMsg );
§05 API 端點

六個 Worker 原生端點。會話繫結的路由需在標頭帶入 X-Session-Token,驗證為單次 HMAC 計算,無需查詢資料庫。

POST/api/v1/llm-council/sessions
建立新議會會話,回傳 session_id 與 HMAC Token。可傳入 case_id 預先載入案件上下文。
驗證: JWT Bearer(Telegram 登入)
POST/api/v1/llm-council/sessions/:id/turns
新增一輪提問,觸發完整三專家 + 主持人流程。透過 RL_COUNCIL_TURN 限流(每 IP 30 次/分)。
驗證: X-Session-Token
GET/api/v1/llm-council/sessions/:id
取得完整會話及所有輪次,含每一輪三位專家意見與主持人輸出。
驗證: X-Session-Token
GET/api/v1/llm-council/sessions
列出當前用戶所有會話,回傳 id、建立時間、輪次數量、最後訊息摘要。
驗證: JWT Bearer
DELETE/api/v1/llm-council/sessions/:id
刪除指定會話,透過 Supabase RLS 策略串聯刪除對應 council_turns 記錄。
驗證: X-Session-Token
POST/api/v1/llm-council/run舊版
無狀態單輪分析,不儲存會話。保留以維持舊版前端相容性,新程式碼應改用 sessions API。
驗證: JWT Bearer
§06 六項設計決策

每個決策都源自具體約束——延遲、Token 成本、計費複雜度或安全性。非拍腦袋,而是 trade-off 後的閉環結論。

D1 · 效能
三位專家同時並行,不排隊
所有專家呼叫包在單一 Promise.all()。整體延遲等於最慢單一模型,非三者累加。序列執行下,GPT-5-mini 長提示詞單次就可能耗費 8–12 秒。
p95 輪次延遲 ~15s vs 序列 ~40s
D2 · 架構
只注入主持人摘要,不注入三份原始輸出
每輪歷史只將主持人的 composed_answer 作為 role: "assistant" 注入,三份輸出壓縮為一份摘要,Token 消耗降至原本的 1/3。
多輪對話 Token 節省約 70%
D3 · 營運
所有模型經 Cloudflare AI Gateway,單一 Token
單一 CF_AIG_TOKEN 認證 OpenAI、Anthropic、Google AI Studio。帳單在同一 Dashboard,Worker Secrets 內不儲存任何 per-provider API Key。
供應商前綴:openai/ · anthropic/ · google-ai-studio/
D4 · 相容性
GPT-5 / o 系列模型使用不同 API 參數
isGpt5ReasoningModel() 檢查模型名稱。若符合,改用 max_completion_tokens 並強制 temperature: 1。OpenAI 推理模型收到非 1 的溫度值直接回傳 HTTP 400。
偵測條件:模型名含 "gpt-5"、"o1"、"o3"、"o4"
D5 · 可靠性
ON CONFLICT DO NOTHING 確保重試安全
addTurn() 在昂貴的 LLM 呼叫前先以 nanoid21 分配主鍵,再以 INSERT … ON CONFLICT DO NOTHING 寫入。Worker 超時重試時,重複主鍵不會產生重複記錄。
ID 在 LLM 呼叫前預先分配,天然具備重試安全性
D6 · 安全
HMAC Token 取代 JWT 用於輪次驗證
會話 Token:nanoid(21) + "." + HMAC-SHA256(id, secret)。驗證僅需一次 HMAC 計算,無需查詢 Supabase。用戶 JWT 只在建立會話時需要,後續輪次改用更輕量的 Session Token。
驗證成本:1 次 HMAC,無資料庫來回