
1. 小鼠脾脏切片跑CODEX前我踩过的三个坑PCF空间单细胞蛋白组技术PhenoCycler-Fusion也就是大家常说的CODEX能做什么简单说它用DNA条形码标记抗体通过迭代荧光成像在单细胞分辨率下同时看清组织原位中几十甚至上百种蛋白质的表达与空间关系。适合谁做小鼠模型免疫微环境、肿瘤空间异质性、组织再生与纤维化机制研究的同学尤其是那些已经不满足于免疫荧光只能染三四个靶标、想一次性拿到“细胞邻域”级别信息的人。我试过用传统免疫荧光做小鼠脾脏染了CD4、CD8、B220、CD11c四个通道结果红髓和白髓边界在图上糊成一团滤泡树突细胞网络根本分不出来。后来换成PCF流程24-plex panel一次成像脾脏白髓的滤泡、边缘区、红髓的巨噬细胞环全部清晰可辨。但第一次跑的时候切片自发荧光没压住抗体panel里两个克隆号撞了信号数据质控直接卡在背景扣除那一步。这篇文章就把从组织切片、抗体panel设计到数据质控的关键节点拆开讲重点交付可复制的CODEX实验配置模板以及用TaoToken统一Key接入分析管线的示例。小鼠脾脏和脑组织的验证动作清单我会放在最后你可以直接照着跑。先说清楚PCF和CODEX的关系PCF是仪器平台名CODEX是化学标记与成像策略名很多文献混用你搜“PCF空间单细胞蛋白组”或“CODEX小鼠脾脏”都能找到同一批方法学论文。2018年Garry Nolan团队在Cell上那篇脾脏工作用的就是24-plex抗体panel加冰冻切片建立了“细胞护照”和“细胞邻域”概念。从那以后小鼠模型的应用从脾脏扩展到骨骼肌再生、胰腺癌、狼疮肾炎、肺间质巨噬细胞、胰岛驻留巨噬细胞、皮肤纤维化、软骨再生、骨髓微环境等至少十几个组织类型。抗体panel规模也从24-plex一路涨到54-plex2026年Blood那篇CML骨髓图谱用了54-plex、55个ROI、分析了两百多万个单细胞。通量翻倍的同时对切片质量、抗体偶联效率、背景控制的要求也指数级上升。你如果刚开始搭管线最容易犯的错是切片厚度不对、抗体panel没做克隆号冲突检查、成像循环数设错导致信号衰减。下面按步骤来。2. TaoToken前置统一Key接入空间组学分析管线PCF跑完成像只是第一步后面还有去卷积、细胞分割、邻域分析、空间统计。这些分析脚本往往要调用大模型接口做注释辅助或报告生成或者用Coding Plan跑批量任务。TaoToken在这里的角色是统一Key管理你不用在多个脚本里散落不同平台的API Key而是用一个Key走完模型对话、代码生成、文档检索。官网入口https://taotoken.net/?utm_sourcetaotoken_aicg_blog_endutm_mediumcsdnutm_campaignrewriteutm_contentAPI地址https://taotoken.net/api注意这个不加UTM参数模型对话入口https://taotoken.net/models?utm_sourcetaotoken_aicg_blog_endutm_contentmodel_chatutm_campaignrewriteCoding Plan入口https://taotoken.net/coding-plan?utm_sourcetaotoken_aicg_blog_endutm_contentcoding_planutm_campaignrewrite控制台https://taotoken.net/console?utm_sourcetaotoken_aicg_blog_endutm_contentconsoleutm_campaignrewriteAPI Keys管理https://taotoken.net/api-keys?utm_sourcetaotoken_aicg_blog_endutm_contentapi_keysutm_campaignrewrite接入文档https://taotoken.net/doc?utm_sourcetaotoken_aicg_blog_endutm_contentdocutm_campaignrewriteClaude Code Anthropic配置https://taotoken.net/claude-code-anthropic?utm_sourcetaotoken_aicg_blog_endutm_contentclaude_codeutm_campaignrewrite为什么空间组学分析需要这个因为PCF数据量很大一个54-plex、55个ROI的骨髓切片原始图像可能几十GB去卷积和细胞分割后的单细胞表型矩阵轻松上百万行。你要做细胞类型注释、邻域富集、空间自相关检验写脚本时经常需要查API文档、生成模板代码、让模型解释报错。如果每个环节都单独配Key脚本里会乱成一锅粥。用TaoToken统一Key环境变量只设一个所有分析脚本共用。具体操作在API Keys页面创建一个Key然后在你分析服务器的shell配置文件里写入环境变量。注意不要硬编码在脚本里也不要把Key提交到git。# 写入 ~/.bashrc 或 ~/.zshrc export TAOTOKEN_API_KEYsk-你的实际Key export TAOTOKEN_BASE_URLhttps://taotoken.net/api然后验证环境变量是否生效source ~/.bashrc echo $TAOTOKEN_API_KEY | head -c 8 # 应该输出 sk- 开头的前8位如果你用Python脚本做空间分析可以在脚本开头这样读取import os from openai import OpenAI client OpenAI( api_keyos.environ[TAOTOKEN_API_KEY], base_urlos.environ[TAOTOKEN_BASE_URL] ) response client.chat.completions.create( modelgpt-4o, messages[ {role: user, content: 解释CODEX数据中细胞邻域富集分析的步骤} ] ) print(response.choices[0].message.content)这里的关键是base_url指向TaoToken的API地址model字段填你实际要用的模型ID。如果你用Claude Code做代码辅助配置方式类似在settings里填Base URL和KeyModel ID按文档选。3. 可复制配置CODEX实验模板与settings片段这一节给你两份可直接复制的配置。第一份是CODEX实验的抗体panel设计模板JSON格式第二份是分析环境的settings片段TOML格式。路径和字段名保持和实际使用一致你改掉抗体克隆号和荧光通道即可。先看抗体panel模板。PCF的panel设计核心是每个抗体偶联一个独特的DNA条形码成像时通过互补探针循环读取。panel里必须包含结构标记如CD31、Podoplanin、免疫细胞谱系标记CD45、CD3、CD4、CD8、B220、CD11c、F4/80、功能状态标记PD-1、Ki67、CD44和阴性对照。以下是一个24-plex小鼠脾脏panel的JSON模板{ panel_name: mouse_spleen_24plex_v1, species: mouse, tissue: spleen, section_thickness_um: 7, antibodies: [ {target: CD45, clone: 30-F11, barcode: B01, dilution: 1:200, channel: Cy3}, {target: CD3e, clone: 145-2C11, barcode: B02, dilution: 1:150, channel: Cy5}, {target: CD4, clone: GK1.5, barcode: B03, dilution: 1:200, channel: Cy3}, {target: CD8a, clone: 53-6.7, barcode: B04, dilution: 1:200, channel: Cy5}, {target: B220, clone: RA3-6B2, barcode: B05, dilution: 1:300, channel: Cy3}, {target: CD11c, clone: N418, barcode: B06, dilution: 1:200, channel: Cy5}, {target: F4/80, clone: BM8, barcode: B07, dilution: 1:150, channel: Cy3}, {target: CD11b, clone: M1/70, barcode: B08, dilution: 1:200, channel: Cy5}, {target: Ly6G, clone: 1A8, barcode: B09, dilution: 1:200, channel: Cy3}, {target: CD31, clone: 390, barcode: B10, dilution: 1:150, channel: Cy5}, {target: Podoplanin, clone: 8.1.1, barcode: B11, dilution: 1:200, channel: Cy3}, {target: Ki67, clone: B56, barcode: B12, dilution: 1:100, channel: Cy5}, {target: PD-1, clone: RMP1-30, barcode: B13, dilution: 1:150, channel: Cy3}, {target: CD44, clone: IM7, barcode: B14, dilution: 1:200, channel: Cy5}, {target: CD169, clone: 3D6.112, barcode: B15, dilution: 1:200, channel: Cy3}, {target: MHCII, clone: M5/114.15.2, barcode: B16, dilution: 1:300, channel: Cy5}, {target: CD21, clone: 7E9, barcode: B17, dilution: 1:150, channel: Cy3}, {target: CD35, clone: 8C12, barcode: B18, dilution: 1:150, channel: Cy5}, {target: IgD, clone: 11-26c.2a, barcode: B19, dilution: 1:200, channel: Cy3}, {target: IgM, clone: RMM-1, barcode: B20, dilution: 1:200, channel: Cy5}, {target: CD138, clone: 281-2, barcode: B21, dilution: 1:150, channel: Cy3}, {target: Vimentin, clone: D21H3, barcode: B22, dilution: 1:200, channel: Cy5}, {target: Collagen IV, clone: EBM11, barcode: B23, dilution: 1:200, channel: Cy3}, {target: DAPI, clone: n/a, barcode: B24, dilution: 1:1000, channel: DAPI} ], controls: { negative_control: B24_empty, positive_control: CD45 } }注意几个坑第一同一荧光通道的抗体不能有光谱重叠Cy3和Cy5交替分配第二克隆号必须查过比如CD11c的N418和CD11b的M1/70不能同时用同一通道第三DAPI作为核染不算在条形码循环里单独走一个通道。你如果做脑组织把脾脏标记换成NeuN、GFAP、Iba1、MBP、CD68、CD45、CD31、Podoplaninpanel规模可以降到18-plex先跑通。第二份配置是分析环境的settings.toml用于统一管理TaoToken接入和本地分析路径[api] provider taotoken base_url https://taotoken.net/api api_key_env TAOTOKEN_API_KEY default_model gpt-4o timeout_seconds 120 [analysis] codex_output_dir /data/codex/mouse_spleen/processed segmentation_method watershed neighborhood_radius_um 30 min_cells_per_roi 500 qc_threshold 0.85 [qc] background_cutoff 0.15 signal_to_noise_min 3.0 saturation_max 0.05这个TOML文件放在你的分析项目根目录Python脚本用tomllib读取。qc_threshold设0.85意味着每个ROI至少85%的细胞通过质控才纳入下游分析。background_cutoff和signal_to_noise_min是去卷积后过滤低质量信号的关键参数脾脏组织自发荧光强这两个值要调紧一点。4. 验证请求与成功结果脾脏和脑组织跑通配置写好后先跑一个最小验证请求确认TaoToken Key能通再跑CODEX数据质控。验证请求用curl最直接curl -X POST https://taotoken.net/api/v1/chat/completions \ -H Authorization: Bearer $TAOTOKEN_API_KEY \ -H Content-Type: application/json \ -d { model: gpt-4o, messages: [ {role: user, content: CODEX数据中细胞邻域分析的最小输入矩阵应该包含哪些列} ], temperature: 0.2 }成功的话你会看到JSON返回choices数组里有content字段。如果返回401说明Key没设对或环境变量没生效如果返回model not found说明model ID写错了去模型对话页面查可用ID。接下来跑脾脏CODEX数据的质控脚本。假设你已经用PCF仪器成像得到了一组TIFF和对应的条形码映射表质控的核心是去卷积、背景扣除、细胞分割、信号归一化。以下是一个可运行的Python片段import os import numpy as np import pandas as pd from skimage import io, filters, measure from scipy import ndimage # 读取一个ROI的成像数据 roi_path /data/codex/mouse_spleen/raw/roi_01.tiff img io.imread(roi_path) print(f图像尺寸: {img.shape}, 数据类型: {img.dtype}) # 背景扣除用高斯模糊估计背景 background filters.gaussian(img, sigma10) corrected img.astype(float) - background corrected[corrected 0] 0 # 信号归一化到0-1 corrected corrected / corrected.max() # 简单阈值分割细胞核DAPI通道假设为最后一维 dapi corrected[..., -1] thresh filters.threshold_otsu(dapi) nuclei_mask dapi thresh # 标记连通区域 labeled, num_cells ndimage.label(nuclei_mask) print(f检测到细胞数: {num_cells}) # 计算每个细胞的平均信号强度 props measure.regionprops(labeled, intensity_imagecorrected[..., 0]) cell_signals [p.mean_intensity for p in props] print(fCD45平均信号: {np.mean(cell_signals):.4f}) print(f信号标准差: {np.std(cell_signals):.4f})跑通后你应该看到类似输出图像尺寸(2048, 2048, 24)检测到细胞数8000-15000取决于脾脏切片区域CD45平均信号在0.3-0.6之间。如果细胞数低于500说明切片太薄或DAPI染色不够如果信号标准差超过0.3说明背景扣除不干净回去调background_cutoff。脑组织的验证动作清单稍有不同。脑组织自发荧光更强尤其是髓鞘区域所以QC阈值要更严。建议先跑一个18-plex的脑panel包含NeuN、GFAP、Iba1、MBP、CD68、CD45、CD31、Podoplanin、Ki67、PD-1、CD4、CD8、B220、CD11c、MHCII、Vimentin、Collagen IV、DAPI。验证时重点看皮层、海马、胼胝体三个区域的细胞邻域是否分得开。如果胼胝体区域的MBP信号和GFAP信号混在一起说明光谱拆分没做好需要重新检查条形码分配。脾脏验证清单白髓滤泡B220IgD细胞是否形成圆形聚集边缘区CD21CD35细胞是否呈环状包绕滤泡红髓F4/80CD169巨噬细胞是否散在分布T细胞区CD3eCD4和CD3eCD8是否分群增殖区Ki67细胞是否集中在生发中心脑组织验证清单皮层NeuN神经元是否分层排列海马GFAP星形胶质细胞是否在齿状回密集胼胝体MBP髓鞘是否呈束状血管CD31内皮细胞是否形成管腔小胶质细胞Iba1CD68是否在损伤区聚集5. 本篇常见错排查401、local proxy failed、reading choices、OAuth跑PCF和TaoToken接入时报错集中在几个地方。我按真实遇到的顺序列出来你对照着查。401 Unauthorized最常见。原因通常是环境变量没生效、Key复制时带了空格、或者Key被撤销。排查步骤先echo $TAOTOKEN_API_KEY看有没有值再检查Key前后有没有换行符。如果用的是Claude Code检查settings里的Base URL是不是https://taotoken.net/apiModel ID是不是文档里列出的。401不会因为模型选错而出现模型错会报404或model not found。local proxy failed这个报错通常出现在你本地设置了HTTP_PROXY或HTTPS_PROXY环境变量但代理不可达。TaoToken接入不需要代理直接连就行。排查unset HTTP_PROXY和HTTPS_PROXY或者检查你的shell配置文件里有没有残留的代理设置。如果你在公司内网确认防火墙放行了taotoken.net的443端口。reading choices 报错Python脚本里response.choices[0]报IndexError或KeyError。原因一般是API返回了错误结构比如{error: {message: ...}}没有choices字段。排查先print(response)看完整返回如果是错误信息按message内容处理。常见的是model ID写错、messages格式不对、或者temperature超出范围。另外注意有些模型不支持system role把system改成user。OAuth 报错如果你用Claude Code的OAuth登录方式报OAuth相关错误说明你走了交互式登录而不是API Key方式。TaoToken接入用API Key不需要OAuth。排查检查Claude Code配置里是不是填了API Key而不是走OAuth流程。如果同时配了OAuth和API Key优先走API Key。Claude Code Anthropic配置页面有完整的Base URL、Key、Model ID三件套说明照着填。CODEX数据质控报错如果细胞分割后细胞数异常少检查切片厚度。PCF推荐7-10微米太薄信号弱太厚背景高。如果背景扣除后信号全黑检查background_cutoff是不是设太高了脾脏组织从0.15开始调脑组织从0.10开始。如果邻域分析报内存不足把neighborhood_radius_um从30降到20或者分ROI批处理。抗体panel信号串扰如果两个不同通道的抗体在同一个细胞上出现共定位但生物学上不应该检查条形码分配。同一荧光通道的抗体不能同时高表达。解决办法把其中一个抗体换到另一个通道或者降低抗体浓度。TaoToken返回超时timeout_seconds设120一般够用但如果你的prompt特别长比如整篇文献摘要调到300。如果还是超时把prompt拆成多轮对话。6. 语义一致CTA从脾脏到脑组织把管线跑顺PCF空间单细胞蛋白组在小鼠模型里的应用从2018年脾脏24-plex到现在骨髓54-plex核心变化不是抗体数量而是分析管线从描述性走向功能干预。你搭管线时先把一个组织跑通再扩展到其他组织。脾脏是最好的起点因为免疫细胞类型清楚、空间结构经典、文献对照多。脑组织难度高一些但验证清单跑完你就有了跨组织的能力。TaoToken在这个流程里的作用是统一Key管理让你在写分析脚本、查文档、生成报告时不用来回切换配置。API Keys页面创建Key接入文档看Base URL和Model ID的对应关系模型对话页面测试模型可用性Coding Plan适合长期跑批量分析任务。Claude Code用户直接看Claude Code Anthropic配置页三件套填好就能用。最后给一个实用技巧把本文的JSON panel模板和TOML settings片段存到你的项目仓库里每次新组织先复制一份改抗体列表。QC阈值不要照搬脾脏和脑组织差很多先跑一个ROI看信号分布再定。细胞邻域半径从30微米开始试脾脏滤泡约100-200微米脑皮层神经元约20-50微米按组织调整。跑通之后你手里的数据就不只是图像而是可量化、可统计、可功能验证的空间单细胞图谱。