40 Commits

Author SHA1 Message Date
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