From 1bd1fd58280c2a524baea346ab9e21e817484033 Mon Sep 17 00:00:00 2001 From: vinodkiran Date: Wed, 13 Dec 2023 10:47:45 +0530 Subject: [PATCH] MultiModal: Minor adjustments to layout and categorization of node --- .../multimodal/OpenAI/OpenAIVisionChain.ts | 2 +- packages/server/src/index.ts | 4 +- .../ui/src/views/chatmessage/ChatMessage.css | 12 ++++ .../ui/src/views/chatmessage/ChatMessage.js | 71 +++++++++++-------- 4 files changed, 58 insertions(+), 31 deletions(-) diff --git a/packages/components/nodes/multimodal/OpenAI/OpenAIVisionChain.ts b/packages/components/nodes/multimodal/OpenAI/OpenAIVisionChain.ts index dcaa96e2..1ff4f4c9 100644 --- a/packages/components/nodes/multimodal/OpenAI/OpenAIVisionChain.ts +++ b/packages/components/nodes/multimodal/OpenAI/OpenAIVisionChain.ts @@ -24,7 +24,7 @@ class OpenAIVisionChain_Chains implements INode { this.version = 1.0 this.type = 'OpenAIMultiModalChain' this.icon = 'chain.svg' - this.category = 'Chains' + this.category = 'MultiModal' this.badge = 'BETA' this.description = 'Chain to query against Image and Audio Input.' this.baseClasses = [this.type, ...getBaseClasses(VLLMChain)] diff --git a/packages/server/src/index.ts b/packages/server/src/index.ts index eb03f47e..673ba278 100644 --- a/packages/server/src/index.ts +++ b/packages/server/src/index.ts @@ -1456,7 +1456,9 @@ export class App { if (!endingNodeData) return res.status(500).send(`Ending node ${endingNodeId} data not found`) if (endingNodeData && endingNodeData.category !== 'Chains' && endingNodeData.category !== 'Agents' && !isUpsert) { - return res.status(500).send(`Ending node must be either a Chain or Agent`) + if (endingNodeData.type !== 'OpenAIMultiModalChain') { + return res.status(500).send(`Ending node must be either a Chain or Agent`) + } } if ( diff --git a/packages/ui/src/views/chatmessage/ChatMessage.css b/packages/ui/src/views/chatmessage/ChatMessage.css index f1831d39..3b0bb9e3 100644 --- a/packages/ui/src/views/chatmessage/ChatMessage.css +++ b/packages/ui/src/views/chatmessage/ChatMessage.css @@ -119,6 +119,7 @@ .cloud { width: 400px; height: calc(100vh - 260px); + overflow-y: scroll; border-radius: 0.5rem; display: flex; justify-content: center; @@ -169,6 +170,17 @@ } +.preview-card { + border: 2px solid #E7EDF3; + border-radius: 16%; + transition: 0.4s; +} + +.preview-card&:hover { + border-color: #5B9FED; +} + + .button { flex: 0 0 auto; /* Don't grow, don't shrink, base width on content */ margin: 5px; /* Adjust as needed for spacing between buttons */ diff --git a/packages/ui/src/views/chatmessage/ChatMessage.js b/packages/ui/src/views/chatmessage/ChatMessage.js index 37b45bd5..a4a13df0 100644 --- a/packages/ui/src/views/chatmessage/ChatMessage.js +++ b/packages/ui/src/views/chatmessage/ChatMessage.js @@ -14,6 +14,7 @@ import { Box, Button, Card, + CardActions, CardMedia, Chip, CircularProgress, @@ -47,6 +48,7 @@ import { baseURL, maxScroll } from 'store/constant' import robotPNG from 'assets/images/robot.png' import userPNG from 'assets/images/account.png' import { isValidURL, removeDuplicateURL, setLocalStorageChatflow } from 'utils/genericHelper' +import DeleteIcon from '@mui/icons-material/Delete' export const ChatMessage = ({ open, chatflowid, isDialog }) => { const theme = useTheme() @@ -245,7 +247,7 @@ export const ChatMessage = ({ open, chatflowid, isDialog }) => { const previewStyle = { width: '128px', height: '64px', - objectFit: 'cover' // This makes the image cover the area, cropping it if necessary + objectFit: 'fit' // This makes the image cover the area, cropping it if necessary } const messageImageStyle = { width: '128px', @@ -685,13 +687,50 @@ export const ChatMessage = ({ open, chatflowid, isDialog }) => { +
+ {previews && previews.length > 0 && ( +
+
+ + {previews.map((item, index) => ( + <> + {item.mime.startsWith('image/') ? ( + + + + + handleDeletePreview(item)} size='small'> + + + + + + ) : ( + + + + + handleDeletePreview(item)} size='small'> + + + + + + )} + + ))} + +
+
+ )} +
{
-
- {previews && previews.length > 0 && ( - - {previews.map((item, index) => ( - - {item.mime.startsWith('image/') ? ( - - - - ) : ( - // eslint-disable-next-line jsx-a11y/media-has-caption - - )} - - ))} - - )} -
+ setSourceDialogOpen(false)} /> )