Skip to content
Draft
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
50 commits
Select commit Hold shift + click to select a range
7505e02
fix: 物料系统标准化重构 + 多轮运行期 Bug 修复 (2026-03-12)
Andy6M Mar 18, 2026
41a018f
chore: 鏈湴淇敼瀛樻。 - 0.10.18 鍩虹鐗堟湰澶囦唤 (2026-03-24)
Andy6M Mar 24, 2026
03e3719
add ai conventions
TablewareBox Mar 19, 2026
dff70bd
add formulation action
TablewareBox Mar 21, 2026
d7850b0
add create_orders_foumulation and extract common code
TablewareBox Mar 21, 2026
91928a8
Merge remote-tracking branch 'origin/dev' into backup/local-0.10.18-2…
Andy6M Mar 24, 2026
467f0b1
feat: update coin cell assembly, bioyond cell workstation, and resour…
Andy6M Mar 25, 2026
ed952e8
feat: 更新Neware电池测试系统驱动及电芯组装工作站相关文件
Andy6M Apr 9, 2026
e11c353
Merge origin/dev into backup/local-0.10.18-20260324
Andy6M Apr 9, 2026
dd21d93
chore: remove local-only date CSV files (not for upstream)
Andy6M Apr 10, 2026
73add2d
feat: implement electrolyte CSV export and barcode tracking
Andy6M Apr 15, 2026
3e43359
fix(bioyond): fix order name type and prep bottle max volumes
Andy6M Apr 16, 2026
0895252
change to leap-lab backend. Support feedback interval. Reduce cocurre…
Xuwznln Apr 10, 2026
008c355
Support async func.
Xuwznln Apr 11, 2026
20342c6
Change uni-lab. to leap-lab.
Xuwznln Apr 12, 2026
db22156
Update Skills addr
Xuwznln Apr 13, 2026
01d2811
Update Skills
Xuwznln Apr 13, 2026
8356503
Fix skills exec error with action type
Xuwznln Apr 13, 2026
620cb84
Fix skills exec error with action type
Xuwznln Apr 13, 2026
4581ee1
print res query logs
Xuwznln Apr 13, 2026
dc1de44
update aksk desc
Xuwznln Apr 13, 2026
7efccbc
update workbench example
Xuwznln Apr 15, 2026
52b4604
Update neware battery test system driver and registry
Andy6M Apr 21, 2026
d1713fc
Wire bioyond/coin-cell/neware param passing and add manual-confirm CS…
Andy6M Apr 21, 2026
3af86a0
Trim manual_confirm outputs and fix resource uuid lookup
Andy6M Apr 22, 2026
f431d61
Fix neware test dispatch and manual_confirm CSV archival
Andy6M Apr 22, 2026
79c0815
fix(neware): 修复 submit_auto_export_excel 因 resource=[] 导致 0 下发 + file…
Andy6M Apr 22, 2026
717f236
feat(neware): submit_auto_export_excel add manual backup path and ele…
Andy6M Apr 22, 2026
2ebe35e
fix(neware): add coin_cell_code input handle to battery_transfer_confirm
Andy6M Apr 22, 2026
201b106
Revert "fix(neware): add coin_cell_code input handle to battery_trans…
Andy6M Apr 22, 2026
e8f54d5
fix(neware): remove output_dir from submit_auto_export_excel input ha…
Andy6M Apr 22, 2026
99ee27b
Revert "Revert "fix(neware): add coin_cell_code input handle to batte…
Andy6M Apr 22, 2026
86f1640
更新工作站驱动,清理旧版模板文件
Andy6M May 22, 2026
865dd87
更新扣电组装驱动 coin_cell_assembly.py
Andy6M May 22, 2026
742a96e
v0.11.0
Xuwznln Apr 15, 2026
9c25623
use gitee to install pylabrobot
Xuwznln Apr 22, 2026
f510810
upgrade to 0.11.1
Xuwznln Apr 22, 2026
14081ac
Support display_name & desc in new registry system
Xuwznln Apr 27, 2026
14d82fe
Update registry for all param desc
Xuwznln Apr 27, 2026
5767a0d
Update Skills
TablewareBox May 7, 2026
575803d
Update SKILL.md
TablewareBox May 7, 2026
78bc393
fix pack build 1
Xuwznln May 8, 2026
63faa15
fix pip install & git install failed
Xuwznln May 8, 2026
92828ea
fix pack install 2
Xuwznln May 8, 2026
ec606ba
env installation fix
Xuwznln May 14, 2026
4533727
v0.11.2
Xuwznln May 14, 2026
1abbccc
new build fix
Xuwznln May 14, 2026
e5462f7
support notebook id
Xuwznln May 20, 2026
9165c9f
feat: 新增东华电化学设备驱动、SSE自动合成设备,优化扣电组装条码匹配逻辑
Andy6M May 22, 2026
ba79952
Merge pull request #263 from ftu62738-creator/workstation_dev_YB_260410
Andy6M May 22, 2026
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
The table of contents is too big for display.
Diff view
Diff view
  •  
  •  
  •  
4 changes: 2 additions & 2 deletions .conda/base/recipe.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -3,7 +3,7 @@

package:
name: unilabos
version: 0.10.19
version: 0.11.2

source:
path: ../../unilabos
Expand Down Expand Up @@ -54,7 +54,7 @@ requirements:
- pymodbus
- matplotlib
- pylibftdi
- uni-lab::unilabos-env ==0.10.19
- uni-lab::unilabos-env ==0.11.2

about:
repository: https://github.com/deepmodeling/Uni-Lab-OS
Expand Down
2 changes: 1 addition & 1 deletion .conda/environment/recipe.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,7 @@

package:
name: unilabos-env
version: 0.10.19
version: 0.11.2

build:
noarch: generic
Expand Down
4 changes: 2 additions & 2 deletions .conda/full/recipe.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -3,15 +3,15 @@

package:
name: unilabos-full
version: 0.10.19
version: 0.11.2

build:
noarch: generic

requirements:
run:
# Base unilabos package (includes unilabos-env)
- uni-lab::unilabos ==0.10.19
- uni-lab::unilabos ==0.11.2
# Documentation tools
- sphinx
- sphinx_rtd_theme
Expand Down
42 changes: 39 additions & 3 deletions .cursor/skills/add-device/SKILL.md
Original file line number Diff line number Diff line change
Expand Up @@ -71,6 +71,22 @@ from unilabos.registry.decorators import action
- `_` 开头的方法 → 不扫描
- `@not_action` 标记的方法 → 排除

### 参数文档 → JSON Schema 元数据

在 `__init__` 和 action 方法 docstring 的 `Args:` 小节里,使用以下格式生成入参 schema 的显示信息:

```python
"""
Args:
param[显示名称]: 参数说明,会写入 JSON Schema 的 description。
"""
```

- `param[显示名称]` 的显示名称会写入 goal property 的 `title`。
- `:` 后面的说明会写入 goal property 的 `description`。
- 如果只写 `param: 参数说明`,`title` 会兜底为字段名,`description` 使用参数说明。
- 如果没有写参数文档,生成器也会兜底补齐 `title=<字段名>` 和 `description=""`,但新设备应优先写清楚显示名和说明。

### @topic_config — 状态属性配置

```python
Expand Down Expand Up @@ -105,13 +121,27 @@ import logging
from typing import Any, Dict, Optional

from unilabos.ros.nodes.base_device_node import BaseROS2DeviceNode
from unilabos.registry.decorators import device, action, topic_config, not_action
from unilabos.registry.decorators import action, device, not_action, topic_config

@device(id="my_device", category=["my_category"], description="设备描述")
@device(
id="my_device",
category=["my_category"],
description="设备描述",
display_name="设备显示名",
)
class MyDevice:
"""设备类说明。"""

_ros_node: BaseROS2DeviceNode

def __init__(self, device_id: Optional[str] = None, config: Optional[Dict[str, Any]] = None, **kwargs):
"""
初始化设备。

Args:
device_id[设备ID]: 设备实例 ID,默认使用 my_device。
config[设备配置]: 设备启动配置。
"""
self.device_id = device_id or "my_device"
self.config = config or {}
self.logger = logging.getLogger(f"MyDevice.{self.device_id}")
Expand All @@ -133,7 +163,13 @@ class MyDevice:

@action(description="执行操作")
def my_action(self, param: float = 0.0, name: str = "") -> Dict[str, Any]:
"""带 @action 装饰器 → 注册为 'my_action' 动作"""
"""
带 @action 装饰器 → 注册为 'my_action' 动作。

Args:
param[操作数值]: 操作使用的数值参数。
name[操作名称]: 操作名称或备注。
"""
return {"success": True}

def get_info(self) -> Dict[str, Any]:
Expand Down
124 changes: 76 additions & 48 deletions .cursor/skills/batch-insert-reagent/SKILL.md
Original file line number Diff line number Diff line change
Expand Up @@ -27,14 +27,15 @@ python -c "import base64,sys; print('Authorization: Lab ' + base64.b64encode(f'{

### 2. --addr → BASE URL

| `--addr` 值 | BASE |
|-------------|------|
| `test` | `https://uni-lab.test.bohrium.com` |
| `uat` | `https://uni-lab.uat.bohrium.com` |
| `local` | `http://127.0.0.1:48197` |
| 不传(默认) | `https://uni-lab.bohrium.com` |
| `--addr` 值 | BASE |
| ------------ | ----------------------------------- |
| `test` | `https://leap-lab.test.bohrium.com` |
| `uat` | `https://leap-lab.uat.bohrium.com` |
| `local` | `http://127.0.0.1:48197` |
| 不传(默认) | `https://leap-lab.bohrium.com` |

确认后设置:

```bash
BASE="<根据 addr 确定的 URL>"
AUTH="Authorization: Lab <gen_auth.py 输出的 token>"
Expand Down Expand Up @@ -65,7 +66,7 @@ curl -s -X GET "$BASE/api/v1/edge/lab/info" -H "$AUTH"
返回:

```json
{"code": 0, "data": {"uuid": "xxx", "name": "实验室名称"}}
{ "code": 0, "data": { "uuid": "xxx", "name": "实验室名称" } }
```

记住 `data.uuid` 为 `lab_uuid`。
Expand All @@ -90,6 +91,7 @@ curl -s -X POST "$BASE/api/v1/lab/reagent" \
```

返回成功时包含试剂 UUID:

```json
{"code": 0, "data": {"uuid": "xxx", ...}}
```
Expand All @@ -98,28 +100,28 @@ curl -s -X POST "$BASE/api/v1/lab/reagent" \

## 试剂字段说明

| 字段 | 类型 | 必填 | 说明 | 示例 |
|------|------|------|------|------|
| `lab_uuid` | string | 是 | 实验室 UUID(从 API #1 获取) | `"8511c672-..."` |
| `cas` | string | 是 | CAS 注册号 | `"7732-18-3"` |
| `name` | string | 是 | 试剂中文/英文名称 | `"水"` |
| `molecular_formula` | string | 是 | 分子式 | `"H2O"` |
| `smiles` | string | 是 | SMILES 表示 | `"O"` |
| `stock_in_quantity` | number | 是 | 入库数量 | `10` |
| `unit` | string | 是 | 单位(字符串,见下表) | `"mL"` |
| `supplier` | string | 否 | 供应商名称 | `"国药集团"` |
| `production_date` | string | 否 | 生产日期(ISO 8601) | `"2025-11-18T00:00:00Z"` |
| `expiry_date` | string | 否 | 过期日期(ISO 8601) | `"2026-11-18T00:00:00Z"` |
| 字段 | 类型 | 必填 | 说明 | 示例 |
| ------------------- | ------ | ---- | ----------------------------- | ------------------------ |
| `lab_uuid` | string | 是 | 实验室 UUID(从 API #1 获取) | `"8511c672-..."` |
| `cas` | string | 是 | CAS 注册号 | `"7732-18-3"` |
| `name` | string | 是 | 试剂中文/英文名称 | `"水"` |
| `molecular_formula` | string | 是 | 分子式 | `"H2O"` |
| `smiles` | string | 是 | SMILES 表示 | `"O"` |
| `stock_in_quantity` | number | 是 | 入库数量 | `10` |
| `unit` | string | 是 | 单位(字符串,见下表) | `"mL"` |
| `supplier` | string | 否 | 供应商名称 | `"国药集团"` |
| `production_date` | string | 否 | 生产日期(ISO 8601) | `"2025-11-18T00:00:00Z"` |
| `expiry_date` | string | 否 | 过期日期(ISO 8601) | `"2026-11-18T00:00:00Z"` |

### unit 单位值

| 值 | 单位 |
|------|------|
| 值 | 单位 |
| ------ | ---- |
| `"mL"` | 毫升 |
| `"L"` | 升 |
| `"g"` | 克 |
| `"L"` | 升 |
| `"g"` | 克 |
| `"kg"` | 千克 |
| `"瓶"` | 瓶 |
| `"瓶"` | 瓶 |

> 根据试剂状态选择:液体用 `"mL"` / `"L"`,固体用 `"g"` / `"kg"`。

Expand All @@ -133,8 +135,22 @@ curl -s -X POST "$BASE/api/v1/lab/reagent" \

```json
[
{"cas": "7732-18-3", "name": "水", "molecular_formula": "H2O", "smiles": "O", "stock_in_quantity": 10, "unit": "mL"},
{"cas": "64-17-5", "name": "乙醇", "molecular_formula": "C2H6O", "smiles": "CCO", "stock_in_quantity": 5, "unit": "L"}
{
"cas": "7732-18-3",
"name": "水",
"molecular_formula": "H2O",
"smiles": "O",
"stock_in_quantity": 10,
"unit": "mL"
},
{
"cas": "64-17-5",
"name": "乙醇",
"molecular_formula": "C2H6O",
"smiles": "CCO",
"stock_in_quantity": 5,
"unit": "L"
}
]
```

Expand All @@ -160,9 +176,20 @@ cas,name,molecular_formula,smiles,stock_in_quantity,unit,supplier,production_dat
7732-18-3,水,H2O,O,10,mL,农夫山泉,2025-11-18T00:00:00Z,2026-11-18T00:00:00Z
```

### 日期格式规则(重要)

所有日期字段(`production_date`、`expiry_date`)**必须**使用 ISO 8601 完整格式:`YYYY-MM-DDTHH:MM:SSZ`。

- 用户输入 `2025-03-01` → 转换为 `"2025-03-01T00:00:00Z"`
- 用户输入 `2025/9/1` → 转换为 `"2025-09-01T00:00:00Z"`
- 用户未提供日期 → 使用当天日期 + `T00:00:00Z`,有效期默认 +1 年

**禁止**发送不带时间部分的日期字符串(如 `"2025-03-01"`),API 会拒绝。

### 执行与汇报

每次 API 调用后:

1. 检查返回 `code`(0 = 成功)
2. 记录成功/失败数量
3. 全部完成后汇总:「共录入 N 条试剂,成功 X 条,失败 Y 条」
Expand All @@ -172,28 +199,29 @@ cas,name,molecular_formula,smiles,stock_in_quantity,unit,supplier,production_dat

## 常见试剂速查表

| 名称 | CAS | 分子式 | SMILES |
|------|-----|--------|--------|
| 水 | 7732-18-3 | H2O | O |
| 乙醇 | 64-17-5 | C2H6O | CCO |
| 甲醇 | 67-56-1 | CH4O | CO |
| 丙酮 | 67-64-1 | C3H6O | CC(C)=O |
| 二甲基亚砜(DMSO) | 67-68-5 | C2H6OS | CS(C)=O |
| 乙酸乙酯 | 141-78-6 | C4H8O2 | CCOC(C)=O |
| 二氯甲烷 | 75-09-2 | CH2Cl2 | ClCCl |
| 四氢呋喃(THF) | 109-99-9 | C4H8O | C1CCOC1 |
| N,N-二甲基甲酰胺(DMF) | 68-12-2 | C3H7NO | CN(C)C=O |
| 氯仿 | 67-66-3 | CHCl3 | ClC(Cl)Cl |
| 乙腈 | 75-05-8 | C2H3N | CC#N |
| 甲苯 | 108-88-3 | C7H8 | Cc1ccccc1 |
| 正己烷 | 110-54-3 | C6H14 | CCCCCC |
| 异丙醇 | 67-63-0 | C3H8O | CC(C)O |
| 盐酸 | 7647-01-0 | HCl | Cl |
| 硫酸 | 7664-93-9 | H2SO4 | OS(O)(=O)=O |
| 氢氧化钠 | 1310-73-2 | NaOH | [Na]O |
| 碳酸钠 | 497-19-8 | Na2CO3 | [Na]OC([O-])=O.[Na+] |
| 氯化钠 | 7647-14-5 | NaCl | [Na]Cl |
| 乙二胺四乙酸(EDTA) | 60-00-4 | C10H16N2O8 | OC(=O)CN(CCN(CC(O)=O)CC(O)=O)CC(O)=O |
| 名称 | CAS | 分子式 | SMILES |
| --------------------- | --------- | ---------- | ------------------------------------ |
| 水 | 7732-18-3 | H2O | O |
| 乙醇 | 64-17-5 | C2H6O | CCO |
| 乙酸 | 64-19-7 | C2H4O2 | CC(O)=O |
| 甲醇 | 67-56-1 | CH4O | CO |
| 丙酮 | 67-64-1 | C3H6O | CC(C)=O |
| 二甲基亚砜(DMSO) | 67-68-5 | C2H6OS | CS(C)=O |
| 乙酸乙酯 | 141-78-6 | C4H8O2 | CCOC(C)=O |
| 二氯甲烷 | 75-09-2 | CH2Cl2 | ClCCl |
| 四氢呋喃(THF) | 109-99-9 | C4H8O | C1CCOC1 |
| N,N-二甲基甲酰胺(DMF) | 68-12-2 | C3H7NO | CN(C)C=O |
| 氯仿 | 67-66-3 | CHCl3 | ClC(Cl)Cl |
| 乙腈 | 75-05-8 | C2H3N | CC#N |
| 甲苯 | 108-88-3 | C7H8 | Cc1ccccc1 |
| 正己烷 | 110-54-3 | C6H14 | CCCCCC |
| 异丙醇 | 67-63-0 | C3H8O | CC(C)O |
| 盐酸 | 7647-01-0 | HCl | Cl |
| 硫酸 | 7664-93-9 | H2SO4 | OS(O)(=O)=O |
| 氢氧化钠 | 1310-73-2 | NaOH | [Na]O |
| 碳酸钠 | 497-19-8 | Na2CO3 | [Na]OC([O-])=O.[Na+] |
| 氯化钠 | 7647-14-5 | NaCl | [Na]Cl |
| 乙二胺四乙酸(EDTA) | 60-00-4 | C10H16N2O8 | OC(=O)CN(CCN(CC(O)=O)CC(O)=O)CC(O)=O |

> 此表仅供快速参考。对于不在表中的试剂,agent 应根据化学知识推断或提示用户补充。

Expand Down
Loading