讯飞星辰 MaaS 白嫖GLM5 踩坑记录

2026-02-14 17:32:25 1点赞 5收藏 5评论

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

讯飞星辰 MaaS 白嫖GLM5 踩坑记录

背景

讯飞星辰 MaaS 提供了 OpenAI 兼容协议的 HTTP 推理服务,理论上用 openai SDK 就能直接调用。我的目标是:

  1. 用 Python 跑通讯飞 GLM-5 的全部能力(对话、流式、JSON Mode、Function Calling)

  2. 接入 NewAPI 做统一的模型网关管理

看起来很简单,实际上连着踩了三个坑。

讯飞星辰 MaaS 白嫖GLM5 踩坑记录

坑一: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 模型的流式输出分两个阶段

  1. 思考阶段:内容在 reasoning_content 字段里,content 为空字符串

  2. 回答阶段:内容在 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)

讯飞星辰 MaaS 白嫖GLM5 踩坑记录

坑三: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 签名对不上。

讯飞星辰 MaaS 白嫖GLM5 踩坑记录

解决方案

纯 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,签名校验通过。

讯飞星辰 MaaS 白嫖GLM5 踩坑记录
展开 收起
5评论

  • 精彩
  • 最新
  • 想请教下大佬,在配置项值时,new-api那侧应该选什么类型?我尝试了openai 和自定义均没有成功

    校验提示文案

    提交
    openai

    校验提示文案

    提交
    错误:模型 : invalid character '

    校验提示文案

    提交
    还有2条回复
    收起所有回复
提示信息

取消
确认
评论举报

相关文章推荐

更多精彩文章
更多精彩文章
最新文章 热门文章
5
扫一下,分享更方便,购买更轻松