提供 Http 流式输出能力
响应式接口有个重要的特性:提供 Http 流式输出能力。尤其是在 ai 流行的今天,前端逐字打印的效果。
流式输出需要两个条件:多出接口 和 支持流的 mime 申明。以下与 solon-ai 联合展示效果:
1、输出 sse(Server Sent Event)
输出的格式:以 sse 消息块为单位,以"空行"为识别间隔。
示例代码:
@Produces(MimeType.TEXT_EVENT_STREAM_UTF8_VALUE)
@Mapping("case1")
public Flux<SseEvent> case1(String prompt) throws IOException {
return Flux.from(chatModel.prompt(prompt).stream())
.map(resp -> resp.getMessage())
.map(msg -> new SseEvent().data(msg.getContent()));
}
输出效果如下(sse 消息块有多个属性,data 为必选,其它为可选):
data:{"role":"ASSISTANT","content":"xxx"}
data:{"role":"ASSISTANT","content":"yyy"}
2、输出 ndjosn(Newline-Delimited JSON))
输出的格式:以 json 消息块为单位,以"换行符"为识别间隔。
@Produces(MimeType.APPLICATION_X_NDJSON_UTF8_VALUE)
@Mapping("case2")
public Flux<AssistantMessage> case2(String prompt) throws IOException {
return Flux.from(chatModel.prompt(prompt).stream())
.map(resp -> resp.getMessage());
}
输出效果如下:
{"role":"ASSISTANT","content":"xxx"}
{"role":"ASSISTANT","content":"yyy"}