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

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

1、输出 sse(Server Sent Event)

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

示例代码:

复制代码
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 消息块为单位,以"换行符"为识别间隔。

复制代码
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)

    Publisher<String> publisher = HttpUtils.http("http://localhost:8080/stream")
    .execAsLineStream("GET");

  • 使用 HttpUtils 获取 ServerSentEvnet (简称:sse)文本流

    Publisher<ServerSentEvent> publisher = HttpUtils.http("http://localhost:8080/sse")
    .execAsSseStream("GET");

相关推荐
努力努力再努力wz1 分钟前
【C++高阶系列】外存查找的极致艺术:数据库偏爱的B+树底层架构剖析与C++完整实现!(附B+树实现的源码)
linux·运维·服务器·数据结构·数据库·c++·b树
知识分享小能手3 分钟前
MongoDB入门学习教程,从入门到精通,MongoDB 持久性完全指南(20)
数据库·学习·mongodb
何中应5 分钟前
Doris部署&连接
大数据·数据库·时序数据库·doris
云边有个稻草人7 分钟前
KES 表空间目录自动创建特性:简化存储管理、提升运维效率
数据库·国产数据库·kes
clear sky .9 分钟前
[linux]buildroot什么用途
linux·运维·数据库
羊小蜜.21 分钟前
Mysql 12: 视图全解——从创建到使用
android·数据库·mysql·视图
一个有温度的技术博主1 小时前
Redis缓存预热:解决服务冷启动的“数据库杀手”问题
数据库·redis·缓存
沃尔威武8 小时前
数据库 Sinks(.net8)
数据库·.net·webview
Dreamboat¿9 小时前
SQL 注入漏洞
数据库·sql
曹牧10 小时前
Oracle数据库中,将JSON字符串转换为多行数据
数据库·oracle·json