现象
在 Cloudflare Workers 上部署后,GET /healthz 正常,但 POST /v1/chat/completions 稳定失败:
{"error":{"message":"请求上游失败","type":"upstream_error"}}
给 src/upstream/muc.ts 加日志后看到:上游 needle/chat/completions/stream 返回 HTTP 200,但响应体是
{"code":"9000","msg":"<服务端把中文替换成了问号>","data":null,"count":null}
且响应缺少 Chat-Question-Id 头,于是走进 throw new Error("上游响应缺少 Chat-Question-Id")。
定位
- CAS 登录本身正常,
fetchAccessToken 能拿到合法的 468 字符 JWT(exp 正常、aud 正常)。
- 带这个 JWT 请求
needle/chat → code 9000。
- 完全不带
Authorization / Cookie,只保留 Clientid: aipc_100050 头 → 仍然 code 9000。
- 同样这两种请求,改从普通 VPS / 校园网出口发 → 都正常,能拿到
Chat-Question-Id 和完整流式回答。
结论:so.muc.edu.cn 针对 Cloudflare 出口 IP 做了拦截(统一返回 9000),跟 token 无关。Workers 无法指定出口地址,所以这个仓库的一键部署目前整体不可用。
附带发现
学校已经把 needle/chat/completions/stream 对匿名开放了——只要带 Clientid: aipc_100050 头,不需要任何 CAS token 就能用 deepseek-v3-minda 做通用问答。
(网页版那些「自习室查询 / 课表 / 成绩」等校园服务智能体仍需要登录态 + extendParams.agentCode,走的是同一个端点。)
建议
- README 里补一条「Cloudflare 出口 IP 被上游拦截」的已知限制;
- 或者提供一个非 Cloudflare 的部署形态(普通 Node / Docker 常驻服务),在出口 IP 不受限的机器上就能正常用。
环境:wrangler 4.90.0,compatibility_date 2025-05-11,Workers 出口 SJC。
现象
在 Cloudflare Workers 上部署后,
GET /healthz正常,但POST /v1/chat/completions稳定失败:{"error":{"message":"请求上游失败","type":"upstream_error"}}给
src/upstream/muc.ts加日志后看到:上游needle/chat/completions/stream返回 HTTP 200,但响应体是{"code":"9000","msg":"<服务端把中文替换成了问号>","data":null,"count":null}且响应缺少
Chat-Question-Id头,于是走进throw new Error("上游响应缺少 Chat-Question-Id")。定位
fetchAccessToken能拿到合法的 468 字符 JWT(exp正常、aud正常)。needle/chat→code 9000。Authorization/Cookie,只保留Clientid: aipc_100050头 → 仍然code 9000。Chat-Question-Id和完整流式回答。结论:
so.muc.edu.cn针对 Cloudflare 出口 IP 做了拦截(统一返回 9000),跟 token 无关。Workers 无法指定出口地址,所以这个仓库的一键部署目前整体不可用。附带发现
学校已经把
needle/chat/completions/stream对匿名开放了——只要带Clientid: aipc_100050头,不需要任何 CAS token 就能用deepseek-v3-minda做通用问答。(网页版那些「自习室查询 / 课表 / 成绩」等校园服务智能体仍需要登录态 +
extendParams.agentCode,走的是同一个端点。)建议
环境:
wrangler4.90.0,compatibility_date2025-05-11,Workers 出口 SJC。