{{ statsMonth }} 消息量 Top 10 群 · 点击查看数据大屏
{{ statsError }}
统计当月战况中...
本月暂无聊天数据
{{ msgActionMsg }}
{{ '加载失败:' + msgLoadError }}
暂无聊天记录
调整筛选条件后回车重新搜索
| 发送者 | 内容 | 时间 | 类型 | 跳转 | 操作 |
|---|---|---|---|---|---|
| {{ msg.sender || '-' }} | {{ truncate(msg.text, 60) }} | {{ formatTime(msg.date_unixtime || msg.date) }} | {{ msg.type }} | 打开 - | |
|
完整 JSON:
{{ prettyJson(msg) }}
reply_id: {{ msg.reply_to_msg_id }}
被回复原消息
{{ msg.reply_target_text || '' }}
原消息未找到(可能未入库或已删除)
|
|||||
共 {{ msgTotal }} 条
{{ msgPage }} / {{ Math.ceil(msgTotal / pageSize) || 1 }}
{{ msgActionMsg }}
加载中...
{{ '加载失败:' + reportLoadError }}
暂无报告数据
| 发送者 | 频道 | 内容 | 时间 | 跳转 | 操作 |
|---|---|---|---|---|---|
| {{ msg.sender || '-' }} | {{ msg.channel_name || '-' }} | {{ truncate(msg.text, 60) }} | {{ formatTime(msg.date_unixtime || msg.date) }} | 打开 - | |
{{ msg.text }}
reply_id: {{ msg.reply_to_msg_id }}
被回复原消息
{{ msg.reply_target_text || '' }}
原消息未找到(可能未入库或已删除)
|
|||||
共 {{ reportTotal }} 条
{{ reportPage }} / {{ Math.ceil(reportTotal / pageSize) || 1 }}
{{ qaActionMsg }}
加载中...
{{ '加载失败:' + qaLoadError }}
暂无问答记录
| 提问者 | 问题 | 回答摘要 | 状态 | 模式 | 配置 | 耗时 | 时间 | 操作 |
|---|---|---|---|---|---|---|---|---|
| {{ log.sender || '-' }} | {{ truncate(log.question, 40) }} | {{ truncate(log.answer, 40) }} | {{ qaStatusLabel(log.status) }} | {{ qaModeLabel(log.ai_mode) }} | {{ log.ai_profile_name || log.ai_profile_id || '-' }} | {{ log.response_time_ms ? (log.response_time_ms / 1000).toFixed(1) + 's' : '-' }} | {{ formatTime(log.created_at) }} | |
|
问题
{{ log.question }}
配置:{{ log.ai_profile_name || '-' }}({{ log.ai_profile_id }})
回答
{{ log.answer || '(无回答)' }}
查询日志
该问题无 trace_id,暂无查询日志。
查询日志加载中...
{{ qaQueryErrorByTrace[log.trace_id] }}
暂无查询记录
{{ formatTime(qlog.created_at) }}
{{ qlog.command }}
{{ qlog.status }}
{{ formatDurationMs(qlog.duration_ms) }}
count={{ qlog.result_count ?? '-' }}
args: {{ truncate(qlog.argv_json, 240) }}
{{ qlog.error_text }}
{{ formatQueryResult(qlog.result_text, qlog.result_json) || '(空结果)' }}
|
||||||||
共 {{ qaTotal }} 条
{{ qaPage }} / {{ Math.ceil(qaTotal / pageSize) || 1 }}
查询缓存不按时间过期,只有最新水位推进才失效。查询会话:普通 7 天,调试 30 分钟。
{{ girlCacheActionMsg }}
加载中...
{{ '加载失败:' + girlLogsLoadError }}
暂无 Girl 记录
| 妹妹 | 命令 | 状态 | 模式 | 店铺/候选 | Trace ID | 时间 |
|---|---|---|---|---|---|---|
|
{{ log.query_name_raw || '-' }}
{{ log.query_name_norm || '-' }}
|
{{ log.command || '-' }} | {{ girlLogStatusLabel(log.status) }} | {{ log.ai_mode_label || '-' }} | {{ girlStoreCount(log) }} / {{ log.candidate_count || 0 }} | {{ log.trace_id || '-' }} | {{ formatTime(log.created_at) }} |
|
查询摘要
名字:{{ log.query_name_raw || '-' }}({{ log.query_name_norm || '-' }})
命令:{{ log.command || '-' }} | 模式:{{ log.ai_mode_label || '-' }}
店铺:{{ girlStoreCount(log) }} | 去重后候选:{{ log.candidate_count || 0 }} | 原始候选:{{ log.raw_candidate_count || 0 }}
查询项:{{ girlQueryTermsLabel(log) }}
trace_id={{ log.trace_id || '-' }} | chat_id={{ log.chat_id || '-' }}
{{ log.error_text }}
结果快照
{{ prettyJson(log.grouped_result_json || '[]') }}
缓存状态
缓存状态加载中...
{{ girlCacheErrorByName[log.query_name_norm] }}
查询缓存更新时间:{{ formatTime(girlCacheStatusByName[log.query_name_norm].cache.updated_at) }}
查询缓存候选:{{ girlCacheStatusByName[log.query_name_norm].cache.candidate_count || 0 }} | AI 接收:{{ girlCacheStatusByName[log.query_name_norm].cache.ai_accepted_count || 0 }}
查询缓存模式:{{ girlCacheStatusByName[log.query_name_norm].cache.ai_mode_label || '-' }}
总结缓存条数:{{ girlCacheStatusByName[log.query_name_norm].cache.summary_cache_count || 0 }}
总结缓存最新更新时间:{{ girlCacheStatusByName[log.query_name_norm].cache.summary_cache_latest_updated_at ? formatTime(girlCacheStatusByName[log.query_name_norm].cache.summary_cache_latest_updated_at) : '-' }}
查询水位:msg_id={{ girlCacheStatusByName[log.query_name_norm].cache.watermark_message_id || 0 }} | 时间={{ girlCacheStatusByName[log.query_name_norm].cache.watermark_date_unixtime ? formatTime(girlCacheStatusByName[log.query_name_norm].cache.watermark_date_unixtime) : '-' }}
当前没有命中这位妹妹的查询缓存。
查询时间线
Trace 加载中...
{{ girlTraceErrorByTrace[log.trace_id] }}
暂无阶段记录
#{{ event.seq }}
{{ event.stage }}
{{ event.status }}
{{ formatDurationMs(event.duration_ms) }}
{{ formatTime(event.created_at) }}
{{ event.summary_text || '-' }}
{{ event.error_text }}
{{ prettyJson(event.detail_json) }}
总结子 Trace
{{ child.trace_id }}
{{ child.phase }}
{{ child.has_error ? '失败' : '完成' }}
{{ formatTime(child.started_at) }}
#{{ event.seq }}
{{ event.stage }}
{{ event.status }}
{{ formatDurationMs(event.duration_ms) }}
{{ formatTime(event.created_at) }}
{{ event.summary_text || '-' }}
{{ event.error_text }}
{{ prettyJson(event.detail_json) }}
|
||||||
共 {{ girlLogTotal }} 条
{{ girlLogPage }} / {{ Math.ceil(girlLogTotal / pageSize) || 1 }}
这里看到的是已归档图片流水。手动修正店铺/妹妹后,会直接影响后续 `/girl` 自动发图;标记为“已排除”的图片不会再参与自动命中。
{{ girlImageActionMsg }}
加载中...
{{ girlImageActionMsg }}
暂无图片归档
| 图片 | 生效对象 | 状态 | 来源 | 置信度 | 时间 |
|---|---|---|---|---|---|
|
|
{{ archive.effective_store_name || '-' }}
{{ archive.effective_girl_name || '-' }}
人工修正已生效
|
{{ girlImageReviewStatusLabel(archive.review_status) }}
{{ girlImageArchiveStatusLabel(archive.archive_status) }}
|
{{ archive.source_chat_name || '-' }}
{{ archive.sender_name || '-' }}
|
{{ girlImageConfidenceLabel(archive.confidence) }} | {{ formatTime(archive.created_at) }} |
|
当前生效
店铺:{{ archive.effective_store_name || '-' }}
妹妹:{{ archive.effective_girl_name || '-' }}
状态:{{ girlImageReviewStatusLabel(archive.review_status) }} / {{ girlImageArchiveStatusLabel(archive.archive_status) }}
storage_key={{ archive.storage_key || '-' }}
AI 原始识别
店铺:{{ archive.primary_store_name || '-' }}
妹妹:{{ archive.primary_girl_name || '-' }}
置信度:{{ girlImageConfidenceLabel(archive.confidence) }}
{{ archive.reason || '无识别说明' }}
人工修正
来源群:{{ archive.source_chat_name || '-' }}
发送者:{{ archive.sender_name || '-' }}(@{{ archive.sender_username }})
消息:{{ archive.source_chat_id || '-' }} / {{ archive.source_message_id || '-' }}
复核时间:{{ archive.reviewed_at ? formatTime(archive.reviewed_at) : '未复核' }}
|
|||||
共 {{ girlImageTotal }} 条
{{ girlImagePage }} / {{ Math.ceil(girlImageTotal / pageSize) || 1 }}
点击妹妹查看图片详情、报告总结、切换选中图片或上传新图。
{{ '加载失败:' + girlManageLoadError }}
暂无妹妹数据
换个关键词搜索,或先在图片归档里修正店铺/妹妹
无图片
{{ girl.effective_store_name }}
{{ girl.effective_girl_name }}
{{ girl.image_count }} 张图
{{ girl.latest_image_at ? formatTime(girl.latest_image_at) : '' }}
{{ girlManageDetail.effective_store_name }}
{{ girlManageDetail.effective_girl_name }}
报告总结
{{ girlManageSummary.report_count }} 篇报告 · {{ formatTime(girlManageSummary.updated_at) }}
{{ girlManageSummary.summary_text }}
上传中...
{{ girlManageMsg }}
暂无图片
已选
一行一条关注,展开后查看该关注最近触发明细、原消息链接和失败原因。
加载中...
{{ '加载失败:' + girlFollowLoadError }}
暂无关注记录
| 关注者 | 关注对象 | 状态 | 最近通知 | 最近结果 | 成功/失败 | 待发送 | ||||||||||||
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
|
{{ subscription.follower_name || '-' }}
user={{ subscription.follower_user_id || '-' }}
chat={{ subscription.follower_chat_id || '-' }}
|
{{ subscription.store_name || '-' }}
{{ subscription.girl_name_raw || '-' }}
|
{{ girlFollowSubscriptionStatusLabel(subscription.status) }} |
{{ formatTime(subscription.latest_notification_created_at || subscription.last_notified_at) }}
{{ subscription.latest_notification?.source_chat_name || '-' }}
|
{{ girlFollowLatestStatusLabel(subscription) }} | {{ subscription.sent_count || 0 }} / {{ subscription.error_count || 0 }} | {{ subscription.pending_count || 0 }} | ||||||||||||
|
订阅摘要
关注者:{{ subscription.follower_name || '-' }}
用户ID:{{ subscription.follower_user_id || '-' }} | 私聊chat_id:{{ subscription.follower_chat_id || '-' }}
店铺:{{ subscription.store_name || '-' }} | 妹妹:{{ subscription.girl_name_raw || '-' }}
创建时间:{{ formatTime(subscription.created_at) }} | 最近通知:{{ formatTime(subscription.last_notified_at) }}
成功 {{ subscription.sent_count || 0 }} | 失败 {{ subscription.error_count || 0 }} | 待发送 {{ subscription.pending_count || 0 }}
最近一次触发
时间:{{ formatTime(subscription.latest_notification.created_at) }}
状态:{{ girlFollowNotificationStatusLabel(subscription.latest_notification.status) }}
来源群:{{ subscription.latest_notification.source_chat_name || '-' }}
发送者:{{ subscription.latest_notification.sender_name || '-' }}
源消息:{{ subscription.latest_notification.source_chat_id || '-' }} / {{ subscription.latest_notification.source_message_id || '-' }}
{{ subscription.latest_notification.error_text }}
这条关注还没有任何触发记录。
最近触发明细
明细加载中...
{{ girlFollowNotificationErrorBySubscription[subscription.id] }}
暂无触发明细。
第 {{ girlFollowNotificationPageLabel(subscription.id) }} / {{ girlFollowNotificationTotalPages(subscription.id) }} 页
|
||||||||||||||||||
共 {{ girlFollowTotal }} 条
{{ girlFollowPage }} / {{ Math.ceil(girlFollowTotal / pageSize) || 1 }}
加载中...
{{ '加载失败:' + autoChatLoadError }}
暂无水群日志
| 触发 | 模式 | 配置 | 内容 | 发送 | 跳转 | 时间 |
|---|---|---|---|---|---|---|
| {{ log.trigger_type || '-' }} | {{ log.mode || '-' }} | {{ log.ai_profile_name || log.ai_profile_id || '-' }} | {{ truncate(log.text || log.error_text, 60) }} | {{ Number(log.sent) === 1 ? '成功' : '失败' }} | 打开 - | {{ formatTime(log.created_at) }} |
|
水群内容
打开该条消息 ↗
{{ log.text || '(无内容)' }}
配置:{{ log.ai_profile_name || '-' }}({{ log.ai_profile_id }})
source={{ log.source || '-' }}
reply_to={{ log.reply_to_msg_id || '-' }}
msg_id={{ log.message_id || '-' }}
trace_id={{ log.trace_id || '-' }}
耗时={{ log.response_time_ms ? (log.response_time_ms / 1000).toFixed(1) + 's' : '-' }}
{{ log.error_text }}
查询日志
该条水群无 trace_id,暂无查询日志。
查询日志加载中...
{{ qaQueryErrorByTrace[log.trace_id] }}
暂无查询记录
{{ formatTime(qlog.created_at) }}
{{ qlog.command }}
{{ qlog.status }}
{{ formatDurationMs(qlog.duration_ms) }}
count={{ qlog.result_count ?? '-' }}
args: {{ truncate(qlog.argv_json, 240) }}
{{ qlog.error_text }}
{{ formatQueryResult(qlog.result_text, qlog.result_json) || '(空结果)' }}
|
||||||
共 {{ autoChatTotal }} 条
{{ autoChatPage }} / {{ Math.ceil(autoChatTotal / pageSize) || 1 }}
加载中...
{{ '加载失败:' + reminderLoadError }}
暂无提醒记录
| 请求者 | 描述 | 类型 | 状态 | 触发条件 | 创建时间 |
|---|---|---|---|---|---|
| {{ r.requester }} | {{ truncate(r.description, 40) }} | {{ r.type === 'time' ? '定时' : '事件' }} | {{ r.status }} | {{ r.trigger_time ? formatTime(r.trigger_time) : '-' }} {{ r.trigger_keyword_name }} ({{ r.trigger_keyword }}) {{ r.trigger_keyword || '-' }} | {{ formatTime(r.created_at) }} |
|
原始问题:{{ r.original_text || '-' }}
触发回复:{{ r.fire_reply || '-' }}
触发时间:{{ formatTime(r.fired_at) }}
|
|||||
共 {{ reminderTotal }} 条
{{ reminderPage }} / {{ Math.ceil(reminderTotal / pageSize) || 1 }}
日报群管理
在同一个入口里管理批量日报和关键词监控,默认打开批量日报。
关键词监控规则
消息命中关键词后,机器人会把原文和链接按模板发送到目标群。规则支持多关键词、多目标群、来源群白名单和 AI 草稿生成。
{{ keywordForwardForm.id ? '编辑规则' : '新建规则' }}
命中其中任意一个即可。支持逗号、分号或换行分隔。
所有词都要出现才算命中。
只要命中其中任意一个,就直接排除。
留空表示所有入库群都生效。
支持:{{rule_name}}、{{matched_keyword}}、{{source_chat_name}}、{{source_chat_id}}、{{sender_name}}、{{sender_id}}、{{message_text}}、{{message_id}}、{{message_time}}、{{message_link}}、{{message_link_markdown}}
可补充发送者白名单、来源黑名单、正则、消息来源 userbot/bot_api 等高级条件。
AI 生成规则草稿
草稿 {{ idx + 1 }}
现有规则
共 {{ keywordForwardRules.length }} 条
还没有规则
{{ rule.name }}
#{{ rule.id }} · {{ rule.match_mode }}
关键词:{{ (rule.keywords || []).join('、') || '-' }}
必须包含:{{ ((rule.conditions && rule.conditions.include_all) || []).join('、') || '-' }}
排除词:{{ ((rule.conditions && rule.conditions.exclude_any) || []).join('、') || '-' }}
来源群:{{ (rule.source_group_ids || []).join('、') || (((rule.conditions && rule.conditions.source_chat_ids_allow) || []).join('、')) || '全部群' }}
目标群:{{ (rule.target_chat_ids || []).join('、') || '-' }}
{{ rule.template_text }}
{{ prettyJson(rule.conditions) }}
规则调试
把消息 JSON 粘进来,直接复算当前规则是否命中、卡在哪一步、最终会发什么内容。
{{ keywordForwardDebugMsg }}
{{ keywordForwardDebugResult.rule_name }}
{{ keywordForwardDebugResult.matched ? '已命中' : '未命中' }}
阶段:{{ keywordForwardDebugResult.stage || '-' }}
关键词:{{ keywordForwardDebugResult.matched_keyword || '-' }}
原因:{{ keywordForwardDebugResult.reason || '-' }}
条件判定
暂无条件判定细节
{{ item.key }}
{{ item.passed ? '通过' : '拦截' }}
{{ item.detail }}
目标群判断
暂无目标群
{{ item.target_chat_id }}
{{ item.stage }} · {{ item.reason }}
最终模板内容
{{ keywordForwardDebugResult.rendered_text || '-' }}
{{ keywordForwardMsg }}
最近命中记录
查看规则命中后发往目标群的结果和失败原因。
共 {{ keywordForwardHitsTotal }} 条
| 时间 | 规则 | 来源群 | 关键词 | 目标群 | 状态 | 错误 |
|---|---|---|---|---|---|---|
| {{ keywordForwardLoading ? '正在加载...' : '暂无命中记录' }} | ||||||
| {{ formatTime(hit.created_at) }} | {{ hit.rule_name || hit.rule_id }} |
{{ hit.source_chat_name || '-' }}
{{ hit.source_chat_id }}
|
{{ hit.matched_keyword }} | {{ hit.target_chat_id }} | {{ keywordForwardHitStatusLabel(hit.status) }} | {{ hit.error_text || '-' }} |
文件加载失败:{{ fileLoadError }}
Markdown 预览
编辑
{{ fileSaveMsg }}
文件加载失败:{{ fileLoadError }}
Markdown 预览
编辑
{{ fileSaveMsg }}
文件加载失败:{{ fileLoadError }}
Markdown 预览
编辑
{{ fileSaveMsg }}
只处理“报告类消息”(含 #验证人/#颜值评级/#报告审核/#评分),按文本归一化去重。预览会按“重复组”展示,每组同时显示保留行和待删行。
每页组数
重复条数:{{ dedupPreview.total_duplicates }}
重复组数:{{ dedupPreview.duplicate_groups }}
{{ dedupMsg }}
预览样本(按重复组分页,每组含保留+待删)
暂无预览数据
| 组 | 动作 | ID | msg_id | 频道 | 转发来源 | 跳转 | 文本预览 |
|---|---|---|---|---|---|---|---|
| {{ row.group_index }} | {{ row.action === 'keep' ? '保留' : '删除' }} | {{ row.id }} | {{ row.msg_id ?? '-' }} | {{ row.channel_name || '-' }} | {{ row.forwarded_from || '-' }} | 打开 - | {{ row.text_preview || '-' }} |
第 {{ dedupPage }} / {{ dedupTotalPages }} 页(每页 {{ dedupGroupLimit }} 组)
后台分批回填 `reply_target_text`(同群匹配:channel_id 相同且 msg_id=reply_to_msg_id)。
JobID: {{ dbMaintJob.id }}
{{ dbMaintJob.status }}
progress: {{ dbMaintJob.stats.progress_percent || 0 }}%
total: {{ dbMaintJob.stats.total_candidates }}
scanned: {{ dbMaintJob.stats.scanned }}
updated: {{ dbMaintJob.stats.updated }}
skipped: {{ dbMaintJob.stats.skipped_no_match }}
remaining(est): {{ dbMaintJob.stats.remaining_estimate }}
remaining(actual): {{ dbMaintJob.stats.remaining_actual == null ? '-' : dbMaintJob.stats.remaining_actual }}
batch: {{ dbMaintJob.batch_size }}
sleep: {{ dbMaintJob.sleep_ms }}ms
错误: {{ dbMaintJob.error }}
实时日志(最新在上)
暂无日志
[{{ formatTime(line.ts) }}] {{ line.message }}
{{ dbMaintMsg }}
批量生成群聊日报
聊天记录会按“群组 + 每小时分段 + 消息ID/发送者/正文”的纯文本格式拼接后发给模型;是否汇总未勾选群由下方开关控制。
结果仅保留在当前页面,刷新后清空
群组选择
已选 {{ selectedGroupSummaryCount }} / {{ groupSummaryGroups.length }}
{{ groupSummaryIncludeOthersEnabled ? (groupSummaryAutoOthersCount > 0 ? `未勾选 ${groupSummaryAutoOthersCount} 个群,将汇总为“其他群聊”` : '当前已全选,不会额外生成“其他群聊”') : '“其他群聊”已关闭,只生成勾选群组' }}
暂无群组数据
生成配置
群日报分割线模板和日报提示词已迁到“文案/提示词中心”统一管理。这里保留模型、发送目标和调度等运行参数,避免配置源分裂。
{{ groupSummaryAutoCombineEnabled ? '本轮群日报全部生成完成后,会自动再生成一张“广州MMK YYYY年MM月DD日日报”总汇总卡。' : '关闭后,需要手动点击“生成总汇总”按钮。' }}
{{ groupSummaryIncludeOthersEnabled ? '开启后,手动生成和定时日报都会额外生成一张“其他群聊”卡片。' : '关闭后,无论手动还是定时,都只处理勾选群组。' }}
定时生成日报
每天按设定时间扫描一次,汇总最近 24 小时内容;勾选群逐个生成,是否追加“其他群聊”由上方开关控制,生成成功后自动发送到上面的发送群组。
{{ selectedGroupSummaryCount > 0 ? (groupSummaryIncludeOthersEnabled ? `当前将对 ${selectedGroupSummaryCount} 个已勾选群组逐个生成,剩余 ${groupSummaryAutoOthersCount} 个群汇总为“其他群聊”` : `当前仅对 ${selectedGroupSummaryCount} 个已勾选群组逐个生成`) : '请先在左侧勾选要参与定时日报的群组' }}
⏱️
距离下次发布:
{{ scheduleCountdown.hours > 0 ? scheduleCountdown.hours + ' 小时 ' : '' }}{{ scheduleCountdown.minutes }} 分钟
(共 {{ scheduleCountdown.totalMinutes }} 分钟)
后端调度状态
调度器:{{ groupSummaryScheduleStatus.scheduler_started ? '已启动' : '未启动' }}
运行状态:{{ groupSummarySchedulerStatusLabel(groupSummaryScheduleStatus.last_run_status) }}
服务时间:{{ formatTime(groupSummaryScheduleStatus.server_now) }}
下次计划:{{ formatTime(groupSummaryScheduleStatus.next_run_at) }}
上次扫描:{{ formatTime(groupSummaryScheduleStatus.last_tick_at) }}
上次检查:{{ formatTime(groupSummaryScheduleStatus.last_checked_at) }}
上次时段:{{ groupSummaryScheduleStatus.last_triggered_slot || '-' }}
状态文件:{{ groupSummaryScheduleStatus.state_file_path || '-' }}
最近原因:{{ groupSummaryScheduleReasonText(groupSummaryScheduleStatus) }}
暂未获取到后端调度状态
手动发送文本到日报群
这里发送的是你手输的文本,支持 Markdown,固定使用上面的发送群组ID和发送机器人令牌。
{{ groupSummaryMsg }}
结果卡片
横向滚动查看,多群会并发生成
还没有生成结果
{{ card.channel_name || '未知群组' }}
{{ card.channel_id }}
消息数:{{ card.message_count || 0 }}
耗时:{{ card.duration_ms ? formatDurationMs(card.duration_ms) : '-' }}
类型:{{ groupSummaryScopeLabel(card.scope) }}
群数:{{ (card.related_channel_ids || []).length || ((card.scope === 'others' || card.scope === 'combined') ? 0 : 1) }}
范围:{{ formatTime(card.start_time) }} ~ {{ formatTime(card.end_time) }}
包含群聊:{{ groupSummaryRelatedGroupNames(card) }}
{{ card.error }}
{{ card.output || '等待结果...' }}
日报任务记录
包含手动生成、总汇总、定时生成、发送标题、置顶标题和正文发送记录。
共 {{ groupSummaryLogTotal }} 条
| 时间 | 触发 | 动作 | 对象 | 状态 | 消息数 | 耗时 | 目标群 | 错误/原因 |
|---|---|---|---|---|---|---|---|---|
| {{ groupSummaryLogLoading ? '正在加载记录...' : '暂无记录' }} | ||||||||
| {{ formatTime(log.created_at) }} | {{ groupSummaryTriggerLabel(log.trigger_type) }} | {{ groupSummaryActionLabel(log.action) }} |
{{ log.channel_name || log.title_text || '-' }}
{{ log.channel_id || groupSummaryScopeLabel(log.scope) }}
|
{{ groupSummaryStatusLabel(log.status) }} | {{ log.message_count || 0 }} | {{ log.duration_ms ? formatDurationMs(log.duration_ms) : '-' }} | {{ log.target_chat_id || '-' }} | {{ log.error_text || '-' }} |
第 {{ groupSummaryLogPage }} / {{ groupSummaryLogTotalPages }} 页
当前支持三种接入模式:Claude 接口(三项)、OpenAI 接口(三项)和 OpenAI 授权(Anthropic 兼容)
配置档案会持久化,重启后不会丢失
配置档案(选择即生效)
当前生效档案:{{ activeAIProfileName }}
场景绑定配置
为空时自动回退当前生效档案
当前绑定:
问答={{ displaySceneProfileName(aiSceneConfig.qa_profile_id) }},
水群={{ displaySceneProfileName(aiSceneConfig.auto_chat_profile_id) }},
人生感悟={{ displaySceneProfileName(aiSceneConfig.think_profile_id) }},
关键词监控={{ displaySceneProfileName(aiSceneConfig.keyword_forward_profile_id) }},
轻量任务={{ displaySceneProfileName(aiSceneConfig.lightweight_profile_id) }},
图片判妹={{ displaySceneProfileName(aiSceneConfig.girl_image_recognition_profile_id) }}
{{ aiSceneConfigMsg }}
Claude 接口(三项)
OpenAI 接口(三项)
该模式会直接使用 OpenAI 兼容接口;`OPENAI_BASE_URL` 请填写完整基址,通常应包含 `/v1`。
OpenAI 授权(Anthropic 兼容)
Codex OAuth 登录
授权状态:{{ codexOauth.state }}
{{ codexOauth.status }}
该模式会自动启用 OPENAI_CLAUDE_COMPAT=true,并固定使用 AI_PROVIDER=anthropic。
错误: {{ codexOauth.error }} - {{ codexOauth.errorDescription }}
(请求 ID:{{ codexOauth.requestId }})
授权链接:
回调 URL 示例: {{ codexOauth.redirectUri }}?code=...&state=...
授权跳转到 localhost 后,复制完整 URL 粘贴到下面并提交。
{{ aiConfigMsg }}
系统配置(从环境变量迁移到控制台管理)
保存后会写入持久化文件和 .env
命令输入框留空表示彻底关闭对应命令,不会自动恢复默认命令。
Telegram 功能开关(关闭后不注册命令,旧入口也会失效)
默认 20,建议 10-50。
这里只限制 Telegram Webhook 机器人的群聊消息。留空或填
all 表示不限制;私聊始终允许。`BOT_STORE_ALLOWED_GROUPS` 控制哪些群能入库,`BOT_ASK_ALLOWED_GROUPS` 控制哪些群能触发问答。
只影响关注通知命中。例子里“桃夭”和“TY”会被视为同一家,支持多组、多行配置;历史逗号写法也继续兼容。
`/s` 和 `/girl` 都搜索 `chat.db`;`/girl` 会额外按报告特征词筛选,并按店铺/妹妹聚合结果。上面的允许群配置只控制哪些群或私聊可以发起搜索,不限制结果来源群。
开启 `GIRL_SEARCH_DEBUG=true` 后,`/girldebug` 会返回候选、AI 抽取和过滤原因,便于定位错分店、漏报告和去重问题。
默认 50,候选数 ≤ 阈值时一次性发给 AI,超过则按批次处理。
默认 30,分批后每批发给 AI 的候选条数上限。
读查询超时(读线程池)
控制「读查询超时(…ms): messages.query」等熔断时间。保存后下一次查询立即生效,无需重启。单位毫秒。
默认 10000。覆盖 messages.query、报告列表、站内搜索等。
默认 60000。大屏 stats / 群列表聚合。
默认 120000。/girl 全表 LIKE 冷盘扫描。
提示:部分配置(如 Telegram 机器人令牌、Webhook 地址)建议保存后重启服务再确认。
{{ controlConfigMsg }}
文案/提示词中心
这里集中管理发给 Telegram 的固定系统文案,以及发给 AI 的业务运行时提示词。保存后对新请求立即生效。
Telegram 文案
{{ section.title }}
{{ section.description }}
可用变量:{{ section.placeholders }}
空内容会按
{} 保存。建议先点“格式化”,再点“保存”。
{{ contentConfigValidation[section.id].message }}
AI 提示词
{{ section.title }}
{{ section.description }}
可用变量:{{ section.placeholders }}
JSON 必须是对象,键名和字符串都要用双引号。
{{ contentConfigValidation[section.id].message }}
{{ contentConfigMsg }}
{{ activeContentConfigModalSection.title }}
{{ activeContentConfigModalSection.description }}
可用变量:{{ activeContentConfigModalSection.placeholders }}
这里是放大编辑区,直接修改会同步回原来的编辑框。
{{ contentConfigValidation[activeContentConfigModalSection.id].message }}
统一运行日志
按功能控制日志开关,按时间/trace 检索,并导出 NDJSON 供性能分析与排障。
{{ logFeatureMeta[feature]?.label || feature }}
{{ logFeatureMeta[feature]?.description || '运行日志功能域' }}
{{ logConfigMsg }}
日志检索
默认按时间倒序。点击 trace_id 可直接过滤整条链路。
{{ appLogMsg }}
日志加载中...
暂无日志
| 时间 | 功能 | 组件 | 事件 | 耗时 | Trace | 状态 |
|---|---|---|---|---|---|---|
| {{ formatTime(log.ts_ms) }} | {{ logFeatureMeta[log.feature]?.label || log.feature }} | {{ log.component }} | {{ log.event }} | {{ formatDurationMs(log.duration_ms) }} | - | {{ log.level }} |
共 {{ appLogTotal }} 条
{{ appLogPage }} / {{ Math.ceil(appLogTotal / pageSize) || 1 }}
{{ appLogDetail.event }}
{{ appLogDetail.component }} / {{ appLogDetail.function_name || '-' }}
{{ prettyJson(appLogDetail) }}