Solon v3.2.0

提供 Http 流式输出能力

</> markdown

响应式接口有个重要的特性:提供 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"}