报错是这么冒出来的。用自建 Langfuse 2.50 管理客服 prompt,把 production 标签从 v12 指回 v11,界面上标签已经变了,服务端拉到的还是 v12,重启服务也没变化,SDK 是 3.0 的 Python 包。
中间走过弯路,把「服务端按 name 取 prompt 时没带 label 参数」当成主因,改完现象没变。
原因不止一个,得分开看。标签变更与版本发布不是原子操作,中间有缓存窗口。也可能是SDK 本地缓存了 prompt 对象,默认 TTL 五分钟。
另外,自建实例的队列积压,标签更新还没被消费。
动手时先看 SDK 拿到的版本号
python -c "from langfuse import Langfuse;l=Langfuse();p=l.get_prompt('cs-intent',label='production');print(p.version)"
再往下确认服务端标签当前指向
curl -s "http://langfuse.local/api/public/v2/prompts/cs-intent" -H "Authorization: Bearer $PK" | jq '.labels'
禁用缓存后重新拉一次
python -c "print({'cache_ttl_seconds':0})"
剩下的就是在客户端打印 prompt 内容的前 40 字比对
python -c "print('compare v11 v12 text head')"
恢复的判定其实很直接。带 label 拉取的版本号与界面一致,重启后首次请求也不再出现旧版本,连续十次结果稳定。
容易忽略的是,标签回滚只改指针,不保证所有客户端立刻可见,回滚后要按实例逐个确认,而不是只看界面。这类问题最好一次改到位,反复小改反而容易把原因搅混。
