Skip to content

AbstractXRequestClass 的 callbacks.onSuccess 与 AbstractChatProvider.transformMessage 的返回类型统一 #1583

@xiaoqiang1999

Description

@xiaoqiang1999

需求动机

以下是Bubble.List的role:

const role: BubbleListProps['role'] = {
  assistant: { /* ... */ }, // AI助手
  user: { /* ... */ }, // 用户
  suggest: { /* ... */ }, // 建议问题列表
};
<Bubble.List role={role} />a

以下是自定义的DifyRequest:

export class DifyRequest<
  Input extends CustomInput = CustomInput,
  Output extends CustomOutput = CustomOutput,
> extends AbstractXRequestClass<Input, Output> {
  // ... 
  async run(input: Input): Promise<void> {
    const { callbacks } = this.options;
    // ... 发起请求、使用 XStream 解析请求体并调用 callbacks?.onUpdate?.() 更新数据
    // 请求完成 获取suggest建议问题列表
    const suggestList: string[] = await getSuggestList(/* ...一些参数 */);
    // 将最终结果通过 onSuccess 回传
    callbacks?.onSuccess?.(
      [
        { role: 'assistant', content: result, messageId },
        { role: 'suggest', list: suggestList },
      ] as Output[],
      new Headers(),
    );
  }
}

以下是自定义的DifyChatProvider:

export class DifyChatProvider<
  ChatMessage extends CustomMessage = CustomMessage,
  Input extends CustomInput = CustomInput,
  Output extends CustomOutput = CustomOutput,
> extends AbstractChatProvider<ChatMessage, Input, Output> {
  // ...
  transformMessage(info: TransformMessage<ChatMessage, Output>): ChatMessage {
    const { chunk, chunks, status } = info;
    // 这里 chunks 是 DifyRequest 中 onSuccess 回传的数组 ChatMessage[]
    // 预期的行为是 可直接返回数组 ChatMessage[]
    // 但实际并不支持 只能返回单个的 ChatMessage
    // 我的理解是,现在的 transformMessage 不支持 return 数组,那 onSuccess 支持回传数组好像没什么意义?
    // 反过来说,现在的 onSuccess 支持回传数组,那 transformMessage 应该也能 return 数组比较合理吧?
    // 这两边似乎应该统一一下?
    if (status === 'success') {
      return chunks;
    }
    // 返回 update 回传的数据,更新 message
    // ...
    return chunk;
  }
}

提议的 API 是什么样的?

AbstractChatProvider.transformMessage 支持返回数组,或 callbacks.onSuccess 仅支持回传单个值,两边统一。
现在这样 onSuccess 支持回传数组但 transformMessage 仅支持返回单个值,没 get 到有什么用途和意义。

Metadata

Metadata

Assignees

Labels

enhancementNew feature or request

Type

No type

Projects

No projects

Milestone

No milestone

Relationships

None yet

Development

No branches or pull requests

Issue actions