Community写作与编辑github.com

STEPS建模技能(API_2 / steps.interface)

一个用于编写STEPS(steps.interface / API_2)反应扩散模型的AI代理技能

steps.interface) 是什么?

该技能专门为AI代理(如Claude Code、Cursor等)设计,用于生成符合STEPS模拟器API_2规范的随机反应扩散模型。STEPS是一个用于模拟三维几何中随机反应扩散过程的科学计算库,自v3.6版本起推荐使用Python化的API_2接口。技能文档涵盖了从模型建立、网格加载、模拟运行到结果记录的全流程最佳实践,重点强调了9条关键规则,包括正确的导入顺序、自动命名机制、反应管理器用法、SI单位制转换以及使用ResultSelector进行记录等。该技能还提供了一个脚本验证工具(validate_steps_script.py),可在CI流水线中自动检查常见错误,如API版本混用、Create()误用、保留名称冲突等。支持的空间求解器为Tetexact,同时提供well-mixed模板。

兼容平台~Claude Code~Codex CLI~Cursor
npx skills add CNS-OIST/steps-modeling-skill

Installed? Explore more 写作与编辑 skills: steipete/notion, langchain-ai/langchain, bytedance/podcast-generation · View all 6 →

在你喜欢的 AI 中提问

打开一个已预加载此 Agent Skill 的新对话。

文档

STEPS建模(API_2 / steps.interface)

STEPS在三维几何中模拟随机反应扩散。自v3.6起,惯用接口是API_2(steps.interface)——一种Python风格的上下文管理器风格。所有新模型都应使用它编写。此技能编码了手册约定(https://steps.sourceforge.net/manual)以及常让AI代理犯错的问题。

阅读reference.md获取完整速查表(求解器表、单位、EField/复合物/并行、ResultSelector配方、来自管道的网格注意事项)。从模板开始并适配。以下规则是你绝不能搞错的。

核心规则

  1. 导入顺序。 首先import steps.interface,然后星号导入子模块。切勿在一个脚本中混用API_1和API_2。

    import steps.interface
    from steps.model import *
    from steps.geom import *
    from steps.rng import *
    from steps.sim import *
    from steps.saving import *
    
  2. 对象从赋值语句中获取名称。 cyt = Compartment.Create(...) 通过读取源代码行将对象命名为'cyt'。之后在模拟路径中你可以通过sim.cyt.Ca.Count访问它。所以左侧变量名就是模拟名称——选择你将使用的名称,并且它们必须是有效的Python标识符。

  3. .Create() 需要真实的 name = X.Create(...) 源代码行。 它在循环、列表推导式、多行调用、python -c或任何没有源代码的REPL中失败(“与自动赋值的预期格式不匹配”)。要以编程方式创建对象(例如在循环中为每个区域创建一个ROI),改用带name=的构造函数:ROI(triList, name=regionName)。

  4. 反应在with块中,并使用ReactionManager r。

    r = ReactionManager()
    with vsys:
        A + B <r['bind']> C          # 可逆反应
        r['bind'].K = 1e6, 0.7       # (kf, kb);不可逆反应 '>r[..]>' 只取一个K
    

    表面反应用位置标记每个物种:.i 内部隔室,.o 外部隔室,.s 为补丁表面。所有体积反应物必须位于同一隔室中。泵:Ca.i + P.s >r['pump']> Ca.o + P.s。

  5. 补丁内部隔室在前: Patch.Create(tris, inner, outer, ssys)。对于外部无物的边界膜,使用outer=None。

  6. 一切都是SI单位,但Conc是摩尔浓度。 扩散常数m²/s,长度m,Count是整数分子数,Conc是mol/L(摩尔浓度)。TetMesh.LoadGmsh(path, scale=...) 将网格坐标乘以米——纳米网格需要scale=1e-9。

  7. 使用ResultSelector记录,而非临时读取。

    rs = ResultSelector(sim)
    caConc = rs.cyt.Ca.Conc            # 构建选择器
    sim.toSave(caConc, dt=0.01)        # 在运行前注册
    ...
    caConc.data[run, timeIdx, col]; caConc.time[run]; caConc.labels
    

    分组访问:.ALL()、.LIST(A, B)、.MATCH(regex)、.SUM(...),对于网格元素使用sim.TET(t)/TETS(list)、sim.TRI(t)/TRIS(list)。sim.MATCH('regex') 在整个模拟中选择所有名称匹配的隔室/补丁/ROI——这是同时处理多个命名区域的简洁方法。

  8. 运行循环: sim.newRun() 重置状态;在它之后设置初始条件;然后sim.run(endTime)。将多次运行包装在for循环中以获取统计信息。

  9. 保留名称。 单个大写字母(A=面积,V=体积,D、I等)和功能词(Ves等)是保留的——物种/对象名称必须是描述性的多字母标识符(Ca、IP3、mitoMemb)。

典型骨架(空间型,Tetexact)

参见 templates/spatial_tetexact.py 获取可运行版本;templates/well_mixed.py 用于充分混合情况。

import steps.interface
from steps.model import *
from steps.geom import *
from steps.rng import *
from steps.sim import *
from steps.saving import *

mdl = Model()
r = ReactionManager()
with mdl:
    Ca, P = Species.Create()
    vsys = VolumeSystem.Create()
    with vsys:
        Diffusion(Ca, 1e-12)
    ssys = SurfaceSystem.Create()
    with ssys:
        Ca.i + P.s >r['pump']> Ca.o + P.s
        r['pump'].K = 2e8

mesh = TetMesh.LoadGmsh('model.msh', scale=1e-9)     # 网格坐标nm -> m
with mesh:
    cyt = Compartment.Create(mesh.tetGroups[(0, 'cytosol')], vsys)
    er  = Compartment.Create(mesh.tetGroups[(0, 'ER')], vsys)
    memb = Patch.Create(mesh.triGroups[(0, 'ER_surface')], er, cyt, ssys)

rng = RNG('mt19937', 512, 1234)
sim = Simulation('Tetexact', mdl, mesh, rng)

rs = ResultSelector(sim)
caConc = rs.cyt.Ca.Conc
sim.toSave(caConc, dt=0.01)

sim.newRun()
sim.cyt.Ca.Conc = 1e-6        # 摩尔浓度
sim.memb.P.Count = 100
sim.run(1.0)
print(caConc.data[0, -1], 'at t =', caConc.time[0, -1])

验证脚本

在运行STEPS脚本之前,请针对上述陷阱进行lint检查——无需执行,也不需要STEPS:

python validate_steps_script.py model.py

它会报告每个问题并附上具体的修复建议:导入顺序/API_1↔API_2混用、.Create()误用(循环、无赋值)、保留物种名称、单位和生物尺度(Conc是摩尔浓度,扩散系数单位m²/s,网格scale=)、newRun/toSave/run的顺序,以及声明但未设置的反应速率。存在ERROR时退出码非零(因此适合预运行/CI门禁);--selftest用于检查检查器本身。

维护此技能

当你遇到AI技能未能阻止的STEPS脚本错误时,在同一更改中扩展它:向validate_steps_script.py添加检查(附带自测用例),并将陷阱记录到上述核心规则、reference.md的常见错误表以及下面的调试检查表中。保持验证器和文档同步——验证器应能捕获所有文档记录的陷阱。

调试检查表

  • Assertion Fail: i < 4 在求解器初始化时出现 → 某个表面三角形作为一个四面体面的两个元素出现(重复的界面面片)。每个面片只需要一个三角形元素;去重网格。(参见reference.md → “来自管道的网格”。)
  • “does not match the expected format for automatic assignment” → 一个.Create()不在独立的name = ...Create(...)行上;改用带name=的构造函数(规则3)。
  • “name is reserved” → 重命名物种/对象(规则9)。
  • “Outer compartment not defined for this patch” → 表面反应在outer=None创建的边界补丁上使用了.o;该补丁只能承载.i/.s物种。
  • 运行后计数全部为零 → 反应常数K太小,或表面处体积反应物密度接近0;增大K或Count,或检查单位(Conc是摩尔浓度)。

相关技能