{children}
@@ -120,73 +104,15 @@ function ChatMessageAvatar(props: ChatMessageAvatarProps) {
}
function ChatMessageContent(props: ChatMessageContentProps) {
- const { message: defaultMessage, isLast } = useChatMessage()
- const message = props.message ?? defaultMessage
- const annotations = message.annotations as MessageAnnotation[] | undefined
-
- const contents = useMemo
(() => {
- const displayMap: {
- [key in ContentPosition]?: React.ReactNode | null
- } = {
- [ContentPosition.CHAT_EVENTS]: (
-
- ),
- [ContentPosition.CHAT_AGENT_EVENTS]: (
-
- ),
- [ContentPosition.CHAT_IMAGE]: ,
- [ContentPosition.MARKDOWN]: (
-
- ),
- [ContentPosition.CHAT_DOCUMENT_FILES]: (
-
- ),
- [ContentPosition.CHAT_SOURCES]: ,
- ...(isLast &&
- props.append && {
- // show suggested questions only on the last message
- [ContentPosition.SUGGESTED_QUESTIONS]: (
-
- ),
- }),
- }
-
- // Override the default display map with the custom content
- props.content?.forEach(content => {
- displayMap[content.position] = content.component
- })
-
- return Object.entries(displayMap).map(([position, component]) => ({
- position: parseInt(position),
- component,
- }))
- }, [
- annotations,
- isLast,
- message,
- props.append,
- props.content,
- props.isLoading,
- ])
-
const children = props.children ?? (
<>
- {contents
- .sort((a, b) => a.position - b.position)
- .map((content, index) => (
- {content.component}
- ))}
+
+
+
+
+
+
+
>
)
@@ -197,6 +123,20 @@ function ChatMessageContent(props: ChatMessageContentProps) {
)
}
+function ChatMarkdown() {
+ const { message } = useChatMessage()
+ const annotations = message.annotations as MessageAnnotation[] | undefined
+
+ return (
+
+ )
+}
+
function ChatMessageActions(props: ChatMessageActionsProps) {
const { isCopied, copyToClipboard } = useCopyToClipboard({ timeout: 2000 })
const { message } = useChatMessage()
@@ -223,9 +163,19 @@ function ChatMessageActions(props: ChatMessageActionsProps) {
)
}
+type ComposibleChatMessageContent = typeof ChatMessageContent & {
+ Event: typeof EventAnnotations
+ AgentEvent: typeof AgentEventAnnotations
+ Image: typeof ImageAnnotations
+ Markdown: typeof ChatMarkdown
+ DocumentFile: typeof DocumentFileAnnotations
+ Source: typeof SourceAnnotations
+ SuggestedQuestions: typeof SuggestedQuestionsAnnotations
+}
+
type ComposibleChatMessage = typeof ChatMessage & {
Avatar: typeof ChatMessageAvatar
- Content: typeof ChatMessageContent
+ Content: ComposibleChatMessageContent
Actions: typeof ChatMessageActions
}
@@ -237,8 +187,18 @@ const PrimiviteChatMessage = memo(ChatMessage, (prevProps, nextProps) => {
)
}) as unknown as ComposibleChatMessage
+PrimiviteChatMessage.Content =
+ ChatMessageContent as ComposibleChatMessageContent
+
+PrimiviteChatMessage.Content.Event = EventAnnotations
+PrimiviteChatMessage.Content.AgentEvent = AgentEventAnnotations
+PrimiviteChatMessage.Content.Image = ImageAnnotations
+PrimiviteChatMessage.Content.Markdown = ChatMarkdown
+PrimiviteChatMessage.Content.DocumentFile = DocumentFileAnnotations
+PrimiviteChatMessage.Content.Source = SourceAnnotations
+PrimiviteChatMessage.Content.SuggestedQuestions = SuggestedQuestionsAnnotations
+
PrimiviteChatMessage.Avatar = ChatMessageAvatar
-PrimiviteChatMessage.Content = ChatMessageContent
PrimiviteChatMessage.Actions = ChatMessageActions
export default PrimiviteChatMessage
diff --git a/packages/chat-ui/src/chat/chat.interface.ts b/packages/chat-ui/src/chat/chat.interface.ts
index 0197b3e..0d66b28 100644
--- a/packages/chat-ui/src/chat/chat.interface.ts
+++ b/packages/chat-ui/src/chat/chat.interface.ts
@@ -1,5 +1,15 @@
type MessageRole = 'system' | 'user' | 'assistant' | 'data'
+export type JSONValue =
+ | null
+ | string
+ | number
+ | boolean
+ | {
+ [value: string]: JSONValue
+ }
+ | JSONValue[]
+
export interface Message {
content: string
role: MessageRole
diff --git a/packages/chat-ui/src/index.tsx b/packages/chat-ui/src/index.tsx
index 71757e6..18b67d7 100644
--- a/packages/chat-ui/src/index.tsx
+++ b/packages/chat-ui/src/index.tsx
@@ -8,9 +8,9 @@ export { default as ChatMessage, ContentPosition } from './chat/chat-message'
// Context Provider Hooks
export { useChatUI } from './chat/chat.context'
+export { useChatMessage } from './chat/chat-message.context'
export { useChatInput } from './chat/chat-input'
export { useChatMessages } from './chat/chat-messages'
-export { useChatMessage } from './chat/chat-message'
// Custom Hooks
export { useFile } from './hook/use-file'