This commit is contained in:
@@ -11,45 +11,55 @@
|
||||
|
||||
<div class="container-fluid mt-3">
|
||||
<section class="ppt-hero">
|
||||
<div class="ppt-kicker"><i class="fas fa-search me-1"></i> PPT 視覺 QA 產線 · minicpm-v / AiderHeal / RAG 修法</div>
|
||||
<h1 class="ppt-title">PPT 視覺 QA 產線</h1>
|
||||
<p class="ppt-subtitle">這頁追蹤每份自動簡報是否通過視覺審核:檔案產出、minicpm-v 審核、Telegram 推送、RAG 修法建議與 AiderHeal 自動修產生器。</p>
|
||||
<div class="ppt-command">
|
||||
<div class="ppt-signal">
|
||||
<div class="ppt-label">視覺模型</div>
|
||||
<span class="ppt-value {% if vision_enabled %}status-good{% else %}status-warn{% endif %}">{{ '啟用' if vision_enabled else '停用' }}</span>
|
||||
<small class="text-muted">minicpm-v + LibreOffice</small>
|
||||
<div class="ppt-hero-grid">
|
||||
<div class="ppt-hero-copy">
|
||||
<div class="ppt-kicker"><i class="fas fa-search me-1"></i> PPT 視覺 QA 產線 · {{ report_month }} · {{ selected_report_type.label }}</div>
|
||||
<h1 class="ppt-title">{{ operator_summary.headline }}</h1>
|
||||
<p class="ppt-subtitle">{{ operator_summary.message }}</p>
|
||||
{% if operator_summary.blocker_text %}
|
||||
<p class="ppt-hero-note"><i class="fas fa-circle-info me-1" aria-hidden="true"></i>{{ operator_summary.blocker_text }}</p>
|
||||
{% endif %}
|
||||
<div class="ppt-hero-actions">
|
||||
<a class="btn btn-primary btn-sm" href="{{ operator_summary.primary_anchor }}">{{ operator_summary.primary_action }}</a>
|
||||
<a class="btn btn-outline-primary btn-sm" href="#ppt-production-center">定期產出矩陣</a>
|
||||
{% if operator_summary.latest_deck.name %}
|
||||
<a class="btn btn-outline-secondary btn-sm"
|
||||
href="{{ url_for('admin_observability.ppt_audit_file', filename=operator_summary.latest_deck.name) }}"
|
||||
target="_blank"
|
||||
rel="noopener"
|
||||
data-ppt-open-preview
|
||||
data-ppt-filename="{{ operator_summary.latest_deck.name }}"
|
||||
data-ppt-preview-title="最新簡報 · {{ operator_summary.latest_deck.name }}"
|
||||
data-ppt-preview-pdf="{{ url_for('admin_observability.ppt_audit_file', filename=operator_summary.latest_deck.name, action='pdf') }}"
|
||||
data-ppt-preview-page="{{ url_for('admin_observability.ppt_audit_file', filename=operator_summary.latest_deck.name) }}"
|
||||
data-ppt-download-url="{{ url_for('admin_observability.ppt_audit_file', filename=operator_summary.latest_deck.name, action='download') }}">
|
||||
<i class="fas fa-eye me-1"></i>預覽最新
|
||||
</a>
|
||||
{% endif %}
|
||||
</div>
|
||||
</div>
|
||||
<div class="ppt-signal">
|
||||
<div class="ppt-label">{{ report_month }} {{ selected_report_type.label }}</div>
|
||||
<span class="ppt-value">{{ files|length }}</span>
|
||||
<small class="text-muted">檔案數</small>
|
||||
</div>
|
||||
<div class="ppt-signal">
|
||||
<div class="ppt-label">審核紀錄</div>
|
||||
<span class="ppt-value {% if audit_30d_stats and audit_30d_stats.pass_rate >= 80 %}status-good{% elif audit_30d_stats and audit_30d_stats.pass_rate >= 60 %}status-warn{% elif audit_30d_stats %}status-bad{% else %}status-blue{% endif %}">
|
||||
{{ audit_30d_stats.total if audit_30d_stats else '—' }}
|
||||
</span>
|
||||
<small class="text-muted">{{ selected_report_type.label }}</small>
|
||||
</div>
|
||||
<div class="ppt-signal">
|
||||
<div class="ppt-label">問題數</div>
|
||||
<span class="ppt-value {% if audit_30d_stats and audit_30d_stats.total_issues > 0 %}status-warn{% elif audit_30d_stats %}status-good{% else %}status-blue{% endif %}">
|
||||
{{ audit_30d_stats.total_issues if audit_30d_stats else '—' }}
|
||||
</span>
|
||||
<small class="text-muted">視覺問題數</small>
|
||||
</div>
|
||||
<div class="ppt-signal">
|
||||
<div class="ppt-label">定義覆蓋</div>
|
||||
<span class="ppt-value {% if auto_generation.missing_count == 0 and auto_generation.total > 0 %}status-good{% elif auto_generation.missing_count > 0 %}status-warn{% else %}status-blue{% endif %}">
|
||||
{{ auto_generation.ready_count }}/{{ auto_generation.total }}
|
||||
</span>
|
||||
<small class="text-muted">自動簡報產線</small>
|
||||
<aside class="ppt-hero-deck is-{{ operator_summary.status }}" aria-label="最新簡報狀態">
|
||||
<div class="ppt-label">Latest Deck</div>
|
||||
<strong>{{ operator_summary.latest_deck_label }}</strong>
|
||||
<small>{{ operator_summary.latest_deck_meta }}</small>
|
||||
<div class="ppt-hero-deck-run">
|
||||
<span>{{ operator_summary.latest_run_label }}</span>
|
||||
<small>{{ operator_summary.latest_run_meta }}</small>
|
||||
</div>
|
||||
</aside>
|
||||
</div>
|
||||
<div class="ppt-command ppt-command--compact">
|
||||
{% for signal in operator_summary.signals %}
|
||||
<div class="ppt-signal is-{{ signal.status }}">
|
||||
<div class="ppt-label">{{ signal.label }}</div>
|
||||
<span class="ppt-value">{{ signal.value }}</span>
|
||||
<small class="text-muted">{{ signal.meta }}</small>
|
||||
</div>
|
||||
{% endfor %}
|
||||
</div>
|
||||
</section>
|
||||
{% if not vision_status.ready %}
|
||||
<section class="ppt-diagnostic-strip">
|
||||
<section class="ppt-diagnostic-strip" id="ppt-runtime-diagnostic">
|
||||
<div>
|
||||
<div class="ppt-label">視覺 QA 尚未就緒</div>
|
||||
<strong>目前不是模型能力問題,而是執行環境尚未完整開啟。</strong>
|
||||
@@ -145,8 +155,7 @@
|
||||
{% endfor %}
|
||||
</div>
|
||||
</section>
|
||||
{% if files %}
|
||||
<section class="ppt-deck-workbench" aria-label="最近可預覽簡報">
|
||||
<section class="ppt-deck-workbench" id="ppt-deck-workbench" aria-label="最近可預覽簡報">
|
||||
<div class="ppt-workbench-head">
|
||||
<div>
|
||||
<div class="ppt-label">Preview Workbench</div>
|
||||
@@ -165,6 +174,7 @@
|
||||
{% endif %}
|
||||
</div>
|
||||
</div>
|
||||
{% if files %}
|
||||
<div class="ppt-deck-rail">
|
||||
{% for f in files[:4] %}
|
||||
<article class="ppt-deck-card {% if not f.file_exists or not f.is_valid_ppt %}is-disabled{% endif %}">
|
||||
@@ -210,8 +220,12 @@
|
||||
</article>
|
||||
{% endfor %}
|
||||
</div>
|
||||
{% else %}
|
||||
<div class="ppt-empty ppt-deck-empty">
|
||||
目前沒有符合 {{ report_month }} / {{ selected_report_type.label }} 的簡報檔案;可先切換報表類型,或在下方補齊定義簡報。
|
||||
</div>
|
||||
{% endif %}
|
||||
</section>
|
||||
{% endif %}
|
||||
<section class="ppt-health-board" aria-label="PPT 產線健康總覽">
|
||||
<div class="ppt-health-main is-{{ pipeline_view.status }}">
|
||||
<div class="ppt-label">Pipeline Health</div>
|
||||
@@ -238,7 +252,7 @@
|
||||
{% endfor %}
|
||||
</div>
|
||||
</section>
|
||||
<section class="ppt-action-queue" data-ppt-action-queue aria-label="PPT 工作隊列">
|
||||
<section class="ppt-action-queue" id="ppt-action-queue" data-ppt-action-queue aria-label="PPT 工作隊列">
|
||||
<div class="ppt-workbench-head">
|
||||
<div>
|
||||
<div class="ppt-label">Action Queue</div>
|
||||
@@ -293,7 +307,7 @@
|
||||
</div>
|
||||
</section>
|
||||
{% if issue_items %}
|
||||
<section class="ppt-issue-board" aria-label="視覺問題追蹤">
|
||||
<section class="ppt-issue-board" id="ppt-issue-board" aria-label="視覺問題追蹤">
|
||||
<div class="ppt-workbench-head">
|
||||
<div>
|
||||
<div class="ppt-label">Vision Findings</div>
|
||||
@@ -336,6 +350,7 @@
|
||||
</section>
|
||||
{% endif %}
|
||||
<section class="ppt-panel mt-3"
|
||||
id="ppt-production-center"
|
||||
data-ppt-auto-generation
|
||||
data-auto-start="{{ 'true' if auto_generation.can_auto_start else 'false' }}"
|
||||
data-report-types="{{ auto_generation_missing_report_types | join(',') }}">
|
||||
|
||||
Reference in New Issue
Block a user