找回密码
 立即注册
首页 业界区 业界 Solon AI 开发学习6 - chat - 两种 http 流式输入输出 ...

Solon AI 开发学习6 - chat - 两种 http 流式输入输出

赫连如冰 2025-11-30 08:00:07
http 流式输出(主要是指文本流式输出),需要使用响应式接口和支持流输出的 mime 声明。常见的有两种文本流式输出:
1、输出 sse(Server Sent Event)

输出的格式:以 sse 消息块为单位,以"空行"为识别间隔。
示例代码:
  1. import org.noear.solon.annotation.Mapping;
  2. import org.noear.solon.annotation.Produces;
  3. import org.noear.solon.core.util.MimeType;
  4. import org.noear.solon.web.sse.SseEvent;
  5. import reactor.core.publisher.Flux;
  6. import java.io.IOException;
  7. @Produces(MimeType.TEXT_EVENT_STREAM_UTF8_VALUE)
  8. @Mapping("case1")
  9. public Flux<SseEvent> case1(String prompt) throws IOException {
  10.     return Flux.from(chatModel.prompt(prompt).stream())
  11.             .filter(resp -> resp.hasContent())
  12.             .map(resp -> new SseEvent().data(resp.getContent()));
  13. }
复制代码
输出效果如下(sse 消息块有多个属性,data 为必选,其它为可选):
  1. data:{"role":"ASSISTANT","content":"xxx"}
  2. data:{"role":"ASSISTANT","content":"yyy"}
复制代码
2、输出 ndjosn(Newline-Delimited JSON)

输出的格式:以 json 消息块为单位,以"换行符"为识别间隔。
  1. import org.noear.solon.ai.chat.message.AssistantMessage;
  2. import org.noear.solon.annotation.Mapping;
  3. import org.noear.solon.annotation.Produces;
  4. import org.noear.solon.core.util.MimeType;
  5. import reactor.core.publisher.Flux;
  6. import java.io.IOException;
  7. @Produces(MimeType.APPLICATION_X_NDJSON_UTF8_VALUE)
  8. @Mapping("case2")
  9. public Flux case2(String prompt) throws IOException {
  10.     return Flux.from(chatModel.prompt(prompt).stream())
  11.             .map(resp -> resp.getMessage());
  12. }
复制代码
输出效果如下:
  1. {"role":"ASSISTANT","content":"xxx"}
  2. {"role":"ASSISTANT","content":"yyy"}
复制代码
3、获取

上面讲的是作为 server 以流式输出。solon-net-httputils 则提供了,作为客户端接收流式获取(或接收)的能力:

  • 使用 HttpUtils 获取文本行流(比如 ndjosn)
  1. Publisher<String> publisher = HttpUtils.http("http://localhost:8080/stream")
  2.                 .execAsLineStream("GET");
复制代码

  • 使用 HttpUtils 获取 ServerSentEvnet (简称:sse)文本流
  1. Publisher<ServerSentEvent> publisher = HttpUtils.http("http://localhost:8080/sse")
  2.                 .execAsSseStream("GET");
复制代码
来源:程序园用户自行投稿发布,如果侵权,请联系站长删除
免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!

相关推荐

您需要登录后才可以回帖 登录 | 立即注册