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

http 流式输出(主要是指文本流式输出),需要使用响应式接口和支持流输出的 mime 声明。常见的有两种文本流式输出:

1、输出 sse(Server Sent Event)

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

示例代码:

java 复制代码
import org.noear.solon.annotation.Mapping;
import org.noear.solon.annotation.Produces;
import org.noear.solon.core.util.MimeType;
import org.noear.solon.web.sse.SseEvent;
import reactor.core.publisher.Flux;

import java.io.IOException;

@Produces(MimeType.TEXT_EVENT_STREAM_UTF8_VALUE)
@Mapping("case1")
public Flux<SseEvent> case1(String prompt) throws IOException {
    return Flux.from(chatModel.prompt(prompt).stream())
            .filter(resp -> resp.hasContent())
            .map(resp -> new SseEvent().data(resp.getContent()));
}

输出效果如下(sse 消息块有多个属性,data 为必选,其它为可选):

复制代码
data:{"role":"ASSISTANT","content":"xxx"}

data:{"role":"ASSISTANT","content":"yyy"}

2、输出 ndjosn(Newline-Delimited JSON)

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

java 复制代码
import org.noear.solon.ai.chat.message.AssistantMessage;
import org.noear.solon.annotation.Mapping;
import org.noear.solon.annotation.Produces;
import org.noear.solon.core.util.MimeType;
import reactor.core.publisher.Flux;

import java.io.IOException;

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

3、获取

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

  • 使用 HttpUtils 获取文本行流(比如 ndjosn)
java 复制代码
Publisher<String> publisher = HttpUtils.http("http://localhost:8080/stream")
                .execAsLineStream("GET");
  • 使用 HttpUtils 获取 ServerSentEvnet (简称:sse)文本流
java 复制代码
Publisher<ServerSentEvent> publisher = HttpUtils.http("http://localhost:8080/sse")
                .execAsSseStream("GET");
相关推荐
毕设源码-朱学姐16 小时前
【开题答辩全过程】以 基于JavaWeb的网上家具商城设计与实现为例,包含答辩的问题和答案
java
C雨后彩虹18 小时前
CAS与其他并发方案的对比及面试常见问题
java·面试·cas·同步·异步·
AI大模型测试18 小时前
大龄程序员想转行到AI大模型,好转吗?
人工智能·深度学习·机器学习·ai·语言模型·职场和发展·大模型
java1234_小锋19 小时前
Java高频面试题:SpringBoot为什么要禁止循环依赖?
java·开发语言·面试
badfl19 小时前
VSCode Claude Code插件配置教程:使用、配置中转API、常见问题
人工智能·vscode·ai
2501_9445255419 小时前
Flutter for OpenHarmony 个人理财管理App实战 - 账户详情页面
android·java·开发语言·前端·javascript·flutter
计算机学姐19 小时前
基于SpringBoot的电影点评交流平台【协同过滤推荐算法+数据可视化统计】
java·vue.js·spring boot·spring·信息可视化·echarts·推荐算法
Filotimo_19 小时前
Tomcat的概念
java·tomcat
代码匠心20 小时前
Trae IDE 隐藏玩法:接入即梦 AI,生成高质量大片!
人工智能·ai·trae·skills