酶标仪实验数据分析(按次付费)
把酶标仪原始读数变成可写进论文的结果:标准曲线拟合 → 浓度回算 → 统计检验 → 出图。拟合、统计与绘图全部在服务端完成,本 Skill 只负责「整理数据 → 请求 → 支付 → 携凭证重试 → 展示结果」,不接触任何私钥,也不在本地执行核心算法。
何时用这个技能
用户提供以下任一类数据并要求分析时:
| 实验类型 | 典型需求 |
|---|---|
| ELISA / 夹心法 | 拟合标准曲线(4PL),由样品 OD 反算浓度,含稀释倍数回算 |
| 药物筛选 / 细胞毒性 | 剂量-反应曲线,求 IC50 / EC50 |
| 酶动力学 | Michaelis-Menten 拟合,求 Km、Vmax |
| MTT / CCK-8 / XTT | 各组活力百分比与组间差异 |
| BCA / Bradford | 线性标准曲线 → 蛋白浓度 |
| 任意分组实验 | t 检验、单因素 ANOVA + Tukey HSD、Mann-Whitney、Kruskal-Wallis |
单次价格
¥0.20 / 次(每次调用返回一个完整分析结果)。
三处价格必须完全一致,否则用户无法付款:
- 支付宝 AI 付「服务注册」登记的单价
- 服务端 402 账单里的
amount - SkillHub 发布表单「完善计费」里的单次调用价格
依赖安装
分析服务在云端,本地只需要两样:
# 1. Node.js >= 18(脚本只用内建模块,无需 npm install)
node --version
# 2. 买家侧支付能力(在 Agent 对话内完成扫码付款)
npx -y @alipay/agent-payment@latest install
只有需要解析 Excel/CSV 时才用 Python(scripts/prepare_data.py,依赖 pandas/openpyxl);直接把数值贴进 JSON 则不需要。
调用流程
三段式,每步都有明确的成功标志:
# 1. 取账单(不产生费用)
node scripts/plate-assay-paid.mjs probe --payload payload.json
# 2. 支付(交给支付宝支付能力,用户在对话内确认金额)
node scripts/plate-assay-paid.mjs pay
# 3. 携凭证重试,服务端验付 + 履约确认后返回结果
node scripts/plate-assay-paid.mjs complete --proof "<Payment-Proof>"
1. probe —— 取 402 账单
把整理好的 JSON 发给分析接口但不带支付凭证,服务端返回 HTTP 402 与 Payment-Needed 响应头。脚本解码账单、打印金额与服务名,并把账单与原始请求体一起存到 .state/<out_trade_no>.json(后续 complete 复用同一份请求体,保证「同一请求」)。
这一步不花钱。 若服务端返回 200,说明配置为免费模式,直接输出结果。
2. pay —— 支付
把账单交给 alipay-bot 完成收银与授权(在对话内扫码或确认,不跳转站外页面)。
若当前环境没有 alipay-bot,脚本会把账单写成 .state/<out_trade_no>.bill.json 并提示安装命令 —— 这是环境缺依赖,不是支付失败。
3. complete —— 携凭证重试
把 Payment-Proof 放进请求头重试同一个请求(同样的数据、同样的参数)。服务端会:
- 调
alipay.aipay.agent.payment.verify验证凭证 - 校验
active=true、金额与订单一致、out_trade_no与本地订单一致 - 交付分析结果,并调
alipay.aipay.agent.fulfillment.confirm回报履约
成功返回 200 与结果;凭证无效或过期仍返回 402,脚本退出码 2 —— 此时不要重复付款,先核对订单号。
输入格式
标准曲线(curve)
{
"task": "curve",
"points": [[0, 0.098], [0.5, 0.24], [1, 0.42], [2, 0.78], [4, 1.32], [8, 1.85], [16, 2.21], [32, 2.35]],
"model": "fourpl",
"inverse": [0.62, 1.14, 1.78],
"dilution": 5,
"plot": true
}
| 字段 | 必填 | 说明 |
|---|---|---|
points |
是 | [浓度, OD] 数组,至少 3 点;也接受 {"x":..,"y":..} |
model |
否 | auto(默认)/ linear / fourpl / mm |
inverse |
否 | 待回算的样品 OD 列表,返回对应浓度 |
dilution |
否 | 样品稀释倍数,回算时自动相乘,默认 1 |
inverse_y |
否 | 给定浓度、反查预测信号 |
plot |
否 | true 时返回 300 dpi PNG(base64) |
组间比较(compare)
{
"task": "compare",
"rows": [
{"group": "ctrl", "value": 1.02}, {"group": "ctrl", "value": 0.98}, {"group": "ctrl", "value": 1.11},
{"group": "drug", "value": 0.62}, {"group": "drug", "value": 0.58}, {"group": "drug", "value": 0.71}
],
"test": "ttest",
"plot": true
}
| 字段 | 必填 | 说明 |
|---|---|---|
rows |
是 | {group, value} 记录,至少 4 条;也接受 [组名, 值] |
test |
否 | auto(两组→t 检验,多组→ANOVA)/ ttest / anova / mannwhitney / kruskal |
group_col / value_col |
否 | 自定义列名,默认 group / value |
plot |
否 | 柱状图 + 误差棒(300 dpi PNG) |
> 注意:分组数据必须用 rows 字段。传 groups: {"ctrl": [...]} 这类映射会返回 400。
输出
curve
model fourpl
R² 0.99987
params A=0.0612 B=1.0423 C=3.8914 D=2.4157 EC50=3.8914
n_points 8
样品 OD → 浓度(稀释倍数 5)
0.62 → 1.247 μg/mL
1.14 → 4.982 μg/mL
1.78 → 9.613 μg/mL
compare
group n mean sd sem
ctrl 3 1.0367 0.0666 0.0384
drug 3 0.6367 0.0666 0.0384
test welch_t (Levene p=0.874,方差齐)
statistic -7.3520
p 0.0018 **
拟合优度、检验统计量与 p 值都原样返回,便于在论文方法部分引用;plot: true 时另附 PNG。
边界与约定
- 不给生物学结论:只输出拟合参数、统计量与图形,不判断「药物是否有效」「表达是否上调」
- 不替代重复实验:n=1 的单块板不能作为独立重复,统计检验至少 3 次独立实验才有意义
- 不做数据清洗的猜测:缺失值、明显离群点会如实保留并在结果里体现,由用户决定是否剔除
- 数据只用于本次计算:请求体仅用于当次分析,服务端不落盘原始数据
- 不认识的实验请用户提供试剂盒说明书中的计算公式后再处理,不凭空编造
计费异常处理
| 情况 | 表现 | 处理 |
|---|---|---|
| 价格三处不一致 | 收银台报 SERVICE_PRICE_MISMATCH |
统一三处为 ¥0.20 |
| 支付后仍返回 402 | complete 退出码 2 |
核对订单号与凭证是否同一笔,勿重复付款 |
| 服务端 503 | 提示配置未完成 | 服务端密钥/服务标识未就绪,稍后重试 |
| 同一凭证重复调用 | already_fulfilled: true |
正常,不会重复扣费也不会重复交付 |
| 输入不合法 | 400 + INVALID_PAYLOAD |
数据格式问题,不计费,修正后重试 |
服务端信息
协议契约与字段说明见 references/server-contract.md。私钥、appId、serviceId 全部在服务端,不在本 Skill 包内。
服务地址已内置;仅在网络异常或迁移时用 --base-url 覆盖。