
1. 化学实验室机器人为什么需要一套统一术语如果你正在做自动化实验平台大概率遇到过这种场景化学家写了一句“把上清液转移到离心管”机械臂工程师听完一脸茫然——到底是用移液枪吸、还是直接倾倒转移过程中要不要夹持这些动作在实验方案里是一句话落到机器人执行层却是一堆参数和轨迹规划。问题不在于机器人不够强而在于我们缺少一套把“实验意图”翻译成“机器人动作”的中间语言。TARMAC 就是冲着这个缺口来的。它是约克大学团队提出的化学领域机器人操作分类体系核心思路是把实验室里常见的操作拆成可复用、可组合的“动作原语”再往上封装成“宏指令”。你可以把它理解成化学实验版的“乐高说明书”每个原语是一块积木宏是拼好的模块实验方案则是用这些模块搭出来的成品。它解决的不是某个具体硬件怎么控制而是“化学家说的动作”和“机器人能执行的动作”之间怎么对齐。这套体系对两类人特别有用。一类是自动化实验平台的开发者你手里可能有 Franka、UR 或者自研机械臂缺的是一套能跨设备复用的技能描述层另一类是 AI 工具集成者你在用大模型做任务规划需要把自然语言指令映射到结构化的机器人调用上。TARMAC 给出的四大类别——定位、耦合、搅动、工具操作——加上力依赖、间接控制、重复性三个特征维度正好能作为这套映射的骨架。我试过把类似的分类思路套到自己的流程里最直接的收益是以前每来一个新实验方案就要重新写一遍动作序列现在大部分步骤可以直接从原语库里拼。下面我会先讲清楚 TARMAC 的分类逻辑然后给你一份可复制的分类映射配置最后用 TaoToken 的统一 API 通道做一次工具侧接入验证让大模型能真正调用这些原语。2. TARMAC 分类体系拆解与 TaoToken 接入前置TARMAC 的分类不是拍脑袋分的它从教学实验室视频和实验手册里标注了大量演示动作然后用三个特征给每个动作打标签是否依赖力、是否涉及间接控制、是否通过重复性动作实现。这三个特征组合起来就把实验室操作聚成了四大类。定位类是不依赖力、直接控制、一次性完成的动作比如把烧杯放到指定位置、调整容器朝向。耦合类依赖力但非周期性典型的是夹持、释放、拧紧接头这类需要力反馈的一次性操作。搅动类以重复或周期性动作为特征搅拌、旋摇、研磨都归这里。工具操作类则是通过工具间接操纵物质比如用注射器喷射液体、用移液枪分液。这里有个容易困惑的点喷射既依赖力又涉及间接控制为什么归到工具操作而不是耦合因为它的定义性特征是“通过工具进行”力只是控制手段。同理间接的周期性动作比如用搅拌棒搅动归到搅动类。最后一行“间接依赖力周期性”的组合是空的因为实际标注中没观察到这类案例。要把这套分类落到代码里你需要一个能统一调用大模型和机器人工具的通道。TaoToken 在这里的角色是提供统一的 Key 和 API 入口让你不用为每个模型或工具单独配一套鉴权。前置准备很简单去官网注册后拿到 API Key然后在控制台确认你要用的模型 ID。Base URL 统一用https://taotoken.net/api这个地址不加 UTM 参数直接填到配置里就行。如果你用的是 Claude Code 或者 Cline 这类工具配置方式略有不同。Claude Code 需要在 settings 里指定 Base URL 和 KeyCline 的 MCP 配置则要写全三件套Base URL、API Key、Model ID。Codex 的 auth.json 也是类似逻辑。不管哪种工具核心都是让请求走 TaoToken 的统一通道这样你在做 TARMAC 原语注册和调用时鉴权部分只需要维护一份。3. 可复制的 TARMAC 分类映射配置这一节给你一份可以直接抄的配置。我把它分成两部分一部分是 TARMAC 分类到动作原语的映射表用 JSON 描述另一部分是 MCP 工具注册配置用 TOML 写。你可以根据自己的机器人平台调整参数但结构建议保持一致。先看分类映射。每个原语对应一个 TARMAC 类别并带上三个特征标签。这样大模型在规划时可以先判断动作属于哪一类再决定调用哪个原语。{ taxonomy_version: TARMAC-1.0, categories: { positioning: { description: 不依赖力、直接控制、一次性操作, features: { force_dependent: false, indirect: false, repetitive: false }, primitives: [move_to, place_container, orient_vessel] }, coupling: { description: 依赖力、直接控制、一次性固定或释放, features: { force_dependent: true, indirect: false, repetitive: false }, primitives: [grasp, release, tighten_joint] }, agitating: { description: 重复或周期性动作, features: { force_dependent: false, indirect: false, repetitive: true }, primitives: [stir, swirl, grind] }, tooling: { description: 通过工具间接操纵物质, features: { force_dependent: true, indirect: true, repetitive: false }, primitives: [pour, inject, pipette] } }, macros: { prepare_solution: { description: 制备溶液倾倒溶质后搅拌, sequence: [pour, stir], category_refs: [tooling, agitating] } } }这份 JSON 可以直接作为你项目里的tarmac_mapping.json。注意pour原语我放在 tooling 类下因为它通过容器间接转移物质stir和swirl放在 agitating 类。宏prepare_solution把倾倒和搅拌串起来对应论文里制备氯化钠溶液的流程。接下来是 MCP 工具注册配置。如果你用 Cline 或者支持 MCP 的客户端把下面这段写进配置文件。路径按你实际安装位置调整这里用占位符。[mcp_servers.tarmac_robot] command python args [-m, tarmac_mcp_server, --config, ./tarmac_mapping.json] env { TAOTOKEN_API_KEY 你的Key, TAOTOKEN_BASE_URL https://taotoken.net/api, TAOTOKEN_MODEL_ID gpt-4.1 } [mcp_servers.tarmac_robot.tools.pour] description 将液体或粉末从源烧杯转移到目标烧杯 parameters { source_id string, target_id string } [mcp_servers.tarmac_robot.tools.stir] description 使用指定搅拌工具搅动烧杯内物质 parameters { vessel_id string, tool_id string } [mcp_servers.tarmac_robot.tools.swirl] description 通过圆周运动旋摇烧杯内物质 parameters { vessel_id string }这里的关键是三件套必须写全Base URL 用https://taotoken.net/apiAPI Key 从控制台拿Model ID 填你实际要用的模型。如果你用 Claude Code配置在 settings 里对应字段如果用 Codex检查 auth.json 里的 base_url 和 api_key 是否指向 TaoToken。配置完成后MCP 服务器启动时会把 TARMAC 原语注册成可调用工具大模型就能通过标准接口触发这些动作。4. 验证请求与成功结果配置写好后先别急着接机械臂用一次纯文本请求验证通道是否打通。你可以用 curl 或者 Python 发一个请求让模型根据 TARMAC 分类选择原语。下面这个例子模拟“制备氯化钠溶液”的指令看模型能否正确输出原语序列。import requests import json url https://taotoken.net/api/v1/chat/completions headers { Authorization: Bearer 你的Key, Content-Type: application/json } payload { model: gpt-4.1, messages: [ { role: system, content: 你是一个化学实验室机器人规划器。可用原语pour(source_id, target_id), stir(vessel_id, tool_id), swirl(vessel_id)。请根据用户指令输出JSON格式的原语调用序列。 }, { role: user, content: 制备氯化钠溶液将氯化钠粉末从烧杯A倒入烧杯B的水中然后用玻璃棒搅拌。 } ], temperature: 0 } response requests.post(url, headersheaders, jsonpayload) result response.json() print(json.dumps(result[choices][0][message][content], ensure_asciiFalse, indent2))如果通道正常你会看到类似这样的返回{ plan: [ { primitive: pour, params: { source_id: beaker_A, target_id: beaker_B } }, { primitive: stir, params: { vessel_id: beaker_B, tool_id: glass_rod } } ], taxonomy_refs: [tooling, agitating] }这个结果说明三件事模型正确识别了“倒入”对应 tooling 类的 pour 原语“搅拌”对应 agitating 类的 stir 原语参数填充符合我们定义的签名taxonomy_refs 字段把调用映射回了 TARMAC 类别。你可以把这段返回直接喂给你的机器人执行层或者先做一次 dry run 检查轨迹规划。如果你用的是 Claude Code 做代码生成可以在对话里直接让它读取tarmac_mapping.json然后生成对应的 MCP 工具调用代码。实测下来只要 Base URL 和 Key 配对正确模型能稳定输出结构化的原语序列。验证通过后再把 MCP 服务器接到真实机械臂上先跑空动作确认调用链再逐步加负载。5. 本篇常见错误排查接入过程中最容易卡在鉴权和配置上。下面列几个真实报错和对应解法你遇到时可以直接对照。401 Unauthorized这个最常见九成是 Key 没填对或者 Base URL 写错了。检查你的请求头里Authorization是不是Bearer加 Key注意 Bearer 后面有个空格。Base URL 必须是https://taotoken.net/api不要多加/v1或者斜杠。如果你在 Cline 里配 MCP确认 env 里的TAOTOKEN_API_KEY没有多余引号。local proxy failed这个报错通常出现在你本地有代理设置但没生效或者 MCP 服务器启动时环境变量没传进去。先检查你的终端能不能直接 curl 通 TaoToken 的 API如果终端通但 MCP 不通大概率是 MCP 配置里的 env 没写全。把 Base URL、Key、Model ID 三件套都显式写进 env不要依赖全局环境变量。reading choices 报错这个一般发生在模型返回格式和你的解析代码不匹配时。比如你期望choices[0].message.content是 JSON但模型返回了带 markdown 代码块的文本。解法是在 system prompt 里明确要求“只输出 JSON不要加代码块标记”或者在解析前先做一次字符串清洗。另外确认你用的 Model ID 在 TaoToken 控制台里是启用的。OAuth 相关错误如果你用 Claude Code 并且看到 OAuth 报错说明它还在走默认的鉴权流程。你需要在 settings 里显式覆盖 Base URL 和 API Key让它走 TaoToken 通道。具体位置在 Claude Code 的配置文件里找到api_base和api_key字段分别填https://taotoken.net/api和你的 Key。改完后重启 Claude Code再跑一次验证请求。还有一个坑是 MCP 工具注册后模型不调用。这通常是因为工具描述写得太模糊或者参数 schema 不完整。确保每个原语的 description 里写清楚“做什么”和“什么时候用”参数类型和必填项都标明白。如果模型还是不用可以在 system prompt 里直接列出可用工具名给它一个明确的候选集。6. 把 TARMAC 原语接到你的工作流走到这里你已经有了分类映射、MCP 配置和验证通过的请求链路。接下来就是把它接到你自己的机器人流程里。我的建议是先从单个原语开始比如只注册pour让模型生成调用你的执行层收到后先做参数校验和轨迹预演确认无误再下发到真实机械臂。跑通一个之后再按 TARMAC 的类别逐步加原语每加一个就更新一次映射配置和 MCP 注册。如果你在做长周期的实验自动化可以考虑把常用的原语组合固化成宏。比如prepare_solution这种宏一旦验证稳定就可以在 MCP 服务器里注册成高层工具模型规划时直接调用宏减少每一步的决策开销。TaoToken 的 Coding Plan 适合这种需要长期迭代和 Agent 调用的场景你可以用它来管理多个模型和工具的接入不用每次换模型都重新配一遍鉴权。最后提醒一点TARMAC 的分类体系是描述性的不是规定性的。它不强制你的原语必须怎么实现运动规划、规则控制还是学习方法都行。关键是保持类别和特征标签的一致性这样你的原语库才能跨实验、跨设备复用。等你把常用操作都映射完会发现新实验方案的接入时间大幅缩短——以前要写几十行动作序列现在可能只需要在宏库里拼几个模块。