1、简单请求与响应
import org.noear.solon.ai.chat.ChatModel;
import org.noear.solon.annotation.*;
import java.io.IOException;
@Controller
public class DemoController {
@Inject
ChatModel chatModel;
@Mapping("case1")
public String case1(String prompt) throws IOException {
return chatModel.prompt(prompt)
.call()
.getMessage()
.getContent();
}
}
2、响应数据作为 sse 或 ndjson 输出
import org.noear.solon.ai.chat.ChatModel;
import org.noear.solon.ai.chat.message.ChatMessage;
import org.noear.solon.annotation.*;
import org.noear.solon.core.util.MimeType;
import reactor.core.publisher.Flux;
import java.io.IOException;
@Controller
public class DemoController {
@Inject
ChatModel chatModel;
//@Produces(MimeType.APPLICATION_X_NDJSON_VALUE)
//自动转为 sse
@Produces(MimeType.TEXT_EVENT_STREAM_UTF8_VALUE)
@Mapping("case2")
public Flux<ChatMessage> case2(String prompt) throws IOException {
return Flux.from(chatModel.prompt(prompt).stream())
.filter(resp -> resp.hasContent())
.map(resp -> resp.getMessage());
}
}
3、聊天会话与记忆(即持久化)
import org.noear.solon.ai.chat.ChatModel;
import org.noear.solon.ai.chat.ChatSession;
import org.noear.solon.ai.chat.message.ChatMessage;
import org.noear.solon.ai.chat.session.InMemoryChatSession;
import org.noear.solon.annotation.Controller;
import org.noear.solon.annotation.Header;
import org.noear.solon.annotation.Inject;
import org.noear.solon.annotation.Mapping;
import org.noear.solon.web.sse.SseEvent;
import reactor.core.publisher.Flux;
import java.io.IOException;
import java.util.Map;
import java.util.concurrent.ConcurrentHashMap;
@Controller
public class DemoController {
@Inject
ChatModel chatModel;
final Map<String, ChatSession> sessionMap = new ConcurrentHashMap<>();
//手动转为 sse
@Mapping("case3")
public Flux<SseEvent> case3(@Header("sessionId") String sessionId, String prompt) throws IOException {
ChatSession chatSession = sessionMap.computeIfAbsent(sessionId, k -> InMemoryChatSession.builder().build());
chatSession.addMessage(ChatMessage.ofUser(prompt));
//注意提示语的参数:chatSession
return Flux.from(chatModel.prompt(chatSession).stream())
.filter(resp -> resp.hasContent())
.map(resp -> new SseEvent().data(resp.getContent()));
}
}