Skill 列表
草料 A2A 服务提供 3 个 skill,全部只读。
| skill | 回答的问题 | artifact 名 |
|---|---|---|
get_entity | 这张码是什么? | entity |
get_records | 这个物经历过什么? | records |
list_actions | 现在能做什么? | actions |
注:本页示例的返回来自一个公开演示码,经过删节、人名做了替换。完整结构以 schema.json 为准。
怎么指定 skill
在 message 的 parts 里给一个 DataPart:
{
"kind": "data",
"data": {
"skill": "get_records",
"url": "https://qr71.cn/okDISU/qssTnoy",
"size": 10,
"pageToken": ""
}
}| 字段 | 必填 | 说明 |
|---|---|---|
url | 是 | 草料码链接 |
skill | 否 | skill id。留空默认 get_entity |
size | 否 | 仅 get_records 用,每页条数,默认 20,上限 50 |
pageToken | 否 | 仅 get_records 用,翻页游标 |
也可以只发文本,服务会从中提取第一个码链接,skill 默认 get_entity。文本方式是兜底,明确知道要调哪个 skill 时请用 DataPart——草料这一侧不做自然语言意图识别,那是调用方 agent 的职责。
get_entity
一次拿到实体全貌:名称、类型、建档组织、属性、当前状态,以及可执行操作与最近记录的预览。
拿到码之后从这里开始。
示例问句(写在 Agent Card 里,用于引导调用方选择):
- 这个二维码对应的是什么设备?
- 查一下这个码的名称、当前状态和属性
返回摘要:
数控车床-A08-03-06;建档组织:草料二维码;状态:设备运行状态=正常;账本 1 条;属性 7 项;可执行操作 2 个结构化部分是一份 ObjectCard v2,与公开 MCP 的 entity_get 返回同一结构。主要块包括:
| 块 | 内容 |
|---|---|
thing / code / binding | 身份三元组:物、码、绑定关系 |
properties | 属性字段 |
relations | 关系槽:所在位置、所属、责任人、从属于 |
states | 业务状态 |
records | 记录账本预览:总数 + 最近几条 |
media | 图片、附件 |
actions | 可执行操作及其契约注解 |
plans | 周期性计划 |
endpoints | 本实体在公开 MCP 和 A2A 上的地址 |
contract | 本次返回遵守的边界声明 |
顶层块始终存在:未跟踪时取值为 null、{} 或 [],应一律解读为「未跟踪」。「缺席」语义适用于块内部的可选子字段,见下方「消费方必读的三条」。字段细节见公开 MCP · 工具列表。
get_records
取完整账本——巡检、报修、保养等记录,按时间倒序、游标分页。每条带记录发生当时的码与物快照。
get_entity 只给最近几条,要翻完整历史用这个。
示例问句:
- 这个码最近有哪些巡检记录?
- 看看这台设备的操作履历
返回摘要:
共 1 条记录(账本合计 1 条)。结构化部分:
{
"url": "https://qr71.cn/okDISU/qssTnoy",
"records": [
{
"id": "rec_460807516",
"type": "inspection",
"label": "巡检记录表",
"at": "2026-06-23T02:26:36.000Z",
"result": "pass",
"resultLabel": "正常",
"summary": "巡检结果:正常",
"by": { "name": "张工" },
"snapshot": { "codeId": "qssTnoy", "thingId": "thg_qssTnoy" }
}
],
"hasMore": false,
"total": 1
}hasMore 为 true 时,返回顶层还会带 nextPageToken 字段,把它填进下次请求的 pageToken。
list_actions
列出此刻可执行的操作清单——能填哪些表单、有哪些状态变更。只列出,不执行。
示例问句:
- 这个码现在能填哪些表单、做哪些操作?
- 这个码上有哪些可执行的操作?
返回摘要:
可执行操作 2 个:巡检记录表、维护保养记录。提交/写入需授权,不在本只读服务范围。结构化部分:
{
"url": "https://qr71.cn/okDISU/qssTnoy",
"actions": [
{
"action": "record:1556557",
"label": "巡检记录表",
"requiresAuth": true,
"annotations": {
"readonly": false,
"destructive": false,
"idempotent": "by_request_key",
"confirm": "none"
},
"precondition": null,
"formSchemaVia": "entity_action_get",
"humanUrl": "https://qr71.cn/okDISU/qssTnoy"
},
{
"action": "record:1556556",
"label": "维护保养记录",
"requiresAuth": true,
"annotations": {
"readonly": false,
"destructive": false,
"idempotent": "by_request_key",
"confirm": "none"
},
"precondition": null,
"formSchemaVia": "entity_action_get",
"humanUrl": "https://qr71.cn/okDISU/qssTnoy"
}
]
}注意:
requiresAuth: true的意思是「执行这个操作需要授权」。但本服务无论是否授权都不执行任何操作。正确做法是把humanUrl递给人,由人在扫码页上完成填写。
formSchemaVia里写的entity_action_get是公开 MCP 的工具名。A2A 只有 3 个 skill,不包含取字段这一步——需要表单字段结构时,走公开 MCP。
annotations描述的是这个操作未来被执行时的性质承诺,不是当前状态描述。
消费方必读的三条
这三条写在只读契约扩展里,会直接影响你怎么处理返回值:
- 空值与缺席都不等于否定。 子字段没出现、或块取值为
null/{}/[],都表示平台尚未跟踪或无法解析成结构化值,不表示false或「没有」。草料宁可不给,也不会用文本冒充结构化引用。 thing.id是过渡标识(idScheme: "code-derived",由码派生),不要持久化依赖。要长期保存的稳定标识是code.uri。- 账本当前可被建档组织修订。 不可变账本是目标态,本契约不承诺不可变性。
完整契约见 https://a2a.objqr.com/ext/caoliao-entity/v2,机读 schema 见同路径下的 schema.json。
下一步
- Task 与返回结构 —— 调用后拿到的完整信封