让采购员可以在 SYB 商品页批量发起「图搜」任务;Agent 用 PDD App 的拍照搜索找到商品并走现有采集链路完成采集与关联;自动建立的关联带「图搜」标注,采购员手动改过关联后标注自动消失。
图搜与现有 agent_current_page 是同一形态:任务创建时不知道是哪个 PDD 商品,Agent 执行中解析出身份再回填。区别只是谁打开那个商品页——现在是采购员手动打开,图搜是 Agent 自己搜出来打开。打开之后的链路(分享链接 → goods_id → IdentifyCurrentPage 回填 → 采集)完全复用。
agent_current_page
IdentifyCurrentPage
因此不新建任务表、不新增任务类型,只给 collection_task.source 增加一个取值。
collection_task.source
采购员目前日常就在手工使用 PDD 拍照搜索,现有的「临时任务」正是这么产生的:
手动打开 PDD -> 点拍照搜索 -> 从相册选 SYB 商品图 -> 看结果页 -> 肉眼挑一个(多半是第一个)-> 打开商品 -> 在 Agent「采集」tab 点「采集」按钮 -> Agent 读分享链接拿 goods_id -> 采集 -> 关联
本 MVP 要做的是把前三步交给 Agent,把"肉眼挑"替换为默认取第一个结果;后三步已经是现有能力,不改动。
由此已被日常使用证实的事实:
仍需真机确认的:入口按钮的 contentDescription 是否恰好为 拍照搜索,以及图搜页/结果页的文本判据是否与参考项目记录一致。人用图标识别,Agent 用无障碍树字符串识别,两者不等价;参考项目的常量来自其当时的 PDD 版本。
contentDescription
拍照搜索
在手机上把 PDD 停在图搜页与图搜结果页,各 dump 一次无障碍树,核对下列常量是否仍然成立。因入口与流程已由日常使用证实,本门禁只是一次字符串核对,不需要探索整条路径。
此项不通过则 #277 方案需重写,MVP 不启动实施。
参考实现位于本机 D:\chengma\cmroubao_old(同一作者的未完成项目),其 android-buyer/.../pinduoduo/ 下有已在真机走通过图搜入口的实现:
D:\chengma\cmroubao_old
android-buyer/.../pinduoduo/
PinduoduoImageSearchAsset.kt
PinduoduoImageSearchAutomation.kt
我的相册 + 最近搜索 + 历史浏览 + (点击拍照|开启相机权限|…即可进行自动识别)
最近项目
搜图片同款
PinduoduoGoodsIdOcr.kt
PinduoduoCheckoutOcr.kt
PinduoduoSpecificationVlm.kt
docs/current-state.md
CANDIDATE_RESULTS_NOT_READY
cards=0
建议顺序:U1 与 U3 并行起步 → U2(最耗时,需反复上真机)→ U4、U5 并行收尾。
待 U3 确定契约后更新 docs/08-agent-api-contract.md;业务规则与架构页面按实际改动在各单元工单内判断。
docs/08-agent-api-contract.md
用户要求实施 #275~#280,并仅在本地服务测试,不发布线上。
当前会话未提供 Gitea MCP,按仓库规则使用 Gitea API 回退;凭据只从已配置 gitea.env 读取。
设备 192.168.0.9:40103 已连接并现场核验:
192.168.0.9:40103
content-desc=拍照搜索
[941,161][1080,228]
我的相册
最近搜索
历史浏览
前置门禁已通过,可进入实现阶段;仍需人工授权高风险动作:#276 的运行时相册权限/Manifest 变更,以及 #278/#279 的数据库迁移。
release/283
c80d0c9
main
c14f5f5
go build ./...
go test ./...
npm run build:prod
#277 一行代码都没有,整条链路不可用。 服务端已能创建任务、下发参考图元数据、在结果回传后自动建立关联,但没有任何组件会去执行图搜。
docs/
BatchPreviewItem
服务端与 Web 的实现质量是好的,有三处超出工单要求:
pdd_product_id IS NULL AND image_search_linked = false
shopee_product
go test ./app/goauto/sybimport/... -> 12 个测试失败 main (c14f5f5) 同一包 -> 全绿
责任提交:aed295c(#272)、e0ed05d(#274)、b83f20c(#274)。与图搜无关,但该分支在修复前不能合入 main。
aed295c
e0ed05d
b83f20c
sybimport
仓库工作区存在两个包含凭据的未跟踪文件,且未被 .gitignore 覆盖,存在被 git add . 误提交的风险。建议尽快处理。此处不记录文件内容。
.gitignore
git add .
MVP 与五个单元工单状态均维持待实施。
五个单元工单的缺口全部补齐并上线。合并提交 1d01186,已推送 be03972..1d01186;发布 /home/goauto/releases/20260915-1d01186,二进制 SHA-256 前缀 65e404c4721d592a,服务 active。
1d01186
be03972..1d01186
/home/goauto/releases/20260915-1d01186
65e404c4721d592a
active
各单元的实施细节写在各自工单,此处只记录集成层面的结论。
本工单记录的门禁「在图搜页与结果页 dump 无障碍树,核对 拍照搜索 等常量」已于 2026-09-15 在真机执行(1080×2354,PDD HomeActivity / NewPageActivity)。
HomeActivity
NewPageActivity
[941,161][1080,228] ImageView clickable=true content-desc='拍照搜索'
点击拍照
[0,1892][210,1898]
535×764
[0,132][1080,2306]
移植自参考项目的常量基本可用。核对中发现四个坑,均已写入 PinduoduoImageSearchCriteria 注释与 docs/08-agent-api-contract.md:
PinduoduoImageSearchCriteria
[必须]
content-desc='拍照搜索'
[0,0][1080,2354]
visibleTexts()
即可进行自动识别
03:02
MediaStore.Files
IMAGE_SEARCH_ASSET_NOT_LATEST
ORDER BY
LinkPDD
结论:MVP 尚不可验收。 阻塞项是端到端真机执行未做(第 2、3 项),下一步是安装 debug APK 到真机跑一次完整图搜任务。
上次核对记录的「release/283 分支为红,12 个 sybimport 失败」在本次上线前重新调查,发现其中并非全是过期测试:
[必须] sybimport.Parse 把空格分隔的「颜色 尺码」整条当成颜色、尺码为空且判为 success,而 success 的行永远不进 AI 解析队列,因此没有任何机制会纠正。该缺陷随 #274 于 2026-09-14 已上线,线上有 152 条 parse_status='success' AND target_size=''。已单独建单 #284 并随本次一同修复上线;12 个过期测试单独记录为 #285,本次上线前后失败集合逐条 diff 完全一致,未新增。
sybimport.Parse
success
parse_status='success' AND target_size=''
因此本次上线内容为 #275~#280 图搜采集 + #284 解析修复,#272/#273/#274/#282/#283 保持原样。
MVP 与五个单元工单均保持待验收。
No dependencies set.
The note is not visible to the blocked user.
原始需求
目标
让采购员可以在 SYB 商品页批量发起「图搜」任务;Agent 用 PDD App 的拍照搜索找到商品并走现有采集链路完成采集与关联;自动建立的关联带「图搜」标注,采购员手动改过关联后标注自动消失。
非目标
方案概述
图搜与现有
agent_current_page是同一形态:任务创建时不知道是哪个 PDD 商品,Agent 执行中解析出身份再回填。区别只是谁打开那个商品页——现在是采购员手动打开,图搜是 Agent 自己搜出来打开。打开之后的链路(分享链接 → goods_id →IdentifyCurrentPage回填 → 采集)完全复用。因此不新建任务表、不新增任务类型,只给
collection_task.source增加一个取值。用户确认事实(2026-09-14)
采购员目前日常就在手工使用 PDD 拍照搜索,现有的「临时任务」正是这么产生的:
本 MVP 要做的是把前三步交给 Agent,把"肉眼挑"替换为默认取第一个结果;后三步已经是现有能力,不改动。
由此已被日常使用证实的事实:
仍需真机确认的:入口按钮的
contentDescription是否恰好为拍照搜索,以及图搜页/结果页的文本判据是否与参考项目记录一致。人用图标识别,Agent 用无障碍树字符串识别,两者不等价;参考项目的常量来自其当时的 PDD 版本。前置门禁(不建单)
在手机上把 PDD 停在图搜页与图搜结果页,各 dump 一次无障碍树,核对下列常量是否仍然成立。因入口与流程已由日常使用证实,本门禁只是一次字符串核对,不需要探索整条路径。
此项不通过则 #277 方案需重写,MVP 不启动实施。
参考实现位于本机
D:\chengma\cmroubao_old(同一作者的未完成项目),其android-buyer/.../pinduoduo/下有已在真机走通过图搜入口的实现:PinduoduoImageSearchAsset.kt:MediaStore 写图、"自己是否为相册最新一张"校验、写前清理、最小边不足 960 放大。可大段移植。PinduoduoImageSearchAutomation.kt:从商品详情/规格弹层/订单确认页归位回图搜入口的状态机。拍照搜索;图搜页我的相册 + 最近搜索 + 历史浏览 + (点击拍照|开启相机权限|…即可进行自动识别);选图锚点最近项目下方 4 列等宽网格取第一格;结果页搜图片同款+ 排序控件 ≥ 3。PinduoduoGoodsIdOcr.kt、PinduoduoCheckoutOcr.kt、PinduoduoSpecificationVlm.kt(违反本仓库 Agent 端不用 OCR/VLM 的规则);其后端与工作流引擎(架构不同)。docs/current-state.md停在 2026-08-01,大量任务 DOING。其 T-271 记录真机三轮全部CANDIDATE_RESULTS_NOT_READY、cards=0(图片未加载完时读不到商品卡)。即:进入图搜并选图已在真机走通,从结果页读候选卡片未闭环。子工单索引
建议顺序:U1 与 U3 并行起步 → U2(最耗时,需反复上真机)→ U4、U5 并行收尾。
MVP 集成验收
风险
collection_task.source的 check 约束变更属于数据库迁移,高风险,实施前需人工确认。文档影响
待 U3 确定契约后更新
docs/08-agent-api-contract.md;业务规则与架构页面按实际改动在各单元工单内判断。执行前核验(2026-09-14)
用户要求实施 #275~#280,并仅在本地服务测试,不发布线上。
当前会话未提供 Gitea MCP,按仓库规则使用 Gitea API 回退;凭据只从已配置 gitea.env 读取。
图搜入口前置核验通过(2026-09-14)
设备
192.168.0.9:40103已连接并现场核验:content-desc=拍照搜索,可点击,边界[941,161][1080,228]。我的相册、最近搜索、历史浏览,并出现“最近项目”区域及可滚动 RecyclerView。前置门禁已通过,可进入实现阶段;仍需人工授权高风险动作:#276 的运行时相册权限/Manifest 变更,以及 #278/#279 的数据库迁移。
集成核对结论:不可验收(2026-09-15)
release/283@c80d0c9;基线main@c14f5f5。release/283是打包分支,同时含 #272 #273 #274 #276 #278 #279 #280 #282 #283。go build ./...、go test ./...(server)、npm run build:prod(web)、逐条对照各单元工单验收项读取 diff。一句话结论
#277 一行代码都没有,整条链路不可用。 服务端已能创建任务、下发参考图元数据、在结果回传后自动建立关联,但没有任何组件会去执行图搜。
各单元状态
docs/08-agent-api-contract.md未更新(docs/零改动)BatchPreviewItem无图搜字段);Agent 列表标记未做值得认可的部分
服务端与 Web 的实现质量是好的,有三处超出工单要求:
pdd_product_id IS NULL AND image_search_linked = false),Agent 执行期间的人工改动会正确胜出。shopee_product去重确实做到了,这是本 MVP 最容易被漏掉的一条。集成验收逐条核对(本工单「MVP 集成验收」7 条)
阻塞项:
release/283分支为红责任提交:
aed295c(#272)、e0ed05d(#274)、b83f20c(#274)。与图搜无关,但该分支在修复前不能合入 main。建议顺序
sybimport的 12 个失败(#272 / #274 的范围,独立于本 MVP)拍照搜索等常量)——该门禁至今未执行相邻问题(不在本 MVP 范围,仅提示)
仓库工作区存在两个包含凭据的未跟踪文件,且未被
.gitignore覆盖,存在被git add .误提交的风险。建议尽快处理。此处不记录文件内容。MVP 与五个单元工单状态均维持待实施。
实施与上线(2026-09-15)
五个单元工单的缺口全部补齐并上线。合并提交
1d01186,已推送be03972..1d01186;发布/home/goauto/releases/20260915-1d01186,二进制 SHA-256 前缀65e404c4721d592a,服务active。各单元的实施细节写在各自工单,此处只记录集成层面的结论。
前置门禁:已完成
本工单记录的门禁「在图搜页与结果页 dump 无障碍树,核对
拍照搜索等常量」已于 2026-09-15 在真机执行(1080×2354,PDDHomeActivity/NewPageActivity)。[941,161][1080,228] ImageView clickable=true content-desc='拍照搜索'我的相册+最近搜索+历史浏览+点击拍照齐备最近项目锚点[0,1892][210,1898],下方每格 267px,267×4=1068,屏宽 1080,容差 ±24搜图片同款+ 排序控件 综合/销量/价格/品牌(4 个 ≥ 3)535×764,RecyclerView[0,132][1080,2306]移植自参考项目的常量基本可用。核对中发现四个坑,均已写入
PinduoduoImageSearchCriteria注释与docs/08-agent-api-contract.md:[必须]入口判定必须同时要求 clickable。个人中心 tab 的根节点同样带content-desc='拍照搜索',覆盖全屏[0,0][1080,2354]且不可点,而visibleTexts()会把contentDescription当文本收集。只按文案匹配会把个人中心判成首页,几何兜底随后点到该页顶部最靠右的可点节点——实测那是「设置」按钮。已在 #277 修复。即可进行自动识别不命中,靠点击拍照兜住。03:02的格子)。因此「自己是否为相册最新一项」的判定已从只比 jpeg 扩大到MediaStore.Files(图片 + 视频),不是最新一项时以IMAGE_SEARCH_ASSET_NOT_LATEST明确失败,不往后找。MVP 集成验收逐条核对
ORDER BY);Agent 执行端到端未验证LinkPDD写 false,有测试结论:MVP 尚不可验收。 阻塞项是端到端真机执行未做(第 2、3 项),下一步是安装 debug APK 到真机跑一次完整图搜任务。
上次评论提出的阻塞项处理
上次核对记录的「
release/283分支为红,12 个sybimport失败」在本次上线前重新调查,发现其中并非全是过期测试:[必须]sybimport.Parse把空格分隔的「颜色 尺码」整条当成颜色、尺码为空且判为success,而success的行永远不进 AI 解析队列,因此没有任何机制会纠正。该缺陷随 #274 于 2026-09-14 已上线,线上有 152 条parse_status='success' AND target_size=''。已单独建单 #284 并随本次一同修复上线;12 个过期测试单独记录为 #285,本次上线前后失败集合逐条 diff 完全一致,未新增。因此本次上线内容为 #275~#280 图搜采集 + #284 解析修复,#272/#273/#274/#282/#283 保持原样。
遗留
sybimport目前没有有效回归保护。MVP 与五个单元工单均保持待验收。