From b7ebdca70a104521546a2cf97636e993025d7f32 Mon Sep 17 00:00:00 2001 From: chainchompa Date: Tue, 9 Jul 2024 14:16:02 -0400 Subject: [PATCH 01/48] update image and assets tabs styling --- invokeai/frontend/web/public/locales/en.json | 1 + .../gallery/components/GalleryBoardName.tsx | 48 +++++++-- .../components/ImageGalleryContent.tsx | 102 +++++++++++------- 3 files changed, 103 insertions(+), 48 deletions(-) diff --git a/invokeai/frontend/web/public/locales/en.json b/invokeai/frontend/web/public/locales/en.json index 4b102d6cf3..048b1b4fd9 100644 --- a/invokeai/frontend/web/public/locales/en.json +++ b/invokeai/frontend/web/public/locales/en.json @@ -370,6 +370,7 @@ "deleteImage_other": "Delete {{count}} Images", "deleteImageBin": "Deleted images will be sent to your operating system's Bin.", "deleteImagePermanent": "Deleted images cannot be restored.", + "displaySearch": "Display Search", "download": "Download", "featuresWillReset": "If you delete this image, those features will immediately be reset.", "galleryImageSize": "Image Size", diff --git a/invokeai/frontend/web/src/features/gallery/components/GalleryBoardName.tsx b/invokeai/frontend/web/src/features/gallery/components/GalleryBoardName.tsx index 233aa8a8c1..367bd47008 100644 --- a/invokeai/frontend/web/src/features/gallery/components/GalleryBoardName.tsx +++ b/invokeai/frontend/web/src/features/gallery/components/GalleryBoardName.tsx @@ -1,17 +1,51 @@ -import { Flex, Text } from '@invoke-ai/ui-library'; +import { Button, Flex, Icon, Spacer } from '@invoke-ai/ui-library'; import { useAppSelector } from 'app/store/storeHooks'; -import { memo } from 'react'; +import { memo, useMemo } from 'react'; +import { PiCaretUpBold } from 'react-icons/pi'; import { useBoardName } from 'services/api/hooks/useBoardName'; -const GalleryBoardName = () => { +type Props = { + isOpen: boolean; + onToggle: () => void; +}; + +const GalleryBoardName = (props: Props) => { + const { isOpen, onToggle } = props; const selectedBoardId = useAppSelector((s) => s.gallery.selectedBoardId); const boardName = useBoardName(selectedBoardId); + const formattedBoardName = useMemo(() => { + if (boardName.length > 20) { + return `${boardName.substring(0, 20)}...`; + } + return boardName; + }, [boardName]); + return ( - - - {boardName} - + + + {formattedBoardName} + + ); }; diff --git a/invokeai/frontend/web/src/features/gallery/components/ImageGalleryContent.tsx b/invokeai/frontend/web/src/features/gallery/components/ImageGalleryContent.tsx index 665d96a006..eaefe9cd80 100644 --- a/invokeai/frontend/web/src/features/gallery/components/ImageGalleryContent.tsx +++ b/invokeai/frontend/web/src/features/gallery/components/ImageGalleryContent.tsx @@ -1,24 +1,47 @@ -import { Button, ButtonGroup, Flex, Tab, TabList, Tabs } from '@invoke-ai/ui-library'; +import type { ChakraProps } from '@invoke-ai/ui-library'; +import { Box, Collapse, Flex, IconButton, Tab, TabList, Tabs, useDisclosure } from '@invoke-ai/ui-library'; import { useStore } from '@nanostores/react'; import { $galleryHeader } from 'app/store/nanostores/galleryHeader'; import { useAppDispatch, useAppSelector } from 'app/store/storeHooks'; import { galleryViewChanged } from 'features/gallery/store/gallerySlice'; import { memo, useCallback } from 'react'; import { useTranslation } from 'react-i18next'; -import { PiImagesBold } from 'react-icons/pi'; -import { RiServerLine } from 'react-icons/ri'; +import { PiImagesBold, PiMagnifyingGlassBold } from 'react-icons/pi'; import BoardsList from './Boards/BoardsList/BoardsList'; import GalleryBoardName from './GalleryBoardName'; import GalleryImageGrid from './ImageGrid/GalleryImageGrid'; import { GalleryPagination } from './ImageGrid/GalleryPagination'; import { GallerySearch } from './ImageGrid/GallerySearch'; +import GallerySettingsPopover from './GallerySettingsPopover/GallerySettingsPopover'; + +const baseStyles: ChakraProps['sx'] = { + fontWeight: 'semibold', + fontSize: 'md', + color: 'base.300', + borderBottom: '1px solid', + borderBottomColor: 'invokeBlue.800', +}; + +const selectedStyles: ChakraProps['sx'] = { + borderColor: 'invokeBlue.800', + borderBottomColor: 'base.850', + color: 'invokeBlue.300', +}; + +const searchIconStyles: ChakraProps['sx'] = { + borderBottom: '1px solid', + borderBottomColor: 'invokeBlue.800', + maxW: '16', +}; const ImageGalleryContent = () => { const { t } = useTranslation(); const galleryView = useAppSelector((s) => s.gallery.galleryView); const dispatch = useAppDispatch(); const galleryHeader = useStore($galleryHeader); + const searchDisclosure = useDisclosure({ defaultIsOpen: false }); + const { isOpen: isBoardListOpen, onToggle: onToggleBoardList } = useDisclosure({ defaultIsOpen: true }); const handleClickImages = useCallback(() => { dispatch(galleryViewChanged('images')); @@ -29,51 +52,48 @@ const ImageGalleryContent = () => { }, [dispatch]); return ( - + {galleryHeader} - - - - - - } - data-testid="images-tab" - > + + + + + + + + + + {t('parameters.images')} - - } - data-testid="assets-tab" - > + + + + + {t('gallery.assets')} - - + + + + } + fontSize={16} + textAlign="center" + color="base.400" + variant="unstyled" + minW="unset" + /> + - - + + + + + From f193a576a6e6605bab4dd8546a82174e977072b1 Mon Sep 17 00:00:00 2001 From: chainchompa Date: Tue, 9 Jul 2024 14:25:13 -0400 Subject: [PATCH 02/48] move boardname back and make collapsible again --- .../Boards/BoardsList/BoardsList.tsx | 165 +++++++++--------- .../gallery/components/GalleryBoardName.tsx | 1 - 2 files changed, 84 insertions(+), 82 deletions(-) diff --git a/invokeai/frontend/web/src/features/gallery/components/Boards/BoardsList/BoardsList.tsx b/invokeai/frontend/web/src/features/gallery/components/Boards/BoardsList/BoardsList.tsx index 6f37dbcdb5..f3aa7e788f 100644 --- a/invokeai/frontend/web/src/features/gallery/components/Boards/BoardsList/BoardsList.tsx +++ b/invokeai/frontend/web/src/features/gallery/components/Boards/BoardsList/BoardsList.tsx @@ -3,7 +3,6 @@ import { EMPTY_ARRAY } from 'app/store/constants'; import { useAppSelector } from 'app/store/storeHooks'; import { overlayScrollbarsParams } from 'common/components/OverlayScrollbars/constants'; import DeleteBoardModal from 'features/gallery/components/Boards/DeleteBoardModal'; -import GallerySettingsPopover from 'features/gallery/components/GallerySettingsPopover/GallerySettingsPopover'; import { selectListBoardsQueryArgs } from 'features/gallery/store/gallerySelectors'; import { OverlayScrollbarsComponent } from 'overlayscrollbars-react'; import type { CSSProperties } from 'react'; @@ -23,7 +22,12 @@ const overlayScrollbarsStyles: CSSProperties = { width: '100%', }; -const BoardsList = () => { +type Props = { + isOpen: boolean; +}; + +const BoardsList = (props: Props) => { + const { isOpen } = props; const selectedBoardId = useAppSelector((s) => s.gallery.selectedBoardId); const boardSearchText = useAppSelector((s) => s.gallery.boardSearchText); const allowPrivateBoards = useAppSelector((s) => s.config.allowPrivateBoards); @@ -45,88 +49,87 @@ const BoardsList = () => { return ( <> - - + + - - - {allowPrivateBoards && ( - <> - - - - - {t('boards.private')} - - - - - - - - {allowPrivateBoards && } - {filteredPrivateBoards.map((board) => ( - - ))} + {allowPrivateBoards && ( + <> + + + + + {t('boards.private')} + - - - - )} - - - - - {allowPrivateBoards ? t('boards.shared') : t('boards.boards')} - - - - - - - - {!allowPrivateBoards && } - {filteredSharedBoards.map((board) => ( - - ))} + + + + + + {allowPrivateBoards && } + {filteredPrivateBoards.map((board) => ( + + ))} + + + + + )} + + + + + {allowPrivateBoards ? t('boards.shared') : t('boards.boards')} + - - - + + + + + + {!allowPrivateBoards && } + {filteredSharedBoards.map((board) => ( + + ))} + + + + + ); diff --git a/invokeai/frontend/web/src/features/gallery/components/GalleryBoardName.tsx b/invokeai/frontend/web/src/features/gallery/components/GalleryBoardName.tsx index 367bd47008..7b3d2e3537 100644 --- a/invokeai/frontend/web/src/features/gallery/components/GalleryBoardName.tsx +++ b/invokeai/frontend/web/src/features/gallery/components/GalleryBoardName.tsx @@ -32,7 +32,6 @@ const GalleryBoardName = (props: Props) => { w="full" justifyContent="center" alignItems="center" - px={2} fontSize="md" color="base.50" > From cdacf2ecd022da3a255c288bf400b8189b202498 Mon Sep 17 00:00:00 2001 From: chainchompa Date: Tue, 9 Jul 2024 14:31:40 -0400 Subject: [PATCH 03/48] clear out boards search when adding a new board --- .../gallery/components/Boards/BoardsList/AddBoardButton.tsx | 4 +++- .../src/features/gallery/components/ImageGalleryContent.tsx | 2 +- 2 files changed, 4 insertions(+), 2 deletions(-) diff --git a/invokeai/frontend/web/src/features/gallery/components/Boards/BoardsList/AddBoardButton.tsx b/invokeai/frontend/web/src/features/gallery/components/Boards/BoardsList/AddBoardButton.tsx index c6ddb85daa..15490d8081 100644 --- a/invokeai/frontend/web/src/features/gallery/components/Boards/BoardsList/AddBoardButton.tsx +++ b/invokeai/frontend/web/src/features/gallery/components/Boards/BoardsList/AddBoardButton.tsx @@ -1,6 +1,6 @@ import { IconButton } from '@invoke-ai/ui-library'; import { useAppDispatch, useAppSelector } from 'app/store/storeHooks'; -import { boardIdSelected } from 'features/gallery/store/gallerySlice'; +import { boardIdSelected, boardSearchTextChanged } from 'features/gallery/store/gallerySlice'; import { memo, useCallback, useMemo } from 'react'; import { useTranslation } from 'react-i18next'; import { PiPlusBold } from 'react-icons/pi'; @@ -24,10 +24,12 @@ const AddBoardButton = ({ isPrivateBoard }: Props) => { } return t('boards.addSharedBoard'); }, [allowPrivateBoards, isPrivateBoard, t]); + const handleCreateBoard = useCallback(async () => { try { const board = await createBoard({ board_name: t('boards.myBoard'), is_private: isPrivateBoard }).unwrap(); dispatch(boardIdSelected({ boardId: board.board_id })); + dispatch(boardSearchTextChanged('')); } catch { //no-op } diff --git a/invokeai/frontend/web/src/features/gallery/components/ImageGalleryContent.tsx b/invokeai/frontend/web/src/features/gallery/components/ImageGalleryContent.tsx index eaefe9cd80..44f3f8d6d9 100644 --- a/invokeai/frontend/web/src/features/gallery/components/ImageGalleryContent.tsx +++ b/invokeai/frontend/web/src/features/gallery/components/ImageGalleryContent.tsx @@ -10,10 +10,10 @@ import { PiImagesBold, PiMagnifyingGlassBold } from 'react-icons/pi'; import BoardsList from './Boards/BoardsList/BoardsList'; import GalleryBoardName from './GalleryBoardName'; +import GallerySettingsPopover from './GallerySettingsPopover/GallerySettingsPopover'; import GalleryImageGrid from './ImageGrid/GalleryImageGrid'; import { GalleryPagination } from './ImageGrid/GalleryPagination'; import { GallerySearch } from './ImageGrid/GallerySearch'; -import GallerySettingsPopover from './GallerySettingsPopover/GallerySettingsPopover'; const baseStyles: ChakraProps['sx'] = { fontWeight: 'semibold', From 8826adad24db86308aa3c199719d8074870d504c Mon Sep 17 00:00:00 2001 From: chainchompa Date: Tue, 9 Jul 2024 14:52:03 -0400 Subject: [PATCH 04/48] filter out uncategorized when not included in search --- .../components/Boards/BoardsList/BoardsList.tsx | 2 +- .../components/Boards/BoardsList/NoBoardBoard.tsx | 11 +++++++++++ 2 files changed, 12 insertions(+), 1 deletion(-) diff --git a/invokeai/frontend/web/src/features/gallery/components/Boards/BoardsList/BoardsList.tsx b/invokeai/frontend/web/src/features/gallery/components/Boards/BoardsList/BoardsList.tsx index f3aa7e788f..7b572bd9ec 100644 --- a/invokeai/frontend/web/src/features/gallery/components/Boards/BoardsList/BoardsList.tsx +++ b/invokeai/frontend/web/src/features/gallery/components/Boards/BoardsList/BoardsList.tsx @@ -83,7 +83,7 @@ const BoardsList = (props: Props) => { options={overlayScrollbarsParams.options} > - {allowPrivateBoards && } + {filteredPrivateBoards.map((board) => ( { }); const autoAddBoardId = useAppSelector((s) => s.gallery.autoAddBoardId); const autoAssignBoardOnClick = useAppSelector((s) => s.gallery.autoAssignBoardOnClick); + const boardSearchText = useAppSelector((s) => s.gallery.boardSearchText); const boardName = useBoardName('none'); const handleSelectBoard = useCallback(() => { dispatch(boardIdSelected({ boardId: 'none' })); @@ -44,7 +45,17 @@ const NoBoardBoard = memo(({ isSelected }: Props) => { }), [] ); + + const filteredOut = useMemo(() => { + return boardSearchText ? !boardName.toLowerCase().includes(boardSearchText.toLowerCase()) : false; + }, [boardName, boardSearchText]); + const { t } = useTranslation(); + + if (filteredOut) { + return null; + } + return ( {(ref) => ( From a96e34d2d191944ce58785477e4837c6c5600790 Mon Sep 17 00:00:00 2001 From: chainchompa Date: Tue, 9 Jul 2024 18:46:26 -0400 Subject: [PATCH 05/48] remove collapsibles and update board title --- .../Boards/BoardsList/BoardsList.tsx | 111 ++++++------------ .../gallery/components/GalleryBoardName.tsx | 47 ++------ .../components/ImageGalleryContent.tsx | 5 +- 3 files changed, 42 insertions(+), 121 deletions(-) diff --git a/invokeai/frontend/web/src/features/gallery/components/Boards/BoardsList/BoardsList.tsx b/invokeai/frontend/web/src/features/gallery/components/Boards/BoardsList/BoardsList.tsx index 7b572bd9ec..9dfb4a2860 100644 --- a/invokeai/frontend/web/src/features/gallery/components/Boards/BoardsList/BoardsList.tsx +++ b/invokeai/frontend/web/src/features/gallery/components/Boards/BoardsList/BoardsList.tsx @@ -1,4 +1,4 @@ -import { Collapse, Flex, Icon, Text, useDisclosure } from '@invoke-ai/ui-library'; +import { Flex, Icon, Text, useDisclosure } from '@invoke-ai/ui-library'; import { EMPTY_ARRAY } from 'app/store/constants'; import { useAppSelector } from 'app/store/storeHooks'; import { overlayScrollbarsParams } from 'common/components/OverlayScrollbars/constants'; @@ -22,20 +22,13 @@ const overlayScrollbarsStyles: CSSProperties = { width: '100%', }; -type Props = { - isOpen: boolean; -}; - -const BoardsList = (props: Props) => { - const { isOpen } = props; +const BoardsList = () => { const selectedBoardId = useAppSelector((s) => s.gallery.selectedBoardId); const boardSearchText = useAppSelector((s) => s.gallery.boardSearchText); const allowPrivateBoards = useAppSelector((s) => s.config.allowPrivateBoards); const queryArgs = useAppSelector(selectListBoardsQueryArgs); const { data: boards } = useListAllBoardsQuery(queryArgs); const [boardToDelete, setBoardToDelete] = useState(); - const privateBoardsDisclosure = useDisclosure({ defaultIsOpen: false }); - const sharedBoardsDisclosure = useDisclosure({ defaultIsOpen: false }); const { t } = useTranslation(); const { filteredPrivateBoards, filteredSharedBoards } = useMemo(() => { @@ -49,75 +42,20 @@ const BoardsList = (props: Props) => { return ( <> - - - + + + {allowPrivateBoards && ( <> - - - - - {t('boards.private')} - - + + + {t('boards.private')} + - - - - - {filteredPrivateBoards.map((board) => ( - - ))} - - - - - )} - - - - - {allowPrivateBoards ? t('boards.shared') : t('boards.boards')} - - - - - - - - {!allowPrivateBoards && } - {filteredSharedBoards.map((board) => ( + + + {filteredPrivateBoards.map((board) => ( { /> ))} - - - - + + )} + + + {allowPrivateBoards ? t('boards.shared') : t('boards.boards')} + + + + + {!allowPrivateBoards && } + {filteredSharedBoards.map((board) => ( + + ))} + + + ); diff --git a/invokeai/frontend/web/src/features/gallery/components/GalleryBoardName.tsx b/invokeai/frontend/web/src/features/gallery/components/GalleryBoardName.tsx index 7b3d2e3537..9e9d8bee39 100644 --- a/invokeai/frontend/web/src/features/gallery/components/GalleryBoardName.tsx +++ b/invokeai/frontend/web/src/features/gallery/components/GalleryBoardName.tsx @@ -1,50 +1,17 @@ -import { Button, Flex, Icon, Spacer } from '@invoke-ai/ui-library'; +import { Flex, Text } from '@invoke-ai/ui-library'; import { useAppSelector } from 'app/store/storeHooks'; -import { memo, useMemo } from 'react'; -import { PiCaretUpBold } from 'react-icons/pi'; +import { memo } from 'react'; import { useBoardName } from 'services/api/hooks/useBoardName'; -type Props = { - isOpen: boolean; - onToggle: () => void; -}; - -const GalleryBoardName = (props: Props) => { - const { isOpen, onToggle } = props; +const GalleryBoardName = () => { const selectedBoardId = useAppSelector((s) => s.gallery.selectedBoardId); const boardName = useBoardName(selectedBoardId); - const formattedBoardName = useMemo(() => { - if (boardName.length > 20) { - return `${boardName.substring(0, 20)}...`; - } - return boardName; - }, [boardName]); - return ( - - - {formattedBoardName} - - + + + {boardName} + ); }; diff --git a/invokeai/frontend/web/src/features/gallery/components/ImageGalleryContent.tsx b/invokeai/frontend/web/src/features/gallery/components/ImageGalleryContent.tsx index 44f3f8d6d9..74901b0f58 100644 --- a/invokeai/frontend/web/src/features/gallery/components/ImageGalleryContent.tsx +++ b/invokeai/frontend/web/src/features/gallery/components/ImageGalleryContent.tsx @@ -41,7 +41,6 @@ const ImageGalleryContent = () => { const dispatch = useAppDispatch(); const galleryHeader = useStore($galleryHeader); const searchDisclosure = useDisclosure({ defaultIsOpen: false }); - const { isOpen: isBoardListOpen, onToggle: onToggleBoardList } = useDisclosure({ defaultIsOpen: true }); const handleClickImages = useCallback(() => { dispatch(galleryViewChanged('images')); @@ -55,10 +54,10 @@ const ImageGalleryContent = () => { {galleryHeader} - + - + From 8fdff33cf8347d5f4c9dc7c0d8629eef7cf84cdc Mon Sep 17 00:00:00 2001 From: chainchompa Date: Tue, 9 Jul 2024 21:41:03 -0400 Subject: [PATCH 06/48] update board header styling, toggle board search, resizing gallery panels --- invokeai/frontend/web/public/locales/en.json | 1 + .../Boards/BoardsList/BoardsList.tsx | 9 +- .../components/ImageGalleryContent.tsx | 110 +++++++++++------- 3 files changed, 72 insertions(+), 48 deletions(-) diff --git a/invokeai/frontend/web/public/locales/en.json b/invokeai/frontend/web/public/locales/en.json index 048b1b4fd9..daa229e7c5 100644 --- a/invokeai/frontend/web/public/locales/en.json +++ b/invokeai/frontend/web/public/locales/en.json @@ -370,6 +370,7 @@ "deleteImage_other": "Delete {{count}} Images", "deleteImageBin": "Deleted images will be sent to your operating system's Bin.", "deleteImagePermanent": "Deleted images cannot be restored.", + "displayBoardSearch": "Display Board Search", "displaySearch": "Display Search", "download": "Download", "featuresWillReset": "If you delete this image, those features will immediately be reset.", diff --git a/invokeai/frontend/web/src/features/gallery/components/Boards/BoardsList/BoardsList.tsx b/invokeai/frontend/web/src/features/gallery/components/Boards/BoardsList/BoardsList.tsx index 9dfb4a2860..1395248950 100644 --- a/invokeai/frontend/web/src/features/gallery/components/Boards/BoardsList/BoardsList.tsx +++ b/invokeai/frontend/web/src/features/gallery/components/Boards/BoardsList/BoardsList.tsx @@ -1,4 +1,4 @@ -import { Flex, Icon, Text, useDisclosure } from '@invoke-ai/ui-library'; +import { Flex, Text } from '@invoke-ai/ui-library'; import { EMPTY_ARRAY } from 'app/store/constants'; import { useAppSelector } from 'app/store/storeHooks'; import { overlayScrollbarsParams } from 'common/components/OverlayScrollbars/constants'; @@ -8,12 +8,10 @@ import { OverlayScrollbarsComponent } from 'overlayscrollbars-react'; import type { CSSProperties } from 'react'; import { memo, useMemo, useState } from 'react'; import { useTranslation } from 'react-i18next'; -import { PiCaretUpBold } from 'react-icons/pi'; import { useListAllBoardsQuery } from 'services/api/endpoints/boards'; import type { BoardDTO } from 'services/api/types'; import AddBoardButton from './AddBoardButton'; -import BoardsSearch from './BoardsSearch'; import GalleryBoard from './GalleryBoard'; import NoBoardBoard from './NoBoardBoard'; @@ -42,8 +40,7 @@ const BoardsList = () => { return ( <> - - + {allowPrivateBoards && ( <> @@ -53,7 +50,7 @@ const BoardsList = () => { - + {filteredPrivateBoards.map((board) => ( { const dispatch = useAppDispatch(); const galleryHeader = useStore($galleryHeader); const searchDisclosure = useDisclosure({ defaultIsOpen: false }); + const boardSearchDisclosure = useDisclosure({ defaultIsOpen: false }); const handleClickImages = useCallback(() => { dispatch(galleryViewChanged('images')); @@ -50,51 +54,73 @@ const ImageGalleryContent = () => { dispatch(galleryViewChanged('assets')); }, [dispatch]); + const panelGroupRef = useRef(null); + return ( - {galleryHeader} - - - - - - - - - - - {t('parameters.images')} - - - - - - {t('gallery.assets')} - - - - } - fontSize={16} - textAlign="center" - color="base.400" - variant="unstyled" - minW="unset" - /> - - - + {galleryHeader} + + + + } + size="sm" + /> - - - - - - - + + + + + + + + + + + + + + + + + + {t('parameters.images')} + + + + + + {t('gallery.assets')} + + + + } + fontSize={16} + textAlign="center" + color="base.400" + variant="unstyled" + minW="unset" + /> + + + + + + + + + + + + + ); }; From 58d2c1557dd609bc56edc993b640f02a46909a2a Mon Sep 17 00:00:00 2001 From: chainchompa Date: Tue, 9 Jul 2024 21:42:01 -0400 Subject: [PATCH 07/48] prettier --- .../features/gallery/components/ImageGalleryContent.tsx | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/invokeai/frontend/web/src/features/gallery/components/ImageGalleryContent.tsx b/invokeai/frontend/web/src/features/gallery/components/ImageGalleryContent.tsx index 1988653eea..7e6148e735 100644 --- a/invokeai/frontend/web/src/features/gallery/components/ImageGalleryContent.tsx +++ b/invokeai/frontend/web/src/features/gallery/components/ImageGalleryContent.tsx @@ -73,10 +73,10 @@ const ImageGalleryContent = () => { - - - - + + + + From 2edfb2356d87d2dea55fae51185c0a7045fa78bb Mon Sep 17 00:00:00 2001 From: chainchompa Date: Tue, 9 Jul 2024 23:12:34 -0400 Subject: [PATCH 08/48] remove extra boardname --- .../web/src/features/gallery/components/ImageGalleryContent.tsx | 1 - 1 file changed, 1 deletion(-) diff --git a/invokeai/frontend/web/src/features/gallery/components/ImageGalleryContent.tsx b/invokeai/frontend/web/src/features/gallery/components/ImageGalleryContent.tsx index 7e6148e735..9cc268e7e1 100644 --- a/invokeai/frontend/web/src/features/gallery/components/ImageGalleryContent.tsx +++ b/invokeai/frontend/web/src/features/gallery/components/ImageGalleryContent.tsx @@ -61,7 +61,6 @@ const ImageGalleryContent = () => { {galleryHeader} - Date: Wed, 10 Jul 2024 16:16:53 +1000 Subject: [PATCH 09/48] feat(ui): remove galleryHeader in favor of projectUrl & projectName --- .../web/src/app/components/InvokeAIUI.tsx | 27 ++++++++++++------- .../src/app/store/nanostores/galleryHeader.ts | 4 --- .../web/src/app/store/nanostores/projectId.ts | 3 +++ 3 files changed, 20 insertions(+), 14 deletions(-) delete mode 100644 invokeai/frontend/web/src/app/store/nanostores/galleryHeader.ts diff --git a/invokeai/frontend/web/src/app/components/InvokeAIUI.tsx b/invokeai/frontend/web/src/app/components/InvokeAIUI.tsx index 12611943bc..1dd1a265fb 100644 --- a/invokeai/frontend/web/src/app/components/InvokeAIUI.tsx +++ b/invokeai/frontend/web/src/app/components/InvokeAIUI.tsx @@ -7,11 +7,10 @@ import { $baseUrl } from 'app/store/nanostores/baseUrl'; import { $customNavComponent } from 'app/store/nanostores/customNavComponent'; import type { CustomStarUi } from 'app/store/nanostores/customStarUI'; import { $customStarUI } from 'app/store/nanostores/customStarUI'; -import { $galleryHeader } from 'app/store/nanostores/galleryHeader'; import { $isDebugging } from 'app/store/nanostores/isDebugging'; import { $logo } from 'app/store/nanostores/logo'; import { $openAPISchemaUrl } from 'app/store/nanostores/openAPISchemaUrl'; -import { $projectId } from 'app/store/nanostores/projectId'; +import { $projectId, $projectName, $projectUrl } from 'app/store/nanostores/projectId'; import { $queueId, DEFAULT_QUEUE_ID } from 'app/store/nanostores/queueId'; import { $store } from 'app/store/nanostores/store'; import { $workflowCategories } from 'app/store/nanostores/workflowCategories'; @@ -37,7 +36,8 @@ interface Props extends PropsWithChildren { customNavComponent?: ReactNode; middleware?: Middleware[]; projectId?: string; - galleryHeader?: ReactNode; + projectName?: string; + projectUrl?: string; queueId?: string; selectedImage?: { imageName: string; @@ -58,7 +58,8 @@ const InvokeAIUI = ({ customNavComponent, middleware, projectId, - galleryHeader, + projectName, + projectUrl, queueId, selectedImage, customStarUi, @@ -108,7 +109,7 @@ const InvokeAIUI = ({ $projectId.set(undefined); $queueId.set(DEFAULT_QUEUE_ID); }; - }, [apiUrl, token, middleware, projectId, queueId]); + }, [apiUrl, token, middleware, projectId, queueId, projectName, projectUrl]); useEffect(() => { if (customStarUi) { @@ -141,14 +142,20 @@ const InvokeAIUI = ({ }, [openAPISchemaUrl]); useEffect(() => { - if (galleryHeader) { - $galleryHeader.set(galleryHeader); - } + $projectName.set(projectName); return () => { - $galleryHeader.set(undefined); + $projectName.set(undefined); }; - }, [galleryHeader]); + }, [projectName]); + + useEffect(() => { + $projectUrl.set(projectUrl); + + return () => { + $projectUrl.set(undefined); + }; + }, [projectUrl]); useEffect(() => { if (logo) { diff --git a/invokeai/frontend/web/src/app/store/nanostores/galleryHeader.ts b/invokeai/frontend/web/src/app/store/nanostores/galleryHeader.ts deleted file mode 100644 index 5de7b1dd40..0000000000 --- a/invokeai/frontend/web/src/app/store/nanostores/galleryHeader.ts +++ /dev/null @@ -1,4 +0,0 @@ -import { atom } from 'nanostores'; -import type { ReactNode } from 'react'; - -export const $galleryHeader = atom(undefined); diff --git a/invokeai/frontend/web/src/app/store/nanostores/projectId.ts b/invokeai/frontend/web/src/app/store/nanostores/projectId.ts index 2268ccdff1..c2b14e91ac 100644 --- a/invokeai/frontend/web/src/app/store/nanostores/projectId.ts +++ b/invokeai/frontend/web/src/app/store/nanostores/projectId.ts @@ -4,3 +4,6 @@ import { atom } from 'nanostores'; * The optional project-id header. */ export const $projectId = atom(); + +export const $projectName = atom(); +export const $projectUrl = atom(); From 48a57f0da88f34d838176578f72027c69bbce60f Mon Sep 17 00:00:00 2001 From: psychedelicious <4822129+psychedelicious@users.noreply.github.com> Date: Wed, 10 Jul 2024 16:20:01 +1000 Subject: [PATCH 10/48] feat(ui): boards styling - Refine layout - Update colors - more minimal, fewer shaded boxes - Add indicator for search icons showing a search term is entered - Handle new `projectName` and `projectUrl` ui props --- .../Boards/BoardsList/BoardsList.tsx | 6 +- .../Boards/BoardsList/BoardsSearch.tsx | 2 +- .../Boards/BoardsList/GalleryBoard.tsx | 12 +- .../Boards/BoardsList/NoBoardBoard.tsx | 4 +- .../gallery/components/GalleryBoardName.tsx | 11 +- .../gallery/components/GalleryHeader.tsx | 30 +++++ .../GallerySettingsPopover.tsx | 2 +- .../components/ImageGalleryContent.tsx | 112 ++++++++++-------- .../components/ImageGrid/GalleryImageGrid.tsx | 2 +- 9 files changed, 112 insertions(+), 69 deletions(-) create mode 100644 invokeai/frontend/web/src/features/gallery/components/GalleryHeader.tsx diff --git a/invokeai/frontend/web/src/features/gallery/components/Boards/BoardsList/BoardsList.tsx b/invokeai/frontend/web/src/features/gallery/components/Boards/BoardsList/BoardsList.tsx index 1395248950..dd34cba93b 100644 --- a/invokeai/frontend/web/src/features/gallery/components/Boards/BoardsList/BoardsList.tsx +++ b/invokeai/frontend/web/src/features/gallery/components/Boards/BoardsList/BoardsList.tsx @@ -40,11 +40,11 @@ const BoardsList = () => { return ( <> - + {allowPrivateBoards && ( <> - + {t('boards.private')} @@ -63,7 +63,7 @@ const BoardsList = () => { )} - + {allowPrivateBoards ? t('boards.shared') : t('boards.boards')} diff --git a/invokeai/frontend/web/src/features/gallery/components/Boards/BoardsList/BoardsSearch.tsx b/invokeai/frontend/web/src/features/gallery/components/Boards/BoardsList/BoardsSearch.tsx index 931c1e6cbb..fb53a13795 100644 --- a/invokeai/frontend/web/src/features/gallery/components/Boards/BoardsList/BoardsSearch.tsx +++ b/invokeai/frontend/web/src/features/gallery/components/Boards/BoardsList/BoardsSearch.tsx @@ -40,7 +40,7 @@ const BoardsSearch = () => { ); return ( - + @@ -147,13 +147,7 @@ const GalleryBoard = ({ board, isSelected, setBoardToDelete }: GalleryBoardProps {autoAddBoardId === board.board_id && !editingDisclosure.isOpen && } - {board.archived && !editingDisclosure.isOpen && ( - - )} + {board.archived && !editingDisclosure.isOpen && } {!editingDisclosure.isOpen && {board.image_count}} {t('unifiedCanvas.move')}} /> diff --git a/invokeai/frontend/web/src/features/gallery/components/Boards/BoardsList/NoBoardBoard.tsx b/invokeai/frontend/web/src/features/gallery/components/Boards/BoardsList/NoBoardBoard.tsx index 6c051cd42d..fb10c23824 100644 --- a/invokeai/frontend/web/src/features/gallery/components/Boards/BoardsList/NoBoardBoard.tsx +++ b/invokeai/frontend/web/src/features/gallery/components/Boards/BoardsList/NoBoardBoard.tsx @@ -17,7 +17,7 @@ interface Props { } const _hover: SystemStyleObject = { - bg: 'base.800', + bg: 'base.850', }; const NoBoardBoard = memo(({ isSelected }: Props) => { @@ -71,7 +71,7 @@ const NoBoardBoard = memo(({ isSelected }: Props) => { px={2} py={1} gap={2} - bg={isSelected ? 'base.800' : undefined} + bg={isSelected ? 'base.850' : undefined} _hover={_hover} > diff --git a/invokeai/frontend/web/src/features/gallery/components/GalleryBoardName.tsx b/invokeai/frontend/web/src/features/gallery/components/GalleryBoardName.tsx index 9e9d8bee39..a680d2b19a 100644 --- a/invokeai/frontend/web/src/features/gallery/components/GalleryBoardName.tsx +++ b/invokeai/frontend/web/src/features/gallery/components/GalleryBoardName.tsx @@ -8,7 +8,16 @@ const GalleryBoardName = () => { const boardName = useBoardName(selectedBoardId); return ( - + {boardName} diff --git a/invokeai/frontend/web/src/features/gallery/components/GalleryHeader.tsx b/invokeai/frontend/web/src/features/gallery/components/GalleryHeader.tsx new file mode 100644 index 0000000000..4ae4962016 --- /dev/null +++ b/invokeai/frontend/web/src/features/gallery/components/GalleryHeader.tsx @@ -0,0 +1,30 @@ +import { Flex, Link, Text } from '@invoke-ai/ui-library'; +import { useStore } from '@nanostores/react'; +import { $projectName, $projectUrl } from 'app/store/nanostores/projectId'; +import { memo } from 'react'; + +import GalleryBoardName from './GalleryBoardName'; + +const GalleryHeader = () => { + const projectName = useStore($projectName); + const projectUrl = useStore($projectUrl); + + if (projectName && projectUrl) { + return ( + + + {projectName} + + + + ); + } + + return ( + + + + ); +}; + +export default memo(GalleryHeader); diff --git a/invokeai/frontend/web/src/features/gallery/components/GallerySettingsPopover/GallerySettingsPopover.tsx b/invokeai/frontend/web/src/features/gallery/components/GallerySettingsPopover/GallerySettingsPopover.tsx index b03c606eb6..c6a4005f15 100644 --- a/invokeai/frontend/web/src/features/gallery/components/GallerySettingsPopover/GallerySettingsPopover.tsx +++ b/invokeai/frontend/web/src/features/gallery/components/GallerySettingsPopover/GallerySettingsPopover.tsx @@ -17,7 +17,7 @@ const GallerySettingsPopover = () => { return ( - } /> + } variant="link" h="full" /> diff --git a/invokeai/frontend/web/src/features/gallery/components/ImageGalleryContent.tsx b/invokeai/frontend/web/src/features/gallery/components/ImageGalleryContent.tsx index 9cc268e7e1..6e4a5bf735 100644 --- a/invokeai/frontend/web/src/features/gallery/components/ImageGalleryContent.tsx +++ b/invokeai/frontend/web/src/features/gallery/components/ImageGalleryContent.tsx @@ -1,18 +1,16 @@ import type { ChakraProps } from '@invoke-ai/ui-library'; -import { Box, Collapse, Flex, IconButton, Tab, TabList, Tabs, useDisclosure } from '@invoke-ai/ui-library'; -import { useStore } from '@nanostores/react'; -import { $galleryHeader } from 'app/store/nanostores/galleryHeader'; +import { Box, Collapse, Flex, IconButton, Spacer, Tab, TabList, Tabs, useDisclosure } from '@invoke-ai/ui-library'; import { useAppDispatch, useAppSelector } from 'app/store/storeHooks'; +import GalleryHeader from 'features/gallery/components/GalleryHeader'; import { galleryViewChanged } from 'features/gallery/store/gallerySlice'; import ResizeHandle from 'features/ui/components/tabs/ResizeHandle'; import { memo, useCallback, useRef } from 'react'; import { useTranslation } from 'react-i18next'; -import { PiImagesBold, PiMagnifyingGlassBold } from 'react-icons/pi'; +import { PiMagnifyingGlassBold } from 'react-icons/pi'; import { Panel, PanelGroup } from 'react-resizable-panels'; import BoardsList from './Boards/BoardsList/BoardsList'; import BoardsSearch from './Boards/BoardsList/BoardsSearch'; -import GalleryBoardName from './GalleryBoardName'; import GallerySettingsPopover from './GallerySettingsPopover/GallerySettingsPopover'; import GalleryImageGrid from './ImageGrid/GalleryImageGrid'; import { GalleryPagination } from './ImageGrid/GalleryPagination'; @@ -20,29 +18,22 @@ import { GallerySearch } from './ImageGrid/GallerySearch'; const baseStyles: ChakraProps['sx'] = { fontWeight: 'semibold', - fontSize: 'md', + fontSize: 'sm', color: 'base.300', - borderBottom: '1px solid', - borderBottomColor: 'invokeBlue.800', }; const selectedStyles: ChakraProps['sx'] = { - borderColor: 'invokeBlue.800', - borderBottomColor: 'base.850', + borderColor: 'base.800', + borderBottomColor: 'base.900', color: 'invokeBlue.300', }; -const searchIconStyles: ChakraProps['sx'] = { - borderBottom: '1px solid', - borderBottomColor: 'invokeBlue.800', - maxW: '16', -}; - const ImageGalleryContent = () => { const { t } = useTranslation(); const galleryView = useAppSelector((s) => s.gallery.galleryView); + const searchTerm = useAppSelector((s) => s.gallery.searchTerm); + const boardSearchText = useAppSelector((s) => s.gallery.boardSearchText); const dispatch = useAppDispatch(); - const galleryHeader = useStore($galleryHeader); const searchDisclosure = useDisclosure({ defaultIsOpen: false }); const boardSearchDisclosure = useDisclosure({ defaultIsOpen: false }); @@ -57,62 +48,81 @@ const ImageGalleryContent = () => { const panelGroupRef = useRef(null); return ( - - - {galleryHeader} - + + + - } - size="sm" - /> + + } + variant="link" + /> + {boardSearchText && ( + + )} + - - - + - - - + + + - - - {t('parameters.images')} - + {t('parameters.images')} - - - {t('gallery.assets')} - + {t('gallery.assets')} - + + } - fontSize={16} - textAlign="center" - color="base.400" - variant="unstyled" - minW="unset" + variant="link" /> - + {searchTerm && ( + + )} + - + - + + + diff --git a/invokeai/frontend/web/src/features/gallery/components/ImageGrid/GalleryImageGrid.tsx b/invokeai/frontend/web/src/features/gallery/components/ImageGrid/GalleryImageGrid.tsx index 0be30505d5..9e0ba18f8a 100644 --- a/invokeai/frontend/web/src/features/gallery/components/ImageGrid/GalleryImageGrid.tsx +++ b/invokeai/frontend/web/src/features/gallery/components/ImageGrid/GalleryImageGrid.tsx @@ -124,7 +124,7 @@ const Content = () => { }, [calculateNewLimit, container, dispatch]); return ( - + Date: Wed, 10 Jul 2024 17:28:49 +1000 Subject: [PATCH 11/48] feat(ui): rename gallery boards on double click --- .../Boards/BoardsList/GalleryBoard.tsx | 46 +++++++++++++++---- 1 file changed, 36 insertions(+), 10 deletions(-) diff --git a/invokeai/frontend/web/src/features/gallery/components/Boards/BoardsList/GalleryBoard.tsx b/invokeai/frontend/web/src/features/gallery/components/Boards/BoardsList/GalleryBoard.tsx index 4a9c129448..36975d28e2 100644 --- a/invokeai/frontend/web/src/features/gallery/components/Boards/BoardsList/GalleryBoard.tsx +++ b/invokeai/frontend/web/src/features/gallery/components/Boards/BoardsList/GalleryBoard.tsx @@ -9,6 +9,7 @@ import { Text, Tooltip, useDisclosure, + useEditableControls, } from '@invoke-ai/ui-library'; import { skipToken } from '@reduxjs/toolkit/query'; import { useAppDispatch, useAppSelector } from 'app/store/storeHooks'; @@ -18,7 +19,8 @@ import { AutoAddBadge } from 'features/gallery/components/Boards/AutoAddBadge'; import BoardContextMenu from 'features/gallery/components/Boards/BoardContextMenu'; import { BoardTotalsTooltip } from 'features/gallery/components/Boards/BoardsList/BoardTotalsTooltip'; import { autoAddBoardIdChanged, boardIdSelected } from 'features/gallery/store/gallerySlice'; -import { memo, useCallback, useMemo, useState } from 'react'; +import type { MouseEvent, MouseEventHandler, MutableRefObject } from 'react'; +import { memo, useCallback, useEffect, useMemo, useRef, useState } from 'react'; import { useTranslation } from 'react-i18next'; import { PiArchiveBold, PiImageSquare } from 'react-icons/pi'; import { useUpdateBoardMutation } from 'services/api/endpoints/boards'; @@ -49,15 +51,19 @@ const GalleryBoard = ({ board, isSelected, setBoardToDelete }: GalleryBoardProps const { t } = useTranslation(); const autoAddBoardId = useAppSelector((s) => s.gallery.autoAddBoardId); const autoAssignBoardOnClick = useAppSelector((s) => s.gallery.autoAssignBoardOnClick); + const selectedBoardId = useAppSelector((s) => s.gallery.selectedBoardId); const editingDisclosure = useDisclosure(); const [localBoardName, setLocalBoardName] = useState(board.board_name); + const onStartEditingRef = useRef(undefined); - const handleSelectBoard = useCallback(() => { - dispatch(boardIdSelected({ boardId: board.board_id })); - if (autoAssignBoardOnClick) { + const onClick = useCallback(() => { + if (selectedBoardId !== board.board_id) { + dispatch(boardIdSelected({ boardId: board.board_id })); + } + if (autoAssignBoardOnClick && autoAddBoardId !== board.board_id) { dispatch(autoAddBoardIdChanged(board.board_id)); } - }, [dispatch, board.board_id, autoAssignBoardOnClick]); + }, [selectedBoardId, board.board_id, autoAssignBoardOnClick, autoAddBoardId, dispatch]); const [updateBoard, { isLoading: isUpdateBoardLoading }] = useUpdateBoardMutation(); @@ -70,7 +76,7 @@ const GalleryBoard = ({ board, isSelected, setBoardToDelete }: GalleryBoardProps [board.board_id] ); - const handleSubmit = useCallback( + const onSubmit = useCallback( async (newBoardName: string) => { if (!newBoardName.trim()) { // empty strings are not allowed @@ -96,10 +102,16 @@ const GalleryBoard = ({ board, isSelected, setBoardToDelete }: GalleryBoardProps [board.board_id, board.board_name, editingDisclosure, updateBoard] ); - const handleChange = useCallback((newBoardName: string) => { + const onChange = useCallback((newBoardName: string) => { setLocalBoardName(newBoardName); }, []); + const onDoubleClick = useCallback((e: MouseEvent) => { + if (onStartEditingRef.current) { + onStartEditingRef.current(e); + } + }, []); + return ( {(ref) => ( @@ -110,7 +122,8 @@ const GalleryBoard = ({ board, isSelected, setBoardToDelete }: GalleryBoardProps + {autoAddBoardId === board.board_id && !editingDisclosure.isOpen && } {board.archived && !editingDisclosure.isOpen && } @@ -158,6 +174,16 @@ const GalleryBoard = ({ board, isSelected, setBoardToDelete }: GalleryBoardProps ); }; +const JankEditableHijack = memo((props: { onStartEditingRef: MutableRefObject }) => { + const editableControls = useEditableControls(); + useEffect(() => { + props.onStartEditingRef.current = editableControls.getEditButtonProps().onClick; + }, [props, editableControls]); + return null; +}); + +JankEditableHijack.displayName = 'JankEditableHijack'; + export default memo(GalleryBoard); const CoverImage = ({ board }: { board: BoardDTO }) => { From 8f0edcd4f4a9078e6b1ebff5f516ef9223e82a1a Mon Sep 17 00:00:00 2001 From: psychedelicious <4822129+psychedelicious@users.noreply.github.com> Date: Wed, 10 Jul 2024 17:29:37 +1000 Subject: [PATCH 12/48] fix(ui): edge cases when deleting, archiving, updating boards Need to handle different cases where the selected or auto-add board is hidden - fall back to uncategorized in these situations. --- .../addArchivedOrDeletedBoardListener.ts | 124 ++++++++++++++++-- 1 file changed, 113 insertions(+), 11 deletions(-) diff --git a/invokeai/frontend/web/src/app/store/middleware/listenerMiddleware/listeners/addArchivedOrDeletedBoardListener.ts b/invokeai/frontend/web/src/app/store/middleware/listenerMiddleware/listeners/addArchivedOrDeletedBoardListener.ts index c569a6e36d..8e0a63fc7d 100644 --- a/invokeai/frontend/web/src/app/store/middleware/listenerMiddleware/listeners/addArchivedOrDeletedBoardListener.ts +++ b/invokeai/frontend/web/src/app/store/middleware/listenerMiddleware/listeners/addArchivedOrDeletedBoardListener.ts @@ -11,36 +11,138 @@ import { boardsApi } from 'services/api/endpoints/boards'; import { imagesApi } from 'services/api/endpoints/images'; export const addArchivedOrDeletedBoardListener = (startAppListening: AppStartListening) => { + /** + * The auto-add board shouldn't be set to an archived board or deleted board. When we archive a board, delete + * a board, or change a the archived board visibility flag, we may need to reset the auto-add board. + */ startAppListening({ matcher: isAnyOf( - // Updating a board may change its archived status - boardsApi.endpoints.updateBoard.matchFulfilled, // If a board is deleted, we'll need to reset the auto-add board imagesApi.endpoints.deleteBoard.matchFulfilled, - imagesApi.endpoints.deleteBoardAndImages.matchFulfilled, - // When we change the visibility of archived boards, we may need to reset the auto-add board - shouldShowArchivedBoardsChanged + imagesApi.endpoints.deleteBoardAndImages.matchFulfilled ), effect: async (action, { dispatch, getState }) => { - /** - * The auto-add board shouldn't be set to an archived board or deleted board. When we archive a board, delete - * a board, or change a the archived board visibility flag, we may need to reset the auto-add board. - */ - const state = getState(); const queryArgs = selectListBoardsQueryArgs(state); const queryResult = boardsApi.endpoints.listAllBoards.select(queryArgs)(state); - const autoAddBoardId = state.gallery.autoAddBoardId; + const { autoAddBoardId, selectedBoardId } = state.gallery; if (!queryResult.data) { return; } + let didReset = false; + if (!queryResult.data.find((board) => board.board_id === autoAddBoardId)) { + dispatch(autoAddBoardIdChanged('none')); + didReset = true; + } + if (!queryResult.data.find((board) => board.board_id === selectedBoardId)) { + dispatch(boardIdSelected({ boardId: 'none' })); + didReset = true; + } + if (didReset) { + dispatch(galleryViewChanged('images')); + } + }, + }); + + // If we archived a board, it may end up hidden. If it's selected or the auto-add board, we should reset those. + startAppListening({ + matcher: boardsApi.endpoints.updateBoard.matchFulfilled, + effect: async (action, { dispatch, getState }) => { + const state = getState(); + const queryArgs = selectListBoardsQueryArgs(state); + const queryResult = boardsApi.endpoints.listAllBoards.select(queryArgs)(state); + const { shouldShowArchivedBoards } = state.gallery; + + if (!queryResult.data) { + return; + } + + const wasArchived = action.meta.arg.originalArgs.changes.archived === true; + + if (wasArchived && !shouldShowArchivedBoards) { dispatch(autoAddBoardIdChanged('none')); dispatch(boardIdSelected({ boardId: 'none' })); dispatch(galleryViewChanged('images')); } }, }); + + // When we hide archived boards, if the selected or the auto-add board is archived, we should reset those. + startAppListening({ + actionCreator: shouldShowArchivedBoardsChanged, + effect: async (action, { dispatch, getState }) => { + const shouldShowArchivedBoards = action.payload; + + // We only need to take action if we have just hidden archived boards. + if (!shouldShowArchivedBoards) { + return; + } + + const state = getState(); + const queryArgs = selectListBoardsQueryArgs(state); + const queryResult = boardsApi.endpoints.listAllBoards.select(queryArgs)(state); + const { selectedBoardId, autoAddBoardId } = state.gallery; + + if (!queryResult.data) { + return; + } + + let didReset = false; + + // Handle the case where selected board is archived + const selectedBoard = queryResult.data.find((b) => b.board_id === selectedBoardId); + if (selectedBoard && selectedBoard.archived) { + dispatch(boardIdSelected({ boardId: 'none' })); + didReset = true; + } + + // Handle the case where auto-add board is archived + const autoAddBoard = queryResult.data.find((b) => b.board_id === autoAddBoardId); + if (autoAddBoard && autoAddBoard.archived) { + dispatch(autoAddBoardIdChanged('none')); + didReset = true; + } + + // When resetting the auto-add board or selected board, we should also reset the view to images + if (didReset) { + dispatch(galleryViewChanged('images')); + } + }, + }); + + /** + * When listing boards, if the selected or auto-add boards are no longer in the list, we should reset them. + */ + startAppListening({ + matcher: boardsApi.endpoints.listAllBoards.matchFulfilled, + effect: async (action, { dispatch, getState }) => { + const boards = action.payload; + const state = getState(); + const { selectedBoardId, autoAddBoardId } = state.gallery; + + let didReset = false; + + // Handle the case where selected board isn't in the list of boards + const selectedBoard = boards.find((b) => b.board_id === selectedBoardId); + if (selectedBoard && selectedBoard.archived) { + dispatch(boardIdSelected({ boardId: 'none' })); + didReset = true; + } + + // Handle the case where auto-add board isn't in the list of boards + const autoAddBoard = boards.find((b) => b.board_id === autoAddBoardId); + if (autoAddBoard && autoAddBoard.archived) { + dispatch(autoAddBoardIdChanged('none')); + didReset = true; + } + + // When resetting the auto-add board or selected board, we should also reset the view to images + if (didReset) { + dispatch(galleryViewChanged('images')); + } + }, + }); }; From 6bf29b20af3cdd3ad99e46d33ac30a3aec652be8 Mon Sep 17 00:00:00 2001 From: psychedelicious <4822129+psychedelicious@users.noreply.github.com> Date: Wed, 10 Jul 2024 18:15:46 +1000 Subject: [PATCH 13/48] fix(ui): fix edge case in panels Not sure why I didn't figure out how to do this before - we only should reset a panel if it's too small. --- .../frontend/web/src/features/ui/hooks/usePanel.ts | 11 +---------- 1 file changed, 1 insertion(+), 10 deletions(-) diff --git a/invokeai/frontend/web/src/features/ui/hooks/usePanel.ts b/invokeai/frontend/web/src/features/ui/hooks/usePanel.ts index f9ebe97064..bd6af152fd 100644 --- a/invokeai/frontend/web/src/features/ui/hooks/usePanel.ts +++ b/invokeai/frontend/web/src/features/ui/hooks/usePanel.ts @@ -113,18 +113,9 @@ export const usePanel = (arg: UsePanelOptions): UsePanelReturn => { } const minSizePct = getSizeAsPercentage(arg.minSize, arg.panelGroupRef, arg.panelGroupDirection); - _setMinSize(minSizePct); - /** - * TODO(psyche): Ideally, we only resize the panel if there is not enough room for it in the - * panel group. This is a bit tricky, though. We'd need to track the last known panel size - * and compare it to the new size before resizing. This introduces some complexity that I'd - * rather not need to maintain. - * - * For now, we'll just resize the panel to the min size every time the panel group is resized. - */ - if (!panelHandleRef.current.isCollapsed()) { + if (!panelHandleRef.current.isCollapsed() && panelHandleRef.current.getSize() < minSizePct && minSizePct > 0) { panelHandleRef.current.resize(minSizePct); } }); From 788f90a7d5cfc291615c826ff3f7297c2dfacf8a Mon Sep 17 00:00:00 2001 From: psychedelicious <4822129+psychedelicious@users.noreply.github.com> Date: Wed, 10 Jul 2024 18:19:26 +1000 Subject: [PATCH 14/48] feat(ui): tweak resizehandle styling --- .../web/src/features/ui/components/tabs/ResizeHandle.tsx | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/invokeai/frontend/web/src/features/ui/components/tabs/ResizeHandle.tsx b/invokeai/frontend/web/src/features/ui/components/tabs/ResizeHandle.tsx index b9c9b70c94..c5b76de892 100644 --- a/invokeai/frontend/web/src/features/ui/components/tabs/ResizeHandle.tsx +++ b/invokeai/frontend/web/src/features/ui/components/tabs/ResizeHandle.tsx @@ -48,12 +48,12 @@ const sx: SystemStyleObject = { transitionDuration: 'normal', '.resize-handle-inner': { '&[data-orientation="horizontal"]': { - w: 'calc(100% - 1rem)', + w: '100%', h: '2px', }, '&[data-orientation="vertical"]': { w: '2px', - h: 'calc(100% - 1rem)', + h: '100%', }, borderRadius: 'base', transitionProperty: 'inherit', From 2e7a95998cb0f064c8f88f8e681e61f45e08c6e3 Mon Sep 17 00:00:00 2001 From: psychedelicious <4822129+psychedelicious@users.noreply.github.com> Date: Wed, 10 Jul 2024 18:27:32 +1000 Subject: [PATCH 15/48] feat(ui): add support for default size in usePanel --- .../web/src/features/ui/hooks/usePanel.ts | 33 ++++++++++++++++--- 1 file changed, 29 insertions(+), 4 deletions(-) diff --git a/invokeai/frontend/web/src/features/ui/hooks/usePanel.ts b/invokeai/frontend/web/src/features/ui/hooks/usePanel.ts index bd6af152fd..69869dc2b3 100644 --- a/invokeai/frontend/web/src/features/ui/hooks/usePanel.ts +++ b/invokeai/frontend/web/src/features/ui/hooks/usePanel.ts @@ -16,6 +16,10 @@ export type UsePanelOptions = * The minimum size of the panel as a percentage. */ minSize: number; + /** + * The default size of the panel as a percentage. + */ + defaultSize?: number; /** * The unit of the minSize */ @@ -26,6 +30,10 @@ export type UsePanelOptions = * The minimum size of the panel in pixels. */ minSize: number; + /** + * The default size of the panel in pixels. + */ + defaultSize?: number; /** * The unit of the minSize. */ @@ -50,6 +58,10 @@ export type UsePanelReturn = { * The dynamically calculated minimum size of the panel. */ minSize: number; + /** + * The dynamically calculated default size of the panel. + */ + defaultSize: number; /** * Whether the panel is collapsed. */ @@ -94,6 +106,7 @@ export type UsePanelReturn = { export const usePanel = (arg: UsePanelOptions): UsePanelReturn => { const panelHandleRef = useRef(null); const [_minSize, _setMinSize] = useState(arg.unit === 'percentages' ? arg.minSize : 0); + const [_defaultSize, _setDefaultSize] = useState(arg.defaultSize ?? arg.minSize); // If the units are pixels, we need to calculate the min size as a percentage of the available space, // then resize the panel if it is too small. @@ -115,6 +128,13 @@ export const usePanel = (arg: UsePanelOptions): UsePanelReturn => { const minSizePct = getSizeAsPercentage(arg.minSize, arg.panelGroupRef, arg.panelGroupDirection); _setMinSize(minSizePct); + const defaultSizePct = getSizeAsPercentage( + arg.defaultSize ?? arg.minSize, + arg.panelGroupRef, + arg.panelGroupDirection + ); + _setDefaultSize(defaultSizePct); + if (!panelHandleRef.current.isCollapsed() && panelHandleRef.current.getSize() < minSizePct && minSizePct > 0) { panelHandleRef.current.resize(minSizePct); } @@ -124,8 +144,12 @@ export const usePanel = (arg: UsePanelOptions): UsePanelReturn => { panelGroupHandleElements.forEach((el) => resizeObserver.observe(el)); // Resize the panel to the min size once on startup - const minSizePct = getSizeAsPercentage(arg.minSize, arg.panelGroupRef, arg.panelGroupDirection); - panelHandleRef.current?.resize(minSizePct); + const defaultSizePct = getSizeAsPercentage( + arg.defaultSize ?? arg.minSize, + arg.panelGroupRef, + arg.panelGroupDirection + ); + panelHandleRef.current?.resize(defaultSizePct); return () => { resizeObserver.disconnect(); @@ -185,8 +209,8 @@ export const usePanel = (arg: UsePanelOptions): UsePanelReturn => { } // Otherwise, resize to the min size - panelHandleRef.current?.resize(_minSize); - }, [_minSize, collapse]); + panelHandleRef.current?.resize(_defaultSize); + }, [_defaultSize, _minSize, collapse]); return { ref: panelHandleRef, @@ -200,6 +224,7 @@ export const usePanel = (arg: UsePanelOptions): UsePanelReturn => { collapse, resize, onDoubleClickHandle, + defaultSize: _defaultSize, }; }; From fea1ec9085a392c8db83d3c0c5106b639a9bf2cb Mon Sep 17 00:00:00 2001 From: psychedelicious <4822129+psychedelicious@users.noreply.github.com> Date: Wed, 10 Jul 2024 18:28:01 +1000 Subject: [PATCH 16/48] feat(ui): updated boards resizable panel logic --- .../gallery/components/GalleryBoardName.tsx | 7 +++- .../gallery/components/GalleryHeader.tsx | 14 ++++--- .../components/ImageGalleryContent.tsx | 42 +++++++++++++++---- 3 files changed, 49 insertions(+), 14 deletions(-) diff --git a/invokeai/frontend/web/src/features/gallery/components/GalleryBoardName.tsx b/invokeai/frontend/web/src/features/gallery/components/GalleryBoardName.tsx index a680d2b19a..8ede311f9e 100644 --- a/invokeai/frontend/web/src/features/gallery/components/GalleryBoardName.tsx +++ b/invokeai/frontend/web/src/features/gallery/components/GalleryBoardName.tsx @@ -3,12 +3,17 @@ import { useAppSelector } from 'app/store/storeHooks'; import { memo } from 'react'; import { useBoardName } from 'services/api/hooks/useBoardName'; -const GalleryBoardName = () => { +type Props = { + onClick: () => void; +}; + +const GalleryBoardName = (props: Props) => { const selectedBoardId = useAppSelector((s) => s.gallery.selectedBoardId); const boardName = useBoardName(selectedBoardId); return ( { +type Props = { + onClickBoardName: () => void; +}; + +export const GalleryHeader = memo((props: Props) => { const projectName = useStore($projectName); const projectUrl = useStore($projectUrl); @@ -15,16 +19,16 @@ const GalleryHeader = () => { {projectName} - + ); } return ( - + ); -}; +}); -export default memo(GalleryHeader); +GalleryHeader.displayName = 'GalleryHeader'; diff --git a/invokeai/frontend/web/src/features/gallery/components/ImageGalleryContent.tsx b/invokeai/frontend/web/src/features/gallery/components/ImageGalleryContent.tsx index 6e4a5bf735..ded0ad0056 100644 --- a/invokeai/frontend/web/src/features/gallery/components/ImageGalleryContent.tsx +++ b/invokeai/frontend/web/src/features/gallery/components/ImageGalleryContent.tsx @@ -1,12 +1,14 @@ import type { ChakraProps } from '@invoke-ai/ui-library'; import { Box, Collapse, Flex, IconButton, Spacer, Tab, TabList, Tabs, useDisclosure } from '@invoke-ai/ui-library'; import { useAppDispatch, useAppSelector } from 'app/store/storeHooks'; -import GalleryHeader from 'features/gallery/components/GalleryHeader'; +import { GalleryHeader } from 'features/gallery/components/GalleryHeader'; import { galleryViewChanged } from 'features/gallery/store/gallerySlice'; import ResizeHandle from 'features/ui/components/tabs/ResizeHandle'; -import { memo, useCallback, useRef } from 'react'; +import { usePanel, type UsePanelOptions } from 'features/ui/hooks/usePanel'; +import { memo, useCallback, useMemo, useRef } from 'react'; import { useTranslation } from 'react-i18next'; import { PiMagnifyingGlassBold } from 'react-icons/pi'; +import type { ImperativePanelGroupHandle } from 'react-resizable-panels'; import { Panel, PanelGroup } from 'react-resizable-panels'; import BoardsList from './Boards/BoardsList/BoardsList'; @@ -36,6 +38,20 @@ const ImageGalleryContent = () => { const dispatch = useAppDispatch(); const searchDisclosure = useDisclosure({ defaultIsOpen: false }); const boardSearchDisclosure = useDisclosure({ defaultIsOpen: false }); + const panelGroupRef = useRef(null); + + const boardsListPanelOptions = useMemo( + () => ({ + unit: 'pixels', + minSize: 128, + defaultSize: 256, + fallbackMinSizePct: 20, + panelGroupRef, + panelGroupDirection: 'vertical', + }), + [] + ); + const boardsListPanel = usePanel(boardsListPanelOptions); const handleClickImages = useCallback(() => { dispatch(galleryViewChanged('images')); @@ -45,12 +61,10 @@ const ImageGalleryContent = () => { dispatch(galleryViewChanged('assets')); }, [dispatch]); - const panelGroupRef = useRef(null); - return ( - + { - + - - + + From b70e87f25baa3000097a6ca4ba0662532f2ae172 Mon Sep 17 00:00:00 2001 From: psychedelicious <4822129+psychedelicious@users.noreply.github.com> Date: Wed, 10 Jul 2024 18:31:12 +1000 Subject: [PATCH 17/48] feat(ui): tweak add board button style --- .../gallery/components/Boards/BoardsList/AddBoardButton.tsx | 4 +++- .../gallery/components/Boards/BoardsList/BoardsList.tsx | 4 ++-- 2 files changed, 5 insertions(+), 3 deletions(-) diff --git a/invokeai/frontend/web/src/features/gallery/components/Boards/BoardsList/AddBoardButton.tsx b/invokeai/frontend/web/src/features/gallery/components/Boards/BoardsList/AddBoardButton.tsx index 15490d8081..60468de145 100644 --- a/invokeai/frontend/web/src/features/gallery/components/Boards/BoardsList/AddBoardButton.tsx +++ b/invokeai/frontend/web/src/features/gallery/components/Boards/BoardsList/AddBoardButton.tsx @@ -44,7 +44,9 @@ const AddBoardButton = ({ isPrivateBoard }: Props) => { onClick={handleCreateBoard} size="md" data-testid="add-board-button" - variant="ghost" + variant="link" + w={8} + h={8} /> ); }; diff --git a/invokeai/frontend/web/src/features/gallery/components/Boards/BoardsList/BoardsList.tsx b/invokeai/frontend/web/src/features/gallery/components/Boards/BoardsList/BoardsList.tsx index dd34cba93b..9bbc68ff9d 100644 --- a/invokeai/frontend/web/src/features/gallery/components/Boards/BoardsList/BoardsList.tsx +++ b/invokeai/frontend/web/src/features/gallery/components/Boards/BoardsList/BoardsList.tsx @@ -44,7 +44,7 @@ const BoardsList = () => { {allowPrivateBoards && ( <> - + {t('boards.private')} @@ -63,7 +63,7 @@ const BoardsList = () => { )} - + {allowPrivateBoards ? t('boards.shared') : t('boards.boards')} From 7db767b7c320ffb086703a0afadca847421a5fb8 Mon Sep 17 00:00:00 2001 From: psychedelicious <4822129+psychedelicious@users.noreply.github.com> Date: Wed, 10 Jul 2024 18:38:01 +1000 Subject: [PATCH 18/48] feat(ui): sticky board list header --- .../Boards/BoardsList/BoardsList.tsx | 62 +++++++++++++------ 1 file changed, 42 insertions(+), 20 deletions(-) diff --git a/invokeai/frontend/web/src/features/gallery/components/Boards/BoardsList/BoardsList.tsx b/invokeai/frontend/web/src/features/gallery/components/Boards/BoardsList/BoardsList.tsx index 9bbc68ff9d..07e8d9c982 100644 --- a/invokeai/frontend/web/src/features/gallery/components/Boards/BoardsList/BoardsList.tsx +++ b/invokeai/frontend/web/src/features/gallery/components/Boards/BoardsList/BoardsList.tsx @@ -43,14 +43,24 @@ const BoardsList = () => { {allowPrivateBoards && ( - <> - - + + + {t('boards.private')} - + {filteredPrivateBoards.map((board) => ( { /> ))} - + )} - - - {allowPrivateBoards ? t('boards.shared') : t('boards.boards')} - - - - {!allowPrivateBoards && } - {filteredSharedBoards.map((board) => ( - - ))} + + + {allowPrivateBoards ? t('boards.shared') : t('boards.boards')} + + + + + {!allowPrivateBoards && } + {filteredSharedBoards.map((board) => ( + + ))} + From 38622b0d91b839e55607c319d0fa6a5534eead07 Mon Sep 17 00:00:00 2001 From: psychedelicious <4822129+psychedelicious@users.noreply.github.com> Date: Wed, 10 Jul 2024 18:38:17 +1000 Subject: [PATCH 19/48] feat(ui): board list title verbiage --- invokeai/frontend/web/public/locales/en.json | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/invokeai/frontend/web/public/locales/en.json b/invokeai/frontend/web/public/locales/en.json index daa229e7c5..91a36bcee3 100644 --- a/invokeai/frontend/web/public/locales/en.json +++ b/invokeai/frontend/web/public/locales/en.json @@ -39,10 +39,10 @@ "movingImagesToBoard_other": "Moving {{count}} images to board:", "myBoard": "My Board", "noMatching": "No matching Boards", - "private": "Private", + "private": "Private Boards", "searchBoard": "Search Boards...", "selectBoard": "Select a Board", - "shared": "Shared", + "shared": "Shared Boards", "topMessage": "This board contains images used in the following features:", "unarchiveBoard": "Unarchive Board", "uncategorized": "Uncategorized", From 146e3a337739143e9214121ed426fffd0af6bb4a Mon Sep 17 00:00:00 2001 From: psychedelicious <4822129+psychedelicious@users.noreply.github.com> Date: Wed, 10 Jul 2024 18:45:55 +1000 Subject: [PATCH 20/48] feat(ui): tweak board tooltip behaviour --- .../gallery/components/Boards/BoardsList/GalleryBoard.tsx | 2 ++ .../gallery/components/Boards/BoardsList/NoBoardBoard.tsx | 7 ++++++- 2 files changed, 8 insertions(+), 1 deletion(-) diff --git a/invokeai/frontend/web/src/features/gallery/components/Boards/BoardsList/GalleryBoard.tsx b/invokeai/frontend/web/src/features/gallery/components/Boards/BoardsList/GalleryBoard.tsx index 36975d28e2..8f348b5c41 100644 --- a/invokeai/frontend/web/src/features/gallery/components/Boards/BoardsList/GalleryBoard.tsx +++ b/invokeai/frontend/web/src/features/gallery/components/Boards/BoardsList/GalleryBoard.tsx @@ -118,6 +118,8 @@ const GalleryBoard = ({ board, isSelected, setBoardToDelete }: GalleryBoardProps } openDelay={1000} + placement="left" + closeOnScroll > { return ( {(ref) => ( - } openDelay={1000}> + } + openDelay={1000} + placement="left" + closeOnScroll + > Date: Wed, 10 Jul 2024 18:49:33 +1000 Subject: [PATCH 21/48] feat(ui): add divider between board search and list --- .../gallery/components/ImageGalleryContent.tsx | 14 +++++++++++++- 1 file changed, 13 insertions(+), 1 deletion(-) diff --git a/invokeai/frontend/web/src/features/gallery/components/ImageGalleryContent.tsx b/invokeai/frontend/web/src/features/gallery/components/ImageGalleryContent.tsx index ded0ad0056..7c992c65d6 100644 --- a/invokeai/frontend/web/src/features/gallery/components/ImageGalleryContent.tsx +++ b/invokeai/frontend/web/src/features/gallery/components/ImageGalleryContent.tsx @@ -1,5 +1,16 @@ import type { ChakraProps } from '@invoke-ai/ui-library'; -import { Box, Collapse, Flex, IconButton, Spacer, Tab, TabList, Tabs, useDisclosure } from '@invoke-ai/ui-library'; +import { + Box, + Collapse, + Divider, + Flex, + IconButton, + Spacer, + Tab, + TabList, + Tabs, + useDisclosure, +} from '@invoke-ai/ui-library'; import { useAppDispatch, useAppSelector } from 'app/store/storeHooks'; import { GalleryHeader } from 'features/gallery/components/GalleryHeader'; import { galleryViewChanged } from 'features/gallery/store/gallerySlice'; @@ -102,6 +113,7 @@ const ImageGalleryContent = () => { + Date: Wed, 10 Jul 2024 18:54:25 +1000 Subject: [PATCH 22/48] fix(ui): fix bug with usePanel --- invokeai/frontend/web/src/features/ui/hooks/usePanel.ts | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/invokeai/frontend/web/src/features/ui/hooks/usePanel.ts b/invokeai/frontend/web/src/features/ui/hooks/usePanel.ts index 69869dc2b3..6361130e81 100644 --- a/invokeai/frontend/web/src/features/ui/hooks/usePanel.ts +++ b/invokeai/frontend/web/src/features/ui/hooks/usePanel.ts @@ -203,14 +203,14 @@ export const usePanel = (arg: UsePanelOptions): UsePanelReturn => { const onDoubleClickHandle = useCallback(() => { // If the panel is really super close to the min size, collapse it - if (Math.abs((panelHandleRef.current?.getSize() ?? 0) - _minSize) < 0.01) { + if (Math.abs((panelHandleRef.current?.getSize() ?? 0) - _defaultSize) < 0.01) { collapse(); return; } // Otherwise, resize to the min size panelHandleRef.current?.resize(_defaultSize); - }, [_defaultSize, _minSize, collapse]); + }, [_defaultSize, collapse]); return { ref: panelHandleRef, From de1235c98045130cf810c42802b56513778fc48e Mon Sep 17 00:00:00 2001 From: psychedelicious <4822129+psychedelicious@users.noreply.github.com> Date: Thu, 11 Jul 2024 09:52:56 +1000 Subject: [PATCH 23/48] chore: bump version to 4.2.6a1 --- invokeai/version/invokeai_version.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/invokeai/version/invokeai_version.py b/invokeai/version/invokeai_version.py index 1bdb160e96..da1546b0a0 100644 --- a/invokeai/version/invokeai_version.py +++ b/invokeai/version/invokeai_version.py @@ -1 +1 @@ -__version__ = "4.2.5" +__version__ = "4.2.6a1" From 2f3ec41f94725bfd9dda713ed597778a4b7bcb42 Mon Sep 17 00:00:00 2001 From: B N Date: Thu, 11 Jul 2024 10:51:46 +0200 Subject: [PATCH 24/48] translationBot(ui): update translation (German) Currently translated at 67.3% (849 of 1261 strings) Co-authored-by: B N Translate-URL: https://hosted.weblate.org/projects/invokeai/web-ui/de/ Translation: InvokeAI/Web UI --- invokeai/frontend/web/public/locales/de.json | 120 +++++++++++-------- 1 file changed, 68 insertions(+), 52 deletions(-) diff --git a/invokeai/frontend/web/public/locales/de.json b/invokeai/frontend/web/public/locales/de.json index 2da27264a1..e85d99891a 100644 --- a/invokeai/frontend/web/public/locales/de.json +++ b/invokeai/frontend/web/public/locales/de.json @@ -4,7 +4,7 @@ "reportBugLabel": "Fehler melden", "settingsLabel": "Einstellungen", "img2img": "Bild zu Bild", - "nodes": "Arbeitsabläufe", + "nodes": "Workflows", "upload": "Hochladen", "load": "Laden", "statusDisconnected": "Getrennt", @@ -18,16 +18,16 @@ "postprocessing": "Nachbearbeitung", "t2iAdapter": "T2I Adapter", "communityLabel": "Gemeinschaft", - "dontAskMeAgain": "Frag mich nicht nochmal", - "areYouSure": "Bist du dir sicher?", + "dontAskMeAgain": "Nicht nochmal fragen", + "areYouSure": "Bist du sicher?", "on": "An", - "nodeEditor": "Knoten Editor", + "nodeEditor": "Node-Editor", "ipAdapter": "IP Adapter", - "auto": "Automatisch", + "auto": "Auto", "controlNet": "ControlNet", "imageFailedToLoad": "Kann Bild nicht laden", "modelManager": "Model Manager", - "learnMore": "Mehr lernen", + "learnMore": "Mehr erfahren", "loading": "Lade", "random": "Zufall", "batch": "Stapel-Manager", @@ -42,7 +42,7 @@ "outputs": "Ausgabe", "data": "Daten", "safetensors": "Safe-Tensors", - "outpaint": "Outpaint (Außen ausmalen)", + "outpaint": "Outpaint", "details": "Details", "format": "Format", "unknown": "Unbekannt", @@ -78,7 +78,20 @@ "add": "Hinzufügen", "loglevel": "Protokoll Stufe", "selected": "Ausgewählt", - "beta": "Beta" + "beta": "Beta", + "comparing": "Vergleichen", + "comparingDesc": "Bilder vergleichen", + "editor": "Editor", + "goTo": "Gehe zu", + "positivePrompt": "Positiv-Prompt", + "negativePrompt": "Negativ-Prompt", + "editing": "Bearbeiten", + "editingDesc": "Bearbeiten auf der Kontrollebenen-Leinwand", + "viewing": "Ansehen", + "viewingDesc": "Bilder in großer Galerie ansehen", + "tab": "Tabulator", + "enabled": "Aktiviert", + "disabled": "Ausgeschaltet" }, "gallery": { "galleryImageSize": "Bildgröße", @@ -585,17 +598,18 @@ "mode": "Modus", "resetUI": "$t(accessibility.reset) von UI", "createIssue": "Ticket erstellen", - "about": "Über" + "about": "Über", + "submitSupportTicket": "Support-Ticket senden" }, "boards": { - "autoAddBoard": "Automatisches Hinzufügen zum Board", - "topMessage": "Dieser Ordner enthält Bilder die in den folgenden Funktionen verwendet werden:", + "autoAddBoard": "Board automatisch erstellen", + "topMessage": "Dieser Ordner enthält Bilder, die in den folgenden Funktionen verwendet werden:", "move": "Bewegen", "menuItemAutoAdd": "Auto-Hinzufügen zu diesem Ordner", "myBoard": "Meine Ordner", "searchBoard": "Ordner durchsuchen...", "noMatching": "Keine passenden Ordner", - "selectBoard": "Ordner aussuchen", + "selectBoard": "Ordner wählen", "cancel": "Abbrechen", "addBoard": "Board hinzufügen", "uncategorized": "Ohne Kategorie", @@ -605,30 +619,30 @@ "clearSearch": "Suche leeren", "bottomMessage": "Löschen des Boards und seiner Bilder setzt alle Funktionen zurück, die sie gerade verwenden.", "deleteBoardOnly": "Nur Ordner löschen", - "deleteBoard": "Löschen Ordner", - "deleteBoardAndImages": "Löschen Ordner und Bilder", - "deletedBoardsCannotbeRestored": "Gelöschte Ordner könnte nicht wiederhergestellt werden", - "movingImagesToBoard_one": "Verschiebe {{count}} Bild zu Ordner:", + "deleteBoard": "Lösche Ordner", + "deleteBoardAndImages": "Lösche Ordner und Bilder", + "deletedBoardsCannotbeRestored": "Gelöschte Ordner können nicht wiederhergestellt werden", + "movingImagesToBoard_one": "Verschiebe {{count}} Bild in Ordner:", "movingImagesToBoard_other": "Verschiebe {{count}} Bilder in Ordner:" }, "controlnet": { "showAdvanced": "Zeige Erweitert", - "contentShuffleDescription": "Mischt den Inhalt von einem Bild", + "contentShuffleDescription": "Mischt den Inhalt des Bilds", "addT2IAdapter": "$t(common.t2iAdapter) hinzufügen", "importImageFromCanvas": "Bild von Zeichenfläche importieren", - "lineartDescription": "Konvertiere Bild in Strichzeichnung", + "lineartDescription": "Konvertiert Bild in Linienzeichnung", "importMaskFromCanvas": "Importiere Maske von Zeichenfläche", "hed": "HED", "hideAdvanced": "Verstecke Erweitert", "contentShuffle": "Inhalt mischen", - "beginEndStepPercent": "Start / Ende Step Prozent", - "duplicate": "Kopieren", + "beginEndStepPercent": "Start/Ende Step Prozent", + "duplicate": "Duplizieren", "f": "F", "h": "H", - "depthMidasDescription": "Tiefenmap erstellen mit Midas", + "depthMidasDescription": "Z-Map erstellen mit Midas", "controlnet": "$t(controlnet.controlAdapter_one) #{{number}} ($t(common.controlNet))", - "weight": "Einfluss", - "selectModel": "Wähle ein Modell", + "weight": "Gewichtung", + "selectModel": "Modell wählen", "depthMidas": "Tiefe (Midas)", "w": "W", "addControlNet": "$t(common.controlNet) hinzufügen", @@ -637,7 +651,7 @@ "ip_adapter": "$t(controlnet.controlAdapter_one) #{{number}} ($t(common.ipAdapter))", "fill": "Füllen", "addIPAdapter": "$t(common.ipAdapter) hinzufügen", - "colorMapDescription": "Erstelle eine Farbkarte von diesem Bild", + "colorMapDescription": "Erstellt eine color-map von diesem Bild", "t2i_adapter": "$t(controlnet.controlAdapter_one) #{{number}} ($t(common.t2iAdapter))", "imageResolution": "Bild Auflösung", "depthZoe": "Tiefe (Zoe)", @@ -646,41 +660,41 @@ "highThreshold": "Hohe Schwelle", "toggleControlNet": "Dieses ControlNet ein- oder ausschalten", "delete": "Löschen", - "controlAdapter_one": "Control Adapter", - "controlAdapter_other": "Control Adapter", + "controlAdapter_one": "Control-Adapter", + "controlAdapter_other": "Control-Adapter", "colorMapTileSize": "Kachelgröße", - "depthZoeDescription": "Tiefenmap erstellen mit Zoe", - "setControlImageDimensions": "Setze Control-Bild Auflösung auf Breite/Höhe", + "depthZoeDescription": "Z-Map erstellen mit Zoe", + "setControlImageDimensions": "Bildauflösung auf optimalen Wert setzen", "resize": "Größe ändern", - "resetControlImage": "Zurücksetzen vom Referenz Bild", + "resetControlImage": "Zurücksetzen vom Kontrollbild", "balanced": "Ausgewogen", "prompt": "Prompt", - "resizeMode": "Größe", + "resizeMode": "Skalierungs-Modus", "processor": "Prozessor", - "saveControlImage": "Speichere Referenz Bild", + "saveControlImage": "Speichere Kontrollbild", "safe": "Speichern", "pidi": "PIDI", - "normalBae": "Normales BAE", + "normalBae": "Normale BAE", "mlsdDescription": "Minimalistischer Liniensegmentdetektor", "control": "Kontrolle", "coarse": "Grob", "crop": "Zuschneiden", "pidiDescription": "PIDI-Bildverarbeitung", - "mediapipeFace": "Mediapipe Gesichter", + "mediapipeFace": "Mediapipe Gesicht", "mlsd": "M-LSD", - "controlMode": "Steuermodus", + "controlMode": "Kontrollmodus", "cannyDescription": "Canny Umrisserkennung", "lineart": "Linienzeichnung", "lineartAnimeDescription": "Lineart-Verarbeitung im Anime-Stil", "minConfidence": "Minimales Vertrauen", "megaControl": "Mega-Kontrolle", - "autoConfigure": "Prozessor Auto-konfig", + "autoConfigure": "Prozessor Auto-Konfig", "normalBaeDescription": "Normale BAE-Verarbeitung", - "noneDescription": "Es wurde keine Verarbeitung angewendet", - "lineartAnime": "Lineart Anime / \"Strichzeichnung Anime\"", + "noneDescription": "Es wurde nichts angewendet", + "lineartAnime": "Strichzeichnung Anime", "mediapipeFaceDescription": "Gesichtserkennung mit Mediapipe", - "canny": "\"Canny\"", - "hedDescription": "Ganzheitlich verschachtelte Kantenerkennung", + "canny": "Canny", + "hedDescription": "Ganzheitlich-verschachtelte Kantenerkennung", "scribble": "Scribble", "maxFaces": "Maximale Anzahl Gesichter", "resizeSimple": "Größe ändern (einfach)", @@ -689,21 +703,23 @@ "small": "Klein", "base": "Basis", "depthAnything": "Depth Anything", - "depthAnythingDescription": "Erstellung einer Tiefenkarte mit der Depth-Anything-Technik", + "depthAnythingDescription": "Erstellung einer Z-Map mit Depth-Anything-Technik", "face": "Gesicht", "body": "Körper", "hands": "Hände", "dwOpenpose": "DW Openpose", "dwOpenposeDescription": "Posenschätzung mit DW Openpose", - "selectCLIPVisionModel": "Wähle ein CLIP Vision Model aus", + "selectCLIPVisionModel": "Wähle ein CLIP-Vision Modell aus", "ipAdapterMethod": "Methode", "composition": "Nur Komposition", "full": "Voll", - "style": "Nur Style" + "style": "Nur Stil", + "setControlImageDimensionsForce": "Bildauflösung setzen (ev. nicht optimal)", + "beginEndStepPercentShort": "Start/Ende %" }, "queue": { "status": "Status", - "cancelTooltip": "Aktuellen Aufgabe abbrechen", + "cancelTooltip": "Aufgabe abbrechen", "queueEmpty": "Warteschlange leer", "in_progress": "In Arbeit", "queueFront": "Am Anfang der Warteschlange einreihen", @@ -739,7 +755,7 @@ "clearQueueAlertDialog2": "Warteschlange wirklich leeren?", "pruneSucceeded": "{{item_count}} abgeschlossene Elemente aus der Warteschlange entfernt", "pauseSucceeded": "Prozess angehalten", - "cancelFailed": "Problem beim Stornieren des Auftrags", + "cancelFailed": "Problem beim Abbrechen", "pauseFailed": "Problem beim Anhalten des Prozesses", "front": "Vorne", "pruneTooltip": "Bereinigen Sie {{item_count}} abgeschlossene Aufträge", @@ -1026,13 +1042,13 @@ }, "hrf": { "enableHrf": "Korrektur für hohe Auflösungen", - "upscaleMethod": "Vergrößerungsmethoden", + "upscaleMethod": "Vergrößerungsmethode", "metadata": { - "strength": "Hochauflösender Fix Stärke", - "enabled": "Hochauflösender Fix aktiviert", - "method": "Hochauflösender Fix Methode" + "strength": "Auflösungs-Fix Stärke", + "enabled": "Auflösungs-Fix aktiviert", + "method": "Auflösungs-Fix Methode" }, - "hrf": "Hochauflösender Fix" + "hrf": "Hohe-Auflösung-Fix" }, "models": { "noMatchingModels": "Keine passenden Modelle", @@ -1063,7 +1079,7 @@ }, "compositing": { "coherenceTab": "Kohärenzpass", - "infillTab": "Füllung / Infill", + "infillTab": "Infill", "title": "Compositing" } }, @@ -1104,8 +1120,8 @@ "showDynamicPrompts": "Dynamische Prompts anzeigen" }, "prompt": { - "noMatchingTriggers": "Keine passenden Auslöser", - "addPromptTrigger": "Auslöse Text hinzufügen", + "noMatchingTriggers": "Keine passenden Trigger", + "addPromptTrigger": "Prompt-Trigger hinzufügen", "compatibleEmbeddings": "Kompatible Einbettungen" } } From 7aec5624f7eb1be705ca119278a833aa8cee92d8 Mon Sep 17 00:00:00 2001 From: HAL Date: Thu, 11 Jul 2024 10:51:46 +0200 Subject: [PATCH 25/48] translationBot(ui): update translation (Japanese) Currently translated at 50.4% (636 of 1261 strings) Co-authored-by: HAL Translate-URL: https://hosted.weblate.org/projects/invokeai/web-ui/ja/ Translation: InvokeAI/Web UI --- invokeai/frontend/web/public/locales/ja.json | 105 +++++++++++++++++-- 1 file changed, 97 insertions(+), 8 deletions(-) diff --git a/invokeai/frontend/web/public/locales/ja.json b/invokeai/frontend/web/public/locales/ja.json index e953944c44..ada60aa1b9 100644 --- a/invokeai/frontend/web/public/locales/ja.json +++ b/invokeai/frontend/web/public/locales/ja.json @@ -70,7 +70,25 @@ "outputs": "アウトプット", "prevPage": "前のページ", "unknownError": "未知のエラー", - "orderBy": "並び順:" + "orderBy": "並び順:", + "comparing": "比較中", + "comparingDesc": "2 つの画像の比較する", + "enabled": "有効", + "notInstalled": "未インストール", + "positivePrompt": "プロンプト", + "negativePrompt": "除外する要素", + "selected": "選択済み", + "aboutDesc": "Invokeを業務で利用する場合はマークしてください:", + "beta": "ベータ", + "disabled": "無効", + "loglevel": "ログラベル", + "editor": "エディタ", + "safetensors": "Safetensors", + "tab": "タブ", + "viewingDesc": "画像を大きなギャラリービューで開く", + "editing": "編集", + "editingDesc": "コントロールレイヤキャンバスで編集", + "toResolve": "解決方法" }, "gallery": { "galleryImageSize": "画像のサイズ", @@ -105,7 +123,23 @@ "noImageSelected": "画像が選択されていません", "deleteSelection": "選択中のものを削除", "downloadSelection": "選択中のものをダウンロード", - "starImage": "スターをつける" + "starImage": "スターをつける", + "viewerImage": "閲覧画像", + "compareImage": "比較画像", + "openInViewer": "ビューアで開く", + "selectForCompare": "比較対象として選択", + "selectAnImageToCompare": "比較する画像を選択", + "slider": "スライダー", + "sideBySide": "横並び", + "hover": "ホバー", + "swapImages": "画像を入れ替える", + "compareOptions": "比較オプション", + "stretchToFit": "画面に合わせる", + "exitCompare": "比較を終了する", + "compareHelp1": "Alt キーを押しながらギャラリー画像をクリックするか、矢印キーを使用して比較画像を変更します。", + "compareHelp3": "Cを押して、比較した画像を入れ替えます。", + "compareHelp4": "[Z]または[Esc]を押して終了します。", + "compareHelp2": "M キーを押して比較モードを切り替えます。" }, "hotkeys": { "keyboardShortcuts": "ホットキー", @@ -282,7 +316,8 @@ "title": "手のひらツール" }, "nextStagingImage": { - "desc": "次のプレビュー画像" + "desc": "次のプレビュー画像", + "title": "次のステージング画像" }, "cancelAndClear": { "desc": "生成をキャンセルしキューもクリアします", @@ -302,6 +337,35 @@ "redoStroke": { "title": "ストロークをやり直す", "desc": "ブラシストロークのやり直し" + }, + "resetOptionsAndGallery": { + "title": "オプションとギャラリーをリセット", + "desc": "オプションとギャラリーパネルをリセット" + }, + "quickToggleMove": { + "title": "高速トグル切り替え", + "desc": "一時的に移動モードを切り替える" + }, + "toggleSnap": { + "title": "スナップの切り替え", + "desc": "グリッドへのスナップの切り替え" + }, + "previousStagingImage": { + "desc": "ステージング領域の前の画像", + "title": "前のステージング画像" + }, + "nodesHotkeys": "ノード", + "toggleOptionsAndGallery": { + "desc": "オプションとギャラリーパネルのオンオフを切り替える", + "title": "オプションとギャラリーを切り替える" + }, + "undoStroke": { + "desc": "ブラシストロークの取り消し", + "title": "ストロークの取り消し" + }, + "toggleViewer": { + "desc": "イメージ ビューアーと現在のタブのワークスペースを切り替えます。", + "title": "画像ビューアの切り替え" } }, "modelManager": { @@ -464,10 +528,11 @@ "showGalleryPanel": "ギャラリーパネルを表示", "menu": "メニュー", "loadMore": "さらに読み込む", - "createIssue": "課題の作成", + "createIssue": "問題を報告", "resetUI": "$t(accessibility.reset) UI", "mode": "モード:", - "about": "Invoke について" + "about": "Invoke について", + "submitSupportTicket": "サポート依頼を送信する" }, "controlnet": { "resize": "リサイズ", @@ -551,7 +616,13 @@ "lineartAnime": "アニメ線画", "mlsdDescription": "最小線分検知", "dwOpenpose": "DW オープンポーズ", - "dwOpenposeDescription": "DW オープンポーズによる人体ポーズの推定" + "dwOpenposeDescription": "DW オープンポーズによる人体ポーズの推定", + "ipAdapterMethod": "方式", + "setControlImageDimensionsForce": "モデルを無視してサイズを W/H にコピー", + "style": "スタイルのみ", + "selectCLIPVisionModel": "CLIP Visionのモデルを選択", + "composition": "構図のみ", + "beginEndStepPercentShort": "開始 / 終了 %" }, "metadata": { "seamless": "シームレス", @@ -563,7 +634,17 @@ "scheduler": "スケジューラー", "positivePrompt": "ポジティブプロンプト", "strength": "Image to Image 強度", - "recallParameters": "パラメータを呼び出す" + "recallParameters": "パラメータを呼び出す", + "imageDetails": "", + "generationMode": "", + "createdBy": "", + "model": "", + "allPrompts": "", + "cfgScale": "", + "imageDimensions": "", + "initImage": "", + "metadata": "", + "height": "" }, "queue": { "queueEmpty": "キューが空です", @@ -620,7 +701,10 @@ "time": "時間", "completedIn": "完了まで", "back": "戻る", - "prune": "刈り込み" + "prune": "刈り込み", + "prompts_other": "プロンプト", + "iterations_other": "繰り返し", + "generations_other": "生成" }, "models": { "noMatchingModels": "一致するモデルがありません", @@ -745,5 +829,10 @@ "addPromptTrigger": "プロンプトトリガーを追加", "compatibleEmbeddings": "互換性のある埋め込み", "noMatchingTriggers": "一致するトリガーがありません" + }, + "ui": { + "tabs": { + "queue": "キュー" + } } } From fe0d56de5c122efc320efdbff2ee603679067cf5 Mon Sep 17 00:00:00 2001 From: Hosted Weblate Date: Thu, 11 Jul 2024 10:51:46 +0200 Subject: [PATCH 26/48] translationBot(ui): update translation files Updated by "Remove blank strings" hook in Weblate. Co-authored-by: Hosted Weblate Translate-URL: https://hosted.weblate.org/projects/invokeai/web-ui/ Translation: InvokeAI/Web UI --- invokeai/frontend/web/public/locales/ja.json | 12 +----------- 1 file changed, 1 insertion(+), 11 deletions(-) diff --git a/invokeai/frontend/web/public/locales/ja.json b/invokeai/frontend/web/public/locales/ja.json index ada60aa1b9..6d5775ecd6 100644 --- a/invokeai/frontend/web/public/locales/ja.json +++ b/invokeai/frontend/web/public/locales/ja.json @@ -634,17 +634,7 @@ "scheduler": "スケジューラー", "positivePrompt": "ポジティブプロンプト", "strength": "Image to Image 強度", - "recallParameters": "パラメータを呼び出す", - "imageDetails": "", - "generationMode": "", - "createdBy": "", - "model": "", - "allPrompts": "", - "cfgScale": "", - "imageDimensions": "", - "initImage": "", - "metadata": "", - "height": "" + "recallParameters": "パラメータを呼び出す" }, "queue": { "queueEmpty": "キューが空です", From c4d2fe9c65b74e76afe3089023c75e1d07f8fdc3 Mon Sep 17 00:00:00 2001 From: Phrixus2023 <920414016@qq.com> Date: Thu, 11 Jul 2024 10:51:46 +0200 Subject: [PATCH 27/48] translationBot(ui): update translation (Chinese (Simplified)) Currently translated at 76.5% (968 of 1265 strings) Co-authored-by: Phrixus2023 <920414016@qq.com> Translate-URL: https://hosted.weblate.org/projects/invokeai/web-ui/zh_Hans/ Translation: InvokeAI/Web UI --- .../frontend/web/public/locales/zh_CN.json | 65 +++++++++++++++++-- 1 file changed, 60 insertions(+), 5 deletions(-) diff --git a/invokeai/frontend/web/public/locales/zh_CN.json b/invokeai/frontend/web/public/locales/zh_CN.json index 45bab5c6da..c4bb52e7cc 100644 --- a/invokeai/frontend/web/public/locales/zh_CN.json +++ b/invokeai/frontend/web/public/locales/zh_CN.json @@ -70,7 +70,23 @@ "add": "添加", "loglevel": "日志级别", "copy": "复制", - "localSystem": "本地系统" + "localSystem": "本地系统", + "aboutHeading": "掌握你的创造力", + "comparing": "对比中", + "comparingDesc": "正在对比两张图片", + "enabled": "已启用", + "disabled": "已禁用", + "red": "红", + "editor": "编辑器", + "positivePrompt": "正向提示词", + "negativePrompt": "反向提示词", + "selected": "选中的", + "viewing": "查看", + "viewingDesc": "在大型画廊视图中查看图片", + "editing": "编辑中", + "green": "绿", + "blue": "蓝", + "editingDesc": "在控制图层画布上编辑" }, "gallery": { "galleryImageSize": "预览大小", @@ -100,7 +116,24 @@ "problemDeletingImagesDesc": "有一张或多张图像无法被删除", "problemDeletingImages": "删除图像时出现问题", "unstarImage": "取消收藏图像", - "starImage": "收藏图像" + "starImage": "收藏图像", + "alwaysShowImageSizeBadge": "始终显示图像尺寸", + "selectForCompare": "选择以比较", + "selectAnImageToCompare": "选择一个图像进行比较", + "slider": "滑块", + "sideBySide": "并排", + "bulkDownloadFailed": "下载失败", + "bulkDownloadRequested": "准备下载", + "bulkDownloadRequestedDesc": "您的下载请求正在准备中,这可能需要一些时间。", + "bulkDownloadRequestFailed": "下载准备过程中出现问题", + "viewerImage": "查看器图像", + "compareImage": "对比图像", + "openInViewer": "在查看器中打开", + "selectAllOnBoard": "选择板块全部", + "hover": "悬停", + "selectAllOnPage": "选择本页全部", + "swapImages": "交换图像", + "compareOptions": "比较选项" }, "hotkeys": { "keyboardShortcuts": "快捷键", @@ -604,7 +637,8 @@ "mode": "模式", "resetUI": "$t(accessibility.reset) UI", "createIssue": "创建问题", - "about": "关于" + "about": "关于", + "submitSupportTicket": "提交支持工单" }, "tooltip": { "feature": { @@ -806,7 +840,21 @@ "controlAdapter_other": "Control Adapters", "lineartAnime": "Lineart Anime", "canny": "Canny", - "resizeSimple": "缩放(简单)" + "resizeSimple": "缩放(简单)", + "body": "身体", + "ipAdapterMethod": "方法", + "setControlImageDimensionsForce": "将尺寸复制到宽/高(忽略模型)", + "depthAnythingDescription": "使用Depth Anything技术生成深度图", + "selectCLIPVisionModel": "选择一个CLIP视觉模型", + "small": "小", + "full": "全部", + "large": "大", + "face": "脸", + "style": "仅风格", + "hands": "手", + "composition": "仅构图", + "modelSize": "模型尺寸", + "dwOpenposeDescription": "使用DW Openpose进行人体姿态预估" }, "queue": { "status": "状态", @@ -863,7 +911,10 @@ "graphFailedToQueue": "节点图加入队列失败", "batchFieldValues": "批处理值", "time": "时间", - "openQueue": "打开队列" + "openQueue": "打开队列", + "prompts_other": "提示词", + "iterations_other": "迭代", + "generations_other": "生成" }, "sdxl": { "refinerStart": "Refiner 开始作用时机", @@ -1238,5 +1289,9 @@ "image": { "title": "图像" } + }, + "prompt": { + "addPromptTrigger": "添加提示词触发器", + "noMatchingTriggers": "没有匹配的触发器" } } From a69284367bf03a5fadc42b233a3c770730e57a4e Mon Sep 17 00:00:00 2001 From: Riccardo Giovanetti Date: Thu, 11 Jul 2024 10:51:46 +0200 Subject: [PATCH 28/48] translationBot(ui): update translation (Italian) Currently translated at 98.2% (1260 of 1282 strings) translationBot(ui): update translation (Italian) Currently translated at 98.4% (1260 of 1280 strings) translationBot(ui): update translation (Italian) Currently translated at 98.4% (1255 of 1275 strings) translationBot(ui): update translation (Italian) Currently translated at 98.4% (1253 of 1273 strings) translationBot(ui): update translation (Italian) Currently translated at 98.4% (1245 of 1265 strings) Co-authored-by: Riccardo Giovanetti Translate-URL: https://hosted.weblate.org/projects/invokeai/web-ui/it/ Translation: InvokeAI/Web UI --- invokeai/frontend/web/public/locales/it.json | 31 +++++++++++++++++--- 1 file changed, 27 insertions(+), 4 deletions(-) diff --git a/invokeai/frontend/web/public/locales/it.json b/invokeai/frontend/web/public/locales/it.json index 3c0079de59..25c2e5b9a8 100644 --- a/invokeai/frontend/web/public/locales/it.json +++ b/invokeai/frontend/web/public/locales/it.json @@ -116,9 +116,9 @@ "deleteSelection": "Elimina la selezione", "image": "immagine", "drop": "Rilascia", - "unstarImage": "Rimuovi preferenza immagine", + "unstarImage": "Rimuovi contrassegno immagine", "dropOrUpload": "$t(gallery.drop) o carica", - "starImage": "Immagine preferita", + "starImage": "Contrassegna l'immagine", "dropToUpload": "$t(gallery.drop) per aggiornare", "problemDeletingImagesDesc": "Impossibile eliminare una o più immagini", "problemDeletingImages": "Problema durante l'eliminazione delle immagini", @@ -142,7 +142,15 @@ "compareHelp1": "Tieni premuto Alt mentre fai clic su un'immagine della galleria o usi i tasti freccia per cambiare l'immagine di confronto.", "compareHelp2": "Premi M per scorrere le modalità di confronto.", "compareHelp3": "Premi C per scambiare le immagini confrontate.", - "compareHelp4": "Premi Z o Esc per uscire." + "compareHelp4": "Premi Z o Esc per uscire.", + "newestFirst": "Prima i più nuovi", + "oldestFirst": "Prima i più vecchi", + "sortDirection": "Direzione dell'ordinamento", + "showStarredImagesFirst": "Mostra prima le immagini contrassegnate", + "showArchivedBoards": "Mostra le bacheche archiviate", + "searchImages": "Ricerca per metadati", + "displayBoardSearch": "Mostra la ricerca nelle Bacheche", + "displaySearch": "Mostra la ricerca" }, "hotkeys": { "keyboardShortcuts": "Tasti di scelta rapida", @@ -941,7 +949,22 @@ "deletedBoardsCannotbeRestored": "Le bacheche eliminate non possono essere ripristinate", "movingImagesToBoard_one": "Spostare {{count}} immagine nella bacheca:", "movingImagesToBoard_many": "Spostare {{count}} immagini nella bacheca:", - "movingImagesToBoard_other": "Spostare {{count}} immagini nella bacheca:" + "movingImagesToBoard_other": "Spostare {{count}} immagini nella bacheca:", + "imagesWithCount_one": "{{count}} immagine", + "imagesWithCount_many": "{{count}} immagini", + "imagesWithCount_other": "{{count}} immagini", + "assetsWithCount_one": "{{count}} risorsa", + "assetsWithCount_many": "{{count}} risorse", + "assetsWithCount_other": "{{count}} risorse", + "archiveBoard": "Archivia la bacheca", + "archived": "Archiviato", + "unarchiveBoard": "Annulla l'archiviazione della bacheca", + "selectedForAutoAdd": "Selezionato per l'aggiunta automatica", + "addSharedBoard": "Aggiungi una Bacheca Condivisa", + "boards": "Bacheche", + "private": "Privata", + "shared": "Condivisa", + "addPrivateBoard": "Aggiungi una Bacheca Privata" }, "controlnet": { "contentShuffleDescription": "Rimescola il contenuto di un'immagine", From d7199c7ca6f525d3ed6dbbb217edcc6e633b9578 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=D0=92=D0=B0=D1=81=D1=8F=D0=BD=D0=B0=D1=82=D0=BE=D1=80?= Date: Thu, 11 Jul 2024 10:51:46 +0200 Subject: [PATCH 29/48] translationBot(ui): update translation (Russian) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Currently translated at 100.0% (1282 of 1282 strings) translationBot(ui): update translation (Russian) Currently translated at 100.0% (1280 of 1280 strings) translationBot(ui): update translation (Russian) Currently translated at 100.0% (1275 of 1275 strings) translationBot(ui): update translation (Russian) Currently translated at 100.0% (1273 of 1273 strings) Co-authored-by: Васянатор Translate-URL: https://hosted.weblate.org/projects/invokeai/web-ui/ru/ Translation: InvokeAI/Web UI --- invokeai/frontend/web/public/locales/ru.json | 29 ++++++++++++++++++-- 1 file changed, 27 insertions(+), 2 deletions(-) diff --git a/invokeai/frontend/web/public/locales/ru.json b/invokeai/frontend/web/public/locales/ru.json index 2f7c711bf2..ecceaf42aa 100644 --- a/invokeai/frontend/web/public/locales/ru.json +++ b/invokeai/frontend/web/public/locales/ru.json @@ -144,7 +144,17 @@ "compareOptions": "Варианты сравнения", "compareHelp1": "Удерживайте Alt при нажатии на изображение в галерее или при помощи клавиш со стрелками, чтобы изменить сравниваемое изображение.", "compareHelp2": "Нажмите M, чтобы переключиться между режимами сравнения.", - "compareHelp3": "Нажмите C, чтобы поменять местами сравниваемые изображения." + "compareHelp3": "Нажмите C, чтобы поменять местами сравниваемые изображения.", + "newestFirst": "Сначала новые", + "sortDirection": "Направление сортировки", + "oldestFirst": "Сначала старые", + "showStarredImagesFirst": "Сначала избранные изображения", + "selectAllOnPage": "Выбрать все на странице", + "selectAllOnBoard": "Выбрать все на доске", + "showArchivedBoards": "Показать архивированные доски", + "searchImages": "Поиск по метаданным", + "displayBoardSearch": "Отобразить поиск досок", + "displaySearch": "Отобразить поиск" }, "hotkeys": { "keyboardShortcuts": "Горячие клавиши", @@ -1043,7 +1053,22 @@ "downloadBoard": "Скачать доску", "deleteBoard": "Удалить доску", "deleteBoardAndImages": "Удалить доску и изображения", - "deletedBoardsCannotbeRestored": "Удаленные доски не подлежат восстановлению" + "deletedBoardsCannotbeRestored": "Удаленные доски не подлежат восстановлению", + "assetsWithCount_one": "{{count}} ассет", + "assetsWithCount_few": "{{count}} ассета", + "assetsWithCount_many": "{{count}} ассетов", + "imagesWithCount_one": "{{count}} изображение", + "imagesWithCount_few": "{{count}} изображения", + "imagesWithCount_many": "{{count}} изображений", + "archiveBoard": "Архивировать доску", + "archived": "Заархивировано", + "unarchiveBoard": "Разархивировать доску", + "selectedForAutoAdd": "Выбрано для автодобавления", + "addSharedBoard": "Добавить общую доску", + "boards": "Доски", + "addPrivateBoard": "Добавить личную доску", + "private": "Личные доски", + "shared": "Общие доски" }, "dynamicPrompts": { "seedBehaviour": { From b533bc072e2ab7689dff0c1ef5dbe2fe1eed1f4d Mon Sep 17 00:00:00 2001 From: Nathan Date: Thu, 11 Jul 2024 10:51:46 +0200 Subject: [PATCH 30/48] translationBot(ui): update translation (French) Currently translated at 25.2% (322 of 1275 strings) Co-authored-by: Nathan Translate-URL: https://hosted.weblate.org/projects/invokeai/web-ui/fr/ Translation: InvokeAI/Web UI --- invokeai/frontend/web/public/locales/fr.json | 109 ++++++++++++++++++- 1 file changed, 106 insertions(+), 3 deletions(-) diff --git a/invokeai/frontend/web/public/locales/fr.json b/invokeai/frontend/web/public/locales/fr.json index b8f560e265..558545b2f4 100644 --- a/invokeai/frontend/web/public/locales/fr.json +++ b/invokeai/frontend/web/public/locales/fr.json @@ -1,7 +1,7 @@ { "common": { "hotkeysLabel": "Raccourcis clavier", - "languagePickerLabel": "Sélecteur de langue", + "languagePickerLabel": "Langue", "reportBugLabel": "Signaler un bug", "settingsLabel": "Paramètres", "img2img": "Image en image", @@ -17,7 +17,53 @@ "cancel": "Annuler", "loading": "Chargement", "txt2img": "Texte vers image", - "postprocessing": "Post-Traitement" + "postprocessing": "Post-Traitement", + "file": "Fichier", + "orderBy": "Trier par", + "comparing": "Comparaison", + "add": "Ajouter", + "dontAskMeAgain": "Ne plus me demander", + "nodeEditor": "Éditeur de nœud", + "outputs": "Sorties", + "unknown": "Inconnu", + "editor": "Éditeur", + "error": "Erreur", + "installed": "Installé", + "format": "format", + "goTo": "Aller à", + "input": "Saisie", + "linear": "Linéaire", + "localSystem": "Système local", + "learnMore": "En savoir plus", + "modelManager": "Gestionnaire de modèle", + "notInstalled": "Non $t(common.installed)", + "openInNewTab": "Ouvrir dans un nouvel onglet", + "somethingWentWrong": "Une erreur s'est produite", + "created": "Créé", + "tab": "Onglet", + "folder": "Dossier", + "imageFailedToLoad": "Impossible de charger l'image", + "prevPage": "Page précédente", + "nextPage": "Page suivante", + "selected": "Sélectionné", + "save": "Enregistrer", + "updated": "Mis à jour", + "random": "Aléatoire", + "unknownError": "Erreur inconnue", + "red": "Rouge", + "green": "Vert", + "delete": "Supprimer", + "simple": "Simple", + "template": "Modèle", + "advanced": "Avancé", + "copy": "Copier", + "saveAs": "Enregistrer sous", + "blue": "Bleu", + "alpha": "Alpha", + "editing": "Édition", + "enabled": "Activé", + "disabled": "Désactivé", + "direction": "Direction" }, "gallery": { "galleryImageSize": "Taille de l'image", @@ -368,6 +414,63 @@ "previousImage": "Image précédente", "showOptionsPanel": "Montrer la page d'options", "invokeProgressBar": "Barre de Progression Invoke", - "menu": "Menu" + "menu": "Menu", + "loadMore": "Charger plus", + "about": "À propos", + "mode": "Mode" + }, + "boards": { + "move": "Déplacer", + "cancel": "Annuler", + "loading": "Chargement…", + "archived": "Archivé", + "clearSearch": "Effacer la recherche", + "imagesWithCount_one": "{{count}} image", + "imagesWithCount_many": "{{count}} images", + "imagesWithCount_other": "{{count}} images" + }, + "accordions": { + "advanced": { + "title": "Avancé" + }, + "image": { + "title": "Image" + } + }, + "controlnet": { + "none": "Aucun", + "detectResolution": "Détecter la résolution", + "balanced": "Équilibré", + "colorMap": "Couleur", + "control": "Contrôle", + "controlMode": "Mode de contrôle", + "processor": "Processeur", + "ipAdapterMethod": "Méthode", + "delete": "Supprimer", + "duplicate": "Dupliquer", + "crop": "Rogner", + "imageResolution": "Résolution d'image", + "resize": "Redimensionner" + }, + "queue": { + "clear": "Effacer", + "failed": "Échec", + "session": "Session", + "queueEmpty": "File d'attente vide", + "next": "Suivant", + "queue": "File d'attente", + "clearSucceeded": "File d'attente effacée", + "total": "Total", + "pending": "En attente", + "in_progress": "En cours", + "time": "Heure", + "status": "État", + "openQueue": "Ouvrir la file d'attente", + "queueFront": "Ajouter en premier", + "cancel": "Annuler", + "canceled": "Annulé", + "clearQueueAlertDialog2": "Voulez-vous vraiment effacer la file d'attente ?", + "queueBack": "Ajouter à la file d'attente", + "completed": "Terminé" } } From 5795617f86b4bf85810cf8cc858d08019137370a Mon Sep 17 00:00:00 2001 From: Alexander Eichhorn Date: Thu, 11 Jul 2024 10:51:47 +0200 Subject: [PATCH 31/48] translationBot(ui): update translation (German) Currently translated at 67.0% (859 of 1282 strings) Co-authored-by: Alexander Eichhorn Translate-URL: https://hosted.weblate.org/projects/invokeai/web-ui/de/ Translation: InvokeAI/Web UI --- invokeai/frontend/web/public/locales/de.json | 13 ++++++++++++- 1 file changed, 12 insertions(+), 1 deletion(-) diff --git a/invokeai/frontend/web/public/locales/de.json b/invokeai/frontend/web/public/locales/de.json index e85d99891a..352b6ffcbf 100644 --- a/invokeai/frontend/web/public/locales/de.json +++ b/invokeai/frontend/web/public/locales/de.json @@ -623,7 +623,18 @@ "deleteBoardAndImages": "Lösche Ordner und Bilder", "deletedBoardsCannotbeRestored": "Gelöschte Ordner können nicht wiederhergestellt werden", "movingImagesToBoard_one": "Verschiebe {{count}} Bild in Ordner:", - "movingImagesToBoard_other": "Verschiebe {{count}} Bilder in Ordner:" + "movingImagesToBoard_other": "Verschiebe {{count}} Bilder in Ordner:", + "selectedForAutoAdd": "Ausgewählt für Automatisches hinzufügen", + "imagesWithCount_one": "{{count}} Bild", + "imagesWithCount_other": "{{count}} Bilder", + "addPrivateBoard": "Privaten Ordner hinzufügen", + "addSharedBoard": "Geteilten Ordner hinzufügen", + "boards": "Ordner", + "unarchiveBoard": "Unarchive Ordner", + "private": "Private Ordner", + "shared": "Geteilte Ordner", + "archiveBoard": "Ordner archivieren", + "archived": "Archiviert" }, "controlnet": { "showAdvanced": "Zeige Erweitert", From 69af099532f0ba0751e5b3a843e5a0ed28aaa342 Mon Sep 17 00:00:00 2001 From: Ryan Dick Date: Wed, 10 Jul 2024 09:41:46 -0400 Subject: [PATCH 32/48] Warn on invalid model configs in the DB rather than crashing. --- docs/contributing/MODEL_MANAGER.md | 2 +- invokeai/app/api/dependencies.py | 2 +- .../model_records/model_records_sql.py | 21 +++++++++++++++++-- .../model_records/test_model_records_sql.py | 2 +- .../model_manager/model_manager_fixtures.py | 4 ++-- 5 files changed, 24 insertions(+), 7 deletions(-) diff --git a/docs/contributing/MODEL_MANAGER.md b/docs/contributing/MODEL_MANAGER.md index 9699db4f1a..52b75d8c39 100644 --- a/docs/contributing/MODEL_MANAGER.md +++ b/docs/contributing/MODEL_MANAGER.md @@ -408,7 +408,7 @@ config = get_config() logger = InvokeAILogger.get_logger(config=config) db = SqliteDatabase(config.db_path, logger) -record_store = ModelRecordServiceSQL(db) +record_store = ModelRecordServiceSQL(db, logger) queue = DownloadQueueService() queue.start() diff --git a/invokeai/app/api/dependencies.py b/invokeai/app/api/dependencies.py index 27ab030d4c..6e049399db 100644 --- a/invokeai/app/api/dependencies.py +++ b/invokeai/app/api/dependencies.py @@ -99,7 +99,7 @@ class ApiDependencies: model_images_service = ModelImageFileStorageDisk(model_images_folder / "model_images") model_manager = ModelManagerService.build_model_manager( app_config=configuration, - model_record_service=ModelRecordServiceSQL(db=db), + model_record_service=ModelRecordServiceSQL(db=db, logger=logger), download_queue=download_queue_service, events=events, ) diff --git a/invokeai/app/services/model_records/model_records_sql.py b/invokeai/app/services/model_records/model_records_sql.py index 2f9829dad4..1d0780efe1 100644 --- a/invokeai/app/services/model_records/model_records_sql.py +++ b/invokeai/app/services/model_records/model_records_sql.py @@ -40,11 +40,14 @@ Typical usage: """ import json +import logging import sqlite3 from math import ceil from pathlib import Path from typing import List, Optional, Union +import pydantic + from invokeai.app.services.model_records.model_records_base import ( DuplicateModelException, ModelRecordChanges, @@ -67,7 +70,7 @@ from invokeai.backend.model_manager.config import ( class ModelRecordServiceSQL(ModelRecordServiceBase): """Implementation of the ModelConfigStore ABC using a SQL database.""" - def __init__(self, db: SqliteDatabase): + def __init__(self, db: SqliteDatabase, logger: logging.Logger): """ Initialize a new object from preexisting sqlite3 connection and threading lock objects. @@ -76,6 +79,7 @@ class ModelRecordServiceSQL(ModelRecordServiceBase): super().__init__() self._db = db self._cursor = db.conn.cursor() + self._logger = logger @property def db(self) -> SqliteDatabase: @@ -291,7 +295,20 @@ class ModelRecordServiceSQL(ModelRecordServiceBase): tuple(bindings), ) result = self._cursor.fetchall() - results = [ModelConfigFactory.make_config(json.loads(x[0]), timestamp=x[1]) for x in result] + + # Parse the model configs. + results: list[AnyModelConfig] = [] + for row in result: + try: + model_config = ModelConfigFactory.make_config(json.loads(row[0]), timestamp=row[1]) + except pydantic.ValidationError: + # We catch this error so that the app can still run if there are invalid model configs in the database. + # One reason that an invalid model config might be in the database is if someone had to rollback from a + # newer version of the app that added a new model type. + self._logger.warning(f"Found an invalid model config in the database. Ignoring this model. ({row[0]})") + else: + results.append(model_config) + return results def search_by_path(self, path: Union[str, Path]) -> List[AnyModelConfig]: diff --git a/tests/app/services/model_records/test_model_records_sql.py b/tests/app/services/model_records/test_model_records_sql.py index d39e95ab3d..e6a89dff06 100644 --- a/tests/app/services/model_records/test_model_records_sql.py +++ b/tests/app/services/model_records/test_model_records_sql.py @@ -40,7 +40,7 @@ def store( config._root = datadir logger = InvokeAILogger.get_logger(config=config) db = create_mock_sqlite_database(config, logger) - return ModelRecordServiceSQL(db) + return ModelRecordServiceSQL(db, logger) def example_ti_config(key: Optional[str] = None) -> TextualInversionFileConfig: diff --git a/tests/backend/model_manager/model_manager_fixtures.py b/tests/backend/model_manager/model_manager_fixtures.py index 6fd8c51b54..621b7c65b4 100644 --- a/tests/backend/model_manager/model_manager_fixtures.py +++ b/tests/backend/model_manager/model_manager_fixtures.py @@ -110,7 +110,7 @@ def mm2_installer( logger = InvokeAILogger.get_logger() db = create_mock_sqlite_database(mm2_app_config, logger) events = TestEventService() - store = ModelRecordServiceSQL(db) + store = ModelRecordServiceSQL(db, logger) installer = ModelInstallService( app_config=mm2_app_config, @@ -128,7 +128,7 @@ def mm2_installer( def mm2_record_store(mm2_app_config: InvokeAIAppConfig) -> ModelRecordServiceBase: logger = InvokeAILogger.get_logger(config=mm2_app_config) db = create_mock_sqlite_database(mm2_app_config, logger) - store = ModelRecordServiceSQL(db) + store = ModelRecordServiceSQL(db, logger) # add five simple config records to the database config1 = VAEDiffusersConfig( key="test_config_1", From 84abdc5780dd55a851262d2b1ab5b154425944bf Mon Sep 17 00:00:00 2001 From: psychedelicious <4822129+psychedelicious@users.noreply.github.com> Date: Fri, 12 Jul 2024 10:08:53 +1000 Subject: [PATCH 33/48] fix(ui): prevent cutoff of last board --- .../gallery/components/Boards/BoardsList/BoardsList.tsx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/invokeai/frontend/web/src/features/gallery/components/Boards/BoardsList/BoardsList.tsx b/invokeai/frontend/web/src/features/gallery/components/Boards/BoardsList/BoardsList.tsx index 07e8d9c982..bd4c42e8d1 100644 --- a/invokeai/frontend/web/src/features/gallery/components/Boards/BoardsList/BoardsList.tsx +++ b/invokeai/frontend/web/src/features/gallery/components/Boards/BoardsList/BoardsList.tsx @@ -73,7 +73,7 @@ const BoardsList = () => { )} - + Date: Fri, 12 Jul 2024 10:15:18 +1000 Subject: [PATCH 34/48] fix(ui): handle archived boards like other boards when they are visible, do not reset board selection when autoadd board is hidden --- .../addArchivedOrDeletedBoardListener.ts | 38 ++++--------------- 1 file changed, 7 insertions(+), 31 deletions(-) diff --git a/invokeai/frontend/web/src/app/store/middleware/listenerMiddleware/listeners/addArchivedOrDeletedBoardListener.ts b/invokeai/frontend/web/src/app/store/middleware/listenerMiddleware/listeners/addArchivedOrDeletedBoardListener.ts index 8e0a63fc7d..1581da9b37 100644 --- a/invokeai/frontend/web/src/app/store/middleware/listenerMiddleware/listeners/addArchivedOrDeletedBoardListener.ts +++ b/invokeai/frontend/web/src/app/store/middleware/listenerMiddleware/listeners/addArchivedOrDeletedBoardListener.ts @@ -31,19 +31,13 @@ export const addArchivedOrDeletedBoardListener = (startAppListening: AppStartLis return; } - let didReset = false; - - if (!queryResult.data.find((board) => board.board_id === autoAddBoardId)) { - dispatch(autoAddBoardIdChanged('none')); - didReset = true; - } if (!queryResult.data.find((board) => board.board_id === selectedBoardId)) { dispatch(boardIdSelected({ boardId: 'none' })); - didReset = true; - } - if (didReset) { dispatch(galleryViewChanged('images')); } + if (!queryResult.data.find((board) => board.board_id === autoAddBoardId)) { + dispatch(autoAddBoardIdChanged('none')); + } }, }); @@ -90,25 +84,17 @@ export const addArchivedOrDeletedBoardListener = (startAppListening: AppStartLis return; } - let didReset = false; - // Handle the case where selected board is archived const selectedBoard = queryResult.data.find((b) => b.board_id === selectedBoardId); if (selectedBoard && selectedBoard.archived) { dispatch(boardIdSelected({ boardId: 'none' })); - didReset = true; + dispatch(galleryViewChanged('images')); } // Handle the case where auto-add board is archived const autoAddBoard = queryResult.data.find((b) => b.board_id === autoAddBoardId); if (autoAddBoard && autoAddBoard.archived) { dispatch(autoAddBoardIdChanged('none')); - didReset = true; - } - - // When resetting the auto-add board or selected board, we should also reset the view to images - if (didReset) { - dispatch(galleryViewChanged('images')); } }, }); @@ -123,25 +109,15 @@ export const addArchivedOrDeletedBoardListener = (startAppListening: AppStartLis const state = getState(); const { selectedBoardId, autoAddBoardId } = state.gallery; - let didReset = false; - // Handle the case where selected board isn't in the list of boards - const selectedBoard = boards.find((b) => b.board_id === selectedBoardId); - if (selectedBoard && selectedBoard.archived) { + if (!boards.find((b) => b.board_id === selectedBoardId)) { dispatch(boardIdSelected({ boardId: 'none' })); - didReset = true; + dispatch(galleryViewChanged('images')); } // Handle the case where auto-add board isn't in the list of boards - const autoAddBoard = boards.find((b) => b.board_id === autoAddBoardId); - if (autoAddBoard && autoAddBoard.archived) { + if (!boards.find((b) => b.board_id === autoAddBoardId)) { dispatch(autoAddBoardIdChanged('none')); - didReset = true; - } - - // When resetting the auto-add board or selected board, we should also reset the view to images - if (didReset) { - dispatch(galleryViewChanged('images')); } }, }); From fb1130c6447c9624acca09db6d659babe079f00d Mon Sep 17 00:00:00 2001 From: psychedelicious <4822129+psychedelicious@users.noreply.github.com> Date: Fri, 12 Jul 2024 10:51:07 +1000 Subject: [PATCH 35/48] fix(ui): do not invalidate image dto cache when deleting image --- .../frontend/web/src/services/api/endpoints/images.ts | 9 ++++----- 1 file changed, 4 insertions(+), 5 deletions(-) diff --git a/invokeai/frontend/web/src/services/api/endpoints/images.ts b/invokeai/frontend/web/src/services/api/endpoints/images.ts index 9605bc29c4..2040021d6d 100644 --- a/invokeai/frontend/web/src/services/api/endpoints/images.ts +++ b/invokeai/frontend/web/src/services/api/endpoints/images.ts @@ -93,7 +93,6 @@ export const imagesApi = api.injectEndpoints({ const boardId = imageDTO.board_id ?? 'none'; return [ - { type: 'Image', id: imageDTO.image_name }, { type: 'ImageList', id: getListImagesUrl({ @@ -138,9 +137,6 @@ export const imagesApi = api.injectEndpoints({ id: boardId, }, ]; - for (const imageDTO of imageDTOs) { - tags.push({ type: 'Image', id: imageDTO.image_name }); - } return tags; } @@ -508,7 +504,6 @@ export const imagesApi = api.injectEndpoints({ export const { useGetIntermediatesCountQuery, useListImagesQuery, - useGetImageDTOQuery, useGetImageMetadataQuery, useGetImageWorkflowQuery, useLazyGetImageWorkflowQuery, @@ -526,6 +521,10 @@ export const { useBulkDownloadImagesMutation, } = imagesApi; +export const useGetImageDTOQuery = (...args: Parameters) => { + return imagesApi.useGetImageDTOQuery(...args); +}; + /** * Imperative RTKQ helper to fetch an ImageDTO. * @param image_name The name of the image to fetch From 712cf00a821bd10929422fa2a44de731add7b89b Mon Sep 17 00:00:00 2001 From: psychedelicious <4822129+psychedelicious@users.noreply.github.com> Date: Fri, 12 Jul 2024 10:33:33 +1000 Subject: [PATCH 36/48] fix(app): vae tile size field description --- invokeai/app/invocations/fields.py | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/invokeai/app/invocations/fields.py b/invokeai/app/invocations/fields.py index b792453b47..8374a58959 100644 --- a/invokeai/app/invocations/fields.py +++ b/invokeai/app/invocations/fields.py @@ -160,8 +160,7 @@ class FieldDescriptions: fp32 = "Whether or not to use full float32 precision" precision = "Precision to use" tiled = "Processing using overlapping tiles (reduce memory consumption)" - vae_tile_size = "The tile size for VAE tiling in pixels (image space). If set to 0, the default tile size for the " - "model will be used. Larger tile sizes generally produce better results at the cost of higher memory usage." + vae_tile_size = "The tile size for VAE tiling in pixels (image space). If set to 0, the default tile size for the model will be used. Larger tile sizes generally produce better results at the cost of higher memory usage." detect_res = "Pixel resolution for detection" image_res = "Pixel resolution for output image" safe_mode = "Whether or not to use safe mode" From 84f136e7374e9f24e5099ea53c0124c573b6eb80 Mon Sep 17 00:00:00 2001 From: Riccardo Giovanetti Date: Fri, 12 Jul 2024 17:09:27 +0200 Subject: [PATCH 37/48] translationBot(ui): update translation (Italian) Currently translated at 98.4% (1262 of 1282 strings) Co-authored-by: Riccardo Giovanetti Translate-URL: https://hosted.weblate.org/projects/invokeai/web-ui/it/ Translation: InvokeAI/Web UI --- invokeai/frontend/web/public/locales/it.json | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/invokeai/frontend/web/public/locales/it.json b/invokeai/frontend/web/public/locales/it.json index 25c2e5b9a8..3704ba66a6 100644 --- a/invokeai/frontend/web/public/locales/it.json +++ b/invokeai/frontend/web/public/locales/it.json @@ -962,8 +962,8 @@ "selectedForAutoAdd": "Selezionato per l'aggiunta automatica", "addSharedBoard": "Aggiungi una Bacheca Condivisa", "boards": "Bacheche", - "private": "Privata", - "shared": "Condivisa", + "private": "Bacheche private", + "shared": "Bacheche condivise", "addPrivateBoard": "Aggiungi una Bacheca Privata" }, "controlnet": { From 2c1a91241e2afe2cb30287ebcfb0ee04c7fd37a5 Mon Sep 17 00:00:00 2001 From: "psychedelicious@windows" <4822129+psychedelicious@users.noreply.github.com> Date: Sat, 13 Jul 2024 14:11:44 +1000 Subject: [PATCH 38/48] fix(app): windows indefinite hang while finding port For some reason, I started getting this indefinite hang when the app checks if port 9090 is available. After some fiddling around, I found that adding a timeout resolves the issue. I confirmed that the util still works by starting the app on 9090, then starting a second instance. The second instance correctly saw 9090 in use and moved to 9091. --- invokeai/app/api_app.py | 1 + 1 file changed, 1 insertion(+) diff --git a/invokeai/app/api_app.py b/invokeai/app/api_app.py index dca0bc139d..88820a0c4c 100644 --- a/invokeai/app/api_app.py +++ b/invokeai/app/api_app.py @@ -161,6 +161,7 @@ def invoke_api() -> None: # Taken from https://waylonwalker.com/python-find-available-port/, thanks Waylon! # https://github.com/WaylonWalker with socket.socket(socket.AF_INET, socket.SOCK_STREAM) as s: + s.settimeout(1) if s.connect_ex(("localhost", port)) == 0: return find_port(port=port + 1) else: From 7c0dfd74a5f6159ec4671eef47dec1b70c226e33 Mon Sep 17 00:00:00 2001 From: "psychedelicious@windows" <4822129+psychedelicious@users.noreply.github.com> Date: Sat, 13 Jul 2024 14:28:03 +1000 Subject: [PATCH 39/48] fix(api): deleting large images fails This issue is caused by a race condition. When a large image is served to the client, it is done using a streaming `FileResponse`. This concurrently serves the image straight from disk. The file is kept open by FastAPI until the image is fully served. When a user deletes an image before the file is done serving, the delete fails because the file is still held by FastAPI. To reproduce the issue: - Create a very large image (8k reliably creates the issue). - Create a smaller image, so that the first image in the gallery is not the large image. - Refresh the app. The small image should be selected. - Select the large image and immediately delete it. You have to be fast, to delete it before it finishes loading. - In the terminal, we expect to see an error saying `Failed to delete image file`, and the image does not disappear from the UI. - After a short wait, once the image has fully loaded, try deleting it again. We expect this to work. The workaround is to instead serve the image from memory. Loading the image to memory is very fast, so there is only a tiny window in which we could create the race condition, but it technically could still occur, because FastAPI is asynchronous and handles requests concurrently. Once we load the image into memory, deletions of that image will work. Then we return a normal `Response` object with the image bytes. This is essentially what `FileResponse` does - except it uses `anyio.open_file`, which is async. The tradeoff is that the server thread is blocked while opening the file. I think this is a fair tradeoff. A future enhancement could be to implement soft deletion of images (db is already set up for this), and then clean up deleted image files on startup/shutdown. We could move back to using the async `FileResponse` for best responsiveness in the server without any risk of race conditions. --- invokeai/app/api/routers/images.py | 24 ++++++++---------------- 1 file changed, 8 insertions(+), 16 deletions(-) diff --git a/invokeai/app/api/routers/images.py b/invokeai/app/api/routers/images.py index 8e3824ce93..2bc0b48251 100644 --- a/invokeai/app/api/routers/images.py +++ b/invokeai/app/api/routers/images.py @@ -233,21 +233,14 @@ async def get_image_workflow( ) async def get_image_full( image_name: str = Path(description="The name of full-resolution image file to get"), -) -> FileResponse: +) -> Response: """Gets a full-resolution image file""" try: path = ApiDependencies.invoker.services.images.get_path(image_name) - - if not ApiDependencies.invoker.services.images.validate_path(path): - raise HTTPException(status_code=404) - - response = FileResponse( - path, - media_type="image/png", - filename=image_name, - content_disposition_type="inline", - ) + with open(path, "rb") as f: + content = f.read() + response = Response(content, media_type="image/png") response.headers["Cache-Control"] = f"max-age={IMAGE_MAX_AGE}" return response except Exception: @@ -268,15 +261,14 @@ async def get_image_full( ) async def get_image_thumbnail( image_name: str = Path(description="The name of thumbnail image file to get"), -) -> FileResponse: +) -> Response: """Gets a thumbnail image file""" try: path = ApiDependencies.invoker.services.images.get_path(image_name, thumbnail=True) - if not ApiDependencies.invoker.services.images.validate_path(path): - raise HTTPException(status_code=404) - - response = FileResponse(path, media_type="image/webp", content_disposition_type="inline") + with open(path, "rb") as f: + content = f.read() + response = Response(content, media_type="image/webp") response.headers["Cache-Control"] = f"max-age={IMAGE_MAX_AGE}" return response except Exception: From 3ecd14f39424c4a51e83ea4eb65e128a78c7fee8 Mon Sep 17 00:00:00 2001 From: psychedelicious <4822129+psychedelicious@users.noreply.github.com> Date: Sat, 13 Jul 2024 14:31:00 +1000 Subject: [PATCH 40/48] chore: bump version to 4.2.6rc1 --- invokeai/version/invokeai_version.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/invokeai/version/invokeai_version.py b/invokeai/version/invokeai_version.py index da1546b0a0..021e20d448 100644 --- a/invokeai/version/invokeai_version.py +++ b/invokeai/version/invokeai_version.py @@ -1 +1 @@ -__version__ = "4.2.6a1" +__version__ = "4.2.6rc1" From 5cbe9fafb2ae82a27f6cd9d9e5371e074f8af761 Mon Sep 17 00:00:00 2001 From: psychedelicious <4822129+psychedelicious@users.noreply.github.com> Date: Sun, 14 Jul 2024 21:08:33 +1000 Subject: [PATCH 41/48] fix(ui): clear selection when deleting last image in board --- .../listeners/imageDeletionListeners.ts | 9 ++++++++- 1 file changed, 8 insertions(+), 1 deletion(-) diff --git a/invokeai/frontend/web/src/app/store/middleware/listenerMiddleware/listeners/imageDeletionListeners.ts b/invokeai/frontend/web/src/app/store/middleware/listenerMiddleware/listeners/imageDeletionListeners.ts index 056346cb68..489adb7476 100644 --- a/invokeai/frontend/web/src/app/store/middleware/listenerMiddleware/listeners/imageDeletionListeners.ts +++ b/invokeai/frontend/web/src/app/store/middleware/listenerMiddleware/listeners/imageDeletionListeners.ts @@ -136,7 +136,12 @@ export const addImageDeletionListeners = (startAppListening: AppStartListening) if (data) { const deletedImageIndex = data.items.findIndex((i) => i.image_name === imageDTO.image_name); const nextImage = data.items[deletedImageIndex + 1] ?? data.items[0] ?? null; - dispatch(imageSelected(nextImage)); + if (nextImage?.image_name === imageDTO.image_name) { + // If the next image is the same as the deleted one, it means it was the last image, reset selection + dispatch(imageSelected(null)); + } else { + dispatch(imageSelected(nextImage)); + } } } @@ -176,6 +181,8 @@ export const addImageDeletionListeners = (startAppListening: AppStartListening) const queryArgs = selectListImagesQueryArgs(state); const { data } = imagesApi.endpoints.listImages.select(queryArgs)(state); if (data) { + // When we delete multiple images, we clear the selection. Then, the the next time we load images, we will + // select the first one. This is handled below in the listener for `imagesApi.endpoints.listImages.matchFulfilled`. dispatch(imageSelected(null)); } } From 8539c601e6cd7dee2a438cf6db03f9ae903baa80 Mon Sep 17 00:00:00 2001 From: Riccardo Giovanetti Date: Sun, 14 Jul 2024 18:09:17 +0000 Subject: [PATCH 42/48] translationBot(ui): update translation (Italian) Currently translated at 98.4% (1262 of 1282 strings) Co-authored-by: Riccardo Giovanetti Translate-URL: https://hosted.weblate.org/projects/invokeai/web-ui/it/ Translation: InvokeAI/Web UI --- invokeai/frontend/web/public/locales/it.json | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/invokeai/frontend/web/public/locales/it.json b/invokeai/frontend/web/public/locales/it.json index 3704ba66a6..eced64a1e3 100644 --- a/invokeai/frontend/web/public/locales/it.json +++ b/invokeai/frontend/web/public/locales/it.json @@ -1028,7 +1028,7 @@ "minConfidence": "Confidenza minima", "scribble": "Scarabocchio", "amult": "Angolo di illuminazione", - "coarse": "Approssimativo", + "coarse": "Grossolano", "resizeSimple": "Ridimensiona (semplice)", "large": "Grande", "small": "Piccolo", @@ -1353,7 +1353,7 @@ "lora": { "heading": "LoRA", "paragraphs": [ - "Modelli leggeri utilizzati insieme ai modelli base." + "Modelli concettuali utilizzati insieme ai modelli di base." ] }, "controlNet": { From d7d59d704b4e1aa436b487dfdb55918c5dd1cdfd Mon Sep 17 00:00:00 2001 From: psychedelicious <4822129+psychedelicious@users.noreply.github.com> Date: Mon, 15 Jul 2024 12:54:17 +1000 Subject: [PATCH 43/48] chore: update default workflows - Update all existing defaults - Add Tiled MultiDiffusion workflow --- ...SRGAN Upscaling with Canny ControlNet.json | 470 ++-- ...Adapter & Canny (See Note in Details).json | 654 ++--- .../Multi ControlNet (Canny & Depth).json | 551 +++-- .../MultiDiffusion SDXL (Beta).json | 2181 +++++++++++++++++ .../default_workflows/Prompt from File.json | 229 +- .../Text to Image - SD1.5.json | 225 +- .../Text to Image - SDXL.json | 515 ++-- .../Text to Image with LoRA.json | 185 +- .../Tiled Upscaling (Beta).json | 590 ++--- 9 files changed, 3962 insertions(+), 1638 deletions(-) create mode 100644 invokeai/app/services/workflow_records/default_workflows/MultiDiffusion SDXL (Beta).json diff --git a/invokeai/app/services/workflow_records/default_workflows/ESRGAN Upscaling with Canny ControlNet.json b/invokeai/app/services/workflow_records/default_workflows/ESRGAN Upscaling with Canny ControlNet.json index dd98eca18f..2cadcae961 100644 --- a/invokeai/app/services/workflow_records/default_workflows/ESRGAN Upscaling with Canny ControlNet.json +++ b/invokeai/app/services/workflow_records/default_workflows/ESRGAN Upscaling with Canny ControlNet.json @@ -2,7 +2,7 @@ "name": "ESRGAN Upscaling with Canny ControlNet", "author": "InvokeAI", "description": "Sample workflow for using Upscaling with ControlNet with SD1.5", - "version": "2.0.0", + "version": "2.1.0", "contact": "invoke@invoke.ai", "tags": "upscale, controlnet, default", "notes": "", @@ -36,14 +36,13 @@ "version": "3.0.0", "category": "default" }, - "id": "0e71a27e-a22b-4a9b-b20a-6d789abff2bc", "nodes": [ { - "id": "e8bf67fe-67de-4227-87eb-79e86afdfc74", + "id": "63b6ab7e-5b05-4d1b-a3b1-42d8e53ce16b", "type": "invocation", "data": { - "id": "e8bf67fe-67de-4227-87eb-79e86afdfc74", - "version": "1.1.1", + "id": "63b6ab7e-5b05-4d1b-a3b1-42d8e53ce16b", + "version": "1.2.0", "nodePack": "invokeai", "label": "", "notes": "", @@ -57,6 +56,10 @@ "clip": { "name": "clip", "label": "" + }, + "mask": { + "name": "mask", + "label": "" } }, "isOpen": true, @@ -65,122 +68,63 @@ }, "position": { "x": 1250, - "y": 1500 + "y": 1200 } }, { - "id": "d8ace142-c05f-4f1d-8982-88dc7473958d", + "id": "5ca498a4-c8c8-4580-a396-0c984317205d", "type": "invocation", "data": { - "id": "d8ace142-c05f-4f1d-8982-88dc7473958d", - "version": "1.0.2", + "id": "5ca498a4-c8c8-4580-a396-0c984317205d", + "version": "1.1.0", "nodePack": "invokeai", "label": "", "notes": "", - "type": "main_model_loader", + "type": "i2l", "inputs": { - "model": { - "name": "model", + "image": { + "name": "image", + "label": "" + }, + "vae": { + "name": "vae", + "label": "" + }, + "tiled": { + "name": "tiled", "label": "", - "value": { - "key": "5cd43ca0-dd0a-418d-9f7e-35b2b9d5e106", - "hash": "blake3:6987f323017f597213cc3264250edf57056d21a40a0a85d83a1a33a7d44dc41a", - "name": "Deliberate_v5", - "base": "sd-1", - "type": "main" - } - } - }, - "isOpen": true, - "isIntermediate": true, - "useCache": true - }, - "position": { - "x": 700, - "y": 1375 - } - }, - { - "id": "771bdf6a-0813-4099-a5d8-921a138754d4", - "type": "invocation", - "data": { - "id": "771bdf6a-0813-4099-a5d8-921a138754d4", - "version": "1.0.2", - "nodePack": "invokeai", - "label": "", - "notes": "", - "type": "image", - "inputs": { - "image": { - "name": "image", - "label": "Image To Upscale", - "value": { - "image_name": "d2e42ba6-d420-496b-82db-91c9b75956c1.png" - } - } - }, - "isOpen": true, - "isIntermediate": true, - "useCache": true - }, - "position": { - "x": 344.5593065887157, - "y": 1698.161491368619 - } - }, - { - "id": "f7564dd2-9539-47f2-ac13-190804461f4e", - "type": "invocation", - "data": { - "id": "f7564dd2-9539-47f2-ac13-190804461f4e", - "version": "1.3.2", - "nodePack": "invokeai", - "label": "", - "notes": "", - "type": "esrgan", - "inputs": { - "board": { - "name": "board", - "label": "" - }, - "metadata": { - "name": "metadata", - "label": "" - }, - "image": { - "name": "image", - "label": "" - }, - "model_name": { - "name": "model_name", - "label": "Upscaler Model", - "value": "RealESRGAN_x2plus.pth" + "value": false }, "tile_size": { "name": "tile_size", "label": "", - "value": 400 + "value": 0 + }, + "fp32": { + "name": "fp32", + "label": "", + "value": false } }, - "isOpen": true, + "isOpen": false, "isIntermediate": true, "useCache": true }, "position": { - "x": 717.3863693661265, - "y": 1721.9215053134815 + "x": 1650, + "y": 1675 } }, { - "id": "1d887701-df21-4966-ae6e-a7d82307d7bd", + "id": "3ed9b2ef-f4ec-40a7-94db-92e63b583ec0", "type": "invocation", "data": { - "id": "1d887701-df21-4966-ae6e-a7d82307d7bd", - "version": "1.3.2", + "id": "3ed9b2ef-f4ec-40a7-94db-92e63b583ec0", + "version": "1.3.0", "nodePack": "invokeai", "label": "", "notes": "", - "type": "canny_image_processor", + "type": "l2i", "inputs": { "board": { "name": "board", @@ -190,38 +134,37 @@ "name": "metadata", "label": "" }, - "image": { - "name": "image", + "latents": { + "name": "latents", "label": "" }, - "detect_resolution": { - "name": "detect_resolution", - "label": "", - "value": 512 + "vae": { + "name": "vae", + "label": "" }, - "image_resolution": { - "name": "image_resolution", + "tiled": { + "name": "tiled", "label": "", - "value": 512 + "value": false }, - "low_threshold": { - "name": "low_threshold", + "tile_size": { + "name": "tile_size", "label": "", - "value": 100 + "value": 0 }, - "high_threshold": { - "name": "high_threshold", + "fp32": { + "name": "fp32", "label": "", - "value": 200 + "value": false } }, "isOpen": true, - "isIntermediate": true, + "isIntermediate": false, "useCache": true }, "position": { - "x": 1200, - "y": 1900 + "x": 2559.4751127537957, + "y": 1246.6000376741406 } }, { @@ -229,7 +172,7 @@ "type": "invocation", "data": { "id": "ca1d020c-89a8-4958-880a-016d28775cfa", - "version": "1.1.1", + "version": "1.1.2", "nodePack": "invokeai", "label": "", "notes": "", @@ -285,6 +228,193 @@ "y": 1902.9649340196056 } }, + { + "id": "1d887701-df21-4966-ae6e-a7d82307d7bd", + "type": "invocation", + "data": { + "id": "1d887701-df21-4966-ae6e-a7d82307d7bd", + "version": "1.3.3", + "nodePack": "invokeai", + "label": "", + "notes": "", + "type": "canny_image_processor", + "inputs": { + "board": { + "name": "board", + "label": "" + }, + "metadata": { + "name": "metadata", + "label": "" + }, + "image": { + "name": "image", + "label": "" + }, + "detect_resolution": { + "name": "detect_resolution", + "label": "", + "value": 512 + }, + "image_resolution": { + "name": "image_resolution", + "label": "", + "value": 512 + }, + "low_threshold": { + "name": "low_threshold", + "label": "", + "value": 100 + }, + "high_threshold": { + "name": "high_threshold", + "label": "", + "value": 200 + } + }, + "isOpen": true, + "isIntermediate": true, + "useCache": true + }, + "position": { + "x": 1200, + "y": 1900 + } + }, + { + "id": "d8ace142-c05f-4f1d-8982-88dc7473958d", + "type": "invocation", + "data": { + "id": "d8ace142-c05f-4f1d-8982-88dc7473958d", + "version": "1.0.3", + "nodePack": "invokeai", + "label": "", + "notes": "", + "type": "main_model_loader", + "inputs": { + "model": { + "name": "model", + "label": "", + "value": { + "key": "5cd43ca0-dd0a-418d-9f7e-35b2b9d5e106", + "hash": "blake3:6987f323017f597213cc3264250edf57056d21a40a0a85d83a1a33a7d44dc41a", + "name": "Deliberate_v5", + "base": "sd-1", + "type": "main" + } + } + }, + "isOpen": true, + "isIntermediate": true, + "useCache": true + }, + "position": { + "x": 700, + "y": 1375 + } + }, + { + "id": "e8bf67fe-67de-4227-87eb-79e86afdfc74", + "type": "invocation", + "data": { + "id": "e8bf67fe-67de-4227-87eb-79e86afdfc74", + "version": "1.2.0", + "nodePack": "invokeai", + "label": "", + "notes": "", + "type": "compel", + "inputs": { + "prompt": { + "name": "prompt", + "label": "", + "value": "" + }, + "clip": { + "name": "clip", + "label": "" + }, + "mask": { + "name": "mask", + "label": "" + } + }, + "isOpen": true, + "isIntermediate": true, + "useCache": true + }, + "position": { + "x": 1250, + "y": 1500 + } + }, + { + "id": "771bdf6a-0813-4099-a5d8-921a138754d4", + "type": "invocation", + "data": { + "id": "771bdf6a-0813-4099-a5d8-921a138754d4", + "version": "1.0.2", + "nodePack": "invokeai", + "label": "", + "notes": "", + "type": "image", + "inputs": { + "image": { + "name": "image", + "label": "Image To Upscale" + } + }, + "isOpen": true, + "isIntermediate": true, + "useCache": true + }, + "position": { + "x": 344.5593065887157, + "y": 1698.161491368619 + } + }, + { + "id": "f7564dd2-9539-47f2-ac13-190804461f4e", + "type": "invocation", + "data": { + "id": "f7564dd2-9539-47f2-ac13-190804461f4e", + "version": "1.3.2", + "nodePack": "invokeai", + "label": "", + "notes": "", + "type": "esrgan", + "inputs": { + "board": { + "name": "board", + "label": "" + }, + "metadata": { + "name": "metadata", + "label": "" + }, + "image": { + "name": "image", + "label": "" + }, + "model_name": { + "name": "model_name", + "label": "Upscaler Model", + "value": "RealESRGAN_x2plus.pth" + }, + "tile_size": { + "name": "tile_size", + "label": "", + "value": 400 + } + }, + "isOpen": true, + "isIntermediate": true, + "useCache": true + }, + "position": { + "x": 717.3863693661265, + "y": 1721.9215053134815 + } + }, { "id": "f50624ce-82bf-41d0-bdf7-8aab11a80d48", "type": "invocation", @@ -413,122 +543,6 @@ "y": 1232.6219060454753 } }, - { - "id": "3ed9b2ef-f4ec-40a7-94db-92e63b583ec0", - "type": "invocation", - "data": { - "id": "3ed9b2ef-f4ec-40a7-94db-92e63b583ec0", - "version": "1.2.2", - "nodePack": "invokeai", - "label": "", - "notes": "", - "type": "l2i", - "inputs": { - "board": { - "name": "board", - "label": "" - }, - "metadata": { - "name": "metadata", - "label": "" - }, - "latents": { - "name": "latents", - "label": "" - }, - "vae": { - "name": "vae", - "label": "" - }, - "tiled": { - "name": "tiled", - "label": "", - "value": false - }, - "fp32": { - "name": "fp32", - "label": "", - "value": false - } - }, - "isOpen": true, - "isIntermediate": false, - "useCache": true - }, - "position": { - "x": 2559.4751127537957, - "y": 1246.6000376741406 - } - }, - { - "id": "5ca498a4-c8c8-4580-a396-0c984317205d", - "type": "invocation", - "data": { - "id": "5ca498a4-c8c8-4580-a396-0c984317205d", - "version": "1.0.2", - "nodePack": "invokeai", - "label": "", - "notes": "", - "type": "i2l", - "inputs": { - "image": { - "name": "image", - "label": "" - }, - "vae": { - "name": "vae", - "label": "" - }, - "tiled": { - "name": "tiled", - "label": "", - "value": false - }, - "fp32": { - "name": "fp32", - "label": "", - "value": false - } - }, - "isOpen": false, - "isIntermediate": true, - "useCache": true - }, - "position": { - "x": 1650, - "y": 1675 - } - }, - { - "id": "63b6ab7e-5b05-4d1b-a3b1-42d8e53ce16b", - "type": "invocation", - "data": { - "id": "63b6ab7e-5b05-4d1b-a3b1-42d8e53ce16b", - "version": "1.1.1", - "nodePack": "invokeai", - "label": "", - "notes": "", - "type": "compel", - "inputs": { - "prompt": { - "name": "prompt", - "label": "", - "value": "" - }, - "clip": { - "name": "clip", - "label": "" - } - }, - "isOpen": true, - "isIntermediate": true, - "useCache": true - }, - "position": { - "x": 1250, - "y": 1200 - } - }, { "id": "eb8f6f8a-c7b1-4914-806e-045ee2717a35", "type": "invocation", diff --git a/invokeai/app/services/workflow_records/default_workflows/Face Detailer with IP-Adapter & Canny (See Note in Details).json b/invokeai/app/services/workflow_records/default_workflows/Face Detailer with IP-Adapter & Canny (See Note in Details).json index 8c7dcee30c..481ba85e64 100644 --- a/invokeai/app/services/workflow_records/default_workflows/Face Detailer with IP-Adapter & Canny (See Note in Details).json +++ b/invokeai/app/services/workflow_records/default_workflows/Face Detailer with IP-Adapter & Canny (See Note in Details).json @@ -2,7 +2,7 @@ "name": "Face Detailer with IP-Adapter & Canny (See Note in Details)", "author": "kosmoskatten", "description": "A workflow to add detail to and improve faces. This workflow is most effective when used with a model that creates realistic outputs. ", - "version": "2.0.0", + "version": "2.1.0", "contact": "invoke@invoke.ai", "tags": "face detailer, IP-Adapter, Canny", "notes": "Set this image as the blur mask: https://i.imgur.com/Gxi61zP.png", @@ -37,16 +37,219 @@ } ], "meta": { - "category": "default", - "version": "3.0.0" + "version": "3.0.0", + "category": "default" }, "nodes": [ { - "id": "44f2c190-eb03-460d-8d11-a94d13b33f19", + "id": "c6359181-6479-40ec-bf3a-b7e8451683b8", "type": "invocation", "data": { - "id": "44f2c190-eb03-460d-8d11-a94d13b33f19", - "version": "1.1.1", + "id": "c6359181-6479-40ec-bf3a-b7e8451683b8", + "version": "1.0.3", + "label": "", + "notes": "", + "type": "main_model_loader", + "inputs": { + "model": { + "name": "model", + "label": "" + } + }, + "isOpen": true, + "isIntermediate": true, + "useCache": true + }, + "position": { + "x": 2031.5518710051792, + "y": -492.1742944307074 + } + }, + { + "id": "8fe598c6-d447-44fa-a165-4975af77d080", + "type": "invocation", + "data": { + "id": "8fe598c6-d447-44fa-a165-4975af77d080", + "version": "1.3.3", + "nodePack": "invokeai", + "label": "", + "notes": "", + "type": "canny_image_processor", + "inputs": { + "board": { + "name": "board", + "label": "" + }, + "metadata": { + "name": "metadata", + "label": "" + }, + "image": { + "name": "image", + "label": "" + }, + "detect_resolution": { + "name": "detect_resolution", + "label": "", + "value": 512 + }, + "image_resolution": { + "name": "image_resolution", + "label": "", + "value": 512 + }, + "low_threshold": { + "name": "low_threshold", + "label": "", + "value": 100 + }, + "high_threshold": { + "name": "high_threshold", + "label": "", + "value": 200 + } + }, + "isOpen": true, + "isIntermediate": true, + "useCache": true + }, + "position": { + "x": 3519.4131037388597, + "y": 576.7946795840575 + } + }, + { + "id": "f60b6161-8f26-42f6-89ff-545e6011e501", + "type": "invocation", + "data": { + "id": "f60b6161-8f26-42f6-89ff-545e6011e501", + "version": "1.1.2", + "nodePack": "invokeai", + "label": "", + "notes": "", + "type": "controlnet", + "inputs": { + "image": { + "name": "image", + "label": "" + }, + "control_model": { + "name": "control_model", + "label": "Control Model (select canny)", + "value": { + "key": "5bdaacf7-a7a3-4fb8-b394-cc0ffbb8941d", + "hash": "blake3:260c7f8e10aefea9868cfc68d89970e91033bd37132b14b903e70ee05ebf530e", + "name": "sd-controlnet-canny", + "base": "sd-1", + "type": "controlnet" + } + }, + "control_weight": { + "name": "control_weight", + "label": "", + "value": 0.5 + }, + "begin_step_percent": { + "name": "begin_step_percent", + "label": "", + "value": 0 + }, + "end_step_percent": { + "name": "end_step_percent", + "label": "", + "value": 0.5 + }, + "control_mode": { + "name": "control_mode", + "label": "", + "value": "balanced" + }, + "resize_mode": { + "name": "resize_mode", + "label": "", + "value": "just_resize" + } + }, + "isOpen": true, + "isIntermediate": true, + "useCache": true + }, + "position": { + "x": 3950, + "y": 150 + } + }, + { + "id": "22b750db-b85e-486b-b278-ac983e329813", + "type": "invocation", + "data": { + "id": "22b750db-b85e-486b-b278-ac983e329813", + "version": "1.4.1", + "nodePack": "invokeai", + "label": "", + "notes": "", + "type": "ip_adapter", + "inputs": { + "image": { + "name": "image", + "label": "" + }, + "ip_adapter_model": { + "name": "ip_adapter_model", + "label": "IP-Adapter Model (select IP Adapter Face)", + "value": { + "key": "1cc210bb-4d0a-4312-b36c-b5d46c43768e", + "hash": "blake3:3d669dffa7471b357b4df088b99ffb6bf4d4383d5e0ef1de5ec1c89728a3d5a5", + "name": "ip_adapter_sd15", + "base": "sd-1", + "type": "ip_adapter" + } + }, + "clip_vision_model": { + "name": "clip_vision_model", + "label": "", + "value": "ViT-H" + }, + "weight": { + "name": "weight", + "label": "", + "value": 0.5 + }, + "method": { + "name": "method", + "label": "", + "value": "full" + }, + "begin_step_percent": { + "name": "begin_step_percent", + "label": "", + "value": 0 + }, + "end_step_percent": { + "name": "end_step_percent", + "label": "", + "value": 0.8 + }, + "mask": { + "name": "mask", + "label": "" + } + }, + "isOpen": true, + "isIntermediate": true, + "useCache": true + }, + "position": { + "x": 3575, + "y": -200 + } + }, + { + "id": "f4d15b64-c4a6-42a5-90fc-e4ed07a0ca65", + "type": "invocation", + "data": { + "id": "f4d15b64-c4a6-42a5-90fc-e4ed07a0ca65", + "version": "1.2.0", "nodePack": "invokeai", "label": "", "notes": "", @@ -60,6 +263,140 @@ "clip": { "name": "clip", "label": "" + }, + "mask": { + "name": "mask", + "label": "" + } + }, + "isOpen": true, + "isIntermediate": true, + "useCache": true + }, + "position": { + "x": 2550, + "y": -525 + } + }, + { + "id": "2224ed72-2453-4252-bd89-3085240e0b6f", + "type": "invocation", + "data": { + "id": "2224ed72-2453-4252-bd89-3085240e0b6f", + "version": "1.3.0", + "nodePack": "invokeai", + "label": "", + "notes": "", + "type": "l2i", + "inputs": { + "board": { + "name": "board", + "label": "" + }, + "metadata": { + "name": "metadata", + "label": "" + }, + "latents": { + "name": "latents", + "label": "" + }, + "vae": { + "name": "vae", + "label": "" + }, + "tiled": { + "name": "tiled", + "label": "", + "value": false + }, + "tile_size": { + "name": "tile_size", + "label": "", + "value": 0 + }, + "fp32": { + "name": "fp32", + "label": "", + "value": true + } + }, + "isOpen": true, + "isIntermediate": false, + "useCache": true + }, + "position": { + "x": 4980.1395106966565, + "y": -255.9158921745602 + } + }, + { + "id": "de8b1a48-a2e4-42ca-90bb-66058bffd534", + "type": "invocation", + "data": { + "id": "de8b1a48-a2e4-42ca-90bb-66058bffd534", + "version": "1.1.0", + "nodePack": "invokeai", + "label": "", + "notes": "", + "type": "i2l", + "inputs": { + "image": { + "name": "image", + "label": "" + }, + "vae": { + "name": "vae", + "label": "" + }, + "tiled": { + "name": "tiled", + "label": "", + "value": false + }, + "tile_size": { + "name": "tile_size", + "label": "", + "value": 0 + }, + "fp32": { + "name": "fp32", + "label": "", + "value": true + } + }, + "isOpen": false, + "isIntermediate": true, + "useCache": true + }, + "position": { + "x": 3100, + "y": -275 + } + }, + { + "id": "44f2c190-eb03-460d-8d11-a94d13b33f19", + "type": "invocation", + "data": { + "id": "44f2c190-eb03-460d-8d11-a94d13b33f19", + "version": "1.2.0", + "nodePack": "invokeai", + "label": "", + "notes": "", + "type": "compel", + "inputs": { + "prompt": { + "name": "prompt", + "label": "", + "value": "" + }, + "clip": { + "name": "clip", + "label": "" + }, + "mask": { + "name": "mask", + "label": "" } }, "isOpen": true, @@ -251,45 +588,6 @@ "y": 0 } }, - { - "id": "de8b1a48-a2e4-42ca-90bb-66058bffd534", - "type": "invocation", - "data": { - "id": "de8b1a48-a2e4-42ca-90bb-66058bffd534", - "version": "1.0.2", - "nodePack": "invokeai", - "label": "", - "notes": "", - "type": "i2l", - "inputs": { - "image": { - "name": "image", - "label": "" - }, - "vae": { - "name": "vae", - "label": "" - }, - "tiled": { - "name": "tiled", - "label": "", - "value": false - }, - "fp32": { - "name": "fp32", - "label": "", - "value": true - } - }, - "isOpen": false, - "isIntermediate": true, - "useCache": true - }, - "position": { - "x": 3100, - "y": -275 - } - }, { "id": "bd06261d-a74a-4d1f-8374-745ed6194bc2", "type": "invocation", @@ -418,53 +716,6 @@ "y": -175 } }, - { - "id": "2224ed72-2453-4252-bd89-3085240e0b6f", - "type": "invocation", - "data": { - "id": "2224ed72-2453-4252-bd89-3085240e0b6f", - "version": "1.2.2", - "nodePack": "invokeai", - "label": "", - "notes": "", - "type": "l2i", - "inputs": { - "board": { - "name": "board", - "label": "" - }, - "metadata": { - "name": "metadata", - "label": "" - }, - "latents": { - "name": "latents", - "label": "" - }, - "vae": { - "name": "vae", - "label": "" - }, - "tiled": { - "name": "tiled", - "label": "", - "value": false - }, - "fp32": { - "name": "fp32", - "label": "", - "value": true - } - }, - "isOpen": true, - "isIntermediate": false, - "useCache": true - }, - "position": { - "x": 4980.1395106966565, - "y": -255.9158921745602 - } - }, { "id": "2974e5b3-3d41-4b6f-9953-cd21e8f3a323", "type": "invocation", @@ -692,201 +943,6 @@ "y": -275 } }, - { - "id": "f4d15b64-c4a6-42a5-90fc-e4ed07a0ca65", - "type": "invocation", - "data": { - "id": "f4d15b64-c4a6-42a5-90fc-e4ed07a0ca65", - "version": "1.1.1", - "nodePack": "invokeai", - "label": "", - "notes": "", - "type": "compel", - "inputs": { - "prompt": { - "name": "prompt", - "label": "", - "value": "" - }, - "clip": { - "name": "clip", - "label": "" - } - }, - "isOpen": true, - "isIntermediate": true, - "useCache": true - }, - "position": { - "x": 2550, - "y": -525 - } - }, - { - "id": "22b750db-b85e-486b-b278-ac983e329813", - "type": "invocation", - "data": { - "id": "22b750db-b85e-486b-b278-ac983e329813", - "version": "1.2.2", - "nodePack": "invokeai", - "label": "", - "notes": "", - "type": "ip_adapter", - "inputs": { - "image": { - "name": "image", - "label": "" - }, - "ip_adapter_model": { - "name": "ip_adapter_model", - "label": "IP-Adapter Model (select IP Adapter Face)", - "value": { - "key": "1cc210bb-4d0a-4312-b36c-b5d46c43768e", - "hash": "blake3:3d669dffa7471b357b4df088b99ffb6bf4d4383d5e0ef1de5ec1c89728a3d5a5", - "name": "ip_adapter_sd15", - "base": "sd-1", - "type": "ip_adapter" - } - }, - "weight": { - "name": "weight", - "label": "", - "value": 0.5 - }, - "begin_step_percent": { - "name": "begin_step_percent", - "label": "", - "value": 0 - }, - "end_step_percent": { - "name": "end_step_percent", - "label": "", - "value": 0.8 - } - }, - "isOpen": true, - "isIntermediate": true, - "useCache": true - }, - "position": { - "x": 3575, - "y": -200 - } - }, - { - "id": "f60b6161-8f26-42f6-89ff-545e6011e501", - "type": "invocation", - "data": { - "id": "f60b6161-8f26-42f6-89ff-545e6011e501", - "version": "1.1.1", - "nodePack": "invokeai", - "label": "", - "notes": "", - "type": "controlnet", - "inputs": { - "image": { - "name": "image", - "label": "" - }, - "control_model": { - "name": "control_model", - "label": "Control Model (select canny)", - "value": { - "key": "5bdaacf7-a7a3-4fb8-b394-cc0ffbb8941d", - "hash": "blake3:260c7f8e10aefea9868cfc68d89970e91033bd37132b14b903e70ee05ebf530e", - "name": "sd-controlnet-canny", - "base": "sd-1", - "type": "controlnet" - } - }, - "control_weight": { - "name": "control_weight", - "label": "", - "value": 0.5 - }, - "begin_step_percent": { - "name": "begin_step_percent", - "label": "", - "value": 0 - }, - "end_step_percent": { - "name": "end_step_percent", - "label": "", - "value": 0.5 - }, - "control_mode": { - "name": "control_mode", - "label": "", - "value": "balanced" - }, - "resize_mode": { - "name": "resize_mode", - "label": "", - "value": "just_resize" - } - }, - "isOpen": true, - "isIntermediate": true, - "useCache": true - }, - "position": { - "x": 3950, - "y": 150 - } - }, - { - "id": "8fe598c6-d447-44fa-a165-4975af77d080", - "type": "invocation", - "data": { - "id": "8fe598c6-d447-44fa-a165-4975af77d080", - "version": "1.3.2", - "nodePack": "invokeai", - "label": "", - "notes": "", - "type": "canny_image_processor", - "inputs": { - "board": { - "name": "board", - "label": "" - }, - "metadata": { - "name": "metadata", - "label": "" - }, - "image": { - "name": "image", - "label": "" - }, - "detect_resolution": { - "name": "detect_resolution", - "label": "", - "value": 512 - }, - "image_resolution": { - "name": "image_resolution", - "label": "", - "value": 512 - }, - "low_threshold": { - "name": "low_threshold", - "label": "", - "value": 100 - }, - "high_threshold": { - "name": "high_threshold", - "label": "", - "value": 200 - } - }, - "isOpen": true, - "isIntermediate": true, - "useCache": true - }, - "position": { - "x": 3519.4131037388597, - "y": 576.7946795840575 - } - }, { "id": "4bd4ae80-567f-4366-b8c6-3bb06f4fb46a", "type": "invocation", @@ -1035,30 +1091,6 @@ "x": 2578.2364832140506, "y": 78.7948456497351 } - }, - { - "id": "c6359181-6479-40ec-bf3a-b7e8451683b8", - "type": "invocation", - "data": { - "id": "c6359181-6479-40ec-bf3a-b7e8451683b8", - "version": "1.0.2", - "label": "", - "notes": "", - "type": "main_model_loader", - "inputs": { - "model": { - "name": "model", - "label": "" - } - }, - "isOpen": true, - "isIntermediate": true, - "useCache": true - }, - "position": { - "x": 2031.5518710051792, - "y": -492.1742944307074 - } } ], "edges": [ diff --git a/invokeai/app/services/workflow_records/default_workflows/Multi ControlNet (Canny & Depth).json b/invokeai/app/services/workflow_records/default_workflows/Multi ControlNet (Canny & Depth).json index d859094216..3ff99b5eb3 100644 --- a/invokeai/app/services/workflow_records/default_workflows/Multi ControlNet (Canny & Depth).json +++ b/invokeai/app/services/workflow_records/default_workflows/Multi ControlNet (Canny & Depth).json @@ -2,7 +2,7 @@ "name": "Multi ControlNet (Canny & Depth)", "author": "InvokeAI", "description": "A sample workflow using canny & depth ControlNets to guide the generation process. ", - "version": "2.0.0", + "version": "2.1.0", "contact": "invoke@invoke.ai", "tags": "ControlNet, canny, depth", "notes": "", @@ -37,140 +37,104 @@ } ], "meta": { - "category": "default", - "version": "3.0.0" + "version": "3.0.0", + "category": "default" }, "nodes": [ { - "id": "8e860e51-5045-456e-bf04-9a62a2a5c49e", + "id": "9db25398-c869-4a63-8815-c6559341ef12", "type": "invocation", "data": { - "id": "8e860e51-5045-456e-bf04-9a62a2a5c49e", - "version": "1.0.2", + "id": "9db25398-c869-4a63-8815-c6559341ef12", + "version": "1.3.0", "nodePack": "invokeai", "label": "", "notes": "", - "type": "image", + "type": "l2i", "inputs": { - "image": { - "name": "image", - "label": "Depth Input Image" - } - }, - "isOpen": true, - "isIntermediate": true, - "useCache": true - }, - "position": { - "x": 3666.135718057363, - "y": 186.66887319822808 - } - }, - { - "id": "a33199c2-8340-401e-b8a2-42ffa875fc1c", - "type": "invocation", - "data": { - "id": "a33199c2-8340-401e-b8a2-42ffa875fc1c", - "version": "1.1.1", - "nodePack": "invokeai", - "label": "", - "notes": "", - "type": "controlnet", - "inputs": { - "image": { - "name": "image", + "board": { + "name": "board", "label": "" }, - "control_model": { - "name": "control_model", - "label": "Control Model (select depth)", - "value": { - "key": "87e8855c-671f-4c9e-bbbb-8ed47ccb4aac", - "hash": "blake3:2550bf22a53942dfa28ab2fed9d10d80851112531f44d977168992edf9d0534c", - "name": "control_v11f1p_sd15_depth", - "base": "sd-1", - "type": "controlnet" - } + "metadata": { + "name": "metadata", + "label": "" }, - "control_weight": { - "name": "control_weight", + "latents": { + "name": "latents", + "label": "" + }, + "vae": { + "name": "vae", + "label": "" + }, + "tiled": { + "name": "tiled", "label": "", - "value": 1 + "value": false }, - "begin_step_percent": { - "name": "begin_step_percent", + "tile_size": { + "name": "tile_size", "label": "", "value": 0 }, - "end_step_percent": { - "name": "end_step_percent", + "fp32": { + "name": "fp32", "label": "", - "value": 1 - }, - "control_mode": { - "name": "control_mode", - "label": "", - "value": "balanced" - }, - "resize_mode": { - "name": "resize_mode", - "label": "", - "value": "just_resize" + "value": false } }, "isOpen": true, - "isIntermediate": true, + "isIntermediate": false, "useCache": true }, "position": { - "x": 4477.604342844504, - "y": -49.39005411272677 - } - }, - { - "id": "273e3f96-49ea-4dc5-9d5b-9660390f14e1", - "type": "invocation", - "data": { - "id": "273e3f96-49ea-4dc5-9d5b-9660390f14e1", - "version": "1.1.1", - "nodePack": "invokeai", - "label": "", - "notes": "", - "type": "compel", - "inputs": { - "prompt": { - "name": "prompt", - "label": "Negative Prompt", - "value": "" - }, - "clip": { - "name": "clip", - "label": "" - } - }, - "isOpen": true, - "isIntermediate": true, - "useCache": true - }, - "position": { - "x": 4075, + "x": 5675, "y": -825 } }, { - "id": "54486974-835b-4d81-8f82-05f9f32ce9e9", + "id": "c826ba5e-9676-4475-b260-07b85e88753c", "type": "invocation", "data": { - "id": "54486974-835b-4d81-8f82-05f9f32ce9e9", - "version": "1.0.2", + "id": "c826ba5e-9676-4475-b260-07b85e88753c", + "version": "1.3.3", "nodePack": "invokeai", "label": "", "notes": "", - "type": "main_model_loader", + "type": "canny_image_processor", "inputs": { - "model": { - "name": "model", + "board": { + "name": "board", "label": "" + }, + "metadata": { + "name": "metadata", + "label": "" + }, + "image": { + "name": "image", + "label": "" + }, + "detect_resolution": { + "name": "detect_resolution", + "label": "", + "value": 512 + }, + "image_resolution": { + "name": "image_resolution", + "label": "", + "value": 512 + }, + "low_threshold": { + "name": "low_threshold", + "label": "", + "value": 100 + }, + "high_threshold": { + "name": "high_threshold", + "label": "", + "value": 200 } }, "isOpen": true, @@ -178,29 +142,52 @@ "useCache": true }, "position": { - "x": 3600, - "y": -1000 + "x": 4095.757337055795, + "y": -455.63440891935863 } }, { - "id": "7ce68934-3419-42d4-ac70-82cfc9397306", + "id": "018b1214-c2af-43a7-9910-fb687c6726d7", "type": "invocation", "data": { - "id": "7ce68934-3419-42d4-ac70-82cfc9397306", - "version": "1.1.1", + "id": "018b1214-c2af-43a7-9910-fb687c6726d7", + "version": "1.2.4", "nodePack": "invokeai", "label": "", "notes": "", - "type": "compel", + "type": "midas_depth_image_processor", "inputs": { - "prompt": { - "name": "prompt", - "label": "Positive Prompt", - "value": "" - }, - "clip": { - "name": "clip", + "board": { + "name": "board", "label": "" + }, + "metadata": { + "name": "metadata", + "label": "" + }, + "image": { + "name": "image", + "label": "" + }, + "a_mult": { + "name": "a_mult", + "label": "", + "value": 2 + }, + "bg_th": { + "name": "bg_th", + "label": "", + "value": 0.1 + }, + "detect_resolution": { + "name": "detect_resolution", + "label": "", + "value": 512 + }, + "image_resolution": { + "name": "image_resolution", + "label": "", + "value": 512 } }, "isOpen": true, @@ -208,8 +195,8 @@ "useCache": true }, "position": { - "x": 4075, - "y": -1125 + "x": 4082.783145980783, + "y": 0.01629251229994111 } }, { @@ -217,7 +204,7 @@ "type": "invocation", "data": { "id": "d204d184-f209-4fae-a0a1-d152800844e1", - "version": "1.1.1", + "version": "1.1.2", "nodePack": "invokeai", "label": "", "notes": "", @@ -273,6 +260,185 @@ "y": -618.4221638099414 } }, + { + "id": "7ce68934-3419-42d4-ac70-82cfc9397306", + "type": "invocation", + "data": { + "id": "7ce68934-3419-42d4-ac70-82cfc9397306", + "version": "1.2.0", + "nodePack": "invokeai", + "label": "", + "notes": "", + "type": "compel", + "inputs": { + "prompt": { + "name": "prompt", + "label": "Positive Prompt", + "value": "" + }, + "clip": { + "name": "clip", + "label": "" + }, + "mask": { + "name": "mask", + "label": "" + } + }, + "isOpen": true, + "isIntermediate": true, + "useCache": true + }, + "position": { + "x": 4075, + "y": -1125 + } + }, + { + "id": "54486974-835b-4d81-8f82-05f9f32ce9e9", + "type": "invocation", + "data": { + "id": "54486974-835b-4d81-8f82-05f9f32ce9e9", + "version": "1.0.3", + "nodePack": "invokeai", + "label": "", + "notes": "", + "type": "main_model_loader", + "inputs": { + "model": { + "name": "model", + "label": "" + } + }, + "isOpen": true, + "isIntermediate": true, + "useCache": true + }, + "position": { + "x": 3600, + "y": -1000 + } + }, + { + "id": "273e3f96-49ea-4dc5-9d5b-9660390f14e1", + "type": "invocation", + "data": { + "id": "273e3f96-49ea-4dc5-9d5b-9660390f14e1", + "version": "1.2.0", + "nodePack": "invokeai", + "label": "", + "notes": "", + "type": "compel", + "inputs": { + "prompt": { + "name": "prompt", + "label": "Negative Prompt", + "value": "" + }, + "clip": { + "name": "clip", + "label": "" + }, + "mask": { + "name": "mask", + "label": "" + } + }, + "isOpen": true, + "isIntermediate": true, + "useCache": true + }, + "position": { + "x": 4075, + "y": -825 + } + }, + { + "id": "a33199c2-8340-401e-b8a2-42ffa875fc1c", + "type": "invocation", + "data": { + "id": "a33199c2-8340-401e-b8a2-42ffa875fc1c", + "version": "1.1.2", + "nodePack": "invokeai", + "label": "", + "notes": "", + "type": "controlnet", + "inputs": { + "image": { + "name": "image", + "label": "" + }, + "control_model": { + "name": "control_model", + "label": "Control Model (select depth)", + "value": { + "key": "87e8855c-671f-4c9e-bbbb-8ed47ccb4aac", + "hash": "blake3:2550bf22a53942dfa28ab2fed9d10d80851112531f44d977168992edf9d0534c", + "name": "control_v11f1p_sd15_depth", + "base": "sd-1", + "type": "controlnet" + } + }, + "control_weight": { + "name": "control_weight", + "label": "", + "value": 1 + }, + "begin_step_percent": { + "name": "begin_step_percent", + "label": "", + "value": 0 + }, + "end_step_percent": { + "name": "end_step_percent", + "label": "", + "value": 1 + }, + "control_mode": { + "name": "control_mode", + "label": "", + "value": "balanced" + }, + "resize_mode": { + "name": "resize_mode", + "label": "", + "value": "just_resize" + } + }, + "isOpen": true, + "isIntermediate": true, + "useCache": true + }, + "position": { + "x": 4477.604342844504, + "y": -49.39005411272677 + } + }, + { + "id": "8e860e51-5045-456e-bf04-9a62a2a5c49e", + "type": "invocation", + "data": { + "id": "8e860e51-5045-456e-bf04-9a62a2a5c49e", + "version": "1.0.2", + "nodePack": "invokeai", + "label": "", + "notes": "", + "type": "image", + "inputs": { + "image": { + "name": "image", + "label": "Depth Input Image" + } + }, + "isOpen": true, + "isIntermediate": true, + "useCache": true + }, + "position": { + "x": 3666.135718057363, + "y": 186.66887319822808 + } + }, { "id": "c4b23e64-7986-40c4-9cad-46327b12e204", "type": "invocation", @@ -322,159 +488,6 @@ "y": -575 } }, - { - "id": "018b1214-c2af-43a7-9910-fb687c6726d7", - "type": "invocation", - "data": { - "id": "018b1214-c2af-43a7-9910-fb687c6726d7", - "version": "1.2.3", - "nodePack": "invokeai", - "label": "", - "notes": "", - "type": "midas_depth_image_processor", - "inputs": { - "board": { - "name": "board", - "label": "" - }, - "metadata": { - "name": "metadata", - "label": "" - }, - "image": { - "name": "image", - "label": "" - }, - "a_mult": { - "name": "a_mult", - "label": "", - "value": 2 - }, - "bg_th": { - "name": "bg_th", - "label": "", - "value": 0.1 - }, - "detect_resolution": { - "name": "detect_resolution", - "label": "", - "value": 512 - }, - "image_resolution": { - "name": "image_resolution", - "label": "", - "value": 512 - } - }, - "isOpen": true, - "isIntermediate": true, - "useCache": true - }, - "position": { - "x": 4082.783145980783, - "y": 0.01629251229994111 - } - }, - { - "id": "c826ba5e-9676-4475-b260-07b85e88753c", - "type": "invocation", - "data": { - "id": "c826ba5e-9676-4475-b260-07b85e88753c", - "version": "1.3.2", - "nodePack": "invokeai", - "label": "", - "notes": "", - "type": "canny_image_processor", - "inputs": { - "board": { - "name": "board", - "label": "" - }, - "metadata": { - "name": "metadata", - "label": "" - }, - "image": { - "name": "image", - "label": "" - }, - "detect_resolution": { - "name": "detect_resolution", - "label": "", - "value": 512 - }, - "image_resolution": { - "name": "image_resolution", - "label": "", - "value": 512 - }, - "low_threshold": { - "name": "low_threshold", - "label": "", - "value": 100 - }, - "high_threshold": { - "name": "high_threshold", - "label": "", - "value": 200 - } - }, - "isOpen": true, - "isIntermediate": true, - "useCache": true - }, - "position": { - "x": 4095.757337055795, - "y": -455.63440891935863 - } - }, - { - "id": "9db25398-c869-4a63-8815-c6559341ef12", - "type": "invocation", - "data": { - "id": "9db25398-c869-4a63-8815-c6559341ef12", - "version": "1.2.2", - "nodePack": "invokeai", - "label": "", - "notes": "", - "type": "l2i", - "inputs": { - "board": { - "name": "board", - "label": "" - }, - "metadata": { - "name": "metadata", - "label": "" - }, - "latents": { - "name": "latents", - "label": "" - }, - "vae": { - "name": "vae", - "label": "" - }, - "tiled": { - "name": "tiled", - "label": "", - "value": false - }, - "fp32": { - "name": "fp32", - "label": "", - "value": false - } - }, - "isOpen": true, - "isIntermediate": false, - "useCache": true - }, - "position": { - "x": 5675, - "y": -825 - } - }, { "id": "ac481b7f-08bf-4a9d-9e0c-3a82ea5243ce", "type": "invocation", diff --git a/invokeai/app/services/workflow_records/default_workflows/MultiDiffusion SDXL (Beta).json b/invokeai/app/services/workflow_records/default_workflows/MultiDiffusion SDXL (Beta).json new file mode 100644 index 0000000000..b2842315c4 --- /dev/null +++ b/invokeai/app/services/workflow_records/default_workflows/MultiDiffusion SDXL (Beta).json @@ -0,0 +1,2181 @@ +{ + "name": "MultiDiffusion SDXL (Beta)", + "author": "Invoke", + "description": "A workflow to upscale an input image with tiled upscaling, using SDXL based models.", + "version": "1.0.0", + "contact": "invoke@invoke.ai", + "tags": "tiled, upscaling, sdxl", + "notes": "", + "exposedFields": [ + { + "nodeId": "1ba845a6-eb88-49a1-a490-5fe6754f3ec9", + "fieldName": "value" + }, + { + "nodeId": "c3b60a50-8039-4924-90e3-8c608e1fecb5", + "fieldName": "board" + }, + { + "nodeId": "5ca87ace-edf9-49c7-a424-cd42416b86a7", + "fieldName": "image" + }, + { + "nodeId": "1dd915a3-6756-48ed-b68b-ee3b4bd06c1d", + "fieldName": "a" + }, + { + "nodeId": "696de0e1-cdd2-42e8-abeb-57a926bc6df6", + "fieldName": "a" + }, + { + "nodeId": "bd094e2f-41e5-4b61-9f7b-56cf337d53fa", + "fieldName": "a" + }, + { + "nodeId": "e277e4b7-01cd-4daa-86ab-7bfa3cdcd9fd", + "fieldName": "model" + }, + { + "nodeId": "f0cd0d2f-9614-43f7-9944-a75b8d5ccd65", + "fieldName": "model_name" + }, + { + "nodeId": "c26bff37-4f12-482f-ba45-3a5d729b4c4f", + "fieldName": "value" + }, + { + "nodeId": "f5ca24ee-21c5-4c8c-8d3c-371b5079b086", + "fieldName": "value" + }, + { + "nodeId": "094bc4ed-5c68-4342-84f4-51056c755796", + "fieldName": "value" + }, + { + "nodeId": "100b3143-b3fb-4ff3-bb3c-8d4d3f89ae3a", + "fieldName": "vae_model" + }, + { + "nodeId": "f936ebb3-6902-4df9-a775-6a68bac2da70", + "fieldName": "model" + } + ], + "meta": { + "version": "3.0.0", + "category": "default" + }, + "nodes": [ + { + "id": "f936ebb3-6902-4df9-a775-6a68bac2da70", + "type": "invocation", + "data": { + "id": "f936ebb3-6902-4df9-a775-6a68bac2da70", + "type": "model_identifier", + "version": "1.0.0", + "label": "", + "notes": "", + "isOpen": true, + "isIntermediate": true, + "useCache": true, + "inputs": { + "model": { + "name": "model", + "label": "ControlNet Model - choose xinsir's tile ControlNet", + "value": { + "key": "845b6959-1657-4164-be33-fe0f63ad1752", + "hash": "random:3b602344599a53b4e4c80a2259362e122543e6f9e8e428be76ab910f9368704b", + "name": "controlnet-tile-sdxl-1.0", + "base": "sdxl", + "type": "controlnet" + } + } + } + }, + "position": { + "x": -3983.6167650620723, + "y": -1329.1431151846386 + } + }, + { + "id": "00239057-20d4-4cd2-a010-28727b256ea2", + "type": "invocation", + "data": { + "id": "00239057-20d4-4cd2-a010-28727b256ea2", + "type": "rand_int", + "version": "1.0.1", + "label": "", + "notes": "", + "isOpen": false, + "isIntermediate": true, + "useCache": false, + "inputs": { + "low": { + "name": "low", + "label": "", + "value": 0 + }, + "high": { + "name": "high", + "label": "", + "value": 2147483647 + } + } + }, + "position": { + "x": -4000, + "y": -1800 + } + }, + { + "id": "094bc4ed-5c68-4342-84f4-51056c755796", + "type": "invocation", + "data": { + "id": "094bc4ed-5c68-4342-84f4-51056c755796", + "type": "boolean", + "version": "1.0.1", + "label": "Tiled Option", + "notes": "", + "isOpen": true, + "isIntermediate": true, + "useCache": true, + "inputs": { + "value": { + "name": "value", + "label": "Tiled VAE (Saves VRAM, Color Inconsistency)", + "value": false + } + } + }, + "position": { + "x": -2746.0467136971292, + "y": -2219.070070545694 + } + }, + { + "id": "f5ca24ee-21c5-4c8c-8d3c-371b5079b086", + "type": "invocation", + "data": { + "id": "f5ca24ee-21c5-4c8c-8d3c-371b5079b086", + "type": "string", + "version": "1.0.1", + "label": "", + "notes": "", + "isOpen": true, + "isIntermediate": true, + "useCache": true, + "inputs": { + "value": { + "name": "value", + "label": "Negative Prompt (Optional)", + "value": "" + } + } + }, + "position": { + "x": -3525, + "y": -2525 + } + }, + { + "id": "c26bff37-4f12-482f-ba45-3a5d729b4c4f", + "type": "invocation", + "data": { + "id": "c26bff37-4f12-482f-ba45-3a5d729b4c4f", + "type": "string", + "version": "1.0.1", + "label": "", + "notes": "", + "isOpen": true, + "isIntermediate": true, + "useCache": true, + "inputs": { + "value": { + "name": "value", + "label": "Positive Prompt (Optional)", + "value": "" + } + } + }, + "position": { + "x": -3525, + "y": -2825 + } + }, + { + "id": "6daa9526-382b-491d-964f-f53fc308664f", + "type": "invocation", + "data": { + "id": "6daa9526-382b-491d-964f-f53fc308664f", + "type": "float_math", + "version": "1.0.1", + "label": "", + "notes": "", + "isOpen": false, + "isIntermediate": true, + "useCache": true, + "inputs": { + "operation": { + "name": "operation", + "label": "", + "value": "ADD" + }, + "a": { + "name": "a", + "label": "", + "value": 0.35 + }, + "b": { + "name": "b", + "label": "", + "value": 100 + } + } + }, + "position": { + "x": -3500, + "y": -1450 + } + }, + { + "id": "f1afd295-860f-48b6-a76a-90609bf2cc11", + "type": "invocation", + "data": { + "id": "f1afd295-860f-48b6-a76a-90609bf2cc11", + "type": "float_math", + "version": "1.0.1", + "label": "", + "notes": "", + "isOpen": false, + "isIntermediate": true, + "useCache": true, + "inputs": { + "operation": { + "name": "operation", + "label": "", + "value": "MUL" + }, + "a": { + "name": "a", + "label": "", + "value": 1 + }, + "b": { + "name": "b", + "label": "", + "value": 0.013 + } + } + }, + "position": { + "x": -3500, + "y": -1550 + } + }, + { + "id": "88ae723e-4933-4371-b52d-3ada52a59d36", + "type": "invocation", + "data": { + "id": "88ae723e-4933-4371-b52d-3ada52a59d36", + "type": "float_math", + "version": "1.0.1", + "label": "", + "notes": "", + "isOpen": false, + "isIntermediate": true, + "useCache": true, + "inputs": { + "operation": { + "name": "operation", + "label": "", + "value": "ADD" + }, + "a": { + "name": "a", + "label": "", + "value": 0 + }, + "b": { + "name": "b", + "label": "", + "value": 100 + } + } + }, + "position": { + "x": -3500, + "y": -1500 + } + }, + { + "id": "1dd915a3-6756-48ed-b68b-ee3b4bd06c1d", + "type": "invocation", + "data": { + "id": "1dd915a3-6756-48ed-b68b-ee3b4bd06c1d", + "type": "float_math", + "version": "1.0.1", + "label": "Creativity Input", + "notes": "", + "isOpen": false, + "isIntermediate": true, + "useCache": true, + "inputs": { + "operation": { + "name": "operation", + "label": "", + "value": "MUL" + }, + "a": { + "name": "a", + "label": "Creativity Control (-10 to 10)", + "value": 5 + }, + "b": { + "name": "b", + "label": "", + "value": -1 + } + } + }, + "position": { + "x": -3500, + "y": -2125 + } + }, + { + "id": "c8f5c671-8c87-4d96-a75e-a9937ac6bc03", + "type": "invocation", + "data": { + "id": "c8f5c671-8c87-4d96-a75e-a9937ac6bc03", + "type": "float_math", + "version": "1.0.1", + "label": "", + "notes": "", + "isOpen": false, + "isIntermediate": true, + "useCache": true, + "inputs": { + "operation": { + "name": "operation", + "label": "", + "value": "DIV" + }, + "a": { + "name": "a", + "label": "", + "value": 1 + }, + "b": { + "name": "b", + "label": "", + "value": 100 + } + } + }, + "position": { + "x": -3500, + "y": -1975 + } + }, + { + "id": "14e65dbe-4249-4b25-9a63-3a10cfaeb61c", + "type": "invocation", + "data": { + "id": "14e65dbe-4249-4b25-9a63-3a10cfaeb61c", + "type": "float_math", + "version": "1.0.1", + "label": "", + "notes": "", + "isOpen": false, + "isIntermediate": true, + "useCache": true, + "inputs": { + "operation": { + "name": "operation", + "label": "", + "value": "ADD" + }, + "a": { + "name": "a", + "label": "A", + "value": 0 + }, + "b": { + "name": "b", + "label": "", + "value": 10 + } + } + }, + "position": { + "x": -3500, + "y": -2075 + } + }, + { + "id": "49a8cc12-aa19-48c5-b6b3-04e0b603b384", + "type": "invocation", + "data": { + "id": "49a8cc12-aa19-48c5-b6b3-04e0b603b384", + "type": "float_math", + "version": "1.0.1", + "label": "", + "notes": "", + "isOpen": false, + "isIntermediate": true, + "useCache": true, + "inputs": { + "operation": { + "name": "operation", + "label": "", + "value": "MUL" + }, + "a": { + "name": "a", + "label": "", + "value": 1 + }, + "b": { + "name": "b", + "label": "", + "value": 4.99 + } + } + }, + "position": { + "x": -3500, + "y": -2025 + } + }, + { + "id": "e4d5ca7c-8fcf-4c59-9c58-67194c80dc73", + "type": "invocation", + "data": { + "id": "e4d5ca7c-8fcf-4c59-9c58-67194c80dc73", + "type": "float_math", + "version": "1.0.1", + "label": "", + "notes": "", + "isOpen": false, + "isIntermediate": true, + "useCache": true, + "inputs": { + "operation": { + "name": "operation", + "label": "", + "value": "ADD" + }, + "a": { + "name": "a", + "label": "", + "value": 0 + }, + "b": { + "name": "b", + "label": "", + "value": 1 + } + } + }, + "position": { + "x": -3500, + "y": -1925 + } + }, + { + "id": "696de0e1-cdd2-42e8-abeb-57a926bc6df6", + "type": "invocation", + "data": { + "id": "696de0e1-cdd2-42e8-abeb-57a926bc6df6", + "type": "float_math", + "version": "1.0.1", + "label": "Sharpness Input", + "notes": "", + "isOpen": true, + "isIntermediate": true, + "useCache": true, + "inputs": { + "operation": { + "name": "operation", + "label": "", + "value": "ADD" + }, + "a": { + "name": "a", + "label": "Sharpness Control (-10 to 10)", + "value": 0 + }, + "b": { + "name": "b", + "label": "", + "value": 10 + } + } + }, + "position": { + "x": -4750, + "y": -2275 + } + }, + { + "id": "79390b60-4077-4f94-ad0a-4229cc73ddb2", + "type": "invocation", + "data": { + "id": "79390b60-4077-4f94-ad0a-4229cc73ddb2", + "type": "float_math", + "version": "1.0.1", + "label": "", + "notes": "", + "isOpen": false, + "isIntermediate": true, + "useCache": true, + "inputs": { + "operation": { + "name": "operation", + "label": "", + "value": "MUL" + }, + "a": { + "name": "a", + "label": "", + "value": 1 + }, + "b": { + "name": "b", + "label": "", + "value": 3.75 + } + } + }, + "position": { + "x": -4750, + "y": -2000 + } + }, + { + "id": "4950132a-2d06-4571-b2c0-55cb37a31e9b", + "type": "invocation", + "data": { + "id": "4950132a-2d06-4571-b2c0-55cb37a31e9b", + "type": "float_math", + "version": "1.0.1", + "label": "", + "notes": "", + "isOpen": false, + "isIntermediate": true, + "useCache": true, + "inputs": { + "operation": { + "name": "operation", + "label": "", + "value": "ADD" + }, + "a": { + "name": "a", + "label": "", + "value": 25 + }, + "b": { + "name": "b", + "label": "", + "value": 1 + } + } + }, + "position": { + "x": -4750, + "y": -1950 + } + }, + { + "id": "bd094e2f-41e5-4b61-9f7b-56cf337d53fa", + "type": "invocation", + "data": { + "id": "bd094e2f-41e5-4b61-9f7b-56cf337d53fa", + "type": "float_math", + "version": "1.0.1", + "label": "Structural Input", + "notes": "", + "isOpen": false, + "isIntermediate": true, + "useCache": true, + "inputs": { + "operation": { + "name": "operation", + "label": "", + "value": "ADD" + }, + "a": { + "name": "a", + "label": "Structural Control (-10 to 10)", + "value": 0 + }, + "b": { + "name": "b", + "label": "", + "value": 10 + } + } + }, + "position": { + "x": -3500, + "y": -1700 + } + }, + { + "id": "bc53651f-208b-440c-be30-f93f72ae700e", + "type": "invocation", + "data": { + "id": "bc53651f-208b-440c-be30-f93f72ae700e", + "type": "float_math", + "version": "1.0.1", + "label": "", + "notes": "", + "isOpen": false, + "isIntermediate": true, + "useCache": true, + "inputs": { + "operation": { + "name": "operation", + "label": "", + "value": "MUL" + }, + "a": { + "name": "a", + "label": "", + "value": 1 + }, + "b": { + "name": "b", + "label": "", + "value": 0.025 + } + } + }, + "position": { + "x": -3500, + "y": -1650 + } + }, + { + "id": "67346654-cac0-446a-8cde-9af4b5a029a6", + "type": "invocation", + "data": { + "id": "67346654-cac0-446a-8cde-9af4b5a029a6", + "type": "float_math", + "version": "1.0.1", + "label": "", + "notes": "", + "isOpen": false, + "isIntermediate": true, + "useCache": true, + "inputs": { + "operation": { + "name": "operation", + "label": "", + "value": "ADD" + }, + "a": { + "name": "a", + "label": "", + "value": 0.3 + }, + "b": { + "name": "b", + "label": "", + "value": 1 + } + } + }, + "position": { + "x": -3500, + "y": -1600 + } + }, + { + "id": "6636a27a-f130-4a13-b3e5-50b44e4a566f", + "type": "invocation", + "data": { + "id": "6636a27a-f130-4a13-b3e5-50b44e4a566f", + "type": "collect", + "version": "1.0.0", + "label": "", + "notes": "", + "isOpen": true, + "isIntermediate": true, + "useCache": true, + "inputs": { + "item": { + "name": "item", + "label": "" + } + } + }, + "position": { + "x": -3125, + "y": -1500 + } + }, + { + "id": "b78f53b6-2eae-4956-97b4-7e73768d1491", + "type": "invocation", + "data": { + "id": "b78f53b6-2eae-4956-97b4-7e73768d1491", + "type": "controlnet", + "version": "1.1.2", + "label": "ControlNet (use xinsir's tile ControlNet)", + "notes": "", + "isOpen": true, + "isIntermediate": true, + "useCache": true, + "inputs": { + "image": { + "name": "image", + "label": "" + }, + "control_model": { + "name": "control_model", + "label": "" + }, + "control_weight": { + "name": "control_weight", + "label": "", + "value": 0.6 + }, + "begin_step_percent": { + "name": "begin_step_percent", + "label": "", + "value": 0 + }, + "end_step_percent": { + "name": "end_step_percent", + "label": "", + "value": 0.5 + }, + "control_mode": { + "name": "control_mode", + "label": "", + "value": "balanced" + }, + "resize_mode": { + "name": "resize_mode", + "label": "", + "value": "just_resize" + } + } + }, + "position": { + "x": -3493.4229674963885, + "y": -1359.2223984776113 + } + }, + { + "id": "27215391-b20e-412a-b854-7fa5927f5437", + "type": "invocation", + "data": { + "id": "27215391-b20e-412a-b854-7fa5927f5437", + "type": "sdxl_compel_prompt", + "version": "1.2.0", + "label": "", + "notes": "", + "isOpen": false, + "isIntermediate": true, + "useCache": true, + "inputs": { + "prompt": { + "name": "prompt", + "label": "", + "value": "" + }, + "style": { + "name": "style", + "label": "", + "value": "" + }, + "original_width": { + "name": "original_width", + "label": "", + "value": 4096 + }, + "original_height": { + "name": "original_height", + "label": "", + "value": 4096 + }, + "crop_top": { + "name": "crop_top", + "label": "", + "value": 0 + }, + "crop_left": { + "name": "crop_left", + "label": "", + "value": 0 + }, + "target_width": { + "name": "target_width", + "label": "", + "value": 1024 + }, + "target_height": { + "name": "target_height", + "label": "", + "value": 1024 + }, + "clip": { + "name": "clip", + "label": "" + }, + "clip2": { + "name": "clip2", + "label": "" + }, + "mask": { + "name": "mask", + "label": "" + } + } + }, + "position": { + "x": -3525, + "y": -2300 + } + }, + { + "id": "100b3143-b3fb-4ff3-bb3c-8d4d3f89ae3a", + "type": "invocation", + "data": { + "id": "100b3143-b3fb-4ff3-bb3c-8d4d3f89ae3a", + "type": "vae_loader", + "version": "1.0.3", + "label": "", + "notes": "", + "isOpen": true, + "isIntermediate": true, + "useCache": true, + "inputs": { + "vae_model": { + "name": "vae_model", + "label": "", + "value": { + "key": "4bc2bddf-94d9-4efe-a8e2-5eda28710f4c", + "hash": "random:67e47a77a1fcef9c0f5cd5d889d71c191f07383a0bf587f1849b2bc3f359440a", + "name": "sdxl-vae-fp16-fix", + "base": "sdxl", + "type": "vae" + } + } + } + }, + "position": { + "x": -4000, + "y": -2575 + } + }, + { + "id": "e277e4b7-01cd-4daa-86ab-7bfa3cdcd9fd", + "type": "invocation", + "data": { + "id": "e277e4b7-01cd-4daa-86ab-7bfa3cdcd9fd", + "type": "sdxl_model_loader", + "version": "1.0.3", + "label": "", + "notes": "", + "isOpen": true, + "isIntermediate": true, + "useCache": true, + "inputs": { + "model": { + "name": "model", + "label": "SDXL Model" + } + } + }, + "position": { + "x": -4000, + "y": -2825 + } + }, + { + "id": "6142b69a-323f-4ecd-a7e5-67dc61349c51", + "type": "invocation", + "data": { + "id": "6142b69a-323f-4ecd-a7e5-67dc61349c51", + "type": "sdxl_compel_prompt", + "version": "1.2.0", + "label": "", + "notes": "", + "isOpen": false, + "isIntermediate": true, + "useCache": true, + "inputs": { + "prompt": { + "name": "prompt", + "label": "", + "value": "" + }, + "style": { + "name": "style", + "label": "", + "value": "" + }, + "original_width": { + "name": "original_width", + "label": "", + "value": 4096 + }, + "original_height": { + "name": "original_height", + "label": "", + "value": 4096 + }, + "crop_top": { + "name": "crop_top", + "label": "", + "value": 0 + }, + "crop_left": { + "name": "crop_left", + "label": "", + "value": 0 + }, + "target_width": { + "name": "target_width", + "label": "", + "value": 1024 + }, + "target_height": { + "name": "target_height", + "label": "", + "value": 1024 + }, + "clip": { + "name": "clip", + "label": "" + }, + "clip2": { + "name": "clip2", + "label": "" + }, + "mask": { + "name": "mask", + "label": "" + } + } + }, + "position": { + "x": -3525, + "y": -2600 + } + }, + { + "id": "041c59cc-f9e4-4dc9-8b31-84648c5f3ebe", + "type": "invocation", + "data": { + "id": "041c59cc-f9e4-4dc9-8b31-84648c5f3ebe", + "type": "unsharp_mask", + "version": "1.2.2", + "label": "", + "notes": "", + "isOpen": false, + "isIntermediate": true, + "useCache": true, + "inputs": { + "board": { + "name": "board", + "label": "" + }, + "metadata": { + "name": "metadata", + "label": "" + }, + "image": { + "name": "image", + "label": "" + }, + "radius": { + "name": "radius", + "label": "", + "value": 2 + }, + "strength": { + "name": "strength", + "label": "", + "value": 50 + } + } + }, + "position": { + "x": -4400, + "y": -1875 + } + }, + { + "id": "53c2d5fd-863d-4950-93e0-628f3d61b493", + "type": "invocation", + "data": { + "id": "53c2d5fd-863d-4950-93e0-628f3d61b493", + "type": "unsharp_mask", + "version": "1.2.2", + "label": "", + "notes": "", + "isOpen": false, + "isIntermediate": true, + "useCache": true, + "inputs": { + "board": { + "name": "board", + "label": "" + }, + "metadata": { + "name": "metadata", + "label": "" + }, + "image": { + "name": "image", + "label": "" + }, + "radius": { + "name": "radius", + "label": "", + "value": 2 + }, + "strength": { + "name": "strength", + "label": "", + "value": 50 + } + } + }, + "position": { + "x": -4750, + "y": -1875 + } + }, + { + "id": "117f982a-03da-49b1-bf9f-29711160ac02", + "type": "invocation", + "data": { + "id": "117f982a-03da-49b1-bf9f-29711160ac02", + "type": "i2l", + "version": "1.1.0", + "label": "", + "notes": "", + "isOpen": false, + "isIntermediate": true, + "useCache": true, + "inputs": { + "image": { + "name": "image", + "label": "" + }, + "vae": { + "name": "vae", + "label": "" + }, + "tiled": { + "name": "tiled", + "label": "", + "value": false + }, + "tile_size": { + "name": "tile_size", + "label": "", + "value": 0 + }, + "fp32": { + "name": "fp32", + "label": "", + "value": false + } + } + }, + "position": { + "x": -4000, + "y": -1875 + } + }, + { + "id": "c3b60a50-8039-4924-90e3-8c608e1fecb5", + "type": "invocation", + "data": { + "id": "c3b60a50-8039-4924-90e3-8c608e1fecb5", + "type": "l2i", + "version": "1.3.0", + "label": "", + "notes": "", + "isOpen": true, + "isIntermediate": false, + "useCache": true, + "inputs": { + "board": { + "name": "board", + "label": "Output Board" + }, + "metadata": { + "name": "metadata", + "label": "" + }, + "latents": { + "name": "latents", + "label": "" + }, + "vae": { + "name": "vae", + "label": "" + }, + "tiled": { + "name": "tiled", + "label": "", + "value": false + }, + "tile_size": { + "name": "tile_size", + "label": "", + "value": 0 + }, + "fp32": { + "name": "fp32", + "label": "", + "value": false + } + } + }, + "position": { + "x": -2750, + "y": -2575 + } + }, + { + "id": "8dba0d37-cd2e-4fe5-ae9f-5464b85a8a7a", + "type": "invocation", + "data": { + "id": "8dba0d37-cd2e-4fe5-ae9f-5464b85a8a7a", + "type": "tiled_multi_diffusion_denoise_latents", + "version": "1.0.0", + "label": "", + "notes": "", + "isOpen": true, + "isIntermediate": true, + "useCache": true, + "inputs": { + "positive_conditioning": { + "name": "positive_conditioning", + "label": "" + }, + "negative_conditioning": { + "name": "negative_conditioning", + "label": "" + }, + "noise": { + "name": "noise", + "label": "" + }, + "latents": { + "name": "latents", + "label": "" + }, + "tile_height": { + "name": "tile_height", + "label": "", + "value": 1024 + }, + "tile_width": { + "name": "tile_width", + "label": "", + "value": 1024 + }, + "tile_overlap": { + "name": "tile_overlap", + "label": "", + "value": 128 + }, + "steps": { + "name": "steps", + "label": "", + "value": 25 + }, + "cfg_scale": { + "name": "cfg_scale", + "label": "", + "value": 5 + }, + "denoising_start": { + "name": "denoising_start", + "label": "", + "value": 0.6 + }, + "denoising_end": { + "name": "denoising_end", + "label": "", + "value": 1 + }, + "scheduler": { + "name": "scheduler", + "label": "", + "value": "kdpm_2" + }, + "unet": { + "name": "unet", + "label": "" + }, + "cfg_rescale_multiplier": { + "name": "cfg_rescale_multiplier", + "label": "", + "value": 0 + }, + "control": { + "name": "control", + "label": "" + } + } + }, + "position": { + "x": -3125, + "y": -2575 + } + }, + { + "id": "1ba845a6-eb88-49a1-a490-5fe6754f3ec9", + "type": "invocation", + "data": { + "id": "1ba845a6-eb88-49a1-a490-5fe6754f3ec9", + "type": "integer", + "version": "1.0.1", + "label": "", + "notes": "", + "isOpen": true, + "isIntermediate": true, + "useCache": true, + "inputs": { + "value": { + "name": "value", + "label": "Scale (2x, 4x)", + "value": 2 + } + } + }, + "position": { + "x": -4400, + "y": -2175 + } + }, + { + "id": "d350feac-9686-4e0d-bd46-a96bd2630818", + "type": "invocation", + "data": { + "id": "d350feac-9686-4e0d-bd46-a96bd2630818", + "type": "integer_math", + "version": "1.0.1", + "label": "", + "notes": "", + "isOpen": false, + "isIntermediate": true, + "useCache": true, + "inputs": { + "operation": { + "name": "operation", + "label": "", + "value": "MUL" + }, + "a": { + "name": "a", + "label": "", + "value": 1 + }, + "b": { + "name": "b", + "label": "", + "value": 1 + } + } + }, + "position": { + "x": -4400, + "y": -1950 + } + }, + { + "id": "5b256f14-caab-40ff-b8f0-9679cd542163", + "type": "invocation", + "data": { + "id": "5b256f14-caab-40ff-b8f0-9679cd542163", + "type": "integer_math", + "version": "1.0.1", + "label": "", + "notes": "", + "isOpen": false, + "isIntermediate": true, + "useCache": true, + "inputs": { + "operation": { + "name": "operation", + "label": "", + "value": "MUL" + }, + "a": { + "name": "a", + "label": "", + "value": 1 + }, + "b": { + "name": "b", + "label": "", + "value": 1 + } + } + }, + "position": { + "x": -4400, + "y": -2000 + } + }, + { + "id": "7671553a-cd4b-4e25-8332-9d5667e64493", + "type": "invocation", + "data": { + "id": "7671553a-cd4b-4e25-8332-9d5667e64493", + "type": "img_resize", + "version": "1.2.2", + "label": "", + "notes": "", + "isOpen": true, + "isIntermediate": true, + "useCache": true, + "inputs": { + "board": { + "name": "board", + "label": "" + }, + "metadata": { + "name": "metadata", + "label": "" + }, + "image": { + "name": "image", + "label": "" + }, + "width": { + "name": "width", + "label": "", + "value": 512 + }, + "height": { + "name": "height", + "label": "", + "value": 512 + }, + "resample_mode": { + "name": "resample_mode", + "label": "", + "value": "lanczos" + } + } + }, + "position": { + "x": -4375, + "y": -1825 + } + }, + { + "id": "be4082d6-e238-40ea-a9df-fc0d725e8895", + "type": "invocation", + "data": { + "id": "be4082d6-e238-40ea-a9df-fc0d725e8895", + "type": "controlnet", + "version": "1.1.2", + "label": "ControlNet (use xinsir's tile ControlNet)", + "notes": "", + "isOpen": true, + "isIntermediate": true, + "useCache": true, + "inputs": { + "image": { + "name": "image", + "label": "" + }, + "control_model": { + "name": "control_model", + "label": "" + }, + "control_weight": { + "name": "control_weight", + "label": "", + "value": 0.25 + }, + "begin_step_percent": { + "name": "begin_step_percent", + "label": "", + "value": 0.5 + }, + "end_step_percent": { + "name": "end_step_percent", + "label": "", + "value": 0.8 + }, + "control_mode": { + "name": "control_mode", + "label": "Control Mode", + "value": "balanced" + }, + "resize_mode": { + "name": "resize_mode", + "label": "", + "value": "just_resize" + } + } + }, + "position": { + "x": -3131.577032503611, + "y": -1392.1075609956667 + } + }, + { + "id": "8923451b-5a27-4395-b7f2-dce875fca6f5", + "type": "invocation", + "data": { + "id": "8923451b-5a27-4395-b7f2-dce875fca6f5", + "type": "noise", + "version": "1.0.2", + "label": "", + "notes": "", + "isOpen": true, + "isIntermediate": true, + "useCache": true, + "inputs": { + "seed": { + "name": "seed", + "label": "", + "value": 3 + }, + "width": { + "name": "width", + "label": "", + "value": 512 + }, + "height": { + "name": "height", + "label": "", + "value": 512 + }, + "use_cpu": { + "name": "use_cpu", + "label": "", + "value": true + } + } + }, + "position": { + "x": -4000, + "y": -1750 + } + }, + { + "id": "f0cd0d2f-9614-43f7-9944-a75b8d5ccd65", + "type": "invocation", + "data": { + "id": "f0cd0d2f-9614-43f7-9944-a75b8d5ccd65", + "type": "esrgan", + "version": "1.3.2", + "label": "", + "notes": "", + "isOpen": true, + "isIntermediate": true, + "useCache": true, + "inputs": { + "board": { + "name": "board", + "label": "" + }, + "metadata": { + "name": "metadata", + "label": "" + }, + "image": { + "name": "image", + "label": "" + }, + "model_name": { + "name": "model_name", + "label": "Upscaling Model", + "value": "RealESRGAN_x4plus.pth" + }, + "tile_size": { + "name": "tile_size", + "label": "", + "value": 500 + } + } + }, + "position": { + "x": -4750, + "y": -1825 + } + }, + { + "id": "7dbb756b-7d79-431c-a46d-d8f7b082c127", + "type": "invocation", + "data": { + "id": "7dbb756b-7d79-431c-a46d-d8f7b082c127", + "version": "1.0.1", + "label": "", + "notes": "", + "type": "float_to_int", + "inputs": { + "value": { + "name": "value", + "label": "", + "value": 0 + }, + "multiple": { + "name": "multiple", + "label": "", + "value": 8 + }, + "method": { + "name": "method", + "label": "", + "value": "Floor" + } + }, + "isOpen": false, + "isIntermediate": true, + "useCache": true + }, + "position": { + "x": -4000, + "y": -1950 + } + }, + { + "id": "5ca87ace-edf9-49c7-a424-cd42416b86a7", + "type": "invocation", + "data": { + "id": "5ca87ace-edf9-49c7-a424-cd42416b86a7", + "version": "1.0.2", + "label": "", + "notes": "", + "type": "image", + "inputs": { + "image": { + "name": "image", + "label": "Image to Upscale" + } + }, + "isOpen": true, + "isIntermediate": true, + "useCache": true + }, + "position": { + "x": -4750, + "y": -2850 + } + }, + { + "id": "f5d9bf3b-2646-4b17-9894-20fd2b4218ea", + "type": "invocation", + "data": { + "id": "f5d9bf3b-2646-4b17-9894-20fd2b4218ea", + "version": "1.0.1", + "label": "", + "notes": "", + "type": "float_to_int", + "inputs": { + "value": { + "name": "value", + "label": "", + "value": 8 + }, + "multiple": { + "name": "multiple", + "label": "", + "value": 8 + }, + "method": { + "name": "method", + "label": "", + "value": "Floor" + } + }, + "isOpen": false, + "isIntermediate": true, + "useCache": true + }, + "position": { + "x": -4000, + "y": -2000 + } + } + ], + "edges": [ + { + "id": "reactflow__edge-f936ebb3-6902-4df9-a775-6a68bac2da70model-be4082d6-e238-40ea-a9df-fc0d725e8895control_model", + "type": "default", + "source": "f936ebb3-6902-4df9-a775-6a68bac2da70", + "target": "be4082d6-e238-40ea-a9df-fc0d725e8895", + "sourceHandle": "model", + "targetHandle": "control_model" + }, + { + "id": "reactflow__edge-f936ebb3-6902-4df9-a775-6a68bac2da70model-b78f53b6-2eae-4956-97b4-7e73768d1491control_model", + "type": "default", + "source": "f936ebb3-6902-4df9-a775-6a68bac2da70", + "target": "b78f53b6-2eae-4956-97b4-7e73768d1491", + "sourceHandle": "model", + "targetHandle": "control_model" + }, + { + "id": "49a8cc12-aa19-48c5-b6b3-04e0b603b384-c8f5c671-8c87-4d96-a75e-a9937ac6bc03-collapsed", + "type": "collapsed", + "source": "49a8cc12-aa19-48c5-b6b3-04e0b603b384", + "target": "c8f5c671-8c87-4d96-a75e-a9937ac6bc03" + }, + { + "id": "14e65dbe-4249-4b25-9a63-3a10cfaeb61c-49a8cc12-aa19-48c5-b6b3-04e0b603b384-collapsed", + "type": "collapsed", + "source": "14e65dbe-4249-4b25-9a63-3a10cfaeb61c", + "target": "49a8cc12-aa19-48c5-b6b3-04e0b603b384" + }, + { + "id": "1dd915a3-6756-48ed-b68b-ee3b4bd06c1d-14e65dbe-4249-4b25-9a63-3a10cfaeb61c-collapsed", + "type": "collapsed", + "source": "1dd915a3-6756-48ed-b68b-ee3b4bd06c1d", + "target": "14e65dbe-4249-4b25-9a63-3a10cfaeb61c" + }, + { + "id": "reactflow__edge-00239057-20d4-4cd2-a010-28727b256ea2value-8923451b-5a27-4395-b7f2-dce875fca6f5seed", + "type": "default", + "source": "00239057-20d4-4cd2-a010-28727b256ea2", + "target": "8923451b-5a27-4395-b7f2-dce875fca6f5", + "sourceHandle": "value", + "targetHandle": "seed" + }, + { + "id": "reactflow__edge-094bc4ed-5c68-4342-84f4-51056c755796value-c3b60a50-8039-4924-90e3-8c608e1fecb5tiled", + "type": "default", + "source": "094bc4ed-5c68-4342-84f4-51056c755796", + "target": "c3b60a50-8039-4924-90e3-8c608e1fecb5", + "sourceHandle": "value", + "targetHandle": "tiled" + }, + { + "id": "reactflow__edge-094bc4ed-5c68-4342-84f4-51056c755796value-117f982a-03da-49b1-bf9f-29711160ac02tiled", + "type": "default", + "source": "094bc4ed-5c68-4342-84f4-51056c755796", + "target": "117f982a-03da-49b1-bf9f-29711160ac02", + "sourceHandle": "value", + "targetHandle": "tiled" + }, + { + "id": "c8f5c671-8c87-4d96-a75e-a9937ac6bc03-e4d5ca7c-8fcf-4c59-9c58-67194c80dc73-collapsed", + "type": "collapsed", + "source": "c8f5c671-8c87-4d96-a75e-a9937ac6bc03", + "target": "e4d5ca7c-8fcf-4c59-9c58-67194c80dc73" + }, + { + "id": "d350feac-9686-4e0d-bd46-a96bd2630818-7dbb756b-7d79-431c-a46d-d8f7b082c127-collapsed", + "type": "collapsed", + "source": "d350feac-9686-4e0d-bd46-a96bd2630818", + "target": "7dbb756b-7d79-431c-a46d-d8f7b082c127" + }, + { + "id": "5b256f14-caab-40ff-b8f0-9679cd542163-f5d9bf3b-2646-4b17-9894-20fd2b4218ea-collapsed", + "type": "collapsed", + "source": "5b256f14-caab-40ff-b8f0-9679cd542163", + "target": "f5d9bf3b-2646-4b17-9894-20fd2b4218ea" + }, + { + "id": "4950132a-2d06-4571-b2c0-55cb37a31e9b-041c59cc-f9e4-4dc9-8b31-84648c5f3ebe-collapsed", + "type": "collapsed", + "source": "4950132a-2d06-4571-b2c0-55cb37a31e9b", + "target": "041c59cc-f9e4-4dc9-8b31-84648c5f3ebe" + }, + { + "id": "4950132a-2d06-4571-b2c0-55cb37a31e9b-53c2d5fd-863d-4950-93e0-628f3d61b493-collapsed", + "type": "collapsed", + "source": "4950132a-2d06-4571-b2c0-55cb37a31e9b", + "target": "53c2d5fd-863d-4950-93e0-628f3d61b493" + }, + { + "id": "reactflow__edge-f5ca24ee-21c5-4c8c-8d3c-371b5079b086value-27215391-b20e-412a-b854-7fa5927f5437style", + "type": "default", + "source": "f5ca24ee-21c5-4c8c-8d3c-371b5079b086", + "target": "27215391-b20e-412a-b854-7fa5927f5437", + "sourceHandle": "value", + "targetHandle": "style" + }, + { + "id": "reactflow__edge-f5ca24ee-21c5-4c8c-8d3c-371b5079b086value-27215391-b20e-412a-b854-7fa5927f5437prompt", + "type": "default", + "source": "f5ca24ee-21c5-4c8c-8d3c-371b5079b086", + "target": "27215391-b20e-412a-b854-7fa5927f5437", + "sourceHandle": "value", + "targetHandle": "prompt" + }, + { + "id": "reactflow__edge-c26bff37-4f12-482f-ba45-3a5d729b4c4fvalue-6142b69a-323f-4ecd-a7e5-67dc61349c51style", + "type": "default", + "source": "c26bff37-4f12-482f-ba45-3a5d729b4c4f", + "target": "6142b69a-323f-4ecd-a7e5-67dc61349c51", + "sourceHandle": "value", + "targetHandle": "style" + }, + { + "id": "reactflow__edge-c26bff37-4f12-482f-ba45-3a5d729b4c4fvalue-6142b69a-323f-4ecd-a7e5-67dc61349c51prompt", + "type": "default", + "source": "c26bff37-4f12-482f-ba45-3a5d729b4c4f", + "target": "6142b69a-323f-4ecd-a7e5-67dc61349c51", + "sourceHandle": "value", + "targetHandle": "prompt" + }, + { + "id": "88ae723e-4933-4371-b52d-3ada52a59d36-6daa9526-382b-491d-964f-f53fc308664f-collapsed", + "type": "collapsed", + "source": "88ae723e-4933-4371-b52d-3ada52a59d36", + "target": "6daa9526-382b-491d-964f-f53fc308664f" + }, + { + "id": "f1afd295-860f-48b6-a76a-90609bf2cc11-88ae723e-4933-4371-b52d-3ada52a59d36-collapsed", + "type": "collapsed", + "source": "f1afd295-860f-48b6-a76a-90609bf2cc11", + "target": "88ae723e-4933-4371-b52d-3ada52a59d36" + }, + { + "id": "bc53651f-208b-440c-be30-f93f72ae700e-67346654-cac0-446a-8cde-9af4b5a029a6-collapsed", + "type": "collapsed", + "source": "bc53651f-208b-440c-be30-f93f72ae700e", + "target": "67346654-cac0-446a-8cde-9af4b5a029a6" + }, + { + "id": "reactflow__edge-67346654-cac0-446a-8cde-9af4b5a029a6value-be4082d6-e238-40ea-a9df-fc0d725e8895begin_step_percent", + "type": "default", + "source": "67346654-cac0-446a-8cde-9af4b5a029a6", + "target": "be4082d6-e238-40ea-a9df-fc0d725e8895", + "sourceHandle": "value", + "targetHandle": "begin_step_percent" + }, + { + "id": "reactflow__edge-67346654-cac0-446a-8cde-9af4b5a029a6value-b78f53b6-2eae-4956-97b4-7e73768d1491end_step_percent", + "type": "default", + "source": "67346654-cac0-446a-8cde-9af4b5a029a6", + "target": "b78f53b6-2eae-4956-97b4-7e73768d1491", + "sourceHandle": "value", + "targetHandle": "end_step_percent" + }, + { + "id": "bd094e2f-41e5-4b61-9f7b-56cf337d53fa-f1afd295-860f-48b6-a76a-90609bf2cc11-collapsed", + "type": "collapsed", + "source": "bd094e2f-41e5-4b61-9f7b-56cf337d53fa", + "target": "f1afd295-860f-48b6-a76a-90609bf2cc11" + }, + { + "id": "bd094e2f-41e5-4b61-9f7b-56cf337d53fa-bc53651f-208b-440c-be30-f93f72ae700e-collapsed", + "type": "collapsed", + "source": "bd094e2f-41e5-4b61-9f7b-56cf337d53fa", + "target": "bc53651f-208b-440c-be30-f93f72ae700e" + }, + { + "id": "reactflow__edge-bc53651f-208b-440c-be30-f93f72ae700evalue-67346654-cac0-446a-8cde-9af4b5a029a6b", + "type": "default", + "source": "bc53651f-208b-440c-be30-f93f72ae700e", + "target": "67346654-cac0-446a-8cde-9af4b5a029a6", + "sourceHandle": "value", + "targetHandle": "b", + "hidden": true + }, + { + "id": "reactflow__edge-6daa9526-382b-491d-964f-f53fc308664fvalue-b78f53b6-2eae-4956-97b4-7e73768d1491control_weight", + "type": "default", + "source": "6daa9526-382b-491d-964f-f53fc308664f", + "target": "b78f53b6-2eae-4956-97b4-7e73768d1491", + "sourceHandle": "value", + "targetHandle": "control_weight" + }, + { + "id": "reactflow__edge-88ae723e-4933-4371-b52d-3ada52a59d36value-6daa9526-382b-491d-964f-f53fc308664fb", + "type": "default", + "source": "88ae723e-4933-4371-b52d-3ada52a59d36", + "target": "6daa9526-382b-491d-964f-f53fc308664f", + "sourceHandle": "value", + "targetHandle": "b", + "hidden": true + }, + { + "id": "reactflow__edge-88ae723e-4933-4371-b52d-3ada52a59d36value-be4082d6-e238-40ea-a9df-fc0d725e8895control_weight", + "type": "default", + "source": "88ae723e-4933-4371-b52d-3ada52a59d36", + "target": "be4082d6-e238-40ea-a9df-fc0d725e8895", + "sourceHandle": "value", + "targetHandle": "control_weight" + }, + { + "id": "reactflow__edge-f1afd295-860f-48b6-a76a-90609bf2cc11value-88ae723e-4933-4371-b52d-3ada52a59d36b", + "type": "default", + "source": "f1afd295-860f-48b6-a76a-90609bf2cc11", + "target": "88ae723e-4933-4371-b52d-3ada52a59d36", + "sourceHandle": "value", + "targetHandle": "b", + "hidden": true + }, + { + "id": "reactflow__edge-bd094e2f-41e5-4b61-9f7b-56cf337d53favalue-f1afd295-860f-48b6-a76a-90609bf2cc11a", + "type": "default", + "source": "bd094e2f-41e5-4b61-9f7b-56cf337d53fa", + "target": "f1afd295-860f-48b6-a76a-90609bf2cc11", + "sourceHandle": "value", + "targetHandle": "a", + "hidden": true + }, + { + "id": "reactflow__edge-1dd915a3-6756-48ed-b68b-ee3b4bd06c1dvalue-14e65dbe-4249-4b25-9a63-3a10cfaeb61ca", + "type": "default", + "source": "1dd915a3-6756-48ed-b68b-ee3b4bd06c1d", + "target": "14e65dbe-4249-4b25-9a63-3a10cfaeb61c", + "sourceHandle": "value", + "targetHandle": "a", + "hidden": true + }, + { + "id": "reactflow__edge-e4d5ca7c-8fcf-4c59-9c58-67194c80dc73value-8dba0d37-cd2e-4fe5-ae9f-5464b85a8a7adenoising_start", + "type": "default", + "source": "e4d5ca7c-8fcf-4c59-9c58-67194c80dc73", + "target": "8dba0d37-cd2e-4fe5-ae9f-5464b85a8a7a", + "sourceHandle": "value", + "targetHandle": "denoising_start" + }, + { + "id": "reactflow__edge-c8f5c671-8c87-4d96-a75e-a9937ac6bc03value-e4d5ca7c-8fcf-4c59-9c58-67194c80dc73b", + "type": "default", + "source": "c8f5c671-8c87-4d96-a75e-a9937ac6bc03", + "target": "e4d5ca7c-8fcf-4c59-9c58-67194c80dc73", + "sourceHandle": "value", + "targetHandle": "b", + "hidden": true + }, + { + "id": "reactflow__edge-49a8cc12-aa19-48c5-b6b3-04e0b603b384value-c8f5c671-8c87-4d96-a75e-a9937ac6bc03a", + "type": "default", + "source": "49a8cc12-aa19-48c5-b6b3-04e0b603b384", + "target": "c8f5c671-8c87-4d96-a75e-a9937ac6bc03", + "sourceHandle": "value", + "targetHandle": "a", + "hidden": true + }, + { + "id": "reactflow__edge-14e65dbe-4249-4b25-9a63-3a10cfaeb61cvalue-49a8cc12-aa19-48c5-b6b3-04e0b603b384a", + "type": "default", + "source": "14e65dbe-4249-4b25-9a63-3a10cfaeb61c", + "target": "49a8cc12-aa19-48c5-b6b3-04e0b603b384", + "sourceHandle": "value", + "targetHandle": "a", + "hidden": true + }, + { + "id": "79390b60-4077-4f94-ad0a-4229cc73ddb2-4950132a-2d06-4571-b2c0-55cb37a31e9b-collapsed", + "type": "collapsed", + "source": "79390b60-4077-4f94-ad0a-4229cc73ddb2", + "target": "4950132a-2d06-4571-b2c0-55cb37a31e9b" + }, + { + "id": "reactflow__edge-4950132a-2d06-4571-b2c0-55cb37a31e9bvalue-041c59cc-f9e4-4dc9-8b31-84648c5f3ebestrength", + "type": "default", + "source": "4950132a-2d06-4571-b2c0-55cb37a31e9b", + "target": "041c59cc-f9e4-4dc9-8b31-84648c5f3ebe", + "sourceHandle": "value", + "targetHandle": "strength", + "hidden": true + }, + { + "id": "reactflow__edge-4950132a-2d06-4571-b2c0-55cb37a31e9bvalue-53c2d5fd-863d-4950-93e0-628f3d61b493strength", + "type": "default", + "source": "4950132a-2d06-4571-b2c0-55cb37a31e9b", + "target": "53c2d5fd-863d-4950-93e0-628f3d61b493", + "sourceHandle": "value", + "targetHandle": "strength", + "hidden": true + }, + { + "id": "reactflow__edge-79390b60-4077-4f94-ad0a-4229cc73ddb2value-4950132a-2d06-4571-b2c0-55cb37a31e9bb", + "type": "default", + "source": "79390b60-4077-4f94-ad0a-4229cc73ddb2", + "target": "4950132a-2d06-4571-b2c0-55cb37a31e9b", + "sourceHandle": "value", + "targetHandle": "b", + "hidden": true + }, + { + "id": "reactflow__edge-696de0e1-cdd2-42e8-abeb-57a926bc6df6value-79390b60-4077-4f94-ad0a-4229cc73ddb2a", + "type": "default", + "source": "696de0e1-cdd2-42e8-abeb-57a926bc6df6", + "target": "79390b60-4077-4f94-ad0a-4229cc73ddb2", + "sourceHandle": "value", + "targetHandle": "a" + }, + { + "id": "reactflow__edge-bd094e2f-41e5-4b61-9f7b-56cf337d53favalue-bc53651f-208b-440c-be30-f93f72ae700ea", + "type": "default", + "source": "bd094e2f-41e5-4b61-9f7b-56cf337d53fa", + "target": "bc53651f-208b-440c-be30-f93f72ae700e", + "sourceHandle": "value", + "targetHandle": "a", + "hidden": true + }, + { + "id": "reactflow__edge-6636a27a-f130-4a13-b3e5-50b44e4a566fcollection-8dba0d37-cd2e-4fe5-ae9f-5464b85a8a7acontrol", + "type": "default", + "source": "6636a27a-f130-4a13-b3e5-50b44e4a566f", + "target": "8dba0d37-cd2e-4fe5-ae9f-5464b85a8a7a", + "sourceHandle": "collection", + "targetHandle": "control" + }, + { + "id": "reactflow__edge-b78f53b6-2eae-4956-97b4-7e73768d1491control-6636a27a-f130-4a13-b3e5-50b44e4a566fitem", + "type": "default", + "source": "b78f53b6-2eae-4956-97b4-7e73768d1491", + "target": "6636a27a-f130-4a13-b3e5-50b44e4a566f", + "sourceHandle": "control", + "targetHandle": "item" + }, + { + "id": "reactflow__edge-be4082d6-e238-40ea-a9df-fc0d725e8895control-6636a27a-f130-4a13-b3e5-50b44e4a566fitem", + "type": "default", + "source": "be4082d6-e238-40ea-a9df-fc0d725e8895", + "target": "6636a27a-f130-4a13-b3e5-50b44e4a566f", + "sourceHandle": "control", + "targetHandle": "item" + }, + { + "id": "reactflow__edge-7671553a-cd4b-4e25-8332-9d5667e64493image-b78f53b6-2eae-4956-97b4-7e73768d1491image", + "type": "default", + "source": "7671553a-cd4b-4e25-8332-9d5667e64493", + "target": "b78f53b6-2eae-4956-97b4-7e73768d1491", + "sourceHandle": "image", + "targetHandle": "image" + }, + { + "id": "reactflow__edge-e277e4b7-01cd-4daa-86ab-7bfa3cdcd9fdclip2-27215391-b20e-412a-b854-7fa5927f5437clip2", + "type": "default", + "source": "e277e4b7-01cd-4daa-86ab-7bfa3cdcd9fd", + "target": "27215391-b20e-412a-b854-7fa5927f5437", + "sourceHandle": "clip2", + "targetHandle": "clip2" + }, + { + "id": "reactflow__edge-e277e4b7-01cd-4daa-86ab-7bfa3cdcd9fdclip-27215391-b20e-412a-b854-7fa5927f5437clip", + "type": "default", + "source": "e277e4b7-01cd-4daa-86ab-7bfa3cdcd9fd", + "target": "27215391-b20e-412a-b854-7fa5927f5437", + "sourceHandle": "clip", + "targetHandle": "clip" + }, + { + "id": "reactflow__edge-e277e4b7-01cd-4daa-86ab-7bfa3cdcd9fdclip2-6142b69a-323f-4ecd-a7e5-67dc61349c51clip2", + "type": "default", + "source": "e277e4b7-01cd-4daa-86ab-7bfa3cdcd9fd", + "target": "6142b69a-323f-4ecd-a7e5-67dc61349c51", + "sourceHandle": "clip2", + "targetHandle": "clip2" + }, + { + "id": "reactflow__edge-6142b69a-323f-4ecd-a7e5-67dc61349c51conditioning-8dba0d37-cd2e-4fe5-ae9f-5464b85a8a7apositive_conditioning", + "type": "default", + "source": "6142b69a-323f-4ecd-a7e5-67dc61349c51", + "target": "8dba0d37-cd2e-4fe5-ae9f-5464b85a8a7a", + "sourceHandle": "conditioning", + "targetHandle": "positive_conditioning" + }, + { + "id": "reactflow__edge-27215391-b20e-412a-b854-7fa5927f5437conditioning-8dba0d37-cd2e-4fe5-ae9f-5464b85a8a7anegative_conditioning", + "type": "default", + "source": "27215391-b20e-412a-b854-7fa5927f5437", + "target": "8dba0d37-cd2e-4fe5-ae9f-5464b85a8a7a", + "sourceHandle": "conditioning", + "targetHandle": "negative_conditioning" + }, + { + "id": "reactflow__edge-e277e4b7-01cd-4daa-86ab-7bfa3cdcd9fdunet-8dba0d37-cd2e-4fe5-ae9f-5464b85a8a7aunet", + "type": "default", + "source": "e277e4b7-01cd-4daa-86ab-7bfa3cdcd9fd", + "target": "8dba0d37-cd2e-4fe5-ae9f-5464b85a8a7a", + "sourceHandle": "unet", + "targetHandle": "unet" + }, + { + "id": "reactflow__edge-100b3143-b3fb-4ff3-bb3c-8d4d3f89ae3avae-117f982a-03da-49b1-bf9f-29711160ac02vae", + "type": "default", + "source": "100b3143-b3fb-4ff3-bb3c-8d4d3f89ae3a", + "target": "117f982a-03da-49b1-bf9f-29711160ac02", + "sourceHandle": "vae", + "targetHandle": "vae" + }, + { + "id": "reactflow__edge-100b3143-b3fb-4ff3-bb3c-8d4d3f89ae3avae-c3b60a50-8039-4924-90e3-8c608e1fecb5vae", + "type": "default", + "source": "100b3143-b3fb-4ff3-bb3c-8d4d3f89ae3a", + "target": "c3b60a50-8039-4924-90e3-8c608e1fecb5", + "sourceHandle": "vae", + "targetHandle": "vae" + }, + { + "id": "reactflow__edge-e277e4b7-01cd-4daa-86ab-7bfa3cdcd9fdclip-6142b69a-323f-4ecd-a7e5-67dc61349c51clip", + "type": "default", + "source": "e277e4b7-01cd-4daa-86ab-7bfa3cdcd9fd", + "target": "6142b69a-323f-4ecd-a7e5-67dc61349c51", + "sourceHandle": "clip", + "targetHandle": "clip" + }, + { + "id": "reactflow__edge-041c59cc-f9e4-4dc9-8b31-84648c5f3ebeimage-7671553a-cd4b-4e25-8332-9d5667e64493image", + "type": "default", + "source": "041c59cc-f9e4-4dc9-8b31-84648c5f3ebe", + "target": "7671553a-cd4b-4e25-8332-9d5667e64493", + "sourceHandle": "image", + "targetHandle": "image" + }, + { + "id": "reactflow__edge-f0cd0d2f-9614-43f7-9944-a75b8d5ccd65image-041c59cc-f9e4-4dc9-8b31-84648c5f3ebeimage", + "type": "default", + "source": "f0cd0d2f-9614-43f7-9944-a75b8d5ccd65", + "target": "041c59cc-f9e4-4dc9-8b31-84648c5f3ebe", + "sourceHandle": "image", + "targetHandle": "image" + }, + { + "id": "reactflow__edge-53c2d5fd-863d-4950-93e0-628f3d61b493image-f0cd0d2f-9614-43f7-9944-a75b8d5ccd65image", + "type": "default", + "source": "53c2d5fd-863d-4950-93e0-628f3d61b493", + "target": "f0cd0d2f-9614-43f7-9944-a75b8d5ccd65", + "sourceHandle": "image", + "targetHandle": "image" + }, + { + "id": "reactflow__edge-5ca87ace-edf9-49c7-a424-cd42416b86a7image-53c2d5fd-863d-4950-93e0-628f3d61b493image", + "type": "default", + "source": "5ca87ace-edf9-49c7-a424-cd42416b86a7", + "target": "53c2d5fd-863d-4950-93e0-628f3d61b493", + "sourceHandle": "image", + "targetHandle": "image" + }, + { + "id": "reactflow__edge-8dba0d37-cd2e-4fe5-ae9f-5464b85a8a7alatents-c3b60a50-8039-4924-90e3-8c608e1fecb5latents", + "type": "default", + "source": "8dba0d37-cd2e-4fe5-ae9f-5464b85a8a7a", + "target": "c3b60a50-8039-4924-90e3-8c608e1fecb5", + "sourceHandle": "latents", + "targetHandle": "latents" + }, + { + "id": "reactflow__edge-117f982a-03da-49b1-bf9f-29711160ac02latents-8dba0d37-cd2e-4fe5-ae9f-5464b85a8a7alatents", + "type": "default", + "source": "117f982a-03da-49b1-bf9f-29711160ac02", + "target": "8dba0d37-cd2e-4fe5-ae9f-5464b85a8a7a", + "sourceHandle": "latents", + "targetHandle": "latents" + }, + { + "id": "reactflow__edge-8923451b-5a27-4395-b7f2-dce875fca6f5noise-8dba0d37-cd2e-4fe5-ae9f-5464b85a8a7anoise", + "type": "default", + "source": "8923451b-5a27-4395-b7f2-dce875fca6f5", + "target": "8dba0d37-cd2e-4fe5-ae9f-5464b85a8a7a", + "sourceHandle": "noise", + "targetHandle": "noise" + }, + { + "id": "reactflow__edge-d350feac-9686-4e0d-bd46-a96bd2630818value-7dbb756b-7d79-431c-a46d-d8f7b082c127value", + "type": "default", + "source": "d350feac-9686-4e0d-bd46-a96bd2630818", + "target": "7dbb756b-7d79-431c-a46d-d8f7b082c127", + "sourceHandle": "value", + "targetHandle": "value", + "hidden": true + }, + { + "id": "reactflow__edge-5b256f14-caab-40ff-b8f0-9679cd542163value-f5d9bf3b-2646-4b17-9894-20fd2b4218eavalue", + "type": "default", + "source": "5b256f14-caab-40ff-b8f0-9679cd542163", + "target": "f5d9bf3b-2646-4b17-9894-20fd2b4218ea", + "sourceHandle": "value", + "targetHandle": "value", + "hidden": true + }, + { + "id": "reactflow__edge-7671553a-cd4b-4e25-8332-9d5667e64493height-8923451b-5a27-4395-b7f2-dce875fca6f5height", + "type": "default", + "source": "7671553a-cd4b-4e25-8332-9d5667e64493", + "target": "8923451b-5a27-4395-b7f2-dce875fca6f5", + "sourceHandle": "height", + "targetHandle": "height" + }, + { + "id": "reactflow__edge-7671553a-cd4b-4e25-8332-9d5667e64493width-8923451b-5a27-4395-b7f2-dce875fca6f5width", + "type": "default", + "source": "7671553a-cd4b-4e25-8332-9d5667e64493", + "target": "8923451b-5a27-4395-b7f2-dce875fca6f5", + "sourceHandle": "width", + "targetHandle": "width" + }, + { + "id": "reactflow__edge-7671553a-cd4b-4e25-8332-9d5667e64493image-117f982a-03da-49b1-bf9f-29711160ac02image", + "type": "default", + "source": "7671553a-cd4b-4e25-8332-9d5667e64493", + "target": "117f982a-03da-49b1-bf9f-29711160ac02", + "sourceHandle": "image", + "targetHandle": "image" + }, + { + "id": "reactflow__edge-7671553a-cd4b-4e25-8332-9d5667e64493image-be4082d6-e238-40ea-a9df-fc0d725e8895image", + "type": "default", + "source": "7671553a-cd4b-4e25-8332-9d5667e64493", + "target": "be4082d6-e238-40ea-a9df-fc0d725e8895", + "sourceHandle": "image", + "targetHandle": "image" + }, + { + "id": "reactflow__edge-7dbb756b-7d79-431c-a46d-d8f7b082c127value-7671553a-cd4b-4e25-8332-9d5667e64493height", + "type": "default", + "source": "7dbb756b-7d79-431c-a46d-d8f7b082c127", + "target": "7671553a-cd4b-4e25-8332-9d5667e64493", + "sourceHandle": "value", + "targetHandle": "height" + }, + { + "id": "reactflow__edge-f5d9bf3b-2646-4b17-9894-20fd2b4218eavalue-7671553a-cd4b-4e25-8332-9d5667e64493width", + "type": "default", + "source": "f5d9bf3b-2646-4b17-9894-20fd2b4218ea", + "target": "7671553a-cd4b-4e25-8332-9d5667e64493", + "sourceHandle": "value", + "targetHandle": "width" + }, + { + "id": "reactflow__edge-5ca87ace-edf9-49c7-a424-cd42416b86a7height-d350feac-9686-4e0d-bd46-a96bd2630818a", + "type": "default", + "source": "5ca87ace-edf9-49c7-a424-cd42416b86a7", + "target": "d350feac-9686-4e0d-bd46-a96bd2630818", + "sourceHandle": "height", + "targetHandle": "a" + }, + { + "id": "reactflow__edge-1ba845a6-eb88-49a1-a490-5fe6754f3ec9value-d350feac-9686-4e0d-bd46-a96bd2630818b", + "type": "default", + "source": "1ba845a6-eb88-49a1-a490-5fe6754f3ec9", + "target": "d350feac-9686-4e0d-bd46-a96bd2630818", + "sourceHandle": "value", + "targetHandle": "b" + }, + { + "id": "reactflow__edge-1ba845a6-eb88-49a1-a490-5fe6754f3ec9value-5b256f14-caab-40ff-b8f0-9679cd542163b", + "type": "default", + "source": "1ba845a6-eb88-49a1-a490-5fe6754f3ec9", + "target": "5b256f14-caab-40ff-b8f0-9679cd542163", + "sourceHandle": "value", + "targetHandle": "b" + }, + { + "id": "reactflow__edge-5ca87ace-edf9-49c7-a424-cd42416b86a7width-5b256f14-caab-40ff-b8f0-9679cd542163a", + "type": "default", + "source": "5ca87ace-edf9-49c7-a424-cd42416b86a7", + "target": "5b256f14-caab-40ff-b8f0-9679cd542163", + "sourceHandle": "width", + "targetHandle": "a" + } + ] +} diff --git a/invokeai/app/services/workflow_records/default_workflows/Prompt from File.json b/invokeai/app/services/workflow_records/default_workflows/Prompt from File.json index 765b236714..de902bc77e 100644 --- a/invokeai/app/services/workflow_records/default_workflows/Prompt from File.json +++ b/invokeai/app/services/workflow_records/default_workflows/Prompt from File.json @@ -2,7 +2,7 @@ "name": "Prompt from File", "author": "InvokeAI", "description": "Sample workflow using Prompt from File node", - "version": "2.0.0", + "version": "2.1.0", "contact": "invoke@invoke.ai", "tags": "text2image, prompt from file, default", "notes": "", @@ -37,16 +37,68 @@ } ], "meta": { - "category": "default", - "version": "3.0.0" + "version": "3.0.0", + "category": "default" }, "nodes": [ { - "id": "c2eaf1ba-5708-4679-9e15-945b8b432692", + "id": "491ec988-3c77-4c37-af8a-39a0c4e7a2a1", "type": "invocation", "data": { - "id": "c2eaf1ba-5708-4679-9e15-945b8b432692", - "version": "1.1.1", + "id": "491ec988-3c77-4c37-af8a-39a0c4e7a2a1", + "version": "1.3.0", + "nodePack": "invokeai", + "label": "", + "notes": "", + "type": "l2i", + "inputs": { + "board": { + "name": "board", + "label": "" + }, + "metadata": { + "name": "metadata", + "label": "" + }, + "latents": { + "name": "latents", + "label": "" + }, + "vae": { + "name": "vae", + "label": "" + }, + "tiled": { + "name": "tiled", + "label": "", + "value": false + }, + "tile_size": { + "name": "tile_size", + "label": "", + "value": 0 + }, + "fp32": { + "name": "fp32", + "label": "", + "value": false + } + }, + "isOpen": true, + "isIntermediate": true, + "useCache": true + }, + "position": { + "x": 2037.861329274915, + "y": -329.8393457509562 + } + }, + { + "id": "fc9d0e35-a6de-4a19-84e1-c72497c823f6", + "type": "invocation", + "data": { + "id": "fc9d0e35-a6de-4a19-84e1-c72497c823f6", + "version": "1.2.0", "nodePack": "invokeai", "label": "", "notes": "", @@ -60,6 +112,69 @@ "clip": { "name": "clip", "label": "" + }, + "mask": { + "name": "mask", + "label": "" + } + }, + "isOpen": false, + "isIntermediate": true, + "useCache": true + }, + "position": { + "x": 925, + "y": -275 + } + }, + { + "id": "d6353b7f-b447-4e17-8f2e-80a88c91d426", + "type": "invocation", + "data": { + "id": "d6353b7f-b447-4e17-8f2e-80a88c91d426", + "version": "1.0.3", + "nodePack": "invokeai", + "label": "", + "notes": "", + "type": "main_model_loader", + "inputs": { + "model": { + "name": "model", + "label": "" + } + }, + "isOpen": true, + "isIntermediate": true, + "useCache": true + }, + "position": { + "x": 0, + "y": -375 + } + }, + { + "id": "c2eaf1ba-5708-4679-9e15-945b8b432692", + "type": "invocation", + "data": { + "id": "c2eaf1ba-5708-4679-9e15-945b8b432692", + "version": "1.2.0", + "nodePack": "invokeai", + "label": "", + "notes": "", + "type": "compel", + "inputs": { + "prompt": { + "name": "prompt", + "label": "", + "value": "" + }, + "clip": { + "name": "clip", + "label": "" + }, + "mask": { + "name": "mask", + "label": "" } }, "isOpen": false, @@ -141,61 +256,6 @@ "y": -400 } }, - { - "id": "d6353b7f-b447-4e17-8f2e-80a88c91d426", - "type": "invocation", - "data": { - "id": "d6353b7f-b447-4e17-8f2e-80a88c91d426", - "version": "1.0.2", - "nodePack": "invokeai", - "label": "", - "notes": "", - "type": "main_model_loader", - "inputs": { - "model": { - "name": "model", - "label": "" - } - }, - "isOpen": true, - "isIntermediate": true, - "useCache": true - }, - "position": { - "x": 0, - "y": -375 - } - }, - { - "id": "fc9d0e35-a6de-4a19-84e1-c72497c823f6", - "type": "invocation", - "data": { - "id": "fc9d0e35-a6de-4a19-84e1-c72497c823f6", - "version": "1.1.1", - "nodePack": "invokeai", - "label": "", - "notes": "", - "type": "compel", - "inputs": { - "prompt": { - "name": "prompt", - "label": "", - "value": "" - }, - "clip": { - "name": "clip", - "label": "" - } - }, - "isOpen": false, - "isIntermediate": true, - "useCache": true - }, - "position": { - "x": 925, - "y": -275 - } - }, { "id": "0eb5f3f5-1b91-49eb-9ef0-41d67c7eae77", "type": "invocation", @@ -268,53 +328,6 @@ "y": -50 } }, - { - "id": "491ec988-3c77-4c37-af8a-39a0c4e7a2a1", - "type": "invocation", - "data": { - "id": "491ec988-3c77-4c37-af8a-39a0c4e7a2a1", - "version": "1.2.2", - "nodePack": "invokeai", - "label": "", - "notes": "", - "type": "l2i", - "inputs": { - "board": { - "name": "board", - "label": "" - }, - "metadata": { - "name": "metadata", - "label": "" - }, - "latents": { - "name": "latents", - "label": "" - }, - "vae": { - "name": "vae", - "label": "" - }, - "tiled": { - "name": "tiled", - "label": "", - "value": false - }, - "fp32": { - "name": "fp32", - "label": "", - "value": false - } - }, - "isOpen": true, - "isIntermediate": true, - "useCache": true - }, - "position": { - "x": 2037.861329274915, - "y": -329.8393457509562 - } - }, { "id": "2fb1577f-0a56-4f12-8711-8afcaaaf1d5e", "type": "invocation", diff --git a/invokeai/app/services/workflow_records/default_workflows/Text to Image - SD1.5.json b/invokeai/app/services/workflow_records/default_workflows/Text to Image - SD1.5.json index d3d52150bc..65f894724c 100644 --- a/invokeai/app/services/workflow_records/default_workflows/Text to Image - SD1.5.json +++ b/invokeai/app/services/workflow_records/default_workflows/Text to Image - SD1.5.json @@ -2,7 +2,7 @@ "name": "Text to Image - SD1.5", "author": "InvokeAI", "description": "Sample text to image workflow for Stable Diffusion 1.5/2", - "version": "2.0.0", + "version": "2.1.0", "contact": "invoke@invoke.ai", "tags": "text2image, SD1.5, SD2, default", "notes": "", @@ -33,16 +33,127 @@ } ], "meta": { - "category": "default", - "version": "3.0.0" + "version": "3.0.0", + "category": "default" }, "nodes": [ + { + "id": "58c957f5-0d01-41fc-a803-b2bbf0413d4f", + "type": "invocation", + "data": { + "id": "58c957f5-0d01-41fc-a803-b2bbf0413d4f", + "version": "1.3.0", + "nodePack": "invokeai", + "label": "", + "notes": "", + "type": "l2i", + "inputs": { + "board": { + "name": "board", + "label": "" + }, + "metadata": { + "name": "metadata", + "label": "" + }, + "latents": { + "name": "latents", + "label": "" + }, + "vae": { + "name": "vae", + "label": "" + }, + "tiled": { + "name": "tiled", + "label": "", + "value": false + }, + "tile_size": { + "name": "tile_size", + "label": "", + "value": 0 + }, + "fp32": { + "name": "fp32", + "label": "", + "value": true + } + }, + "isOpen": true, + "isIntermediate": false, + "useCache": true + }, + "position": { + "x": 1800, + "y": 25 + } + }, + { + "id": "7d8bf987-284f-413a-b2fd-d825445a5d6c", + "type": "invocation", + "data": { + "id": "7d8bf987-284f-413a-b2fd-d825445a5d6c", + "version": "1.2.0", + "nodePack": "invokeai", + "label": "Positive Compel Prompt", + "notes": "", + "type": "compel", + "inputs": { + "prompt": { + "name": "prompt", + "label": "Positive Prompt", + "value": "Super cute tiger cub, national geographic award-winning photograph" + }, + "clip": { + "name": "clip", + "label": "" + }, + "mask": { + "name": "mask", + "label": "" + } + }, + "isOpen": true, + "isIntermediate": true, + "useCache": true + }, + "position": { + "x": 1000, + "y": 25 + } + }, + { + "id": "c8d55139-f380-4695-b7f2-8b3d1e1e3db8", + "type": "invocation", + "data": { + "id": "c8d55139-f380-4695-b7f2-8b3d1e1e3db8", + "version": "1.0.3", + "nodePack": "invokeai", + "label": "", + "notes": "", + "type": "main_model_loader", + "inputs": { + "model": { + "name": "model", + "label": "" + } + }, + "isOpen": true, + "isIntermediate": true, + "useCache": true + }, + "position": { + "x": 600, + "y": 25 + } + }, { "id": "93dc02a4-d05b-48ed-b99c-c9b616af3402", "type": "invocation", "data": { "id": "93dc02a4-d05b-48ed-b99c-c9b616af3402", - "version": "1.1.1", + "version": "1.2.0", "nodePack": "invokeai", "label": "Negative Compel Prompt", "notes": "", @@ -56,6 +167,10 @@ "clip": { "name": "clip", "label": "" + }, + "mask": { + "name": "mask", + "label": "" } }, "isOpen": true, @@ -108,61 +223,6 @@ "y": 325 } }, - { - "id": "c8d55139-f380-4695-b7f2-8b3d1e1e3db8", - "type": "invocation", - "data": { - "id": "c8d55139-f380-4695-b7f2-8b3d1e1e3db8", - "version": "1.0.2", - "nodePack": "invokeai", - "label": "", - "notes": "", - "type": "main_model_loader", - "inputs": { - "model": { - "name": "model", - "label": "" - } - }, - "isOpen": true, - "isIntermediate": true, - "useCache": true - }, - "position": { - "x": 600, - "y": 25 - } - }, - { - "id": "7d8bf987-284f-413a-b2fd-d825445a5d6c", - "type": "invocation", - "data": { - "id": "7d8bf987-284f-413a-b2fd-d825445a5d6c", - "version": "1.1.1", - "nodePack": "invokeai", - "label": "Positive Compel Prompt", - "notes": "", - "type": "compel", - "inputs": { - "prompt": { - "name": "prompt", - "label": "Positive Prompt", - "value": "Super cute tiger cub, national geographic award-winning photograph" - }, - "clip": { - "name": "clip", - "label": "" - } - }, - "isOpen": true, - "isIntermediate": true, - "useCache": true - }, - "position": { - "x": 1000, - "y": 25 - } - }, { "id": "ea94bc37-d995-4a83-aa99-4af42479f2f2", "type": "invocation", @@ -280,53 +340,6 @@ "x": 1400, "y": 25 } - }, - { - "id": "58c957f5-0d01-41fc-a803-b2bbf0413d4f", - "type": "invocation", - "data": { - "id": "58c957f5-0d01-41fc-a803-b2bbf0413d4f", - "version": "1.2.2", - "nodePack": "invokeai", - "label": "", - "notes": "", - "type": "l2i", - "inputs": { - "board": { - "name": "board", - "label": "" - }, - "metadata": { - "name": "metadata", - "label": "" - }, - "latents": { - "name": "latents", - "label": "" - }, - "vae": { - "name": "vae", - "label": "" - }, - "tiled": { - "name": "tiled", - "label": "", - "value": false - }, - "fp32": { - "name": "fp32", - "label": "", - "value": true - } - }, - "isOpen": true, - "isIntermediate": false, - "useCache": true - }, - "position": { - "x": 1800, - "y": 25 - } } ], "edges": [ diff --git a/invokeai/app/services/workflow_records/default_workflows/Text to Image - SDXL.json b/invokeai/app/services/workflow_records/default_workflows/Text to Image - SDXL.json index 1527bbceb1..0f4777169e 100644 --- a/invokeai/app/services/workflow_records/default_workflows/Text to Image - SDXL.json +++ b/invokeai/app/services/workflow_records/default_workflows/Text to Image - SDXL.json @@ -2,7 +2,7 @@ "name": "Text to Image - SDXL", "author": "InvokeAI", "description": "Sample text to image workflow for SDXL", - "version": "2.0.0", + "version": "2.1.0", "contact": "invoke@invoke.ai", "tags": "text2image, SDXL, default", "notes": "", @@ -29,10 +29,271 @@ } ], "meta": { - "category": "default", - "version": "3.0.0" + "version": "3.0.0", + "category": "default" }, "nodes": [ + { + "id": "0093692f-9cf4-454d-a5b8-62f0e3eb3bb8", + "type": "invocation", + "data": { + "id": "0093692f-9cf4-454d-a5b8-62f0e3eb3bb8", + "version": "1.0.3", + "label": "", + "notes": "", + "type": "vae_loader", + "inputs": { + "vae_model": { + "name": "vae_model", + "label": "VAE (use the FP16 model)", + "value": { + "key": "f20f9e5c-1bce-4c46-a84d-34ebfa7df069", + "hash": "blake3:9705ab1c31fa96b308734214fb7571a958621c7a9247eed82b7d277145f8d9fa", + "name": "sdxl-vae-fp16-fix", + "base": "sdxl", + "type": "vae" + } + } + }, + "isOpen": true, + "isIntermediate": true, + "useCache": true + }, + "position": { + "x": 375, + "y": -225 + } + }, + { + "id": "63e91020-83b2-4f35-b174-ad9692aabb48", + "type": "invocation", + "data": { + "id": "63e91020-83b2-4f35-b174-ad9692aabb48", + "version": "1.3.0", + "nodePack": "invokeai", + "label": "", + "notes": "", + "type": "l2i", + "inputs": { + "board": { + "name": "board", + "label": "" + }, + "metadata": { + "name": "metadata", + "label": "" + }, + "latents": { + "name": "latents", + "label": "" + }, + "vae": { + "name": "vae", + "label": "" + }, + "tiled": { + "name": "tiled", + "label": "", + "value": false + }, + "tile_size": { + "name": "tile_size", + "label": "", + "value": 0 + }, + "fp32": { + "name": "fp32", + "label": "", + "value": false + } + }, + "isOpen": true, + "isIntermediate": false, + "useCache": false + }, + "position": { + "x": 1475, + "y": -500 + } + }, + { + "id": "faf965a4-7530-427b-b1f3-4ba6505c2a08", + "type": "invocation", + "data": { + "id": "faf965a4-7530-427b-b1f3-4ba6505c2a08", + "version": "1.2.0", + "nodePack": "invokeai", + "label": "SDXL Positive Compel Prompt", + "notes": "", + "type": "sdxl_compel_prompt", + "inputs": { + "prompt": { + "name": "prompt", + "label": "Positive Prompt", + "value": "" + }, + "style": { + "name": "style", + "label": "Positive Style", + "value": "" + }, + "original_width": { + "name": "original_width", + "label": "", + "value": 1024 + }, + "original_height": { + "name": "original_height", + "label": "", + "value": 1024 + }, + "crop_top": { + "name": "crop_top", + "label": "", + "value": 0 + }, + "crop_left": { + "name": "crop_left", + "label": "", + "value": 0 + }, + "target_width": { + "name": "target_width", + "label": "", + "value": 1024 + }, + "target_height": { + "name": "target_height", + "label": "", + "value": 1024 + }, + "clip": { + "name": "clip", + "label": "" + }, + "clip2": { + "name": "clip2", + "label": "" + }, + "mask": { + "name": "mask", + "label": "" + } + }, + "isOpen": false, + "isIntermediate": true, + "useCache": true + }, + "position": { + "x": 750, + "y": -175 + } + }, + { + "id": "30d3289c-773c-4152-a9d2-bd8a99c8fd22", + "type": "invocation", + "data": { + "id": "30d3289c-773c-4152-a9d2-bd8a99c8fd22", + "version": "1.0.3", + "nodePack": "invokeai", + "label": "", + "notes": "", + "type": "sdxl_model_loader", + "inputs": { + "model": { + "name": "model", + "label": "", + "value": { + "key": "4a63b226-e8ff-4da4-854e-0b9f04b562ba", + "hash": "blake3:d279309ea6e5ee6e8fd52504275865cc280dac71cbf528c5b07c98b888bddaba", + "name": "dreamshaper-xl-v2-turbo", + "base": "sdxl", + "type": "main" + } + } + }, + "isOpen": true, + "isIntermediate": true, + "useCache": true + }, + "position": { + "x": 375, + "y": -500 + } + }, + { + "id": "3193ad09-a7c2-4bf4-a3a9-1c61cc33a204", + "type": "invocation", + "data": { + "id": "3193ad09-a7c2-4bf4-a3a9-1c61cc33a204", + "version": "1.2.0", + "nodePack": "invokeai", + "label": "SDXL Negative Compel Prompt", + "notes": "", + "type": "sdxl_compel_prompt", + "inputs": { + "prompt": { + "name": "prompt", + "label": "Negative Prompt", + "value": "" + }, + "style": { + "name": "style", + "label": "Negative Style", + "value": "" + }, + "original_width": { + "name": "original_width", + "label": "", + "value": 1024 + }, + "original_height": { + "name": "original_height", + "label": "", + "value": 1024 + }, + "crop_top": { + "name": "crop_top", + "label": "", + "value": 0 + }, + "crop_left": { + "name": "crop_left", + "label": "", + "value": 0 + }, + "target_width": { + "name": "target_width", + "label": "", + "value": 1024 + }, + "target_height": { + "name": "target_height", + "label": "", + "value": 1024 + }, + "clip": { + "name": "clip", + "label": "" + }, + "clip2": { + "name": "clip2", + "label": "" + }, + "mask": { + "name": "mask", + "label": "" + } + }, + "isOpen": false, + "isIntermediate": true, + "useCache": true + }, + "position": { + "x": 750, + "y": 200 + } + }, { "id": "3774ec24-a69e-4254-864c-097d07a6256f", "type": "invocation", @@ -88,75 +349,6 @@ "y": -125 } }, - { - "id": "3193ad09-a7c2-4bf4-a3a9-1c61cc33a204", - "type": "invocation", - "data": { - "id": "3193ad09-a7c2-4bf4-a3a9-1c61cc33a204", - "version": "1.1.1", - "nodePack": "invokeai", - "label": "SDXL Negative Compel Prompt", - "notes": "", - "type": "sdxl_compel_prompt", - "inputs": { - "prompt": { - "name": "prompt", - "label": "Negative Prompt", - "value": "" - }, - "style": { - "name": "style", - "label": "Negative Style", - "value": "" - }, - "original_width": { - "name": "original_width", - "label": "", - "value": 1024 - }, - "original_height": { - "name": "original_height", - "label": "", - "value": 1024 - }, - "crop_top": { - "name": "crop_top", - "label": "", - "value": 0 - }, - "crop_left": { - "name": "crop_left", - "label": "", - "value": 0 - }, - "target_width": { - "name": "target_width", - "label": "", - "value": 1024 - }, - "target_height": { - "name": "target_height", - "label": "", - "value": 1024 - }, - "clip": { - "name": "clip", - "label": "" - }, - "clip2": { - "name": "clip2", - "label": "" - } - }, - "isOpen": false, - "isIntermediate": true, - "useCache": true - }, - "position": { - "x": 750, - "y": 200 - } - }, { "id": "55705012-79b9-4aac-9f26-c0b10309785b", "type": "invocation", @@ -229,154 +421,6 @@ "y": -50 } }, - { - "id": "30d3289c-773c-4152-a9d2-bd8a99c8fd22", - "type": "invocation", - "data": { - "id": "30d3289c-773c-4152-a9d2-bd8a99c8fd22", - "version": "1.0.2", - "nodePack": "invokeai", - "label": "", - "notes": "", - "type": "sdxl_model_loader", - "inputs": { - "model": { - "name": "model", - "label": "", - "value": { - "key": "4a63b226-e8ff-4da4-854e-0b9f04b562ba", - "hash": "blake3:d279309ea6e5ee6e8fd52504275865cc280dac71cbf528c5b07c98b888bddaba", - "name": "dreamshaper-xl-v2-turbo", - "base": "sdxl", - "type": "main" - } - } - }, - "isOpen": true, - "isIntermediate": true, - "useCache": true - }, - "position": { - "x": 375, - "y": -500 - } - }, - { - "id": "faf965a4-7530-427b-b1f3-4ba6505c2a08", - "type": "invocation", - "data": { - "id": "faf965a4-7530-427b-b1f3-4ba6505c2a08", - "version": "1.1.1", - "nodePack": "invokeai", - "label": "SDXL Positive Compel Prompt", - "notes": "", - "type": "sdxl_compel_prompt", - "inputs": { - "prompt": { - "name": "prompt", - "label": "Positive Prompt", - "value": "" - }, - "style": { - "name": "style", - "label": "Positive Style", - "value": "" - }, - "original_width": { - "name": "original_width", - "label": "", - "value": 1024 - }, - "original_height": { - "name": "original_height", - "label": "", - "value": 1024 - }, - "crop_top": { - "name": "crop_top", - "label": "", - "value": 0 - }, - "crop_left": { - "name": "crop_left", - "label": "", - "value": 0 - }, - "target_width": { - "name": "target_width", - "label": "", - "value": 1024 - }, - "target_height": { - "name": "target_height", - "label": "", - "value": 1024 - }, - "clip": { - "name": "clip", - "label": "" - }, - "clip2": { - "name": "clip2", - "label": "" - } - }, - "isOpen": false, - "isIntermediate": true, - "useCache": true - }, - "position": { - "x": 750, - "y": -175 - } - }, - { - "id": "63e91020-83b2-4f35-b174-ad9692aabb48", - "type": "invocation", - "data": { - "id": "63e91020-83b2-4f35-b174-ad9692aabb48", - "version": "1.2.2", - "nodePack": "invokeai", - "label": "", - "notes": "", - "type": "l2i", - "inputs": { - "board": { - "name": "board", - "label": "" - }, - "metadata": { - "name": "metadata", - "label": "" - }, - "latents": { - "name": "latents", - "label": "" - }, - "vae": { - "name": "vae", - "label": "" - }, - "tiled": { - "name": "tiled", - "label": "", - "value": false - }, - "fp32": { - "name": "fp32", - "label": "", - "value": false - } - }, - "isOpen": true, - "isIntermediate": false, - "useCache": false - }, - "position": { - "x": 1475, - "y": -500 - } - }, { "id": "50a36525-3c0a-4cc5-977c-e4bfc3fd6dfb", "type": "invocation", @@ -464,37 +508,6 @@ "y": -500 } }, - { - "id": "0093692f-9cf4-454d-a5b8-62f0e3eb3bb8", - "type": "invocation", - "data": { - "id": "0093692f-9cf4-454d-a5b8-62f0e3eb3bb8", - "version": "1.0.2", - "label": "", - "notes": "", - "type": "vae_loader", - "inputs": { - "vae_model": { - "name": "vae_model", - "label": "VAE (use the FP16 model)", - "value": { - "key": "f20f9e5c-1bce-4c46-a84d-34ebfa7df069", - "hash": "blake3:9705ab1c31fa96b308734214fb7571a958621c7a9247eed82b7d277145f8d9fa", - "name": "sdxl-vae-fp16-fix", - "base": "sdxl", - "type": "vae" - } - } - }, - "isOpen": true, - "isIntermediate": true, - "useCache": true - }, - "position": { - "x": 375, - "y": -225 - } - }, { "id": "ade2c0d3-0384-4157-b39b-29ce429cfa15", "type": "invocation", diff --git a/invokeai/app/services/workflow_records/default_workflows/Text to Image with LoRA.json b/invokeai/app/services/workflow_records/default_workflows/Text to Image with LoRA.json index 6df02b675d..b4df4b921c 100644 --- a/invokeai/app/services/workflow_records/default_workflows/Text to Image with LoRA.json +++ b/invokeai/app/services/workflow_records/default_workflows/Text to Image with LoRA.json @@ -2,7 +2,7 @@ "name": "Text to Image with LoRA", "author": "InvokeAI", "description": "Simple text to image workflow with a LoRA", - "version": "2.0.0", + "version": "2.1.0", "contact": "invoke@invoke.ai", "tags": "text to image, lora, default", "notes": "", @@ -37,28 +37,83 @@ } ], "meta": { - "category": "default", - "version": "3.0.0" + "version": "3.0.0", + "category": "default" }, "nodes": [ { - "id": "85b77bb2-c67a-416a-b3e8-291abe746c44", + "id": "a9683c0a-6b1f-4a5e-8187-c57e764b3400", "type": "invocation", "data": { - "id": "85b77bb2-c67a-416a-b3e8-291abe746c44", - "version": "1.1.1", + "id": "a9683c0a-6b1f-4a5e-8187-c57e764b3400", + "version": "1.3.0", + "label": "", + "notes": "", + "type": "l2i", + "inputs": { + "board": { + "name": "board", + "label": "" + }, + "metadata": { + "name": "metadata", + "label": "" + }, + "latents": { + "name": "latents", + "label": "" + }, + "vae": { + "name": "vae", + "label": "" + }, + "tiled": { + "name": "tiled", + "label": "", + "value": false + }, + "tile_size": { + "name": "tile_size", + "label": "", + "value": 0 + }, + "fp32": { + "name": "fp32", + "label": "", + "value": false + } + }, + "isOpen": true, + "isIntermediate": false, + "useCache": true + }, + "position": { + "x": 4450, + "y": -550 + } + }, + { + "id": "c3fa6872-2599-4a82-a596-b3446a66cf8b", + "type": "invocation", + "data": { + "id": "c3fa6872-2599-4a82-a596-b3446a66cf8b", + "version": "1.2.0", "label": "", "notes": "", "type": "compel", "inputs": { "prompt": { "name": "prompt", - "label": "Negative Prompt", - "value": "" + "label": "Positive Prompt", + "value": "super cute tiger cub" }, "clip": { "name": "clip", "label": "" + }, + "mask": { + "name": "mask", + "label": "" } }, "isOpen": true, @@ -67,31 +122,7 @@ }, "position": { "x": 3425, - "y": -300 - } - }, - { - "id": "24e9d7ed-4836-4ec4-8f9e-e747721f9818", - "type": "invocation", - "data": { - "id": "24e9d7ed-4836-4ec4-8f9e-e747721f9818", - "version": "1.0.2", - "label": "", - "notes": "", - "type": "main_model_loader", - "inputs": { - "model": { - "name": "model", - "label": "" - } - }, - "isOpen": true, - "isIntermediate": true, - "useCache": true - }, - "position": { - "x": 2500, - "y": -600 + "y": -575 } }, { @@ -99,7 +130,7 @@ "type": "invocation", "data": { "id": "c41e705b-f2e3-4d1a-83c4-e34bb9344966", - "version": "1.0.2", + "version": "1.0.3", "label": "", "notes": "", "type": "lora_loader", @@ -132,23 +163,51 @@ } }, { - "id": "c3fa6872-2599-4a82-a596-b3446a66cf8b", + "id": "24e9d7ed-4836-4ec4-8f9e-e747721f9818", "type": "invocation", "data": { - "id": "c3fa6872-2599-4a82-a596-b3446a66cf8b", - "version": "1.1.1", + "id": "24e9d7ed-4836-4ec4-8f9e-e747721f9818", + "version": "1.0.3", + "label": "", + "notes": "", + "type": "main_model_loader", + "inputs": { + "model": { + "name": "model", + "label": "" + } + }, + "isOpen": true, + "isIntermediate": true, + "useCache": true + }, + "position": { + "x": 2500, + "y": -600 + } + }, + { + "id": "85b77bb2-c67a-416a-b3e8-291abe746c44", + "type": "invocation", + "data": { + "id": "85b77bb2-c67a-416a-b3e8-291abe746c44", + "version": "1.2.0", "label": "", "notes": "", "type": "compel", "inputs": { "prompt": { "name": "prompt", - "label": "Positive Prompt", - "value": "super cute tiger cub" + "label": "Negative Prompt", + "value": "" }, "clip": { "name": "clip", "label": "" + }, + "mask": { + "name": "mask", + "label": "" } }, "isOpen": true, @@ -157,7 +216,7 @@ }, "position": { "x": 3425, - "y": -575 + "y": -300 } }, { @@ -315,52 +374,6 @@ "x": 3425, "y": 0 } - }, - { - "id": "a9683c0a-6b1f-4a5e-8187-c57e764b3400", - "type": "invocation", - "data": { - "id": "a9683c0a-6b1f-4a5e-8187-c57e764b3400", - "version": "1.2.2", - "label": "", - "notes": "", - "type": "l2i", - "inputs": { - "board": { - "name": "board", - "label": "" - }, - "metadata": { - "name": "metadata", - "label": "" - }, - "latents": { - "name": "latents", - "label": "" - }, - "vae": { - "name": "vae", - "label": "" - }, - "tiled": { - "name": "tiled", - "label": "", - "value": false - }, - "fp32": { - "name": "fp32", - "label": "", - "value": false - } - }, - "isOpen": true, - "isIntermediate": false, - "useCache": true - }, - "position": { - "x": 4450, - "y": -550 - } } ], "edges": [ diff --git a/invokeai/app/services/workflow_records/default_workflows/Tiled Upscaling (Beta).json b/invokeai/app/services/workflow_records/default_workflows/Tiled Upscaling (Beta).json index bb0e9062e4..426fe49c41 100644 --- a/invokeai/app/services/workflow_records/default_workflows/Tiled Upscaling (Beta).json +++ b/invokeai/app/services/workflow_records/default_workflows/Tiled Upscaling (Beta).json @@ -2,7 +2,7 @@ "name": "Tiled Upscaling (Beta)", "author": "Invoke", "description": "A workflow to upscale an input image with tiled upscaling. ", - "version": "2.0.0", + "version": "2.1.0", "contact": "invoke@invoke.ai", "tags": "tiled, upscaling, sd1.5", "notes": "", @@ -41,10 +41,318 @@ } ], "meta": { - "category": "default", - "version": "3.0.0" + "version": "3.0.0", + "category": "default" }, "nodes": [ + { + "id": "2ff466b8-5e2a-4d8f-923a-a3884c7ecbc5", + "type": "invocation", + "data": { + "id": "2ff466b8-5e2a-4d8f-923a-a3884c7ecbc5", + "version": "1.0.3", + "label": "", + "notes": "", + "type": "main_model_loader", + "inputs": { + "model": { + "name": "model", + "label": "" + } + }, + "isOpen": true, + "isIntermediate": true, + "useCache": true + }, + "position": { + "x": -4514.466823162653, + "y": -1235.7908800002283 + } + }, + { + "id": "287f134f-da8d-41d1-884e-5940e8f7b816", + "type": "invocation", + "data": { + "id": "287f134f-da8d-41d1-884e-5940e8f7b816", + "version": "1.4.1", + "label": "", + "notes": "", + "type": "ip_adapter", + "inputs": { + "image": { + "name": "image", + "label": "" + }, + "ip_adapter_model": { + "name": "ip_adapter_model", + "label": "IP-Adapter Model (select ip_adapter_sd15)", + "value": { + "key": "1cc210bb-4d0a-4312-b36c-b5d46c43768e", + "hash": "blake3:3d669dffa7471b357b4df088b99ffb6bf4d4383d5e0ef1de5ec1c89728a3d5a5", + "name": "ip_adapter_sd15", + "base": "sd-1", + "type": "ip_adapter" + } + }, + "clip_vision_model": { + "name": "clip_vision_model", + "label": "", + "value": "ViT-H" + }, + "weight": { + "name": "weight", + "label": "", + "value": 0.2 + }, + "method": { + "name": "method", + "label": "", + "value": "full" + }, + "begin_step_percent": { + "name": "begin_step_percent", + "label": "", + "value": 0 + }, + "end_step_percent": { + "name": "end_step_percent", + "label": "", + "value": 1 + }, + "mask": { + "name": "mask", + "label": "" + } + }, + "isOpen": true, + "isIntermediate": true, + "useCache": true + }, + "position": { + "x": -2855.8555540799207, + "y": -183.58854843775742 + } + }, + { + "id": "b76fe66f-7884-43ad-b72c-fadc81d7a73c", + "type": "invocation", + "data": { + "id": "b76fe66f-7884-43ad-b72c-fadc81d7a73c", + "version": "1.3.0", + "label": "", + "notes": "", + "type": "l2i", + "inputs": { + "board": { + "name": "board", + "label": "" + }, + "metadata": { + "name": "metadata", + "label": "" + }, + "latents": { + "name": "latents", + "label": "" + }, + "vae": { + "name": "vae", + "label": "" + }, + "tiled": { + "name": "tiled", + "label": "", + "value": false + }, + "tile_size": { + "name": "tile_size", + "label": "", + "value": 0 + }, + "fp32": { + "name": "fp32", + "label": "", + "value": false + } + }, + "isOpen": true, + "isIntermediate": true, + "useCache": true + }, + "position": { + "x": -1999.770193862987, + "y": -1075 + } + }, + { + "id": "d334f2da-016a-4524-9911-bdab85546888", + "type": "invocation", + "data": { + "id": "d334f2da-016a-4524-9911-bdab85546888", + "version": "1.1.2", + "label": "", + "notes": "", + "type": "controlnet", + "inputs": { + "image": { + "name": "image", + "label": "" + }, + "control_model": { + "name": "control_model", + "label": "Control Model (select contro_v11f1e_sd15_tile)", + "value": { + "key": "773843c8-db1f-4502-8f65-59782efa7960", + "hash": "blake3:f0812e13758f91baf4e54b7dbb707b70642937d3b2098cd2b94cc36d3eba308e", + "name": "control_v11f1e_sd15_tile", + "base": "sd-1", + "type": "controlnet" + } + }, + "control_weight": { + "name": "control_weight", + "label": "", + "value": 1 + }, + "begin_step_percent": { + "name": "begin_step_percent", + "label": "", + "value": 0 + }, + "end_step_percent": { + "name": "end_step_percent", + "label": "Structural Control", + "value": 1 + }, + "control_mode": { + "name": "control_mode", + "label": "", + "value": "more_control" + }, + "resize_mode": { + "name": "resize_mode", + "label": "", + "value": "just_resize" + } + }, + "isOpen": true, + "isIntermediate": true, + "useCache": true + }, + "position": { + "x": -2481.9569385477016, + "y": -181.06590482739782 + } + }, + { + "id": "338b883c-3728-4f18-b3a6-6e7190c2f850", + "type": "invocation", + "data": { + "id": "338b883c-3728-4f18-b3a6-6e7190c2f850", + "version": "1.1.0", + "label": "", + "notes": "", + "type": "i2l", + "inputs": { + "image": { + "name": "image", + "label": "" + }, + "vae": { + "name": "vae", + "label": "" + }, + "tiled": { + "name": "tiled", + "label": "", + "value": false + }, + "tile_size": { + "name": "tile_size", + "label": "", + "value": 0 + }, + "fp32": { + "name": "fp32", + "label": "", + "value": false + } + }, + "isOpen": false, + "isIntermediate": true, + "useCache": true + }, + "position": { + "x": -2908.4791167517287, + "y": -408.87504820159086 + } + }, + { + "id": "947c3f88-0305-4695-8355-df4abac64b1c", + "type": "invocation", + "data": { + "id": "947c3f88-0305-4695-8355-df4abac64b1c", + "version": "1.2.0", + "label": "", + "notes": "", + "type": "compel", + "inputs": { + "prompt": { + "name": "prompt", + "label": "", + "value": "" + }, + "clip": { + "name": "clip", + "label": "" + }, + "mask": { + "name": "mask", + "label": "" + } + }, + "isOpen": true, + "isIntermediate": true, + "useCache": true + }, + "position": { + "x": -4014.4136788915944, + "y": -968.5677253775948 + } + }, + { + "id": "9b2d8c58-ce8f-4162-a5a1-48de854040d6", + "type": "invocation", + "data": { + "id": "9b2d8c58-ce8f-4162-a5a1-48de854040d6", + "version": "1.2.0", + "label": "", + "notes": "", + "type": "compel", + "inputs": { + "prompt": { + "name": "prompt", + "label": "Positive Prompt", + "value": "" + }, + "clip": { + "name": "clip", + "label": "" + }, + "mask": { + "name": "mask", + "label": "" + } + }, + "isOpen": true, + "isIntermediate": true, + "useCache": true + }, + "position": { + "x": -4014.4136788915944, + "y": -1243.5677253775948 + } + }, { "id": "b875cae6-d8a3-4fdc-b969-4d53cbd03f9a", "type": "invocation", @@ -181,64 +489,6 @@ "y": 3.422855503409039 } }, - { - "id": "9b2d8c58-ce8f-4162-a5a1-48de854040d6", - "type": "invocation", - "data": { - "id": "9b2d8c58-ce8f-4162-a5a1-48de854040d6", - "version": "1.1.1", - "label": "", - "notes": "", - "type": "compel", - "inputs": { - "prompt": { - "name": "prompt", - "label": "Positive Prompt", - "value": "" - }, - "clip": { - "name": "clip", - "label": "" - } - }, - "isOpen": true, - "isIntermediate": true, - "useCache": true - }, - "position": { - "x": -4014.4136788915944, - "y": -1243.5677253775948 - } - }, - { - "id": "947c3f88-0305-4695-8355-df4abac64b1c", - "type": "invocation", - "data": { - "id": "947c3f88-0305-4695-8355-df4abac64b1c", - "version": "1.1.1", - "label": "", - "notes": "", - "type": "compel", - "inputs": { - "prompt": { - "name": "prompt", - "label": "", - "value": "" - }, - "clip": { - "name": "clip", - "label": "" - } - }, - "isOpen": true, - "isIntermediate": true, - "useCache": true - }, - "position": { - "x": -4014.4136788915944, - "y": -968.5677253775948 - } - }, { "id": "b3513fed-ed42-408d-b382-128fdb0de523", "type": "invocation", @@ -379,104 +629,6 @@ "y": -29.08699277598673 } }, - { - "id": "338b883c-3728-4f18-b3a6-6e7190c2f850", - "type": "invocation", - "data": { - "id": "338b883c-3728-4f18-b3a6-6e7190c2f850", - "version": "1.0.2", - "label": "", - "notes": "", - "type": "i2l", - "inputs": { - "image": { - "name": "image", - "label": "" - }, - "vae": { - "name": "vae", - "label": "" - }, - "tiled": { - "name": "tiled", - "label": "", - "value": false - }, - "fp32": { - "name": "fp32", - "label": "", - "value": false - } - }, - "isOpen": false, - "isIntermediate": true, - "useCache": true - }, - "position": { - "x": -2908.4791167517287, - "y": -408.87504820159086 - } - }, - { - "id": "d334f2da-016a-4524-9911-bdab85546888", - "type": "invocation", - "data": { - "id": "d334f2da-016a-4524-9911-bdab85546888", - "version": "1.1.1", - "label": "", - "notes": "", - "type": "controlnet", - "inputs": { - "image": { - "name": "image", - "label": "" - }, - "control_model": { - "name": "control_model", - "label": "Control Model (select contro_v11f1e_sd15_tile)", - "value": { - "key": "773843c8-db1f-4502-8f65-59782efa7960", - "hash": "blake3:f0812e13758f91baf4e54b7dbb707b70642937d3b2098cd2b94cc36d3eba308e", - "name": "control_v11f1e_sd15_tile", - "base": "sd-1", - "type": "controlnet" - } - }, - "control_weight": { - "name": "control_weight", - "label": "", - "value": 1 - }, - "begin_step_percent": { - "name": "begin_step_percent", - "label": "", - "value": 0 - }, - "end_step_percent": { - "name": "end_step_percent", - "label": "Structural Control", - "value": 1 - }, - "control_mode": { - "name": "control_mode", - "label": "", - "value": "more_control" - }, - "resize_mode": { - "name": "resize_mode", - "label": "", - "value": "just_resize" - } - }, - "isOpen": true, - "isIntermediate": true, - "useCache": true - }, - "position": { - "x": -2481.9569385477016, - "y": -181.06590482739782 - } - }, { "id": "1011539e-85de-4e02-a003-0b22358491b8", "type": "invocation", @@ -563,52 +715,6 @@ "y": -1006.415909408244 } }, - { - "id": "b76fe66f-7884-43ad-b72c-fadc81d7a73c", - "type": "invocation", - "data": { - "id": "b76fe66f-7884-43ad-b72c-fadc81d7a73c", - "version": "1.2.2", - "label": "", - "notes": "", - "type": "l2i", - "inputs": { - "board": { - "name": "board", - "label": "" - }, - "metadata": { - "name": "metadata", - "label": "" - }, - "latents": { - "name": "latents", - "label": "" - }, - "vae": { - "name": "vae", - "label": "" - }, - "tiled": { - "name": "tiled", - "label": "", - "value": false - }, - "fp32": { - "name": "fp32", - "label": "", - "value": false - } - }, - "isOpen": true, - "isIntermediate": true, - "useCache": true - }, - "position": { - "x": -1999.770193862987, - "y": -1075 - } - }, { "id": "ab6f5dda-4b60-4ddf-99f2-f61fb5937527", "type": "invocation", @@ -779,56 +885,6 @@ "y": -78.2819050861178 } }, - { - "id": "287f134f-da8d-41d1-884e-5940e8f7b816", - "type": "invocation", - "data": { - "id": "287f134f-da8d-41d1-884e-5940e8f7b816", - "version": "1.2.2", - "label": "", - "notes": "", - "type": "ip_adapter", - "inputs": { - "image": { - "name": "image", - "label": "" - }, - "ip_adapter_model": { - "name": "ip_adapter_model", - "label": "IP-Adapter Model (select ip_adapter_sd15)", - "value": { - "key": "1cc210bb-4d0a-4312-b36c-b5d46c43768e", - "hash": "blake3:3d669dffa7471b357b4df088b99ffb6bf4d4383d5e0ef1de5ec1c89728a3d5a5", - "name": "ip_adapter_sd15", - "base": "sd-1", - "type": "ip_adapter" - } - }, - "weight": { - "name": "weight", - "label": "", - "value": 0.2 - }, - "begin_step_percent": { - "name": "begin_step_percent", - "label": "", - "value": 0 - }, - "end_step_percent": { - "name": "end_step_percent", - "label": "", - "value": 1 - } - }, - "isOpen": true, - "isIntermediate": true, - "useCache": true - }, - "position": { - "x": -2855.8555540799207, - "y": -183.58854843775742 - } - }, { "id": "1f86c8bf-06f9-4e28-abee-02f46f445ac4", "type": "invocation", @@ -899,30 +955,6 @@ "y": -41.810810454906914 } }, - { - "id": "2ff466b8-5e2a-4d8f-923a-a3884c7ecbc5", - "type": "invocation", - "data": { - "id": "2ff466b8-5e2a-4d8f-923a-a3884c7ecbc5", - "version": "1.0.2", - "label": "", - "notes": "", - "type": "main_model_loader", - "inputs": { - "model": { - "name": "model", - "label": "" - } - }, - "isOpen": true, - "isIntermediate": true, - "useCache": true - }, - "position": { - "x": -4514.466823162653, - "y": -1235.7908800002283 - } - }, { "id": "f5d9bf3b-2646-4b17-9894-20fd2b4218ea", "type": "invocation", From 28e79c4c5ef179d15ddbdea6970898b340da9a80 Mon Sep 17 00:00:00 2001 From: psychedelicious <4822129+psychedelicious@users.noreply.github.com> Date: Mon, 15 Jul 2024 13:02:08 +1000 Subject: [PATCH 44/48] chore: ruff Looks like an upstream change to ruff resulted in this file being a violation. --- invokeai/backend/image_util/lineart_anime.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/invokeai/backend/image_util/lineart_anime.py b/invokeai/backend/image_util/lineart_anime.py index 5185d92c51..33d16bb361 100644 --- a/invokeai/backend/image_util/lineart_anime.py +++ b/invokeai/backend/image_util/lineart_anime.py @@ -98,7 +98,7 @@ class UnetSkipConnectionBlock(nn.Module): """ super(UnetSkipConnectionBlock, self).__init__() self.outermost = outermost - if type(norm_layer) == functools.partial: + if isinstance(norm_layer, functools.partial): use_bias = norm_layer.func == nn.InstanceNorm2d else: use_bias = norm_layer == nn.InstanceNorm2d From 24bf1ea65aced337b13a5c8f3fbc28d7ca9f9d4d Mon Sep 17 00:00:00 2001 From: psychedelicious <4822129+psychedelicious@users.noreply.github.com> Date: Mon, 15 Jul 2024 11:52:40 +1000 Subject: [PATCH 45/48] fix(ui): boards cut off when search open --- .../Boards/BoardsList/BoardsList.tsx | 86 ++++++++++--------- .../components/ImageGalleryContent.tsx | 25 +++--- 2 files changed, 60 insertions(+), 51 deletions(-) diff --git a/invokeai/frontend/web/src/features/gallery/components/Boards/BoardsList/BoardsList.tsx b/invokeai/frontend/web/src/features/gallery/components/Boards/BoardsList/BoardsList.tsx index bd4c42e8d1..4325281e0f 100644 --- a/invokeai/frontend/web/src/features/gallery/components/Boards/BoardsList/BoardsList.tsx +++ b/invokeai/frontend/web/src/features/gallery/components/Boards/BoardsList/BoardsList.tsx @@ -1,4 +1,4 @@ -import { Flex, Text } from '@invoke-ai/ui-library'; +import { Box, Flex, Text } from '@invoke-ai/ui-library'; import { EMPTY_ARRAY } from 'app/store/constants'; import { useAppSelector } from 'app/store/storeHooks'; import { overlayScrollbarsParams } from 'common/components/OverlayScrollbars/constants'; @@ -40,9 +40,41 @@ const BoardsList = () => { return ( <> - - - {allowPrivateBoards && ( + + + + {allowPrivateBoards && ( + + + + {t('boards.private')} + + + + + + {filteredPrivateBoards.map((board) => ( + + ))} + + + )} { justifyContent="space-between" alignItems="center" ps={2} - py={1} + pb={1} + pt={2} zIndex={1} top={0} bg="base.900" > - {t('boards.private')} + {allowPrivateBoards ? t('boards.shared') : t('boards.boards')} - + - - {filteredPrivateBoards.map((board) => ( + {!allowPrivateBoards && } + {filteredSharedBoards.map((board) => ( { ))} - )} - - - - {allowPrivateBoards ? t('boards.shared') : t('boards.boards')} - - - - - {!allowPrivateBoards && } - {filteredSharedBoards.map((board) => ( - - ))} - - - - + + + ); diff --git a/invokeai/frontend/web/src/features/gallery/components/ImageGalleryContent.tsx b/invokeai/frontend/web/src/features/gallery/components/ImageGalleryContent.tsx index 7c992c65d6..5a096f5cef 100644 --- a/invokeai/frontend/web/src/features/gallery/components/ImageGalleryContent.tsx +++ b/invokeai/frontend/web/src/features/gallery/components/ImageGalleryContent.tsx @@ -16,6 +16,7 @@ import { GalleryHeader } from 'features/gallery/components/GalleryHeader'; import { galleryViewChanged } from 'features/gallery/store/gallerySlice'; import ResizeHandle from 'features/ui/components/tabs/ResizeHandle'; import { usePanel, type UsePanelOptions } from 'features/ui/hooks/usePanel'; +import type { CSSProperties } from 'react'; import { memo, useCallback, useMemo, useRef } from 'react'; import { useTranslation } from 'react-i18next'; import { PiMagnifyingGlassBold } from 'react-icons/pi'; @@ -29,13 +30,15 @@ import GalleryImageGrid from './ImageGrid/GalleryImageGrid'; import { GalleryPagination } from './ImageGrid/GalleryPagination'; import { GallerySearch } from './ImageGrid/GallerySearch'; -const baseStyles: ChakraProps['sx'] = { +const COLLAPSE_STYLES: CSSProperties = { flexShrink: 0, minHeight: 0 }; + +const BASE_STYLES: ChakraProps['sx'] = { fontWeight: 'semibold', fontSize: 'sm', color: 'base.300', }; -const selectedStyles: ChakraProps['sx'] = { +const SELECTED_STYLES: ChakraProps['sx'] = { borderColor: 'base.800', borderBottomColor: 'base.900', color: 'invokeBlue.300', @@ -110,11 +113,13 @@ const ImageGalleryContent = () => { onExpand={boardsListPanel.onExpand} collapsible > - - - - - + + + + + + + { - + {t('parameters.images')} - + {t('gallery.assets')} @@ -157,7 +162,7 @@ const ImageGalleryContent = () => { - + From 5a0c99816c5216e060d23e1a76fd50f9d85f541f Mon Sep 17 00:00:00 2001 From: psychedelicious <4822129+psychedelicious@users.noreply.github.com> Date: Mon, 15 Jul 2024 11:55:22 +1000 Subject: [PATCH 46/48] chore: bump version to v4.2.6 --- invokeai/version/invokeai_version.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/invokeai/version/invokeai_version.py b/invokeai/version/invokeai_version.py index 021e20d448..1eecfc4998 100644 --- a/invokeai/version/invokeai_version.py +++ b/invokeai/version/invokeai_version.py @@ -1 +1 @@ -__version__ = "4.2.6rc1" +__version__ = "4.2.6" From 38343917f8c8bff9fe5b13a7d4069e27177dbc39 Mon Sep 17 00:00:00 2001 From: psychedelicious <4822129+psychedelicious@users.noreply.github.com> Date: Tue, 16 Jul 2024 07:05:29 +1000 Subject: [PATCH 47/48] fix(backend): revert non-blocking device transfer In #6490 we enabled non-blocking torch device transfers throughout the model manager's memory management code. When using this torch feature, torch attempts to wait until the tensor transfer has completed before allowing any access to the tensor. Theoretically, that should make this a safe feature to use. This provides a small performance improvement but causes race conditions in some situations. Specific platforms/systems are affected, and complicated data dependencies can make this unsafe. - Intermittent black images on MPS devices - reported on discord and #6545, fixed with special handling in #6549. - Intermittent OOMs and black images on a P4000 GPU on Windows - reported in #6613, fixed in this commit. On my system, I haven't experience any issues with generation, but targeted testing of non-blocking ops did expose a race condition when moving tensors from CUDA to CPU. One workaround is to use torch streams with manual sync points. Our application logic is complicated enough that this would be a lot of work and feels ripe for edge cases and missed spots. Much safer is to fully revert non-locking - which is what this change does. --- invokeai/backend/ip_adapter/ip_adapter.py | 8 +- invokeai/backend/lora.py | 94 ++++++------------- .../load/model_cache/model_cache_default.py | 6 +- invokeai/backend/model_patcher.py | 15 +-- invokeai/backend/onnx/onnx_runtime.py | 7 +- invokeai/backend/raw_model.py | 7 +- invokeai/backend/textual_inversion.py | 9 +- invokeai/backend/util/devices.py | 12 --- 8 files changed, 43 insertions(+), 115 deletions(-) diff --git a/invokeai/backend/ip_adapter/ip_adapter.py b/invokeai/backend/ip_adapter/ip_adapter.py index 75286f4733..87ce029a87 100644 --- a/invokeai/backend/ip_adapter/ip_adapter.py +++ b/invokeai/backend/ip_adapter/ip_adapter.py @@ -124,16 +124,14 @@ class IPAdapter(RawModel): self.device, dtype=self.dtype ) - def to( - self, device: Optional[torch.device] = None, dtype: Optional[torch.dtype] = None, non_blocking: bool = False - ): + def to(self, device: Optional[torch.device] = None, dtype: Optional[torch.dtype] = None): if device is not None: self.device = device if dtype is not None: self.dtype = dtype - self._image_proj_model.to(device=self.device, dtype=self.dtype, non_blocking=non_blocking) - self.attn_weights.to(device=self.device, dtype=self.dtype, non_blocking=non_blocking) + self._image_proj_model.to(device=self.device, dtype=self.dtype) + self.attn_weights.to(device=self.device, dtype=self.dtype) def calc_size(self) -> int: # HACK(ryand): Fix this issue with circular imports. diff --git a/invokeai/backend/lora.py b/invokeai/backend/lora.py index 9c669a4c78..8ef81915f1 100644 --- a/invokeai/backend/lora.py +++ b/invokeai/backend/lora.py @@ -11,7 +11,6 @@ from typing_extensions import Self from invokeai.backend.model_manager import BaseModelType from invokeai.backend.raw_model import RawModel -from invokeai.backend.util.devices import TorchDevice class LoRALayerBase: @@ -57,14 +56,9 @@ class LoRALayerBase: model_size += val.nelement() * val.element_size() return model_size - def to( - self, - device: Optional[torch.device] = None, - dtype: Optional[torch.dtype] = None, - non_blocking: bool = False, - ) -> None: + def to(self, device: Optional[torch.device] = None, dtype: Optional[torch.dtype] = None) -> None: if self.bias is not None: - self.bias = self.bias.to(device=device, dtype=dtype, non_blocking=non_blocking) + self.bias = self.bias.to(device=device, dtype=dtype) # TODO: find and debug lora/locon with bias @@ -106,19 +100,14 @@ class LoRALayer(LoRALayerBase): model_size += val.nelement() * val.element_size() return model_size - def to( - self, - device: Optional[torch.device] = None, - dtype: Optional[torch.dtype] = None, - non_blocking: bool = False, - ) -> None: - super().to(device=device, dtype=dtype, non_blocking=non_blocking) + def to(self, device: Optional[torch.device] = None, dtype: Optional[torch.dtype] = None) -> None: + super().to(device=device, dtype=dtype) - self.up = self.up.to(device=device, dtype=dtype, non_blocking=non_blocking) - self.down = self.down.to(device=device, dtype=dtype, non_blocking=non_blocking) + self.up = self.up.to(device=device, dtype=dtype) + self.down = self.down.to(device=device, dtype=dtype) if self.mid is not None: - self.mid = self.mid.to(device=device, dtype=dtype, non_blocking=non_blocking) + self.mid = self.mid.to(device=device, dtype=dtype) class LoHALayer(LoRALayerBase): @@ -167,23 +156,18 @@ class LoHALayer(LoRALayerBase): model_size += val.nelement() * val.element_size() return model_size - def to( - self, - device: Optional[torch.device] = None, - dtype: Optional[torch.dtype] = None, - non_blocking: bool = False, - ) -> None: + def to(self, device: Optional[torch.device] = None, dtype: Optional[torch.dtype] = None) -> None: super().to(device=device, dtype=dtype) - self.w1_a = self.w1_a.to(device=device, dtype=dtype, non_blocking=non_blocking) - self.w1_b = self.w1_b.to(device=device, dtype=dtype, non_blocking=non_blocking) + self.w1_a = self.w1_a.to(device=device, dtype=dtype) + self.w1_b = self.w1_b.to(device=device, dtype=dtype) if self.t1 is not None: - self.t1 = self.t1.to(device=device, dtype=dtype, non_blocking=non_blocking) + self.t1 = self.t1.to(device=device, dtype=dtype) - self.w2_a = self.w2_a.to(device=device, dtype=dtype, non_blocking=non_blocking) - self.w2_b = self.w2_b.to(device=device, dtype=dtype, non_blocking=non_blocking) + self.w2_a = self.w2_a.to(device=device, dtype=dtype) + self.w2_b = self.w2_b.to(device=device, dtype=dtype) if self.t2 is not None: - self.t2 = self.t2.to(device=device, dtype=dtype, non_blocking=non_blocking) + self.t2 = self.t2.to(device=device, dtype=dtype) class LoKRLayer(LoRALayerBase): @@ -264,12 +248,7 @@ class LoKRLayer(LoRALayerBase): model_size += val.nelement() * val.element_size() return model_size - def to( - self, - device: Optional[torch.device] = None, - dtype: Optional[torch.dtype] = None, - non_blocking: bool = False, - ) -> None: + def to(self, device: Optional[torch.device] = None, dtype: Optional[torch.dtype] = None) -> None: super().to(device=device, dtype=dtype) if self.w1 is not None: @@ -277,19 +256,19 @@ class LoKRLayer(LoRALayerBase): else: assert self.w1_a is not None assert self.w1_b is not None - self.w1_a = self.w1_a.to(device=device, dtype=dtype, non_blocking=non_blocking) - self.w1_b = self.w1_b.to(device=device, dtype=dtype, non_blocking=non_blocking) + self.w1_a = self.w1_a.to(device=device, dtype=dtype) + self.w1_b = self.w1_b.to(device=device, dtype=dtype) if self.w2 is not None: - self.w2 = self.w2.to(device=device, dtype=dtype, non_blocking=non_blocking) + self.w2 = self.w2.to(device=device, dtype=dtype) else: assert self.w2_a is not None assert self.w2_b is not None - self.w2_a = self.w2_a.to(device=device, dtype=dtype, non_blocking=non_blocking) - self.w2_b = self.w2_b.to(device=device, dtype=dtype, non_blocking=non_blocking) + self.w2_a = self.w2_a.to(device=device, dtype=dtype) + self.w2_b = self.w2_b.to(device=device, dtype=dtype) if self.t2 is not None: - self.t2 = self.t2.to(device=device, dtype=dtype, non_blocking=non_blocking) + self.t2 = self.t2.to(device=device, dtype=dtype) class FullLayer(LoRALayerBase): @@ -319,15 +298,10 @@ class FullLayer(LoRALayerBase): model_size += self.weight.nelement() * self.weight.element_size() return model_size - def to( - self, - device: Optional[torch.device] = None, - dtype: Optional[torch.dtype] = None, - non_blocking: bool = False, - ) -> None: + def to(self, device: Optional[torch.device] = None, dtype: Optional[torch.dtype] = None) -> None: super().to(device=device, dtype=dtype) - self.weight = self.weight.to(device=device, dtype=dtype, non_blocking=non_blocking) + self.weight = self.weight.to(device=device, dtype=dtype) class IA3Layer(LoRALayerBase): @@ -359,16 +333,11 @@ class IA3Layer(LoRALayerBase): model_size += self.on_input.nelement() * self.on_input.element_size() return model_size - def to( - self, - device: Optional[torch.device] = None, - dtype: Optional[torch.dtype] = None, - non_blocking: bool = False, - ): + def to(self, device: Optional[torch.device] = None, dtype: Optional[torch.dtype] = None): super().to(device=device, dtype=dtype) - self.weight = self.weight.to(device=device, dtype=dtype, non_blocking=non_blocking) - self.on_input = self.on_input.to(device=device, dtype=dtype, non_blocking=non_blocking) + self.weight = self.weight.to(device=device, dtype=dtype) + self.on_input = self.on_input.to(device=device, dtype=dtype) AnyLoRALayer = Union[LoRALayer, LoHALayer, LoKRLayer, FullLayer, IA3Layer] @@ -390,15 +359,10 @@ class LoRAModelRaw(RawModel): # (torch.nn.Module): def name(self) -> str: return self._name - def to( - self, - device: Optional[torch.device] = None, - dtype: Optional[torch.dtype] = None, - non_blocking: bool = False, - ) -> None: + def to(self, device: Optional[torch.device] = None, dtype: Optional[torch.dtype] = None) -> None: # TODO: try revert if exception? for _key, layer in self.layers.items(): - layer.to(device=device, dtype=dtype, non_blocking=non_blocking) + layer.to(device=device, dtype=dtype) def calc_size(self) -> int: model_size = 0 @@ -521,7 +485,7 @@ class LoRAModelRaw(RawModel): # (torch.nn.Module): # lower memory consumption by removing already parsed layer values state_dict[layer_key].clear() - layer.to(device=device, dtype=dtype, non_blocking=TorchDevice.get_non_blocking(device)) + layer.to(device=device, dtype=dtype) model.layers[layer_key] = layer return model diff --git a/invokeai/backend/model_manager/load/model_cache/model_cache_default.py b/invokeai/backend/model_manager/load/model_cache/model_cache_default.py index 9027b7b5b7..e69201e739 100644 --- a/invokeai/backend/model_manager/load/model_cache/model_cache_default.py +++ b/invokeai/backend/model_manager/load/model_cache/model_cache_default.py @@ -289,11 +289,9 @@ class ModelCache(ModelCacheBase[AnyModel]): else: new_dict: Dict[str, torch.Tensor] = {} for k, v in cache_entry.state_dict.items(): - new_dict[k] = v.to( - target_device, copy=True, non_blocking=TorchDevice.get_non_blocking(target_device) - ) + new_dict[k] = v.to(target_device, copy=True) cache_entry.model.load_state_dict(new_dict, assign=True) - cache_entry.model.to(target_device, non_blocking=TorchDevice.get_non_blocking(target_device)) + cache_entry.model.to(target_device) cache_entry.device = target_device except Exception as e: # blow away cache entry self._delete_cache_entry(cache_entry) diff --git a/invokeai/backend/model_patcher.py b/invokeai/backend/model_patcher.py index 8c7a62c371..8b8aa6d5a5 100644 --- a/invokeai/backend/model_patcher.py +++ b/invokeai/backend/model_patcher.py @@ -139,15 +139,12 @@ class ModelPatcher: # We intentionally move to the target device first, then cast. Experimentally, this was found to # be significantly faster for 16-bit CPU tensors being moved to a CUDA device than doing the # same thing in a single call to '.to(...)'. - layer.to(device=device, non_blocking=TorchDevice.get_non_blocking(device)) - layer.to(dtype=torch.float32, non_blocking=TorchDevice.get_non_blocking(device)) + layer.to(device=device) + layer.to(dtype=torch.float32) # TODO(ryand): Using torch.autocast(...) over explicit casting may offer a speed benefit on CUDA # devices here. Experimentally, it was found to be very slow on CPU. More investigation needed. layer_weight = layer.get_weight(module.weight) * (lora_weight * layer_scale) - layer.to( - device=TorchDevice.CPU_DEVICE, - non_blocking=TorchDevice.get_non_blocking(TorchDevice.CPU_DEVICE), - ) + layer.to(device=TorchDevice.CPU_DEVICE) assert isinstance(layer_weight, torch.Tensor) # mypy thinks layer_weight is a float|Any ??! if module.weight.shape != layer_weight.shape: @@ -156,7 +153,7 @@ class ModelPatcher: layer_weight = layer_weight.reshape(module.weight.shape) assert isinstance(layer_weight, torch.Tensor) # mypy thinks layer_weight is a float|Any ??! - module.weight += layer_weight.to(dtype=dtype, non_blocking=TorchDevice.get_non_blocking(device)) + module.weight += layer_weight.to(dtype=dtype) yield # wait for context manager exit @@ -164,9 +161,7 @@ class ModelPatcher: assert hasattr(model, "get_submodule") # mypy not picking up fact that torch.nn.Module has get_submodule() with torch.no_grad(): for module_key, weight in original_weights.items(): - model.get_submodule(module_key).weight.copy_( - weight, non_blocking=TorchDevice.get_non_blocking(weight.device) - ) + model.get_submodule(module_key).weight.copy_(weight) @classmethod @contextmanager diff --git a/invokeai/backend/onnx/onnx_runtime.py b/invokeai/backend/onnx/onnx_runtime.py index d562a46dff..a8132d4b23 100644 --- a/invokeai/backend/onnx/onnx_runtime.py +++ b/invokeai/backend/onnx/onnx_runtime.py @@ -190,12 +190,7 @@ class IAIOnnxRuntimeModel(RawModel): return self.session.run(None, inputs) # compatability with RawModel ABC - def to( - self, - device: Optional[torch.device] = None, - dtype: Optional[torch.dtype] = None, - non_blocking: bool = False, - ) -> None: + def to(self, device: Optional[torch.device] = None, dtype: Optional[torch.dtype] = None) -> None: pass # compatability with diffusers load code diff --git a/invokeai/backend/raw_model.py b/invokeai/backend/raw_model.py index 7bca6945d9..931804c985 100644 --- a/invokeai/backend/raw_model.py +++ b/invokeai/backend/raw_model.py @@ -20,10 +20,5 @@ class RawModel(ABC): """Abstract base class for 'Raw' model wrappers.""" @abstractmethod - def to( - self, - device: Optional[torch.device] = None, - dtype: Optional[torch.dtype] = None, - non_blocking: bool = False, - ) -> None: + def to(self, device: Optional[torch.device] = None, dtype: Optional[torch.dtype] = None) -> None: pass diff --git a/invokeai/backend/textual_inversion.py b/invokeai/backend/textual_inversion.py index 483f2da88c..0345478b97 100644 --- a/invokeai/backend/textual_inversion.py +++ b/invokeai/backend/textual_inversion.py @@ -65,17 +65,12 @@ class TextualInversionModelRaw(RawModel): return result - def to( - self, - device: Optional[torch.device] = None, - dtype: Optional[torch.dtype] = None, - non_blocking: bool = False, - ) -> None: + def to(self, device: Optional[torch.device] = None, dtype: Optional[torch.dtype] = None) -> None: if not torch.cuda.is_available(): return for emb in [self.embedding, self.embedding_2]: if emb is not None: - emb.to(device=device, dtype=dtype, non_blocking=non_blocking) + emb.to(device=device, dtype=dtype) def calc_size(self) -> int: """Get the size of this model in bytes.""" diff --git a/invokeai/backend/util/devices.py b/invokeai/backend/util/devices.py index 1cba70c662..83ce055024 100644 --- a/invokeai/backend/util/devices.py +++ b/invokeai/backend/util/devices.py @@ -112,15 +112,3 @@ class TorchDevice: @classmethod def _to_dtype(cls, precision_name: TorchPrecisionNames) -> torch.dtype: return NAME_TO_PRECISION[precision_name] - - @staticmethod - def get_non_blocking(to_device: torch.device) -> bool: - """Return the non_blocking flag to be used when moving a tensor to a given device. - MPS may have unexpected errors with non-blocking operations - we should not use non-blocking when moving _to_ MPS. - When moving _from_ MPS, we can use non-blocking operations. - - See: - - https://github.com/pytorch/pytorch/issues/107455 - - https://discuss.pytorch.org/t/should-we-set-non-blocking-to-true/38234/28 - """ - return False if to_device.type == "mps" else True From 7905a46ca4001ebd748b91aea0ba04a790250ed5 Mon Sep 17 00:00:00 2001 From: psychedelicious <4822129+psychedelicious@users.noreply.github.com> Date: Tue, 16 Jul 2024 07:13:56 +1000 Subject: [PATCH 48/48] chore: bump version to 4.2.6post1 --- invokeai/version/invokeai_version.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/invokeai/version/invokeai_version.py b/invokeai/version/invokeai_version.py index 1eecfc4998..09545bce26 100644 --- a/invokeai/version/invokeai_version.py +++ b/invokeai/version/invokeai_version.py @@ -1 +1 @@ -__version__ = "4.2.6" +__version__ = "4.2.6post1"