使用Server-Sent Events协议的方式访问在线服务
背景说明
Server-Sent Events(SSE)是一种服务器向客户端推送数据的技术,它是一种基于HTTP的推送技术,服务器可以向客户端推送事件。这种技术通常用于实现服务器向客户端单向推送实时数据,例如实时新闻更新、股票价格等。
SSE主要解决了客户端与服务器之间的单向实时通信需求(例如ChatGPT回答的流式输出),相较于WebSocket(双向实时),它更加轻量级且易于实现。
使用SSE协议访问在线服务有以下特点:
- 简单易用:SSE协议基于HTTP协议,实现简单,客户端无需复杂的配置或额外的库支持,可以通过普通的HTTP连接实现数据的实时推送。
- 自动重连:SSE支持自动重连机制,当连接中断时,客户端会自动尝试重新连接,确保数据推送的连续性。
- 单向通信:SSE是单向的,服务器可以向客户端发送事件,但客户端不能通过同一个连接向服务器发送数据。
- 资源占用低:SSE使用HTTP连接,相对于WebSocket等其他实时通信协议,资源占用较低,适合轻量级的实时数据推送场景。
前提条件
- 部署模型为在线服务的模型导入选择的镜像需支持SSE协议。
- 在线服务部署时在调用配置中服务协议需选择“HTTP”或“HTTPS”。
约束与限制
- SSE协议只支持部署在线服务。
- 只支持自定义镜像导入模型部署的在线服务。
- 调用API访问在线服务时,对预测请求体大小和预测时间有限制:
- 请求体的大小不超过服务运行配置中的请求大小限制,超过后请求会被拦截。
- 平台每次请求预测的时间不超过服务运行配置中的请求超时时间。
获取认证信息、预测文件的本地路径、在线服务的调用地址
- 认证信息
SSE协议本身不提供额外的认证方式,和HTTP请求方式一致。
根据服务部署时选择的认证方式获取认证信息。无认证方式无需获取认证信息。
本章节以Token认证为例,用户Token的获取请参见获取Token认证。获取Token认证时,由于ModelArts生成的在线服务API不支持domain范围的token,因此需获取使用范围为project的Token信息,即scope参数的取值为project。
- 在线服务的调用地址
在线服务的调用地址和输入参数信息,可以在控制台的“模型推理 > 在线推理”,单击指定在线服务,在“服务”页签的“调用信息”获取。
“调用URL”即在线服务的调用地址。当模型配置文件中apis定义了路径,调用地址后需拼接自定义路径。如:“{在线服务的调用地址}/v1/chat/completions”。
SSE调用在线服务
- 下载Postman软件并安装,您也可以直接在Chrome浏览器添加Postman扩展程序(也可使用其他支持发送post请求的软件)。Postman推荐使用8.11.1版本。
- 打开Postman,如图3所示。
图1 Postman界面

- 在Postman界面填写参数。
- 选择POST任务,将已获取的在线服务调用地址复制到POST后面的方框。地址后添加 /v1/sse 即可使用SSE进行访问。在header中添加认证信息,不同认证方式有不同header,跟https的推理服务相同。以Token认证为例:Headers页签的Key值填写为“X-Auth-Token”,Value值为用户Token。
正常情况下,可以观察到响应头Content-Type为text/event-stream;charset=UTF-8。
图2 参数填写
图3 响应头Content-Type
- 选择“raw”,选择JSON(application/json)类型,在下方文本框中填写请求体,请求体格式与内容与用户部署模型相关,平台不做任何处理。
图4 在线服务iam认证,文本请求示意图
请求体样例如下:
{ "model": "test", "messages": [ { "role": "user", "content": "你是谁?" } ], "max_tokens": 100, "top_k": -1, "top_p": 1, "temperature": 0, "ignore_eos": false, "stream": false }
- 选择POST任务,将已获取的在线服务调用地址复制到POST后面的方框。地址后添加 /v1/sse 即可使用SSE进行访问。在header中添加认证信息,不同认证方式有不同header,跟https的推理服务相同。以Token认证为例:Headers页签的Key值填写为“X-Auth-Token”,Value值为用户Token。
- 参数填写完成,单击“send”发送请求,结果会在“Response”下的对话框里显示。
预测结果样例如图8所示,具体返回内容与格式与用户部署模型相关。
图5 文本输入预测结果