不写一行框架,纯 urllib 调通蓝耘元生代 MaaS:一次终端里的 API 深度实测
一、为什么写这篇
前几篇我们用蓝耘做过"每日新闻视频生成"和"字幕智能优化平台",都是靠 Web 框架(FastAPI/Vue3)把 API 包了一层。这次反过来——只用最原始的 HTTP 调用,看看蓝耘元生代 MaaS 这个平台的 API 到底有多"干净":
- 不需要装
openaiSDK - 不需要任何 Web 框架
- 只用 Python 内置的
urllib.request,30 行代码调通
这能最直接地验证两件事:
- OpenAI 兼容性:是否真的完全兼容 OpenAI 协议
- 错误处理规范度:出错时返回什么,能不能据此写健壮的客户端
二、API 端点一览
实测下来,蓝耘 MaaS 主要暴露 4 类核心接口:
| 端点 | 用途 | 协议 |
|---|---|---|
GET /v1/models | 列出所有可用模型 | OpenAI 兼容 |
POST /v1/chat/completions | 对话补全(含流式) | OpenAI 兼容 |
POST /v1/audio/speech | 语音合成 TTS | OpenAI 兼容 |
POST /v1/images/generations | 文生图 | OpenAI 兼容 |
POST /v1/video/generations | 文/图生视频 | OpenAI 兼容 |
统一走 HTTPS + Bearer Token,Base URL 是https://maas-api.lanyun.net/v1。
三、实战 1:列出所有模型
最基础的接口,先确认 API Key 有效,顺便看看平台上有哪些可用模型:
importjson,urllib.request URL="https://maas-api.lanyun.net/v1/models"KEY="sk-hfp6wgtzvwfw5wpoj36xcvxrmtokmbhrn7brbgll6bina7i6"req=urllib.request.Request(URL,headers={"Authorization":f"Bearer{KEY}"})withurllib.request.urlopen(req,timeout=30)asr:d=json.load(r)print(f"共{len(d['data'])}个模型")formind["data"]:print(f" [{m.get('model_type')}]{m['id']}")终端真实输出(PowerShell 原生截图):
实测发现平台共45 个模型,按model_type字段分三类:
- chat:25 个对话模型(DeepSeek-V4、Qwen3.8-Max、Kimi-K3、GLM-5.3、MiniMax-M3 等)
- 1002(视频生成):13 个(seedance-2.5、happyhorse-1.1、MiniMax-Hailuo 等)
- 1003(语音合成):6 个(speech-2.6-hd、speech-2.8-turbo 等)
注意:
model_type字段用的是数字编码而非字符串,这是蓝耘相对 OpenAI 协议的扩展字段。但不影响主体协议兼容性——id、object、owned_by都是标准的。
四、实战 2:调一次对话(同步)
选一个便宜又好用的模型deepseek-v4-flash,问一个具体问题,看响应结构和 token 用量:
importjson,time,urllib.request URL="https://maas-api.lanyun.net/v1/chat/completions"KEY="sk-hfp6wgtzvwfw5wpoj36xcvxrmtokmbhrn7brbgll6bina7i6"body={"model":"deepseek-v4-flash","messages":[{"role":"system","content":"你是一位资深 Python 工程师"},{"role":"user","content":"用一句话解释 Python 的 GIL,并给一个规避方案"},],"temperature":0.3,"max_tokens":2000,}t0=time.time()req=urllib.request.Request(URL,data=json.dumps(body).encode("utf-8"),headers={"Authorization":f"Bearer{KEY}","Content-Type":"application/json"},)withurllib.request.urlopen(req,timeout=60)asr:d=json.load(r)print(f"耗时:{time.time()-t0:.2f}s")print(d["choices"][0]["message"]["content"])终端真实输出:
关键观察:
- 响应耗时 7.44 秒——这是推理型模型的正常水平(deepseek-v4-flash 默认开启 reasoning)
- Token 用量非常清晰:
prompt_tokens=103, completion_tokens=142, total=245,其中reasoning_tokens=76 - 回答质量不错:“GIL 使 CPython 同一时刻只允许一个线程执行 Python 字节码…规避方案是改用多进程”——准确且直接
这里有个容易踩的坑:第一次我把max_tokens设为 200,结果返回的content是空字符串——因为推理模型的 reasoning_tokens 也算在 completion 里,200 个 token 全被"思考"消耗掉了,没剩下任何输出。建议推理型模型的max_tokens至少给 1500。
五、实战 3:流式输出(SSE)
聊天应用必须要流式,否则用户得干等 7 秒。蓝耘支持标准的stream: true,用 Server-Sent Events 返回:
body={"model":"deepseek-v4-flash","messages":[{"role":"user","content":"用三句话介绍蓝耘元生代 MaaS"}],"max_tokens":2000,"stream":True,}req=urllib.request.Request(URL,data=json.dumps(body).encode("utf-8"),headers={"Authorization":f"Bearer{KEY}","Content-Type":"application/json"})withurllib.request.urlopen(req,timeout=60)asr:forlineinr:line=line.decode("utf-8").strip()ifnotline.startswith("data: "):continuedata=line[6:]ifdata=="[DONE]":breakobj=json.loads(data)delta=obj["choices"][0]["delta"].get("content","")ifdelta:print(delta,end="",flush=True)终端真实输出(流式打字效果):
- 11 个 chunk 就返回完整内容,总耗时 3.60s(比同步快,因为不需要等所有 token 生成完才一次性返回)
- 完全兼容 OpenAI 的 SSE 格式:每行
data: {...},结束标记[DONE]
意味着你只要会写 OpenAI 的客户端,把base_url换成蓝耘的就能跑。
六、实战 4:语音合成(TTS)
Chat 模型玩腻了,试试 TTS。从模型列表里挑了speech-2.6-hd(MiniMax 出品):
URL="https://maas-api.lanyun.net/v1/audio/speech"body={"model":"speech-2.6-hd","input":"你好,这是蓝耘元生代 MaaS 平台的语音合成测试。","voice":"female-shaonv","output_format":"url",}# 注意:返回的是音频二进制,不是 JSON终端真实输出:
- 6 秒返回 68KB MP3(约 24 字文本),合成速度完全可用
- 音色很自然,不是机器人腔
踩坑记录:蓝耘 TTS 的参数名是output_format(值url或hex),不是 OpenAI 的response_format(值mp3/opus等)。一开始用 OpenAI 的参数会报 400:
minimax TTS error: 2013 - invalid params, param 'output_format' only supports 'hex' and 'url'这是 MiniMax 后端的原生参数透出来了,说明蓝耘这一层做了薄封装。对接时以蓝耘文档为准,不要照搬 OpenAI 的参数名。
七、实战 5:错误处理
一个 API 好不好用,30% 看正常路径,70% 看错误处理。我故意用错误的 API Key 调用:
观察:
- HTTP 状态码规范:401
- 错误体结构标准:
{"error": {"message": ..., "type": "new_api_error", "code": "invalid_api_key"}},跟 OpenAI 完全一致 - 带 request id(
20261007153510279790301V9fVO6La)——这对排查问题至关重要,提工单时直接甩这个 ID
除了 401,我还测试过这些场景:
| 场景 | HTTP | 错误码 | 处理建议 |
|---|---|---|---|
| API Key 错误 | 401 | invalid_api_key | 检查 Key |
| 模型不存在 | 400 | model_not_found | 调用/v1/models确认 |
| 余额不足 | 402 | insufficient_quota | 充值 |
| 参数错误 | 400 | bad_response | 检查参数名/类型 |
| 限流 | 429 | rate_limit_exceeded | 退避重试 |
写法上,标准的try/except urllib.error.HTTPError就能覆盖所有错误场景。
八、控制台顺手截一张
调用 API 之余,蓝耘的 Web 控制台本身也值得一说。模型广场按"文本生成/视频生成/语音生成"分类清晰,每个模型卡片上有标价:
像 seedance-2.5 文生视频只要 ¥0.40/次,Kimi-K3 输入 ¥0.02/千 token,DeepSeek-V4-Flash 这种推理模型更便宜。对开发者来说,能用一个 Key 调所有模型,不用每家都注册账号、付押金,本身就省了一大笔时间。
九、总结:这次纯 API 实测下来我的判断
优点:
- OpenAI 协议兼容度 95%+:
/v1/models、/v1/chat/completions、/v1/audio/speech全部对齐,主流参数(model/messages/temperature/max_tokens/stream)都能用,连错误响应结构都照搬 - 统一入口太省心:45 个模型一个 Key 全搞定,不用分别去 DeepSeek/阿里/月之暗面/MiniMax 注册
- 错误信息规范:每个错误都有 request id 和标准错误码,方便写重试逻辑
- Token 用量透明:每次响应都带完整 usage(含 reasoning_tokens 细分),方便做成本核算
需要注意:
- 参数名有少量魔改:TTS 是
output_format而非response_format,多模态视频接口参数也不完全照 OpenAI - 推理模型 max_tokens 要给足:建议 ≥1500,否则可能 content 为空
- model_type 用了数字编码:1002=视频、1003=音频,需要做一次映射
一句话总结:如果你已经熟悉 OpenAI API 的写法,把base_url换成https://maas-api.lanyun.net/v1、api_key换成蓝耘的,80% 的代码可以无缝迁移。剩下 20% 看一遍官方文档里对少量扩展参数的说明就够了。
对中小团队来说,蓝耘这种"统一网关 + 单 Key 通调"的 MaaS 模式,能省掉对接多家的工程量和账号管理成本——这可能比单模型本身的能力差异更有价值。