Solon v3.6.0

solon-web 集成参考

</> markdown

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()));
    }
}