装不上跑不通怎么办:起步排错
第一个请求跑不通,八成卡在三处:环境装错了 Python、Key 没配好、请求体不合规则。这节课把常见 TypeSafe 报错按「报错原文」逐个给原因和解法——先 60 秒速检,再对号入座。所有 Python 报错都在 typesafe-sdk v0.7.5、Python 3.12 上实际复现过。
学完你能做什么
- 用 3 条命令在 60 秒内定位环境、Key、网络哪一环出了问题
- 把 TypeSafe 报错对号入座:装在哪个环节、什么原因、怎么修
- 读懂 7 个 HTTP 状态码(400/401/413/415/422/429/529)各自在说什么
- 在代码里用
except TypeSafeAPIError打印status和request_id,给提问时带上证据 - 知道去哪求助:控制台、官方文档、GitHub Issues、Discord
你现在的困境
- pip 装完了,一运行就
ModuleNotFoundError——是没装上、用错 Python,还是装了个同名的错包? - Key 明明设置了,还是 401,来回重抄了三遍
- 报错信息是一坨 JSON,看不懂哪个字段才是问题所在
什么时候用这一招
当你需要:
而且不想:
- 报错就去论坛发帖等回复,60 秒速检能省掉大部分等待
- 分不清「代码错了」和「Key/额度/服务端的问题」,白改半天代码
🎒 开始前的准备
- 跑过 安装与第一个请求(卡住没关系,本课就是解卡的)
- 终端能用 Bash(macOS / Linux / Windows WSL——官方命令按这个环境写)
- 一个已登录 TypeSafe 控制台 的浏览器(Key 相关问题要回去看)
核心思路
先定位环节,再看报错。 一次 Jev 调用要过四关,每关的报错长得不一样:
| 关卡 | 检查什么 | 典型报错 |
|---|---|---|
| 1. 环境 | Python 版本、包装没装对 | ModuleNotFoundError |
| 2. 认证 | Key 有没有、对不对 | 401 / 403(直连没带认证头,实测)/ TypeSafeError(创建客户端就抛) |
| 3. 请求体 | JSON 规则、问题定义 | 400 / 422 |
| 4. 服务端 | 限流、过载 | 429 / 529 |
SDK 会把一部分错误拦在本地。 v0.7.1 起,无效 Key 在创建客户端时就抛 TypeSafeError,请求根本不发出去;问题定义缺 criteria 也是本地拦截。所以同样是 TypeSafeError,有的根本没到服务器——先分清「本地拦截」和「服务器返回」,排错方向完全不同。
状态码一览。 服务器返回的错误带标准 HTTP 状态码(docs/api/errors.md):
| 状态码 | 意思 | 一句话 |
|---|---|---|
400 Bad Request | 违反请求规则(UTF-8、嵌套层数、非有限数字、坏压缩体);max_tokens_exceeded = 超上下文 | 改请求体 |
401 Unauthorized | Key 缺失或无效 | 查 Key |
413 Payload Too Large | 请求体超 32 MiB | 减体积 |
415 Unsupported Media Type | Content-Encoding 不支持或压缩超一层 | 改压缩 |
422 Unprocessable Entity | 字段校验失败,body 指明字段 | 补字段 |
429 Too Many Requests | 超速率限制 | 退避重试 |
529 Overloaded | TypeSafe 临时过载 | 退避重试 |
💡 带上 request_id 去提问
SDK 的 API 错误对象有 request_id(来自 x-typesafe-request-id 响应头)。给官方反馈时带上它,对方能直接查到那次请求。Discord 社区入口:discord.gg/typesafe。
首次排查:60 秒速检
三条命令按顺序跑,依次验证包、Key、网络与认证,每条都标了预期输出。
# 1. 包装对了吗?——应该看到 0.7.5(或更高)
.venv/bin/python -c "import typesafe_sdk; print(typesafe_sdk.__version__)"
# 若报 ModuleNotFoundError:装的环境和跑的环境不是同一个,或装错了包(见下方排错)
# 2. Key 设置了吗?——应该看到完整 Key 字符串
echo "$TYPESAFE_API_KEY"
# 空的:export TYPESAFE_API_KEY="your-api-key" 再跑(新开终端要重新 export)
# 3. Key 真的有效吗?——应该看到 HTTP 401(说明网络通、你还没用真 Key)
curl --max-time 30 -s -w "\n%{http_code}\n" https://api.typesafe.ai/v1/models \
-H "Authorization: Bearer $TYPESAFE_API_KEY"
# 200 = 认证通过;401 = Key 无效(见下方排错)你应该看到:第 1 条打印版本号、第 2 条打印 Key、第 3 条返回 200(Key 有效时)或可辨认的状态码。哪条断了就从哪条修。
常见问题排查
环境与安装问题
"ModuleNotFoundError: No module named 'typesafe_sdk'"
原因:包装进了 .venv,但运行用的是系统 Python(或另一个环境)——两边的解释器不是同一个。另一种可能:pip install typesafe 装了个同名的错包(见下一节)。
解决:
- 始终用 venv 里的解释器运行(官方示例的写法):
.venv/bin/python route_ticket.py- 或者先激活环境再运行(通用 venv 用法):
source .venv/bin/activate
python route_ticket.py- 还不行就确认包真的装上了:重新执行
.venv/bin/pip install typesafe-sdk,看输出里Successfully installed。
你应该看到:三行输出 technical / 0.67 / 0.99(数值随版本变化,结构对即可)。
"ImportError: cannot import name 'TypeSafeClient' from 'typesafe'"
原因:pip install typesafe(少写 -sdk)不会报错——它装上的是同名的无关第三方库 typesafe 0.9.1("formal type asserting decorators",作者 Krister Hedfors,与 TypeSafe AI 没有任何关系),里面自然没有 TypeSafeClient。于是 from typesafe import TypeSafeClient 抛 ImportError;同一环境里 import typesafe_sdk 则抛上面的 ModuleNotFoundError。
解决:
- 卸载装错的包,装正确的包(安装名是连字符
typesafe-sdk):
.venv/bin/pip uninstall -y typesafe
.venv/bin/pip install typesafe-sdk- 验证 import(import 名是下划线
typesafe_sdk):
.venv/bin/python -c "from typesafe_sdk import TypeSafeClient; print('ok')"你应该看到:ok;pip 输出含 Successfully installed ... typesafe-sdk-0.7.5。
Python 版本低于 3.10
原因:官方 SDK 要求 Python 3.10 或更高(docs/introduction/quickstart.md:"Requires Python 3.10 or later",PyPI 元数据 requires-python = ">=3.10")。
解决:
- 查当前版本:
python3 --version- 版本低于 3.10:安装 3.10+ 后用它重建 venv(旧 venv 绑定旧解释器,必须重建):
python3.10 -m venv .venv # 或你装好的更高版本
.venv/bin/pip install typesafe-sdk你应该看到:.venv/bin/python --version 打印 Python 3.10 或更高。
"zstd compression requires Python 3.14+ or the typesafe-sdk[zstd] extra."
原因:你显式传了 compression='zstd',但 Python < 3.14 时 zstd 支持在可选 extra 里,默认安装不带。
解决(两个方案):
方案 1(装 extra,推荐):
.venv/bin/pip install "typesafe-sdk[zstd]"方案 2(关闭压缩):
client = TypeSafeClient(compression=False)⚠️ v0.7.5 默认开压缩
v0.7.5 起 SDK 默认用 zstd 压缩 ≥1 KiB 的请求体(官方 changelog 标注:非官方 API 可能不会立即支持)。官方要求「确保 zstd 可用」的命令是 uv add "typesafe-sdk[zstd]"。实测默认安装(不带 extra)在对象创建时不报错——压缩可用就用、不可用就不压缩,只有显式要求 zstd 才会抛这个错。
"ImportError: Using SOCKS proxy, but the 'socksio' package is not installed. Make sure to install httpx using pip install httpx[socks]."
原因:环境里配了 SOCKS 代理(代理环境变量),SDK 的 HTTP 层(httpx2)走 SOCKS 需要 socksio 包,默认安装不带——创建客户端时就抛这个错,请求发不出去。
解决:装上 socksio 再重建客户端:
.venv/bin/pip install socksio你应该看到:客户端创建成功(实测:装上 socksio 后,同样带着 SOCKS 代理,客户端正常创建)。报错信息里建议的 pip install httpx[socks] 是 httpx 系的通用提示;SDK 用的是 httpx2,直接装 socksio 就够。
pip 装不上 / 找不到包(网络类)
原因:官方文档未提供 TypeSafe 专用的安装失败方案;常见情况是到 PyPI 源站网络不通,或包名拼错装成了别的包(见上)。
解决:
- 先排除包名问题:正确命令是
pip install typesafe-sdk,装对时输出含Successfully installed ... typesafe-sdk-0.7.5。 - 网络问题按你的环境处理(代理、镜像源属通用 pip 知识,官方文档未给 TypeSafe 专用方案)。
- Python < 3.10 时 pip 可能直接拒绝安装(官方最低版本 3.10),先按上一条修版本。
认证与 Key 问题
"No API key was provided. Pass api_key or set the TYPESAFE_API_KEY environment variable."
原因:既没传 api_key 参数,也没设环境变量——SDK 在创建客户端时就拦下了。注意:显式传空 Key 不会回落到环境变量,api_key='' 等同没传。
解决:
- 环境变量方案(官方推荐,代码里不写密钥):
export TYPESAFE_API_KEY="your-api-key"- 或在代码里显式传参:
from typesafe_sdk import TypeSafeClient
client = TypeSafeClient(api_key="your-api-key")你应该看到:客户端创建成功,不再抛 TypeSafeError。
"Cannot authenticate with the server. Please check your API key and try again."
原因:HTTP 401——请求到了服务器,但 Key 无效。SDK 抛 TypeSafeAuthenticationError(str(e) 形如 POST https://api.typesafe.ai/v1/systemone: 401 Cannot authenticate... (request_id=req_...))。
解决:
- 回 控制台 Keys 页 重新复制一遍 Key(手抄容易错)。
- 重新设置并验证:
export TYPESAFE_API_KEY="<重新复制的Key>"
curl --max-time 30 -s -w "\n%{http_code}\n" https://api.typesafe.ai/v1/models \
-H "Authorization: Bearer $TYPESAFE_API_KEY"你应该看到:命令返回 200 和一个 JSON({"models":[...]},列出你的账号可用的模型与别名)。
"Must supply an API key! Check your request and try again."
原因:直连 HTTP(curl / fetch)时完全没带 Authorization 头——API 直接拒绝并返回 403(实测:不带任何认证头请求 /v1/models,得到 403 和这条消息;官方状态码表未列 403,SDK 侧对应的异常类是 TypeSafePermissionDeniedError)。SDK 用户一般碰不到:Key 配好时 SDK 自动带头。
解决:带上 Bearer 认证头再发:
curl --max-time 30 -s -w "\n%{http_code}\n" https://api.typesafe.ai/v1/models \
-H "Authorization: Bearer $TYPESAFE_API_KEY"你应该看到:Key 有效时返回 200 和 {"models":[...]};Key 无效时变成 401(见上一条)。
"API key must contain only printable ASCII characters without whitespace."
原因:Key 里有内部空格、控制字符或非 ASCII 字符(SDK 只剥首尾空白,内部的问题字符直接拒收)。
解决:重新完整复制 Key,不要拼接或手改。粘贴时注意别混入换行到中间。
请求体被拒(400 / 413 / 415 / 422)
"422 Unprocessable Entity"
原因:请求体字段校验失败——比如缺 state、字段格式不对。请求过了 SDK 的本地校验、发到服务器后,由服务器返回 422;响应 body 会指明字段:loc 是位置,msg 是原因(如 Field required)。
解决:
- 在代码里捕获
TypeSafeAPIError,打印完整 body 看字段(示例里的问题带了instructions,能通过本地校验、真正发到服务器):
from typesafe_sdk import Noul, TypeSafeClient, TypeSafeAPIError
with TypeSafeClient() as client:
try:
client.system_one("I was charged twice.", {
"billing": Noul(instructions="Is this about billing?")
})
except TypeSafeAPIError as error:
print(error.status) # 服务器返回的状态码;422 = 字段校验失败
print(error.body) # 422 时里边 loc/msg 指明哪个字段
print(error.request_id) # 反馈给官方时带上- 按
loc指出的字段补齐再发。
你应该看到:请求合法时正常返回结果;若服务器返回 422,error.body 里是形如 loc: ["body", "state"]、msg: "Field required" 的字段级提示(官方 OpenAPI 示例)。服务端 422 的具体触发形态取决于请求违反了哪条规则,以 body 实际返回为准。
💡 很多 422 根本到不了服务器
构造 Noul() 时少写 instructions,SDK 本地就抛 TypeSafeError: Noul question "q2" has neither instructions nor criteria; at least one is required.;Score/Choice 题缺 criteria 同样本地拦截:TypeSafeError: Question "broken" requires "criteria".(broken 处是你自己的问题键名)。这类抛的是 TypeSafeError 基类、不是 TypeSafeAPIError——改代码就行,不用怀疑网络。
"413 Payload Too Large"
原因:请求体超过 32 MiB(header 不算在内);压缩后的和解压后的都受这个限制。
解决:裁剪 state,或把大材料拆成多次请求。
"415 Unsupported Media Type"
原因:Content-Encoding 用了不支持的编码,或压缩叠了不止一层(gzip / x-gzip / zstd 各只能一层)。
解决:直连 HTTP 时只用一层压缩;SDK 用户一般碰不到(SDK 自己处理压缩)。
"max_tokens_exceeded"
原因:请求超过了模型的上下文限制——64k per-request(state + 所有问题)/ 32k per-question(state + 单个问题),都含 state。
解决(三个方案,按代价从低到高):
方案 1(裁剪材料,推荐):过滤 state,只发该题需要的字段——既省钱又提准。
方案 2(长上下文):给需要的请求加请求头(两个上下文都变 262k,更慢更不准,价格不变):
-H "TypeSafe-Danger-Zone-Long-Context: true"方案 3(减少问题数或拆请求):per-request 限制含所有问题,问题太多先拆。
限流与服务端问题
"429 Too Many Requests"
原因:超出了组织级速率限制(tokens/s + requests/s 双指标,按组织计)。
解决:
- 用 SDK(默认就带指数退避重试,并遵循
retry-after)——你什么都不用做:
from typesafe_sdk import RetryPolicy, TypeSafeClient
# 默认就是自动重试;按需自定义(默认 max_retries=2、退避 0.5→5s、总预算 30s)
client = TypeSafeClient(retry=RetryPolicy(max_retries=3))- 直连 HTTP 才要自己写指数退避,别立刻原样重发。
- 额度在 控制台 rate-limits 页 查;需要更高走 custom/enterprise(申请表 support.typesafe.ai/forms/rate-limit-increase-request)。
"529 Overloaded"
原因:TypeSafe 临时过载,和 429 一样属于「稍等再试」类。
解决:同 429——SDK 自动退避重试;直连自己写退避。持续出现就去 Discord 或状态页看看是不是大面积故障。
Agent Skill 相关问题
"The agent isn't using the skill"
原因:coding agent 没加载 TypeSafe skill——没点名调用、装错了 agent,或装完没重启。
解决(docs/agent-skill.md 官方三步):
- Claude Code 插件里直接调
/typesafe:typesafe-ai;其他 agent 在 prompt 里点名"use the TypeSafe skill"。 - 还不行:确认安装时选的就是你在用的这个 agent(
npx skills add默认装项目级,装全局加-g)。 - 重启 agent 再试。
"The agent invents request or response fields"
原因:skill 版本过期,教它的是旧接口。
解决:更新 skill 后重试(Claude Code):
claude plugin marketplace update typesafe-ai
claude plugin update typesafe@typesafe-ai然后重启 Claude Code 或运行 /reload-plugins。
还是不行?
先收集证据再提问。 一段能复现的最小代码 + 报错原文 + request_id,比一百句描述都管用:
# catch_report.py:复现问题并打印关键信息
from typesafe_sdk import Noul, TypeSafeClient, TypeSafeAPIError
with TypeSafeClient() as client:
try:
client.system_one("I was charged twice.", {
"billing": Noul(instructions="Is this about billing?")
})
except TypeSafeAPIError as error:
print("status:", error.status)
print("body:", error.body)
print("endpoint:", error.endpoint)
print("request_id:", error.request_id) # 提问必带
except Exception as error: # 本地拦截(Key/问题定义),没到服务器
print(type(error).__name__, str(error))需要更细的日志时,把 SDK 日志级别调高(认证头会脱敏,但请求/响应体不脱敏——注意别把敏感内容发到公开场合):
export TYPESAFE_LOG_LEVEL=debug去哪里问:
| 渠道 | 什么时候去 |
|---|---|
| 控制台 Keys / rate-limits 页 | Key 与额度类问题,先自查 |
| 官方报错文档 | 状态码语义与规则细节 |
| API 速查 | 本站:请求/响应/状态码速查 |
| GitHub Issues | SDK 缺陷(Python SDK 仓库) |
| Discord 社区 | 官方说「Tell us what you build, and what breaks」——坏了直接报 |
检查点 ✅
- 60 秒速检三条命令我都跑过,知道卡在哪一关
- 我能分清本地拦截的
TypeSafeError(Key、问题定义)和服务器返回的TypeSafeAPIError - 401 时我会回控制台重抄 Key,再用 curl
/v1/models验证 - 429/529 我知道 SDK 默认自动退避重试,不用自己写
- 提问时我会带上最小复现代码和
request_id
本课小结
✅ 排错先定环节:环境(Python/包)→ 认证(Key)→ 请求体(规则)→ 服务端(限流/过载)。
✅ 关键 TypeSafe 报错都过了:ModuleNotFoundError 用对解释器、401 重抄 Key、422 看 loc 字段、429/529 交给 SDK 默认重试。
✅ 提问姿势:最小复现 + 报错原文 + request_id,去 Discord 或 GitHub Issues。
关键事实回顾:
| 信号 | 在哪一层 | 第一步 |
|---|---|---|
ModuleNotFoundError | 环境 | 用 .venv/bin/python 运行 |
ImportError: cannot import name 'TypeSafeClient' from 'typesafe' | 环境(装错包) | 卸载 typesafe,改装 typesafe-sdk |
创建客户端抛 TypeSafeError | 认证(本地) | 补 TYPESAFE_API_KEY |
401 + TypeSafeAuthenticationError | 认证(服务器) | 回控制台重抄 Key |
422 | 请求体 | 看 body 的 loc/msg |
429 / 529 | 服务端 | 交给 SDK 重试;直连写退避 |
下一课预告
起步排错到此收工——你的环境已经稳了。下一步进入 日常使用:掌握 Jev 的五种提问方式。
你会学到:
- State 状态:给 Jev 什么样的材料
- Choice / Score / Noul 三种题型怎么选
- Confidence 置信度怎么用阈值做分支
- 图像怎么发进请求