1. 从scRNA-seq到CODEX:溃疡性结肠炎细胞群线索为什么需要原位验证
单细胞转录组测序(scRNA-seq)和CITE-seq能告诉你组织里有哪些细胞、它们处于什么转录状态、不同分组之间哪些细胞群比例发生了变化。但这类技术有一个绕不开的硬伤:组织需要先消化成单细胞悬液,细胞在黏膜组织中的原始空间位置信息在这个过程中丢失了。对于溃疡性结肠炎(UC)这类组织结构高度相关的研究,仅仅知道MNP、成纤维细胞、T细胞或上皮细胞的比例变化是不够的——你还需要知道这些细胞分布在黏膜的哪个位置、靠近谁、是否位于炎症区域或修复相关区域。
这就是CODEX(PhenoCycler Fusion,简称PCF)和MIBI这类空间蛋白组技术要承接的工作。PCF的本质是把单细胞测序给出的“细胞清单”重新放回组织结构中:单细胞分析提示activated fibroblast与TIMP1、MMP1、MMP3、AREG、CD10等特征相关,MNP与CD1C、CD11c、FcεR1α或炎症相关基因表达有关——PCF可以围绕这些蛋白标志物设计抗体Panel,在FFPE组织切片中观察相应细胞是否位于同一炎症区域、是否靠近上皮损伤区域、是否与血管或基质结构相关。
整个链路可以概括为:scRNA-seq/CITE-seq负责发现细胞群和候选marker,CODEX/MIBI负责将这些线索放回真实组织结构中进行蛋白层验证。本文面向做单细胞与空间组学交叉研究的同学,交付可复制的PCF配置片段、CODEX抗体Panel对照表,以及从聚类结果到原位信号的验证动作清单。如果你正在用TaoToken做生信分析流程的模型调用和代码辅助,这套链路同样适用。
2. TaoToken前置准备:API Key、Base URL与模型ID三件套
在开始写分析代码之前,先把TaoToken的接入信息准备好。不管你是用Python脚本做scRNA-seq聚类,还是用Claude Code辅助写CODEX Panel设计逻辑,都需要这三样东西:Base URL、API Key、Model ID。
2.1 获取API Key与确认Base URL
访问TaoToken控制台(https://taotoken.net/console?utm_source=taotoken_aicg_blog_end&utm_medium=csdn&utm_campaign=rewrite),在API Keys页面创建一个新的Key。创建时建议按项目命名,比如uc-scrna-codex,方便后续排查是哪个环节的调用出了问题。
Base URL统一使用:
https://taotoken.net/api注意这个地址后面不加UTM参数,直接作为API请求的根地址。如果你用的是OpenAI兼容的SDK,把base_url设成这个值即可。
2.2 模型ID选择
TaoToken支持多种模型,做生信代码辅助时我一般用claude-sonnet-4-20250514或gpt-4o。模型ID在请求体的model字段里指定。如果你不确定当前可用的模型列表,可以访问模型对话页面(https://taotoken.net/models?utm_source=taotoken_aicg_blog_end&utm_medium=csdn&utm_campaign=rewrite)查看。
2.3 环境变量配置
为了避免Key硬编码在脚本里,建议用环境变量:
export TAOTOKEN_API_KEY="sk-your-key-here" export TAOTOKEN_BASE_URL="https://taotoken.net/api"然后在Python里这样读取:
import os from openai import OpenAI client = OpenAI( api_key=os.environ["TAOTOKEN_API_KEY"], base_url=os.environ["TAOTOKEN_BASE_URL"] )如果你用的是Claude Code,需要在settings.json里配置。路径通常是~/.claude/settings.json:
{ "env": { "ANTHROPIC_BASE_URL": "https://taotoken.net/api", "ANTHROPIC_API_KEY": "sk-your-key-here", "ANTHROPIC_MODEL": "claude-sonnet-4-20250514" } }这三件套(Base URL + Key + Model ID)配好之后,后面的分析代码和Panel设计辅助都能直接调用。
3. 可复制配置:PCF Panel设计片段与CODEX抗体对照表
这一节直接给可复制的配置。PCF的Panel设计通常以CSV或JSON格式提交给PhenoCycler系统,下面是一个针对UC研究的示例配置。
3.1 PCF Panel配置JSON片段
假设你的scRNA-seq分析已经产出了候选marker列表,比如activated fibroblast的CD10、TIMP1、MMP1,MNP的CD1C、CD11c、FcεR1α,Treg的FOXP3、CD25,内皮细胞的CD146、CD49a等。下面是一个Panel配置片段:
{ "panel_name": "UC_scrna_to_codex_v1", "tissue_type": "FFPE", "markers": [ {"target": "CD10", "clone": "56C6", "channel": "B1", "role": "activated_fibroblast"}, {"target": "TIMP1", "clone": "polyclonal", "channel": "B2", "role": "fibroblast_remodeling"}, {"target": "MMP1", "clone": "EPR18356", "channel": "B3", "role": "matrix_degradation"}, {"target": "CD1C", "clone": "EPR1344", "channel": "B4", "role": "MNP_dc"}, {"target": "CD11c", "clone": "EP1347Y", "channel": "B5", "role": "myeloid"}, {"target": "FcεR1α", "clone": "AER-37", "channel": "B6", "role": "mast_basophil"}, {"target": "FOXP3", "clone": "236A/E7", "channel": "B7", "role": "Treg"}, {"target": "CD25", "clone": "4C9", "channel": "B8", "role": "Treg_activation"}, {"target": "CD146", "clone": "EPR3208", "channel": "B9", "role": "endothelial"}, {"target": "CD49a", "clone": "TS2/7", "channel": "B10", "role": "stromal_adhesion"}, {"target": "PanCK", "clone": "AE1/AE3", "channel": "B11", "role": "epithelial"}, {"target": "CD45", "clone": "2B11+PD7/26", "channel": "B12", "role": "immune_common"}, {"target": "CD3", "clone": "SP7", "channel": "B13", "role": "T_cell"}, {"target": "CD20", "clone": "L26", "channel": "B14", "role": "B_cell"}, {"target": "CD68", "clone": "KP1", "channel": "B15", "role": "macrophage"}, {"target": "αSMA", "clone": "1A4", "channel": "B16", "role": "myofibroblast"} ], "nuclear_stain": "DAPI", "cycles": 8 }这个配置里每个marker都标注了对应的细胞群角色,方便后续在分析时直接按role分组统计空间邻域关系。
3.2 CODEX抗体Panel对照表
下面这张表把scRNA-seq发现的细胞群、候选marker、对应的CODEX抗体克隆号和预期空间分布列在一起,方便你在设计Panel时对照:
| 细胞群(scRNA-seq) | 候选Marker | CODEX抗体克隆 | 预期空间分布 | 验证重点 |
|---|---|---|---|---|
| Activated fibroblast | CD10, TIMP1, MMP1 | 56C6, polyclonal, EPR18356 | 黏膜下层基质 | 是否靠近上皮损伤区 |
| MNP | CD1C, CD11c, FcεR1α | EPR1344, EP1347Y, AER-37 | 固有层炎症区 | 与成纤维细胞邻近距离 |
| Treg | FOXP3, CD25 | 236A/E7, 4C9 | 固有层淋巴聚集区 | 是否位于炎症生态位 |
| Endothelial | CD146, CD49a | EPR3208, TS2/7 | 血管周围 | 与免疫细胞空间关系 |
| Epithelial | PanCK | AE1/AE3 | 黏膜表层/隐窝 | 损伤与修复区域 |
| Myeloid | CD68, CD11c | KP1, EP1347Y | 固有层 | 与MNP共定位 |
| T cell | CD3, CD45 | SP7, 2B11+PD7/26 | 固有层/淋巴滤泡 | 与Treg空间关系 |
| B cell | CD20 | L26 | 淋巴滤泡 | 聚集区结构 |
这张表可以直接作为Panel设计的输入,也可以作为后续空间分析的注释参考。
3.3 用TaoToken辅助生成Panel配置
如果你不想手写JSON,可以用TaoToken的模型对话功能,把scRNA-seq的marker列表贴进去,让模型帮你生成Panel配置草稿。比如:
prompt = """ 我有以下scRNA-seq候选marker列表,请帮我生成一个CODEX Panel配置JSON, 包含target、clone、channel、role字段。marker列表: CD10, TIMP1, MMP1, CD1C, CD11c, FcεR1α, FOXP3, CD25, CD146, CD49a, PanCK, CD45, CD3, CD20, CD68, αSMA """ response = client.chat.completions.create( model="claude-sonnet-4-20250514", messages=[{"role": "user", "content": prompt}] ) print(response.choices[0].message.content)这样能快速得到一个可编辑的草稿,再根据实验室实际可用的抗体克隆号做调整。
4. 验证请求与成功结果:从聚类到原位信号的完整动作清单
配置写好之后,需要验证整条链路是否跑通。这一节给出从scRNA-seq聚类结果到MIBI/CODEX原位信号的验证动作清单。
4.1 验证API调用是否正常
先跑一个最小的请求,确认TaoToken的API Key和Base URL配置正确:
import os from openai import OpenAI client = OpenAI( api_key=os.environ["TAOTOKEN_API_KEY"], base_url=os.environ["TAOTOKEN_BASE_URL"] ) response = client.chat.completions.create( model="claude-sonnet-4-20250514", messages=[{"role": "user", "content": "回复OK"}], max_tokens=10 ) print(response.choices[0].message.content)如果返回OK,说明三件套配置正确。如果报401,检查Key是否过期或复制时多了空格。
4.2 scRNA-seq聚类结果导出
假设你已经用Seurat或Scanpy完成了聚类,需要导出每个cluster的marker基因列表和细胞比例:
import scanpy as sc import pandas as pd adata = sc.read_h5ad("uc_colon_scRNA.h5ad") sc.tl.rank_genes_groups(adata, "leiden", method="wilcoxon") marker_df = sc.get.rank_genes_groups_df(adata, group=None) marker_df = marker_df[marker_df["pvals_adj"] < 0.05] marker_df.to_csv("cluster_markers.csv", index=False) cluster_counts = adata.obs["leiden"].value_counts() cluster_counts.to_csv("cluster_proportions.csv")导出的cluster_markers.csv就是Panel设计的输入。
4.3 CODEX/MIBI图像分割与信号提取
PCF或MIBI跑完之后,你会得到多通道图像。用codEX或MCMICRO流程做细胞分割和信号提取:
# 以MCMICRO为例 nextflow run labsyspharm/mcmicro \ -profile docker \ --in ./raw_images \ --out ./mcmicro_output \ --start-at registration分割完成后,每个细胞会有一个表达矩阵,行是细胞,列是marker通道。这个矩阵就是原位验证的核心数据。
4.4 空间邻域分析验证
把scRNA-seq的cluster标签和CODEX的细胞表型做映射,然后计算空间邻域关系:
import squidpy as sq import anndata as ad adata_codex = ad.read_h5ad("codex_cells.h5ad") sq.gr.spatial_neighbors(adata_codex, coord_type="generic", n_neighs=10) sq.gr.nhood_enrichment(adata_codex, cluster_key="cell_type") sq.pl.nhood_enrichment(adata_codex, cluster_key="cell_type")如果scRNA-seq提示MNP与activated fibroblast存在共变趋势,那么在CODEX数据里应该能看到这两类细胞在空间邻域富集分析中呈现显著邻近。这就是原位验证的核心动作。
4.5 成功结果的判断标准
验证成功的标志不是某一个指标,而是一组一致性:
- scRNA-seq中MNP比例升高的分组,在CODEX切片中对应区域CD1C+CD11c+细胞密度也升高;
- activated fibroblast的marker(CD10、TIMP1)在空间上与上皮损伤区域距离更近;
- Treg(FOXP3+CD25+)在炎症区域形成聚集,而不是均匀分布;
- 内皮细胞(CD146+)与免疫细胞的空间邻近距离在炎症组中缩短。
这些结果不需要全部显著,但方向一致就说明链路跑通了。
5. 本篇常见错排查:401、local proxy failed、reading choices、OAuth
这一节对照真实报错,给出排查路径。
5.1 401 Unauthorized
最常见的原因是API Key错误。检查步骤:
echo $TAOTOKEN_API_KEY确认输出的是完整的Key,没有换行或空格。如果用的是Claude Code,检查~/.claude/settings.json里的ANTHROPIC_API_KEY字段是否和Console里的一致。另外注意Base URL不要写成https://taotoken.net/api/(末尾多斜杠),有些SDK会因此拼接出错误路径。
5.2 local proxy failed
这个报错通常出现在网络环境配置了本地代理但代理未启动时。检查:
env | grep -i proxy如果有HTTP_PROXY或HTTPS_PROXY变量,确认代理服务是否在运行。如果不需要代理,直接unset:
unset HTTP_PROXY HTTPS_PROXY然后重新跑请求。
5.3 reading choices 报错
这个错误一般出现在流式响应解析时,响应体格式不符合预期。检查请求参数里stream是否设成了True但客户端没有正确处理SSE。如果你不需要流式,设成False:
response = client.chat.completions.create( model="claude-sonnet-4-20250514", messages=[{"role": "user", "content": "test"}], stream=False )如果必须用流式,确保用for chunk in response:逐块读取,而不是直接取response.choices。
5.4 OAuth相关报错
如果你用的是Claude Code的OAuth登录方式,但同时又配置了API Key,可能会冲突。检查~/.claude/settings.json里是否同时存在ANTHROPIC_API_KEY和OAuth token。建议二选一:用API Key就删掉OAuth相关字段,反之亦然。
5.5 Codex auth.json配置
如果你用Codex CLI,认证信息在~/.codex/auth.json。确保里面的base_url指向https://taotoken.net/api,api_key字段填TaoToken的Key。三件套(Base URL + Key + Model ID)缺一不可:
{ "base_url": "https://taotoken.net/api", "api_key": "sk-your-key-here", "model": "claude-sonnet-4-20250514" }改完之后重启Codex CLI,再跑一个简单请求验证。
6. 接入文档与后续动作
整条链路跑通之后,你可以把scRNA-seq的cluster marker列表、CODEX Panel配置、空间邻域分析脚本都固化下来,形成可复用的分析模板。后续如果换一个疾病模型,只需要替换marker列表和Panel配置,分析框架不用大改。
接入相关的文档和Key管理,可以访问:
- API Keys管理:https://taotoken.net/api-keys?utm_source=taotoken_aicg_blog_end&utm_medium=csdn&utm_campaign=rewrite
- 接入文档:https://taotoken.net/doc?utm_source=taotoken_aicg_blog_end&utm_medium=csdn&utm_campaign=rewrite
- 模型对话验证:https://taotoken.net/models?utm_source=taotoken_aicg_blog_end&utm_medium=csdn&utm_campaign=rewrite
如果你需要长期跑编码和Agent任务,比如自动生成Panel配置、批量处理空间数据,可以看看Coding Plan:https://taotoken.net/coding-plan?utm_source=taotoken_aicg_blog_end&utm_medium=csdn&utm_campaign=rewrite
最后提醒一句:PCF和MIBI的Panel设计一定要结合实验室实际可用的抗体克隆号,不要直接照搬文献里的克隆号,不同厂家的抗体在FFPE组织上的表现差异很大。先跑一个小规模测试切片,确认信号特异性和背景水平,再上正式样本。