Files
ewoooc/templates/components/_ewoooc_shell.html
OoO 347efb8ea1
All checks were successful
CD Pipeline / deploy (push) Successful in 2m30s
feat(p46): Agent 編排矩陣新頁 — OpenClaw/Hermes/NemoTron/EA × Ollama × Gemini × MCP × RAG
統帥要求:「好好把 OpenClaw/Hermes/NemoTron/ElephantAlpha + Ollama 多模型
+ 外部付費 Gemini + 內外 MCP + RAG 組合發揮出 AI 自動化新境界」

新頁面 /observability/agent_orchestration 一頁式呈現 4 Agent × 5 維度全景:

J-1: caller 自動分組
- OpenClaw: openclaw_qa/daily/meta/monthly/weekly/bot_main/bot_gemini/bot_nim
            + sales_copy + code_review_openclaw
- Hermes: hermes_analyst + hermes_intent + code_review_hermes
- NemoTron: nemotron_dispatch
- ElephantAlpha: ea_engine + code_review_elephant

J-2/3: 跨表 SQL JOIN(ai_calls × mcp_calls × rag_query_log)
每個 agent 顯示:
- 24h 呼叫 + Token + 成本
- 本地 Ollama 比例(細分 GCP-A/GCP-B/111)
- 付費 LLM 比例(細分 Gemini / 其他)
- MCP 編排率(透過 request_id 跨表 JOIN mcp_calls)
- RAG 命中率
- 錯誤率 + 平均耗時
- MCP server × caller 工作量明細

自動編排建議(5 條 rule-based):
1. 付費比例 > 50% 且 ollama < 20% → 改 Hermes-first 短路
2. 錯誤率 > 10% → 觸發 Code Review Pipeline
3. MCP 編排率 < 5% 但 calls > 50 → 擴大 MCP omnisearch/firecrawl
4. RAG 命中率 ≥ 40% → 推 Telegram 收 feedback 強化 promotion gate
5. 111 fallback 比例 > 20% → GCP 兩台異常,查 host_health AIOps

J-4: 入口
- sidebar AI 觀測 group 加「Agent 編排矩陣」(07b)
- /observability/overview 入口卡升級為 7 項,Agent 編排矩陣放第一

整體 KPI 卡片:
- 總呼叫 / 本地 Ollama 比例 / 付費 LLM 成本 / RAG 命中率
- 「組合發揮」一目瞭然

8 表跨 JOIN:ai_calls × mcp_calls × rag_query_log × ai_insights ×
learning_episodes × incidents × heal_logs × host_health_probes

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-05-04 19:38:10 +08:00

146 lines
8.4 KiB
HTML
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
{#
EwoooC Frontend V2 shell.
使用方式:
{% include 'components/_ewoooc_shell.html' %}
呼叫頁需提供 active_page未提供時會以空字串處理。
#}
{% set _active_page = active_page|default('') %}
{% set _scheduler = scheduler_stats|default({}) %}
{% set _momo_runs = _scheduler.get('momo_task', []) if _scheduler is mapping else [] %}
{% set _latest_run = _momo_runs[0] if _momo_runs else {} %}
{% set _has_scheduler_data = _latest_run is mapping and _latest_run %}
{% set _last_run = _latest_run.get('last_run', '--') if _has_scheduler_data else '--' %}
{% set _scanned = _latest_run.get('scanned_count', _latest_run.get('total_products', '--')) if _latest_run is mapping else '--' %}
{% set _added = _latest_run.get('new_records', _latest_run.get('added', '--')) if _latest_run is mapping else '--' %}
{% set _run_status = _latest_run.get('status', '') if _has_scheduler_data else '' %}
{% set _status_label = '尚無紀錄' if not _has_scheduler_data else ('最近成功' if _run_status in ['Success', 'success', 'SUCCESS'] else (_run_status or '已有紀錄')) %}
{% set _next_run = next_run|default(None) %}
{% set _session_username = session.get('username') if session is defined else None %}
{% set _session_role = session.get('role') if session is defined else None %}
{% set _is_logged_in = session.get('logged_in') if session is defined else false %}
<aside class="momo-sidebar" aria-label="主選單">
<a class="momo-sidebar-logo" href="/">
<span class="momo-logo-mark" aria-hidden="true">
<span></span><span></span><span></span>
<span></span><span></span><span></span>
<span></span><span></span><span></span>
</span>
<span class="momo-brand-word">
<span class="momo-brand-name momo-display">EwoooC</span>
<span class="momo-brand-subtitle momo-label">價格監控 V2</span>
</span>
</a>
<nav class="momo-nav momo-scroll">
<div class="momo-nav-group">
<div class="momo-nav-group-title momo-label">監控</div>
<a class="momo-nav-link {% if _active_page == 'dashboard' %}is-active{% endif %}" href="/">
<span class="momo-nav-icon"><i class="fas fa-border-all"></i></span>
<span class="momo-nav-label">商品看板</span>
<span class="momo-nav-code momo-mono">01</span>
</a>
<a class="momo-nav-link {% if _active_page in ['edm', 'campaigns'] %}is-active{% endif %}" href="/edm">
<span class="momo-nav-icon"><i class="fas fa-bullhorn"></i></span>
<span class="momo-nav-label">活動看板</span>
<span class="momo-nav-code momo-mono">02</span>
</a>
<a class="momo-nav-link {% if _active_page in ['sales', 'daily_sales', 'monthly', 'growth'] %}is-active{% endif %}" href="/sales_analysis">
<span class="momo-nav-icon"><i class="fas fa-chart-line"></i></span>
<span class="momo-nav-label">分析報表</span>
<span class="momo-nav-code momo-mono">03</span>
</a>
</div>
<div class="momo-nav-group">
<div class="momo-nav-group-title momo-label">營運</div>
<a class="momo-nav-link {% if _active_page == 'vendor_stockout' %}is-active{% endif %}" href="/vendor-stockout">
<span class="momo-nav-icon"><i class="fas fa-box-open"></i></span>
<span class="momo-nav-label">廠商缺貨</span>
<span class="momo-nav-code momo-mono">04</span>
</a>
<a class="momo-nav-link {% if _active_page in ['ai_recommend', 'ai_history', 'ai_intelligence'] %}is-active{% endif %}" href="/ai_recommend">
<span class="momo-nav-icon"><i class="fas fa-wand-magic-sparkles"></i></span>
<span class="momo-nav-label">AI 助手</span>
<span class="momo-nav-code momo-mono">05</span>
</a>
<a class="momo-nav-link {% if _active_page == 'auto_import' %}is-active{% endif %}" href="/auto_import">
<span class="momo-nav-icon"><i class="fas fa-download"></i></span>
<span class="momo-nav-label">雲端匯入</span>
<span class="momo-nav-code momo-mono">06</span>
</a>
</div>
<div class="momo-nav-group">
<div class="momo-nav-group-title momo-label">AI 觀測</div>
<a class="momo-nav-link {% if _active_page == 'obs_overview' %}is-active{% endif %}" href="/observability/overview">
<span class="momo-nav-icon"><i class="fas fa-satellite-dish"></i></span>
<span class="momo-nav-label">觀測台總覽</span>
<span class="momo-nav-code momo-mono">07</span>
</a>
<a class="momo-nav-link {% if _active_page == 'obs_agent_orchestration' %}is-active{% endif %}" href="/observability/agent_orchestration">
<span class="momo-nav-icon"><i class="fas fa-network-wired"></i></span>
<span class="momo-nav-label">Agent 編排矩陣</span>
<span class="momo-nav-code momo-mono">07b</span>
</a>
<a class="momo-nav-link {% if _active_page == 'obs_host_health' %}is-active{% endif %}" href="/observability/host_health">
<span class="momo-nav-icon"><i class="fas fa-heartbeat"></i></span>
<span class="momo-nav-label">主機健康</span>
<span class="momo-nav-code momo-mono">08</span>
</a>
<a class="momo-nav-link {% if _active_page == 'obs_ai_calls' %}is-active{% endif %}" href="/observability/ai_calls">
<span class="momo-nav-icon"><i class="fas fa-chart-bar"></i></span>
<span class="momo-nav-label">AI 呼叫</span>
<span class="momo-nav-code momo-mono">09</span>
</a>
<a class="momo-nav-link {% if _active_page == 'obs_budget' %}is-active{% endif %}" href="/observability/budget">
<span class="momo-nav-icon"><i class="fas fa-wallet"></i></span>
<span class="momo-nav-label">預算控管</span>
<span class="momo-nav-code momo-mono">10</span>
</a>
<a class="momo-nav-link {% if _active_page == 'obs_promotion_review' %}is-active{% endif %}" href="/observability/promotion_review">
<span class="momo-nav-icon"><i class="fas fa-brain"></i></span>
<span class="momo-nav-label">RAG 晉升審核</span>
<span class="momo-nav-code momo-mono">11</span>
</a>
<a class="momo-nav-link {% if _active_page == 'obs_quality_trend' %}is-active{% endif %}" href="/observability/quality_trend">
<span class="momo-nav-icon"><i class="fas fa-comments"></i></span>
<span class="momo-nav-label">反饋趨勢</span>
<span class="momo-nav-code momo-mono">12</span>
</a>
<a class="momo-nav-link {% if _active_page == 'obs_ppt_audit' %}is-active{% endif %}" href="/observability/ppt_audit_history">
<span class="momo-nav-icon"><i class="fas fa-search"></i></span>
<span class="momo-nav-label">PPT 視覺審核</span>
<span class="momo-nav-code momo-mono">13</span>
</a>
</div>
<div class="momo-nav-group">
<div class="momo-nav-group-title momo-label">系統</div>
<a class="momo-nav-link {% if _active_page in ['settings', 'system_settings', 'logs', 'crawler', 'user_management', 'ai_automation_smoke'] %}is-active{% endif %}" href="/settings">
<span class="momo-nav-icon"><i class="fas fa-gear"></i></span>
<span class="momo-nav-label">系統管理</span>
<span class="momo-nav-code momo-mono">14</span>
</a>
</div>
</nav>
<div class="momo-status-card">
<div class="momo-status-title momo-label">爬蟲狀態</div>
<div class="momo-status-active momo-mono">
<span class="momo-live-dot"></span>
<span>{{ _status_label }}</span>
</div>
<div class="momo-status-meta momo-mono">
上次執行 {{ _last_run }}<br>
掃描筆數 {{ _scanned }}<br>
新增筆數 {% if _added == '--' %}--{% else %}+{{ _added }}{% endif %}
</div>
</div>
</aside>
<div class="momo-shell-backdrop" data-momo-sidebar-close></div>