fix(agent): 声明 pdd.image-search.v1 能力 (#277)

服务端 taskCompatible 对 source='image_search' 的任务按该能力过滤,
但 AgentCapabilities.supported 从未包含它。设备不声明时图搜任务
永远不会被领取,而且是静默的——任务停在 pending、不失败也不报错。

线上设备 #7「采购2」的 capabilities_json 实测确实没有这一项,装机前
核对时发现。

新增 AgentCapabilitiesTest 锁住与服务端 task.ImageSearchCapability
的一致性,并检查清单无重复。

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01NTDbDcwbDw1TSAcE6wfh2F
This commit is contained in:
QiuSW
2026-09-15 14:50:59 +08:00
co-authored by Claude Opus 5
parent 1d01186b8e
commit c1ed3750d2
2 changed files with 38 additions and 0 deletions
@@ -150,11 +150,22 @@ object AgentCapabilities {
const val PDD_PRODUCT_DETAIL_V1 = "collector.pdd.product-detail.v1"
const val PDD_CURRENT_PAGE_SHARE_V1 = "collector.pdd.current-page-share.v1"
/**
* 图搜采集能力(#277)。
*
* `[必须]` 必须与服务端 `task.ImageSearchCapability` 逐字一致。
* `taskCompatible` 对 source='image_search' 的任务按该能力过滤:
* 设备不声明则图搜任务**永远不会被领取**,且是静默的——
* 任务停在 pending、不失败也不报错。
*/
const val PDD_IMAGE_SEARCH_V1 = "pdd.image-search.v1"
val supported: List<String> = listOf(
SCHEMA_V2,
SWIPE_V1,
PDD_PRODUCT_DETAIL_V1,
PDD_CURRENT_PAGE_SHARE_V1,
PDD_IMAGE_SEARCH_V1,
PurchaseAgentCapabilities.REHEARSAL_V1,
PurchaseAgentCapabilities.LIVE_V1,
PurchaseAgentCapabilities.SPEC_PROBE_V1,
@@ -0,0 +1,27 @@
package cn.ilapage.goauto.agent
import cn.ilapage.goauto.agent.automation.AgentCapabilities
import org.junit.Assert.assertTrue
import org.junit.Test
class AgentCapabilitiesTest {
// #277: 服务端 taskCompatible 对 source='image_search' 的任务按这个能力过滤。
// 漏声明时图搜任务永远不会被领取,而且是静默的:任务停在 pending、
// 不失败也不报错。字符串必须与 task.ImageSearchCapability 逐字一致。
@Test
fun `supported capabilities include the image search capability the server gates on`() {
assertTrue(
"AgentCapabilities.supported 缺少 pdd.image-search.v1,图搜任务将无法被领取",
AgentCapabilities.supported.contains("pdd.image-search.v1"),
)
}
@Test
fun `supported capabilities have no duplicates`() {
assertTrue(
"能力清单出现重复项: " + AgentCapabilities.supported,
AgentCapabilities.supported.size == AgentCapabilities.supported.toSet().size,
)
}
}