Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

流式输出能集成支持一下websocket吗,小程序貌似不支持sse #4

Closed
soulForLove opened this issue Mar 5, 2023 · 6 comments

Comments

@soulForLove
Copy link

非常感谢

@gulihua10010
Copy link
Owner

我也正在做小程序,也是用websocket进行传输的,过两天就会把项目上传到github上来,到时候你可以参考下。
其实只需要在 websocket 接收消息的时候,调用流式的方法,然后在回调函数中进行发送接口响应数据就行了,我把关键代码贴上给你参考下吧。
`

/**
 * 收到客户端消息后调用的方法
 *
 * @param message 客户端发送过来的消息
 */
@OnMessage
public void onMessage(String message, Session session)
{
    log.debug("Message received from session {} :{}: ip {}", session.getId(), message, this.ip);
    try
    {
        ConversationRequest req = this.convertParam(message, ConversationRequest.class);
        BizValidation.paramValidate(req.getContent(), "content", "content不能为空!");
        if (!req.getIsDemo())
        {
            BizValidation.paramValidate(req.getAuthValue(), "authValue", "Authorization不能为空!");
        }
        ChatGptService chatGptService = SpringUtil.getBean(ChatGptServiceBean.get(req.getAuthType()));
        Cache<String, String> cache = SpringUtil.getBean("fifuCache");
        ChatGptAskReqBO reqBO = new ChatGptAskReqBO();
        reqBO.setContent(HtmlUtil.cleanHtmlTag(req.getContent()));

        reqBO.setId(req.getId());
        if (CollUtil.isNotEmpty(req.getMessages()))
        {
            List<ChatGptAskReqBO.ChatMessageBO> list = new ArrayList<>();
            for (ConversationRequest.ChatMessage msg : req.getMessages())
            {
                if (StrUtil.isBlank(msg.getContent()))
                {
                    continue;
                }
                ChatGptAskReqBO.ChatMessageBO chat = new ChatGptAskReqBO.ChatMessageBO();
                chat.setRole(msg.getRole());
                chat.setContent(HtmlUtil.cleanHtmlTag(msg.getContent()));
                list.add(chat);
            }
            reqBO.setMessages(list);

        }
        reqBO.setParentId(req.getParentId());
        reqBO.setConversationId(req.getConversationId());
        reqBO.setAuthValue(req.getAuthValue());
        log.debug("onMessageon.receive: {}", reqBO.toString());
        chatGptService.conversation(reqBO, param -> {
            if (!param.getIsSuccess())
            {
                WebsocketUtil.cleanCache(this.ip);

            }
            if (null != param.getContent())
            {
                try
                {
                    log.debug("onMessageon.send: {}", param.toString());

                    session.getBasicRemote().sendText(JSONObject.toJSONString(param));
                }
                catch (IOException e)
                {
                    WebsocketUtil.cleanCache(this.ip);
                    log.error("websocket.onMessage.sendText:", e);
                }
            }
        });
    }
    catch (Exception e)
    {
        log.error("websocket.onMessage:", e);
        try
        {
            ConversationResBO resBO = new ConversationResBO();
            resBO.setContent(e.getMessage());
            resBO.setIsDone(false);
            resBO.setCreateTime(DateUtil.format(new Date(), "yyyy-MM-dd HH:mm:ss"));
            session.getBasicRemote().sendText(JSONObject.toJSONString(resBO));
            sendDone();
        }
        catch (IOException ex)
        {
            log.error("websocket.onMessage.sendText:", e);
        }
    }

}`

@soulForLove
Copy link
Author

非常感谢,期待!

@who120309
Copy link

我也正在做小程序,也是用websocket进行传输的,过两天就会把项目上传到github上来,到时候你可以参考下。 其实只需要在 websocket 接收消息的时候,调用流式的方法,然后在回调函数中进行发送接口响应数据就行了,我把关键代码贴上给你参考下吧。 `

/**
 * 收到客户端消息后调用的方法
 *
 * @param message 客户端发送过来的消息
 */
@OnMessage
public void onMessage(String message, Session session)
{
    log.debug("Message received from session {} :{}: ip {}", session.getId(), message, this.ip);
    try
    {
        ConversationRequest req = this.convertParam(message, ConversationRequest.class);
        BizValidation.paramValidate(req.getContent(), "content", "content不能为空!");
        if (!req.getIsDemo())
        {
            BizValidation.paramValidate(req.getAuthValue(), "authValue", "Authorization不能为空!");
        }
        ChatGptService chatGptService = SpringUtil.getBean(ChatGptServiceBean.get(req.getAuthType()));
        Cache<String, String> cache = SpringUtil.getBean("fifuCache");
        ChatGptAskReqBO reqBO = new ChatGptAskReqBO();
        reqBO.setContent(HtmlUtil.cleanHtmlTag(req.getContent()));

        reqBO.setId(req.getId());
        if (CollUtil.isNotEmpty(req.getMessages()))
        {
            List<ChatGptAskReqBO.ChatMessageBO> list = new ArrayList<>();
            for (ConversationRequest.ChatMessage msg : req.getMessages())
            {
                if (StrUtil.isBlank(msg.getContent()))
                {
                    continue;
                }
                ChatGptAskReqBO.ChatMessageBO chat = new ChatGptAskReqBO.ChatMessageBO();
                chat.setRole(msg.getRole());
                chat.setContent(HtmlUtil.cleanHtmlTag(msg.getContent()));
                list.add(chat);
            }
            reqBO.setMessages(list);

        }
        reqBO.setParentId(req.getParentId());
        reqBO.setConversationId(req.getConversationId());
        reqBO.setAuthValue(req.getAuthValue());
        log.debug("onMessageon.receive: {}", reqBO.toString());
        chatGptService.conversation(reqBO, param -> {
            if (!param.getIsSuccess())
            {
                WebsocketUtil.cleanCache(this.ip);

            }
            if (null != param.getContent())
            {
                try
                {
                    log.debug("onMessageon.send: {}", param.toString());

                    session.getBasicRemote().sendText(JSONObject.toJSONString(param));
                }
                catch (IOException e)
                {
                    WebsocketUtil.cleanCache(this.ip);
                    log.error("websocket.onMessage.sendText:", e);
                }
            }
        });
    }
    catch (Exception e)
    {
        log.error("websocket.onMessage:", e);
        try
        {
            ConversationResBO resBO = new ConversationResBO();
            resBO.setContent(e.getMessage());
            resBO.setIsDone(false);
            resBO.setCreateTime(DateUtil.format(new Date(), "yyyy-MM-dd HH:mm:ss"));
            session.getBasicRemote().sendText(JSONObject.toJSONString(resBO));
            sendDone();
        }
        catch (IOException ex)
        {
            log.error("websocket.onMessage.sendText:", e);
        }
    }

}`

大佬,小程序出了吗

@gulihua10010
Copy link
Owner

还没,token 登录方式的端点被封禁了,我正在尝试其他方式

@gulihua10010
Copy link
Owner

我也正在做小程序,也是用websocket进行传输的,过两天就会把项目上传到github上来,到时候你可以参考下。 其实只需要在 websocket 接收消息的时候,调用流式的方法,然后在回调函数中进行发送接口响应数据就行了,我把关键代码贴上给你参考下吧。 `

/**
 * 收到客户端消息后调用的方法
 *
 * @param message 客户端发送过来的消息
 */
@OnMessage
public void onMessage(String message, Session session)
{
    log.debug("Message received from session {} :{}: ip {}", session.getId(), message, this.ip);
    try
    {
        ConversationRequest req = this.convertParam(message, ConversationRequest.class);
        BizValidation.paramValidate(req.getContent(), "content", "content不能为空!");
        if (!req.getIsDemo())
        {
            BizValidation.paramValidate(req.getAuthValue(), "authValue", "Authorization不能为空!");
        }
        ChatGptService chatGptService = SpringUtil.getBean(ChatGptServiceBean.get(req.getAuthType()));
        Cache<String, String> cache = SpringUtil.getBean("fifuCache");
        ChatGptAskReqBO reqBO = new ChatGptAskReqBO();
        reqBO.setContent(HtmlUtil.cleanHtmlTag(req.getContent()));

        reqBO.setId(req.getId());
        if (CollUtil.isNotEmpty(req.getMessages()))
        {
            List<ChatGptAskReqBO.ChatMessageBO> list = new ArrayList<>();
            for (ConversationRequest.ChatMessage msg : req.getMessages())
            {
                if (StrUtil.isBlank(msg.getContent()))
                {
                    continue;
                }
                ChatGptAskReqBO.ChatMessageBO chat = new ChatGptAskReqBO.ChatMessageBO();
                chat.setRole(msg.getRole());
                chat.setContent(HtmlUtil.cleanHtmlTag(msg.getContent()));
                list.add(chat);
            }
            reqBO.setMessages(list);

        }
        reqBO.setParentId(req.getParentId());
        reqBO.setConversationId(req.getConversationId());
        reqBO.setAuthValue(req.getAuthValue());
        log.debug("onMessageon.receive: {}", reqBO.toString());
        chatGptService.conversation(reqBO, param -> {
            if (!param.getIsSuccess())
            {
                WebsocketUtil.cleanCache(this.ip);

            }
            if (null != param.getContent())
            {
                try
                {
                    log.debug("onMessageon.send: {}", param.toString());

                    session.getBasicRemote().sendText(JSONObject.toJSONString(param));
                }
                catch (IOException e)
                {
                    WebsocketUtil.cleanCache(this.ip);
                    log.error("websocket.onMessage.sendText:", e);
                }
            }
        });
    }
    catch (Exception e)
    {
        log.error("websocket.onMessage:", e);
        try
        {
            ConversationResBO resBO = new ConversationResBO();
            resBO.setContent(e.getMessage());
            resBO.setIsDone(false);
            resBO.setCreateTime(DateUtil.format(new Date(), "yyyy-MM-dd HH:mm:ss"));
            session.getBasicRemote().sendText(JSONObject.toJSONString(resBO));
            sendDone();
        }
        catch (IOException ex)
        {
            log.error("websocket.onMessage.sendText:", e);
        }
    }

}`

大佬,小程序出了吗

@gulihua10010
Copy link
Owner

我也正在做小程序,也是用websocket进行传输的,过两天就会把项目上传到github上来,到时候你可以参考下。 其实只需要在 websocket 接收消息的时候,调用流式的方法,然后在回调函数中进行发送接口响应数据就行了,我把关键代码贴上给你参考下吧。 `

/**
 * 收到客户端消息后调用的方法
 *
 * @param message 客户端发送过来的消息
 */
@OnMessage
public void onMessage(String message, Session session)
{
    log.debug("Message received from session {} :{}: ip {}", session.getId(), message, this.ip);
    try
    {
        ConversationRequest req = this.convertParam(message, ConversationRequest.class);
        BizValidation.paramValidate(req.getContent(), "content", "content不能为空!");
        if (!req.getIsDemo())
        {
            BizValidation.paramValidate(req.getAuthValue(), "authValue", "Authorization不能为空!");
        }
        ChatGptService chatGptService = SpringUtil.getBean(ChatGptServiceBean.get(req.getAuthType()));
        Cache<String, String> cache = SpringUtil.getBean("fifuCache");
        ChatGptAskReqBO reqBO = new ChatGptAskReqBO();
        reqBO.setContent(HtmlUtil.cleanHtmlTag(req.getContent()));

        reqBO.setId(req.getId());
        if (CollUtil.isNotEmpty(req.getMessages()))
        {
            List<ChatGptAskReqBO.ChatMessageBO> list = new ArrayList<>();
            for (ConversationRequest.ChatMessage msg : req.getMessages())
            {
                if (StrUtil.isBlank(msg.getContent()))
                {
                    continue;
                }
                ChatGptAskReqBO.ChatMessageBO chat = new ChatGptAskReqBO.ChatMessageBO();
                chat.setRole(msg.getRole());
                chat.setContent(HtmlUtil.cleanHtmlTag(msg.getContent()));
                list.add(chat);
            }
            reqBO.setMessages(list);

        }
        reqBO.setParentId(req.getParentId());
        reqBO.setConversationId(req.getConversationId());
        reqBO.setAuthValue(req.getAuthValue());
        log.debug("onMessageon.receive: {}", reqBO.toString());
        chatGptService.conversation(reqBO, param -> {
            if (!param.getIsSuccess())
            {
                WebsocketUtil.cleanCache(this.ip);

            }
            if (null != param.getContent())
            {
                try
                {
                    log.debug("onMessageon.send: {}", param.toString());

                    session.getBasicRemote().sendText(JSONObject.toJSONString(param));
                }
                catch (IOException e)
                {
                    WebsocketUtil.cleanCache(this.ip);
                    log.error("websocket.onMessage.sendText:", e);
                }
            }
        });
    }
    catch (Exception e)
    {
        log.error("websocket.onMessage:", e);
        try
        {
            ConversationResBO resBO = new ConversationResBO();
            resBO.setContent(e.getMessage());
            resBO.setIsDone(false);
            resBO.setCreateTime(DateUtil.format(new Date(), "yyyy-MM-dd HH:mm:ss"));
            session.getBasicRemote().sendText(JSONObject.toJSONString(resBO));
            sendDone();
        }
        catch (IOException ex)
        {
            log.error("websocket.onMessage.sendText:", e);
        }
    }

}`

大佬,小程序出了吗

小程序和服务器端程序已经上传到 github,如果对你有帮助的话,您可以参考下:

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

No branches or pull requests

3 participants