讯飞星辰 MaaS 白嫖GLM5 踩坑记录
最近发现讯飞星辰 MaaS 平台有免费的 GLM-5 大模型,尝试接入了自己的 NEW-api 分发平台踩了几个文档里不会告诉你的坑。本文记录完整的排障过程,希望帮后来人少走弯路。

背景
讯飞星辰 MaaS 提供了 OpenAI 兼容协议的 HTTP 推理服务,理论上用 openai SDK 就能直接调用。我的目标是:
用 Python 跑通讯飞 GLM-5 的全部能力(对话、流式、JSON Mode、Function Calling)
接入 NewAPI 做统一的模型网关管理
看起来很简单,实际上连着踩了三个坑。

坑一:HTTPS 请求超时 代理干扰
现象
按文档配好 API Key 和 Base URL,运行代码直接卡住不动,最终超时。
from openai import OpenAI
client = OpenAI(
api_key="your-api-key",
base_url="https://maas-api.cn-huabei-1.xf-yun.com/v2"
)
# 这行代码会一直卡住...
response = client.chat.completions.create(
model="xopglm5",
messages=[{"role": "user", "content": "你好"}],
)
排查过程
先确认 DNS 解析:
nslookup maas-api.cn-huabei-1.xf-yun.com
# 返回: 198.18.0.92
198.18.0.x 是 代理工具的虚拟 IP 段,说明流量被代理劫持了。
用 curl -v 进一步确认:
# 走代理 —— SSL 反复重协商后超时
curl -v --max-time 15 "https://maas-api.cn-huabei-1.xf-yun.com/v2/chat/completions" ...
# 输出: schannel: remote party requests renegotiation (×2)
# 输出: Operation timed out with 0 bytes received
# 绕过代理 —— 秒回
curl --noproxy "*" --max-time 15 "https://maas-api.cn-huabei-1.xf-yun.com/v2/chat/completions" ...
# 输出: {"id":"cht000bb4e9@...","choices":[...]}
根因是代理对讯飞的 HTTPS 连接做了 SSL 重协商,导致请求永远收不到响应。
解决方案
在代码开头清除代理环境变量:
import os
os.environ["NO_PROXY"] = "*"
os.environ["no_proxy"] = "*"
for key in ["HTTP_PROXY", "HTTPS_PROXY", "http_proxy", "https_proxy", "ALL_PROXY", "all_proxy"]:
os.environ.pop(key, None)
from openai import OpenAI
client = OpenAI(api_key="your-key", base_url="https://maas-api.cn-huabei-1.xf-yun.com/v2")
或者在规则中把 maas-api.cn-huabei-1.xf-yun.com 加入 DIRECT 直连列表。
国内 API 服务走代理反而出问题。遇到莫名超时,先查 DNS 是否被代理劫持。
坑二:流式输出为空 —— reasoning_content 隐藏字段
现象
非流式调用正常返回,但流式调用(stream=True)的内容始终为空:
********* 普通非流式调用 *********
--- 非流式输出 ---
你好!我是GLM,一个由Z.ai训练的大语言模型...
********* 普通流式调用 *********
--- 流式输出 ---
(空)
排查过程
打印流式 chunk 的原始结构,发现了端倪:
for chunk in response:
delta = chunk.choices[0].delta
print(delta.model_dump())
print(delta.model_extra)
输出:
{'content': '', 'role': 'assistant'}
{'reasoning_content': '让我想想如何回答这个问题...'}
{'content': '', 'role': None}
{'reasoning_content': '1加1等于2,这是基本的数学运算'}
{'content': '1 + 1 = 2', 'role': None}
{'reasoning_content': ''}
真相大白:GLM-5 模型的流式输出分两个阶段:
思考阶段:内容在
reasoning_content字段里,content为空字符串回答阶段:内容在
content字段里,reasoning_content为空
而示例代码只检查了 delta.content,思考阶段的 content 是 ""(空字符串,falsy),全部被跳过了。
解决方案
reasoning_content 是讯飞自定义字段,不在 OpenAI SDK 的标准 schema 中,需要从 model_extra 字典获取:
for chunk in response:
if not chunk.choices:
continue
delta = chunk.choices[0].delta
# 读取思考过程(讯飞自定义字段,在 model_extra 中)
extra = getattr(delta, 'model_extra', {}) or {}
reasoning = extra.get('reasoning_content', '') or ''
if reasoning:
print(reasoning, end="", flush=True)
# 读取最终回答(标准字段)
content = delta.content or ''
if content:
print(content, end="", flush=True)

坑三:NewAPI 接入报 HMAC 签名错误
现象
把讯飞渠道加到 NewAPI(统一模型网关),测试报错:
{
"error": "HMAC signature cannot be verified: enforced header 'host' not used for signature creation"
}
原因分析
讯飞 API 的鉴权机制会校验请求中的 Host 头。当请求直接发到讯飞时:
Host: maas-api.cn-huabei-1.xf-yun.com
但经过 NewAPI 转发后,Host 头变成了 NewAPI 自己的域名:
Host: your-newapi-domain.com
NewAPI 作为反向代理转发请求时,没有把 Host 头还原成讯飞 API 的域名,导致 HMAC 签名对不上。

解决方案
纯 Python 标准库写一个轻量代理,零依赖:
import http.server
import urllib.request
import ssl
LISTEN_PORT = 8686
TARGET_HOST = "maas-api.cn-huabei-1.xf-yun.com"
TARGET_BASE = f"https://{TARGET_HOST}"
ssl_ctx = ssl.create_default_context()
ssl_ctx.check_hostname = False
ssl_ctx.verify_mode = ssl.CERT_NONE
class ProxyHandler(http.server.BaseHTTPRequestHandler):
def do_POST(self):
content_len = int(self.headers.get("Content-Length", 0))
body = self.rfile.read(content_len)
target_url = TARGET_BASE + self.path
req = urllib.request.Request(target_url, data=body, method="POST")
for key, val in self.headers.items():
if key.lower() in ("host", "transfer-encoding"):
continue
req.add_header(key, val)
req.add_header("Host", TARGET_HOST)
try:
with urllib.request.urlopen(req, context=ssl_ctx, timeout=120) as resp:
self.send_response(resp.status)
for k, v in resp.getheaders():
if k.lower() not in ("transfer-encoding", "connection"):
self.send_header(k, v)
self.end_headers()
self.wfile.write(resp.read())
except urllib.error.HTTPError as e:
self.send_response(e.code)
self.end_headers()
self.wfile.write(e.read())
if __name__ == "__main__":
server = http.server.HTTPServer(("127.0.0.1", LISTEN_PORT), ProxyHandler)
print(f"讯飞代理已启动: http://127.0.0.1:{LISTEN_PORT}")
print(f"NewAPI 渠道 Base URL 填: http://127.0.0.1:{LISTEN_PORT}/v2")
server.serve_forever()
启动代理后,NewAPI 渠道配置改为:
配置项值Base URLhttp://127.0.0.1:8686/v2密钥讯飞 API Key(不变)模型xopglm5
请求链路变成:NewAPI → Python 代理(修正 Host)→ 讯飞 API,签名校验通过。

frostgod
校验提示文案
frostgod
校验提示文案