企微好友单聊 AI 主动首触 + 自动代回 · 0→1

方案B · 企业微信 PC 客户端 GUI 自动化 · 无影云电脑通道 · 上线灰度 2026-07-01 · PR #679→#716 已合 main · 当前脚本 paste.rs/zuwTI
✅ 首触端到端真发验通 ✅ 代回话术验通(有大有小口径) ✅ 多轮长对话跑顺(含客户连发合并) 3 道防误回护栏 + 归属判定 读屏「按序抄→取最后一条」不判最新 中性称呼 · 随机 1-3 条气泡 主号无隔离 · 灰度从严
01 / 第一个案例

首触 + 代回,真实链路产物

这些都是真实链路跑出来的原样话术(云电脑 GUI 读发 / 端点直调),不是示意。首触面对的是已经加了企微好友、但我方还没开口的人;代回面对的是已加好友、回了消息的人——两边都不再向客户要微信号。

① 首触 — 新好友刚通过,我方主动打第一句

你好呀,我是小文,做全屋定制好几年了。咱们家房子是新房还是翻新呢?
小文(云电脑真发实测)· 中性招呼(无哥/姐) · 不要微信 · 不提视频 · 只问一个 · 钉死一条

② 代回 — 客户问价(有大有小柜体口径,非抖音整装)

你们做衣柜吗?多少钱
您家大概哪个城市呀?咱们家是全国连锁,各地都有门店,能就近安排对接。 衣柜当然做,全屋柜体定制都是 568 元/投影㎡,江浙沪京深另加 100 元/㎡。 您要是方便说下面积和户型,我帮您大概算个数,比干聊价格更准哈。
小文 · 568/投影 口径 · 问面积城市 · 引导就近门店

③ 代回 — 客户问「怎么加你们微信」(关键:已是好友,不再抛号)

怎么加你们微信
您这不已经加上了吗~咱们现在就是在企业微信上聊呢 您是想了解哪方面呀?我让设计师直接对接也一样的 您家房子是在哪个城市呀?咱们就近安排门店看看
小文 · 正确识别「已经加上了」,不再抛 Homedz3791 / 备注抖音名 — badcase #7 修复后效果
02 / 0→1 逻辑原理

GUI I/O 在云电脑,大脑 / DB / 成本全在云端

云电脑 Python 只做看屏幕 + 点鼠标打字认人、生成话术、落库、算成本全在 TS 端点。云电脑(国内 IP)连不上 Vercel,走 Fly 中转纯透传。

① 风控门
工作时间 9-21 · 日限 20 · 时限 8 · 每客户连发 ≤6 · 随机间隔 25-70s
② 抢窗口
ctypes 硬置前 + 最大化;没铺满屏就跳过本轮(不往错位窗口瞎点)
③ VL 读屏
截图 → 看有无未读 → 点开最上会话 → 读会话状态(新好友? 客户消息? 发送方?)
↓ 分流
④A 新好友待首触
会话只有「已添加/可以开始聊天了」系统提示、无真人对话 → action:opener
④B 客户回了消息
最新一条是客户发的 → 过两道护栏 → action:generate
↓ Fly 中转(纯透传,绕 Vercel 大陆不可达)
⑤ TS 端点 · chatReply
按 persona(销售身份壳)认人 → 首触走企微专属 opener prompt(早退,不套抖音 ice_break)/ 代回走有大有小 nurture/decision 规则 → 幂等去重 → Langfuse 计费
↓ 回话术
⑥ GUI 发送
点输入框 → 逐字 Unicode 打字(绕 IME)→ Enter。首触钉死单条;代回按换行最多 3 段
⑦ confirm 落库
只在真发出后才记 AI 消息(显式失败)+ 记入「我方近发文案」缓冲(供护栏①)
蓝=云电脑 GUI · 紫=云端大脑 · 绿=发送落库。首触与代回同一个 loop、同一套发送/风控,只在第③步分流。

三道确定性护栏(不靠 LLM / VL 自觉)

护栏① 防自问自答
读到的「客户消息」若 == 我方近发文案 → 判 VL 发送方误判,跳过(否则会回复自己、连发)
护栏② 防误读联系人
读到的「消息」若 == 会话名 → VL 把联系人标题/空会话当消息了,跳过
护栏③ 窗口校验
企微没铺满屏(抢窗口失败)→ 本轮不动作,避免坐标落偏点空
03 / 灰度状态 · Badcase · 优化

首日上线灰度 + 9 类 badcase 全数收敛

功能 2026-07-01 当日上线真发,仍在灰度初期——规模化数据待积累。下面是灰度口径与首批验证;badcase 表是这轮 0→1 真实踩到并已修的问题。

20 / 8
日限 / 时限(灰度从严)
首触1/代回1-3
首触钉死1条·代回随机1-3条
15+ 类
badcase 已收敛
3 道
确定性防误回护栏

灰度策略:主号无隔离,日限/时限从严、工作时间 9-21、随机间隔起步,稳定后再放量。首触、代回、多轮长对话(含客户连发合并)均已在真实对话上跑通。规模化 KPI(首触触达率 / 客户回复率 / 加微→到店转化)随真实客流积累后补。

Badcase → 根因 → 优化 → 进展

现象(badcase)根因优化方式进展
首触问客户「发个微信号我让设计师加你」复用抖音 ice_break,其核心目标就是把人导到微信;但企微里已是好友首触早退企微专属 opener prompt,完全不套抖音模板#691 已修
首触编造「刷到你家装修的视频了」ice_break 的视频引用 + temp 0.8 波动,脑补不存在的上下文专属 prompt 明写「对客户一无所知」+ 禁编造视频/评论/户型#689/#691 已修
把女生客户叫「X 哥」从昵称猜性别,企微对客户零可靠信息,必翻车首触一律中性「你好/你好呀」,禁加哥/姐/老板等性别身份后缀#691 已修
首触发成好几条气泡发送函数按换行拆气泡(代回要的行为)首触 single_bubble:换行并空格钉死一条#692 已修
客户没回复,连发好几条(自问自答)VL 偶把我方已发消息的发送方判反、读成客户消息护栏①:读到 == 我方近发文案 → 跳过(确定性)#695 已修
对着联系人名 / 空会话乱回复VL 把会话标题当成客户消息,is_external 也判错护栏②:消息 == 会话名 → 跳过#698 已修
代回冒「加微信 Homedz3791/备注抖音名/DM/前面聊过」会话被自问自答灌了假历史 + base 带品牌微信号,LLM 顺手抖音收口企微 nurture/decision 红线硬禁加微信/DM/编造前情 + 清污染会话#702 + 清库 已修
鼠标偶尔没点到输入框无影上 pygetwindow 抢窗口不稳,窗口没真最大化 → 坐标落偏ctypes 硬置前+最大化 + 护栏③没铺满屏就跳过已修
生僻字昵称读错(巭孬嫑勥烎→奚舜翼舜炎)VL 认生僻字精度不足中性称呼缓解(拿不准就只「你好」不硬叫名);根治待换更强 VL缓解 · 待根治
下午·读屏可靠性攻坚(VL 判"谁发的/哪条最新"不稳,逐层收敛)
护栏①精确匹配漏 — VL 把首触读串一字仍自回「咱们家房子」被读成「咱们房子」,精确匹配认不出是我方消息护栏①改模糊匹配(相似度≥0.88),容忍 VL 读串字#703 已修
对同一条客户消息重复回好几遍VL 重读/读串字,端点指纹去重认不出护栏③ 每会话回复台账:这条(模糊)已回过 → 不再回#704 已修
漏读客户新消息 — 读成上面我方大气泡让 VL 判"哪条最新"不可靠:被又长又显眼的气泡带偏 / 消息少时顶部对齐下方一片空白 / 长会话没滚到底VL 按上→下顺序列出所有消息、代码取最后一条(不判最新)+ 滚到底加狠(14×3000+End)#705/709/710/715 已修
代回反复强推「加微信 Homedz3791/备注抖音名」抖音「4 轮兜底 hard-gate」满 4 条 AI 就强推微信号,只数条数、没判 persona企微(persona 命中)豁免抖音 hard-gate,收口交给有大有小规则(约到店)#712 已修
客户连发几条,只回最后一条、漏中间只读最后一条消息回我方最后一条之后的所有待回消息合并一次覆盖回;边界用归属判定(不靠 VL 左右)→ VL 误标也不漏#716 已修
代回总固定连发 3 条,太规整像机器文案多段被按换行拆气泡、常正好 3 条随机 1~3 条气泡(自然段随机分组合并)#714 已修
随机合并后又把我方消息当客户回(自回复发)合并气泡后防自回缓冲存的是"整块",但 VL 读回常按单个自然段读,单段比整块相似度不够、漏判发送时把合并前原始段落也记进缓冲(整条/合并块/单段都能命中)#718 已修

运维教训:.env 被 PowerShell Get-Content|Set-Content 按系统 ANSI 重写、损坏 UTF-8(中文注释成非法字节)→ load_dotenv 整体失败静默回退。改用 .NET UTF-8 无 BOM 读写;下载脚本用 curl.exe(PS5 的 Invoke-WebRequest 进度条会卡死下载)。

核心认知(下午沉淀):GUI+VL 从截图判"谁发的/哪条最新"本质不稳,是方案B 的先天局限。防线思路已从「信 VL 的判断」进化到「不信 VL、用确定性纠偏」——读屏改「按序抄→代码取最后一条」、发送方改「按是不是我方发过的判归属」(不靠左右)、叠三道护栏(防自回/防误读联系人/防重复回)。多发(骚扰)基本摁死,漏读靠"滚到底+按序抄+下轮重读"兜底;真正根治需官方企微 API(现被 ICP/可信 IP 卡住)。

04 / 下一步待做

优化列表

🎯
首触触达率监控KEY
有多少新好友通过后被成功首触、多少漏(VL 没检出 / 抢窗口失败跳过)。没有这个就不知道覆盖率。
📊
数据看板
每日首触量 / 代回量 / 护栏跳过率 / 客户回复率 / 加微→到店转化,落公开日报页。
🔤
VL 名字精度
生僻字/emoji 昵称读错 → 换更强 VL 或加「名字置信度低就不叫名、只用你好」的确定性判定。
🧑‍🤝‍🧑
is_external 内部号误判
内部同事企微号偶被当外部客户 → 加内部号白/黑名单,护栏兜底。
🚨
心跳告警
loop 挂了 / 连续异常自停(写 STOP)/ 登录过期 → 推 Lark,别等运营发现才知道停了。
👥
persona 覆盖补齐
现有 4 个身份壳(小夏/小范/小文/小武);阳阳等未注册的销售号接入前要先补 persona,否则回退默认。
🧹
防污染长效机制
自动识别/清理 VL 误读产生的脏会话,避免假历史再污染代回话术。
🧠
代回多轮上下文质量
记住客户给过的户型/面积/城市,别重复问;把话题稳步推向到店。
⏱️
首触节奏拟人化
好友通过后随机延迟几分钟再打招呼,更像真人、降风控风险。