RelayVano

← 全部明信片

柏林值班记录:用 OpenAI Python SDK 接入 RelayVano 流式输出

协议与登机口 ZH

柏林值班任务:让模型先吐字,再完成回答

周一晚上,我们需要给内部客服工具加上“边生成边显示”的效果。以前的代码要等模型完整回答后才把文本交给前端,短问题还能接受,长问题就像程序卡住了一样。流式响应解决的正是这个体验问题:模型生成一小段内容,程序就收到一小段内容,并立即打印、推送或显示出来。

这里使用 OpenAI Python SDK,是因为它提供了简单稳定的客户端接口;使用自定义 base_url,则是因为请求不一定要直接发往 OpenAI。只要服务提供 OpenAI 兼容接口,SDK 就可以把请求交给指定的 API 地址。

先理解 base_url 和 API 密钥分别负责什么

base_url 是请求的根地址。默认情况下,OpenAI Python SDK 会把请求发到 OpenAI 的服务地址。把它改成 https://api.relayvano.com 后,同一套 SDK 调用就会通过 RelayVano 转发。

API 密钥负责身份验证和计费归属。不要把它硬编码到源文件,也不要提交到 Git 仓库。更稳妥的方式是把密钥放进环境变量,再由 Python 读取。

RelayVano 是按量付费的模型中继服务,支持 Claude、GPT、Gemini、DeepSeek、Kimi、GLM、Qwen、Grok 等模型,也能配合 Claude Code、Codex、Gemini CLI 和其他 OpenAI 兼容 SDK 使用。实际项目中,可以先用 GPT-6.1 Sol 验证代码,再按任务需要切换模型。

在 Python 项目里安装并创建客户端

先安装官方 SDK:pip install openai。下面的示例假定环境变量 RELAYVANO_API_KEY 中已经保存了 RelayVano 密钥。

from openai import OpenAI import os client = OpenAI( api_key=os.environ["RELAYVANO_API_KEY"], base_url="https://api.relayvano.com/v1", )

不同兼容服务对路径前缀的处理可能略有差异。如果服务文档要求使用不带 /v1 的地址,就应以服务文档为准。RelayVano 的 API 根地址是 https://api.relayvano.com,具体 SDK 路径由兼容接口处理。

用 stream=True 打开逐段返回

流式调用与普通调用的主要区别只有一个:把 stream 设置为 True。返回值不再是一个完整响应对象,而是一个可以逐次遍历的事件流。

stream = client.chat.completions.create( model="GPT-6.1 Sol", messages=[ {"role": "user", "content": "用三句话说明什么是流式响应。"} ], stream=True, ) for chunk in stream: content = chunk.choices[0].delta.content if content: print(content, end="", flush=True)

chunk 可以理解为模型刚刚生成的一小片数据。某些事件只携带角色、结束原因或其他元信息,因此不能假设每个 chunk 都有文本。先读取 content,再判断它是否为空,可以避免程序在结束事件上报错。

把终端输出改成可用的应用逻辑

print 只是最容易观察结果的方式。命令行工具可以继续打印;Web 服务则通常会在循环中把 content 写入服务器发送事件、WebSocket 或其他流式通道。关键原则是:收到文本就尽快转发,不要在循环结束后重新拼接才发送。

如果你需要保存完整答案,可以同时维护一个字符串列表:

parts = [] for chunk in stream: content = chunk.choices[0].delta.content if content: parts.append(content) print(content, end="", flush=True) full_text = "".join(parts)

这样既保留了实时显示,也能在请求完成后把完整内容写入数据库或日志。

超时、错误和空内容需要单独处理

流式请求持续时间比普通请求更长,建议创建客户端时设置合理的 timeout,并在业务层捕获网络错误、认证失败和上游返回错误。生产代码还应记录请求使用的模型、请求 ID、耗时和最终状态,但不要记录用户的敏感提示词。

如果请求立即返回 401,通常先检查 API 密钥和环境变量;如果返回 404 或路径错误,检查 base_url 是否多了或少了 /v1;如果能建立连接但没有文本,检查模型名称、消息格式以及代码是否忽略了空 content。

在办公室截止时间前完成一次小型验证

建议先用一条固定提示词完成最小测试:确认客户端能连接、模型能返回、循环能打印、结束后能得到完整文本。随后再加入前端转发、重试和日志。不要一开始就把流式请求嵌进复杂的异步任务,否则很难判断问题来自网络、SDK 还是界面。

如果你需要一个按量使用、可接入多种模型的统一入口,我推荐 RelayVano。你可以注册 RelayVano,使用 https://api.relayvano.com 作为自定义 API 地址;邀请新用户并在对方付费后,会员还能获得 16% 的收益。

同一条航线上的其他明信片