feat(commentary): 双 provider 评论 — Angel(Agnes) + 美团大模型(LongCat)

- 新增 articles.commentary_meituan{_status,_model,_error} 4 列 + commentary_engine
- LlmSetting 加 meituan_api_key/base_url/chat_model/interval_sec/enabled/commentary_prompt
- 新 app/services/llm/providers.py 工厂,支持多 provider 客户端
- enrichment 流程改为 commentary_angel + commentary_meituan 并行(asyncio.gather),
  任一 provider 失败不影响另一个
- enrichment_loop 状态判定:任一 provider 状态不是 ok 都视为待 enrich
- alembic 0004_dual_commentary 迁移
- 前端 Feed 卡片 + ArticleDetail 详情页各加一条'美团评论'卡
- AdminLlmSettings 加美团 provider 配置卡(独立 api_key 编辑器,不回显明文)
- LlmSettingOut.meituan_api_key_set (bool) 替代直接回传 key
- 默认 URL https://api.longcat.chat/openai/v1 / 默认模型 LongCat-2.0-Preview
This commit is contained in:
xiaji
2026-06-12 19:00:00 +08:00
parent 3ab6e4c7d0
commit bc36a1fc38
15 changed files with 2746 additions and 48 deletions

View File

@@ -224,20 +224,36 @@ onMounted(async () => {
{{ bodyExcerpt(a.body_zh_text || a.summary_zh, 220) }}
</div>
<!-- 评论钩子(淡木色背景 + 木色左边框, Android 对齐) -->
<!-- 评论钩子( provider:Angel + 美团,淡木色背景 + 木色左边框, Android 对齐) -->
<div
v-if="a.commentary"
v-if="a.commentary || a.commentary_meituan"
class="commentary-box"
>
<NSpace align="center" :size="6" style="margin-bottom: 6px">
<span class="commentary-label">💬 评论</span>
<NTag size="tiny" :type="commentaryStatusType(a.commentary_status)" round :bordered="false">
{{ a.commentary_status || 'n/a' }}
</NTag>
</NSpace>
<div class="commentary-text">
{{ previewCommentary(a.commentary, 140) }}
</div>
<!-- Angel 评论 -->
<template v-if="a.commentary">
<NSpace align="center" :size="6" style="margin-bottom: 6px">
<span class="commentary-label">💬 Angel 评论</span>
<NTag size="tiny" :type="commentaryStatusType(a.commentary_status)" round :bordered="false">
{{ a.commentary_status || 'n/a' }}
</NTag>
</NSpace>
<div class="commentary-text">
{{ previewCommentary(a.commentary, 140) }}
</div>
</template>
<!-- 美团评论 -->
<template v-if="a.commentary_meituan">
<div v-if="a.commentary" class="commentary-divider" />
<NSpace align="center" :size="6" style="margin-bottom: 6px">
<span class="commentary-label commentary-label-meituan">🐱 美团评论</span>
<NTag size="tiny" :type="commentaryStatusType(a.commentary_meituan_status)" round :bordered="false">
{{ a.commentary_meituan_status || 'n/a' }}
</NTag>
</NSpace>
<div class="commentary-text">
{{ previewCommentary(a.commentary_meituan, 140) }}
</div>
</template>
</div>
</NSpace>
</NCard>
@@ -277,12 +293,23 @@ onMounted(async () => {
color: var(--color-primary);
}
.commentary-label-meituan {
color: #c2410c; /* 橙色,与 Angel 区分 */
}
.commentary-text {
color: var(--color-letter);
font-size: 13px;
line-height: 1.7;
}
.commentary-divider {
height: 1px;
background: var(--color-primary-soft);
margin: 10px 0;
opacity: 0.6;
}
/* ===== 桌面端默认宽度 ===== */
.feed-source-select {
min-width: 240px;