AskaEth
|
88755e131a
|
fix: 工具名过滤、消息拆分提示词优化
- filterActions: 过滤DeepSeek直接输出工具名(如vision_analyze)的怪话
- 系统提示词: 明确告知用双换行(空行)拆分多条消息
- 群聊规则: 加入独立想法用双换行分隔的说明
|
2026-06-29 12:57:21 +08:00 |
|
AskaEth
|
44048b333a
|
fix: 死锁修复、管理员权限集中管控、群聊频率控制、表情映射修复
thinker.go: 移除所有 defer t.muUnlock() 持锁跨阻塞调用的模式,消除8处死锁点
- performThink: defer→立即解锁,LLM调用不再持锁
- lightThinkLoop: defer在for循环内→第2次迭代自死锁
- resetSilenceTimer: defer持锁调performThink
- UpdatePresence: defer持锁调time.Sleep+performThink
- storeThought: defer+panic→锁泄露; 移除extractProactiveMessage嵌套锁
is_admin三层防御:
- synthesizer: 系统提示词注入管理员/非管理员身份标签
- iot_provider: 非管理员直接拒绝IoT操作
- plugin-manager: ToolDefinition.AdminOnly自动拦截,集中管控
群聊优化:
- group_ambient: 强化审查指令,【不发送】自审查标签
- 群聊间隔4s→3s,最多2条/轮
- 工具失败也推跟进消息,避免沉默
平台桥接:
- 日志文件名使用适配器唯一标识符(ConfigName)
- QQ表情映射替换为官方116条目数据
- CQ表情保留名称/ID
|
2026-06-28 20:22:09 +08:00 |
|
AskaEth
|
236dbfcc92
|
fix: 删除performThink中孤儿muUnlock
|
2026-06-28 17:22:30 +08:00 |
|
AskaEth
|
d63322244c
|
fix: performThink defer unlock改回立即unlock——LLM调用期间不能持锁
|
2026-06-28 17:19:03 +08:00 |
|
AskaEth
|
d4c246fa0c
|
fix: 移除有问题的runtime.SetFinalizer
|
2026-06-28 17:07:24 +08:00 |
|
AskaEth
|
76e648aac3
|
fix: 回退thinker.go到6490c34稳定版
|
2026-06-28 16:58:55 +08:00 |
|
AskaEth
|
32160d9453
|
fix: 回退muLock为简单版本,保留deadlock监控
|
2026-06-28 16:57:36 +08:00 |
|
AskaEth
|
1d4560e676
|
fix: PROACTIVE_MSG_MIN_GAP_SEC=0 写入.env
|
2026-06-28 16:37:25 +08:00 |
|
AskaEth
|
1f52b424e1
|
fix: 主动消息默认频控1分钟
|
2026-06-28 16:36:07 +08:00 |
|
AskaEth
|
2835d62d41
|
feat: 主动消息频控默认关闭 (0=disabled, 设秒数开启)
|
2026-06-28 16:35:39 +08:00 |
|
AskaEth
|
6490c341e5
|
fix: 主动消息频控从30分钟降到5分钟 + 拦截后清除标记防止LLM幻觉
|
2026-06-28 16:34:47 +08:00 |
|
AskaEth
|
d196a22f42
|
fix: 所有muLock改为defer unlock防止panic孤儿锁
|
2026-06-28 16:27:40 +08:00 |
|
AskaEth
|
24d7722ef9
|
fix: storeThought orphaned lock → defer unlock
|
2026-06-28 16:16:35 +08:00 |
|
AskaEth
|
dc410c1cff
|
debug: 死锁监控+DebugMutex+ChSend+GoStart 调试工具
|
2026-06-28 13:01:54 +08:00 |
|
AskaEth
|
bebacf805b
|
fix: 使用Data字段返回权限拒绝提示给LLM
|
2026-06-28 12:13:13 +08:00 |
|
AskaEth
|
ca43604eba
|
fix: IoT权限拒绝改为LLM生成自然回复
|
2026-06-28 12:12:33 +08:00 |
|
AskaEth
|
56b105a1dc
|
fix: IoT控制双层权限 — LLM先行判断 + 代码兜底拦截
|
2026-06-28 12:10:53 +08:00 |
|
AskaEth
|
310a8733c8
|
fix: IoT设备控制仅限管理员
|
2026-06-28 12:06:09 +08:00 |
|
AskaEth
|
1e652b5f32
|
fix: 主动消息禁止编造场景 + 同步推送到QQ
|
2026-06-28 11:53:46 +08:00 |
|
AskaEth
|
a47c8be77b
|
fix: 主动消息同步推送到平台适配器(QQ)
|
2026-06-28 11:52:43 +08:00 |
|
AskaEth
|
2b3aa45547
|
fix: saveToDB 改为同步写,防止进程被杀时消息丢失
|
2026-06-28 11:44:42 +08:00 |
|
AskaEth
|
9b20f14ab9
|
fix: emitToolProgress recover on closed channel
|
2026-06-28 11:36:27 +08:00 |
|
AskaEth
|
5725075a31
|
fix: LoadFromDB Timestamp 赋值 + restoreContext 查20条消息
|
2026-06-28 11:32:17 +08:00 |
|
AskaEth
|
29f24b3036
|
fix: restoreContext 从会话历史取最近活动时间,不再用记忆条目时间
|
2026-06-28 11:30:15 +08:00 |
|
AskaEth
|
fd44b15d81
|
feat: 全链路优化 — 死锁修复、MD3主题、上下文持久化、群聊自然化、打字状态、知识库
**死锁根因修复**
- periodicThinkLoop:1015 orphaned lock → 删除(字段已原子化)
- RecordUserMessage 隔离为 recordMu
- atomic.Int64 替换 lastUserMessage/lastThinkTime 等
**MD3 / Android 17 主题**
- 毛玻璃卡片 (backdrop-filter)
- MD3 色彩令牌 (pink primary #f472b6)
- icons.js 独立矢量图标库 + 运行时 emoji 替换
- 无边框卡片、圆角按钮、阴影层次
**上下文持久化**
- AddMessage → saveToDB 异步写 PostgreSQL
- LoadFromDB 恢复 (admin-session-main + 懒加载)
- LLMMessage.Timestamp 字段
**群聊与适配器**
- group_ambient 模式: 非@消息让 LLM 自己判断是否插话
- 戳一戳动作消息总是回复
- NapCat 打字状态 (set_input_status, 最小3秒显示)
- HTTP API 配置 (http_url/http_token)
**知识库 & 防编造**
- knowledge.CanHandle 对 chat 意图也触发
- 关键词预筛选避免无关 embedding 调用
- persona + synthesizer 三重诚实规则
- 工具结果持久化到会话历史
**平台桥接器**
- detached:true Go进程独立存活
- ethend 重启自动接管已运行服务
- stop() 接管模式 taskkill/F/ PID
- Windows netstat 替代 fuser 获取 PID
- 重复适配器种子逻辑修复
- 失败转发日志 Direction: error
**崩溃诊断**
- crashlog 包 (Recover + WrapHTTP + LLMCall)
- /api/v1/debug/goroutines 端点
- thinker 操作日志 + 30s stats
- 日志写入 logs/ 目录持久化
Co-Authored-By: Claude <noreply@anthropic.com>
|
2026-06-28 11:29:29 +08:00 |
|
AskaEth
|
ebd6f40425
|
feat: 后台思考可被前台消息中断 — 用户发消息时cancel运行中的思考
|
2026-06-24 18:21:36 +08:00 |
|
AskaEth
|
fab934fb12
|
feat: performThink 10s休闲检查 + IsUserRecentlyActive — 后台让步前台
|
2026-06-23 21:52:02 +08:00 |
|
AskaEth
|
e83bd6febb
|
feat: 后台思考让步前台 — 用户10s内有活动则跳过非post_chat思考
|
2026-06-23 21:44:31 +08:00 |
|
AskaEth
|
7e0268a884
|
fix: reminder platform 改用 AdapterName(唯一标识符),不再硬编码 obv11
- ProcessParams/SynthesizeParams 新增 AdapterName
- main.go 传递 req.Source.AdapterName
- reminder_create 自动注入使用 adapter 名而非平台类型
Co-Authored-By: Claude <noreply@anthropic.com>
|
2026-06-23 21:27:02 +08:00 |
|
AskaEth
|
c75ddc13ea
|
fix: SynthesizeParams 加 ChannelID
|
2026-06-23 21:24:19 +08:00 |
|
AskaEth
|
27a497e397
|
feat: 群聊提醒 — 提醒关联平台/频道/适配器,到期发回原群聊
- reminder_create 新增 platform/channel_type/channel_id/adapter_name 参数
- Gateway Reminder 模型 + DB 迁移 + CRUD 全部支持新字段
- 提醒到期时:群聊提醒 → platform-bridge 发回原群聊
- 非群聊提醒 → 走 Web 端推送
- Thinker 新增 PushPlatformMessage 方法
Co-Authored-By: Claude <noreply@anthropic.com>
|
2026-06-23 20:57:58 +08:00 |
|
AskaEth
|
01feb16262
|
feat: 异步工具结果主动推送 — 通用回调机制
- Synthesizer 新增 resultPusher 回调字段
- executeAsyncAndStore 完成后自动推送结果
- Orchestrator.SetToolResultPusher 透传
- 回调通用设计,不绑定特定工具
Co-Authored-By: Claude <noreply@anthropic.com>
|
2026-06-23 20:42:55 +08:00 |
|
AskaEth
|
30d5b9b464
|
fix: 重新应用工具异步执行 (被git checkout丢失)
|
2026-06-23 20:39:51 +08:00 |
|
AskaEth
|
a3bdeba63a
|
feat: 工具调用全部异步,不再阻塞主会话
- 去掉8s超时同步执行,工具一律走 executeAsyncAndStore
- LLM立即收到[后台执行中]提示,继续生成回复
- 工具结果在下一轮对话中返回
Co-Authored-By: Claude <noreply@anthropic.com>
|
2026-06-23 20:35:11 +08:00 |
|
AskaEth
|
2ec49f0779
|
fix: ListReminders JSON解析 — Gateway返{reminders:[...]}而非裸数组
|
2026-06-23 20:32:10 +08:00 |
|
AskaEth
|
fea67d05eb
|
fix: reminder工具401认证 — 路由从JWT组迁到internal组
- Gateway新增 /api/v1/internal/reminders (GET/POST/DELETE)
- 使用 X-Internal-Token 认证,不再需要JWT
- GatewayClient URL改为 /api/v1/internal/reminders
Co-Authored-By: Claude <noreply@anthropic.com>
|
2026-06-23 20:19:23 +08:00 |
|
AskaEth
|
d38b92568b
|
feat: 自主思考可按需查看群聊上下文 — 【查看群聊:适配器名:群号】
- 思者可在反思中输出【查看群聊:obv11-main:531082168】主动获取群聊记录
- 查找平台频道表确认adapter名称对应的platform类型
- 通过 memory-service 拉取最近5条频道记忆注入思考
- 自动追加【继续思考】以处理获取到的上下文
- 分析结果保留在思考链中
Co-Authored-By: Claude <noreply@anthropic.com>
|
2026-06-23 20:12:20 +08:00 |
|
AskaEth
|
a2078b6662
|
feat: 主动消息写回对话历史 — 防止短期重复提问
- storeThought 推送主动消息后写入 convStore
- 轻量思考话题发起后也写入
- 配合提示词规则: 两小时内不重复问同类话题
Co-Authored-By: Claude <noreply@anthropic.com>
|
2026-06-23 20:01:43 +08:00 |
|
AskaEth
|
f3b588d848
|
fix: 上下文恢复加24h合理性检查 — 避免用远古记忆当最近活动
|
2026-06-23 19:38:54 +08:00 |
|
AskaEth
|
e0900bdd1b
|
feat: 重启后恢复上下文 — 从记忆服务查询最近活动时间
- 新增 restoreContext() 在 Start() 时查询持久化记忆
- 取最近记忆的 CreatedAt 设为 lastUserMessage
- 避免重启后思考出现"已经一天没说话了"
Co-Authored-By: Claude <noreply@anthropic.com>
|
2026-06-23 19:38:08 +08:00 |
|
AskaEth
|
1e2b2525f4
|
fix: 私聊主动消息路由修复 + 多账号自动适配
- 正则兼容 private_ 前缀: 【OBv11私聊:private_1487720750】
- prompt 显示频道时自动剥离 private_ 前缀
- extractProactiveMessage 自动查 PlatformChannel 表,
将 target.Platform 从格式key改为adapter实例名
多账号场景下自动路由到正确adapter
Co-Authored-By: Claude <noreply@anthropic.com>
|
2026-06-23 18:43:42 +08:00 |
|
AskaEth
|
8a3236b8bb
|
refactor: 彻底消除硬编码 qq — 平台标识统一为 obv11
- PlatformName() 返回 "obv11"
- platformFormats key: "obv11"
- 所有 platform == "qq" 检查 → "obv11"
- session prefix: platform_qq_ → platform_obv11_
- env var PLATFORM_CHANNELS: obv11:group:xxx
- ethend 平台标识同步更新
- 注释和测试用例同步
Co-Authored-By: Claude <noreply@anthropic.com>
|
2026-06-23 18:19:52 +08:00 |
|
AskaEth
|
c96bd23f83
|
feat: PlatformChannel 支持 AdapterID/AdapterName — 多账号全链路区分
- PlatformChannel 新增 AdapterID + AdapterName 字段
- AddOrUpdatePlatformChannel 接受 adapter 信息参数
- channel_sync 传递 adapter_id/adapter_name
- 消息处理路径传递 adapter_name
Co-Authored-By: Claude <noreply@anthropic.com>
|
2026-06-23 18:01:27 +08:00 |
|
AskaEth
|
9767abae89
|
feat: 2.2 主动话题发起 — 轻量思考扩展【话题发起】输出
- 轻量思考 prompt 新增话题发起指引
- 检测【话题发起】标记 → 提取内容 → 通过 messagePusher 推送
- 遵循 ProactiveGuard 频率控制
Co-Authored-By: Claude <noreply@anthropic.com>
|
2026-06-23 12:46:51 +08:00 |
|
AskaEth
|
bbf06da00f
|
feat: 1.3 记忆自然引用 — 记忆标签从'数据库检索'改为'自己的回忆'
- 记忆头: '以下是关于开拓者的重要记忆' → '你记得关于开拓者的这些事'
- 分类: '★核心记忆/●常用记忆' → '你很确定的事/最近发生的事/还有点印象的事'
- 增加规则: 禁止用「根据记忆」「检索到」等说法
Co-Authored-By: Claude <noreply@anthropic.com>
|
2026-06-23 12:45:44 +08:00 |
|
AskaEth
|
f9ee067674
|
feat: 1.2 情绪共振 — mood→行为映射替代情绪陈述
- 新增 buildMoodGuidance() 函数,5种心情各有行为描述
- 开心→话多♪多主动 | 调皮→撒娇逗人 | 沉思→安静温柔
- 担心→话少多关心 | 怀旧→提过去的故事
- 绝不陈述"你现在很开心",而是用行为让LLM自然表达
Co-Authored-By: Claude <noreply@anthropic.com>
|
2026-06-23 12:44:27 +08:00 |
|
AskaEth
|
f0e8ffa2bb
|
feat: extractProactiveMessage 单元测试 + 修复 log.Printf 格式化 bug
- 7 个测试覆盖:无标记/Web推送/OBv11群聊/私聊/@提及/否定语境/继续思考
- 修复 thinker.go:454 log.Printf %%v → %v 格式化错误
Co-Authored-By: Claude <noreply@anthropic.com>
|
2026-06-23 12:26:39 +08:00 |
|
AskaEth
|
0cd75c4dbc
|
feat: 人性化改进 Phase 1 — 不完美感 + 日周期状态机 + 小脾气
- 1.7.7 不完美感: system prompt 追加停顿/改口/翻找回忆规则
- 1.7.8 日周期: 新增 timePeriod() 函数,时段注入思考提示词
早晨/白天/傍晚/深夜/凌晨 五段式,自动调整语气和主动消息策略
- 1.7.9 小脾气: YAML 追加个性边界 — 深夜催睡/咖啡管控/撒娇/兴趣偏好
Co-Authored-By: Claude <noreply@anthropic.com>
|
2026-06-23 12:23:30 +08:00 |
|
AskaEth
|
6faef5b6e5
|
feat: 群聊并发 — 主会话繁忙时创建协会议话
- Orchestrator 新增 per-session 处理锁 + co-session 跟踪
- 主会话处理中时,新消息自动创建协会议话(并发 LLM 调用)
- 协会议话上限 3 个,超出排队等待 500ms
- 主会话结束后自动释放锁
Co-Authored-By: Claude <noreply@anthropic.com>
|
2026-06-22 21:07:16 +08:00 |
|
AskaEth
|
489657ec08
|
feat: 提醒到期 → LLM生成自然提醒语 → 推送
- Gateway ReminderScheduler 到期时调用 ai-core /api/v1/internal/reminder-trigger
- ai-core 用 LLM 生成温柔俏皮的提醒语,通过 messagePusher 推送
- Thinker 新增 TriggerReminderMessage 方法
- 环境变量: AI_CORE_URL (Gateway 已有)
Co-Authored-By: Claude <noreply@anthropic.com>
|
2026-06-22 21:04:21 +08:00 |
|