AI 儀表板(AI Dashboard)
事實基準:2026-07-05 從 FE(
views/dynamic-dashboard/、composables/useDashboardGenerator.js)/ BE(api/ai_dashboard、app/ai_dashboard、infra/ai_dashboard)code 掃出;error code 對common/code/error_code.py;模型 ID 對infra/ai_dashboard/ai_client/claude_client.py
1. 功能描述
AI 儀表板讓使用者用自然語言 prompt 生成一份動態儀表板:後端跑五階段管線(AI 選資料 API → 取資料 → 統計 → AI 設計版面 → 組裝 JSON),前端渲染成 Ultima UI 元件並抽出圖表。生成結果 per-request、不落 DB(無專屬儀表板表)。
主要使用者:需快速視覺化 GRC 資料的人(全域工具,任何登入者皆可用)。
角色速覽:
| 角色 | 一句話 |
|---|---|
| 使用者 | 輸入 prompt 生成儀表板(auto-generate 需
JWT;health 免 JWT) |
1.1 功能總覽(本頁全部功能)
| # | 功能 | 說明 | 位置 | 詳述 |
|---|---|---|---|---|
| 1 | 後端健康檢查 | 進頁檢查生成服務可用性 → 狀態徽章 | PromptBar | UC-AID-01 |
| 2 | 自然語言 prompt | 輸入描述、按生成或 Enter | PromptBar | UC-AID-01 |
| 3 | 範本快速起手 | 內建範本(個人待辦事項儀表板)點擊帶入 prompt | Templates | §5 |
| 4 | 載入狀態 | 生成中進度條 + 重試次數 | LoadingState | §5 |
| 5 | 錯誤處理 | 錯誤訊息 + 建議 + 可重試時重試鈕 | ErrorMessage | UC-AID-01 |
| 6 | 生成儀表板渲染 | DynamicPrimeComponent 渲染 Ultima 結構 | 主區 | §10 |
| 7 | 戰情室概覽 | 從結構抽出最多 3 張圖表卡片 | BattleRoom | §10 |
| 8 | 重新生成 | 對同 prompt 再跑一次 | 生成區 | UC-AID-01 |
UC(§2)展開 生成主流程(健康檢查 → prompt → 生成 → 渲染 / 重試)。
2. Use Case
角色速覽:
| 角色 | 一句話 |
|---|---|
| 使用者 | 輸入 prompt 生成儀表板(auto-generate 需
JWT;health 免 JWT) |
流程圖視覺慣例:菱形 = 判斷、橘底 = AI 步驟 / 例外、紅框 = 錯誤(標 error code)、綠框 = 成功終點、虛線 = 可選路徑。
UC-AID-01 生成 AI 儀表板
| 項目 | 內容 |
|---|---|
| 角色 | 使用者 |
| 前置條件 | 後端生成服務在線(health 檢查通過);AI API Key 已設環境變數 |
| 產出 / 後置條件 | 回傳 dashboard JSON(object)+ data_count
+
tokens_used;前端渲染、抽圖表;不儲存 |
3. 權限矩陣
| 操作 | FE 判定 | BE 強制 | BE 檢查位置 |
|---|---|---|---|
| 健康檢查 | 進頁自動 | 無 JWT(公開);回供應商 / 速度清單 | api/ai_dashboard/routes/ai_dashboard_route.py::health |
| 生成儀表板 | 選單能力 + 後端在線 | @jwt_required();prompt 1–2000 字驗證 |
同檔 AiDashboardAutoGenerateRoute.post |
生成時以 JWT 帶出
DashboardContext(user_uid/user_id/tenant_id/org_unit_id/locale)注入資料 API——查詢受 RLS / tenant 隔離(見 §11)。
4. 狀態機與前置條件
本頁無持久狀態機(無儲存)。生成前置與 gate:
| 條件 | 效果 | 出處 |
|---|---|---|
| health 不通過 | 狀態徽章離線、生成鈕停用 | useDashboardGenerator.js(checkBackendStatus) |
| AI API Key 未設 | 擋 AI_DASHBOARD_400001 |
claude_client.py(init 檢查
ANTHROPIC_API_KEY) |
| provider 不支援 | 擋 AI_DASHBOARD_400002 |
AIClientFactory.get_client |
| 生成失敗 | 擋 AI_DASHBOARD_500001(回 success=false 時) |
AiDashboardAutoGenerateRoute.post |
| AI 選到的服務 / 方法不存在 | AI_DASHBOARD_404001 / 404002 |
DataAPIService._get_service_instance |
5. UI 設計
📸 實際畫面截圖待補(一律亮色模式拍攝;截圖另有專責 session)。預計補到
assets/img/: ① 空狀態(PromptBar + 範本)aid-empty.png② 生成中 loadingaid-loading.png③ 生成結果(儀表板 + 戰情室圖表)aid-result.png④ 錯誤訊息aid-error.png
版面骨架與區塊職責:
狀態呈現:PromptBar 狀態徽章由 health 決定(在線 success / 離線
danger);生成鈕在 loading 或離線時停用;未生成且未載入顯示
Templates;生成後主區 DynamicPrimeComponent 渲染 Ultima
結構,chartsFromAI > 0 才顯示戰情室(抽最多 3
圖表、以指紋去重)。
6. API 規格
Envelope:成功 {"status": true, "data": …}、失敗
{"error_code": "AI_DASHBOARD_…", "msg": "…"}。
6.1 總清單(本頁呼叫的全部 endpoint)
| 分類 | Method + Path | 說明 | 完整規格 |
|---|---|---|---|
| 健康 | GET /ai-dashboard/health |
生成服務狀態 + 供應商 / 速度清單(免 JWT) | §6.2 |
| 生成 | POST /ai-dashboard/auto-generate |
五階段生成儀表板(JWT) | §6.2 |
6.2 核心 endpoint(欄位對照 route / service,出處標段末)
[GET] /ai-dashboard/health
免 JWT。回靜態健康狀態 + 可用供應商(claude /
openai / google)+ 速度(fast /
balanced /
powerful)。出處:api/ai_dashboard/routes/ai_dashboard_route.py::health。
[POST] /ai-dashboard/auto-generate
Request:
{
"prompt": "string", // 必,1–2000 字
"provider": "claude", // 預設 claude
"speed": "balanced" // 預設 balanced
}(FE 送 speed:'fast')。以 JWT 組
DashboardContext(user_uid, user_id, tenant_id, org_unit_id, locale)。五階段管線(見
§10)。Response data:
{
"object": {}, // <Ultima Container JSON>
"query_plan": {},
"data_count": 0,
"tokens_used": {
"input": 0,
"output": 0,
"cache_creation": 0,
"cache_read": 0
},
"auto_generated": true
}出處:api/ai_dashboard/routes/ai_dashboard_route.py::AiDashboardAutoGenerateRoute、app/ai_dashboard/service/ai_dashboard_app_service.py::generate_dashboard_auto。
7. 前端檔案地圖(compliance-manager-fe/)
| 檔案 | 角色 |
|---|---|
src/views/dynamic-dashboard/DynamicDashboard.vue |
主檢視(協調 prompt / 生成 / 渲染) |
src/views/dynamic-dashboard/components/DashboardPromptBar.vue |
自然語言輸入 + 狀態徽章 + 生成鈕 |
src/views/dynamic-dashboard/components/DashboardTemplates.vue |
內建範本卡 |
src/views/dynamic-dashboard/components/DashboardLoadingState.vue |
載入進度 + 重試次數 |
src/views/dynamic-dashboard/components/DashboardErrorMessage.vue |
錯誤 + 建議 + 重試 |
src/views/dynamic-dashboard/components/DashboardBattleRoom.vue |
戰情室(抽取圖表卡片) |
src/composables/useDashboardGenerator.js |
生成狀態機(health / generate / 圖表抽取 / 重試) |
src/config/router/index.js:648-655 |
route
ai-dashboard(/dashboard/ai-dashboard) |
src/config/api/api.js:375-376 |
AI_DASHBOARD_AUTO_GENERATE /
AI_DASHBOARD_GENERATE_HEALTH |
src/config/locales/i18n/*/dynamic-dashboard.json |
頁面 i18n |
8. 後端檔案地圖(本頁核心鏈路)
| 鏈路 | Route | App Service | 底層 |
|---|---|---|---|
| 健康 | api/ai_dashboard/routes/ai_dashboard_route.py::health |
— | 靜態 |
| 生成 | 同檔 AiDashboardAutoGenerateRoute |
app/ai_dashboard/service/ai_dashboard_app_service.py::generate_dashboard_auto(五階段) |
domain/ai_dashboard/service/dashboard_generation_domain_service.py(統計
+
組裝)、app/ai_dashboard/service/data_api_service.py(動態呼叫)、app/ai_dashboard/service/api_registry.py(~40
API 目錄)、infra/ai_dashboard/ai_client/*(LLM
client) |
DDD 提醒:資料查詢透過 data_api_service
動態路由到既有服務方法(api_registry 映射),注入
DashboardContext 保留 RLS / tenant 隔離;不繞過既有 domain
service 直接查 DB。LLM client 在 infra 層(ClaudeClient /
OpenAIClient / GoogleClient)。
9. DB
9.1 資料表總清單
| 表 | 讀/寫 | 說明 |
|---|---|---|
| (無專屬表) | — | AI 儀表板不持久化:每次請求即時生成,結果只在記憶體回傳前端;無儀表板 / 歷史表 |
| (間接讀)GRC 各模組表 | 讀 | 第②階段由 AI 選定的資料 API 透過既有 domain service 讀(依 prompt 而定,如任務佇列 / 專案 / 控制統計) |
main_app.py曾有「AI Dashboard schema analyzer」啟動初始化,目前已註解不執行(見 §11)。無_trans/ 專屬 dump 表。
10. 頁面邏輯與資料對應
生成管線(五階段):
- AI 選
API(
_ask_ai_to_select_api):LLM 從api_registry(~40 服務方法目錄)選最合適的main_api(附理由),用 prompt 快取。 - 取資料(
data_api_service.call_api):動態呼叫該服務方法,注入DashboardContext(RLS / tenant)。 - 統計(
analyze_data_stats):算分布 / 計數(project_name/group_name/control_no/job_status等維度)。 - AI
設計版面(
_ask_ai_to_design_layout):LLM 依統計 + 樣本產出analysis_blocks(stat/status-breakdown/category-breakdown)+table。 - 組裝(
build_dashboard_from_design):組成 Ultima UIContainer / Card / DataTableJSON 樹回傳。
前端渲染:dashboardStructure(object)→
DynamicPrimeComponent
遞迴渲染;extractChartsFromStructure 走訪樹抽出
type==='chart' 節點、指紋去重、限 3 張 → 戰情室。
錯誤對應:AI_DASHBOARD_400001(API Key
未設)/ 400002(不支援供應商)/
400003(查詢計畫格式錯)/ 400004(AI
解析失敗)/ 500001(生成失敗)/
404001(服務映射找不到)/
404002(服務方法不存在)→ ErrorMessage(含建議 +
可重試判斷)。
11. 背景行為與外部依賴
| 類型 | 內容 |
|---|---|
| LLM 供應商 | 預設 claude(另支援 openai /
google);供應商 factory 依 provider 選 client |
Claude 模型(依 speed,取自
infra/ai_dashboard/ai_client/claude_client.py) |
fast = claude-haiku-4-5-20251001(max
8192)/balanced =
claude-sonnet-4-5-20250929(16384)/powerful
= claude-opus-4-5-20251101(16384);未指定 speed 預設
balanced |
| Prompt 快取 | 僅 Claude:system block cache_control: ephemeral;回報
cache_creation / cache_read tokens |
| 環境變數 | ANTHROPIC_API_KEY(Claude)/
OPENAI_API_KEY / GOOGLE_API_KEY;未設擋
AI_DASHBOARD_400001 |
| 啟動初始化 | main_app.py 的 schema analyzer
初始化已註解(不執行)——生成不依賴預先 schema 掃描 |
| Socket | 本頁無 socket |
| 持久化 | 無——結果 per-request 生成、不存 DB |
12. 邊界情況與已知坑
- 不持久化:生成結果只在記憶體、回傳即渲染;重整頁面 / 重新生成即失,無「我的儀表板」清單可回讀。要保留需另外截圖 / 匯出(本頁未提供匯出)。
- health 免
JWT:健康檢查端點公開;
auto-generate才要 JWT。 - 兩層 AI 呼叫成本:一次生成含兩次 LLM 呼叫(選 API +
設計版面)+ 一次資料查詢;
tokens_used有回報但不落 DB / 不計費追蹤——高頻使用需注意 token 成本。 - FE 速度硬編
fast:前端送speed:'fast'(→ haiku 模型),BE 預設值是balanced(sonnet)——實際跑哪個模型看 FE 送的值,勿只看 BE 預設。 - AI 選 API 可能選錯:第①階段由 LLM 從
api_registry選資料來源,選錯 / 選到不存在服務會擋AI_DASHBOARD_404001/404002;prompt 與可用 API 目錄的匹配品質決定結果。 - RLS 靠 context 注入:資料查詢注入
DashboardContext(tenant / org),依賴既有 domain service 的 RLS——若某 API 未正確吃 context,可能跨租戶(設計上應由data_api_service統一注入)。 - 模型 ID 是程式碼現況:§11 模型 ID 取自
claude_client.py當前值;升級模型需改該檔MODEL_MAP,spec 同步更新。
13. 開發與驗證
- 跑起來:BE
python main_socketio.py(port 8000,log 在log/app.log);FE 在compliance-manager-fe/起 Vite dev server。需設ANTHROPIC_API_KEY(或對應供應商 key)於環境變數,否則生成擋AI_DASHBOARD_400001。BE 改 service code 後必須重啟(無 hot reload) - 測試帳號:dev 環境登入帳號密碼見
.env/ 部署文件 - 導航路徑:側邊選單「儀表板 / AI
儀表板」(
/dashboard/ai-dashboard) - 前置資料:需有可查詢的 GRC 資料(專案 / 任務 / 控制),且 AI API Key 已設;先看 health 徽章是否在線
- E2E:
compliance-manager-test/repo;以AI 儀表板/ai dashboard搜尋 feature 檔(注意:LLM 回應非決定性,E2E 宜驗流程而非固定內容) - 相關文件:摘要報表見 專案摘要報表、GRC 內建儀表板見 專案儀表板;Claude
API 用法見 CLAUDE.md /
claude-api參考;DB / API 全量見 GAI-SD-02/03