import React, { useState, useCallback, useRef, useEffect } from 'react';
import { AIChatDialogue, RadioGroup, Radio, Button, Input, Toast, chatInputToChatCompletion, chatInputToMessage, AIChatInput } from '../../index';
import CustomRenderContentItem from './CustomRenderContentItem';
import RenderConfigContentItem from './RenderConfig';
import AIChatInputWithDialogueDemo from './AIChatInputWithDialogue';
import ResponseToMessageDemo from './DataAdapter/responseToMessage';
import StreamingChatCompletionToMessageDemo from './DataAdapter/streamingChatCompletionToMessage';
import StreamingResponseToMessageDemo from './DataAdapter/streamingResponseToMessage';
import ChatCompletionToMessageDemo from './DataAdapter/chatCompletionToMessage';
import MultiAssistant from './multiAssistant';
import { defaultMessages, loadingMessages, continueSendMessages, multiModalityMessage, reasoningMessage, toolCallMessage, annotationMessage, referenceMessage, failedMessage } from './message';
import MultiAgentDemo from './MultiAgent';
export default {
title: 'AIChatDialogue',
}
const roleConfig = {
user: {
name: 'User',
avatar: 'https://lf3-static.bytednsdoc.com/obj/eden-cn/ptlz_zlp/ljhwZthlaukjlkulzlp/docs-icon.png'
},
assistant: {
name: 'Assistant',
avatar: 'https://lf3-static.bytednsdoc.com/obj/eden-cn/ptlz_zlp/ljhwZthlaukjlkulzlp/other/logo.png'
},
system: {
name: 'System',
avatar: 'https://lf3-static.bytednsdoc.com/obj/eden-cn/ptlz_zlp/ljhwZthlaukjlkulzlp/other/logo.png'
}
}
export const AlignAndMode = () => {
const [messages, setMessage] = useState(defaultMessages);
const [mode, setMode] = useState('bubble');
const [align, setAlign] = useState('leftRight');
const onAlignChange = useCallback((e) => {
setAlign(e.target.value);
}, []);
const onModeChange = useCallback((e) => {
setMode(e.target.value);
}, []);
const onChatsChange = useCallback((chats) => {
setMessage(chats);
}, []);
const onReferenceClick = useCallback((item, message) => {
console.log('onReferenceClick', item, message);
}, []);
return (
<>
模式
气泡
非气泡
用户会话气泡
会话布局方式
左右分布
左对齐
>
);
}
export const Loading = () => {
return (
)
}
export const Scroll = () => {
return (
)
}
export const continueSend = () => {
const [selecting, setSelecting] = useState(false);
const onSelect = useCallback((selectionId) => {
console.log('onSelect', selectionId);
}, []);
return (
{
setSelecting(!selecting);
}}
/>
)
}
export const Action = () => {
const [messages, setMessage] = useState(defaultMessages);
const [selected, setSelected] = useState(false);
const [editMessageId, setEditMessageId] = useState(null);
const onChatsChange = useCallback((chats) => {
setMessage(chats);
}, []);
const onSelect = useCallback((selectionId) => {
console.log('onSelect', selectionId);
}, []);
const onCancel = useCallback(() => {
const index = messages.findIndex(item => item.id === editMessageId);
const newChat = {
...messages[index],
isEditing: false,
};
const newChats = [...messages];
newChats.splice(index, 1, newChat);
setMessage(newChats);
}, [editMessageId, messages]);
// todo: 确认消息编辑交互形态
const messageEditRender = (message) => {
let value = message.content;
const onChange = (curValue) => {
value = curValue;
}
const onSubmit = () => {
const index = messages.findIndex(item => item.id === editMessageId);
const newChat = {
...messages[index],
isEditing: false,
content: value,
};
const newChats = [...messages];
newChats.splice(index, 1, newChat);
setMessage(newChats);
};
return (
);
}
const onMessageEdit = useCallback((message) => {
setEditMessageId(message.id);
console.log('onMessageEdit', message);
}, []);
const onMessageReset = useCallback((e) => {
setTimeout(() => {
setMessage((message) => {
const lastMessage = message[message.length - 1];
const newLastMessage = {
...lastMessage,
status: 'completed',
content: 'This is a mock reset message.',
}
return [...message.slice(0, -1), newLastMessage]
})
}, 2000);
})
return (
{
console.log('onMessageCopy', message);
}}
onMessageDelete={() => {
console.log('onMessageDelete');
}}
onMessageReset={onMessageReset}
onMessageGoodFeedback={(message) => {
console.log('onMessageGoodFeedback', message.id);
}}
onMessageBadFeedback={() => {
console.log('onMessageBadFeedback');
}}
onChatsChange={onChatsChange}
onMessageShare={() => {
console.log('onMessageShare', selected);
setSelected(!selected);
}}
onMessageEdit={onMessageEdit}
onSelect={onSelect}
messageEditRender={messageEditRender}
/>
)
}
export const Selecting = () => {
const hintsExample = [
"Semi 组件库有哪些常用组件?",
"能否展示一个使用 Semi 组件库构建的页面示例?",
"Semi 组件库有官方文档吗?",
]
const ref = useRef(null);
const [align, setAlign] = useState('leftRight');
const [select, setSelect] = useState(true);
const [selection, setSelection] = useState('allSelect');
const [hints, setHints] = useState(hintsExample);
useEffect(() => {
ref.current.selectAll();
}, []);
const onAlignChange = useCallback((e) => {
setAlign(e.target.value);
}, []);
const onSelectChange = useCallback((e) => {
setSelect(e.target.value);
}, []);
const onSelectionChange = useCallback((e) => {
if(e.target.value === 'allSelect') {
ref.current.selectAll();
} else {
ref.current.deselectAll();
}
setSelection(e.target.value);
}, []);
const onSelect = useCallback((selectionId) => {
console.log('onSelect', selectionId);
}, []);
const onHintClick = useCallback((hint) => {
setHints([]);
}, []);
return (
会话布局方式
左右分布
左对齐
是否开启选择
开启
关闭
选择方式
全选
取消全选
)
}
export const Editing = () => {
const [messages, setMessage] = useState(defaultMessages);
const [editMessageId, setEditMessageId] = useState(null);
const onChatsChange = useCallback((chats) => {
setMessage(chats);
}, []);
const onMessageEdit = useCallback((message) => {
setEditMessageId(message.id);
console.log('onMessageEdit', message);
}, []);
const onCancel = useCallback(() => {
const index = messages.findIndex(item => item.id === editMessageId);
const newChat = {
...messages[index],
isEditing: false,
};
const newChats = [...messages];
newChats.splice(index, 1, newChat);
setMessage(newChats);
}, [editMessageId, messages]);
// todo: 确认消息编辑交互形态
const messageEditRender = (message) => {
let value = message.content;
const onChange = (curValue) => {
value = curValue;
}
const onSubmit = () => {
const index = messages.findIndex(item => item.id === editMessageId);
const newChat = {
...messages[index],
isEditing: false,
content: value,
};
const newChats = [...messages];
newChats.splice(index, 1, newChat);
setMessage(newChats);
};
return (
//
);
}
return (
)
}
export const MultiModality = () => {
const [messages, setMessage] = useState(multiModalityMessage);
const onChatsChange = useCallback((chats) => {
setMessage(chats);
}, []);
const onFileClick = useCallback((file) => {
console.log('onFileClick', file);
}, []);
return (
)
}
export const Reasoning = () => {
const [messages, setMessage] = useState(reasoningMessage);
const onChatsChange = useCallback((chats) => {
setMessage(chats);
}, []);
return (
)
}
export const ToolCall = () => {
const [messages, setMessage] = useState(toolCallMessage);
const onChatsChange = useCallback((chats) => {
setMessage(chats);
}, []);
return (
)
}
export const Annotation = () => {
const [messages, setMessage] = useState(annotationMessage);
const onChatsChange = useCallback((chats) => {
setMessage(chats);
}, []);
const onAnnotationClick = useCallback((annotation) => {
console.log('onAnnotationClick', annotation);
Toast.success('Ready to open the sidebar!');
}, []);
return (
)
}
export const ShowReference = () => {
const onReferenceClick = useCallback((item) => {
console.log('onReferenceClick', item);
}, []);
return (
)
}
export const Reference = () => {
const [messages, setMessage] = useState(referenceMessage);
const onChatsChange = useCallback((chats) => {
setMessage(chats);
}, []);
return (
)
}
export const CustomRender = CustomRenderContentItem;
export const RenderConfig = RenderConfigContentItem;
export const Failed = () => {
const [messages, setMessage] = useState(failedMessage);
const onChatsChange = useCallback((chats) => {
setMessage(chats);
}, []);
return (
)
}
export const Hints = () => {
const hintsExample = [
"Semi 组件库有哪些常用组件?",
"能否展示一个使用 Semi 组件库构建的页面示例?",
"Semi 组件库有官方文档吗?",
]
const [messages, setMessage] = useState(defaultMessages);
const [hints, setHints] = useState(hintsExample);
const onChatsChange = useCallback((chats) => {
console.log('onChatsChange', chats);
setMessage(chats);
}, []);
const onHintClick = useCallback((hint) => {
setHints([]);
}, []);
return (
)
}
export const MultiAssistantStory = () => ;
MultiAssistantStory.storyName = 'Multi Assistant';
export const MultiAgentStory = () => ;
MultiAgentStory.storyName = 'Multi Agent';
export const AIChatInputWithDialogue = () => ;
AIChatInputWithDialogue.storyName = 'AIChatInput With Dialogue';
export const ResponseToMessageStory = () => ;
ResponseToMessageStory.storyName = 'adapter: response';
export const ChatCompletionToMessageStory = () => ;
ChatCompletionToMessageStory.storyName = 'adapter: chatCompletion';
export const StreamingResponseToMessageStory = () => ;
StreamingResponseToMessageStory.storyName = 'adapter: streaming response';
export const StreamingChatCompletionToMessageStory = () => ;
StreamingChatCompletionToMessageStory.storyName = 'adapter: streaming chatCompletion';
export const ChatInputToChatCompletionStory = () => {
const [generating, setGenerating] = useState(false);
const [messages, setMessages] = useState([]);
const onContentChange = useCallback((content) => {
// console.log('onContentChange', content);
}, []);
const onMessageSend = useCallback((props) => {
// console.log('onMessageSend', props);
const userMessage = chatInputToMessage(props);
const chatCompletion = chatInputToChatCompletion(props);
setGenerating(true);
setMessages((messages) => [...messages, {
id: `message-${Date.now()}`,
...userMessage
}]);
console.log('chatCompletion', chatCompletion);
}, []);
return (
独角兽的故事'}
skills={[]}
generating={generating}
uploadProps={{ action: "https://api.semi.design/upload" }}
onContentChange={onContentChange}
onMessageSend={onMessageSend}
onStopGenerate={() => setGenerating(false)}
/>
)
};