Skip to content

onUpdate 无法第一时间获取流式首帧响应 #742

Description

@senique

重现步骤

``参考 https://ant-design-x.antgroup.com/components/use-x-chat-cn 流式输出,

重现代码如下:

import { UserOutlined } from '@ant-design/icons';
import { Bubble, Sender, useXAgent, useXChat, XRequest } from '@ant-design/x';
import { Flex, type GetProp } from 'antd';
import React from 'react';

const roles: GetProp<typeof Bubble.List, 'roles'> = {
  ai: {
    placement: 'start',
    avatar: { icon: <UserOutlined />, style: { background: '#fde3cf' } },
  },
  local: {
    placement: 'end',
    avatar: { icon: <UserOutlined />, style: { background: '#87d068' } },
  },
};

const App = () => {
  const [content, setContent] = React.useState('');

  const { create } = XRequest({
    model: '',
    baseURL: '',
  });
  
  // Agent for request
  const [agent] = useXAgent({
    request: async ({ message }, { onSuccess, onUpdate, onError }) => {
      let fullContent = '';

      try {
        create(
          {
            messages: [{ role: 'user', content: message }],
            stream: true,
          },
          {
            onUpdate: (chunk) => {
              // console.log('sse object', chunk);
              if (chunk.data !== '[DONE]') {
                const data = JSON.parse(chunk.data);
                fullContent += data?.choices[0].delta.content;
                onUpdate(fullContent);
              }
            },
            onSuccess: (chunks) => {
              // console.log('sse chunk list', chunks);
              onSuccess(fullContent);
            },
            onError: (error) => {
              // console.log('error', error);
              onError(error);
            },
          },
        );
      } catch (error) {
        onError(error);
      }
    },
  });

  // Chat messages
  const { onRequest, messages } = useXChat({
    agent,
  });

  return (
    <Flex vertical gap="middle">
      <Bubble.List
        roles={roles}
        style={{ maxHeight: 300 }}
        items={messages.map(({ id, message, status }) => ({
          key: id,
          role: status === 'local' ? 'local' : 'ai',
          content: message,
        }))}
      />
      <Sender
        loading={agent.isRequesting()}
        value={content}
        onChange={setContent}
        onSubmit={(nextContent) => {
          onRequest(nextContent);
          setContent('');
        }}
      />
    </Flex>
  );
};

export default App;

当前行为

XRequest + request/useXAgent + useXChat 响应如下(不满足预期效果,onUpdate 无法第一时间获取到首帧响应):

Image

预期行为

Python 直接流式调用(预期效果):
Image

上下文

Python 复现代码:

  url = f""
  data = {
    "model": model,
    "messages": messages,
    "stream": True
  }
  response = requests.post(url, headers=headers, json=data, stream=True)
  exec_time = time.time() - start_time
  print(f"首帧响应: 耗时[{getHMS(round(exec_time * 1000))}]")
  for line in response.iter_lines():
    if line:
      print(datetime.datetime.now().strftime('%H:%M:%S.%f')[:-3] + ' ' + line.decode('utf-8'))

版本

1.1.1

您在哪些浏览器上遇到了这个问题?

  • Chrome Version 134.0.6998.165 (Official Build) (64-bit)
  • Firefox 133.0 (64 位)

Activity

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Metadata

Metadata

Labels

questionFurther information is requested

Type

No type

Projects

No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions