响应式接口有个重要的特性：提供 Http 流式输出能力。尤其是在 ai 流行的今天，前端逐字打印的效果。

流式输出需要两个条件：多出接口 和 支持流的 mime 声明。以下与 solon-ai 联合展示效果：



### 1、输出 sse（Server Sent Event）

输出的格式：以 sse 消息块为单位，以"空行"为识别间隔。

示例代码：

```java
@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、输出 ndjson（Newline-Delimited JSON)）

输出的格式：以 json 消息块为单位，以"换行符"为识别间隔。

```java
@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"}
```
