|
|
d9627ffbad
|
feat: v3 architecture - ConversationHistory + MessageDetector cursor
- Add src/core/conversation_history.py: JSON-persisted per-contact chat history
- One file per contact under histories/
- add_user() / add_assistant() for stable history maintenance
- to_llm_messages(max_count=100) replaces VLM snapshot as LLM context
- Rewrite src/core/message_tracker.py: cursor-based MessageDetector
- Replaces fingerprint-set approach (was fragile due to VLM non-determinism)
- _last_other cursor + _sent deque(50) for is_self flip protection
- MessageTracker kept as backward-compat wrapper
- Update test_live_monitor.py to v3:
- Uses MessageDetector for detection, ConversationHistory for LLM context
- history.add_user() on new message, history.add_assistant() after send
- Removes recently_sent set (superseded by detector._sent)
- Update src/wechat/controller.py: dynamic chat area detection, DPI helpers
- Update src/vlm/qwen_vl.py: analyze_chat_area(), find_contact_in_list()
- Update src/config/settings.py: chat area ratio settings
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
|
2026-04-13 22:53:56 +08:00 |
|
|
|
e33e5942c5
|
fix(ui): MainWindow.__init__ 添加 config=None 参数
|
2026-04-13 14:59:46 +08:00 |
|
|
|
0a9a2f150f
|
fix(ui): ThemeQSS.style_sheet → ThemeQSS.get_main_qss()
|
2026-04-13 14:54:03 +08:00 |
|
|
|
3282cbbfb5
|
fix: 修复 latest → other_msg 变量名
|
2026-04-13 14:52:52 +08:00 |
|
|
|
ccaddd9d9f
|
fix(ui): 添加缺失的 run_ui 函数
|
2026-04-13 14:51:38 +08:00 |
|
|
|
b2ee1f88f6
|
fix: 改用找到第一条对方消息来判断,而非依赖has_new_message
has_new_message 基于未读红点,不可靠。改为遍历消息列表,找到第一条对方发的消息作为回复目标。
|
2026-04-13 14:46:34 +08:00 |
|
|
|
e15323a594
|
fix: 修复无新消息仍自动回复的问题
- _poll_once 现在检查 VLM 的 has_new_message 字段
- 使用 is_self 字段判断是否为自己发的消息
- ChatSnapshot.has_new 使用 VLM 返回值而非硬编码 true
- 当 VLM 返回 has_new=false 时跳过回复
|
2026-04-13 14:24:38 +08:00 |
|
|
|
ce0ee4fd54
|
fix: 添加发送跟踪防止重复回复
- MessageProcessor.should_reply() 增加去重检查
- WeChatAgent.send_reply() 记录发送内容
- 30秒内相同内容被认为是重复消息
- 修复 VLM 误识别 is_self 的问题
|
2026-04-13 14:21:16 +08:00 |
|
|
|
9957f00f5a
|
refactor: 统一日志格式 [IN]/[OUT]/[REPLY]/[SELF]
- 日志格式: HH:MM:SS | LEVEL | 消息
- IN: 收到对方消息
- OUT: 发送消息
- SELF: 自己发的消息(跳过回复)
- REPLY: 触发回复
|
2026-04-13 14:15:38 +08:00 |
|
|
|
d14e78f1d6
|
fix(ui): QtSignal → Signal (PySide6兼容)
|
2026-04-13 14:12:58 +08:00 |
|
|
|
f869496ff8
|
docs: 更新README - Phase 2完成、UI模块说明、OpenViking集成
|
2026-04-13 14:07:46 +08:00 |
|
|
|
c0db9821c0
|
chore: PyQt6 → PySide6 (跨平台支持)
|
2026-04-13 14:01:37 +08:00 |
|
|
|
ce58df921e
|
Merge branch 'feature/ui-config'
|
2026-04-13 13:48:46 +08:00 |
|
|
|
83f86c7d70
|
Merge feature/ui-log: resolve conflict, add LogViewer
|
2026-04-13 13:48:46 +08:00 |
|
|
|
a2d50f75bc
|
Merge branch 'feature/ui-contacts'
|
2026-04-13 13:48:28 +08:00 |
|
|
|
8e2ead1964
|
Merge branch 'feature/ui-tasks'
|
2026-04-13 13:48:28 +08:00 |
|
|
|
7da4596447
|
Merge branch 'feature/ui-dashboard'
|
2026-04-13 13:48:28 +08:00 |
|
|
|
a3c693dde6
|
feat(ui): 配置编辑模块
|
2026-04-13 13:46:56 +08:00 |
|
|
|
2683498374
|
feat(ui): 联系人管理模块
|
2026-04-13 13:46:35 +08:00 |
|
|
|
b0523706fb
|
feat(ui): 任务管理模块
|
2026-04-13 13:24:50 +08:00 |
|
|
|
480f7bee42
|
feat(ui): 日志查看模块
|
2026-04-13 13:24:13 +08:00 |
|
|
|
888e350353
|
feat(ui): 基础UI框架
|
2026-04-13 13:21:01 +08:00 |
|
|
|
9931a2bb52
|
feat(ui): 仪表盘模块
|
2026-04-13 13:15:14 +08:00 |
|
|
|
bcea512661
|
Phase 2 完整实现 + UI 客户端
任务调度器改进(三种任务类型):
- long_running: 长期任务(持续监控 + 自动回复)
- specific: 特定任务(Cron 定时)
- proactive: 主动智能(条件触发)
Windows UI 客户端(PyQt6):
- src/ui/main_window.py: 主窗口
- 左面板: Agent 控制、联系人配置
- 中面板: 任务列表、运行日志、配置编辑
- 右面板: Agent 状态、活跃任务、最近活动
- 菜单栏: 文件、任务、帮助
main.py 改动:
- 新增 --ui 参数启动图形界面
- run_with_ui() 函数初始化 Agent 并启动 UI
|
2026-04-13 12:51:12 +08:00 |
|
|
|
06f88a8f73
|
改进任务调度器:支持三种任务类型
TaskType:
- long_running: 长期任务(持续监控 + 自动回复)
- specific: 特定任务(Cron 定时)
- proactive: 主动智能(条件触发)
Engine 改动:
- _handle_long_running_task: 处理长期任务的监控逻辑
- _schedule_send_message: 定时任务发送消息回调
- handlers 字典统一管理各种回调
待实现: 主动智能条件检查(_check_proactive_condition)
|
2026-04-13 12:49:06 +08:00 |
|
|
|
5b1b71728d
|
Phase 2: 任务调度系统
新增文件:
- config.tasks.yaml: 任务配置示例
- src/core/scheduler.py: 任务调度器
功能:
- Cron 表达式定时任务
- 变量替换: {{date}}, {{time}}, {{weekday}}, {{datetime}}
- 支持启用/禁用/立即执行
- 支持一次性任务
Controller 改动:
- 添加 switch_chat() 切换聊天功能
Engine 改动:
- 集成 TaskScheduler
- start/stop 时自动启动/停止调度器
- 支持 get_tasks, enable_task, disable_task, run_task_now
|
2026-04-13 12:42:47 +08:00 |
|
|
|
e2b7987c7e
|
Phase 1: 联系人分类管理
新增文件:
- config.contacts.yaml: 联系人配置示例
- src/core/contact_manager.py: 联系人管理器
功能:
- priority: 重点用户,自动回复
- ignore: 忽略列表,不回复
- normal: 普通用户,默认不回复
engine.py 改动:
- 集成 ContactManager
- 消息处理流程增加联系人分类决策
- 日志显示 contact_type (priority/ignore/normal)
|
2026-04-13 12:38:58 +08:00 |
|
|
|
bbeed8a42b
|
重写 _poll_once:三阶段确认机制
阶段1: 截图
阶段2: VLM分析(不依赖has_new_message)
阶段3: 去重检查(20秒窗口,dedup_key=sender|content)
阶段4: 回复决策(sender=='我'才跳过)
阶段5: 发送回复
关键原则:
- 完全忽略 is_self(VLM判断不可靠)
- 只有 sender='我'才跳过,其他都回复
- dedup_key 用 sender+content,20秒窗口
|
2026-04-13 12:34:41 +08:00 |
|
|
|
a841c2fac5
|
改用sender字段判断:忽略不可靠的is_self字段
问题:VLM的is_self经常判断错误(把对方消息标记为is_self=True)
修复:只用sender判断,sender不是'我'就回复
- sender='尾巴~' → 回复(对方)
- sender='我' → 跳过(自己)
- sender='公众号' → 回复(第三方)
- 防重复:20秒内不重复
|
2026-04-13 12:30:03 +08:00 |
|
|
|
4b89a73247
|
修复重复发送 + 改进AI回复质量
1. 防重复逻辑:15秒内不重复回复同一内容
2. sender过滤:跳过sender为'我'的消息
3. AI prompt改进:
- 只取最新6条消息
- 强调直接回复对方最后一条
- 要求简洁(20字以内)
- 清理引号前缀
|
2026-04-13 12:26:07 +08:00 |
|
|
|
42a8dc3fd7
|
改进 AI 回复模式
1. generate_reply: 改为优先关键词匹配,不匹配则调用 AI
2. _ai_generate_reply: 改进 prompt,加入对话上下文、微信风格要求
3. 要求回复简洁(50字以内),符合聊天风格
|
2026-04-13 12:20:17 +08:00 |
|
|
|
838f13998c
|
改用剪贴板粘贴+回车发送消息
方案:win32clipboard 设置剪贴板 → Ctrl+V 粘贴 → Enter 发送
优点:不需要定位输入框控件,稳定可靠
备选:pywinauto type_keys 实现
|
2026-04-13 12:16:02 +08:00 |
|
|
|
0a4f0ccdbb
|
简化回复逻辑:只要对方有新消息就回复,不依赖has_new判断
1. 移除has_new_message依赖,只要有对方消息(is_self=False)就回复
2. 修复防重复逻辑:基于消息内容+聊天名的hash,10秒内不重复
3. 移除多余的chat_key赋值
|
2026-04-13 12:11:30 +08:00 |
|
|
|
f325025365
|
修复:改进VLM未读判断 + 修复callback显示逻辑
1. VLM prompt: has_new_message 改为检查左侧边栏红点,而非右上角
2. engine.py: callback 显示最新消息,清晰标注 has_new
3. main.py: on_message 回调更新以显示 has_new 状态
|
2026-04-13 12:08:18 +08:00 |
|
|
|
b289d11ef5
|
修复消息顺序判断:VLM返回倒序,取messages[0]而非[-1]
问题:VLM返回消息按时间倒序(最新在前),代码取[-1]导致判断的是旧消息
修复:改为取[0]获取最新消息
|
2026-04-13 12:02:29 +08:00 |
|
|
|
1b981d8313
|
修复 VLM is_self 判断逻辑
关键修复:
- is_self 只看消息位置(右侧=我,左侧=对方),与 sender 名字无关
- 强调 has_new_message 看右上角红色标记
- sender 字段:右侧消息填"我",左侧消息填对方昵称
|
2026-04-13 11:59:53 +08:00 |
|
|
|
9dd6dbff44
|
优化日志和回复逻辑
- 改进 VLM prompt,明确说明微信左右消息布局判断 is_self
- 添加详细调试日志,追踪回复判断过程
- 改进 should_reply 逻辑,添加 sender/content 日志
|
2026-04-13 11:51:17 +08:00 |
|
|
|
11671944e0
|
修复模型名称: qwen-vl-plus
qwen-vl-latest 不是有效模型名,正确名称是:
- qwen-vl-plus (推荐)
- qwen-vl-max
参考阿里云官方示例代码
|
2026-04-13 11:41:30 +08:00 |
|
|
|
4e5bd2a5c7
|
更新 VLM 为阿里云百炼 Bailian
核心变更:
- src/vlm/qwen_vl.py: 重写为 BailianVLMClient(阿里云百炼)
- 支持 qwen-vl-latest 等模型
- analyze_chat_screenshot() 微信截图分析
- 使用 OpenAI 兼容 API 格式
- config/settings.py: 更新默认配置为阿里云百炼
- src/main.py: 添加 BailianLLMClient(阿里云百炼 LLM)
- requirements.txt: 添加 openai 依赖
- README.md: 更新文档
API 配置:
- 基础 URL: https://dashscope.aliyuncs.com/compatible-mode/v1
- VLM 模型: qwen-vl-latest(推荐)
- LLM 模型: qwen-plus
|
2026-04-13 11:34:36 +08:00 |
|
|
|
eb19d8d05f
|
初始化 WeChat Agent 项目
MVP Phase 1 核心模块:
- src/config/settings.py - 配置管理
- src/vlm/qwen_vl.py - Qwen-VL2 视觉模型接口
- src/wechat/controller.py - 微信客户端控制器(UIAutomation)
- src/core/engine.py - 核心引擎(轮询、消息处理、回复)
- src/main.py - 主入口
文档:
- README.md
- config.example.yaml
- requirements.txt
技术方案:纯视觉AI + UIAutomation
- 截图 → Qwen-VL2 识别 → AI 判断 → UIAutomation 操作
|
2026-04-13 11:12:49 +08:00 |
|