Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
201 commits
Select commit Hold shift + click to select a range
9aeffeb
0.10.7 Update (#101)
Xuwznln Oct 12, 2025
fb93b1c
fix startup env check.
Xuwznln Oct 12, 2025
eb1f3fb
Try fix one-key build on linux
Xuwznln Oct 12, 2025
6b5765b
Complete all one key installation
Xuwznln Oct 12, 2025
51d3e61
fix: rename schema field to resource_schema with serialization and va…
Mile-Away Oct 12, 2025
e0da1c7
Fix one-key installation build
Xuwznln Oct 12, 2025
2a8e8d0
Fix conda pack on windows
Xuwznln Oct 13, 2025
ef3f24e
add plr_to_bioyond, and refactor bioyond stations
TablewareBox Oct 13, 2025
b64466d
modify default config
TablewareBox Oct 13, 2025
c70eafa
Fix one-key installation build for windows
Xuwznln Oct 13, 2025
c85c498
Fix workstation startup
Xuwznln Oct 13, 2025
7c440d1
Fix/resource UUID and doc fix (#109)
Xuwznln Oct 16, 2025
0260cbb
Close #107
Xuwznln Oct 16, 2025
d4415f5
Fix/update resource (#112)
Xuwznln Oct 16, 2025
1b43c53
fix resource_get in action
TablewareBox Oct 17, 2025
166d84a
fix(reaction_station): 清空工作流序列和参数避免重复执行 (#113)
ZiWei09 Oct 17, 2025
bc30f23
Update create_resource device_id
Xuwznln Oct 20, 2025
37ee43d
Update ResourceTracker
TablewareBox Oct 18, 2025
bb3ca64
Update graphio together with workstation design.
ZiWei09 Oct 18, 2025
a2a827d
Update workstation & bioyond example
ZiWei09 Oct 21, 2025
9645609
PRCXI Update
qxw138 Oct 21, 2025
42b78ab
Update resource extra & uuid.
Xuwznln Oct 22, 2025
9bd72b4
Update workstation.
ZiWei09 Oct 27, 2025
5fc7eb7
封膜仪、撕膜仪、耗材站接口
ElijahChang929 Jun 7, 2025
8807865
添加Raman和xrd相关代码
WenzheG Nov 5, 2025
b6dfe2b
Resource update & asyncio fix
Xuwznln Oct 31, 2025
813400f
bump version to 0.10.9
Xuwznln Nov 14, 2025
872b3d7
PRCXI Reset Error Correction (#166)
ALITTLELZ Nov 14, 2025
304827f
1114物料手册定义教程byxinyu (#165)
lixinyu1011 Nov 14, 2025
448e007
3d sim (#97)
q434343 Nov 14, 2025
a242253
标准化opcua设备接入unilab (#78)
tt11142023 Nov 14, 2025
37e0f10
add new laiyu liquid driver, yaml and json files (#164)
xiaoyu10031 Nov 14, 2025
a625a86
HR物料同步,前端展示位置修复 (#135)
ZiWei09 Nov 14, 2025
b475db6
nmr
WenzheG Sep 29, 2025
4d3475a
Update devices
Xuwznln Nov 14, 2025
891f126
bump version to 0.10.10
Xuwznln Nov 14, 2025
48895a9
Update repo files.
Xuwznln Nov 14, 2025
4189a2c
Add get_resource_with_dir & get_resource method
Xuwznln Nov 15, 2025
549a502
fix camera & workstation & warehouse & reaction station driver
ZiWei09 Nov 16, 2025
75f0903
update docs, test examples
Xuwznln Nov 18, 2025
7f7b1c1
bump version to 0.10.11
Xuwznln Nov 18, 2025
acf5fde
Add startup_json_path, disable_browser, port config
Xuwznln Nov 18, 2025
d39662f
Update oss config
Xuwznln Nov 18, 2025
931614f
feat(bioyond_studio): 添加项目API接口支持及优化物料管理功能
ZiWei09 Nov 18, 2025
a662c75
feat(bioyond): 添加测量小瓶仓库和更新仓库工厂函数参数
ZiWei09 Nov 19, 2025
554bcad
Support unilabos_samples key
Xuwznln Nov 19, 2025
d328282
add session_id and normal_exit
Xuwznln Nov 20, 2025
8fa3407
Add result schema and add TypedDict conversion.
Xuwznln Nov 25, 2025
f1ad0c9
Fix port error
Xuwznln Nov 25, 2025
ffc583e
Add backend api and update doc
Xuwznln Nov 26, 2025
ed8ee29
Add get_regular_container func
Xuwznln Nov 27, 2025
d390236
Add get_regular_container func
Xuwznln Nov 27, 2025
6fdd482
Transfer_liquid (#176)
ALITTLELZ Nov 26, 2025
c7c14d2
Auto dump logs, fix workstation input schema
Xuwznln Nov 27, 2025
5ce433e
Fix startup with remote resource error
ZiWei09 Nov 28, 2025
52544a2
signal when host node is ready
Xuwznln Dec 2, 2025
9854ed8
fix ros2 future
Xuwznln Dec 4, 2025
b1cdef9
update version to 0.10.12
Xuwznln Dec 4, 2025
91aadba
修改sample_uuid的返回值
Dec 5, 2025
1ef698d
修改pose标签设定机制
Dec 6, 2025
c678008
修改host_node
Dec 8, 2025
b46a51c
添加 aspiate函数返回值
Dec 8, 2025
d7302c3
返回dispense后的sample_uuid
Dec 8, 2025
cc56a68
添加self.pending_liquids_dict的重置方法
Dec 9, 2025
c27f7e4
修改prcxi的json文件,解决trach错误问题
Dec 9, 2025
0d150f7
修改prcxijson,防止PlateT4的硬件错误
Dec 9, 2025
896f287
对laiyu移液站进行部分修改,取消多次初始化的问题
Dec 10, 2025
8ba911b
修改根据新的物料格式,修改可视化
Dec 10, 2025
44fc80c
添加切换枪头方法,添加mock振荡与加热方法
Dec 16, 2025
3ad20c8
夹爪添加
Dec 23, 2025
c475eab
删除多余的laiyu部分
Dec 23, 2025
abf1005
云端可启动夹爪
Dec 24, 2025
3ddbc1c
Merge branch 'prcix9320' into prcxi9320
q434343 Dec 24, 2025
86512a0
Merge pull request #204 from q434343/prcxi9320
q434343 Dec 24, 2025
c6cf84d
Delete __init__.py
q434343 Dec 25, 2025
a3c7fa9
Enhance PRCXI9300 classes with new Container and TipRack implementati…
ALITTLELZ Dec 25, 2025
546fb63
Merge pull request #206 from ALITTLELZ/prcxi9320
q434343 Dec 25, 2025
71d57c5
修改上传数据
q434343 Dec 25, 2025
b0cff1a
do not modify globally
Xuwznln Dec 25, 2025
816a0d7
update registry
Xuwznln Dec 25, 2025
8cd306c
update registry
Xuwznln Dec 25, 2025
f9a9e35
bump version to 0.10.3
Xuwznln Dec 25, 2025
19c9d65
Revert "do not modify globally"
q434343 Dec 26, 2025
799813f
Reapply "do not modify globally"
q434343 Dec 26, 2025
ad1312c
修改传到网页的物料坐标
q434343 Dec 27, 2025
cfe64b0
添加抓取后物料上传
q434343 Dec 27, 2025
cc248fc
Update prcxi.py
q434343 Dec 28, 2025
888c6cf
Merge remote-tracking branch 'origin/dev' into prcix9320
q434343 Dec 30, 2025
63eb0c0
test_transfer_liquid_3
qxw138 Dec 31, 2025
1fed8de
example of beautifule tests
TablewareBox Dec 31, 2025
db396bc
test_one_to_multi
qxw138 Dec 31, 2025
6993e97
Update experiment JSON to change type from "plate" to "trash"
ALITTLELZ Jan 4, 2026
cef86fd
Merge pull request #210 from ALITTLELZ/prcxi9320
q434343 Jan 4, 2026
ead43b2
reverts edge上传相反
q434343 Jan 6, 2026
e9f1a7b
Merge branch 'dev' into prcix9320
q434343 Jan 7, 2026
219a480
merge prcxi.py
q434343 Jan 7, 2026
31e8d06
Merge branch 'dev' into prcix9320
q434343 Jan 8, 2026
de7fbe7
Merge branch 'dev' into prcix9320
q434343 Jan 12, 2026
18d0ba7
Revert "Merge branch 'dev' into prcix9320"
q434343 Jan 12, 2026
ae75f07
Merge branch 'dev' into prcix9320
q434343 Jan 13, 2026
1340bae
Revert "Merge branch 'dev' into prcix9320"
q434343 Jan 13, 2026
44a4c23
Enhance PRCXI classes by adding category parameter and updating logic…
ALITTLELZ Jan 14, 2026
4595f86
Merge pull request #214 from ALITTLELZ/prcxi1
q434343 Jan 14, 2026
b045ab4
Revert "Merge pull request #214 from ALITTLELZ/prcxi1"
q434343 Jan 14, 2026
be05458
更新自动化配置抓取位置
q434343 Jan 15, 2026
269ce44
Merge branch 'dev' into prcix9320
q434343 Jan 15, 2026
6f600b4
更新添加版位方法
q434343 Jan 15, 2026
03f7f44
去除“屏蔽开机初始化”
q434343 Jan 19, 2026
470d728
修改消息转换
q434343 Jan 19, 2026
d5b4f07
修改tube_rack的初始化,以及move_plate方法出现的物料增加问题
q434343 Jan 22, 2026
d6910da
添加无物料9320
q434343 Jan 26, 2026
3478bfd
修改部分bug
q434343 Jan 28, 2026
aeeb36d
Merge branch 'dev' into prcix9320
q434343 Jan 28, 2026
11a38d4
添加加热震荡模块与磁力模块
q434343 Feb 4, 2026
e4d915c
Merge branch 'dev' into prcix9320
q434343 Feb 4, 2026
abf5555
修改添加step mode
q434343 Feb 6, 2026
f6d46e6
Merge branch 'dev' into prcix9320
q434343 Feb 6, 2026
d3f5991
Merge branch 'dev' into prcix9320
q434343 Feb 10, 2026
8a0116c
add resource
Xuwznln Feb 10, 2026
ee6307a
registry update & workflow update
Xuwznln Feb 10, 2026
f38f3df
Merge branch 'dev' into prcix9320
q434343 Feb 11, 2026
29ea990
Merge branch 'dev' into feat/lab_resource
Xuwznln Feb 11, 2026
8da6fdf
set liquid with tube
Xuwznln Feb 11, 2026
45efbfc
fix deck & host_node
Xuwznln Feb 11, 2026
5c2da9b
fix possible crash
Xuwznln Feb 11, 2026
2e5fac2
添加单枪头的多对多移液判定
q434343 Feb 13, 2026
0dc273f
修改上传方式,添加tip_rack的连线
q434343 Feb 24, 2026
e1074f0
修改工作流上传以及lh的物料初步判定
q434343 Feb 26, 2026
41be9e4
merge lab_resource,并修改transfer liquid
q434343 Feb 28, 2026
ca985f9
Add 'plateadapter' to device and test configurations
ALITTLELZ Mar 2, 2026
01df4f1
add resource
Xuwznln Feb 10, 2026
b3bc951
registry update & workflow update
Xuwznln Feb 10, 2026
a9ea9f4
添加单枪头的多对多移液判定
q434343 Feb 13, 2026
7864989
修改上传方式,添加tip_rack的连线
q434343 Feb 24, 2026
5d208c8
修改工作流上传以及lh的物料初步判定
q434343 Feb 26, 2026
2ac1a32
更新prcxi deck & 新增 unilabos_resource_slot
Xuwznln Mar 3, 2026
2596d48
update materials
Xuwznln Mar 3, 2026
74f0d5e
Merge branch 'feat/lab_resource' of https://github.com/deepmodeling/U…
q434343 Mar 3, 2026
6bf9a31
Merge branch 'dev' into feat/lab_resource
Xuwznln Mar 3, 2026
5f45a0b
修改transfer liquid方法
q434343 Mar 9, 2026
d85ff54
完成mix,liquid_hight,touch_tip,delay等参数的传递
q434343 Mar 12, 2026
b11f6ea
修改pylabrobot更新后的影响
q434343 Mar 16, 2026
1a26772
修改tracker的问题,在volumetracker报错时,禁用并进行下一步
q434343 Mar 17, 2026
cdbca70
修改workflow上传逻辑,在trash初始化后再开始移液,修改枪头pick和drop的判断
q434343 Mar 18, 2026
35bcf67
修改rviz显示逻辑与joint_publisher,添加moveit2相关节点描述
q434343 Mar 22, 2026
9d65718
Merge branch 'prcix9320' into feat/lab_resource
q434343 Mar 22, 2026
04c0564
Update .gitignore
q434343 Mar 24, 2026
792504e
Update .gitignore
q434343 Mar 25, 2026
6802921
Merge branch 'dev' into prcix9320
q434343 Mar 25, 2026
a187a57
Add PRCXI functional modules (heating/cooling/shaking/magnetic) and r…
ALITTLELZ Mar 25, 2026
9430be5
Merge remote-tracking branch 'upstream/prcix9320' into adaptors
ALITTLELZ Mar 25, 2026
0c667e6
Remove deprecated PRCXI9300PlateAdapterSite, replaced by PRCXI9300Mod…
ALITTLELZ Mar 25, 2026
7f4b57f
Fix Deck slot Y-axis inversion: T1 should be top-left, not bottom-left
ALITTLELZ Mar 25, 2026
71d35d3
Register PRCXI9300ModuleSite/FunctionalModule for PLR deserialization
ALITTLELZ Mar 25, 2026
ad2e5a1
更新prcxi的版面更新与工作流上传方法
q434343 Mar 25, 2026
1ab1ed6
Merge branch 'dev' into feat/lab_resource
q434343 Mar 25, 2026
d13d3f7
Merge pull request #250 from ALITTLELZ/adaptors
q434343 Mar 26, 2026
edd67e4
Merge branch 'dev' into feat/lab_resource
q434343 Mar 27, 2026
afddc6e
修改上传工作流部分代码
q434343 Mar 31, 2026
6b3f975
修改真机运动方式,
q434343 Mar 31, 2026
ad66fc1
其他修改,
q434343 Mar 31, 2026
14cf4dd
Add PRCXI 9300 (3x2) deck layout support via model parameter
ALITTLELZ Mar 31, 2026
a489857
添加run_protocol参数
q434343 Mar 31, 2026
29a484f
Add "trash" to site content_type in Deck and experiment JSONs
ALITTLELZ Mar 31, 2026
68ef739
Merge pull request #253 from ALITTLELZ/9300
q434343 Mar 31, 2026
5c9c8a4
Merge branch 'prcix9320' into sjs_middle_school
q434343 Mar 31, 2026
8164d99
适配前吸空气部分
q434343 Apr 1, 2026
9a6f744
Merge branch 'sjs_middle_school' into feat/lab_resource
q434343 Apr 1, 2026
0d41d83
Merge branch 'feat/lab_resource' into prcix9320
q434343 Apr 1, 2026
2fd4270
添加 PRCXI 耗材管理 Web 应用 (labware_manager)
ALITTLELZ Apr 1, 2026
aff340d
Merge pull request #254 from ALITTLELZ/labwaresize
q434343 Apr 1, 2026
59aa991
新增 tip_above_rack_length 参数并更新 PRCXI 枪头尺寸
ALITTLELZ Apr 1, 2026
9f60e65
Merge pull request #255 from ALITTLELZ/labwaresize
q434343 Apr 1, 2026
9b70623
完成物料位置标定
q434343 Apr 2, 2026
95f3e0b
修改物料位置与初始化位置计算方法
q434343 Apr 3, 2026
56d25b8
使用16个孔与固定tip头类型,来定位slot位置
q434343 Apr 7, 2026
4d3a41e
修改部分移液逻辑
q434343 Apr 9, 2026
7df67ea
Merge branch 'dev' into prcix9320
q434343 Apr 9, 2026
f22c3f4
修改移液部分代码,如果没有10ul枪头,则不使用10ul移液枪
q434343 Apr 14, 2026
acb2dc9
初始化完成后上传更新deck
q434343 Apr 14, 2026
3aed75b
protocol转换方法修改
q434343 May 7, 2026
6288e37
演示时修改的部分代码
q434343 May 14, 2026
940abc3
Merge branch 'dev' into prcix9320
q434343 May 14, 2026
ad05e8c
修改Z轴最大值无法赋予的bug,
q434343 May 17, 2026
5be6011
更新transfer部分
q434343 May 25, 2026
a75bbe1
修改多枪头移液以及多枪头转但枪头方法
q434343 May 27, 2026
32cc97e
解决liquid history中重复多次的问题
May 28, 2026
c3b9b48
Merge pull request #266 from mk2tyf/prcix9320
q434343 May 28, 2026
a019791
修改多通道转单通道问题
q434343 May 28, 2026
bb5c3f8
修复了移液时液体名称unknow的问题和多步骤移液时液体体积合并的问题,在开始移液前初始化所有需要的孔位
mk2tyf May 29, 2026
207c4a0
Merge pull request #267 from mk2tyf/prcix9320
q434343 May 29, 2026
57b07d6
修复liquid_height报警和丢弃枪头位置可能过低问题
q434343 May 29, 2026
eecbd79
修复liquid_history问题
q434343 Jun 1, 2026
777b89a
修改none部分解读
q434343 Jun 1, 2026
fcc5c23
修改夹爪方法
q434343 Jun 2, 2026
e64f347
merge dev into prcxi
q434343 Jun 3, 2026
05a3137
修复merge
q434343 Jun 4, 2026
09f9c58
修复 labware 错误类型
q434343 Jun 4, 2026
29db6a0
无uuid的情况添加保底
q434343 Jun 5, 2026
5bb3626
添加8枪头移液方式
q434343 Jun 5, 2026
33826c9
8枪头时如果不够一列,则自动舍弃该列,跳到下一列
q434343 Jun 5, 2026
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
9 changes: 9 additions & 0 deletions .conda/scripts/post-link.bat
Original file line number Diff line number Diff line change
@@ -0,0 +1,9 @@
@echo off
setlocal enabledelayedexpansion

REM upgrade pip
"%PREFIX%\python.exe" -m pip install --upgrade pip

REM install extra deps
"%PREFIX%\python.exe" -m pip install paho-mqtt opentrons_shared_data
"%PREFIX%\python.exe" -m pip install git+https://github.com/Xuwznln/pylabrobot.git
9 changes: 9 additions & 0 deletions .conda/scripts/post-link.sh
Original file line number Diff line number Diff line change
@@ -0,0 +1,9 @@
#!/usr/bin/env bash
set -euxo pipefail

# make sure pip is available
"$PREFIX/bin/python" -m pip install --upgrade pip

# install extra deps
"$PREFIX/bin/python" -m pip install paho-mqtt opentrons_shared_data
"$PREFIX/bin/python" -m pip install git+https://github.com/Xuwznln/pylabrobot.git
Empty file.
26 changes: 26 additions & 0 deletions .cursorignore
Original file line number Diff line number Diff line change
@@ -0,0 +1,26 @@
.conda
# .github
.idea
# .vscode
output
pylabrobot_repo
recipes
scripts
service
temp
# unilabos/test
# unilabos/app/web
unilabos/device_mesh
unilabos_data
unilabos_msgs
unilabos.egg-info
CONTRIBUTORS
# LICENSE
MANIFEST.in
pyrightconfig.json
# README.md
# README_zh.md
setup.py
setup.cfg
.gitattrubutes
**/__pycache__
19 changes: 0 additions & 19 deletions .github/dependabot.yml

This file was deleted.

2 changes: 2 additions & 0 deletions .gitignore
Original file line number Diff line number Diff line change
Expand Up @@ -252,3 +252,5 @@ ros-humble-unilabos-msgs-0.9.13-h6403a04_5.tar.bz2
test_config.py


/.claude
/.cursor
85 changes: 84 additions & 1 deletion AGENTS.md
Original file line number Diff line number Diff line change
Expand Up @@ -23,8 +23,11 @@ unilab --skip_env_check # skip auto-install of dependencies
unilab --visual rviz|web|disable # visualization mode
unilab --is_slave # run as slave node

# Workflow upload subcommand
# Workflow upload subcommand(P6.1 新增 --target_device;P6.1.1 新增 --target_model)
unilab workflow_upload -f <workflow.json> -n <name> --tags tag1 tag2
unilab workflow_upload -f <workflow.json> --target_device prcxi # P6.1 默认;同上 P6 行为
unilab workflow_upload -f <workflow.json> --target_device prcxi --target_model 9320 # P6.1.1:型号粒度
unilab workflow_upload -f <workflow.json> --target_device beckman # 未来支持,需在 YAML 中声明 target_devices.beckman

# Tests
pytest tests/ # all tests
Expand Down Expand Up @@ -72,6 +75,86 @@ pytest tests/resources/test_resourcetreeset.py::TestClassName::test_method # si

Example device graphs and experiment configs are in `unilabos/test/experiments/` (not `tests/`). Registry test fixtures in `unilabos/test/registry/`.

### Labware Mapping Table (`labware_mapping.yaml`) — P6 + P6.1 + P6.1.1

Opentrons → 目标仪器(PRCXI / Beckman / Tecan ...)的「槽位重映射 + labware 归类 +
class_name 选择」全部外化到项目根的
[`labware_mapping.yaml`](./labware_mapping.yaml)(与 `pyproject.toml` 同级,最显眼的位置)。
要新增 SKU、新厂商、新型号、或调整 tip 量程档时,**只改 YAML,不改 Python**。

- **YAML 两段顶层语义**(P6.1.1 起 `slot_remap` 已下沉到 `target_devices` 内):
- `kinds` — 顺序敏感的 regex;把 labware 字符串归到 `trash / tip_rack / tube_rack / plate`。**全局段**,与目标仪器无关。
- `target_devices.<name>` — 按目标仪器组织的规则段,内含三个字段:
- `slot_remap` — 替代历史 `_map_deck_slot`(例:`4 → 13`、`8 → 14`、`12+trash → 16`)。
- `rules` — 顺序敏感的「`kind + hole_count + volume_min/volume_max` → `class_name`」规则,首个命中胜出。
- `models.<model_name>` — 可选的型号粒度覆盖(slot_remap / rules);缺失字段自动继承厂商级。
- **`target_devices` 内段名约定**:
- `default` — **固定段名**,兜底物料集 + 兜底 `slot_remap`。caller 传入的 `target_device` 在 `target_devices`
下未声明时,自动 fallback 到此段(loader 单次 warning,下游消费方零感知)。
**第一版按 prcxi 内容拷贝填充**(值仍是 `PRCXI_*`),但与 prcxi 段在 YAML 中
各自独立,可独立演进。**`default` 不支持 `models` 子段**——型号粒度差异必须落到具体仪器段。
- `prcxi` / `beckman` / `tecan` / ... — 具体仪器段(厂商粒度);caller 显式
`--target_device <name>` 时命中。可在 `models.<model>` 下声明同厂商不同型号的差异。
- **4 段 fallback 链**(`slot_remap` / `rules` 共用):
1. `target_devices.<device>.models.<model>.<field>`(caller 同时传 device + model)
2. `target_devices.<device>.<field>`(厂商级;步骤 1 缺字段时静默 fallback)
3. `target_devices.default.<field>`(caller 传未声明 device,或步骤 2 缺字段;打 warning)
4. `_BUILTIN_DEFAULT.target_devices.default.<field>`(YAML 误删 default 段时的最后兜底)
- **CLI 用法**:
- P6.1:`unilab workflow_upload -f <workflow.json> --target_device prcxi`
(`--target_device` snake-case,默认 `prcxi`;未声明的名字自动 fallback 到 `default` 段)。
- P6.1.1:可加 `--target_model <name>`(snake,可省略,默认 `None`)。
例:`unilab workflow_upload -f <workflow.json> --target_device prcxi --target_model 9320`。
- **入口代码**:`unilabos/workflow/labware_mapping.py` 暴露 `remap_slot` / `infer_kind` /
`resolve_target_class` / `reload_mapping`。
API 签名(P6.1.1):
- `remap_slot(raw_slot, object_type="", *, target_device="prcxi", target_model=None)`
- `resolve_target_class(target_device, kind, hole_count=None, volume=None, *, target_model=None)`
`workflow/common.py` 中 `_map_deck_slot` / `_infer_reagent_kind` /
`_apply_tip_rack_class_from_transfer_volumes` / `_apply_target_labware_class_auto_match` /
`_reconcile_slot_carrier_target_class` 都已转调 YAML 并透传 `target_device` / `target_model`;
YAML 未命中(孔数 / 体积超出 default 段覆盖范围)时 fallback 到
`prcxi_labware.get_prcxi_labware_template_specs` 的模板打分匹配,并打 warning 提示「请补到映射表」。
- **`labware_info` 字段重命名**:P6 的 `prcxi_class_name` → P6.1 的 `target_class_name`,
13 处全部同步刷新;旧 schema(顶层 `vendors` / `slot_remap` 或任一 rule 内 `prcxi_class`)
会触发 loader warning 并整段 fallback 到 builtin 默认表。
- **测试**:
- `pytest tests/workflow/test_labware_mapping.py` —— 45 项单元测试(含 P6.1 + P6.1.1 用例:
`test_remap_slot_model_level_overrides_device_level`、
`test_remap_slot_model_inherits_device_when_field_missing`、
`test_legacy_top_level_slot_remap_rejected`、
`test_default_section_models_subsection_warns` 等)。
- `pytest tests/workflow/test_build_protocol_graph_target_device.py` —— 6 项集成
测试(默认 / 显式 prcxi / unknown 段 fallback / per-device tip class / 字段重命名 /
P6.1.1 model-level slot_remap)。
- **设计文档**:[`product_designs/protocol_convert/06-labware-mapping-table.md`](../product_designs/protocol_convert/06-labware-mapping-table.md)
(§11.7 = P6.1 多目标仪器选择,§11.8 = P6.1.1 槽位映射按厂商+型号分叉)。

### P2 跨 slot transfer_liquid 合并(v2,已落地)

当一次 phase 中存在「单源吸取 → 跨多个 plate 分发」(典型 `steps/51b9a5.json` 9 plate × 12 well = 108 条 1:1 dispense),Stage 2 + Stage 3 现在能把它折叠成 **1 个 merged set_liquid_from_plate + 1 个 transfer_liquid** 节点。

- **Stage 2**([`Protocols/protocol_converter/change_to_transfer_group.py`](../Protocols/protocol_converter/change_to_transfer_group.py)):
- `_pair_mergeable` 只要求源 slot / tip 量程档 / use_channels 一致;不再要求 `_target_slot` 相同。
- `_merge_two_transfer_actions` 维护 `_target_slots: list[int]`(与 `_target_wells` 平行,每次 dispense 一条)。
- `export_transfer_actions` 通过 `_register_target_reagent_key` 统一注册 reagent_key:跨 slot 时按 `_target_slots` 顺序拼出 `action_args.targets: list[str]`(同板退化为 `str`)。
- 末尾 `pop` 全部 `_` 前缀字段(包括新增的 `_target_slots`)。
- **Stage 3**([`Uni-Lab-OS/unilabos/workflow/common.py`](unilabos/workflow/common.py)):
- 新增 `_emit_merged_set_liquid(...)`:对 `params.targets: list[str]` 的 transfer_liquid 节点,在其上游插入一个 **merged `set_liquid_from_plate`** 跨板聚合器;其 `param.wells` 是按 dispense 顺序通过 cursor 走 `reagent[key].well` 得出的有序跨板 well refs;多入边(每 plate 一条 `create_resource.labware → wells_identifier`),单出边(`output_wells → transfer_liquid.targets_identifier`)。
- 把 `params["targets"]` 改写为 synthetic str `_merged_targets_<idx>` 并注册 `resource_last_writer`,保证 INPUT_PORT_MAPPING 走 P3 既有的单边路径。
- `OUTPUT_PORT_MAPPING` 在原始 `step.param.targets` 为 `list[str]` 时为每个 reagent_key 分别注册 transfer_liquid 的下游 writer。
- **PRCXI runtime**([`prcxi/prcxi.py`](unilabos/devices/liquid_handling/prcxi/prcxi.py)):`change_slots` 改为遍历所有 source / target 的 parent plate 并按 plate name 去重(跨板 4 个 plate 都能 `update_pipetting_position`)。
- **`liquid_handler_abstract.transfer_liquid`**:**完全不改动**,主循环 `i % num_targets` 与单边 + 单 list 完全兼容。

CLI 行为不变:现有 `unilab workflow_upload -f <workflow.json> ...` 一切照旧;跨 slot 协议自动走 v2 路径。

测试:
- `pytest Protocols/protocol_converter/tests/test_cross_slot_merge.py` — Stage 2 单测 10 项。
- `pytest tests/workflow/test_common_cross_slot_v2.py` — Stage 3 集成测试 6 项。
- `pytest tests/devices/liquid_handling/test_set_liquid_from_plate_cross_plate.py` — device 跨板单测 6 项(pylabrobot 不全时优雅 skip)。

设计文档:[`product_designs/protocol_convert/02-cross-slot-merge.md`](../product_designs/protocol_convert/02-cross-slot-merge.md)(§9 v2 设计 + §11 落地记录)。

## Code Conventions

- Code comments and log messages in simplified Chinese
Expand Down
Loading
Loading