母胎界面研究里,snRNA-seq 配 snATAC-seq 能拿到近 20 万个细胞核,把 EVT 拆成 ITGA2 阳性祖细胞、AOC1 阳性 iEVT、NCAM1 阳性 eEVT。要接下去做空间注释,先到 TaoToken 官网 https://taotoken.net/?utm_source=taotoken_aicg_blog_end 建 Key,再用 Codex 把分群匹配、坐标对齐、螺旋动脉分布可视化串成任务链。单细胞测序交出的是分子分型表,PCF(CODEX)交出的是多通道蛋白成像,两者对得上之后,第三节「细胞亚型精准原位定位」才有落点。难点在于,这一步传统做法是拿多色成像一页页肉眼比对——EVT 亚型多、标志物通道多、组织切片层数多,人工扫片既慢又容易在边界群上认错。Codex 在这里的角色是长会话编排器兼脚本生成器:它不替你拍片,也不替你跑测序,只是把分群匹配、原位坐标对齐、沿螺旋动脉画图这三段拆成可顺序执行的任务,让每一轮的产物都留在同一段上下文里。
1. 20 万个细胞核没有回答的那个问题
1.1 snRNA-seq 加 snATAC-seq 交付了什么
snRNA-seq 和 snATAC-seq 联用时,母胎界面样本通常能筛出十几万到二十万级别的细胞核。转录组这边给出表达谱和聚类,染色质可及性这边给出调控区段,两者一交叠,EVT 这条谱系会分出几支差异明显的亚群。ITGA2 阳性那一群更像 EVT 祖细胞,AOC1 阳性那一群偏向 iEVT(间质型),NCAM1 阳性那一群偏向 eEVT(内皮型)。每个亚型都带着一串 marker 和富集通路,看上去已经相当完整。
问题在于这张表是离散的。每个细胞核只记录了它属于哪个簇,没有 x、y 坐标,也没有它离螺旋动脉管壁有多远。你没法从聚类结果判断 ITGA2 阳性祖细胞是贴着绒毛柱远端,还是已经迁移进蜕膜;也没法判断 AOC1 阳性 iEVT 是绕着腺体分布,还是集中在血管周围。研究要做到「亚型精准定位」,只能靠空间层的数据来补。
1.2 PCF 补上空间与蛋白信息之后,第三节卡在哪
PCF(CODEX)的价值在于,它能在同一张组织切片上同时标记几十种蛋白,把每个细胞的质心坐标和蛋白强度一起记录下来。这样一来,EVT 亚型的 marker 就有了原位落点。原文第三节「细胞亚型精准原位定位」要做的,正是把单细胞层面的分型结果,映射回 PCF 的组织原位图上。
麻烦出在中间这一层:单细胞这边用的是 marker 基因表达,PCF 这边用的是抗体通道信号,两边需要做一次跨模态匹配。再往后,PCF 分割出来的细胞质心要和组织切片的参考坐标系对齐,否则画出来的分布图会整体漂移。最后还要专门把 EVT 沿螺旋动脉的分布单独可视化出来。这三段如果全靠手工,每一段都要重新整理输入、导出中间表、再粘到下一步,来回折腾。
2. 把「细胞亚型精准原位定位」拆成 Codex 能编排的任务链
2.1 为什么这里适合长会话而不是单轮提问
单轮提问适合解决一个明确的小问题,比如「ITGA2 在滋养层里主要表达在哪些细胞」。但空间注释是一个多步依赖的流程:第一步的输出是第二步的输入,第二步的对齐参数又决定第三步画出来的点落在哪里。如果每轮都重开一个会话,输入就得反复粘贴,中间结果一多容易串行。
Codex 的长会话适合这类工作。你在同一个会话里先把单细胞亚型表、PCF marker 面板和切片元信息贴进去,之后每一步都基于前面的上下文继续推理。分群匹配产出的概率矩阵可以直接拿来当坐标对齐那一步的输入,不用再手动搬运。多工具体现在它会根据任务自动切换动作:读表、生成 Python 脚本、推导 marker 匹配逻辑、算坐标变换矩阵,都是在同一段会话里完成的。
2.2 三段任务链:分群匹配到坐标对齐再到螺旋动脉分布
把第三节拆开看,任务链大致是这样三段。
第一段是分群匹配。给 Codex 两张表:一张是 snRNA-seq 输出的 EVT 亚型及其 top marker 基因,另一张是 PCF 面板里实际可用的抗体通道。它会逐亚型判断哪些 marker 能在 PCF 通道里找到对应蛋白,并给出候选匹配对。这一步只输出匹配表,不直接下结论,边界群留给你人工复核。
第二段是原位坐标对齐。把 PCF 分割后的细胞质心坐标(每个细胞一行 x、y)和切片参考坐标一起给它。Codex 生成一段做仿射变换或刚体配准的脚本,把细胞坐标对到组织参考系上。生成的脚本需要你在本地 Python 环境里跑,因为它要读你实际的坐标文件,这一步由你执行。
第三段是EVT 沿螺旋动脉分布可视化。把对齐后的坐标、亚型标签和螺旋动脉轮廓一起喂进去,让 Codex 生成绘图脚本:按亚型着色,把螺旋动脉边界叠加在同一张图上,单独输出 eEVT 沿血管壁的密度分布图。同样,脚本由你本地跑,结果图回贴到会话里,让它继续帮你解释。
3. 在 ~/.codex/config.toml 里把 Codex 指到 TaoToken
3.1 先去模型广场拿 Key,再确定模型 ID
Codex 本身是一个 CLI 工具,配置文件在~/.codex/config.toml。要让它的请求走统一通道,需要先在 TaoToken 注册账号并创建 API Key。创建好之后回到模型广场,确认当前可用的模型 ID。不要自己编模型名,比如随手写一个带日期的后缀,那种 ID 在通道里通常对不上。以 https://taotoken.net/?utm_source=taotoken_aicg_blog_end 模型广场当时列出的 ID 为准。
Key 拿到后放环境变量里,不要直接写进配置文件明文。比如:
export TAOTOKEN_API_KEY=YOUR_API_KEYYOUR_API_KEY就是你从 https://taotoken.net/?utm_source=taotoken_aicg_blog_end 控制台复制出来的那一串。
3.2 config.toml 里的 model_provider 和 base_url 怎么写
Codex 的配置文件结构是这样的,直接把下面这段放进~/.codex/config.toml:
model = "YOUR_MODEL_ID" model_provider = "taotoken" [model_providers.taotoken] name = "taotoken" base_url = "https://taotoken.net/api" env_key = "TAOTOKEN_API_KEY"三个地方要特别确认。base_url填的是https://taotoken.net/api,末尾不要加/v1,也不要把 UTM 参数拼上去,那是给落地页用的。model用你刚在模型广场看到的 ID。env_key指向上一步设置的环境变量名。
注意:Codex 用的是model_provider这套字段,不要往里套ANTHROPIC_BASE_URL、ANTHROPIC_AUTH_TOKEN这类 Claude Code 的变量名。两者配置格式不一样,混用会直接报字段不认识。
3.3 用一次最小请求确认通道通了
配置保存后,先在 Codex 里发一条最简请求验证连接。比如:
codex "列出当前会话可用的模型,并说明我的 base_url 指向哪里"如果配置正确,终端会返回模型信息和当前 provider。此时你可以在输出末尾看到这一轮消耗的 token 数。如果这一步就报错,先不要往任务链里贴数据,回到第 6 节排查。
4. 第一段编排:把单细胞亚型标签匹配到 PCF 标志物组合
4.1 交给 Codex 的输入:两张表和一份面板清单
在第一段任务里,你需要准备三样东西。
第一张表是 snRNA-seq 输出的 EVT 亚型 marker 列表,大致长这样:
subtype,top_markers EVT_progenitor,ITGA2,PROM1,TP63 iEVT,AOC1,MMP2,VIM eEVT,NCAM1,CDH5,ENG第二张表是 PCF 面板里实际用到的抗体通道名,比如 HLA-G、KRT7、EGFR、CDH5、VIM 等。第三样是切片元信息,包括切片编号、染色批次、成像倍率。
把这些一起贴进 Codex 会话,然后提出请求:对每个 EVT 亚型,从 PCF 面板里选出能覆盖其 marker 的通道组合,并给出匹配优先级。
4.2 输出概率矩阵,人工只复核边界群
Codex 会返回一张匹配表,每个亚型给出若干候选通道组合以及一个匹配打分。它不是做最终判断,只是把「哪些 marker 在 PCF 里有对应蛋白」这件事先筛一遍。你要做的是复核那些分数接近的边界亚型,比如 iEVT 和 eEVT 如果在 VIM 和 CDH5 上有交叉信号,就要看一下原始 imaging 里这两群的相对位置。
这一段的核心产物是一张可以往下传的匹配矩阵。它会在后续的坐标对齐步骤里作为细胞类型标签的来源。之所以把这段交给 Codex,是因为 marker 列表和通道名一多,人工核对两个表极其耗神,而它能在同一段会话里逐亚型做候选筛选。
5. 第二段编排:原位坐标对齐与 EVT 沿螺旋动脉分布图
5.1 质心坐标与分割掩膜对齐
PCF 的成像分析通常会给出一张分割表,每个细胞一行,包含细胞 ID、质心坐标、各通道强度。这张表拿过来之后,把坐标列和切片参考坐标一起交给 Codex,让它生成一段做坐标配准的脚本。配准方式可以是基于公共标记点(比如组织边缘或已知解剖结构)的仿射变换,也可以是刚体配准,具体取决于你的切片类型。
Codex 生成的脚本大致围绕这几个动作:读取分割表,估计变换矩阵,应用到每个细胞的质心坐标上,输出一张对齐后的坐标表。这段脚本需要你在本地 Python 环境里执行,因为它读的是你本地的数据文件,Codex 只能生成和解释代码。对齐结果回贴到会话里,让它继续检查对齐误差。
5.2 生成 EVT 分布图的 Python 脚本
坐标对齐完成后,进入第三段:把带亚型标签的细胞点画到组织切片参考图上,重点突出 EVT 沿螺旋动脉的分布。给 Codex 的输入是:对齐后的坐标表、每个细胞的亚型标签、螺旋动脉轮廓的坐标序列。
它生成的绘图脚本大致是这个结构:
import pandas as pd import matplotlib.pyplot as plt cells = pd.read_csv("aligned_cells.csv") artery = pd.read_csv("spiral_artery_outline.csv") fig, ax = plt.subplots(figsize=(10, 10)) for subtype, color in [("EVT_progenitor", "#d62728"), ("iEVT", "#1f77b4"), ("eEVT", "#2ca02c")]: subset = cells[cells["subtype"] == subtype] ax.scatter(subset["x"], subset["y"], s=4, c=color, label=subtype) ax.plot(artery["x"], artery["y"], c="black", linewidth=1.5, label="spiral artery") ax.set_aspect("equal") ax.legend() plt.savefig("evt_spatial_distribution.png", dpi=300)脚本在本地跑完之后,你会得到一张按亚型着色的原位分布图,螺旋动脉轮廓叠加在上层。如果你还想要 eEVT 沿血管壁的密度曲线,可以让 Codex 在同一会话里基于 aligned_cells 再生成一段沿弧长方向分 bin 的统计脚本。整个过程是:Codex 生成脚本 → 你在本地执行 → 结果图回贴 → 它继续解释。
6. 终端里的 Token 消耗和三类常见排障
6.1 最小请求验证
在正式跑完整任务链之前,建议先用一条最小请求确认 Codex 和 TaoToken 之间的通道畅通。上面第 3.3 节那条codex "..."就是最小请求,它不涉及数据文件,只验证模型能否被调起来。终端会显示本轮请求的 token 消耗和响应内容。如果这一步正常,再去贴 CSV、提任务。
6.2 config.toml 写错、Key 缺失、模型 ID 对不上
三类报错比较常见,对照下表:
| 现象 | 可能原因 | 处理方式 |
|---|---|---|
| 请求返回 401 或提示未授权 | TAOTOKEN_API_KEY未设置,或值里带了多余空格 | echo $TAOTOKEN_API_KEY检查,重新 export |
| 请求 404 或模型不存在 | model字段写了一个模型广场没有的 ID | 回到 https://taotoken.net/?utm_source=taotoken_aicg_blog_end 模型广场核对当前可用 ID |
| 请求地址异常,提示 provider 不可用 | base_url写成了https://taotoken.net/api/v1或加了 UTM 参数 | 改回https://taotoken.net/api,末尾不加/v1 |
还有一类不算报错但很常见:model_provider字段名写成了provider或者直接套了 Claude Code 的ANTHROPIC_*变量名。Codex 的配置结构是固定的,字段不匹配时工具会忽略这段配置,回退到默认 provider。检查一下你的~/.codex/config.toml里model_provider是否拼写正确。
7. 跑完这一段之后,去控制台对一下用量
任务链跑通之后,回到 https://taotoken.net/?utm_source=taotoken_aicg_blog_end 控制台,看一下这一轮调用消耗了多少 token。第三段生成绘图脚本和坐标对齐脚本时,上下文里会带上前两段的数据描述和中间结果,所以一轮长会话的 token 消耗通常会比你预期的高一些。对照用量记录可以判断当前套餐是否够用。
如果只是偶尔跑一次分析,单次调用量不大,按量走就行。如果长期做空间注释,每个样本都要跑一遍类似的流程,可以到 Coding Plan 看一下套餐是否更合适。Key 需要新建或者轮换时,在 控制台 API Keys 里操作。第一次接入建议先用 模型对话 验证同一把 Key 能否正常发消息,确认后再拉进 Codex 做空间注释编排。