1. 飞书机器人点单链路里,Base URL 到底卡在哪
先说清楚这篇要解决的具体问题:你在飞书里挂了一个 AI 助手(我用的是 x-cmd 生态里的 x claw),想让它帮你点一杯瑞幸生椰拿铁,结果发现技能装上了、授权也做了,但 AI 一到「理解你的自然语言 → 调用点单技能」这一步就开始装傻,要么答非所问,要么直接说无法调用工具。
这个现象在飞书机器人接入第三方 AI 能力时非常典型。飞书本身只负责消息通道,真正干活的是背后那个大模型。而 x-cmd 侧的技能注册,本质上是把「点单」这个动作包装成一个可被模型调用的 function。模型能不能正确识别并触发这个 function,取决于两件事:一是模型本身有没有足够的工具调用(tool calling)能力,二是你给模型配的 Base URL 和 Key 是不是指向了一个支持 function calling 的接口。
很多人卡在第二步。默认情况下,x-cmd 里的 AI 助手可能连的是某个公共端点,或者你之前随手填的一个地址。这个地址如果不支持 OpenAI 兼容的 tools 参数,模型就收不到技能描述,自然也不会去调用。表现出来就是:你问「帮我点一杯生椰拿铁」,它回你「好的,生椰拿铁是瑞幸的招牌饮品」——它在聊天,但没在下单。
所以这篇的核心动作就一个:把飞书 AI 助手的 Base URL 改到 TaoToken,让模型走一个稳定支持工具调用的通道,然后把瑞幸点单技能注册进去,最后用一次真实下单请求验证整条链路。
适合谁看:已经在飞书里跑着 x-cmd AI 助手、想接点单类技能但被配置卡住的人;或者你还没装助手,想从零走一遍「飞书 + x-cmd + TaoToken + 瑞幸技能」的完整流程,也可以照着做。全程不需要你懂模型底层,只要会改配置文件、会发消息就行。
我试过把 Base URL 从默认地址切到 TaoToken 之后,同样的技能包,模型从「只会聊」变成「会调工具」,下单请求一次就通了。下面把每一步拆开讲。
2. TaoToken 前置:Key、Base URL 与 x-cmd 的对接位置
在改配置之前,先把 TaoToken 这边的东西准备好。你需要两样:一个 API Key,和一个 Base URL。
API Key 去 TaoToken 控制台创建,地址是 https://taotoken.net/api-keys 。创建的时候给它起个能认出来的名字,比如feishu-luckin,方便以后排查。创建完立刻复制,页面刷新后就看不到了。
Base URL 用 https://taotoken.net/api ,注意这里不要加任何多余的路径后缀。很多 OpenAI 兼容客户端会自动在末尾拼/v1/chat/completions,你如果手动写成https://taotoken.net/api/v1,反而会拼成/api/v1/v1/...,直接 404。这一点在 x-cmd 的配置里尤其容易踩,因为 x-cmd 的 AI 模块对 base_url 的处理是「原样拼接」。
接下来是 x-cmd 侧的对接位置。x-cmd 的 AI 助手配置通常落在用户目录下的配置文件中,具体路径取决于你的安装方式。如果你用的是 x-cmd 的默认安装,AI 相关配置一般在~/.x-cmd/ai/下面,或者通过x ai子命令管理。你可以先跑一句:
x ai config list看看当前生效的配置项。如果输出里能看到base_url和api_key字段,说明配置已经存在,你只需要改值。如果什么都没有,说明还没初始化,需要先建。
这里有个关键点:x-cmd 的技能注册和模型配置是分开的两层。模型配置决定「用哪个大脑」,技能注册决定「大脑会哪些动作」。Base URL 改错,大脑就收不到技能清单;技能没注册,大脑就算再聪明也不知道有点单这回事。所以顺序是先配模型,再注册技能。
TaoToken 这边支持 OpenAI 兼容的接口格式,包括tools和tool_choice参数,这是点单技能能被调用的前提。你不需要额外开什么开关,只要 Key 有效、Base URL 正确,模型侧就具备工具调用能力。
另外提醒一句:不要把 Key 硬编码在会提交到 git 的文件里。x-cmd 的配置如果放在项目目录下,记得加进.gitignore。我一般直接放在用户级配置里,跟项目隔离。
准备好 Key 和 Base URL 之后,就可以进下一步改配置了。
3. 可复制配置:Base URL、Key 与技能注册片段
这一节给可直接复制的配置片段。分两块:模型接入配置,和瑞幸点单技能注册。
先说模型接入。x-cmd 的 AI 配置支持 JSON 格式,你可以直接编辑配置文件,也可以用命令行写入。推荐直接改文件,因为字段多,命令行容易漏。
配置文件路径(默认安装):
~/.x-cmd/ai/config.json如果文件不存在,先创建目录:
mkdir -p ~/.x-cmd/ai然后写入以下 JSON。把sk-你的TaoTokenKey替换成你在控制台创建的那个 Key:
{ "default_provider": "taotoken", "providers": { "taotoken": { "base_url": "https://taotoken.net/api", "api_key": "sk-你的TaoTokenKey", "model": "claude-sonnet-4-20250514", "timeout": 60, "max_tokens": 4096 } }, "features": { "tool_calling": true, "stream": true } }几个字段说明。base_url就是 https://taotoken.net/api ,不要加/v1。model填你实际要用的模型 ID,TaoToken 支持的模型列表可以在模型对话页面查,地址是 https://taotoken.net/models 。tool_calling必须为true,否则技能不会被触发。stream开着体验更好,飞书里回复是逐字出来的。
如果你更习惯用 TOML,x-cmd 也认。等价写法:
default_provider = "taotoken" [providers.taotoken] base_url = "https://taotoken.net/api" api_key = "sk-你的TaoTokenKey" model = "claude-sonnet-4-20250514" timeout = 60 max_tokens = 4096 [features] tool_calling = true stream = true改完保存,跑一句验证配置是否被读到:
x ai config get providers.taotoken.base_url正常应该输出https://taotoken.net/api。如果输出为空或者报错,说明文件路径不对,检查一下是不是写到了别的目录。
接下来是瑞幸点单技能注册。技能包本身是一个 zip,x-cmd 支持通过 URL 直接安装。在飞书对话里给 AI 助手发这句话:
请下载安装 My Coffee Skill:https://unpkg.luckincoffeecdn.com/@luckin/my-coffee-skill@latest/dist/my-coffee-skill.zip发完之后,助手会去拉取技能包并注册。注册成功后,它会返回一个技能列表,里面应该能看到my-coffee-skill相关的条目。如果没看到,说明技能包没装上,检查网络能不能访问那个 unpkg 地址。
技能注册完之后,还需要授权。这一步 AI 代替不了你,得自己去瑞幸咖啡 AI 开发平台登录账号,创建一个授权 token,然后把 token 发给助手。发的时候直接说「这是我的瑞幸授权 token:xxx」就行。助手会把它存到本地凭证里,后续调用点单技能时自动带上。
到这里,模型配置和技能注册都完成了。三件套齐了:Base URL 是 https://taotoken.net/api ,Key 是你在 TaoToken 控制台创建的那个,Model ID 是你选的模型。缺任何一个,点单链路都跑不通。
4. 验证请求:一次真实下单与返回校验
配置改完,别急着直接下单,先做一次轻量验证,确认模型能正确调用技能。
第一步,在飞书里问助手一个需要调用技能才能回答的问题:
帮我看看附近有哪些瑞幸门店在营业如果模型配置正确、技能注册成功,它会调用my-coffee-skill里的门店查询动作,返回一个门店列表。返回内容里应该包含门店名称、距离、营业状态。如果它只是泛泛地回答「瑞幸门店很多,你可以打开 App 查看」,说明技能没被触发,回到上一节检查tool_calling是否为true,以及 Base URL 是否写成了带/v1的版本。
第二步,选一家门店,发起真实下单请求。我当时的对话是这样的:
选第一家店,来一杯生椰拿铁,大杯,冰,默认糖度助手会做几件事:确认门店、确认饮品规格、查你账户里的优惠券、算出实付价格。我那次它返回的是原价 ¥20,自动用了一张 ¥9.1 的券,实付 ¥10.9。这个价格是它从瑞幸官方系统查的,不是编的。
确认无误后,它会生成一个支付二维码链接。点开链接,用微信扫码付款。付款完成后,问助手要取餐码:
取餐码出来了吗它返回取餐码,我那次是「844」。到店报码取餐,全程没打开瑞幸 App 或小程序。
这里给一个校验返回是否正常的判断标准。正常的点单返回应该包含这几个字段:门店 ID、饮品 SKU、规格(杯型/冰量/糖度)、优惠券抵扣金额、实付金额、支付链接。如果返回里缺了支付链接,或者金额明显不对(比如原价没抵扣),说明技能调用链路上某一环出了问题,优先查授权 token 是否过期。
如果你想在命令行侧也验证一次模型连通性,可以跑:
x ai chat --provider taotoken --message "你好,测试连通"正常会返回一句回复。如果报 401,说明 Key 不对;如果报连接超时,说明 Base URL 或网络有问题。这一步能把「模型通不通」和「技能灵不灵」分开定位。
5. 常见报错排查:401、local proxy failed 与 choices 为空
这一节列几个真实会撞上的报错,以及对应的修法。
401 Unauthorized。最常见。原因通常是 Key 写错、Key 过期、或者 Key 前面多了空格。检查~/.x-cmd/ai/config.json里的api_key字段,确认是完整的sk-开头字符串,没有换行、没有引号嵌套错误。如果 Key 是从网页复制的,注意别把前后的空白也带进去。改完跑x ai chat --provider taotoken --message "test"验证。
local proxy failed / connection refused。这个报错说明 x-cmd 尝试走本地代理但没连上。检查你的环境变量里有没有HTTP_PROXY或HTTPS_PROXY指向一个已经关掉的本地端口。如果有,临时 unset 掉:
unset HTTP_PROXY HTTPS_PROXY然后重试。另外确认base_url是https://taotoken.net/api,不是http://,也不是带端口号的地址。
reading choices: unexpected end of JSON input。这个报错通常出现在流式响应被中断的时候。原因可能是stream开着但网络不稳,或者max_tokens设得太小导致返回被截断。先把stream改成false试一次,如果能通,说明是流式解析的问题。再把max_tokens调到 4096 以上。如果还不行,检查模型 ID 是否拼写正确,错误的模型 ID 有时会返回空响应体,解析时就报这个错。
OAuth / 授权相关报错。如果点单技能调用时返回授权失败,说明瑞幸的授权 token 过期或没存上。重新去瑞幸 AI 开发平台生成一个 token,发给助手。发的时候明确说「更新瑞幸授权 token」,让它覆盖旧的。别只发一串字符,模型可能不知道那是干什么的。
技能列表为空。装完技能包后问助手「你有哪些技能」,如果列表里没有 coffee 相关的,说明技能包没注册成功。重新发一次安装指令,注意 URL 要完整。如果 unpkg 地址访问不了,可以先把 zip 下载到本地,再用本地路径安装。
排查的时候有个通用思路:先确认模型通不通(跑一句普通对话),再确认技能在不在(问技能列表),最后确认授权有没有(查 token)。三层分开测,比一股脑改配置快得多。
6. 把链路固定下来:后续维护与扩展
配置跑通之后,有几件事值得做,能让这条链路长期稳定。
第一,把配置文件备份一份。~/.x-cmd/ai/config.json里存着 Base URL 和 Key,换机器或者重装的时候直接拷过去就行。但注意别把备份传到公开仓库。
第二,Key 轮换。TaoToken 控制台可以创建多个 Key,建议给飞书助手单独一个 Key,跟其他用途隔离。这样万一某个 Key 泄露,只吊销那一个,不影响别的。轮换的时候改配置文件里的api_key字段,重启一下 x-cmd 的 AI 服务即可。
第三,技能扩展。瑞幸点单技能只是其中一个。x-cmd 的技能机制是通用的,你可以按同样的方式装其他技能包。装的时候注意技能之间的命名别冲突,Base URL 和 Key 是全局的,不用每个技能单独配。
第四,模型切换。如果你想让点单用响应快的模型、写代码用能力强的模型,可以在配置里加多个 provider,然后在对话时指定。比如:
{ "providers": { "taotoken-fast": { "base_url": "https://taotoken.net/api", "api_key": "sk-你的Key", "model": "claude-haiku-4-20250514" }, "taotoken-strong": { "base_url": "https://taotoken.net/api", "api_key": "sk-你的Key", "model": "claude-sonnet-4-20250514" } } }点单这种轻量任务用 fast,复杂推理用 strong。切换的时候在消息里带上 provider 名就行。
如果你还没开始配,建议先去 https://taotoken.net/api-keys 把 Key 建好,然后照着第 3 节的 JSON 改配置。改完用第 4 节的验证步骤跑一遍,确认模型能调技能。遇到报错就翻第 5 节,按 401、proxy、choices 这几类对号入座。
整条链路的核心其实就一句话:Base URL 指向 https://taotoken.net/api ,Key 用 TaoToken 控制台创建的,Model ID 填对,技能就能被正确调用。剩下的就是照着对话走一遍,取餐码到手。