> ## Documentation Index
> Fetch the complete documentation index at: https://automationlaboratoryprotocol.mimedal.cn/llms.txt
> Use this file to discover all available pages before exploring further.

# 设备能力

> 从 FSP 完整技能定义生成可评估的设备技能描述

## 模块作用

技能提取把 FSP 的完整技能定义转换为设备技能描述，经过质量评估后进入合格设备技能库。每项技能均以对象、控制和系统三个维度形成一个完整契约。

<img src="https://mintcdn.com/automationlaboratoryprotocol/qENRy3k1FcAIyd_e/images/skill-method-lifecycle.svg?fit=max&auto=format&n=qENRy3k1FcAIyd_e&q=85&s=06b1704f07fa4373ea0e13b9f29c5b35" alt="技能提取到执行闭环" width="1440" height="650" data-path="images/skill-method-lifecycle.svg" />

```text theme={null}
FSP 完整技能定义
  → 设备技能描述
  → 技能质量评估
  → 合格设备技能库
```

设备技能描述是 FSP 数据的模型可读派生物，不能反向修改设备事实。

## 输入

输入是 `fsp/get_capabilities(detail_level="full")` 返回的数据。摘要结果只用于检索，不能用于技能提取：

```text theme={null}
device
revision
detail_level: full
skills[]
  ├── object
  ├── control
  └── system
```

转换时需要保留来源设备和修订号，确保说明可以重新生成和判定过期。

### 输入示例

以下输入包含一条加液技能及其三个说明维度；`skills` 可以包含更多技能：

```json theme={null}
{
  "device": {
    "device_id": "2002186824385539",
    "name": "Liquid_Handling_Station_1ml_V2",
    "description": "支持容器开盖、加液和关盖操作"
  },
  "revision": "12",
  "detail_level": "full",
  "skills": [
    {
      "command_id": "add_liquid_with_material",
      "request_class": "invoke",
      "name": "加液_物料绑定",
      "execution_mode": "async",
      "object": {
        "container_types": [
          {
            "container_type_id": "container.sample_vial",
            "name": "离心瓶",
            "required_states": {"container_status": ["无盖"]}
          }
        ]
      },
      "control": {
        "parameters": [
          {"name": "container_ids", "type": "array[int]", "required": true},
          {"name": "dispensing_plan", "type": "array[object]", "required": true}
        ],
        "constraints": ["container_status == '无盖'"],
        "effects": {"sample_status": {"空": "液体"}},
        "returns": [{"name": "containers", "type": "array[object]"}]
      },
      "system": {
        "required_device_states": ["idle"],
        "safety_fences": ["容器剩余容量必须满足本次加液"],
        "result_verification": ["返回实际加液结果和执行后容器状态"]
      }
    }
  ]
}
```

| 输入字段               | 作用                         |
| ------------------ | -------------------------- |
| `device`           | 确定能力属于哪个设备，并提供名称和总体说明      |
| `revision`         | 固定本次转换使用的能力版本，判断派生产物是否过期   |
| `detail_level`     | 必须为 `full`，防止把摘要误当作可执行契约   |
| `skills[]`         | 提供具体技能及其请求分类、执行模式和三个说明维度   |
| `skills[].object`  | 提供该技能可处理的容器、静态属性和允许状态      |
| `skills[].control` | 提供参数、前置条件、状态变化、返回值和 Schema |
| `skills[].system`  | 提供该技能所需设备状态、安全围栏和结果验证规则    |

## 提取实现逻辑

技能提取不是让模型重新设计设备技能，而是把 FSP 完整技能定义转换为可阅读、可检查、可生成函数调用的说明。实现按以下顺序处理：

1. 读取一个固定 `device_id` 和 `revision` 的完整技能快照；
2. 逐项解析每条技能的对象、控制和系统维度，保留原始容器类型、`command_id`、请求分类、参数路径、枚举、单位和安全围栏；
3. 将每条技能展开为“适用对象 → 前置状态 → 参数 → 约束 → 状态变化 → 返回值 → 结果验证”的完整契约；
4. 对缺失字段生成待修订项，不用自然语言或模型推测补值；
5. 输出设备技能描述，并写入来源修订号和字段映射，使后续评估、函数定义和方法都能追溯到同一能力快照。

```text theme={null}
FSP 完整技能快照
  → 逐字段解析
  → 三维技能契约展开
  → 缺失项检查
  → 带来源修订号的设备技能描述
```

提取阶段不调用设备、不写入对象状态，也不修改 FSP 数据。它只生成派生产物；设备事实始终由 FSP 层维护。

## 输出：设备技能描述

设备技能描述必须采用以下结构：

```markdown theme={null}
---
设备编码: 2002186824385539
name: Liquid_Handling_Station_1ml_V2
description: 支持容器开盖、加液、关盖操作。最多可添加16种不同溶液，移液枪单次最大移液量1mL，单种溶液总加注量不超过3mL。严格执行一瓶一液原则，单只原液瓶仅盛放一种溶液，全程保持原液瓶编号顺序固定不变。
module: Synthesis
---

# 设备中文名：移液平台_1ml_V2

## 技能 1. 开盖

- 请求分类：invoke

### Object（对象）
- 容器类型：离心瓶、50ml耐热瓶
- 容器状态：有盖

### Initial State（初始状态）
- 容器类型 (container_type): 离心瓶、50ml耐热瓶
- 容器状态 (container_status): 有盖
- 样品状态 (sample_status): 空、液体、固体、固液混合物

### Effects（状态更新）
- 容器状态 (container_status): 有盖→无盖

### Parameters（参数）
参数名称、英文名、层级、类型、单位、约束、必填、默认值和说明

### Constraints（业务约束和依赖）
设备强制约束

### Returns（返回值）
确定的返回字段、类型和说明

### System（系统）
- 必需设备状态、安全围栏和执行后验证规则
```

该结构是能力转换器、质量评估器和方法生成器之间的统一契约。实现可以采用其他存储格式，但不得省略这些语义字段。

### 输出章节含义

| 章节              | 作用                       |
| --------------- | ------------------------ |
| 元数据             | 保留设备标识、名称、说明、模块和来源修订号    |
| 技能说明            | 给出每项设备接口的名称、用途和请求分类      |
| `Object`        | 给出该技能适用的容器、属性和状态         |
| `Initial State` | 限制什么状态下可以调用              |
| `Effects`       | 说明成功后哪些状态发生变化            |
| `Parameters`    | 提供参数类型、单位、范围、枚举、必填性和嵌套结构 |
| `Constraints`   | 表达跨参数和物理强制约束             |
| `Returns`       | 定义成功结果的字段、类型和含义          |
| `System`        | 定义设备状态、安全围栏和结果验证规则       |

### 完整产物关系

设备能力从提取到可使用，需要形成以下彼此关联的产物。它们均应记录同一 `device_id` 和来源 `revision`，使任一环节可以追溯到设备接口事实。

```text theme={null}
完整技能定义
  → 设备技能描述
  → 质量评估报告
  → 函数定义与公共类型
  → 仿真报告
  → 已绑定执行计划
```

| 产物        | 输入        | 必需字段                               | 作用              |
| --------- | --------- | ---------------------------------- | --------------- |
| 设备技能描述    | 完整技能定义    | 设备标识、来源修订号、技能标识、请求分类、三个说明维度和结果验证规则 | 形成可读且可检索的设备技能说明 |
| 质量评估报告    | 设备技能描述    | `total_score`、`passed`、检查明细、修订要求   | 判断说明是否足以进入能力库   |
| 函数定义与公共类型 | 准入通过的说明   | 函数签名、参数类型、前置条件、约束、状态变化、返回值、诊断类型    | 形成可计算、可仿真的调用契约  |
| 仿真报告      | 候选方法与函数定义 | 版本快照、检查结果、状态提交结论、诊断                | 判断候选方法能否转换为执行计划 |
| 已绑定执行计划   | 通过仿真的方法   | 设备标识、操作、参数、路径、未知步骤                 | 形成可下发的结构化计划     |

产物之间不得只凭名称关联；必须使用设备标识、操作标识和来源修订号建立确定映射。

### 设备技能描述的最小结构

设备技能描述应为每项技能完整保留接口信息。以下结构示例说明产物字段，不绑定任何具体存储格式：

```json theme={null}
{
  "device_id": "2002186824385539",
  "source_revision": "12",
  "skills": [
    {
      "command_id": "open_caps",
      "request_class": "invoke",
      "object": {
        "container_types": ["container.sample_vial"],
        "required_states": {"container_status": ["有盖"]}
      },
      "control": {
        "parameters": ["container_type", "container_count", "container_ids"],
        "constraints": ["1 <= container_count <= 10"],
        "effects": {"container_status": "有盖→无盖"},
        "returns": ["opened_bottles", "container_status", "sample_status"]
      },
      "system": {
        "required_device_states": ["idle"],
        "safety_fences": ["容器必须处于有盖状态"],
        "result_verification": ["返回实际开盖容器和执行后状态"]
      }
    }
  ]
}
```

其中 `parameters`、`constraints`、`effects` 和 `returns` 在实际产物中必须是完整对象定义，不得仅保留字段名称。上例仅用于展示三个维度如何共同说明一项技能。

## 字段映射

| FSP 数据                                | 设备技能描述          |
| ------------------------------------- | --------------- |
| `device.device_id`                    | `设备编码`          |
| `device.name`                         | `name`          |
| `device.description`                  | `description`   |
| `skills[].request_class`              | 请求分类与安全级别       |
| `skills[].object.required_states`     | `Initial State` |
| `skills[].control.effects`            | `Effects`       |
| `skills[].control.parameters`         | `Parameters`    |
| `skills[].control.constraints`        | `Constraints`   |
| `skills[].control.returns`            | `Returns`       |
| `skills[].system.safety_fences`       | 技能安全说明          |
| `skills[].system.result_verification` | 执行后验证规则         |

## 转换规则

* 不得新增 FSP 未声明的技能；
* 不得改变技能的 `request_class`；
* 不得改变参数类型、单位、范围和枚举；
* 嵌套参数必须按完整技能定义中的层级展开；
* 初始状态和状态更新必须分别保留；
* FSP 修订号变化后，旧能力说明必须重新生成或标记过期；
* 自然语言润色不得改变强制约束。

## 失败输出

如果 FSP 数据缺少技能描述、请求分类、三个说明维度、参数、前置状态或结果验证规则，转换程序应当停止生成可准入说明，并把缺失项交给质量评估或修订流程；不得用模型猜测补齐。
