{{ 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.composed_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 }}
问答前置提示词配置
问答组合提示词完成后,按每条配置的关键词从消息库搜索,取最新一条消息,按模板渲染后拼在提问词最前面。
{{ qaPrefixMsg }}
已配置关键词
暂无配置,在右侧新增
{{ cfg.keyword }}
{{ cfg.enabled ? '启用' : '停用' }}
{{ cfg.template }}
{{ qaPrefixForm.id ? '编辑配置' : '新增配置' }}
可用变量:
{{ '{{' + ph.key + '}' + '}' }}({{ ph.desc }})
预览
命中:{{ qaPrefixPreview.matched ? '是' : '否' }}({{ qaPrefixPreview.message.sender }} · {{ qaPrefixPreview.message.message_time_east8 }})
{{ qaPrefixPreview.rendered_text || '(未命中消息,模板按空内容渲染)' }}
查询缓存不按时间过期,只有最新水位推进才失效。查询会话:普通 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 }}
{{ shuiquanMsgError }}
运行状态
{{ shuiquanStatus?.running ? '运行中' : '已停止' }}
按消息条数间隔发言:群里每新增 {{ shuiquanStatus?.tickIntervalMs ? '' : '' }}{{ shuiquanGroupForm.messageInterval }} 条消息,真人账号插一句话;冷群不发言,发言不回复任何人。日志在「水群日志」页筛选
UserBot水群 查看。| 群 | 间隔(条) | 语境(条) | 活跃时段 | 待触发 | 上次发言 | 最近原因 |
|---|---|---|---|---|---|---|
|
{{ g.name }}
{{ g.chat_id }}
|
{{ g.message_interval }} | {{ g.context_message_count }} | {{ g.active_hours || '全天' }} | {{ g.pending_delta }} / {{ g.message_interval }} | {{ g.last_spoken_at ? formatTime(Math.floor(g.last_spoken_at / 1000)) : '从未' }} | {{ g.last_trigger_reason }} |
暂无群配置,先添加一个群。
测试生成
生成内容不会发送,确认后点「发送到群」才发(发送前可修改文字,最多 10 字)。
{{ shuiquanTestMsg }}
水群群配置
| 群 | 启用 | 间隔(条) | 语境(条) | 自史(条) | 保留(条) | 活跃时段 | 操作 |
|---|---|---|---|---|---|---|---|
|
{{ g.name }}
{{ g.chat_id }}
|
{{ g.enabled ? '启用' : '停用' }} | {{ g.messageInterval }} | {{ g.contextMessageCount }} | {{ g.selfHistoryCount ?? 50 }} | {{ g.keepMessageCount ?? 0 }} | {{ g.activeHoursStart !== null ? g.activeHoursStart + ':00-' + g.activeHoursEnd + ':00' : '全天' }} |
暂无群配置。
独立提示词(不复用机器人人格,保存后立即生效)
人设 persona.md
拟人化规则 rules.md
清空某项可恢复为 agents/userbot-shuiquan/ 下的默认文件内容。
加载中...
{{ '加载失败:' + 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 }}
AI 每天续写一章《小波在广州》,正文追加到
novel.md;配了频道/群 ID 就同步推送。首次开启前建议先点「立即写一章」试跑,AI 会先读已有章节再往下续写。
{{ novelMsg }}
运行状态
开关:{{ novelConfig.enabled === 'true' ? '已开启' : '已关闭' }}
每日时间:{{ novelConfig.daily_time || '-' }}
下次自动触发:{{ novelStatus?.nextRunAt || '-' }}
已生成章节:{{ novelStatus?.chapterCount || 0 }} 章
上次运行
时间:{{ novelStatus?.lastRunAt ? formatTime(novelStatus.lastRunAt) : '尚未运行' }}
结果:{{ novelStatusLabel }}(今日自动完成:{{ novelStatus?.lastAutoDateKey || '无' }})
错误:{{ novelStatus.lastRunError }}
文件加载失败:{{ fileLoadError }}
Markdown 预览
编辑 novel.md
{{ fileSaveMsg }}
🥧 Pi 历史会话
● 连通正常 ({{ piSessions.length }} 个会话)
○ 未连接服务 ({{ piStatus.error || '不可达' }})
⚡ {{ runningPiCount }} 个任务进行中
⚠️ {{ piLoadError }}
提示:Pi Web 默认运行于
{{ piWebUrl || 'http://127.0.0.1:30141' }}。可在终端执行 pi-web --no-open 启动,或点击右上角「设置地址」修改服务地址。
{{ piSessions.length === 0 ? '暂无 Pi 历史会话' : '没有匹配的会话记录' }}
{{ piSessions.length === 0 ? '请确认 Pi Web 服务已启动并在该机器有会话记录' : '尝试清除或更换筛选条件' }}
● 运行中
{{ s.name || getFirstLine(s.firstMessage) || s.id }}
{{ s.messageCount || 0 }} 条消息
🌿 {{ s.branch }}
{{ s.firstMessage || '(无首条提问内容)' }}
📁 {{ getProjectShortName(s.cwd || s.projectRoot) }}
创建: {{ formatTime(s.created) }}
活动: {{ formatTime(s.modified) }}
ID: {{ s.id ? s.id.slice(0, 8) + '...' : '-' }}
共 {{ filteredPiSessions.length }} 条 · 第 {{ piPage }} / {{ maxPiPages }} 页
{{ selectedPiSession.name || getFirstLine(selectedPiSession.firstMessage) || selectedPiSession.id }}
● 运行中
🌿 {{ selectedPiSession.branch }}
{{ selectedPiSession.messageCount || 0 }} 条对话
📁 {{ selectedPiSession.cwd || selectedPiSession.projectRoot || '-' }}
·
ID: {{ selectedPiSession.id }}
正在渲染 Pi 会话导出详情...
设置 Pi Web 服务地址
指定控制台连接 Pi 服务的地址(默认为
http://127.0.0.1:30141)。在远程部署或使用代理端口时进行调整。
{{ piConfigMsg }}
文件加载失败:{{ 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} 个群,将汇总为“其他群聊”` : '当前已全选,不会额外生成“其他群聊”') : '“其他群聊”已关闭,只生成勾选群组' }}
{{ group.channel_name || '未知群组' }}
{{ group.channel_id }}
{{ group.message_count }} 条
{{ groupSummaryLatestLabel(group) }}
暂无群组数据
生成配置
已选「{{ groupSummaryQuickRangeLabel(groupSummaryQuickRange) }}」:{{ groupSummaryForm.start_time }} ~ {{ groupSummaryForm.end_time }}
群日报分割线模板和日报提示词已迁到“文案/提示词中心”统一管理。这里保留模型、发送目标等运行参数;定时调度已改为下方独立的多定时列表,每条可单独配置。
{{ groupSummaryAutoCombineEnabled ? '本轮群日报全部生成完成后,会自动再生成一张“广州MMK YYYY年MM月DD日日报”总汇总卡。' : '关闭后,需要手动点击“生成总汇总”按钮。' }}
{{ groupSummaryIncludeOthersEnabled ? '开启后,手动生成会额外生成一张“其他群聊”卡片。' : '关闭后,手动生成只处理勾选群组。' }}
定时生成日报
可配置多条定时,每条独立设置参与群组、间隔(1~24 小时,整点对齐)、每天触发时间(1 天档)、发送群组与机器人;每次触发汇总最近一个间隔的聊天记录。
调度器:{{ groupSummarySchedulesStarted ? '已启动' : '未启动' }}
{{ groupSummarySchedulesMsg }}
还没有定时日报,点击「新增定时」创建第一条
{{ schedule.name }}
{{ schedule.enabled ? '已启用' : '已停用' }}
{{ groupSummaryScheduleIntervalLabel(schedule) }}
发送群: {{ schedule.send_chat_id }} · 群组 {{ schedule.group_ids.length }} 个 + 其他群聊汇总
状态:{{ groupSummarySchedulerStatusLabel(schedule.status.last_run_status) }}
上次时段:{{ schedule.status.last_triggered_slot || '-' }}
下次触发:{{ groupSummaryScheduleNextRunLabel(schedule.status) }}
上次运行:{{ formatTime(schedule.status.last_run_finished_at) }}
最近原因:{{ groupSummaryScheduleReasonText(schedule.status) || '-' }}
{{ groupSummaryScheduleEditor.id ? '编辑定时' : '新增定时' }}
{{ groupSummaryScheduleEditorMsg }}
参与群组(已选 {{ groupSummaryScheduleEditorSelectedCount }} 个)
{{ group.channel_name || '未知群组' }}
{{ group.channel_id }}
{{ group.message_count }} 条
暂无群组数据,请先在上方「刷新群组」加载群组列表
手动发送文本到日报群
这里发送的是你手输的文本,支持 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 兼容)和 Pi Agent(复用 Claude 三项 + 工具白名单)
配置档案会持久化,重启后不会丢失
配置档案(选择即生效)
当前生效档案:{{ activeAIProfileName }}
场景绑定配置
为空时自动回退当前生效档案
当前绑定:
问答={{ displaySceneProfileName(aiSceneConfig.qa_profile_id) }},
水群={{ displaySceneProfileName(aiSceneConfig.auto_chat_profile_id) }},
人生感悟={{ displaySceneProfileName(aiSceneConfig.think_profile_id) }},
连载小说={{ displaySceneProfileName(aiSceneConfig.novel_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`。
Pi Agent(复用 Claude 接口三项)
Pi 复用上面的 URL/Token/模型;以 --no-context-files 关闭自动发现,仅加载 CLAUDE.md 人设。
Pi Agent(复用 OpenAI 接口三项)
Pi 直接以 OpenAI 兼容接口(chat/completions)调用上面的 URL/Key/模型,无需本地兼容层;凭据与「OpenAI 接口」模式共享。仅加载 CLAUDE.md 人设。
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) }}
主用户可新增/编辑/删除子用户,并勾选每个子用户可见的导航项(仅控制界面显示)。登录时账号留空即主用户;子用户用「账号 + 密码」。
{{ usersLoadError }}
用户列表加载中...
| 账号 | 可见导航 | 创建时间 | 更新时间 | 操作 |
|---|---|---|---|---|
| 暂无子用户 | ||||
| {{ u.username }} | (无可见导航) {{ navLabel(u.navs) }} | {{ formatTime(u.createdAt) }} | {{ formatTime(u.updatedAt) }} |
|
{{ userMsg }}
{{ userForm.id ? '编辑用户:' + userForm.username : '新增用户' }}
设置账号密码,并勾选该用户可见的导航项(仅控制界面显示)。
{{ userFormMsg }}
当前账号没有可见的导航项,请联系主用户配置。