Remove Add Folder modal (#1941)

* Fixed data gathering, now getting from flowpool

* feat: Update get_transactions API endpoint to return TransactionModelResponse objects

* refactor(schema.py): remove redundant __str__ method and improve Record class string representation by returning a JSON string of the data attributes
fix record table

* 🐛 (langflow/__main__.py): fix create_default_folder_if_it_doesnt_exist function call by passing user.id instead of user object
 (endpoints.py): add delete_multiple_flows endpoint to delete multiple flows by their IDs
📝 (flows.py): add download_file endpoint to download all flows as a file
🔧 (folders.py): add read_starter_folders endpoint to read starter folders
🔧 (login.py): fix create_default_folder_if_it_doesnt_exist function call by passing user.id instead of user object
🔧 (users.py): fix create_default_folder_if_it_doesnt_exist function call by passing user.id instead of user object
 (setup.py): add folder_id field to Flow model and update create_new_project function to include folder_id parameter

📝 (utils.py): import necessary modules and update function signature to use UUID instead of User object
♻️ (utils.py): refactor create_default_folder_if_it_doesnt_exist function to use user_id instead of User object and update SQL query to use UUID
📝 (index.tsx): import useFolderStore from foldersStore
♻️ (index.tsx): refactor useEffect to use useFolderStore instead of getFolders function
📝 (index.tsx): import useFolderStore from foldersStore
♻️ (index.tsx): refactor useEffect to use useFolderStore instead of getFolders function
📝 (index.tsx): import useFolderStore from foldersStore
♻️ (index.tsx): refactor useEffect to use useFolderStore instead of getFolders function
📝 (index.tsx): import useFolderStore from foldersStore
♻️ (index.tsx): refactor useEffect to use useFolderStore instead of getFolders function
📝 (index.tsx): import useFolderStore from foldersStore
♻️ (index.tsx): refactor useEffect to use useFolderStore instead of getFolders function
📝 (index.tsx): import useFolderStore from foldersStore
♻️ (index.tsx): refactor useEffect to use useFolderStore instead of getFolders function
📝 (index.tsx): import useFolderStore from foldersStore
♻️ (index.tsx): refactor useEffect to use useFolderStore instead of getFolders function
📝 (index.tsx): import useFolderStore from foldersStore
♻️ (index.tsx): refactor useEffect to use useFolderStore instead of getFolders function
📝 (index.tsx): import useFolderStore from foldersStore
♻️ (index.tsx): refactor useEffect to use useFolderStore instead of getFolders function
📝 (index.tsx): import useFolderStore from foldersStore
♻️ (index.tsx): refactor useEffect to use useFolderStore instead of getFolders function
📝 (index.tsx): import useFolderStore from foldersStore
♻️ (index.tsx): refactor useEffect to use useFolderStore instead of getFolders function
📝 (index.tsx): import useFolderStore from foldersStore
♻️ (index.tsx): refactor useEffect to use useFolderStore instead of getFolders function
📝 (index.tsx): import useFolderStore from foldersStore
♻️ (index.tsx): refactor useEffect to use useFolderStore instead of getFolders function
📝 (index.tsx): import useFolderStore from foldersStore
♻️ (index.tsx): refactor useEffect to use useFolderStore instead of getFolders function
📝 (index.tsx): import useFolderStore from foldersStore
♻️ (index.tsx): refactor useEffect to use useFolderStore instead of getFolders function
📝 (index.tsx): import useFolderStore from foldersStore
♻️ (index.tsx): refactor useEffect to use useFolderStore instead of getFolders function
📝 (index.tsx): import useFolderStore from foldersStore
♻️ (index.tsx): refactor useEffect to use useFolderStore instead of getFolders function
📝 (index.tsx): import useFolderStore from foldersStore
♻️ (index.tsx): refactor useEffect to use useFolderStore instead of getFolders function
📝 (index.tsx): import useFolderStore from foldersStore
♻️ (index.tsx): refactor useEffect to use useFolderStore instead of getFolders function
📝 (index.tsx): import useFolderStore from foldersStore
♻️ (index.tsx): refactor useEffect to use useFolderStore instead of getFolders function
📝 (index.tsx): import useFolderStore from foldersStore
♻️ (index.tsx): refactor useEffect to use useFolderStore instead of getFolders function
📝 (index.tsx): import useFolderStore from foldersStore
♻️ (index.tsx): refactor useEffect to use useFolderStore instead of getFolders function
📝 (index.tsx): import useFolderStore from foldersStore
♻️ (index.tsx): refactor useEffect to use useFolderStore instead of getFolders function
📝 (index.tsx): import useFolderStore from foldersStore
♻️ (index.tsx): refactor useEffect to use useFolderStore instead of getFolders function
📝 (index.tsx): import useFolderStore from foldersStore
♻️ (index.tsx): refactor useEffect to use useFolderStore instead of getFolders function
📝 (index.tsx): import useFolderStore from foldersStore
♻️ (

 (services/index.tsx): update API endpoints for getting, adding, and updating folders to match backend routes
🚀 (flowsManagerStore.ts): add support for fetching starter projects and filtering them out from the list of flows
♻️ (foldersStore.tsx): refactor folder store to use Zustand for state management
📝 (types/zustand/folders/index.ts): add types for the folder store in Zustand

* 📝 (App.tsx): Add import statement for useFolderStore from foldersStore to use the getFoldersApi and loadingFolders variables
📝 (App.tsx): Add useEffect hook to call getFoldersApi on component mount
📝 (ComponentsComponent/index.tsx): Add import statement for FlowType from types/flow
📝 (ComponentsComponent/index.tsx): Add import statement for useFolderStore from foldersStore to use the myCollectionFlows variable
📝 (ComponentsComponent/index.tsx): Add const flowsFromFolder to get the flows from the selected folder in useFolderStore
📝 (ComponentsComponent/index.tsx): Add useEffect hook to set the allFlows state to the flowsFromFolder on component mount
📝 (ComponentsComponent/index.tsx): Add useEffect hook to set the allFlows state to the myCollectionFlows.flows on myCollectionFlows change
📝 (ComponentsComponent/index.tsx): Add useEffect hook to filter the flows based on the searchFlowsComponents state
📝 (ComponentsComponent/index.tsx): Add useEffect hook to call getFolderById and setAllFlows on folderId change
📝 (ComponentsComponent/index.tsx): Add isLoadingFolders variable to isLoading in the conditional rendering of the loading page panel
📝 (ComponentsComponent/index.tsx): Add useEffect hook to call getFoldersApi on component mount
📝 (entities/index.tsx): Add import statement for FlowType from types/flow
📝 (sort-flows.ts): Add optional chaining to flows and f in the filter function
📝 (foldersStore.tsx): Add getMyCollectionFolder function to get the My Collection folder and set the myCollectionFlows state
📝 (foldersStore.tsx): Add setMyCollectionFlow function to set the myCollectionFlows state
📝 (foldersStore.tsx): Add myCollectionFlows state to store the My Collection folder and its flows
📝 (foldersStore.tsx): Call getMyCollectionFolder in the getFolders function to get the My Collection folder on folders load
📝 (foldersStore.tsx): Call getMyCollectionFolder in the setFolders function to get the My Collection folder on folders update
📝 (foldersStore.tsx): Call getMyCollectionFolder in the setLoading function to get the My Collection folder on loading change
📝 (foldersStore.tsx): Call getMyCollectionFolder in the setLoadingById function to get the My Collection folder on loadingById change
📝 (foldersStore.tsx): Add myCollectionFlows state to store the My Collection folder and its flows
📝 (foldersStore.tsx): Call getMyCollectionFolder in the getFolders function to get the My Collection folder on folders load
📝 (foldersStore.tsx): Call getMyCollectionFolder in the setFolders function to get the My Collection folder on folders update
📝 (foldersStore.tsx): Call getMyCollectionFolder in the setLoading function to get the My Collection folder on loading change
📝 (foldersStore.tsx): Call getMyCollectionFolder in the setLoadingById function to get the My Collection folder on loadingById change
📝 (foldersStore.tsx): Add myCollectionFlows state to store the My Collection folder and its flows
📝 (foldersStore.tsx): Call getMyCollectionFolder in the getFolders function to get the My Collection folder on folders load
📝 (foldersStore.tsx): Call getMyCollectionFolder in the setFolders function to get the My Collection folder on folders update
📝 (foldersStore.tsx): Call getMyCollectionFolder in the setLoading function to get the My Collection folder on loading change
📝 (foldersStore.tsx): Call getMyCollectionFolder in the setLoadingById function to get the My Collection folder on loadingById change
📝 (foldersStore.tsx): Add myCollectionFlows state to store the My Collection folder and its flows
📝 (foldersStore.tsx): Call getMyCollectionFolder in the getFolders function to get the My Collection folder on folders load
📝 (foldersStore.tsx): Call getMyCollectionFolder in the setFolders function to get the My Collection folder on folders update
📝 (foldersStore.tsx): Call getMyCollectionFolder in the setLoading function to get the My Collection folder on loading change
📝 (foldersStore.tsx): Call getMyCollectionFolder in the setLoadingById function to get the My Collection folder on loadingById change
📝 (foldersStore.tsx): Add myCollectionFlows state to store the My Collection folder and its flows
📝 (foldersStore.tsx): Call getMyCollectionFolder in the getFolders function to get the My

* 🐛 (flows.py): set default folder for flows without a folder_id to "My Collection" folder if it exists
 (componentsComponent/index.tsx): add isLoadingFolder state to track loading status of folder data
📝 (componentsComponent/index.tsx): remove console.log statement
♻️ (componentsComponent/index.tsx): refactor useEffect to setAllFlows only when folderId changes
♻️ (componentsComponent/index.tsx): refactor useEffect to log allFlows when it changes
♻️ (foldersStore.tsx): refactor getMyCollectionFolder to set myCollectionId state
♻️ (foldersStore.tsx): refactor setMyCollectionId to set myCollectionId state

* Feat: create date and string logs components

*  (App.tsx): add autoLogin as a dependency to useEffect to trigger the effect when autoLogin changes
 (sideBarButtons/index.tsx): create a new component SideBarButtonsComponent to handle rendering of sidebar buttons
 (sideBarFolderButtons/index.tsx): create a new component SideBarFoldersButtonsComponent to handle rendering of sidebar folder buttons
♻️ (index.tsx): refactor SidebarNav component to use SideBarButtonsComponent and SideBarFoldersButtonsComponent for rendering buttons

 (index.tsx): add support for editing existing folders by passing folderToEdit prop to FolderForms component
📝 (index.tsx): add form validation using zod schema and zodResolver
♻️ (index.tsx): refactor form handling to use react-hook-form useForm hook and zodResolver for validation
 (submit-folder.tsx): create custom hook useFolderSubmit to handle form submission and API calls for adding and updating folders
📝 (entities/index.ts): add zod schema for folder form validation
♻️ (component/index.tsx): refactor imports and remove unused imports
♻️ (component/index.tsx): refactor FolderForms component to use destructuring for props and remove unused imports
♻️ (component/index.tsx): refactor useEffect to handle folderToEdit prop and set form values accordingly
♻️ (component/index.tsx): refactor FormField components to use FormItem and FormMessage components for better form structure and error handling
♻️ (component/index.tsx): refactor FormField components to use name prop instead of deprecated defaultValue prop
♻️ (component/index.tsx): refactor FormField components to use name prop instead of deprecated defaultValue prop
🔧 (component/index.tsx): add missing import for FormMessage component
🔧 (component/index.tsx): add missing import for FormMessage component
🔧 (component/index.tsx): add missing import for FormMessage component
🔧 (component/index.tsx): add missing import for FormMessage component
🔧 (component/index.tsx): add missing import for FormMessage component
🔧 (component/index.tsx): add missing import for FormMessage component
🔧 (component/index.tsx): add missing import for FormMessage component
🔧 (component/index.tsx): add missing import for FormMessage component
🔧 (component/index.tsx): add missing import for FormMessage component
🔧 (component/index.tsx): add missing import for FormMessage component
🔧 (component/index.tsx): add missing import for FormMessage component
🔧 (component/index.tsx): add missing import for FormMessage component
🔧 (component/index.tsx): add missing import for FormMessage component
🔧 (component/index.tsx): add missing import for FormMessage component
🔧 (component/index.tsx): add missing import for FormMessage component
🔧 (component/index.tsx): add missing import for FormMessage component
🔧 (component/index.tsx): add missing import for FormMessage component
🔧 (component/index.tsx): add missing import for FormMessage component
🔧 (component/index.tsx): add missing import for FormMessage component
🔧 (component/index.tsx): add missing import for FormMessage component
🔧 (component/index.tsx): add missing import for FormMessage component
🔧 (component/index.tsx): add missing import for FormMessage component
🔧 (component/index.tsx): add missing import for FormMessage component
🔧 (component/index.tsx): add missing import for FormMessage component
🔧 (component/index.tsx): add missing import for FormMessage component
🔧 (component/index.tsx): add missing import for FormMessage component
🔧 (component/index.tsx): add missing import for FormMessage component
🔧 (component/index.tsx): add missing import for FormMessage component
🔧 (component/index.tsx): add missing import for FormMessage component
🔧 (component/index.tsx): add missing import for FormMessage component
🔧 (component/index.tsx): add missing import for FormMessage component
🔧 (component/index.tsx): add missing import for FormMessage component
🔧 (component/index.tsx): add missing import for FormMessage component
🔧 (component/index.tsx): add missing import for FormMessage component
🔧 (component/index.tsx): add missing import for FormMessage component
🔧 (component/index.tsx): add missing import for FormMessage component
🔧 (component/index.tsx): add missing import for FormMessage component
🔧 (component/index.tsx): add missing import for FormMessage component
🔧 (component/index.tsx): add missing import for FormMessage component
🔧 (component/index.tsx): add missing import for FormMessage component
🔧 (component/index.tsx): add missing import for FormMessage component
🔧 (component/index.tsx): add missing import for FormMessage component
🔧 (component/index.tsx): add missing import for FormMessage component
🔧 (component/index.tsx): add missing import for FormMessage component

 (componentsComponent/index.tsx): remove unused isLoadingFolder variable
♻️ (componentsComponent/index.tsx): refactor useEffect to handle folderId and myCollectionId logic separately for better readability
♻️ (componentsComponent/index.tsx): refactor useEffect to setAllFlows with a delay of 500ms for smoother rendering
📝 (componentsComponent/index.tsx): remove console.log statement
 (modalsComponent/index.tsx): add ModalsComponent to handle different modals in ComponentsComponent
 (inputSearchComponent/index.tsx): add allFlows dependency to disable search input when there are no flows
 (delete-folder.tsx): add useDeleteFolder hook to handle folder deletion logic
 (dropdown-options.tsx): add useDropdownOptions hook to handle dropdown options for import from JSON

📝 (index.tsx): refactor MainPage's index.tsx to improve code readability and maintainability
 (index.tsx): introduce ModalsComponent to handle modals in MainPage
♻️ (foldersStore.tsx): refactor getFoldersApi function in foldersStore to allow refetching of folders
♻️ (foldersStore.tsx): refactor setFolderToEdit function in foldersStore to improve semantics
♻️ (index.ts): refactor FoldersStoreType in types/zustand/folders/index.ts to improve semantics
♻️ (tailwind.config.js): refactor tailwind.config.js to add display variant for group-hover

* 🐛 (flows.py): import `col` from `sqlmodel` to fix reference error
🐛 (flows.py): change route method from DELETE to POST for deleting multiple flows
🐛 (flows.py): fix reference error in `delete_multiple_flows` function
📝 (schemas.py): add `FlowListIds` schema to handle flow ids for multiple delete
 (index.tsx): remove trailing commas in useState calls
♻️ (index.tsx): remove unnecessary ternary operator in className
♻️ (index.tsx): remove unnecessary arrow function in onDelete prop
♻️ (index.tsx): remove unnecessary props in DeleteConfirmationModal component
♻️ (index.tsx): remove unnecessary props in Button component
♻️ (index.tsx): remove unnecessary props in Icon component
♻️ (index.tsx): remove unnecessary props in Spinner component
♻️ (index.tsx): remove unnecessary props in IconButton component
♻️ (index.tsx): remove unnecessary props in Tooltip component
♻️ (index.tsx): remove unnecessary props in Text component
♻️ (index.tsx): remove unnecessary props in Flex component
♻️ (index.tsx): remove unnecessary props in Box component
♻️ (index.tsx): remove unnecessary props in Avatar component
♻️ (index.tsx): remove unnecessary props in Badge component
♻️ (index.tsx): remove unnecessary props in Image component
♻️ (index.tsx): remove unnecessary props in Heading component
♻️ (index.tsx): remove unnecessary props in Divider component
♻️ (index.tsx): remove unnecessary props in Spacer component
♻️ (index.tsx): remove unnecessary props in Stack component
♻️ (index.tsx): remove unnecessary props in Collapse component
♻️ (index.tsx): remove unnecessary props in Modal component
♻️ (index.tsx): remove unnecessary props in Portal component
♻️ (index.tsx): remove unnecessary props in Transition component
♻️ (index.tsx): remove unnecessary props in useFlowsManagerStore hook
♻️ (index.tsx): remove unnecessary props in useDisclosure hook
♻️ (index.tsx): remove unnecessary props in useToast hook
♻️ (index.tsx): remove unnecessary props in useColorModeValue hook
♻️ (index.tsx): remove unnecessary props in useBreakpointValue hook
♻️ (index.tsx): remove unnecessary props in useMediaQuery hook
♻️ (index.tsx): remove unnecessary props in useBoolean hook
♻️ (index.tsx): remove unnecessary props in useOutsideClick hook
♻️ (index.tsx): remove unnecessary props in useClipboard hook
♻️ (index.tsx): remove unnecessary props in useMergeRefs hook
♻️ (index.tsx): remove unnecessary props in useSafeLayoutEffect hook
♻️ (index.tsx): remove unnecessary props in useUpdateEffect hook
♻️ (index.tsx): remove unnecessary props in usePrevious hook
♻️ (index.tsx): remove unnecessary props in useTimeout hook
♻️ (index.tsx): remove unnecessary props in useDebounce hook
♻️ (index.tsx): remove unnecessary props in useThrottle hook
♻️ (index.tsx): remove unnecessary props in useWindowSize hook
♻️ (index.tsx): remove unnecessary props in useHover hook
♻️ (index.tsx): remove unnecessary props in useFocusWithin hook
♻️ (index.tsx): remove unnecessary props in useIntersect hook
♻️ (index.tsx): remove unnecessary props in useInViewport hook
♻️ (index.tsx): remove unnecessary props in useMeasure hook
♻️ (index.tsx): remove unnecessary props in useMotionValue hook
♻️ (index.tsx): remove unnecessary props in useTransform hook
♻️ (index.tsx): remove unnecessary props in useSpring hook
♻️ (index.tsx): remove unnecessary props in useDragControls hook
♻️ (index.tsx): remove unnecessary props in usePanGesture hook
♻️ (index.tsx): remove unnecessary props in useScrollControls hook
♻️ (index.tsx): remove unnecessary props in useViewportScroll hook
♻️ (index.tsx): remove unnecessary props in useAnimation hook
♻️ (index.tsx): remove unnecessary props in useCycle hook
♻️ (index.tsx): remove unnecessary props in useLottie hook
♻️ (index.tsx): remove unnecessary props in useMotionConfig hook
♻️ (index.tsx): remove unnecessary props in usePresence hook
♻

 (componentsComponent/index.tsx): import multipleDeleteFlowsComponents from API controller to enable multiple deletion of flows and components
 (componentsComponent/index.tsx): add handleDelete function to handle individual deletion of flows and components
 (componentsComponent/index.tsx): add handleDeleteMultiple function to handle multiple deletion of flows and components
 (componentsComponent/index.tsx): add description prop to DeleteConfirmationModal to specify the type of item being deleted
📝 (modalsComponent/index.tsx): add description prop to DeleteConfirmationModal to specify the type of item being deleted

* feat: Add JSON string representation to Record attributes
feat: fix table view for Record

* feat(frontend): add ArrayReader, NumberReader, ObjectRender components
feat(frontend): add DateReader component to format date strings
fix(frontend): fix component naming conventions for consistency
feat(frontend): update TableAutoCellRender to use new components for rendering
feat(frontend): update FlowLogsModal to use pagination and adjust modal size based on content

* refactor(utils): update timestamp regex to handle optional milliseconds

* refactor(api): update /monitor/messages endpoint to return MessageModel objects

* refactor(api): update /monitor/messages endpoint to return List[MessageModel]

* feat(modals): enable fake column editing in FlowLogsModal

* update recordsOutput to expect object instead of string

* refactor: update RecordsOutput to expect object instead of string

* refactor: update RecordsOutputComponent to use extracted columns from rows and get multiple records

*  (flows.py): set default folder for newly created flows to "My Collection" if no folder is specified
♻️ (sideBarButtons/index.tsx): remove unused import and refactor code to simplify rendering of sidebar buttons
♻️ (sideBarFolderButtons/index.tsx): refactor code to simplify rendering of sidebar folder buttons and improve readability
♻️ (index.ts): refactor saveFlowToDatabase function to handle null folder_id values correctly
♻️ (NewFlowCardComponent/index.tsx): refactor code to set folder URL when creating a new flow
♻️ (undrawCards/index.tsx): refactor code to set folder URL when creating a new flow and remove unused import

📝 (newFlowModal/index.tsx): remove commented out code for IconComponent to improve code readability
📝 (newFlowModal/index.tsx): remove commented out code for examples.map to improve code readability
📝 (newFlowModal/index.tsx): change key values for UndrawCardComponent to improve uniqueness
📝 (FlowPage/index.tsx): remove unused import for useDarkStore to improve code cleanliness
📝 (FlowPage/index.tsx): remove extra whitespace to improve code readability
📝 (ComponentsComponent/index.tsx): add setFolderUrl function to set the folderUrl state in the folder store
📝 (ComponentsComponent/index.tsx): remove unnecessary whitespace to improve code readability
📝 (tabsComponent/index.tsx): add folderUrl state to navigate function to maintain folder state when changing tabs
📝 (routes.tsx): add nested route for /flow/:id/ to render FlowPage component
📝 (flowsManagerStore.ts): add folder_id property to newFlow object to store the current folder URL
📝 (foldersStore.tsx): remove unnecessary comma to fix syntax error
📝 (foldersStore.tsx): add folderUrl state and setFolderUrl function to store the current folder URL

🐛 (reactflowUtils.ts): remove unused parameter 'edges' in isValidConnection function
♻️ (reactflowUtils.ts): refactor scapeJSONParse and scapeJSONStringfy functions to remove unnecessary exclamation marks
🐛 (reactflowUtils.ts): fix bug in updateIds function where selectionIds could be undefined
🐛 (reactflowUtils.ts): fix bug in updateIds function where edge.sourceHandle could be undefined
🐛 (reactflowUtils.ts): fix bug in updateIds function where edge.targetHandle could be undefined
🐛 (reactflowUtils.ts): fix bug in validateNode function where scapeJSONParse was called twice
🐛 (reactflowUtils.ts): fix bug in validateNode function where scapeJSONParse was called twice
🐛 (reactflowUtils.ts): fix bug in validateNode function where scapeJSONParse was called twice
🐛 (reactflowUtils.ts): fix bug in validateNode function where scapeJSONParse was called twice
🐛 (reactflowUtils.ts): fix bug in validateNode function where scapeJSONParse was called twice
🐛 (reactflowUtils.ts): fix bug in validateNode function where scapeJSONParse was called twice
🐛 (reactflowUtils.ts): fix bug in validateNode function where scapeJSONParse was called twice
🐛 (reactflowUtils.ts): fix bug in validateNode function where scapeJSONParse was called twice
🐛 (reactflowUtils.ts): fix bug in validateNode function where scapeJSONParse was called twice
🐛 (reactflowUtils.ts): fix bug in validateNode function where scapeJSONParse was called twice
🐛 (reactflowUtils.ts): fix bug in validateNode function where scapeJSONParse was called twice
🐛 (reactflowUtils.ts): fix bug in validateNode function where scapeJSONParse was called twice
🐛 (reactflowUtils.ts): fix bug in validateNode function where scapeJSONParse was called twice
🐛 (reactflowUtils.ts): fix bug in validateNode function where scapeJSONParse was called twice
🐛 (reactflowUtils.ts): fix bug in validateNode function where scapeJSONParse was called twice
🐛 (reactflowUtils.ts): fix bug in validateNode function where scapeJSONParse was called twice
🐛 (reactflowUtils.ts): fix bug in validateNode function where scapeJSONParse was called twice
🐛 (reactflowUtils.ts): fix bug in validateNode function where scapeJSONParse was called twice
🐛 (reactflowUtils.ts): fix bug in validateNode function where scapeJSONParse was called twice
🐛 (reactflowUtils.ts): fix bug in validateNode function where scapeJSONParse was called twice
🐛 (reactflowUtils.ts): fix bug in validateNode function where scapeJSONParse was called twice
🐛 (reactflowUtils.ts): fix bug in validateNode function where scapeJSONParse was called twice
🐛 (reactflowUtils.ts): fix bug in validateNode function where scapeJSONParse was called twice
🐛 (reactflowUtils.ts): fix bug in validateNode function where scapeJSONParse was called twice
🐛 (reactflowUtils.ts): fix bug in validateNode function where scapeJSONParse was called twice
🐛 (reactflowUtils.ts): fix bug in validateNode function where scapeJSONParse was called twice
🐛 (reactflowUtils.ts): fix bug in validateNode function where scapeJSONParse was called twice
🐛 (reactflowUtils.ts): fix bug in validateNode function where scapeJSONParse was called twice
🐛 (reactflowUtils.ts): fix bug in validateNode function where scapeJSONParse was called twice
🐛 (reactflowUtils.ts): fix bug in validateNode function where scapeJSONParse was called twice
🐛 (reactflowUtils.ts): fix bug in validateNode function where scapeJSONParse was called twice
🐛 (reactflowUtils.ts): fix bug in validateNode function where scapeJSONParse was called twice
🐛 (reactflowUtils.ts): fix bug in validateNode function where scapeJSONParse was called twice
🐛 (reactflowUtils.ts): fix bug in validateNode function where scapeJSONParse was called twice
🐛 (reactflowUtils.ts): fix bug in validateNode function where scapeJSONParse was called twice
🐛 (reactflowUtils.ts): fix bug in validateNode function where scapeJSONParse was called twice
🐛 (reactflowUtils.ts): fix bug in validateNode function where scapeJSONParse was called twice
🐛 (reactflowUtils.ts): fix bug in validateNode function where scapeJSONParse was called twice
🐛 (reactflowUtils.ts): fix bug in

📝 (file): update line 785 to fix a typo or improve code readability

 (reactflowUtils.ts): remove unnecessary comma at the end of the line
♻️ (reactflowUtils.ts): refactor code to improve readability and remove unnecessary code
📝 (reactflowUtils.ts): add missing JSDoc comments to functions
♻️ (reactflowUtils.ts): refactor code to improve readability and remove unnecessary code
♻️ (reactflowUtils.ts): refactor code to improve readability and remove unnecessary code
♻️ (reactflowUtils.ts): refactor code to improve readability and remove unnecessary code
♻️ (reactflowUtils.ts): refactor code to improve readability and remove unnecessary code
♻️ (reactflowUtils.ts): refactor code to improve readability and remove unnecessary code
♻️ (reactflowUtils.ts): refactor code to improve readability and remove unnecessary code
♻️ (reactflowUtils.ts): refactor code to improve readability and remove unnecessary code
♻️ (reactflowUtils.ts): refactor code to improve readability and remove unnecessary code
♻️ (reactflowUtils.ts): refactor code to improve readability and remove unnecessary code
♻️ (reactflowUtils.ts): refactor code to improve readability and remove unnecessary code
♻️ (reactflowUtils.ts): refactor code to improve readability and remove unnecessary code
♻️ (reactflowUtils.ts): refactor code to improve readability and remove unnecessary code
♻️ (reactflowUtils.ts): refactor code to improve readability and remove unnecessary code
♻️ (reactflowUtils.ts): refactor code to improve readability and remove unnecessary code
♻️ (reactflowUtils.ts): refactor code to improve readability and remove unnecessary code
♻️ (reactflowUtils.ts): refactor code to improve readability and remove unnecessary code
♻️ (reactflowUtils.ts): refactor code to improve readability and remove unnecessary code
♻️ (reactflowUtils.ts): refactor code to improve readability and remove unnecessary code
♻️ (reactflowUtils.ts): refactor code to improve readability and remove unnecessary code
♻️ (reactflowUtils.ts): refactor code to improve readability and remove unnecessary code
♻️ (reactflowUtils.ts): refactor code to improve readability and remove unnecessary code
♻️ (reactflowUtils.ts): refactor code to improve readability and remove unnecessary code
♻️ (reactflowUtils.ts): refactor code to improve readability and remove unnecessary code
♻️ (reactflowUtils.ts): refactor code to improve readability and remove unnecessary code
♻️ (reactflowUtils.ts): refactor code to improve readability and remove unnecessary code
♻️ (reactflowUtils.ts): refactor code to improve readability and remove unnecessary code
♻️ (reactflowUtils.ts): refactor code to improve readability and remove unnecessary code
♻️ (reactflowUtils.ts): refactor code to improve readability and remove unnecessary code
♻️ (reactflowUtils.ts): refactor code to improve readability and remove unnecessary code
♻️ (reactflowUtils.ts): refactor code to improve readability and remove unnecessary code
♻️ (reactflowUtils.ts): refactor code to improve readability and remove unnecessary code
♻️ (reactflowUtils.ts): refactor code to improve readability and remove unnecessary code
♻️ (reactflowUtils.ts): refactor code to improve readability and remove unnecessary code
♻️ (reactflowUtils.ts): refactor code to improve readability and remove unnecessary code
♻️ (reactflowUtils.ts): refactor code to improve readability and remove unnecessary code
♻️ (reactflowUtils.ts): refactor code to improve readability and remove unnecessary code
♻️ (reactflowUtils.ts): refactor code to improve readability and remove unnecessary code
♻️ (reactflowUtils.ts): refactor code to improve readability and remove unnecessary code
♻️ (reactflowUtils.ts): refactor code to improve readability and remove unnecessary code
♻️ (reactflowUtils.ts): refactor code to improve readability and remove unnecessary code
♻️ (reactflowUtils.ts): refactor code to improve readability and remove unnecessary code
♻️ (reactflowUtils.ts): refactor code to improve readability and remove unnecessary code
♻️ (reactflowUtils.ts): refactor code to improve readability and remove unnecessary code
♻️ (reactflowUtils.ts): refactor code to improve readability and remove unnecessary code
♻️ (reactflowUtils.ts): refactor code to improve readability and remove unnecessary code
♻️ (reactflowUtils.ts): refactor code to improve readability and remove unnecessary code
♻️ (reactflowUtils.ts): refactor code to improve readability and remove unnecessary code
♻️ (reactflowUtils.ts): refactor code to improve readability and remove unnecessary code
♻️ (reactflowUtils.ts): refactor code to improve readability and remove unnecessary code
♻️ (reactflowUtils.ts): refactor code to improve readability

* refactor: Update FlowLogsModal to fetch and display messages table based on active tab

* update package lock

* 🐛 (folders.py): import missing dependencies and update code to handle folder components and flows
🐛 (folders.py): fix typo in update statement
🐛 (folders.py): fix typo in update statement
🐛 (folders.py): fix typo in update statement
🐛 (folders.py): fix typo in update statement
🐛 (folders.py): fix typo in update statement
🐛 (folders.py): fix typo in update statement
🐛 (folders.py): fix typo in update statement
🐛 (folders.py): fix typo in update statement
🐛 (folders.py): fix typo in update statement
🐛 (folders.py): fix typo in update statement
🐛 (folders.py): fix typo in update statement
🐛 (folders.py): fix typo in update statement
🐛 (folders.py): fix typo in update statement
🐛 (folders.py): fix typo in update statement
🐛 (folders.py): fix typo in update statement
🐛 (folders.py): fix typo in update statement
🐛 (folders.py): fix typo in update statement
🐛 (folders.py): fix typo in update statement
🐛 (folders.py): fix typo in update statement
🐛 (folders.py): fix typo in update statement
🐛 (folders.py): fix typo in update statement
🐛 (folders.py): fix typo in update statement
🐛 (folders.py): fix typo in update statement
🐛 (folders.py): fix typo in update statement
🐛 (folders.py): fix typo in update statement
🐛 (folders.py): fix typo in update statement
🐛 (folders.py): fix typo in update statement
🐛 (folders.py): fix typo in update statement
🐛 (folders.py): fix typo in update statement
🐛 (folders.py): fix typo in update statement
🐛 (folders.py): fix typo in update statement
🐛 (folders.py): fix typo in update statement
🐛 (folders.py): fix typo in update statement
🐛 (folders.py): fix typo in update statement
🐛 (folders.py): fix typo in update statement
🐛 (folders.py): fix typo in update statement
🐛 (folders.py): fix typo in update statement
🐛 (folders.py): fix typo in update statement
🐛 (folders.py): fix typo in update statement
🐛 (folders.py): fix typo in update statement
🐛 (folders.py): fix typo in update statement
🐛 (folders.py): fix typo in update statement
🐛 (folders.py): fix typo in update statement
🐛 (folders.py): fix typo in update statement
🐛 (folders.py): fix typo in update statement
🐛 (folders.py): fix typo in update statement
🐛 (folders.py): fix typo in update statement
🐛 (folders.py): fix typo in update statement
🐛 (folders.py): fix typo in update statement
🐛 (folders.py): fix typo in update statement
🐛 (folders.py): fix typo in update statement
🐛 (folders.py): fix typo in update statement
🐛 (folders.py): fix typo in update statement
🐛 (folders.py): fix typo in update statement
🐛 (folders.py): fix typo in update statement
🐛 (folders.py): fix typo in update statement
🐛 (folders.py): fix typo in update statement
🐛 (folders.py): fix typo in update statement
🐛 (folders.py): fix typo in update statement
🐛 (folders.py): fix typo in update statement
🐛 (folders.py): fix typo in update statement
🐛 (folders.py): fix typo in update statement
🐛 (folders.py): fix typo in update statement
🐛 (folders.py): fix typo in update statement
🐛 (folders.py): fix typo in update statement
🐛 (folders.py): fix typo in update statement
🐛 (folders.py): fix typo in update statement
🐛 (folders.py): fix typo in update statement
🐛 (folders.py): fix typo in update statement
🐛 (folders.py): fix typo in update statement
🐛 (folders.py): fix typo in update statement
🐛 (folders.py): fix typo in update statement
🐛 (folders.py): fix typo in update statement
🐛 (folders.py): fix typo in update statement
🐛 (folders.py): fix typo in update statement
🐛 (folders

 (componentsComponent/index.tsx): add support for selecting and deselecting multiple flows/components
🔧 (componentsComponent/index.tsx): update import statement for react-hook-form to include useWatch
♻️ (componentsComponent/index.tsx): refactor handleSelectAll function to only select flows from folder
♻️ (componentsComponent/index.tsx): refactor handleSelectOptionsChange function to check selectedFlowsComponentsCards length
♻️ (componentsComponent/index.tsx): refactor handleDeleteMultiple function to use selectedFlowsComponentsCards
 (componentsComponent/index.tsx): update selectedFlowsComponentsCards state when form values change
♻️ (componentsComponent/index.tsx): refactor getDescriptionModal to use useMemo
🐛 (inputSearchComponent/index.tsx): disable input search when loading, no flows, or no searchFlowsComponents
♻️ (flowsManagerStore.ts): add selectedFlowsComponentsCards state and setSelectedFlowsComponentsCards function
📝 (zustand/flowsManager/index.ts): update FlowsManagerStoreType to include selectedFlowsComponentsCards state and setSelectedFlowsComponentsCards function
📝 (deleteComponentFlows.spec.ts): update confirmation message for deleting a component

* 🐛 (index.tsx): filter out flows without a folder_id to prevent errors when mapping over flows
🐛 (index.ts): add folder_id property to FlowType to properly handle flows with a folder_id

* 📝 (sidebarComponent): remove console.log statement for items variable
♻️ (sidebarComponent): refactor sideBarButtons component to fix button width and improve styling
♻️ (sidebarComponent): refactor sideBarFolderButtons component to fix folder name truncation and improve styling
♻️ (sidebarComponent): refactor sidebarNav component to fix className prop
♻️ (mainPage): refactor HomePage component to remove unnecessary parentheses and fix indentation

* 📝 (on-file-drop.tsx): import `useLocation` from `react-router-dom` to use location state in the component
♻️ (on-file-drop.tsx): refactor `useFlowsManagerStore` to `useFolderStore` to use the correct store for getting folder data
 (on-file-drop.tsx): add `location` and `folderId` variables to get the folder id from the location state
 (on-file-drop.tsx): call `getFolderById` function instead of `setAllFlows` to update the folder data after successful upload

* Implemented Dict modal on Cell Editor for objects

*  (sideBarFolderButtons/index.tsx): add support for file drop functionality in the sidebar folder buttons component
📝 (use-on-file-drop.tsx): create a custom hook for handling file drop functionality in the sidebar component
📝 (componentsComponent/index.tsx): update import statement for the useFileDrop hook in the components component
📝 (use-delete-folder.tsx): create a custom hook for handling folder deletion in the MainPage component
📝 (use-dropdown-options.tsx): create a custom hook for generating dropdown options in the MainPage component

 (use-on-file-drop.tsx): add a new hook for handling file drop functionality in the MainPage component
 (index.tsx): update import paths for hooks in the MainPage component
♻️ (flowsManagerStore.ts): refactor the addFlow function to include a new parameter 'fromDragAndDrop' to differentiate between adding a flow from drag and drop or other methods
♻️ (foldersStore.tsx): refactor the folder store to include a new state 'folderDragging' to store the folder being dragged
♻️ (index.ts): refactor the types in the flowsManager and folders store to include the new 'fromDragAndDrop' parameter

* 📝 (App.tsx): Remove unnecessary line breaks and trailing commas for better code readability
♻️ (App.tsx): Refactor code to remove unused variables and dependencies
 (App.tsx): Add support for fetching folders on login and error handling
♻️ (popoverObject/index.tsx): Refactor code to remove unnecessary ternary operators and improve code readability
♻️ (foldersModal/component/index.tsx): Refactor code to improve code readability and consistency
♻️ (foldersModal/index.tsx): Refactor code to improve code readability and consistency

 (actionsMainPage.spec.ts): add end-to-end tests for selecting and deleting all items, and searching flows and components
 (folders.spec.ts): add end-to-end tests for CRUD operations on folders and adding a folder by drag and drop

* Refactor: Change the no data table screen to a better version

* refactor: Update ObjectRender component to display truncated object and provide option to see more

* style(objectRender): add hover effect to object render component for better user experience
style(tailwind.config.js): add slow-wiggle animation to tailwind config for smoother animation effect

* 📝 (inputComponent/index.tsx): remove unnecessary whitespace in className prop to improve code readability
📝 (inputComponent/index.tsx): update id prop value to include object id for better identification
📝 (inputComponent/index.tsx): update id prop value to include object id for better identification
📝 (inputComponent/index.tsx): remove unnecessary whitespace in className prop to improve code readability
📝 (inputComponent/index.tsx): remove unnecessary whitespace in className prop to improve code readability
📝 (inputComponent/index.tsx): remove unnecessary whitespace in className prop to improve code readability
📝 (inputComponent/index.tsx): remove unnecessary whitespace in className prop to improve code readability
📝 (inputComponent/index.tsx): remove unnecessary whitespace in className prop to improve code readability
📝 (inputComponent/index.tsx): remove unnecessary whitespace in className prop to improve code readability
📝 (inputComponent/index.tsx): remove unnecessary whitespace in className prop to improve code readability
📝 (inputComponent/index.tsx): remove unnecessary whitespace in className prop to improve code readability
📝 (inputComponent/index.tsx): remove unnecessary whitespace in className prop to improve code readability
📝 (sidebarComponent/components/sideBarButtons/index.tsx): remove unused item.icon prop
📝 (sidebarComponent/index.tsx): add isFolderPath variable to check if current path is a folder path
📝 (sidebarComponent/index.tsx): add isFolderPath variable to check if current path is a folder path
📝 (foldersModal/component/index.tsx): update id prop value for flow input component
📝 (foldersModal/component/index.tsx): update id prop value for component input component
📝 (end-to-end/actionsMainPage.spec.ts): update getByText assertions to include { exact: true } option for more accurate matching

 (chatInputOutput.spec.ts): update test case to improve readability and remove unnecessary characters in input text
📝 (chatInputOutput.spec.ts): update test case to improve readability and remove unnecessary characters in input text
 (chatInputOutput.spec.ts): update test case to improve readability and remove unnecessary characters in input text
📝 (chatInputOutput.spec.ts): update test case to improve readability and remove unnecessary characters in input text
📝 (chatInputOutput.spec.ts): update test case to improve readability and remove unnecessary characters in input text
📝 (chatInputOutput.spec.ts): update test case to improve readability and remove unnecessary characters in input text
📝 (chatInputOutput.spec.ts): update test case to improve readability and remove unnecessary characters in input text
📝 (chatInputOutput.spec.ts): update test case to improve readability and remove unnecessary characters in input text
📝 (chatInputOutput.spec.ts): update test case to improve readability and remove unnecessary characters in input text
📝 (chatInputOutput.spec.ts): update test case to improve readability and remove unnecessary characters in input text
📝 (chatInputOutput.spec.ts): update test case to improve readability and remove unnecessary characters in input text
📝 (chatInputOutput.spec.ts): update test case to improve readability and remove unnecessary characters in input text
📝 (chatInputOutput.spec.ts): update test case to improve readability and remove unnecessary characters in input text
📝 (chatInputOutput.spec.ts): update test case to improve readability and remove unnecessary characters in input text
📝 (chatInputOutput.spec.ts): update test case to improve readability and remove unnecessary characters in input text
📝 (chatInputOutput.spec.ts): update test case to improve readability and remove unnecessary characters in input text
📝 (chatInputOutput.spec.ts): update test case to improve readability and remove unnecessary characters in input text
📝 (chatInputOutput.spec.ts): update test case to improve readability and remove unnecessary characters in input text
📝 (chatInputOutput.spec.ts): update test case to improve readability and remove unnecessary characters in input text
📝 (chatInputOutput.spec.ts): update test case to improve readability and remove unnecessary characters in input text
📝 (chatInputOutput.spec.ts): update test case to improve readability and remove unnecessary characters in input text
📝 (chatInputOutput.spec.ts): update test case to improve readability and remove unnecessary characters in input text
📝 (chatInputOutput.spec.ts): update test case to improve readability and remove unnecessary characters in input text
📝 (chatInputOutput.spec.ts): update test case to improve readability and remove unnecessary characters in input text
📝 (chatInputOutput.spec.ts): update test case to improve readability and remove unnecessary characters in input text
📝 (chatInputOutput.spec.ts): update test case to improve readability and remove unnecessary characters in input text
📝 (chatInputOutput.spec.ts): update test case to improve readability and remove unnecessary characters in input text
📝 (chatInputOutput.spec.ts): update test case to improve readability and remove unnecessary characters in input text
📝 (chatInputOutput.spec.ts): update test case to improve readability and remove unnecessary characters in input text
📝 (chatInputOutput.spec.ts): update test case to improve readability and remove unnecessary characters in input text
📝 (chatInputOutput.spec.ts): update test case to improve readability and remove unnecessary characters in input text
📝 (chatInputOutput.spec.ts): update test case to improve readability and remove unnecessary characters in input text
📝 (chatInputOutput.spec.ts): update test case to improve readability and remove unnecessary characters in input text
📝 (chatInputOutput.spec.ts): update test case to improve readability and remove unnecessary characters in input text
📝 (chatInputOutput.spec.ts): update test case to improve readability and remove unnecessary characters in input text
📝 (chatInputOutput.spec.ts): update test case to improve readability and remove unnecessary characters in input text
📝 (chatInputOutput.spec.ts): update test case to improve readability and remove unnecessary characters in input text
📝 (chatInputOutput.spec.ts): update test case to improve readability and remove unnecessary characters in input text
📝 (chatInputOutput.spec.ts): update test case to improve readability and remove unnecessary characters in input text
📝 (chatInputOutput.spec.ts): update test case to improve readability and remove unnecessary characters in input text
📝 (chatInputOutput.spec.ts): update test case to improve readability and remove unnecessary characters in input text
📝 (chatInputOutput.spec.ts): update test case to improve readability and remove

 (nestedComponent.spec.ts): remove unnecessary code related to showpinecone_env checkbox
 (store.spec.ts): use environment variable STORE_API_KEY instead of hardcoding the API key

* 📝 (inputComponent/index.tsx): update id prop value to include "popover-anchor-" prefix for better identification and accessibility
 (sidebarComponent/components/sideBarButtons/index.tsx): add react-router-dom Link component to wrap each sidebar button item for navigation functionality
♻️ (sidebarComponent/index.tsx): refactor isFolderPath logic to use array of path values and check if any of them is included in the current pathname for better readability and maintainability

* Refactor: use shadcn alert when there is no data

* Remove unnecessary quotes

* Refactor: add border to no data alert

* Fix: record output not using table as it should

* 📝 (cardComponent/index.tsx): remove redundant "selected" from description prop in DeleteConfirmationModal component
📝 (componentsComponent/index.tsx): remove redundant "selected" from getDescriptionModal function

*  (logs.spec.ts): add end-to-end test for viewing and interacting with logs in the frontend
📝 (logs.spec.ts): add documentation comments to improve code readability and maintainability

* 📝 (folders.py): add support for downloading all flows from a folder as a file
📝 (folders.py): add support for uploading flows from a file to a folder
 (index.tsx): add handleDownloadFolderFn utility function to handle downloading flows from a folder
 (index.tsx): add handleUploadFlowsToFolder function to handle uploading flows to a folder
📝 (services/index.ts): add downloadFlowsFromFolders function to make API call for downloading flows from a folder
📝 (services/index.ts): add uploadFlowsFromFolders function to make API call for uploading flows to a folder
📝 (handle-download-folder.ts): create handleDownloadFolderFn utility function to handle downloading flows from a folder

 (foldersStore.tsx): add support for uploading flows from folders
📝 (foldersStore.tsx): update types to include uploadFolder function in FoldersStoreType

* 📝 (folders.py): remove unnecessary whitespace to improve code readability
📝 (folders.py): remove unnecessary whitespace to improve code readability

* style: update CSS in App.css to improve scrollbar appearance
feat: add TableComponent to CsvOutputComponent for better table rendering
refactor: remove unused code and improve readability in CsvOutputComponent
refactor: simplify logic in TableAutoCellRender component
feat: add autoHeight property to columns in extractColumnsFromRows utility function

* 🐛 (folders.py): fix issue where components and flows were not being assigned to the new folder
🐛 (folders.py): fix issue where components and flows were not being assigned to the new folder
🐛 (sideBarFolderButtons/index.tsx): fix issue where folder buttons were not taking up full width
🐛 (use-on-file-drop.tsx): fix issue where folder dragging was not being reset on drag leave
🐛 (use-on-file-drop.tsx): fix issue where folder dragging was not being reset on drag leave
🐛 (use-on-file-drop.tsx): fix issue where folder dragging was not being reset on drag leave
🐛 (entities/index.tsx): fix issue where AddFolderType was missing flows and components properties
🐛 (services/index.ts): fix issue where addFolder function was not correctly sending flows and components data

* 📝 (model.py): remove unnecessary whitespace
📝 (index.tsx): remove unused 'pathname' prop
📝 (index.tsx): add 'handleAddFolder' prop to SideBarFoldersButtonsComponent
📝 (index.tsx): remove unused 'handleAddFolder' prop from SideBarButtonsComponent
📝 (index.tsx): remove unused import of DropdownButton in sideBarFolderButtons
📝 (index.tsx): add DropdownButton component to SideBarFoldersButtonsComponent
📝 (index.tsx): add 'handleAddFolder' prop to SideBarFoldersButtonsComponent
📝 (use-on-file-drop.tsx): remove console.log statements
📝 (index.tsx): remove console.log statements
📝 (index.tsx): remove unused import of FolderPlusIcon in mainPage
📝 (index.tsx): remove unused sidebarNavItems array in mainPage

* Refactor: make select all look more like a button

* feat: Add first step of drag and drop functionality to CollectionCardComponent

* 📝 (langflow-pre.db): add new langflow-pre.db file to the backend/base/langflow directory
 (index.tsx): improve modal header description by dynamically displaying "Edit a folder" or "Add a new folder" based on the presence of folderToEdit prop

* remove api key

* remove api key

* remove api key

* Refactor: Update downloadFlowsFromFolders function to include folder name in response

* add type to folder function

* Refactor: Update chatComponent and sideBarFolderButtons components

This commit refactors the chatComponent and sideBarFolderButtons components.

In chatComponent:
- Moved the declaration of the 'currentFlow' variable to ensure it is defined before being used.
- Removed the unused 'hasIO' and 'hasStore' variables.
- Reordered the imports for better organization.

In sideBarFolderButtons:
- Added imports for 'useStoreStore' and 'ShadTooltip' components.
- Removed the unused 'hasStore', 'validApiKey', and 'hasApiKey' variables.
- Removed the unused 'handleEditFolder' function.
- Added a new button with an icon for sharing as a bundle, with a tooltip indicating the need to review the API key before sharing.

These changes improve the code structure and remove unused code, enhancing the overall maintainability and user experience of the application.

* copy folder modal structure to start bundle modal

* new lock

* refactor: Move no data alert rendering logic to a separate function

* refactor: Move no data alert rendering logic to a separate function

* add truncate to json objects

* Refactor: store flow_id in ChatComponent's records in ChatComponent

* 📝 (folders.py): add missing import for FolderBase model
🐛 (folders.py): fix issue where flows were not being fetched for a folder
🐛 (folders.py): fix issue where flows were not being deleted when a folder is deleted
🐛 (folders.py): fix issue where folder description was not being returned when downloading flows
 (folders.py): add support for uploading flows from a file
🐛 (schemas.py): fix issue where folder description was not included in FlowListReadWithFolderName schema
♻️ (sideBarButtons/index.tsx): refactor handleOpenNewFolderModal prop to be optional

 (sideBarFolderButtons/index.tsx): make handleChangeFolder, handleEditFolder, handleDeleteFolder, handleAddFolder optional to improve component reusability
♻️ (sideBarFolderButtons/index.tsx): refactor useFileDrop hook to use async/await syntax and separate file upload logic into a separate function
 (sideBarFolderButtons/index.tsx): add support for uploading flows from folders using the uploadFlowsFromFolders API
♻️ (sideBarFolderButtons/index.tsx): refactor handleFileDrop function to handle multiple files and use FormData to send file data to the server
♻️ (sideBarFolderButtons/index.tsx): refactor dragOver, dragEnter, dragLeave, and onDrop functions to remove unnecessary folderId parameter and set folderDragging state to a boolean value instead of an empty string

📝 (sidebarComponent/index.tsx): make handleOpenNewFolderModal, handleChangeFolder, handleEditFolder, handleDeleteFolder optional to allow flexibility in using the component
📝 (foldersModal/component/index.tsx): add allFlows variable to get all flows from the store and use it to filter components and flows on the folder being edited
📝 (foldersModal/hooks/submit-folder.tsx): import useNavigate from react-router-dom and use it to navigate to the folder page after creating or updating a folder
📝 (pages/MainPage/entities/index.tsx): add StarterProjectsType to define the type of starter projects
📝 (pages/MainPage/pages/mainPage/index.tsx): import useAlertStore from stores/alertStore and use it to set error data when trying to download an empty folder

📝 (services/index.ts): add StarterProjectsType import to support the new entity in the code
📝 (services/index.ts): add return type to updateFolder function to improve code clarity
📝 (services/index.ts): add return type to getFolderById function to improve code clarity
📝 (services/index.ts): add return type to getStarterProjects function to improve code clarity
📝 (services/index.ts): add folder_description property to the return type of downloadFlowsFromFolders function to provide additional information about the folder
📝 (services/index.ts): remove folderId parameter from uploadFlowsFromFolders function as it is not needed
📝 (utils/handle-download-folder.ts): add folder_name and folder_description properties to the data object to provide additional information about the folder being downloaded
📝 (SettingsPage/index.tsx): remove commented out code for unused settings options
📝 (stores/flowsManagerStore.ts): add missing comma in setCurrentFlowId function
📝 (stores/flowsManagerStore.ts): add return type to saveFlow function to improve code clarity
📝 (stores/flowsManagerStore.ts): add return type to updateFlow function to improve code clarity
📝 (stores/flowsManagerStore.ts): add return type to addFlow function to improve code clarity
📝 (stores/flowsManagerStore.ts): add return type to deleteFlow function to improve code clarity
📝 (stores/flowsManagerStore.ts): add return type to addFlowComponent function to improve code clarity
📝 (stores/flowsManagerStore.ts): add return type to takeSnapshot function to improve code clarity
📝 (stores/flowsManagerStore.ts): add return type to undo function to improve code clarity
📝 (stores/flowsManagerStore.ts): add return type to redo function to improve code clarity

♻️ (foldersStore.tsx): change folderDragging variable type from string to boolean to improve semantics and consistency
♻️ (foldersStore.tsx): remove unused folderId parameter from uploadFolder function
♻️ (foldersStore.tsx): remove unused setAllFlows function call
♻️ (folders/index.ts): change folderDragging variable type from string to boolean to match the updated type in foldersStore.tsx

* 🐛 (folders.py): fix indentation and remove unnecessary whitespace
 (folders.py): add logic to handle duplicate folder names by appending a number to the folder name
📝 (folders.py): update comments and documentation

* 🐛 (submit-folder.tsx): remove unnecessary comma after closing curly brace in error handling function
🐛 (index.tsx): remove unnecessary comma after closing parenthesis in state selectors
♻️ (index.tsx): refactor code to simplify logic for getting folder by ID and handling default case

* refactor: Update add_row_to_table function to use list comprehension for values

* Refactor: Update placeholder text capitalization in headerComponent and inputSearchComponent
In headerComponent:
- Changed "Select all" to "Select All" for better consistency and readability.
In inputSearchComponent:
- Changed "Search flows" to "Search Flows" and "Search components" to "Search Components" for better consistency and readability.

These changes improve the user experience and maintain consistency in the application.

* Modularized scroll fade and added it to folders

* refactor(componentsComponent): remove unnecessary switch statement in handleSelectOptionsChange function
feat(headerComponent): replace Select component with a Button component for delete action
feat(headerComponent): add disableDelete prop to Button component to handle delete button state based on selected items

* Made selector not disappear after hover if selected

* fixed selector

* 🐛 (folders.py): fix updating folder components and flows logic
 (folders.py): add support for moving excluded flows to "My Collection" folder

* ♻️ (folders.py): remove unnecessary whitespace
🐛 (folders.py): fix indentation issue in update_folder function

* refactor(headerComponent): replace Select component with Button component for delete action

* refactor: Handle float conversion errors in validate_id method

* Fix adding primary key

* Refactor: remove trash from card and make checkbox always visible

* Refactor: add padding on card title to avoid bugs

* chore: Add h-full class to sideBarFolderButtons component

* 📝 (api.tsx): add import statement for useUtilityStore from utilityStore to use the utility store in the API interceptor
📝 (api.tsx): add lastUrlCalled and setLastUrlCalled variables to store and retrieve the last URL called in the API interceptor
📝 (api.tsx): add logic to check for duplicate requests in the API interceptor based on the last URL called
📝 (api.tsx): add localStorage to store the last URL called in the API interceptor
📝 (api.tsx): add logic to add access token to every request in the API interceptor
♻️ (index.tsx): refactor selectedFolder?.flows to remove unnecessary parentheses in ComponentsComponent
♻️ (index.tsx): refactor state.searchFlowsComponents.toLowerCase() to remove unnecessary parentheses in ComponentsComponent
♻️ (index.tsx): refactor state.selectedFlowsComponentsCards to remove unnecessary parentheses in ComponentsComponent
♻️ (index.tsx): refactor (f.is_component ?? false) === is_component to remove unnecessary parentheses in ComponentsComponent
📝 (utilityStore.ts): add lastUrlCalled and setLastUrlCalled variables to utility store to store and retrieve the last URL called

* 📝 (api.tsx): remove unused import of useUtilityStore from utilityStore
♻️ (api.tsx): remove unused variables lastUrlCalled and setLastUrlCalled from useUtilityStore
📝 (utilityStore.ts): remove unused variable lastUrlCalled and setLastUrlCalled from utilityStore

* refactor: Add flow_id parameter to log_message function

* fix undefined bug

* refactor: Update add_row_to_table function to use list comprehension for values

* refactor: Add flow_id field to FlowCreate and FlowRead models

* refactor: Update FlowCreate and FlowRead models to use folder_id instead of flow_id

* Refactor: make drag n drop works in the entire screen

* ⬆️ (frontend/package.json): upgrade "@playwright/test" dependency from version 1.43.1 to 1.44.0
 (frontend/tests/end-to-end/actionsMainPage.spec.ts): replace the usage of XPath locator with text locator for better readability and maintainability
 (frontend/tests/end-to-end/actionsMainPage.spec.ts): replace the usage of "Actions" and "Delete" text locators with "icon-Trash2" locator for better specificity
 (frontend/tests/end-to-end/actionsMainPage.spec.ts): replace the usage of "Delete" text locator with "Delete" button locator for better specificity
 (frontend/tests/end-to-end/actionsMainPage.spec.ts): replace the usage of "Select All" text locator with "Select All" button locator for better specificity
 (frontend/tests/end-to-end/actionsMainPage.spec.ts): replace the usage of "Unselect All" text locator with "Unselect All" button locator for better specificity
 (frontend/tests/end-to-end/actionsMainPage.spec.ts): replace the usage of "Actions" text locator with "icon-Trash2" locator for better specificity
 (frontend/tests/end-to-end/actionsMainPage.spec.ts): replace the usage of "Delete" text locator with "Delete" button locator for better specificity
 (frontend/tests/end-to-end/actionsMainPage.spec.ts): replace the usage of "Select All" text locator with "Select All" button locator for better specificity
 (frontend/tests/end-to-end/actionsMainPage.spec.ts): replace the usage of "New Project" XPath locator with "New Project" text locator for better readability and maintainability
 (frontend/tests/end-to-end/actionsMainPage.spec.ts): replace the usage of "New Project" XPath locator with "New Project" text locator for better readability and maintainability
 (frontend/tests/end-to-end/actionsMainPage.spec.ts): replace the usage of "New Project" XPath locator with "New Project" text locator for better readability and maintainability
 (frontend/tests/end-to-end/actionsMainPage.spec.ts): replace the usage of "New Project" XPath locator with "New Project" text locator for better readability and maintainability
 (frontend/tests/end-to-end/actionsMainPage.spec.ts): replace the usage of "New Project" XPath locator with "New Project" text locator for better readability and maintainability
 (frontend/tests/end-to-end/actionsMainPage.spec.ts): replace the usage of "New Project" XPath locator with "New Project" text locator for better readability and maintainability
 (frontend/tests/end-to-end/actionsMainPage.spec.ts): replace the usage of "New Project" XPath locator with "New Project" text locator for better readability and maintainability
 (frontend/tests/end-to-end/actionsMainPage.spec.ts): replace the usage of "New Project" XPath locator with "New Project" text locator for better readability and maintainability
 (frontend/tests/end-to-end/actionsMainPage.spec.ts): replace the usage of "New Project" XPath locator with "New Project" text locator for better readability and maintainability
 (frontend/tests/end-to-end/actionsMainPage.spec.ts): replace the usage of "New Project" XPath locator with "New Project" text locator for better readability and maintainability
 (frontend/tests/end-to-end/actionsMainPage.spec.ts): replace the usage of "New Project" XPath locator with "New Project" text locator for better readability and maintainability
 (frontend/tests/end-to-end/actionsMainPage.spec.ts): replace the usage of "New Project" XPath locator with "New Project" text locator for better readability and maintainability
 (frontend/tests/end-to-end/actionsMainPage.spec.ts): replace the usage of "New Project" XPath locator with "New Project" text locator for better readability and maintainability
 (frontend/tests/end-to-end/actionsMainPage.spec.ts): replace the usage of "New Project" XPath locator with "New Project" text locator for better readability and maintainability
 (frontend/tests/end-to-end/actionsMainPage.spec.ts): replace the usage of "New Project" XPath locator with "New Project" text locator for better readability and maintainability
 (frontend/tests/end-to-end/actionsMainPage.spec.ts): replace the usage of "New Project" XPath locator with "New Project" text locator for better readability and maintainability
 (frontend/tests/end-to-end/actionsMainPage.spec.ts): replace the usage of "New Project" XPath locator with "New Project" text locator for better readability and maintainability
 (frontend/tests/end-to-end/actionsMainPage.spec.ts): replace the usage of "New Project" XPath locator with "New Project" text locator for better readability and maintainability
 (frontend/tests/end

 (floatComponent.spec.ts): update selector for clicking "New Project" button to improve test reliability
 (flowPage.spec.ts): update selector for clicking "New Project" button to improve test reliability
 (flowSettings.spec.ts): update selector for clicking "New Project" button to improve test reliability
 (folders.spec.ts): update selector for clicking "New Project" button to improve test reliability
 (folders.spec.ts): update selector for clicking "New Folder" button to improve test reliability
 (folders.spec.ts): update selector for clicking "Edit Folder" button to improve test reliability
 (folders.spec.ts): update selector for dispatching drop event to improve test reliability
 (globalVariables.spec.ts): update selector for clicking "New Project" button to improve test reliability
 (group.spec.ts): update selector for clicking "New Project" button to improve test reliability
 (inputComponent.spec.ts): update selector for clicking "New Project" button to improve test reliability
 (inputListComponent.spec.ts): update selector for clicking "New Project" button to improve test reliability
 (intComponent.spec.ts): update selector for clicking "New Project" button to improve test reliability
 (keyPairListComponent.spec.ts): update selector for clicking "New Project" button to improve test reliability
 (langflowShortcuts.spec.ts): update selector for clicking "New Project" button to improve test reliability
 (nestedComponent.spec.ts): update selector for clicking "New Project" button to improve test reliability
 (promptModalComponent.spec.ts): update selector for clicking "New Project" button to improve test reliability
 (python_api_generation.spec.ts): update selector for clicking "New Project" button to improve test reliability

 (saveComponents.spec.ts): update selector for clicking "New Project" button to improve test reliability and maintainability
 (store.spec.ts): update selector for clicking "New Project" button to improve test reliability and maintainability
 (textAreaModalComponent.spec.ts): update selector for clicking "New Project" button to improve test reliability and maintainability
 (textInputOutput.spec.ts): update selector for clicking "New Project" button to improve test reliability and maintainability
 (toggleComponent.spec.ts): update selector for clicking "New Project" button to improve test reliability and maintainability
 (tweaks_test.spec.ts): update selector for clicking "New Project" button to improve test reliability and maintainability
📝 (test-results/.last-run.json): add .last-run.json file to track test run status

* Refactor: make drag n drop only happen in the folder div

* refactor: Fix incorrect variable assignment in memory.py

* refactor: Update data retrieval in InterfaceVertex to use record data instead of model_dump

* refactor: Update DateReader component to use 12-hour time format

* refactor: Update activeTab state variable in FlowLogsModal component

* refactor: Update FlowCreate and FlowRead models to use folder_id instead of flow_id

* refactor: Update hover animation in ObjectRender component

* refactor: Update icon in FlowLogsModal component

* add table preview on IO

* refactor: Add truncate class to StringReader component

* refactor: Add TableAutoCellRender support for displaying badges

* refactor: Add filter option to extractColumnsFromRows function

* update card width

* style(IOFieldView): update className condition to dynamically set height based on 'left' prop value

* fix(IOFieldView): update height class value from "h-36" to "h-56" for better UI consistency
fix(FlowLogsModal): update BaseModal.Header description based on activeTab value for dynamic content display

* Update BaseModal.Header description in FlowLogsModal component

* refactor: Update dict_values_to_string function to use deepcopy for dictionary copy

* 📝 (sideBarFolderButtons): Remove unused variables and improve code readability
📝 (api): Remove unnecessary error handling and improve code readability
📝 (componentsComponent): Remove unused variables and improve code readability
📝 (foldersStore): Remove unnecessary error handling and improve code readability

* 📝 (App.tsx): remove unnecessary call to getFoldersApi() before setting loading state to false
♻️ (App.tsx): refactor code to navigate to "/all" instead of "/flows" when window location pathname is "/"

* refactor: Update FlowCreate and FlowRead models to use folder_id instead of flow_id

* refactor: Update FlowCreate and FlowRead models to use folder_id instead of flow_id

* refactor: Update MyCollectionComponent to use "type" prop instead of "is_component"

* refactor: Update error handling in API interceptor

* refactor: Update StoreGuard component to navigate to "/all" instead of "/flows" when there is no store

* chore(constants.ts): add DEFAULT_FOLDER constant for improved code readability
refactor(index.tsx): update title and description logic to use constants for consistency
feat(foldersStore.tsx): utilize DEFAULT_FOLDER constant for folder name comparison to improve maintainability and readability

* lint

* reduce navbar size

* chore: Update className in mainPage/index.tsx to use relative width for folder button

* refactor: Remove unnecessary call to getFoldersApi() and refactor code in App.tsx

* refactor: Update default column width in TableComponent

* Refactor: Change folders actions buttons to another location

*  (cardComponent/index.tsx): refactor useState calls to remove unnecessary commas and improve code readability
📝 (cardComponent/index.tsx): remove unnecessary semicolon and fix indentation
♻️ (cardComponent/index.tsx): remove unnecessary semicolon and fix indentation
 (cardComponent/index.tsx): refactor onClick handler to remove unnecessary ternary operator
♻️ (cardComponent/index.tsx): remove unnecessary semicolon and fix indentation
 (cardComponent/index.tsx): refactor onClick handler to remove unnecessary ternary operator
♻️ (cardComponent/index.tsx): remove unnecessary semicolon and fix indentation
 (cardComponent/index.tsx): refactor onClick handler to remove unnecessary ternary operator
♻️ (cardComponent/index.tsx): remove unnecessary semicolon and fix indentation
 (cardComponent/index.tsx): refactor onClick handler to remove unnecessary ternary operator
♻️ (cardComponent/index.tsx): remove unnecessary semicolon and fix indentation
 (cardComponent/index.tsx): refactor onClick handler to remove unnecessary ternary operator
♻️ (cardComponent/index.tsx): remove unnecessary semicolon and fix indentation
 (cardComponent/index.tsx): refactor onClick handler to remove unnecessary ternary operator
♻️ (cardComponent/index.tsx): remove unnecessary semicolon and fix indentation
 (cardComponent/index.tsx): refactor onClick handler to remove unnecessary ternary operator
♻️ (cardComponent/index.tsx): remove unnecessary semicolon and fix indentation
 (cardComponent/index.tsx): refactor onClick handler to remove unnecessary ternary operator
♻️ (cardComponent/index.tsx): remove unnecessary semicolon and fix indentation
 (cardComponent/index.tsx): refactor onClick handler to remove unnecessary ternary operator
♻️ (cardComponent/index.tsx): remove unnecessary semicolon and fix indentation
 (cardComponent/index.tsx): refactor onClick handler to remove unnecessary ternary operator
♻️ (cardComponent/index.tsx): remove unnecessary semicolon and fix indentation
 (cardComponent/index.tsx): refactor onClick handler to remove unnecessary ternary operator
♻️ (cardComponent/index.tsx): remove unnecessary semicolon and fix indentation
 (cardComponent/index.tsx): refactor onClick handler to remove unnecessary ternary operator
 (use-on-file-drop.tsx): refactor handleFileDrop function to use uploadFormData function for better code organization and readability

* get error from folder

* refactor: Handle error when updating folder in submit-folder.tsx

* refactor: Update submit-folder.tsx to handle folder submission and error handling consistently

* Refactor: Rename folders buttons and add search input icon

* Fixed padding on select

* Fix: Store tags displaying as a column

* fixed checkbox color on card

* Implemented draggable small folder

* Refactor: Add padding to search input

* fixed flow not dropping

* Fixed flow and component dropping bugs

* Refactor: Update ComponentsComponent to improve code readability and remove unnecessary code

* Fixed deleting issue when it doesnt update on creating new folder

* refactor: Update activeTab name in FlowLogsModal component

* Removed onDelete of card component

* update logs modal postion

* Refactor: Make folders buttons the same size

* Refactor: Position download folder button in a better parent

* Refactor: Update folder_id when moving a flow to a different folder

* Refactor: Update folder_id when moving a flow to a different folder

* Refactor: Update folder_id when moving a flow to a different folder

* chore: Remove unnecessary comma in API interceptor code

* Refactor: Remove unused code and improve folder button behavior

* Refactor: Improve code readability and remove unnecessary code in ComponentsComponent

* Refactor: Update folder_id when moving a flow to a different folder

* feat(sidebarComponent): add support for downloading folders with flows
fix(constants): change DEFAULT_FOLDER constant value to "My Projects" for clarity
refactor(emptyComponent): update text color and alignment for better readability
style(headerTabsSearchComponent): remove download button from header tabs search component
style(inputSearchComponent): adjust width of input search component for better UI consistency

* merge on dev

* fixing migration

* removing db

* 📝 (use-on-file-drop.tsx): add import statement for useFlowsManagerStore to use the refreshFlows function
 (use-on-file-drop.tsx): call refreshFlows function after uploading flows to update the flows list
📝 (foldersStore.tsx): remove unnecessary comma and fix indentation
 (foldersStore.tsx): call refreshFlows function after uploading flows to update the flows list

* feat(modals): update folder modal title and icon

* fix(cardsWrapComponent): add useEffect hook to handle visibility change when tab becomes visible to reset hover state and improve user experience

* 🐛 (popover/index.tsx): fix indentation and remove unnecessary ternary operator
🐛 (popover/index.tsx): fix className prop to prevent it from being undefined
🐛 (inputComponent/index.tsx): prevent event propagation and default behavior when clicking on the button inside InputComponent

*  (index.tsx): add useEffect import to fix missing dependency warning and improve code readability
♻️ (index.tsx): remove unused useEffect function implementation to clean up code

*  (foldersStore.tsx): add call to refreshFlows() method in useFlowsManagerStore to update flows after loading folders

* fix(langflow): add missing index 'ix_flow_folder_id' on 'flow' table to improve database performance

* fix: add missing index 'ix_flow_folder_id' on 'flow' table

* refactor(foldersModal): improve folder icon naming for better clarity and consistency

* feat: add kill command to stop backend server

* 📝 (App.tsx): remove unnecessary trailing commas in the useAlertStore and useGlobalVariablesStore hooks
📝 (mainPage/index.tsx): remove unused import and useEffect hook that fetches folders
♻️ (temp): delete unused temp folder

*  (submit-folder.tsx): update navigate path to use "all" instead of "flows" to improve consistency and clarity
 (mainPage/index.tsx): add call to getFoldersApi on page load to ensure folders are up to date
🐛 (chatInputOutput.spec.ts): fix selector for input-openai_api_key to use popover-anchor-input-openai_api_key
🐛 (chatInputOutput.spec.ts): fix selector for input-sender_name to use popover-anchor-input-sender_name
♻️ (chatInputOutput.spec.ts): refactor code to improve readability and remove unnecessary code
♻️ (folders.spec.ts): refactor code to improve readability and remove unnecessary code

 (inputComponent.spec.ts): update selectors for input elements to match changes in the frontend code
 (inputComponent.spec.ts): update selectors for input elements to match changes in the frontend code
 (inputComponent.spec.ts): update selectors for input elements to match changes in the frontend code
 (inputComponent.spec.ts): update selectors for input elements to match changes in the frontend code
 (inputComponent.spec.ts): update selectors for input elements to match changes in the frontend code
 (inputComponent.spec.ts): update selectors for input elements to match changes in the frontend code
 (inputComponent.spec.ts): update selectors for input elements to match changes in the frontend code
 (inputComponent.spec.ts): update selectors for input elements to match changes in the frontend code
 (inputComponent.spec.ts): update selectors for input elements to match changes in the frontend code
 (inputComponent.spec.ts): update selectors for input elements to match changes in the frontend code
 (inputComponent.spec.ts): update selectors for input elements to match changes in the frontend code
 (inputComponent.spec.ts): update selectors for input elements to match changes in the frontend code
 (inputComponent.spec.ts): update selectors for input elements to match changes in the frontend code
 (inputComponent.spec.ts): update selectors for input elements to match changes in the frontend code
 (inputComponent.spec.ts): update selectors for input elements to match changes in the frontend code
 (inputComponent.spec.ts): update selectors for input elements to match changes in the frontend code
 (inputComponent.spec.ts): update selectors for input elements to match changes in the frontend code
 (inputComponent.spec.ts): update selectors for input elements to match changes in the frontend code
 (inputComponent.spec.ts): update selectors for input elements to match changes in the frontend code
 (inputComponent.spec.ts): update selectors for input elements to match changes in the frontend code
 (inputComponent.spec.ts): update selectors for input elements to match changes in the frontend code
 (inputComponent.spec.ts): update selectors for input elements to match changes in the frontend code
 (inputComponent.spec.ts): update selectors for input elements to match changes in the frontend code
 (inputComponent.spec.ts): update selectors for input elements to match changes in the frontend code
 (inputComponent.spec.ts): update selectors for input elements to match changes in the frontend code
 (inputComponent.spec.ts): update selectors for input elements to match changes in the frontend code
 (inputComponent.spec.ts): update selectors for input elements to match changes in the frontend code
 (inputComponent.spec.ts): update selectors for input elements to match changes in the frontend code
 (inputComponent.spec.ts): update selectors for input elements to match changes in the frontend code
 (inputComponent.spec.ts): update selectors for input elements to match changes in the frontend code
 (inputComponent.spec.ts): update selectors for input elements to match changes in the frontend code
 (inputComponent.spec.ts): update selectors for input elements to match changes in the frontend code
 (inputComponent.spec.ts): update selectors for input elements to match changes in the frontend code
 (inputComponent.spec.ts): update selectors for input elements to match changes in the frontend code
 (inputComponent.spec.ts): update selectors for input elements to match changes in the frontend code
 (inputComponent.spec.ts): update selectors for input elements to match changes in the frontend code
 (inputComponent.spec.ts): update selectors for input elements to match changes in the frontend code
 (inputComponent.spec.ts): update selectors for input elements to match changes in the frontend code
 (inputComponent.spec.ts): update selectors for input elements to match changes in the frontend code
 (inputComponent.spec.ts): update selectors for input elements to match changes in the frontend code
 (inputComponent.spec.ts): update selectors for input elements to match changes in the frontend code
 (inputComponent.spec.ts): update selectors for input elements to match changes in the frontend code
 (inputComponent.spec.ts): update selectors for input elements to match changes in the frontend code
 (inputComponent.spec.ts): update selectors for input elements to match changes in the frontend code
 (inputComponent.spec.ts): update selectors for input elements to match changes in the frontend code
 (inputComponent.spec.ts): update selectors for input elements to match changes in the frontend code
 (inputComponent.spec.ts): update selectors for input elements to match changes in the frontend code
 (inputComponent.spec.ts): update selectors for input elements

🐛 (tweaks_test.spec.ts): fix selectors for input fields to match updated HTML structure

* 🐛 (api.tsx): remove unnecessary comma at the end of the function
🐛 (api.tsx): remove unnecessary comma at the end of the function
🐛 (api.tsx): remove unnecessary comma at the end of the function
🐛 (api.tsx): remove unnecessary comma at the end of the function
🐛 (api.tsx): remove unnecessary comma at the end of the function
🐛 (api.tsx): remove unnecessary comma at the end of the function
🐛 (api.tsx): remove unnecessary comma at the end of the function
🐛 (api.tsx): remove unnecessary comma at the end of the function
🐛 (api.tsx): remove unnecessary comma at the end of the function
🐛 (api.tsx): remove unnecessary comma at the end of the function
🐛 (api.tsx): remove unnecessary comma at the end of the function
🐛 (api.tsx): remove unnecessary comma at the end of the function
🐛 (api.tsx): remove unnecessary comma at the end of the function
🐛 (api.tsx): remove unnecessary comma at the end of the function
🐛 (api.tsx): remove unnecessary comma at the end of the function
🐛 (api.tsx): remove unnecessary comma at the end of the function
🐛 (api.tsx): remove unnecessary comma at the end of the function
🐛 (api.tsx): remove unnecessary comma at the end of the function
🐛 (api.tsx): remove unnecessary comma at the end of the function
🐛 (api.tsx): remove unnecessary comma at the end of the function
🐛 (api.tsx): remove unnecessary comma at the end of the function
🐛 (api.tsx): remove unnecessary comma at the end of the function
🐛 (api.tsx): remove unnecessary comma at the end of the function
🐛 (api.tsx): remove unnecessary comma at the end of the function
🐛 (api.tsx): remove unnecessary comma at the end of the function
🐛 (api.tsx): remove unnecessary comma at the end of the function
🐛 (api.tsx): remove unnecessary comma at the end of the function
🐛 (api.tsx): remove unnecessary comma at the end of the function
🐛 (api.tsx): remove unnecessary comma at the end of the function
🐛 (api.tsx): remove unnecessary comma at the end of the function
🐛 (api.tsx): remove unnecessary comma at the end of the function
🐛 (api.tsx): remove unnecessary comma at the end of the function
🐛 (api.tsx): remove unnecessary comma at the end of the function
🐛 (api.tsx): remove unnecessary comma at the end of the function
🐛 (api.tsx): remove unnecessary comma at the end of the function
🐛 (api.tsx): remove unnecessary comma at the end of the function
🐛 (api.tsx): remove unnecessary comma at the end of the function
🐛 (api.tsx): remove unnecessary comma at the end of the function
🐛 (api.tsx): remove unnecessary comma at the end of the function
🐛 (api.tsx): remove unnecessary comma at the end of the function
🐛 (api.tsx): remove unnecessary comma at the end of the function
🐛 (api.tsx): remove unnecessary comma at the end of the function
🐛 (api.tsx): remove unnecessary comma at the end of the function
🐛 (api.tsx): remove unnecessary comma at the end of the function
🐛 (api.tsx): remove unnecessary comma at the end of the function
🐛 (api.tsx): remove unnecessary comma at the end of the function
🐛 (api.tsx): remove unnecessary comma at the end of the function
🐛 (api.tsx): remove unnecessary comma at the end of the function
🐛 (api.tsx): remove unnecessary comma at the end of the function
🐛 (api.tsx): remove unnecessary comma at the end of the function
🐛 (api.tsx): remove unnecessary comma at the end of the function
🐛 (api.tsx): remove unnecessary comma at the end of the function
🐛 (api.tsx): remove unnecessary comma at the end of the function
🐛 (api.tsx): remove unnecessary comma at the end of the function
🐛 (api.tsx): remove unnecessary comma at the end of the function
🐛 (api.tsx): remove unnecessary

* refactor(modals): remove commented out code in FolderForms component

* 📝 (cardComponent/index.tsx): add aria-label to checkbox component for accessibility improvement
 (deleteComponentFlows.spec.ts): update delete flow and delete component tests to use checkbox component instead of hovering over card and clicking trash icon for better test stability and reliability
 (group.spec.ts): update group node test to use popover anchor input for editing group title instead of directly editing the title for better test stability and reliability
 (logs.spec.ts): update logs test to click on "New Project" button by text instead of using locator for better test stability and reliability

*  (folders.spec.ts): remove unnecessary code that was clicking on elements and pressing the Escape key
♻️ (folders.spec.ts): refactor code to improve readability and remove unused variables
 (folders.spec.ts): add test to verify the ability to change the flow folder

* fix(folders.py): handle case where no flows are found by setting flows to an empty list instead of raising a 404 error

* ♻️ (folders.py): rename the function `update_folder` to `move_to_folder` to improve clarity and consistency with the endpoint URL

* 📝 (folders.py): remove unused move_to_folder endpoint
🔧 (use-on-file-drop.tsx): update import statements for API controllers and services
♻️ (use-on-file-drop.tsx): refactor uploadFromDragCard function to use updateFlowInDatabase function instead of moveFlowToFolder function
♻️ (index.ts): refactor updateFlowInDatabase function to handle null folder_id values correctly
♻️ (index.tsx): refactor HomePage component to remove unnecessary setTimeout function and reduce delay for getFoldersApi function call

* refactor: remove unused handleOpenNewFolderModal function and update folder creation logic

* refactor(pyproject.toml): update version to 1.0.0a35

* refactor: remove duplicate logout response in login.py

* Bump langflow-base version to 0.0.46 and annotated-types version to 0.7.0

* refactor(folders.py): simplify condition checks for empty lists using truthy values
perf(folders.py): optimize code by using len() function instead of __len__() method for list length calculation
perf(folders.py): improve code readability by using len() function instead of __len__() method for list length calculation
perf(folders.py): enhance code efficiency by using truthy values instead of comparing list length to zero

* refactor: add new folder functionality to sidebar component

* 📝 (sideBarFolderButtons/index.tsx): remove unused imports and fix formatting
📝 (sideBarFolderButtons/index.tsx): remove debugger statement
📝 (sideBarFolderButtons/index.tsx): fix indentation
📝 (sideBarFolderButtons/index.tsx): remove unnecessary comma
📝 (sideBarFolderButtons/index.tsx): remove unnecessary parentheses
📝 (sideBarFolderButtons/index.tsx): remove unnecessary semicolon
📝 (sideBarFolderButtons/index.tsx): remove unnecessary debugger statement
📝 (API/api.tsx): remove unnecessary comma
📝 (API/api.tsx): remove unnecessary parentheses
📝 (API/api.tsx): remove unnecessary semicolon
📝 (index.tsx): remove unnecessary comment and fix formatting
📝 (buildUtils.ts): remove unnecessary debugger statement

* refactor(folders.py): update folder creation logic to handle duplicate names

* 📝 (folders.py): import the `or_` function from `sqlalchemy` to use in the query for selecting folders
♻️ (folders.py): refactor the query for selecting folders to include folders with `user_id` as `None`
📝 (folders.py): remove the `read_starter_folders` endpoint as it is no longer needed
📝 (App.tsx): remove the call to `getFoldersApi` as it is no longer needed
♻️ (api.tsx): remove duplicate code for handling duplicate requests
♻️ (api.tsx): remove unnecessary code for handling duplicate requests
♻️ (api.tsx): remove unnecessary code for handling duplicate requests
♻️ (api.tsx): remove unnecessary code for handling duplicate requests
♻️ (index.ts): remove the unused `StarterProjectsType` import and the `getStarterProjects` function

 (flowsManagerStore.ts): Remove unused import of getStarterProjects function
♻️ (flowsManagerStore.ts): Refactor code to improve readability and remove unnecessary code duplication
📝 (flowsManagerStore.ts): Add comments to improve code documentation
♻️ (foldersStore.tsx): Refactor code to improve readability and remove unnecessary code duplication
📝 (foldersStore.tsx): Add comments to improve code documentation
♻️ (foldersStore.tsx): Refactor code to improve readability and remove unnecessary code duplication
📝 (foldersStore.tsx): Add comments to improve code documentation

* 📝 (api.tsx): temporarily comment out code related to duplicate request prevention to investigate a bug
🐛 (api.tsx): fix issue with duplicate request prevention logic

* 🐛 (api.tsx): fix issue with duplicate requests being made
📝 (api.tsx): add local storage to store the last URL and method called to check for duplicate requests

*  (index.tsx): add StrictMode component to enable additional React checks and warnings during development
📝 (index.tsx): wrap the entire app with StrictMode component to catch potential problems and deprecated features in the codebase

* refactor(tableComponent): remove unused functions getRowHeight, onGridReady, onFirstDataRendered, and onGridSizeChanged to improve code readability and maintainability

* Fixed naming on folders dragged from one folder to another

* removed console.log

* Added handling to check if data of request is the same

* Feat: Edit folder name with double click

* Fix: folder name not changing for a second time

* 📝 (App.tsx): add useTrackLastVisitedPath hook to track the last visited path in the app
♻️ (MenuBar/index.tsx): remove unused imports and props from MenuBar component
📝 (MenuBar/index.tsx): remove removeFunction prop from MenuBar component as it is not used
♻️ (MenuBar/index.tsx): remove unused nodes variable from MenuBar component
📝 (MenuBar/index.tsx): remove unused import of Node from reactflow in MenuBar component
♻️ (MenuBar/index.tsx): remove unused import of UPLOAD_ERROR_ALERT from alerts_constants in MenuBar component
♻️ (MenuBar/index.tsx): remove unused import of SAVED_HOVER from constants in MenuBar component
♻️ (MenuBar/index.tsx): remove unused import of ExportModal from modals/exportModal in MenuBar component
♻️ (MenuBar/index.tsx): remove unused import of ShadTooltip from shadTooltipComponent in MenuBar component
♻️ (MenuBar/index.tsx): remove unused import of Button from ui/button in MenuBar component
♻️ (MenuBar/index.tsx): remove unused import of useNavigate from react-router-dom in MenuBar component
♻️ (MenuBar/index.tsx): remove unused import of cn from utils/utils in MenuBar component
♻️ (MenuBar/index.tsx): remove unused import of IconComponent from genericIconComponent in MenuBar component
♻️ (MenuBar/index.tsx): remove unused import of useFlowsManagerStore from stores/flowsManagerStore in MenuBar component
♻️ (MenuBar/index.tsx): remove unused import of useFlowStore from stores/flowStore in MenuBar component
♻️ (MenuBar/index.tsx): remove unused import of useDarkStore from stores/darkStore in MenuBar component
♻️ (MenuBar/index.tsx): remove unused import of useAlertStore from stores/alertStore in MenuBar component
♻️ (MenuBar/index.tsx): remove unused import of useTypesStore from stores/typesStore in MenuBar component
♻️ (MenuBar/index.tsx): remove unused import of useGlobalVariablesStore from stores/globalVariables in MenuBar component
♻️ (MenuBar/index.tsx): remove unused import of useStoreStore from stores/storeStore in MenuBar component
♻️ (MenuBar/index.tsx): remove unused import of useNavigate from react-router-dom in MenuBar component
♻️ (MenuBar/index.tsx): remove unused import of useNavigate from react-router-dom in MenuBar component
♻️ (MenuBar/index.tsx): remove unused import of useNavigate from react-router-dom in MenuBar component
♻️ (MenuBar/index.tsx): remove unused import of useNavigate from react-router-dom in MenuBar component
♻️ (MenuBar/index.tsx): remove unused import of useNavigate from react-router-dom in MenuBar component
♻️ (MenuBar/index.tsx): remove unused import of useNavigate from react-router-dom in MenuBar component
♻️ (MenuBar/index.tsx): remove unused import of useNavigate from react-router-dom in MenuBar component
♻️ (MenuBar/index.tsx): remove unused import of useNavigate from react-router-dom in MenuBar component
♻️ (MenuBar/index.tsx): remove unused import of useNavigate from react-router-dom in MenuBar component
♻️ (MenuBar/index.tsx): remove unused import of useNavigate from react-router-dom in MenuBar component
♻️ (MenuBar/index.tsx): remove unused import of useNavigate from react-router-dom in MenuBar component
♻️ (MenuBar/index.tsx): remove unused import of useNavigate from react-router-dom in MenuBar component
♻️ (MenuBar/index.tsx): remove unused import of useNavigate from react-router-dom in MenuBar component
♻️ (MenuBar/index.tsx): remove unused import of useNavigate from react-router-dom in MenuBar component
♻️ (MenuBar/index.tsx): remove unused import of useNavigate from react-router-dom in MenuBar component
♻️ (MenuBar/index.tsx): remove unused import of useNavigate from react-router-dom in MenuBar component
♻️ (MenuBar/index.tsx): remove unused import of useNavigate from react-router-dom in MenuBar component
♻️ (MenuBar/index.tsx): remove unused import of useNavigate from react-router-dom in MenuBar component
♻️ (MenuBar/index.tsx): remove unused import of useNavigate from react-router-dom in MenuBar component
♻️ (MenuBar/index.tsx): remove unused import of useNavigate from react-router-dom in MenuBar component
♻️ (MenuBar/index.tsx): remove unused import of useNavigate from react-router-dom in MenuBar component
♻️ (MenuBar/index.tsx): remove unused import of useNavigate from

 (use-on-file-drop.tsx): add support for setting folderIdDragging in useFileDrop hook to track the dragged folder ID
📝 (use-on-file-drop.tsx): remove unused import and console.log statement
 (constants.ts): add LOCATIONS_TO_RETURN constant to store the list of locations to return
♻️ (parameterComponent/index.tsx): remove console.log statement
 (use-track-last-visited-path.tsx): create useTrackLastVisitedPath hook to track the last visited path
🔧 (darkStore.ts): create darkStore to manage dark mode state and fetch GitHub stars and version
♻️ (foldersStore.tsx): refactor useFolderStore to call setAllFlows after uploading flows
🔧 (locationStore.ts): create locationStore to manage route history
🔧 (storeStore.ts): create storeStore to manage store and API key state
📝 (location/index.ts): define LocationStoreType for locationStore

♻️ (utils.ts): remove unnecessary comma at the end of function parameters
♻️ (utils.ts): remove unnecessary comma at the end of function parameters
♻️ (utils.ts): remove unnecessary comma at the end of function parameters
♻️ (utils.ts): remove unnecessary comma at the end of function parameters
♻️ (utils.ts): remove unnecessary comma at the end of function parameters
♻️ (utils.ts): remove unnecessary comma at the end of function parameters
♻️ (utils.ts): remove unnecessary comma at the end of function parameters
♻️ (utils.ts): remove unnecessary comma at the end of function parameters
♻️ (utils.ts): remove unnecessary comma at the end of function parameters
♻️ (utils.ts): remove unnecessary comma at the end of function parameters
♻️ (utils.ts): remove unnecessary comma at the end of function parameters
♻️ (utils.ts): remove unnecessary comma at the end of function parameters
♻️ (utils.ts): remove unnecessary comma at the end of function parameters
♻️ (utils.ts): remove unnecessary comma at the end of function parameters
♻️ (utils.ts): remove unnecessary comma at the end of function parameters
♻️ (utils.ts): remove unnecessary comma at the end of function parameters
♻️ (utils.ts): remove unnecessary comma at the end of function parameters
♻️ (utils.ts): remove unnecessary comma at the end of function parameters
♻️ (utils.ts): remove unnecessary comma at the end of function parameters
♻️ (utils.ts): remove unnecessary comma at the end of function parameters
♻️ (utils.ts): remove unnecessary comma at the end of function parameters
♻️ (utils.ts): remove unnecessary comma at the end of function parameters
♻️ (utils.ts): remove unnecessary comma at the end of function parameters
♻️ (utils.ts): remove unnecessary comma at the end of function parameters
♻️ (utils.ts): remove unnecessary comma at the end of function parameters
♻️ (utils.ts): remove unnecessary comma at the end of function parameters
♻️ (utils.ts): remove unnecessary comma at the end of function parameters
♻️ (utils.ts): remove unnecessary comma at the end of function parameters
♻️ (utils.ts): remove unnecessary comma at the end of function parameters
♻️ (utils.ts): remove unnecessary comma at the end of function parameters
♻️ (utils.ts): remove unnecessary comma at the end of function parameters
♻️ (utils.ts): remove unnecessary comma at the end of function parameters
♻️ (utils.ts): remove unnecessary comma at the end of function parameters
♻️ (utils.ts): remove unnecessary comma at the end of function parameters
♻️ (utils.ts): remove unnecessary comma at the end of function parameters
♻️ (utils.ts): remove unnecessary comma at the end of function parameters
♻️ (utils.ts): remove unnecessary comma at the end of function parameters
♻️ (utils.ts): remove unnecessary comma at the end of function parameters
♻️ (utils.ts): remove unnecessary comma at the end of function parameters
♻️ (utils.ts): remove unnecessary comma at the end of function parameters
♻️ (utils.ts): remove unnecessary comma at the end of function parameters
♻️ (utils.ts): remove unnecessary comma at the end of function parameters
♻️ (utils.ts): remove unnecessary comma at the end of function parameters
♻️ (utils.ts): remove unnecessary comma at the end of function parameters
♻️ (utils.ts): remove unnecessary comma at the end of function parameters
♻️ (utils.ts): remove unnecessary comma at the end of function parameters
♻️ (utils.ts): remove unnecessary comma at the end of function parameters
♻️ (utils.ts): remove unnecessary comma at the end of function parameters
♻️ (utils.ts): remove unnecessary comma at the end of function parameters
♻️ (utils.ts): remove unnecessary comma at the end of function parameters
♻️ (utils.ts): remove unnecessary comma at the end of function parameters
♻️ (utils.ts): remove unnecessary comma at the end of function parameters
♻️ (utils.ts): remove unnecessary comma at the end of function parameters
♻️ (utils.ts): remove unnecessary comma at the end of function parameters
♻️ (utils.ts): remove unnecessary comma at the end of function parameters
♻️ (utils.ts): remove unnecessary comma at the end of function parameters
♻️ (utils.ts): remove unnecessary comma at the end of function parameters
♻️ (utils.ts): remove unnecessary comma at the end of function parameters
♻️ (utils.ts): remove unnecessary comma at the end of

* feat: Add useFlowStore import to sidebarComponent

* refactor(use-on-file-drop): Improve folder dragging functionality and remove unused code

* refactor(use-on-file-drop): Improve folder dragging functionality and remove unused code

* feat: Add AUTHORIZED_DUPLICATE_REQUESTS constant for authorized duplicate requests

* refactor: Update FlowPage component to handle non-existing flows and redirect to "/all"

* feat: Add AUTHORIZED_DUPLICATE_REQUESTS constant and handle duplicate requests in ApiInterceptor

* refactor: Improve folder dragging functionality and remove unused code

*  (chatInputOutput.spec.ts): remove unnecessary code related to environment variables and modals
♻️ (chatInputOutput.spec.ts): refactor code to improve readability and remove duplicated code
 (chatInputOutput.spec.ts): add test for "chat_io_teste" scenario
📝 (chatInputOutput.spec.ts): update timeout value for better test performance

 (chatInputOutputUser.spec.ts): add end-to-end test for user interaction with chat using input/output
 (globalVariables.spec.ts): fix click on icon-Globe to add new variable
 (inputListComponent.spec.ts): fix getByTestId locator for vectorstoresAstra DB and input-list-plus-btn-edit_metadata_indexing_include-*

* move doubleClick event to father div

* refactor: Improve folder dragging functionality and remove unused code

* Feat: Make input lose focus while editing a folder name and press enter or esc

* Refactor: Esc key on edit folder name cancel the edition intead of confirm it

* ⬆️ (poetry.lock): upgrade langflow-base package version from 0.0.46 to 0.0.47
⬆️ (poetry.lock): add new wheel files for lxml package versions 5.2.2 for different platforms
⬆️ (poetry.lock): add new wheel files for lxml package versions 5.2.2 for different platforms

* add alert for streamed messages on session logs

* fix stream check

* refactor: Update flowsManagerStore and reactflowUtils to use folderId parameter in createNewFlow function

* refactor(folders.py): improve folder creation logic to handle duplicate folder names more effectively
refactor(folders.py): enhance folder reading logic to handle edge cases more robustly

* chore(api): remove unused import statement in utils.py
chore(api): remove unused import statement in endpoints.py
chore(api): remove unused import statement in folders.py
refactor(vectorsearch): update field_typing import in CouchbaseSearch.py to remove unused imports and improve code readability
refactor(vectorsearch): update field names and formatting in CouchbaseSearchComponent class in CouchbaseSearch.py

* chore: Update pyproject.toml with youtube-transcript-api dependency

* chore(pyproject.toml): update assemblyai, litellm, and chromadb versions
chore(pyproject.toml): update langchain-astradb version to 0.3.0
feat(pyproject.toml): add markdown dependency at version 3.6

* feat(pyproject.toml): update dependencies versions for google-api-python-client, fake-useragent, qdrant-client, cohere, faiss-cpu, langfuse, mypy, ruff, pytest, types-requests, requests, pytest-cov, pytest-mock, pytest-xdist in the main project
feat(pyproject.toml): update dependencies versions for fastapi, langchain, sqlmodel, pydantic, pydantic-settings, pypdf, emoji in the backend base project

* refactor: Update imports and dependencies for langchain_core in langflow codebase

* refactor: Update AzureOpenAIEmbeddings and AzureChatOpenAISpecs to use SecretStr for api_key parameter

---------

Co-authored-by: Lucas Oliveira <lucas.edu.oli@hotmail.com>
Co-authored-by: Gabriel Luiz Freitas Almeida <gabriel@logspace.ai>
Co-authored-by: cristhianzl <cristhian.lousa@gmail.com>
Co-authored-by: igorrCarvalho <igorsilvabhz6@gmail.com>
Co-authored-by: ogabrielluiz <gabriel@langflow.org>
This commit is contained in:
anovazzi1 2024-05-23 22:06:38 -03:00 committed by GitHub
commit 543e8d52af
No known key found for this signature in database
GPG key ID: B5690EEEBB952194
110 changed files with 10155 additions and 10717 deletions

File diff suppressed because one or more lines are too long

692
poetry.lock generated

File diff suppressed because it is too large Load diff

View file

@ -29,20 +29,20 @@ python = ">=3.10,<3.13"
langflow-base = { path = "./src/backend/base", develop = true }
beautifulsoup4 = "^4.12.2"
google-search-results = "^2.4.1"
google-api-python-client = "^2.118.0"
google-api-python-client = "^2.130.0"
huggingface-hub = { version = "^0.20.0", extras = ["inference"] }
llama-cpp-python = { version = "~0.2.0", optional = true }
networkx = "^3.1"
fake-useragent = "^1.4.0"
fake-useragent = "^1.5.0"
psycopg2-binary = "^2.9.6"
pyarrow = "^14.0.0"
wikipedia = "^1.4.0"
qdrant-client = "^1.7.0"
qdrant-client = "^1.9.0"
weaviate-client = "*"
sentence-transformers = { version = "^2.3.1", optional = true }
ctransformers = { version = "^0.2.10", optional = true }
cohere = "^5.1.7"
faiss-cpu = "^1.7.4"
cohere = "^5.5.3"
faiss-cpu = "^1.8.0"
types-cachetools = "^5.3.0.5"
pinecone-client = "^3.0.3"
pymongo = "^4.6.0"
@ -56,7 +56,7 @@ redis = { version = "^5.0.1", optional = true }
flower = { version = "^2.0.0", optional = true }
metaphor-python = "^0.1.11"
pywin32 = { version = "^306", markers = "sys_platform == 'win32'" }
langfuse = "^2.9.0"
langfuse = "^2.33.0"
metal-sdk = "^2.5.0"
markupsafe = "^2.1.3"
# jq is not available for windows
@ -69,14 +69,12 @@ langchain-google-genai = "^1.0.1"
langchain-cohere = "^0.1.0rc1"
elasticsearch = "^8.12.0"
pytube = "^15.0.0"
llama-index = "^0.10.13"
# unstructured = { extras = ["md"], version = "^0.12.4" }
dspy-ai = "^2.4.0"
assemblyai = "^0.23.1"
litellm = "^1.34.22"
chromadb = "^0.4.24"
assemblyai = "^0.26.0"
litellm = "^1.38.0"
chromadb = "^0.5.0"
langchain-anthropic = "^0.1.6"
langchain-astradb = "^0.1.0"
langchain-astradb = "^0.3.0"
langchain-openai = "^0.1.1"
zep-python = { version = "^2.0.0rc5", allow-prereleases = true }
langchain-google-vertexai = "^1.0.3"
@ -84,26 +82,28 @@ langchain-groq = "^0.1.3"
langchain-pinecone = "^0.1.0"
langchain-mistralai = "^0.1.6"
couchbase = "^4.2.1"
youtube-transcript-api = "^0.6.2"
markdown = "^3.6"
[tool.poetry.group.dev.dependencies]
types-redis = "^4.6.0.5"
ipykernel = "^6.29.0"
mypy = "^1.9.0"
ruff = "^0.3.5"
mypy = "^1.10.0"
ruff = "^0.4.5"
httpx = "*"
pytest = "^8.1.0"
types-requests = "^2.31.0"
requests = "^2.31.0"
pytest-cov = "^4.1.0"
pytest = "^8.2.0"
types-requests = "^2.32.0"
requests = "^2.32.0"
pytest-cov = "^5.0.0"
pandas-stubs = "^2.1.4.231227"
types-pillow = "^10.2.0.20240213"
types-pyyaml = "^6.0.12.8"
types-python-jose = "^3.3.4.8"
types-passlib = "^1.7.7.13"
locust = "^2.23.1"
pytest-mock = "^3.12.0"
pytest-xdist = "^3.5.0"
pytest-mock = "^3.14.0"
pytest-xdist = "^3.6.0"
types-pywin32 = "^306.0.0.4"
types-google-cloud-ndb = "^2.2.0.0"
pytest-sugar = "^1.0.0"

View file

@ -1,4 +1,3 @@
import os
import warnings
from pathlib import Path
from typing import TYPE_CHECKING, Optional

View file

@ -1,13 +1,12 @@
from typing import TYPE_CHECKING, Any, Dict, List, Optional
from uuid import UUID
from langchain.schema import AgentAction, AgentFinish
from langchain_core.callbacks.base import AsyncCallbackHandler
from loguru import logger
from langflow.api.v1.schemas import ChatResponse, PromptResponse
from langflow.services.deps import get_chat_service, get_socket_service
from langflow.utils.util import remove_ansi_escape_codes
from langchain_core.agents import AgentAction, AgentFinish
if TYPE_CHECKING:
from langflow.services.socket.service import SocketIOService

View file

@ -19,7 +19,6 @@ from langflow.api.v1.schemas import (
UploadFileResponse,
)
from langflow.graph.graph.base import Graph
from langflow.graph.schema import RunOutputs
from langflow.interface.custom.custom_component import CustomComponent
from langflow.interface.custom.utils import build_custom_component_template
from langflow.processing.process import process_tweaks, run_graph_internal

View file

@ -3,12 +3,11 @@ from uuid import UUID
import orjson
from fastapi import APIRouter, Depends, File, HTTPException, Response, UploadFile, status
from sqlalchemy import update
from sqlalchemy import or_, update
from sqlmodel import Session, select
from langflow.api.v1.flows import create_flows
from langflow.api.v1.schemas import FlowListCreate, FlowListReadWithFolderName
from langflow.initial_setup.setup import STARTER_FOLDER_NAME
from langflow.services.auth.utils import get_current_active_user
from langflow.services.database.models.flow.model import Flow, FlowCreate, FlowRead
from langflow.services.database.models.folder.constants import DEFAULT_FOLDER_NAME
@ -35,6 +34,18 @@ def create_folder(
try:
new_folder = Folder.model_validate(folder, from_attributes=True)
new_folder.user_id = current_user.id
folder_results = session.exec(
select(Folder).where(
Folder.name.like(f"{new_folder.name}%"), # type: ignore
Folder.user_id == current_user.id,
)
)
existing_folder_names = [folder.name for folder in folder_results]
if existing_folder_names:
new_folder.name = f"{new_folder.name} ({len(existing_folder_names) + 1})"
session.add(new_folder)
session.commit()
session.refresh(new_folder)
@ -63,16 +74,11 @@ def read_folders(
current_user: User = Depends(get_current_active_user),
):
try:
folders = session.exec(select(Folder).where(Folder.user_id == current_user.id)).all()
return folders
except Exception as e:
raise HTTPException(status_code=500, detail=str(e))
@router.get("/starter-projects", response_model=FolderReadWithFlows, status_code=200)
def read_starter_folders(*, session: Session = Depends(get_session)):
try:
folders = session.exec(select(Folder).where(Folder.name == STARTER_FOLDER_NAME)).first()
folders = session.exec(
select(Folder).where(
or_(Folder.user_id == current_user.id, Folder.user_id == None) # type: ignore # noqa: E711
)
).all()
return folders
except Exception as e:
raise HTTPException(status_code=500, detail=str(e))

View file

@ -1,10 +1,10 @@
from fastapi import HTTPException
from langchain.prompts import PromptTemplate
from loguru import logger
from langflow.api.v1.base import INVALID_NAMES, check_input_variables
from langflow.interface.utils import extract_input_variables_from_prompt
from langflow.template.field.prompt import DefaultPromptField
from langchain_core.prompts import PromptTemplate
def validate_prompt(prompt_template: str, silent_errors: bool = False) -> list[str]:

View file

@ -1,10 +1,11 @@
from langchain.agents import AgentExecutor, create_json_agent
from langchain.agents import AgentExecutor
from langchain_community.agent_toolkits.json.toolkit import JsonToolkit
from langflow.field_typing import (
BaseLanguageModel,
)
from langflow.interface.custom.custom_component import CustomComponent
from langchain_community.agent_toolkits import create_json_agent
class JsonAgentComponent(CustomComponent):

View file

@ -4,15 +4,14 @@ from langchain.agents.agent import AgentExecutor
from langchain.agents.agent_toolkits.conversational_retrieval.openai_functions import _get_default_system_message
from langchain.agents.openai_functions_agent.base import OpenAIFunctionsAgent
from langchain.memory.token_buffer import ConversationTokenBufferMemory
from langchain.prompts import SystemMessagePromptTemplate
from langchain.prompts.chat import MessagesPlaceholder
from langchain.schema.memory import BaseMemory
from langchain.tools import Tool
from langchain_openai import ChatOpenAI
from langflow.field_typing.range_spec import RangeSpec
from langflow.interface.custom.custom_component import CustomComponent
from pydantic.v1 import SecretStr
from langchain_core.memory import BaseMemory
from langchain_core.prompts import MessagesPlaceholder, SystemMessagePromptTemplate
from langchain_core.tools import Tool
class ConversationalAgent(CustomComponent):

View file

@ -1,9 +1,8 @@
from typing import Optional
from langchain.embeddings.base import Embeddings
from langchain_community.embeddings import BedrockEmbeddings
from langflow.interface.custom.custom_component import CustomComponent
from langchain_core.embeddings import Embeddings
class AmazonBedrockEmeddingsComponent(CustomComponent):

View file

@ -1,7 +1,7 @@
from langchain.embeddings.base import Embeddings
from langchain_community.embeddings import AzureOpenAIEmbeddings
from langflow.interface.custom.custom_component import CustomComponent
from langchain_core.embeddings import Embeddings
from langchain_openai import AzureOpenAIEmbeddings
from pydantic.v1 import SecretStr
class AzureOpenAIEmbeddingsComponent(CustomComponent):
@ -52,12 +52,16 @@ class AzureOpenAIEmbeddingsComponent(CustomComponent):
api_version: str,
api_key: str,
) -> Embeddings:
if api_key:
azure_api_key = SecretStr(api_key)
else:
azure_api_key = None
try:
embeddings = AzureOpenAIEmbeddings(
azure_endpoint=azure_endpoint,
azure_deployment=azure_deployment,
api_version=api_version,
api_key=api_key,
api_key=azure_api_key,
)
except Exception as e:

View file

@ -1,9 +1,8 @@
from typing import Optional
from langchain.embeddings.base import Embeddings
from langchain_community.embeddings import OllamaEmbeddings
from langflow.interface.custom.custom_component import CustomComponent
from langchain_core.embeddings import Embeddings
class OllamaEmbeddingsComponent(CustomComponent):

View file

@ -51,9 +51,7 @@ class AstraDBMessageReaderComponent(BaseMemoryComponent):
Returns:
list[Record]: A list of Record objects representing the search results.
"""
memory: AstraDBChatMessageHistory = cast(
AstraDBChatMessageHistory, kwargs.get("memory")
)
memory: AstraDBChatMessageHistory = cast(AstraDBChatMessageHistory, kwargs.get("memory"))
if not memory:
raise ValueError("AstraDBChatMessageHistory instance is required.")
@ -72,9 +70,7 @@ class AstraDBMessageReaderComponent(BaseMemoryComponent):
namespace: Optional[str] = None,
) -> list[Record]:
try:
from langchain_community.chat_message_histories.astradb import (
AstraDBChatMessageHistory,
)
pass
except ImportError:
raise ImportError(
"Could not import langchain Astra DB integration package. "

View file

@ -5,7 +5,7 @@ from langflow.field_typing import Text
from langflow.schema.schema import Record
from langchain_core.messages import BaseMessage
from langchain_community.chat_message_histories.astradb import AstraDBChatMessageHistory
from langchain_astradb import AstraDBChatMessageHistory
class AstraDBMessageWriterComponent(BaseMemoryComponent):
@ -74,13 +74,15 @@ class AstraDBMessageWriterComponent(BaseMemoryComponent):
if memory is None:
raise ValueError("AstraDBChatMessageHistory instance is required.")
text_list = [BaseMessage(
content=text,
sender=sender,
sender_name=sender_name,
metadata=metadata,
session_id=session_id,
)]
text_list = [
BaseMessage(
content=text,
sender=sender,
sender_name=sender_name,
metadata=metadata,
session_id=session_id,
)
]
memory.add_messages(text_list)
@ -94,9 +96,7 @@ class AstraDBMessageWriterComponent(BaseMemoryComponent):
namespace: Optional[str] = None,
) -> Record:
try:
from langchain_community.chat_message_histories.astradb import (
AstraDBChatMessageHistory,
)
pass
except ImportError:
raise ImportError(
"Could not import langchain Astra DB integration package. "

View file

@ -1,10 +1,9 @@
from typing import Optional
from langchain.llms.base import BaseLanguageModel
from langchain_anthropic import ChatAnthropic
from pydantic.v1 import SecretStr
from langflow.interface.custom.custom_component import CustomComponent
from langchain_core.language_models import BaseLanguageModel
class ChatAntropicSpecsComponent(CustomComponent):

View file

@ -1,9 +1,9 @@
from typing import Optional
from langchain.llms.base import BaseLanguageModel
from langchain_community.chat_models.azure_openai import AzureChatOpenAI
from langflow.interface.custom.custom_component import CustomComponent
from langchain_core.language_models import BaseLanguageModel
from langchain_openai import AzureChatOpenAI
from pydantic.v1 import SecretStr
class AzureChatOpenAISpecsComponent(CustomComponent):
@ -84,13 +84,17 @@ class AzureChatOpenAISpecsComponent(CustomComponent):
temperature: float = 0.7,
max_tokens: Optional[int] = 1000,
) -> BaseLanguageModel:
if api_key:
azure_api_key = SecretStr(api_key)
else:
azure_api_key = None
try:
llm = AzureChatOpenAI(
model=model,
azure_endpoint=azure_endpoint,
azure_deployment=azure_deployment,
api_version=api_version,
api_key=api_key,
api_key=azure_api_key,
temperature=temperature,
max_tokens=max_tokens,
)

View file

@ -1,9 +1,8 @@
from typing import Optional
from langchain.schema import BaseRetriever
from langchain_community.retrievers import AmazonKendraRetriever
from langflow.interface.custom.custom_component import CustomComponent
from langchain_core.retrievers import BaseRetriever
class AmazonKendraRetrieverComponent(CustomComponent):

View file

@ -1,10 +1,9 @@
from typing import Optional
from langchain.schema import BaseRetriever
from langchain_community.retrievers import MetalRetriever
from metal_sdk.metal import Metal # type: ignore
from langflow.interface.custom.custom_component import CustomComponent
from langchain_core.retrievers import BaseRetriever
class MetalRetrieverComponent(CustomComponent):

View file

@ -1,13 +1,12 @@
import json
from typing import List
from langchain.base_language import BaseLanguageModel
from langchain.chains.query_constructor.base import AttributeInfo
from langchain.retrievers.self_query.base import SelfQueryRetriever
from langchain.schema import BaseRetriever
from langchain.schema.vectorstore import VectorStore
from langflow.interface.custom.custom_component import CustomComponent
from langchain_core.language_models import BaseLanguageModel
from langchain_core.retrievers import BaseRetriever
from langchain_core.vectorstores import VectorStore
class VectaraSelfQueryRetriverComponent(CustomComponent):

View file

@ -1,10 +1,9 @@
from typing import List
from langchain.text_splitter import CharacterTextSplitter
from langflow.interface.custom.custom_component import CustomComponent
from langflow.schema.schema import Record
from langflow.utils.util import unescape_string
from langchain_text_splitters import CharacterTextSplitter
class CharacterTextSplitterComponent(CustomComponent):

View file

@ -1,9 +1,8 @@
from typing import List, Optional
from langchain.text_splitter import Language
from langflow.interface.custom.custom_component import CustomComponent
from langflow.schema.schema import Record
from langchain_text_splitters import Language, RecursiveCharacterTextSplitter
class LanguageRecursiveTextSplitterComponent(CustomComponent):
@ -61,7 +60,6 @@ class LanguageRecursiveTextSplitterComponent(CustomComponent):
Returns:
list[str]: The chunks of text.
"""
from langchain.text_splitter import RecursiveCharacterTextSplitter
# Make sure chunk_size and chunk_overlap are ints
if isinstance(chunk_size, str):

View file

@ -1,11 +1,10 @@
from typing import Optional
from langchain.text_splitter import RecursiveCharacterTextSplitter
from langchain_core.documents import Document
from langflow.interface.custom.custom_component import CustomComponent
from langflow.schema import Record
from langflow.utils.util import build_loader_repr_from_records, unescape_string
from langchain_text_splitters import RecursiveCharacterTextSplitter
class RecursiveCharacterTextSplitterComponent(CustomComponent):

View file

@ -1,11 +1,9 @@
from typing import List, Union
from langchain.agents import tool
from langchain.agents.agent_toolkits.base import BaseToolkit
from langchain.tools import Tool
from metaphor_python import Metaphor # type: ignore
from langflow.interface.custom.custom_component import CustomComponent
from langchain_community.agent_toolkits.base import BaseToolkit
from langchain_core.tools import Tool, tool
class MetaphorToolkit(CustomComponent):

View file

@ -1,7 +1,7 @@
from langchain.agents.agent_toolkits.vectorstore.toolkit import VectorStoreInfo
from langchain_community.vectorstores import VectorStore
from langflow.interface.custom.custom_component import CustomComponent
from langchain_core.vectorstores import VectorStore
class VectorStoreInfoComponent(CustomComponent):

View file

@ -1,10 +1,9 @@
import importlib
from langchain.agents import Tool
from langchain_experimental.utilities import PythonREPL
from langflow.base.tools.base import build_status_from_tool
from langflow.custom import CustomComponent
from langchain_core.tools import Tool
class PythonREPLToolComponent(CustomComponent):

View file

@ -1,8 +1,8 @@
from typing import List, Optional
from typing import List
from langflow.components.vectorstores.base.model import LCVectorStoreComponent
from langflow.components.vectorstores.Couchbase import CouchbaseComponent
from langflow.field_typing import Embeddings, NestedDict, Text
from langflow.field_typing import Embeddings, Text
from langflow.schema import Record
@ -25,17 +25,13 @@ class CouchbaseSearchComponent(LCVectorStoreComponent):
return {
"input_value": {"display_name": "Input"},
"embedding": {"display_name": "Embedding"},
"couchbase_connection_string": {"display_name": "Couchbase Cluster connection string","required": True},
"couchbase_username": {"display_name": "Couchbase username","required": True},
"couchbase_password": {
"display_name": "Couchbase password",
"password": True,
"required": True
},
"bucket_name": {"display_name": "Bucket Name","required": True},
"scope_name": {"display_name": "Scope Name","required": True},
"collection_name": {"display_name": "Collection Name","required": True},
"index_name": {"display_name": "Index Name","required": True},
"couchbase_connection_string": {"display_name": "Couchbase Cluster connection string", "required": True},
"couchbase_username": {"display_name": "Couchbase username", "required": True},
"couchbase_password": {"display_name": "Couchbase password", "password": True, "required": True},
"bucket_name": {"display_name": "Bucket Name", "required": True},
"scope_name": {"display_name": "Scope Name", "required": True},
"collection_name": {"display_name": "Collection Name", "required": True},
"index_name": {"display_name": "Index Name", "required": True},
"number_of_results": {
"display_name": "Number of Results",
"info": "Number of results to return.",

View file

@ -1,11 +1,10 @@
from typing import List, Optional
from langchain.embeddings.base import Embeddings
from langflow.components.vectorstores.base.model import LCVectorStoreComponent
from langflow.components.vectorstores.Redis import RedisComponent
from langflow.field_typing import Text
from langflow.schema import Record
from langchain_core.embeddings import Embeddings
class RedisSearchComponent(RedisComponent, LCVectorStoreComponent):

View file

@ -1,11 +1,10 @@
from typing import List, Optional
from langchain.embeddings.base import Embeddings
from langflow.components.vectorstores.base.model import LCVectorStoreComponent
from langflow.components.vectorstores.Weaviate import WeaviateVectorStoreComponent
from langflow.field_typing import Text
from langflow.schema import Record
from langchain_core.embeddings import Embeddings
class WeaviateSearchVectorStore(WeaviateVectorStoreComponent, LCVectorStoreComponent):

View file

@ -1,11 +1,10 @@
from typing import List
from langchain.embeddings.base import Embeddings
from langflow.components.vectorstores.base.model import LCVectorStoreComponent
from langflow.components.vectorstores.pgvector import PGVectorComponent
from langflow.field_typing import Text
from langflow.schema import Record
from langchain_core.embeddings import Embeddings
class PGVectorSearchComponent(PGVectorComponent, LCVectorStoreComponent):

View file

@ -1,12 +1,11 @@
from typing import List, Optional, Union
from langchain.schema import BaseRetriever
from langchain_astradb import AstraDBVectorStore
from langchain_astradb.utils.astradb import SetupMode
from langflow.custom import CustomComponent
from langflow.field_typing import Embeddings, VectorStore
from langflow.schema import Record
from langchain_core.retrievers import BaseRetriever
class AstraDBVectorStoreComponent(CustomComponent):

View file

@ -1,13 +1,13 @@
from typing import List, Optional, Union
import chromadb # type: ignore
from langchain.embeddings.base import Embeddings
from langchain.schema import BaseRetriever
from langchain_community.vectorstores import VectorStore
from langchain_community.vectorstores.chroma import Chroma
from langflow.interface.custom.custom_component import CustomComponent
from langflow.schema.schema import Record
from langchain_core.embeddings import Embeddings
from langchain_core.retrievers import BaseRetriever
from langchain_core.vectorstores import VectorStore
class ChromaComponent(CustomComponent):

View file

@ -1,8 +1,6 @@
from typing import List, Optional, Union
from langchain.schema import BaseRetriever
from langchain_community.vectorstores import CouchbaseVectorStore
from langchain_community.vectorstores import CouchbaseVectorStore
from langflow.custom import CustomComponent
from langflow.field_typing import Embeddings, VectorStore
@ -10,9 +8,10 @@ from langflow.schema import Record
from datetime import timedelta
from couchbase.auth import PasswordAuthenticator # type: ignore
from couchbase.cluster import Cluster # type: ignore
from couchbase.options import ClusterOptions # type: ignore
from couchbase.auth import PasswordAuthenticator # type: ignore
from couchbase.cluster import Cluster # type: ignore
from couchbase.options import ClusterOptions # type: ignore
from langchain_core.retrievers import BaseRetriever
class CouchbaseComponent(CustomComponent):
@ -34,17 +33,13 @@ class CouchbaseComponent(CustomComponent):
return {
"inputs": {"display_name": "Input", "input_types": ["Document", "Record"]},
"embedding": {"display_name": "Embedding"},
"couchbase_connection_string": {"display_name": "Couchbase Cluster connection string","required": True},
"couchbase_username": {"display_name": "Couchbase username","required": True},
"couchbase_password": {
"display_name": "Couchbase password",
"password": True,
"required": True
},
"bucket_name": {"display_name": "Bucket Name","required": True},
"scope_name": {"display_name": "Scope Name","required": True},
"collection_name": {"display_name": "Collection Name","required": True},
"index_name": {"display_name": "Index Name","required": True},
"couchbase_connection_string": {"display_name": "Couchbase Cluster connection string", "required": True},
"couchbase_username": {"display_name": "Couchbase username", "required": True},
"couchbase_password": {"display_name": "Couchbase password", "password": True, "required": True},
"bucket_name": {"display_name": "Bucket Name", "required": True},
"scope_name": {"display_name": "Scope Name", "required": True},
"collection_name": {"display_name": "Collection Name", "required": True},
"index_name": {"display_name": "Index Name", "required": True},
}
def build(

View file

@ -1,12 +1,11 @@
from typing import List, Text, Union
from langchain.schema import BaseRetriever
from langchain_community.vectorstores import VectorStore
from langchain_community.vectorstores.faiss import FAISS
from langflow.field_typing import Embeddings
from langflow.interface.custom.custom_component import CustomComponent
from langflow.schema.schema import Record
from langchain_core.retrievers import BaseRetriever
from langchain_core.vectorstores import VectorStore
class FAISSComponent(CustomComponent):

View file

@ -1,7 +1,4 @@
from typing import List, Optional, Union
from langchain.schema import BaseRetriever
from langchain_community.vectorstores import VectorStore
from langchain_core.documents import Document
from langchain_pinecone._utilities import DistanceStrategy
from langchain_pinecone.vectorstores import PineconeVectorStore
@ -9,6 +6,8 @@ from langchain_pinecone.vectorstores import PineconeVectorStore
from langflow.field_typing import Embeddings
from langflow.interface.custom.custom_component import CustomComponent
from langflow.schema.schema import Record
from langchain_core.retrievers import BaseRetriever
from langchain_core.vectorstores import VectorStore
class PineconeComponent(CustomComponent):

View file

@ -1,12 +1,11 @@
from typing import Optional, Union
from langchain.schema import BaseRetriever
from langchain_community.vectorstores import VectorStore
from langchain_community.vectorstores.qdrant import Qdrant
from langflow.field_typing import Embeddings
from langflow.interface.custom.custom_component import CustomComponent
from langflow.schema.schema import Record
from langchain_core.retrievers import BaseRetriever
from langchain_core.vectorstores import VectorStore
class QdrantComponent(CustomComponent):

View file

@ -1,12 +1,11 @@
from typing import Optional, Union
from langchain.embeddings.base import Embeddings
from langchain_community.vectorstores import VectorStore
from langchain_community.vectorstores.redis import Redis
from langchain_core.retrievers import BaseRetriever
from langflow.interface.custom.custom_component import CustomComponent
from langflow.schema.schema import Record
from langchain_core.embeddings import Embeddings
from langchain_core.vectorstores import VectorStore
class RedisComponent(CustomComponent):

View file

@ -1,13 +1,12 @@
from typing import List, Optional, Union
from langchain.schema import BaseRetriever
from langchain_community.vectorstores import VectorStore
from langchain_community.vectorstores.supabase import SupabaseVectorStore
from supabase.client import Client, create_client
from langflow.field_typing import Embeddings
from langflow.interface.custom.custom_component import CustomComponent
from langflow.schema.schema import Record
from langchain_core.retrievers import BaseRetriever
from langchain_core.vectorstores import VectorStore
class SupabaseComponent(CustomComponent):

View file

@ -1,13 +1,14 @@
from typing import Optional, Union
import weaviate # type: ignore
from langchain.embeddings.base import Embeddings
from langchain.schema import BaseRetriever
from langchain_community.vectorstores import VectorStore, Weaviate
from langchain_community.vectorstores import Weaviate
from langchain_core.documents import Document
from langflow.interface.custom.custom_component import CustomComponent
from langflow.schema.schema import Record
from langchain_core.embeddings import Embeddings
from langchain_core.retrievers import BaseRetriever
from langchain_core.vectorstores import VectorStore
class WeaviateVectorStoreComponent(CustomComponent):

View file

@ -1,12 +1,11 @@
from typing import Optional, Union
from langchain.embeddings.base import Embeddings
from langchain_community.vectorstores import VectorStore
from langchain_community.vectorstores.pgvector import PGVector
from langchain_core.retrievers import BaseRetriever
from langflow.interface.custom.custom_component import CustomComponent
from langflow.schema.schema import Record
from langchain_core.embeddings import Embeddings
from langchain_core.vectorstores import VectorStore
class PGVectorComponent(CustomComponent):

View file

@ -2,17 +2,18 @@ from typing import Callable, Dict, Text, Union
from langchain.agents.agent import AgentExecutor
from langchain.chains.base import Chain
from langchain.document_loaders.base import BaseLoader
from langchain.llms.base import BaseLLM
from langchain.memory.chat_memory import BaseChatMemory
from langchain.prompts import BasePromptTemplate, ChatPromptTemplate, PromptTemplate
from langchain.schema import BaseOutputParser, BaseRetriever, Document
from langchain.schema.embeddings import Embeddings
from langchain.schema.language_model import BaseLanguageModel
from langchain.schema.memory import BaseMemory
from langchain.text_splitter import TextSplitter
from langchain.tools import Tool
from langchain_community.vectorstores import VectorStore
from langchain_core.document_loaders import BaseLoader
from langchain_core.documents import Document
from langchain_core.embeddings import Embeddings
from langchain_core.language_models import BaseLLM, BaseLanguageModel
from langchain_core.memory import BaseMemory
from langchain_core.output_parsers import BaseOutputParser
from langchain_core.prompts import BasePromptTemplate, ChatPromptTemplate, PromptTemplate
from langchain_core.retrievers import BaseRetriever
from langchain_core.tools import Tool
from langchain_core.vectorstores import VectorStore
from langchain_text_splitters import TextSplitter
# Type alias for more complex dicts
NestedDict = Dict[str, Union[str, Dict]]

File diff suppressed because one or more lines are too long

View file

@ -5,7 +5,6 @@ from langchain.agents.agent_toolkits import VectorStoreInfo, VectorStoreRouterTo
from langchain.agents.agent_toolkits.vectorstore.prompt import PREFIX as VECTORSTORE_PREFIX
from langchain.agents.agent_toolkits.vectorstore.prompt import ROUTER_PREFIX as VECTORSTORE_ROUTER_PREFIX
from langchain.agents.mrkl.prompt import FORMAT_INSTRUCTIONS
from langchain.base_language import BaseLanguageModel
from langchain.chains.llm import LLMChain
from langchain_community.utilities import SQLDatabase
from langchain.tools.sql_database.prompt import QUERY_CHECKER
@ -18,6 +17,14 @@ from langchain_experimental.agents.agent_toolkits.pandas.prompt import SUFFIX_WI
from langchain_experimental.tools.python.tool import PythonAstREPLTool
from langflow.interface.base import CustomAgentExecutor
from langchain_community.tools import (
InfoSQLDatabaseTool,
ListSQLDatabaseTool,
QuerySQLCheckerTool,
QuerySQLDataBaseTool,
)
from langchain_core.language_models import BaseLanguageModel
from langchain_core.prompts import PromptTemplate
class JsonAgent(CustomAgentExecutor):
@ -165,17 +172,6 @@ class SQLAgent(CustomAgentExecutor):
db = SQLDatabase.from_uri(database_uri)
toolkit = SQLDatabaseToolkit(db=db, llm=llm)
# The right code should be this, but there is a problem with tools = toolkit.get_tools()
# related to `OPENAI_API_KEY`
# return create_sql_agent(llm=llm, toolkit=toolkit, verbose=True)
from langchain.prompts import PromptTemplate
from langchain.tools.sql_database.tool import (
InfoSQLDatabaseTool,
ListSQLDatabaseTool,
QuerySQLCheckerTool,
QuerySQLDataBaseTool,
)
llmchain = LLMChain(
llm=llm,
prompt=PromptTemplate(template=QUERY_CHECKER, input_variables=["query", "dialect"]),

View file

@ -1,9 +1,9 @@
from langchain.chains.llm import LLMChain
from langchain.agents import AgentExecutor, ZeroShotAgent
from langchain.agents.agent_toolkits.json.prompt import JSON_PREFIX, JSON_SUFFIX
from langchain.agents.agent_toolkits.json.toolkit import JsonToolkit
from langchain.agents.mrkl.prompt import FORMAT_INSTRUCTIONS
from langchain.base_language import BaseLanguageModel
from langchain_community.agent_toolkits import JsonToolkit
from langchain_core.language_models import BaseLanguageModel
class MalfoyAgent(AgentExecutor):

View file

@ -1,14 +1,13 @@
from typing import Dict, Optional, Type, Union
from langchain.base_language import BaseLanguageModel
from langchain.chains import ConversationChain
from langchain.chains.question_answering import load_qa_chain
from langchain.memory.buffer import ConversationBufferMemory
from langchain.schema import BaseMemory
from pydantic.v1 import Field, root_validator
from langflow.interface.base import CustomChain
from langflow.interface.utils import extract_input_variables_from_prompt
from langchain_core.language_models import BaseLanguageModel
from langchain_core.memory import BaseMemory
DEFAULT_SUFFIX = """"
Current conversation:

View file

@ -3,11 +3,13 @@ from typing import Any
from langchain import llms, memory, text_splitter
from langchain_community import agent_toolkits, document_loaders, embeddings
from langchain_community.chat_models import AzureChatOpenAI, ChatAnthropic, ChatOpenAI, ChatVertexAI
from langchain_community.chat_models import ChatVertexAI
from langflow.interface.agents.custom import CUSTOM_AGENTS
from langflow.interface.chains.custom import CUSTOM_CHAINS
from langflow.interface.importing.utils import import_class
from langchain_anthropic import ChatAnthropic
from langchain_openai import AzureChatOpenAI, ChatOpenAI
# LLMs
llm_type_to_cls_dict = {}

View file

@ -4,13 +4,13 @@ import importlib
from typing import Any, Type
from langchain.agents import Agent
from langchain.base_language import BaseLanguageModel
from langchain.chains.base import Chain
from langchain.prompts import PromptTemplate
from langchain.tools import BaseTool
from langchain_core.language_models.chat_models import BaseChatModel
from langflow.interface.wrappers.base import wrapper_creator
from langchain_core.language_models import BaseLanguageModel
from langchain_core.prompts import PromptTemplate
from langchain_core.tools import BaseTool
def import_module(module_path: str) -> Any:

View file

@ -6,11 +6,7 @@ from typing import TYPE_CHECKING, Any, Callable, Dict, Sequence, Type
import orjson
from langchain.agents import agent as agent_module
from langchain.agents.agent import AgentExecutor
from langchain.agents.agent_toolkits.base import BaseToolkit
from langchain.agents.tools import BaseTool
from langchain.chains.base import Chain
from langchain.document_loaders.base import BaseLoader
from langchain_community.vectorstores import VectorStore
from langchain_core.documents import Document
from loguru import logger
from pydantic import ValidationError
@ -27,6 +23,11 @@ from langflow.interface.wrappers.base import wrapper_creator
from langflow.schema.schema import Record
from langflow.utils import validate
from langflow.utils.util import unescape_string
from langchain_community.agent_toolkits.base import BaseToolkit
from langchain_core.document_loaders import BaseLoader
from langchain_core.tools import BaseTool
from langchain_core.vectorstores import VectorStore
from langchain_text_splitters import Language
if TYPE_CHECKING:
from langflow.custom import CustomComponent
@ -430,8 +431,6 @@ def instantiate_textsplitter(
params["separators"] = [unescape_string(separator) for separator in params["separators"]]
text_splitter = class_object(**params)
else:
from langchain.text_splitter import Language
language = params.pop("separator_type", None)
params["language"] = Language(language)
params.pop("separators", None)

View file

@ -4,9 +4,10 @@ from typing import Any, Dict, List
import orjson
from langchain.agents import ZeroShotAgent
from langchain.schema import BaseOutputParser, Document
from langflow.services.database.models.base import orjson_dumps
from langchain_core.documents import Document
from langchain_core.output_parsers import BaseOutputParser
def handle_node_type(node_type, class_object, params: Dict):

View file

@ -6,12 +6,12 @@ from langchain_community.vectorstores import (
FAISS,
Chroma,
MongoDBAtlasVectorSearch,
Pinecone,
Qdrant,
SupabaseVectorStore,
Weaviate,
)
from langchain_core.documents import Document
from langchain_pinecone import Pinecone
def docs_in_params(params: dict) -> bool:

View file

@ -1,9 +1,8 @@
from typing import Dict, List, Optional, Type
from langchain.prompts import PromptTemplate
from pydantic.v1 import root_validator
from langflow.interface.utils import extract_input_variables_from_prompt
from langchain_core.prompts import PromptTemplate
# Steps to create a BaseCustomPrompt:
# 1. Create a prompt template that endes with:

View file

@ -1,10 +1,10 @@
from langchain import tools
from langchain.agents import Tool
from langchain.agents.load_tools import _BASE_TOOLS, _EXTRA_LLM_TOOLS, _EXTRA_OPTIONAL_TOOLS, _LLM_TOOLS
from langchain_community.tools.json.tool import JsonSpec
from langflow.interface.importing.utils import import_class
from langflow.interface.tools.custom import PythonFunctionTool
from langchain_core.tools import Tool
FILE_TOOLS = {"JsonSpec": JsonSpec}
CUSTOM_TOOLS = {

View file

@ -1,10 +1,9 @@
from typing import Callable, Optional
from langchain.agents.tools import Tool
from pydantic.v1 import BaseModel, validator
from langflow.interface.custom.utils import get_function
from langflow.utils import validate
from langchain_core.tools import Tool
class Function(BaseModel):

View file

@ -2,8 +2,7 @@ import ast
import inspect
import textwrap
from typing import Dict, Union
from langchain.agents.tools import Tool
from langchain_core.tools import Tool
def get_func_tool_params(func, **kwargs) -> Union[Dict, None]:

View file

@ -7,12 +7,12 @@ from typing import Dict
import yaml
from docstring_parser import parse
from langchain.base_language import BaseLanguageModel
from langflow.services.chat.config import ChatConfig
from langflow.services.deps import get_settings_service
from langflow.utils.util import format_dict, get_base_classes, get_default_factory
from loguru import logger
from PIL.Image import Image
from langchain_core.language_models import BaseLanguageModel
def load_file_into_dict(file_path: str) -> dict:

View file

@ -1,11 +1,11 @@
from typing import TYPE_CHECKING, List, Union
from langchain.agents.agent import AgentExecutor
from langchain.callbacks.base import BaseCallbackHandler
from loguru import logger
from langflow.processing.process import fix_memory_inputs, format_actions
from langflow.services.deps import get_plugins_service
from langchain_core.callbacks import BaseCallbackHandler
if TYPE_CHECKING:
from langfuse.callback import CallbackHandler # type: ignore

View file

@ -2,7 +2,6 @@ from typing import TYPE_CHECKING, Any, Dict, List, Optional, Tuple, Union
from langchain.agents import AgentExecutor
from langchain.schema import AgentAction
from loguru import logger
from pydantic import BaseModel
@ -13,6 +12,7 @@ from langflow.interface.run import get_memory_key, update_memory_keys
from langflow.schema.graph import InputValue, Tweaks
from langflow.schema.schema import INPUT_FIELD_NAME
from langflow.services.session.service import SessionService
from langchain_core.agents import AgentAction
if TYPE_CHECKING:

View file

@ -1,7 +1,6 @@
from langchain.text_splitter import Language
from langflow.template.field.base import TemplateField
from langflow.template.frontend_node.base import FrontendNode
from langchain_text_splitters import Language
class TextSplittersFrontendNode(FrontendNode):

View file

@ -545,6 +545,26 @@ files = [
graph = ["objgraph (>=1.7.2)"]
profile = ["gprof2dot (>=2022.7.29)"]
[[package]]
name = "dnspython"
version = "2.6.1"
description = "DNS toolkit"
optional = false
python-versions = ">=3.8"
files = [
{file = "dnspython-2.6.1-py3-none-any.whl", hash = "sha256:5ef3b9680161f6fa89daf8ad451b5f1a33b18ae8a1c6778cdf4b43f08c0a6e50"},
{file = "dnspython-2.6.1.tar.gz", hash = "sha256:e8f0f9c23a7b7cb99ded64e6c3a6f3e701d78f50c55e002b839dea7225cff7cc"},
]
[package.extras]
dev = ["black (>=23.1.0)", "coverage (>=7.0)", "flake8 (>=7)", "mypy (>=1.8)", "pylint (>=3)", "pytest (>=7.4)", "pytest-cov (>=4.1.0)", "sphinx (>=7.2.0)", "twine (>=4.0.0)", "wheel (>=0.42.0)"]
dnssec = ["cryptography (>=41)"]
doh = ["h2 (>=4.1.0)", "httpcore (>=1.0.0)", "httpx (>=0.26.0)"]
doq = ["aioquic (>=0.9.25)"]
idna = ["idna (>=3.6)"]
trio = ["trio (>=0.23)"]
wmi = ["wmi (>=1.5.1)"]
[[package]]
name = "docstring-parser"
version = "0.15"
@ -630,6 +650,21 @@ six = ">=1.9.0"
gmpy = ["gmpy"]
gmpy2 = ["gmpy2"]
[[package]]
name = "email-validator"
version = "2.1.1"
description = "A robust email address syntax and deliverability validation library."
optional = false
python-versions = ">=3.8"
files = [
{file = "email_validator-2.1.1-py3-none-any.whl", hash = "sha256:97d882d174e2a65732fb43bfce81a3a834cbc1bde8bf419e30ef5ea976370a05"},
{file = "email_validator-2.1.1.tar.gz", hash = "sha256:200a70680ba08904be6d1eef729205cc0d687634399a5924d842533efb824b84"},
]
[package.dependencies]
dnspython = ">=2.0.0"
idna = ">=2.0.0"
[[package]]
name = "emoji"
version = "2.12.1"
@ -663,23 +698,48 @@ test = ["pytest (>=6)"]
[[package]]
name = "fastapi"
version = "0.110.3"
version = "0.111.0"
description = "FastAPI framework, high performance, easy to learn, fast to code, ready for production"
optional = false
python-versions = ">=3.8"
files = [
{file = "fastapi-0.110.3-py3-none-any.whl", hash = "sha256:fd7600612f755e4050beb74001310b5a7e1796d149c2ee363124abdfa0289d32"},
{file = "fastapi-0.110.3.tar.gz", hash = "sha256:555700b0159379e94fdbfc6bb66a0f1c43f4cf7060f25239af3d84b63a656626"},
{file = "fastapi-0.111.0-py3-none-any.whl", hash = "sha256:97ecbf994be0bcbdadedf88c3150252bed7b2087075ac99735403b1b76cc8fc0"},
{file = "fastapi-0.111.0.tar.gz", hash = "sha256:b9db9dd147c91cb8b769f7183535773d8741dd46f9dc6676cd82eab510228cd7"},
]
[package.dependencies]
email_validator = ">=2.0.0"
fastapi-cli = ">=0.0.2"
httpx = ">=0.23.0"
jinja2 = ">=2.11.2"
orjson = ">=3.2.1"
pydantic = ">=1.7.4,<1.8 || >1.8,<1.8.1 || >1.8.1,<2.0.0 || >2.0.0,<2.0.1 || >2.0.1,<2.1.0 || >2.1.0,<3.0.0"
python-multipart = ">=0.0.7"
starlette = ">=0.37.2,<0.38.0"
typing-extensions = ">=4.8.0"
ujson = ">=4.0.1,<4.0.2 || >4.0.2,<4.1.0 || >4.1.0,<4.2.0 || >4.2.0,<4.3.0 || >4.3.0,<5.0.0 || >5.0.0,<5.1.0 || >5.1.0"
uvicorn = {version = ">=0.12.0", extras = ["standard"]}
[package.extras]
all = ["email_validator (>=2.0.0)", "httpx (>=0.23.0)", "itsdangerous (>=1.1.0)", "jinja2 (>=2.11.2)", "orjson (>=3.2.1)", "pydantic-extra-types (>=2.0.0)", "pydantic-settings (>=2.0.0)", "python-multipart (>=0.0.7)", "pyyaml (>=5.3.1)", "ujson (>=4.0.1,!=4.0.2,!=4.1.0,!=4.2.0,!=4.3.0,!=5.0.0,!=5.1.0)", "uvicorn[standard] (>=0.12.0)"]
[[package]]
name = "fastapi-cli"
version = "0.0.4"
description = "Run and manage FastAPI apps from the command line with FastAPI CLI. 🚀"
optional = false
python-versions = ">=3.8"
files = [
{file = "fastapi_cli-0.0.4-py3-none-any.whl", hash = "sha256:a2552f3a7ae64058cdbb530be6fa6dbfc975dc165e4fa66d224c3d396e25e809"},
{file = "fastapi_cli-0.0.4.tar.gz", hash = "sha256:e2e9ffaffc1f7767f488d6da34b6f5a377751c996f397902eb6abb99a67bde32"},
]
[package.dependencies]
typer = ">=0.12.3"
[package.extras]
standard = ["fastapi", "uvicorn[standard] (>=0.15.0)"]
[[package]]
name = "frozenlist"
version = "1.4.1"
@ -890,6 +950,54 @@ http2 = ["h2 (>=3,<5)"]
socks = ["socksio (==1.*)"]
trio = ["trio (>=0.22.0,<0.26.0)"]
[[package]]
name = "httptools"
version = "0.6.1"
description = "A collection of framework independent HTTP protocol utils."
optional = false
python-versions = ">=3.8.0"
files = [
{file = "httptools-0.6.1-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:d2f6c3c4cb1948d912538217838f6e9960bc4a521d7f9b323b3da579cd14532f"},
{file = "httptools-0.6.1-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:00d5d4b68a717765b1fabfd9ca755bd12bf44105eeb806c03d1962acd9b8e563"},
{file = "httptools-0.6.1-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:639dc4f381a870c9ec860ce5c45921db50205a37cc3334e756269736ff0aac58"},
{file = "httptools-0.6.1-cp310-cp310-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:e57997ac7fb7ee43140cc03664de5f268813a481dff6245e0075925adc6aa185"},
{file = "httptools-0.6.1-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:0ac5a0ae3d9f4fe004318d64b8a854edd85ab76cffbf7ef5e32920faef62f142"},
{file = "httptools-0.6.1-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:3f30d3ce413088a98b9db71c60a6ada2001a08945cb42dd65a9a9fe228627658"},
{file = "httptools-0.6.1-cp310-cp310-win_amd64.whl", hash = "sha256:1ed99a373e327f0107cb513b61820102ee4f3675656a37a50083eda05dc9541b"},
{file = "httptools-0.6.1-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:7a7ea483c1a4485c71cb5f38be9db078f8b0e8b4c4dc0210f531cdd2ddac1ef1"},
{file = "httptools-0.6.1-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:85ed077c995e942b6f1b07583e4eb0a8d324d418954fc6af913d36db7c05a5a0"},
{file = "httptools-0.6.1-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:8b0bb634338334385351a1600a73e558ce619af390c2b38386206ac6a27fecfc"},
{file = "httptools-0.6.1-cp311-cp311-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:7d9ceb2c957320def533671fc9c715a80c47025139c8d1f3797477decbc6edd2"},
{file = "httptools-0.6.1-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:4f0f8271c0a4db459f9dc807acd0eadd4839934a4b9b892f6f160e94da309837"},
{file = "httptools-0.6.1-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:6a4f5ccead6d18ec072ac0b84420e95d27c1cdf5c9f1bc8fbd8daf86bd94f43d"},
{file = "httptools-0.6.1-cp311-cp311-win_amd64.whl", hash = "sha256:5cceac09f164bcba55c0500a18fe3c47df29b62353198e4f37bbcc5d591172c3"},
{file = "httptools-0.6.1-cp312-cp312-macosx_10_9_universal2.whl", hash = "sha256:75c8022dca7935cba14741a42744eee13ba05db00b27a4b940f0d646bd4d56d0"},
{file = "httptools-0.6.1-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:48ed8129cd9a0d62cf4d1575fcf90fb37e3ff7d5654d3a5814eb3d55f36478c2"},
{file = "httptools-0.6.1-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:6f58e335a1402fb5a650e271e8c2d03cfa7cea46ae124649346d17bd30d59c90"},
{file = "httptools-0.6.1-cp312-cp312-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:93ad80d7176aa5788902f207a4e79885f0576134695dfb0fefc15b7a4648d503"},
{file = "httptools-0.6.1-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:9bb68d3a085c2174c2477eb3ffe84ae9fb4fde8792edb7bcd09a1d8467e30a84"},
{file = "httptools-0.6.1-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:b512aa728bc02354e5ac086ce76c3ce635b62f5fbc32ab7082b5e582d27867bb"},
{file = "httptools-0.6.1-cp312-cp312-win_amd64.whl", hash = "sha256:97662ce7fb196c785344d00d638fc9ad69e18ee4bfb4000b35a52efe5adcc949"},
{file = "httptools-0.6.1-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:8e216a038d2d52ea13fdd9b9c9c7459fb80d78302b257828285eca1c773b99b3"},
{file = "httptools-0.6.1-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:3e802e0b2378ade99cd666b5bffb8b2a7cc8f3d28988685dc300469ea8dd86cb"},
{file = "httptools-0.6.1-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:4bd3e488b447046e386a30f07af05f9b38d3d368d1f7b4d8f7e10af85393db97"},
{file = "httptools-0.6.1-cp38-cp38-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:fe467eb086d80217b7584e61313ebadc8d187a4d95bb62031b7bab4b205c3ba3"},
{file = "httptools-0.6.1-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:3c3b214ce057c54675b00108ac42bacf2ab8f85c58e3f324a4e963bbc46424f4"},
{file = "httptools-0.6.1-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:8ae5b97f690badd2ca27cbf668494ee1b6d34cf1c464271ef7bfa9ca6b83ffaf"},
{file = "httptools-0.6.1-cp38-cp38-win_amd64.whl", hash = "sha256:405784577ba6540fa7d6ff49e37daf104e04f4b4ff2d1ac0469eaa6a20fde084"},
{file = "httptools-0.6.1-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:95fb92dd3649f9cb139e9c56604cc2d7c7bf0fc2e7c8d7fbd58f96e35eddd2a3"},
{file = "httptools-0.6.1-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:dcbab042cc3ef272adc11220517278519adf8f53fd3056d0e68f0a6f891ba94e"},
{file = "httptools-0.6.1-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:0cf2372e98406efb42e93bfe10f2948e467edfd792b015f1b4ecd897903d3e8d"},
{file = "httptools-0.6.1-cp39-cp39-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:678fcbae74477a17d103b7cae78b74800d795d702083867ce160fc202104d0da"},
{file = "httptools-0.6.1-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:e0b281cf5a125c35f7f6722b65d8542d2e57331be573e9e88bc8b0115c4a7a81"},
{file = "httptools-0.6.1-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:95658c342529bba4e1d3d2b1a874db16c7cca435e8827422154c9da76ac4e13a"},
{file = "httptools-0.6.1-cp39-cp39-win_amd64.whl", hash = "sha256:7ebaec1bf683e4bf5e9fbb49b8cc36da482033596a415b3e4ebab5a4c0d7ec5e"},
{file = "httptools-0.6.1.tar.gz", hash = "sha256:c6e26c30455600b95d94b1b836085138e82f177351454ee841c148f93a9bad5a"},
]
[package.extras]
test = ["Cython (>=0.29.24,<0.30.0)"]
[[package]]
name = "httpx"
version = "0.27.0"
@ -925,6 +1033,23 @@ files = [
{file = "idna-3.7.tar.gz", hash = "sha256:028ff3aadf0609c1fd278d8ea3089299412a7a8b9bd005dd08b9f8285bcb5cfc"},
]
[[package]]
name = "jinja2"
version = "3.1.4"
description = "A very fast and expressive template engine."
optional = false
python-versions = ">=3.7"
files = [
{file = "jinja2-3.1.4-py3-none-any.whl", hash = "sha256:bc5dd2abb727a5319567b7a813e6a2e7318c39f4f487cfe6c89c6f9c7d25197d"},
{file = "jinja2-3.1.4.tar.gz", hash = "sha256:4a3aee7acbbe7303aede8e9648d13b8bf88a429282aa6122a993f0ac800cb369"},
]
[package.dependencies]
MarkupSafe = ">=2.0"
[package.extras]
i18n = ["Babel (>=2.7)"]
[[package]]
name = "jq"
version = "1.7.0"
@ -1034,22 +1159,20 @@ files = [
[[package]]
name = "langchain"
version = "0.1.20"
version = "0.2.1"
description = "Building applications with LLMs through composability"
optional = false
python-versions = "<4.0,>=3.8.1"
files = [
{file = "langchain-0.1.20-py3-none-any.whl", hash = "sha256:09991999fbd6c3421a12db3c7d1f52d55601fc41d9b2a3ef51aab2e0e9c38da9"},
{file = "langchain-0.1.20.tar.gz", hash = "sha256:f35c95eed8c8375e02dce95a34f2fd4856a4c98269d6dc34547a23dba5beab7e"},
{file = "langchain-0.2.1-py3-none-any.whl", hash = "sha256:3e13bf97c5717bce2c281f5117e8778823e8ccf62d949e73d3869448962b1c97"},
{file = "langchain-0.2.1.tar.gz", hash = "sha256:5758a315e1ac92eb26dafec5ad0fafa03cafa686aba197d5bb0b1dd28cc03ebe"},
]
[package.dependencies]
aiohttp = ">=3.8.3,<4.0.0"
async-timeout = {version = ">=4.0.0,<5.0.0", markers = "python_version < \"3.11\""}
dataclasses-json = ">=0.5.7,<0.7"
langchain-community = ">=0.0.38,<0.1"
langchain-core = ">=0.1.52,<0.2.0"
langchain-text-splitters = ">=0.0.1,<0.1"
langchain-core = ">=0.2.0,<0.3.0"
langchain-text-splitters = ">=0.2.0,<0.3.0"
langsmith = ">=0.1.17,<0.2.0"
numpy = ">=1,<2"
pydantic = ">=1,<3"
@ -1065,28 +1188,29 @@ cli = ["typer (>=0.9.0,<0.10.0)"]
cohere = ["cohere (>=4,<6)"]
docarray = ["docarray[hnswlib] (>=0.32.0,<0.33.0)"]
embeddings = ["sentence-transformers (>=2,<3)"]
extended-testing = ["aiosqlite (>=0.19.0,<0.20.0)", "aleph-alpha-client (>=2.15.0,<3.0.0)", "anthropic (>=0.3.11,<0.4.0)", "arxiv (>=1.4,<2.0)", "assemblyai (>=0.17.0,<0.18.0)", "atlassian-python-api (>=3.36.0,<4.0.0)", "beautifulsoup4 (>=4,<5)", "bibtexparser (>=1.4.0,<2.0.0)", "cassio (>=0.1.0,<0.2.0)", "chardet (>=5.1.0,<6.0.0)", "cohere (>=4,<6)", "couchbase (>=4.1.9,<5.0.0)", "dashvector (>=1.0.1,<2.0.0)", "databricks-vectorsearch (>=0.21,<0.22)", "datasets (>=2.15.0,<3.0.0)", "dgml-utils (>=0.3.0,<0.4.0)", "esprima (>=4.0.1,<5.0.0)", "faiss-cpu (>=1,<2)", "feedparser (>=6.0.10,<7.0.0)", "fireworks-ai (>=0.9.0,<0.10.0)", "geopandas (>=0.13.1,<0.14.0)", "gitpython (>=3.1.32,<4.0.0)", "google-cloud-documentai (>=2.20.1,<3.0.0)", "gql (>=3.4.1,<4.0.0)", "hologres-vector (>=0.0.6,<0.0.7)", "html2text (>=2020.1.16,<2021.0.0)", "javelin-sdk (>=0.1.8,<0.2.0)", "jinja2 (>=3,<4)", "jq (>=1.4.1,<2.0.0)", "jsonschema (>1)", "langchain-openai (>=0.0.2,<0.1)", "lxml (>=4.9.3,<6.0)", "markdownify (>=0.11.6,<0.12.0)", "motor (>=3.3.1,<4.0.0)", "msal (>=1.25.0,<2.0.0)", "mwparserfromhell (>=0.6.4,<0.7.0)", "mwxml (>=0.3.3,<0.4.0)", "newspaper3k (>=0.2.8,<0.3.0)", "numexpr (>=2.8.6,<3.0.0)", "openai (<2)", "openapi-pydantic (>=0.3.2,<0.4.0)", "pandas (>=2.0.1,<3.0.0)", "pdfminer-six (>=20221105,<20221106)", "pgvector (>=0.1.6,<0.2.0)", "praw (>=7.7.1,<8.0.0)", "psychicapi (>=0.8.0,<0.9.0)", "py-trello (>=0.19.0,<0.20.0)", "pymupdf (>=1.22.3,<2.0.0)", "pypdf (>=3.4.0,<4.0.0)", "pypdfium2 (>=4.10.0,<5.0.0)", "pyspark (>=3.4.0,<4.0.0)", "rank-bm25 (>=0.2.2,<0.3.0)", "rapidfuzz (>=3.1.1,<4.0.0)", "rapidocr-onnxruntime (>=1.3.2,<2.0.0)", "rdflib (==7.0.0)", "requests-toolbelt (>=1.0.0,<2.0.0)", "rspace_client (>=2.5.0,<3.0.0)", "scikit-learn (>=1.2.2,<2.0.0)", "sqlite-vss (>=0.1.2,<0.2.0)", "streamlit (>=1.18.0,<2.0.0)", "sympy (>=1.12,<2.0)", "telethon (>=1.28.5,<2.0.0)", "timescale-vector (>=0.0.1,<0.0.2)", "tqdm (>=4.48.0)", "upstash-redis (>=0.15.0,<0.16.0)", "xata (>=1.0.0a7,<2.0.0)", "xmltodict (>=0.13.0,<0.14.0)"]
extended-testing = ["aiosqlite (>=0.19.0,<0.20.0)", "aleph-alpha-client (>=2.15.0,<3.0.0)", "anthropic (>=0.3.11,<0.4.0)", "arxiv (>=1.4,<2.0)", "assemblyai (>=0.17.0,<0.18.0)", "atlassian-python-api (>=3.36.0,<4.0.0)", "beautifulsoup4 (>=4,<5)", "bibtexparser (>=1.4.0,<2.0.0)", "cassio (>=0.1.0,<0.2.0)", "chardet (>=5.1.0,<6.0.0)", "cohere (>=4,<6)", "couchbase (>=4.1.9,<5.0.0)", "dashvector (>=1.0.1,<2.0.0)", "databricks-vectorsearch (>=0.21,<0.22)", "datasets (>=2.15.0,<3.0.0)", "dgml-utils (>=0.3.0,<0.4.0)", "esprima (>=4.0.1,<5.0.0)", "faiss-cpu (>=1,<2)", "feedparser (>=6.0.10,<7.0.0)", "fireworks-ai (>=0.9.0,<0.10.0)", "geopandas (>=0.13.1,<0.14.0)", "gitpython (>=3.1.32,<4.0.0)", "google-cloud-documentai (>=2.20.1,<3.0.0)", "gql (>=3.4.1,<4.0.0)", "hologres-vector (>=0.0.6,<0.0.7)", "html2text (>=2020.1.16,<2021.0.0)", "javelin-sdk (>=0.1.8,<0.2.0)", "jinja2 (>=3,<4)", "jq (>=1.4.1,<2.0.0)", "jsonschema (>1)", "langchain-openai (>=0.1,<0.2)", "lxml (>=4.9.3,<6.0)", "markdownify (>=0.11.6,<0.12.0)", "motor (>=3.3.1,<4.0.0)", "msal (>=1.25.0,<2.0.0)", "mwparserfromhell (>=0.6.4,<0.7.0)", "mwxml (>=0.3.3,<0.4.0)", "newspaper3k (>=0.2.8,<0.3.0)", "numexpr (>=2.8.6,<3.0.0)", "openai (<2)", "openapi-pydantic (>=0.3.2,<0.4.0)", "pandas (>=2.0.1,<3.0.0)", "pdfminer-six (>=20221105,<20221106)", "pgvector (>=0.1.6,<0.2.0)", "praw (>=7.7.1,<8.0.0)", "psychicapi (>=0.8.0,<0.9.0)", "py-trello (>=0.19.0,<0.20.0)", "pymupdf (>=1.22.3,<2.0.0)", "pypdf (>=3.4.0,<4.0.0)", "pypdfium2 (>=4.10.0,<5.0.0)", "pyspark (>=3.4.0,<4.0.0)", "rank-bm25 (>=0.2.2,<0.3.0)", "rapidfuzz (>=3.1.1,<4.0.0)", "rapidocr-onnxruntime (>=1.3.2,<2.0.0)", "rdflib (==7.0.0)", "requests-toolbelt (>=1.0.0,<2.0.0)", "rspace_client (>=2.5.0,<3.0.0)", "scikit-learn (>=1.2.2,<2.0.0)", "sqlite-vss (>=0.1.2,<0.2.0)", "streamlit (>=1.18.0,<2.0.0)", "sympy (>=1.12,<2.0)", "telethon (>=1.28.5,<2.0.0)", "timescale-vector (>=0.0.1,<0.0.2)", "tqdm (>=4.48.0)", "upstash-redis (>=0.15.0,<0.16.0)", "xata (>=1.0.0a7,<2.0.0)", "xmltodict (>=0.13.0,<0.14.0)"]
javascript = ["esprima (>=4.0.1,<5.0.0)"]
llms = ["clarifai (>=9.1.0)", "cohere (>=4,<6)", "huggingface_hub (>=0,<1)", "manifest-ml (>=0.0.1,<0.0.2)", "nlpcloud (>=1,<2)", "openai (<2)", "openlm (>=0.0.5,<0.0.6)", "torch (>=1,<3)", "transformers (>=4,<5)"]
openai = ["openai (<2)", "tiktoken (>=0.3.2,<0.6.0)"]
openai = ["openai (<2)", "tiktoken (>=0.7,<1.0)"]
qdrant = ["qdrant-client (>=1.3.1,<2.0.0)"]
text-helpers = ["chardet (>=5.1.0,<6.0.0)"]
[[package]]
name = "langchain-community"
version = "0.0.38"
version = "0.2.1"
description = "Community contributed LangChain integrations."
optional = false
python-versions = "<4.0,>=3.8.1"
files = [
{file = "langchain_community-0.0.38-py3-none-any.whl", hash = "sha256:ecb48660a70a08c90229be46b0cc5f6bc9f38f2833ee44c57dfab9bf3a2c121a"},
{file = "langchain_community-0.0.38.tar.gz", hash = "sha256:127fc4b75bc67b62fe827c66c02e715a730fef8fe69bd2023d466bab06b5810d"},
{file = "langchain_community-0.2.1-py3-none-any.whl", hash = "sha256:b834e2c5ded6903b839fcaf566eee90a0ffae53405a0f7748202725e701d39cd"},
{file = "langchain_community-0.2.1.tar.gz", hash = "sha256:079942e8f15da975769ccaae19042b7bba5481c42020bbbd7d8cad73a9393261"},
]
[package.dependencies]
aiohttp = ">=3.8.3,<4.0.0"
dataclasses-json = ">=0.5.7,<0.7"
langchain-core = ">=0.1.52,<0.2.0"
langchain = ">=0.2.0,<0.3.0"
langchain-core = ">=0.2.0,<0.3.0"
langsmith = ">=0.1.0,<0.2.0"
numpy = ">=1,<2"
PyYAML = ">=5.3"
@ -1096,17 +1220,17 @@ tenacity = ">=8.1.0,<9.0.0"
[package.extras]
cli = ["typer (>=0.9.0,<0.10.0)"]
extended-testing = ["aiosqlite (>=0.19.0,<0.20.0)", "aleph-alpha-client (>=2.15.0,<3.0.0)", "anthropic (>=0.3.11,<0.4.0)", "arxiv (>=1.4,<2.0)", "assemblyai (>=0.17.0,<0.18.0)", "atlassian-python-api (>=3.36.0,<4.0.0)", "azure-ai-documentintelligence (>=1.0.0b1,<2.0.0)", "azure-identity (>=1.15.0,<2.0.0)", "azure-search-documents (==11.4.0)", "beautifulsoup4 (>=4,<5)", "bibtexparser (>=1.4.0,<2.0.0)", "cassio (>=0.1.6,<0.2.0)", "chardet (>=5.1.0,<6.0.0)", "cloudpickle (>=2.0.0)", "cohere (>=4,<5)", "databricks-vectorsearch (>=0.21,<0.22)", "datasets (>=2.15.0,<3.0.0)", "dgml-utils (>=0.3.0,<0.4.0)", "elasticsearch (>=8.12.0,<9.0.0)", "esprima (>=4.0.1,<5.0.0)", "faiss-cpu (>=1,<2)", "feedparser (>=6.0.10,<7.0.0)", "fireworks-ai (>=0.9.0,<0.10.0)", "friendli-client (>=1.2.4,<2.0.0)", "geopandas (>=0.13.1,<0.14.0)", "gitpython (>=3.1.32,<4.0.0)", "google-cloud-documentai (>=2.20.1,<3.0.0)", "gql (>=3.4.1,<4.0.0)", "gradientai (>=1.4.0,<2.0.0)", "hdbcli (>=2.19.21,<3.0.0)", "hologres-vector (>=0.0.6,<0.0.7)", "html2text (>=2020.1.16,<2021.0.0)", "httpx (>=0.24.1,<0.25.0)", "httpx-sse (>=0.4.0,<0.5.0)", "javelin-sdk (>=0.1.8,<0.2.0)", "jinja2 (>=3,<4)", "jq (>=1.4.1,<2.0.0)", "jsonschema (>1)", "lxml (>=4.9.3,<6.0)", "markdownify (>=0.11.6,<0.12.0)", "motor (>=3.3.1,<4.0.0)", "msal (>=1.25.0,<2.0.0)", "mwparserfromhell (>=0.6.4,<0.7.0)", "mwxml (>=0.3.3,<0.4.0)", "newspaper3k (>=0.2.8,<0.3.0)", "numexpr (>=2.8.6,<3.0.0)", "nvidia-riva-client (>=2.14.0,<3.0.0)", "oci (>=2.119.1,<3.0.0)", "openai (<2)", "openapi-pydantic (>=0.3.2,<0.4.0)", "oracle-ads (>=2.9.1,<3.0.0)", "oracledb (>=2.2.0,<3.0.0)", "pandas (>=2.0.1,<3.0.0)", "pdfminer-six (>=20221105,<20221106)", "pgvector (>=0.1.6,<0.2.0)", "praw (>=7.7.1,<8.0.0)", "premai (>=0.3.25,<0.4.0)", "psychicapi (>=0.8.0,<0.9.0)", "py-trello (>=0.19.0,<0.20.0)", "pyjwt (>=2.8.0,<3.0.0)", "pymupdf (>=1.22.3,<2.0.0)", "pypdf (>=3.4.0,<4.0.0)", "pypdfium2 (>=4.10.0,<5.0.0)", "pyspark (>=3.4.0,<4.0.0)", "rank-bm25 (>=0.2.2,<0.3.0)", "rapidfuzz (>=3.1.1,<4.0.0)", "rapidocr-onnxruntime (>=1.3.2,<2.0.0)", "rdflib (==7.0.0)", "requests-toolbelt (>=1.0.0,<2.0.0)", "rspace_client (>=2.5.0,<3.0.0)", "scikit-learn (>=1.2.2,<2.0.0)", "sqlite-vss (>=0.1.2,<0.2.0)", "streamlit (>=1.18.0,<2.0.0)", "sympy (>=1.12,<2.0)", "telethon (>=1.28.5,<2.0.0)", "tidb-vector (>=0.0.3,<1.0.0)", "timescale-vector (>=0.0.1,<0.0.2)", "tqdm (>=4.48.0)", "tree-sitter (>=0.20.2,<0.21.0)", "tree-sitter-languages (>=1.8.0,<2.0.0)", "upstash-redis (>=0.15.0,<0.16.0)", "vdms (>=0.0.20,<0.0.21)", "xata (>=1.0.0a7,<2.0.0)", "xmltodict (>=0.13.0,<0.14.0)"]
extended-testing = ["aiosqlite (>=0.19.0,<0.20.0)", "aleph-alpha-client (>=2.15.0,<3.0.0)", "anthropic (>=0.3.11,<0.4.0)", "arxiv (>=1.4,<2.0)", "assemblyai (>=0.17.0,<0.18.0)", "atlassian-python-api (>=3.36.0,<4.0.0)", "azure-ai-documentintelligence (>=1.0.0b1,<2.0.0)", "azure-identity (>=1.15.0,<2.0.0)", "azure-search-documents (==11.4.0)", "beautifulsoup4 (>=4,<5)", "bibtexparser (>=1.4.0,<2.0.0)", "cassio (>=0.1.6,<0.2.0)", "chardet (>=5.1.0,<6.0.0)", "cloudpathlib (>=0.18,<0.19)", "cloudpickle (>=2.0.0)", "cohere (>=4,<5)", "databricks-vectorsearch (>=0.21,<0.22)", "datasets (>=2.15.0,<3.0.0)", "dgml-utils (>=0.3.0,<0.4.0)", "elasticsearch (>=8.12.0,<9.0.0)", "esprima (>=4.0.1,<5.0.0)", "faiss-cpu (>=1,<2)", "feedparser (>=6.0.10,<7.0.0)", "fireworks-ai (>=0.9.0,<0.10.0)", "friendli-client (>=1.2.4,<2.0.0)", "geopandas (>=0.13.1,<0.14.0)", "gitpython (>=3.1.32,<4.0.0)", "google-cloud-documentai (>=2.20.1,<3.0.0)", "gql (>=3.4.1,<4.0.0)", "gradientai (>=1.4.0,<2.0.0)", "hdbcli (>=2.19.21,<3.0.0)", "hologres-vector (>=0.0.6,<0.0.7)", "html2text (>=2020.1.16,<2021.0.0)", "httpx (>=0.24.1,<0.25.0)", "httpx-sse (>=0.4.0,<0.5.0)", "javelin-sdk (>=0.1.8,<0.2.0)", "jinja2 (>=3,<4)", "jq (>=1.4.1,<2.0.0)", "jsonschema (>1)", "lxml (>=4.9.3,<6.0)", "markdownify (>=0.11.6,<0.12.0)", "motor (>=3.3.1,<4.0.0)", "msal (>=1.25.0,<2.0.0)", "mwparserfromhell (>=0.6.4,<0.7.0)", "mwxml (>=0.3.3,<0.4.0)", "newspaper3k (>=0.2.8,<0.3.0)", "numexpr (>=2.8.6,<3.0.0)", "nvidia-riva-client (>=2.14.0,<3.0.0)", "oci (>=2.119.1,<3.0.0)", "openai (<2)", "openapi-pydantic (>=0.3.2,<0.4.0)", "oracle-ads (>=2.9.1,<3.0.0)", "oracledb (>=2.2.0,<3.0.0)", "pandas (>=2.0.1,<3.0.0)", "pdfminer-six (>=20221105,<20221106)", "pgvector (>=0.1.6,<0.2.0)", "praw (>=7.7.1,<8.0.0)", "premai (>=0.3.25,<0.4.0)", "psychicapi (>=0.8.0,<0.9.0)", "py-trello (>=0.19.0,<0.20.0)", "pyjwt (>=2.8.0,<3.0.0)", "pymupdf (>=1.22.3,<2.0.0)", "pypdf (>=3.4.0,<4.0.0)", "pypdfium2 (>=4.10.0,<5.0.0)", "pyspark (>=3.4.0,<4.0.0)", "rank-bm25 (>=0.2.2,<0.3.0)", "rapidfuzz (>=3.1.1,<4.0.0)", "rapidocr-onnxruntime (>=1.3.2,<2.0.0)", "rdflib (==7.0.0)", "requests-toolbelt (>=1.0.0,<2.0.0)", "rspace_client (>=2.5.0,<3.0.0)", "scikit-learn (>=1.2.2,<2.0.0)", "sqlite-vss (>=0.1.2,<0.2.0)", "streamlit (>=1.18.0,<2.0.0)", "sympy (>=1.12,<2.0)", "telethon (>=1.28.5,<2.0.0)", "tidb-vector (>=0.0.3,<1.0.0)", "timescale-vector (>=0.0.1,<0.0.2)", "tqdm (>=4.48.0)", "tree-sitter (>=0.20.2,<0.21.0)", "tree-sitter-languages (>=1.8.0,<2.0.0)", "upstash-redis (>=0.15.0,<0.16.0)", "vdms (>=0.0.20,<0.0.21)", "xata (>=1.0.0a7,<2.0.0)", "xmltodict (>=0.13.0,<0.14.0)"]
[[package]]
name = "langchain-core"
version = "0.1.52"
version = "0.2.1"
description = "Building applications with LLMs through composability"
optional = false
python-versions = "<4.0,>=3.8.1"
files = [
{file = "langchain_core-0.1.52-py3-none-any.whl", hash = "sha256:62566749c92e8a1181c255c788548dc16dbc319d896cd6b9c95dc17af9b2a6db"},
{file = "langchain_core-0.1.52.tar.gz", hash = "sha256:084c3fc452f5a6966c28ab3ec5dbc8b8d26fc3f63378073928f4e29d90b6393f"},
{file = "langchain_core-0.2.1-py3-none-any.whl", hash = "sha256:3521e1e573988c47399fca9739270c5d34f8ecec147253ad829eb9ff288f76d5"},
{file = "langchain_core-0.2.1.tar.gz", hash = "sha256:49383126168d934559a543ce812c485048d9e6ac9b6798fbf3d4a72b6bba5b0c"},
]
[package.dependencies]
@ -1122,35 +1246,35 @@ extended-testing = ["jinja2 (>=3,<4)"]
[[package]]
name = "langchain-experimental"
version = "0.0.58"
version = "0.0.59"
description = "Building applications with LLMs through composability"
optional = false
python-versions = "<4.0,>=3.8.1"
files = [
{file = "langchain_experimental-0.0.58-py3-none-any.whl", hash = "sha256:106d3bc7df3dd20687378db7534c2fc21e2589201d43de42f832a1e3913dd55b"},
{file = "langchain_experimental-0.0.58.tar.gz", hash = "sha256:8ef10ff6b39f44ef468f8f21beb3749957d2262ec64d05db2719934936ca0285"},
{file = "langchain_experimental-0.0.59-py3-none-any.whl", hash = "sha256:d6ceb586c15ad35fc619542e86d01f0984a94985324a78a9ed8cd87615ff265d"},
{file = "langchain_experimental-0.0.59.tar.gz", hash = "sha256:3a93f5c328f6ee1cd4f9dd8792c535df2d5638cff0d778ee25546804b5282fda"},
]
[package.dependencies]
langchain = ">=0.1.17,<0.2.0"
langchain-core = ">=0.1.52,<0.2.0"
langchain-community = ">=0.2,<0.3"
langchain-core = ">=0.2,<0.3"
[package.extras]
extended-testing = ["faker (>=19.3.1,<20.0.0)", "jinja2 (>=3,<4)", "pandas (>=2.0.1,<3.0.0)", "presidio-analyzer (>=2.2.352,<3.0.0)", "presidio-anonymizer (>=2.2.352,<3.0.0)", "sentence-transformers (>=2,<3)", "tabulate (>=0.9.0,<0.10.0)", "vowpal-wabbit-next (==0.6.0)"]
[[package]]
name = "langchain-text-splitters"
version = "0.0.2"
version = "0.2.0"
description = "LangChain text splitting utilities"
optional = false
python-versions = "<4.0,>=3.8.1"
files = [
{file = "langchain_text_splitters-0.0.2-py3-none-any.whl", hash = "sha256:13887f32705862c1e1454213cb7834a63aae57c26fcd80346703a1d09c46168d"},
{file = "langchain_text_splitters-0.0.2.tar.gz", hash = "sha256:ac8927dc0ba08eba702f6961c9ed7df7cead8de19a9f7101ab2b5ea34201b3c1"},
{file = "langchain_text_splitters-0.2.0-py3-none-any.whl", hash = "sha256:7b4c6a45f8471630a882b321e138329b6897102a5bc62f4c12be1c0b05bb9199"},
{file = "langchain_text_splitters-0.2.0.tar.gz", hash = "sha256:b32ab4f7397f7d42c1fa3283fefc2547ba356bd63a68ee9092865e5ad83c82f9"},
]
[package.dependencies]
langchain-core = ">=0.1.28,<0.3"
langchain-core = ">=0.2.0,<0.3.0"
[package.extras]
extended-testing = ["beautifulsoup4 (>=4.12.3,<5.0.0)", "lxml (>=4.9.3,<6.0)"]
@ -1172,13 +1296,13 @@ types-requests = ">=2.31.0.2,<3.0.0.0"
[[package]]
name = "langsmith"
version = "0.1.62"
version = "0.1.63"
description = "Client library to connect to the LangSmith LLM Tracing and Evaluation Platform."
optional = false
python-versions = "<4.0,>=3.8.1"
files = [
{file = "langsmith-0.1.62-py3-none-any.whl", hash = "sha256:3a9f112643f64d736b8c875390c750fe6485804ea53aeae4edebce0afa4383a5"},
{file = "langsmith-0.1.62.tar.gz", hash = "sha256:7ef894c14e6d4175fce88ec3bcd5a9c8cf9a456ea77e26e361f519ad082f34a8"},
{file = "langsmith-0.1.63-py3-none-any.whl", hash = "sha256:7810afdf5e3f3b472fc581a29371fb96cd843dde2149e048d1b9610325159d1e"},
{file = "langsmith-0.1.63.tar.gz", hash = "sha256:a609405b52f6f54df442a142cbf19ab38662d54e532f96028b4c546434d4afdf"},
]
[package.dependencies]
@ -2522,13 +2646,13 @@ sqlcipher = ["sqlcipher3_binary"]
[[package]]
name = "sqlmodel"
version = "0.0.16"
version = "0.0.18"
description = "SQLModel, SQL databases in Python, designed for simplicity, compatibility, and robustness."
optional = false
python-versions = ">=3.7,<4.0"
python-versions = ">=3.7"
files = [
{file = "sqlmodel-0.0.16-py3-none-any.whl", hash = "sha256:b972f5d319580d6c37ecc417881f6ec4d1ad3ed3583d0ac0ed43234a28bf605a"},
{file = "sqlmodel-0.0.16.tar.gz", hash = "sha256:966656f18a8e9a2d159eb215b07fb0cf5222acfae3362707ca611848a8a06bd1"},
{file = "sqlmodel-0.0.18-py3-none-any.whl", hash = "sha256:d70fdf8fe595e30a918660cf4537b9c5fc2fffdbfcba851a0135de73c3ebcbb7"},
{file = "sqlmodel-0.0.18.tar.gz", hash = "sha256:2e520efe03810ef2c268a1004cfc5ef8f8a936312232f38d6c8e62c11af2cac3"},
]
[package.dependencies]
@ -2600,13 +2724,13 @@ urllib3 = ">=2"
[[package]]
name = "typing-extensions"
version = "4.11.0"
version = "4.12.0"
description = "Backported and Experimental Type Hints for Python 3.8+"
optional = false
python-versions = ">=3.8"
files = [
{file = "typing_extensions-4.11.0-py3-none-any.whl", hash = "sha256:c1f94d72897edaf4ce775bb7558d5b79d8126906a14ea5ed1635921406c0387a"},
{file = "typing_extensions-4.11.0.tar.gz", hash = "sha256:83f085bd5ca59c80295fc2a82ab5dac679cbe02b9f33f7d83af68e241bea51b0"},
{file = "typing_extensions-4.12.0-py3-none-any.whl", hash = "sha256:b349c66bea9016ac22978d800cfff206d5f9816951f12a7d0ec5578b0a819594"},
{file = "typing_extensions-4.12.0.tar.gz", hash = "sha256:8cbcdc8606ebcb0d95453ad7dc5065e6237b6aa230a31e81d0f440c30fed5fd8"},
]
[[package]]
@ -2635,6 +2759,93 @@ files = [
{file = "tzdata-2024.1.tar.gz", hash = "sha256:2674120f8d891909751c38abcdfd386ac0a5a1127954fbc332af6b5ceae07efd"},
]
[[package]]
name = "ujson"
version = "5.10.0"
description = "Ultra fast JSON encoder and decoder for Python"
optional = false
python-versions = ">=3.8"
files = [
{file = "ujson-5.10.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:2601aa9ecdbee1118a1c2065323bda35e2c5a2cf0797ef4522d485f9d3ef65bd"},
{file = "ujson-5.10.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:348898dd702fc1c4f1051bc3aacbf894caa0927fe2c53e68679c073375f732cf"},
{file = "ujson-5.10.0-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:22cffecf73391e8abd65ef5f4e4dd523162a3399d5e84faa6aebbf9583df86d6"},
{file = "ujson-5.10.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:26b0e2d2366543c1bb4fbd457446f00b0187a2bddf93148ac2da07a53fe51569"},
{file = "ujson-5.10.0-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:caf270c6dba1be7a41125cd1e4fc7ba384bf564650beef0df2dd21a00b7f5770"},
{file = "ujson-5.10.0-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:a245d59f2ffe750446292b0094244df163c3dc96b3ce152a2c837a44e7cda9d1"},
{file = "ujson-5.10.0-cp310-cp310-musllinux_1_2_i686.whl", hash = "sha256:94a87f6e151c5f483d7d54ceef83b45d3a9cca7a9cb453dbdbb3f5a6f64033f5"},
{file = "ujson-5.10.0-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:29b443c4c0a113bcbb792c88bea67b675c7ca3ca80c3474784e08bba01c18d51"},
{file = "ujson-5.10.0-cp310-cp310-win32.whl", hash = "sha256:c18610b9ccd2874950faf474692deee4223a994251bc0a083c114671b64e6518"},
{file = "ujson-5.10.0-cp310-cp310-win_amd64.whl", hash = "sha256:924f7318c31874d6bb44d9ee1900167ca32aa9b69389b98ecbde34c1698a250f"},
{file = "ujson-5.10.0-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:a5b366812c90e69d0f379a53648be10a5db38f9d4ad212b60af00bd4048d0f00"},
{file = "ujson-5.10.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:502bf475781e8167f0f9d0e41cd32879d120a524b22358e7f205294224c71126"},
{file = "ujson-5.10.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:5b91b5d0d9d283e085e821651184a647699430705b15bf274c7896f23fe9c9d8"},
{file = "ujson-5.10.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:129e39af3a6d85b9c26d5577169c21d53821d8cf68e079060602e861c6e5da1b"},
{file = "ujson-5.10.0-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:f77b74475c462cb8b88680471193064d3e715c7c6074b1c8c412cb526466efe9"},
{file = "ujson-5.10.0-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:7ec0ca8c415e81aa4123501fee7f761abf4b7f386aad348501a26940beb1860f"},
{file = "ujson-5.10.0-cp311-cp311-musllinux_1_2_i686.whl", hash = "sha256:ab13a2a9e0b2865a6c6db9271f4b46af1c7476bfd51af1f64585e919b7c07fd4"},
{file = "ujson-5.10.0-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:57aaf98b92d72fc70886b5a0e1a1ca52c2320377360341715dd3933a18e827b1"},
{file = "ujson-5.10.0-cp311-cp311-win32.whl", hash = "sha256:2987713a490ceb27edff77fb184ed09acdc565db700ee852823c3dc3cffe455f"},
{file = "ujson-5.10.0-cp311-cp311-win_amd64.whl", hash = "sha256:f00ea7e00447918ee0eff2422c4add4c5752b1b60e88fcb3c067d4a21049a720"},
{file = "ujson-5.10.0-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:98ba15d8cbc481ce55695beee9f063189dce91a4b08bc1d03e7f0152cd4bbdd5"},
{file = "ujson-5.10.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:a9d2edbf1556e4f56e50fab7d8ff993dbad7f54bac68eacdd27a8f55f433578e"},
{file = "ujson-5.10.0-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:6627029ae4f52d0e1a2451768c2c37c0c814ffc04f796eb36244cf16b8e57043"},
{file = "ujson-5.10.0-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:f8ccb77b3e40b151e20519c6ae6d89bfe3f4c14e8e210d910287f778368bb3d1"},
{file = "ujson-5.10.0-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:f3caf9cd64abfeb11a3b661329085c5e167abbe15256b3b68cb5d914ba7396f3"},
{file = "ujson-5.10.0-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:6e32abdce572e3a8c3d02c886c704a38a1b015a1fb858004e03d20ca7cecbb21"},
{file = "ujson-5.10.0-cp312-cp312-musllinux_1_2_i686.whl", hash = "sha256:a65b6af4d903103ee7b6f4f5b85f1bfd0c90ba4eeac6421aae436c9988aa64a2"},
{file = "ujson-5.10.0-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:604a046d966457b6cdcacc5aa2ec5314f0e8c42bae52842c1e6fa02ea4bda42e"},
{file = "ujson-5.10.0-cp312-cp312-win32.whl", hash = "sha256:6dea1c8b4fc921bf78a8ff00bbd2bfe166345f5536c510671bccececb187c80e"},
{file = "ujson-5.10.0-cp312-cp312-win_amd64.whl", hash = "sha256:38665e7d8290188b1e0d57d584eb8110951a9591363316dd41cf8686ab1d0abc"},
{file = "ujson-5.10.0-cp313-cp313-macosx_10_9_x86_64.whl", hash = "sha256:618efd84dc1acbd6bff8eaa736bb6c074bfa8b8a98f55b61c38d4ca2c1f7f287"},
{file = "ujson-5.10.0-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:38d5d36b4aedfe81dfe251f76c0467399d575d1395a1755de391e58985ab1c2e"},
{file = "ujson-5.10.0-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:67079b1f9fb29ed9a2914acf4ef6c02844b3153913eb735d4bf287ee1db6e557"},
{file = "ujson-5.10.0-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:d7d0e0ceeb8fe2468c70ec0c37b439dd554e2aa539a8a56365fd761edb418988"},
{file = "ujson-5.10.0-cp313-cp313-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:59e02cd37bc7c44d587a0ba45347cc815fb7a5fe48de16bf05caa5f7d0d2e816"},
{file = "ujson-5.10.0-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:2a890b706b64e0065f02577bf6d8ca3b66c11a5e81fb75d757233a38c07a1f20"},
{file = "ujson-5.10.0-cp313-cp313-musllinux_1_2_i686.whl", hash = "sha256:621e34b4632c740ecb491efc7f1fcb4f74b48ddb55e65221995e74e2d00bbff0"},
{file = "ujson-5.10.0-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:b9500e61fce0cfc86168b248104e954fead61f9be213087153d272e817ec7b4f"},
{file = "ujson-5.10.0-cp313-cp313-win32.whl", hash = "sha256:4c4fc16f11ac1612f05b6f5781b384716719547e142cfd67b65d035bd85af165"},
{file = "ujson-5.10.0-cp313-cp313-win_amd64.whl", hash = "sha256:4573fd1695932d4f619928fd09d5d03d917274381649ade4328091ceca175539"},
{file = "ujson-5.10.0-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:a984a3131da7f07563057db1c3020b1350a3e27a8ec46ccbfbf21e5928a43050"},
{file = "ujson-5.10.0-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:73814cd1b9db6fc3270e9d8fe3b19f9f89e78ee9d71e8bd6c9a626aeaeaf16bd"},
{file = "ujson-5.10.0-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:61e1591ed9376e5eddda202ec229eddc56c612b61ac6ad07f96b91460bb6c2fb"},
{file = "ujson-5.10.0-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:d2c75269f8205b2690db4572a4a36fe47cd1338e4368bc73a7a0e48789e2e35a"},
{file = "ujson-5.10.0-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:7223f41e5bf1f919cd8d073e35b229295aa8e0f7b5de07ed1c8fddac63a6bc5d"},
{file = "ujson-5.10.0-cp38-cp38-musllinux_1_2_aarch64.whl", hash = "sha256:d4dc2fd6b3067c0782e7002ac3b38cf48608ee6366ff176bbd02cf969c9c20fe"},
{file = "ujson-5.10.0-cp38-cp38-musllinux_1_2_i686.whl", hash = "sha256:232cc85f8ee3c454c115455195a205074a56ff42608fd6b942aa4c378ac14dd7"},
{file = "ujson-5.10.0-cp38-cp38-musllinux_1_2_x86_64.whl", hash = "sha256:cc6139531f13148055d691e442e4bc6601f6dba1e6d521b1585d4788ab0bfad4"},
{file = "ujson-5.10.0-cp38-cp38-win32.whl", hash = "sha256:e7ce306a42b6b93ca47ac4a3b96683ca554f6d35dd8adc5acfcd55096c8dfcb8"},
{file = "ujson-5.10.0-cp38-cp38-win_amd64.whl", hash = "sha256:e82d4bb2138ab05e18f089a83b6564fee28048771eb63cdecf4b9b549de8a2cc"},
{file = "ujson-5.10.0-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:dfef2814c6b3291c3c5f10065f745a1307d86019dbd7ea50e83504950136ed5b"},
{file = "ujson-5.10.0-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:4734ee0745d5928d0ba3a213647f1c4a74a2a28edc6d27b2d6d5bd9fa4319e27"},
{file = "ujson-5.10.0-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:d47ebb01bd865fdea43da56254a3930a413f0c5590372a1241514abae8aa7c76"},
{file = "ujson-5.10.0-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:dee5e97c2496874acbf1d3e37b521dd1f307349ed955e62d1d2f05382bc36dd5"},
{file = "ujson-5.10.0-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:7490655a2272a2d0b072ef16b0b58ee462f4973a8f6bbe64917ce5e0a256f9c0"},
{file = "ujson-5.10.0-cp39-cp39-musllinux_1_2_aarch64.whl", hash = "sha256:ba17799fcddaddf5c1f75a4ba3fd6441f6a4f1e9173f8a786b42450851bd74f1"},
{file = "ujson-5.10.0-cp39-cp39-musllinux_1_2_i686.whl", hash = "sha256:2aff2985cef314f21d0fecc56027505804bc78802c0121343874741650a4d3d1"},
{file = "ujson-5.10.0-cp39-cp39-musllinux_1_2_x86_64.whl", hash = "sha256:ad88ac75c432674d05b61184178635d44901eb749786c8eb08c102330e6e8996"},
{file = "ujson-5.10.0-cp39-cp39-win32.whl", hash = "sha256:2544912a71da4ff8c4f7ab5606f947d7299971bdd25a45e008e467ca638d13c9"},
{file = "ujson-5.10.0-cp39-cp39-win_amd64.whl", hash = "sha256:3ff201d62b1b177a46f113bb43ad300b424b7847f9c5d38b1b4ad8f75d4a282a"},
{file = "ujson-5.10.0-pp310-pypy310_pp73-macosx_10_9_x86_64.whl", hash = "sha256:5b6fee72fa77dc172a28f21693f64d93166534c263adb3f96c413ccc85ef6e64"},
{file = "ujson-5.10.0-pp310-pypy310_pp73-macosx_11_0_arm64.whl", hash = "sha256:61d0af13a9af01d9f26d2331ce49bb5ac1fb9c814964018ac8df605b5422dcb3"},
{file = "ujson-5.10.0-pp310-pypy310_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:ecb24f0bdd899d368b715c9e6664166cf694d1e57be73f17759573a6986dd95a"},
{file = "ujson-5.10.0-pp310-pypy310_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:fbd8fd427f57a03cff3ad6574b5e299131585d9727c8c366da4624a9069ed746"},
{file = "ujson-5.10.0-pp310-pypy310_pp73-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:beeaf1c48e32f07d8820c705ff8e645f8afa690cca1544adba4ebfa067efdc88"},
{file = "ujson-5.10.0-pp310-pypy310_pp73-win_amd64.whl", hash = "sha256:baed37ea46d756aca2955e99525cc02d9181de67f25515c468856c38d52b5f3b"},
{file = "ujson-5.10.0-pp38-pypy38_pp73-macosx_10_9_x86_64.whl", hash = "sha256:7663960f08cd5a2bb152f5ee3992e1af7690a64c0e26d31ba7b3ff5b2ee66337"},
{file = "ujson-5.10.0-pp38-pypy38_pp73-macosx_11_0_arm64.whl", hash = "sha256:d8640fb4072d36b08e95a3a380ba65779d356b2fee8696afeb7794cf0902d0a1"},
{file = "ujson-5.10.0-pp38-pypy38_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:78778a3aa7aafb11e7ddca4e29f46bc5139131037ad628cc10936764282d6753"},
{file = "ujson-5.10.0-pp38-pypy38_pp73-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:b0111b27f2d5c820e7f2dbad7d48e3338c824e7ac4d2a12da3dc6061cc39c8e6"},
{file = "ujson-5.10.0-pp38-pypy38_pp73-win_amd64.whl", hash = "sha256:c66962ca7565605b355a9ed478292da628b8f18c0f2793021ca4425abf8b01e5"},
{file = "ujson-5.10.0-pp39-pypy39_pp73-macosx_10_9_x86_64.whl", hash = "sha256:ba43cc34cce49cf2d4bc76401a754a81202d8aa926d0e2b79f0ee258cb15d3a4"},
{file = "ujson-5.10.0-pp39-pypy39_pp73-macosx_11_0_arm64.whl", hash = "sha256:ac56eb983edce27e7f51d05bc8dd820586c6e6be1c5216a6809b0c668bb312b8"},
{file = "ujson-5.10.0-pp39-pypy39_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:f44bd4b23a0e723bf8b10628288c2c7c335161d6840013d4d5de20e48551773b"},
{file = "ujson-5.10.0-pp39-pypy39_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:7c10f4654e5326ec14a46bcdeb2b685d4ada6911050aa8baaf3501e57024b804"},
{file = "ujson-5.10.0-pp39-pypy39_pp73-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:0de4971a89a762398006e844ae394bd46991f7c385d7a6a3b93ba229e6dac17e"},
{file = "ujson-5.10.0-pp39-pypy39_pp73-win_amd64.whl", hash = "sha256:e1402f0564a97d2a52310ae10a64d25bcef94f8dd643fcf5d310219d915484f7"},
{file = "ujson-5.10.0.tar.gz", hash = "sha256:b3cd8f3c5d8c7738257f1018880444f7b7d9b66232c64649f562d7ba86ad4bc1"},
]
[[package]]
name = "urllib3"
version = "2.2.1"
@ -2665,12 +2876,150 @@ files = [
[package.dependencies]
click = ">=7.0"
colorama = {version = ">=0.4", optional = true, markers = "sys_platform == \"win32\" and extra == \"standard\""}
h11 = ">=0.8"
httptools = {version = ">=0.5.0", optional = true, markers = "extra == \"standard\""}
python-dotenv = {version = ">=0.13", optional = true, markers = "extra == \"standard\""}
pyyaml = {version = ">=5.1", optional = true, markers = "extra == \"standard\""}
typing-extensions = {version = ">=4.0", markers = "python_version < \"3.11\""}
uvloop = {version = ">=0.14.0,<0.15.0 || >0.15.0,<0.15.1 || >0.15.1", optional = true, markers = "(sys_platform != \"win32\" and sys_platform != \"cygwin\") and platform_python_implementation != \"PyPy\" and extra == \"standard\""}
watchfiles = {version = ">=0.13", optional = true, markers = "extra == \"standard\""}
websockets = {version = ">=10.4", optional = true, markers = "extra == \"standard\""}
[package.extras]
standard = ["colorama (>=0.4)", "httptools (>=0.5.0)", "python-dotenv (>=0.13)", "pyyaml (>=5.1)", "uvloop (>=0.14.0,!=0.15.0,!=0.15.1)", "watchfiles (>=0.13)", "websockets (>=10.4)"]
[[package]]
name = "uvloop"
version = "0.19.0"
description = "Fast implementation of asyncio event loop on top of libuv"
optional = false
python-versions = ">=3.8.0"
files = [
{file = "uvloop-0.19.0-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:de4313d7f575474c8f5a12e163f6d89c0a878bc49219641d49e6f1444369a90e"},
{file = "uvloop-0.19.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:5588bd21cf1fcf06bded085f37e43ce0e00424197e7c10e77afd4bbefffef428"},
{file = "uvloop-0.19.0-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:7b1fd71c3843327f3bbc3237bedcdb6504fd50368ab3e04d0410e52ec293f5b8"},
{file = "uvloop-0.19.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:5a05128d315e2912791de6088c34136bfcdd0c7cbc1cf85fd6fd1bb321b7c849"},
{file = "uvloop-0.19.0-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:cd81bdc2b8219cb4b2556eea39d2e36bfa375a2dd021404f90a62e44efaaf957"},
{file = "uvloop-0.19.0-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:5f17766fb6da94135526273080f3455a112f82570b2ee5daa64d682387fe0dcd"},
{file = "uvloop-0.19.0-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:4ce6b0af8f2729a02a5d1575feacb2a94fc7b2e983868b009d51c9a9d2149bef"},
{file = "uvloop-0.19.0-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:31e672bb38b45abc4f26e273be83b72a0d28d074d5b370fc4dcf4c4eb15417d2"},
{file = "uvloop-0.19.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:570fc0ed613883d8d30ee40397b79207eedd2624891692471808a95069a007c1"},
{file = "uvloop-0.19.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:5138821e40b0c3e6c9478643b4660bd44372ae1e16a322b8fc07478f92684e24"},
{file = "uvloop-0.19.0-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:91ab01c6cd00e39cde50173ba4ec68a1e578fee9279ba64f5221810a9e786533"},
{file = "uvloop-0.19.0-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:47bf3e9312f63684efe283f7342afb414eea4d3011542155c7e625cd799c3b12"},
{file = "uvloop-0.19.0-cp312-cp312-macosx_10_9_universal2.whl", hash = "sha256:da8435a3bd498419ee8c13c34b89b5005130a476bda1d6ca8cfdde3de35cd650"},
{file = "uvloop-0.19.0-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:02506dc23a5d90e04d4f65c7791e65cf44bd91b37f24cfc3ef6cf2aff05dc7ec"},
{file = "uvloop-0.19.0-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:2693049be9d36fef81741fddb3f441673ba12a34a704e7b4361efb75cf30befc"},
{file = "uvloop-0.19.0-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:7010271303961c6f0fe37731004335401eb9075a12680738731e9c92ddd96ad6"},
{file = "uvloop-0.19.0-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:5daa304d2161d2918fa9a17d5635099a2f78ae5b5960e742b2fcfbb7aefaa593"},
{file = "uvloop-0.19.0-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:7207272c9520203fea9b93843bb775d03e1cf88a80a936ce760f60bb5add92f3"},
{file = "uvloop-0.19.0-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:78ab247f0b5671cc887c31d33f9b3abfb88d2614b84e4303f1a63b46c046c8bd"},
{file = "uvloop-0.19.0-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:472d61143059c84947aa8bb74eabbace30d577a03a1805b77933d6bd13ddebbd"},
{file = "uvloop-0.19.0-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:45bf4c24c19fb8a50902ae37c5de50da81de4922af65baf760f7c0c42e1088be"},
{file = "uvloop-0.19.0-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:271718e26b3e17906b28b67314c45d19106112067205119dddbd834c2b7ce797"},
{file = "uvloop-0.19.0-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:34175c9fd2a4bc3adc1380e1261f60306344e3407c20a4d684fd5f3be010fa3d"},
{file = "uvloop-0.19.0-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:e27f100e1ff17f6feeb1f33968bc185bf8ce41ca557deee9d9bbbffeb72030b7"},
{file = "uvloop-0.19.0-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:13dfdf492af0aa0a0edf66807d2b465607d11c4fa48f4a1fd41cbea5b18e8e8b"},
{file = "uvloop-0.19.0-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:6e3d4e85ac060e2342ff85e90d0c04157acb210b9ce508e784a944f852a40e67"},
{file = "uvloop-0.19.0-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:8ca4956c9ab567d87d59d49fa3704cf29e37109ad348f2d5223c9bf761a332e7"},
{file = "uvloop-0.19.0-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:f467a5fd23b4fc43ed86342641f3936a68ded707f4627622fa3f82a120e18256"},
{file = "uvloop-0.19.0-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:492e2c32c2af3f971473bc22f086513cedfc66a130756145a931a90c3958cb17"},
{file = "uvloop-0.19.0-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:2df95fca285a9f5bfe730e51945ffe2fa71ccbfdde3b0da5772b4ee4f2e770d5"},
{file = "uvloop-0.19.0.tar.gz", hash = "sha256:0246f4fd1bf2bf702e06b0d45ee91677ee5c31242f39aab4ea6fe0c51aedd0fd"},
]
[package.extras]
docs = ["Sphinx (>=4.1.2,<4.2.0)", "sphinx-rtd-theme (>=0.5.2,<0.6.0)", "sphinxcontrib-asyncio (>=0.3.0,<0.4.0)"]
test = ["Cython (>=0.29.36,<0.30.0)", "aiohttp (==3.9.0b0)", "aiohttp (>=3.8.1)", "flake8 (>=5.0,<6.0)", "mypy (>=0.800)", "psutil", "pyOpenSSL (>=23.0.0,<23.1.0)", "pycodestyle (>=2.9.0,<2.10.0)"]
[[package]]
name = "watchfiles"
version = "0.21.0"
description = "Simple, modern and high performance file watching and code reload in python."
optional = false
python-versions = ">=3.8"
files = [
{file = "watchfiles-0.21.0-cp310-cp310-macosx_10_7_x86_64.whl", hash = "sha256:27b4035013f1ea49c6c0b42d983133b136637a527e48c132d368eb19bf1ac6aa"},
{file = "watchfiles-0.21.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:c81818595eff6e92535ff32825f31c116f867f64ff8cdf6562cd1d6b2e1e8f3e"},
{file = "watchfiles-0.21.0-cp310-cp310-manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:6c107ea3cf2bd07199d66f156e3ea756d1b84dfd43b542b2d870b77868c98c03"},
{file = "watchfiles-0.21.0-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:0d9ac347653ebd95839a7c607608703b20bc07e577e870d824fa4801bc1cb124"},
{file = "watchfiles-0.21.0-cp310-cp310-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:5eb86c6acb498208e7663ca22dbe68ca2cf42ab5bf1c776670a50919a56e64ab"},
{file = "watchfiles-0.21.0-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:f564bf68404144ea6b87a78a3f910cc8de216c6b12a4cf0b27718bf4ec38d303"},
{file = "watchfiles-0.21.0-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:3d0f32ebfaa9c6011f8454994f86108c2eb9c79b8b7de00b36d558cadcedaa3d"},
{file = "watchfiles-0.21.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:b6d45d9b699ecbac6c7bd8e0a2609767491540403610962968d258fd6405c17c"},
{file = "watchfiles-0.21.0-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:aff06b2cac3ef4616e26ba17a9c250c1fe9dd8a5d907d0193f84c499b1b6e6a9"},
{file = "watchfiles-0.21.0-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:d9792dff410f266051025ecfaa927078b94cc7478954b06796a9756ccc7e14a9"},
{file = "watchfiles-0.21.0-cp310-none-win32.whl", hash = "sha256:214cee7f9e09150d4fb42e24919a1e74d8c9b8a9306ed1474ecaddcd5479c293"},
{file = "watchfiles-0.21.0-cp310-none-win_amd64.whl", hash = "sha256:1ad7247d79f9f55bb25ab1778fd47f32d70cf36053941f07de0b7c4e96b5d235"},
{file = "watchfiles-0.21.0-cp311-cp311-macosx_10_7_x86_64.whl", hash = "sha256:668c265d90de8ae914f860d3eeb164534ba2e836811f91fecc7050416ee70aa7"},
{file = "watchfiles-0.21.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:3a23092a992e61c3a6a70f350a56db7197242f3490da9c87b500f389b2d01eef"},
{file = "watchfiles-0.21.0-cp311-cp311-manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:e7941bbcfdded9c26b0bf720cb7e6fd803d95a55d2c14b4bd1f6a2772230c586"},
{file = "watchfiles-0.21.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:11cd0c3100e2233e9c53106265da31d574355c288e15259c0d40a4405cbae317"},
{file = "watchfiles-0.21.0-cp311-cp311-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:d78f30cbe8b2ce770160d3c08cff01b2ae9306fe66ce899b73f0409dc1846c1b"},
{file = "watchfiles-0.21.0-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:6674b00b9756b0af620aa2a3346b01f8e2a3dc729d25617e1b89cf6af4a54eb1"},
{file = "watchfiles-0.21.0-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:fd7ac678b92b29ba630d8c842d8ad6c555abda1b9ef044d6cc092dacbfc9719d"},
{file = "watchfiles-0.21.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:9c873345680c1b87f1e09e0eaf8cf6c891b9851d8b4d3645e7efe2ec20a20cc7"},
{file = "watchfiles-0.21.0-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:49f56e6ecc2503e7dbe233fa328b2be1a7797d31548e7a193237dcdf1ad0eee0"},
{file = "watchfiles-0.21.0-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:02d91cbac553a3ad141db016e3350b03184deaafeba09b9d6439826ee594b365"},
{file = "watchfiles-0.21.0-cp311-none-win32.whl", hash = "sha256:ebe684d7d26239e23d102a2bad2a358dedf18e462e8808778703427d1f584400"},
{file = "watchfiles-0.21.0-cp311-none-win_amd64.whl", hash = "sha256:4566006aa44cb0d21b8ab53baf4b9c667a0ed23efe4aaad8c227bfba0bf15cbe"},
{file = "watchfiles-0.21.0-cp311-none-win_arm64.whl", hash = "sha256:c550a56bf209a3d987d5a975cdf2063b3389a5d16caf29db4bdddeae49f22078"},
{file = "watchfiles-0.21.0-cp312-cp312-macosx_10_7_x86_64.whl", hash = "sha256:51ddac60b96a42c15d24fbdc7a4bfcd02b5a29c047b7f8bf63d3f6f5a860949a"},
{file = "watchfiles-0.21.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:511f0b034120cd1989932bf1e9081aa9fb00f1f949fbd2d9cab6264916ae89b1"},
{file = "watchfiles-0.21.0-cp312-cp312-manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:cfb92d49dbb95ec7a07511bc9efb0faff8fe24ef3805662b8d6808ba8409a71a"},
{file = "watchfiles-0.21.0-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:3f92944efc564867bbf841c823c8b71bb0be75e06b8ce45c084b46411475a915"},
{file = "watchfiles-0.21.0-cp312-cp312-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:642d66b75eda909fd1112d35c53816d59789a4b38c141a96d62f50a3ef9b3360"},
{file = "watchfiles-0.21.0-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:d23bcd6c8eaa6324fe109d8cac01b41fe9a54b8c498af9ce464c1aeeb99903d6"},
{file = "watchfiles-0.21.0-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:18d5b4da8cf3e41895b34e8c37d13c9ed294954907929aacd95153508d5d89d7"},
{file = "watchfiles-0.21.0-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:1b8d1eae0f65441963d805f766c7e9cd092f91e0c600c820c764a4ff71a0764c"},
{file = "watchfiles-0.21.0-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:1fd9a5205139f3c6bb60d11f6072e0552f0a20b712c85f43d42342d162be1235"},
{file = "watchfiles-0.21.0-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:a1e3014a625bcf107fbf38eece0e47fa0190e52e45dc6eee5a8265ddc6dc5ea7"},
{file = "watchfiles-0.21.0-cp312-none-win32.whl", hash = "sha256:9d09869f2c5a6f2d9df50ce3064b3391d3ecb6dced708ad64467b9e4f2c9bef3"},
{file = "watchfiles-0.21.0-cp312-none-win_amd64.whl", hash = "sha256:18722b50783b5e30a18a8a5db3006bab146d2b705c92eb9a94f78c72beb94094"},
{file = "watchfiles-0.21.0-cp312-none-win_arm64.whl", hash = "sha256:a3b9bec9579a15fb3ca2d9878deae789df72f2b0fdaf90ad49ee389cad5edab6"},
{file = "watchfiles-0.21.0-cp38-cp38-macosx_10_7_x86_64.whl", hash = "sha256:4ea10a29aa5de67de02256a28d1bf53d21322295cb00bd2d57fcd19b850ebd99"},
{file = "watchfiles-0.21.0-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:40bca549fdc929b470dd1dbfcb47b3295cb46a6d2c90e50588b0a1b3bd98f429"},
{file = "watchfiles-0.21.0-cp38-cp38-manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:9b37a7ba223b2f26122c148bb8d09a9ff312afca998c48c725ff5a0a632145f7"},
{file = "watchfiles-0.21.0-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:ec8c8900dc5c83650a63dd48c4d1d245343f904c4b64b48798c67a3767d7e165"},
{file = "watchfiles-0.21.0-cp38-cp38-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:8ad3fe0a3567c2f0f629d800409cd528cb6251da12e81a1f765e5c5345fd0137"},
{file = "watchfiles-0.21.0-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:9d353c4cfda586db2a176ce42c88f2fc31ec25e50212650c89fdd0f560ee507b"},
{file = "watchfiles-0.21.0-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:83a696da8922314ff2aec02987eefb03784f473281d740bf9170181829133765"},
{file = "watchfiles-0.21.0-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:5a03651352fc20975ee2a707cd2d74a386cd303cc688f407296064ad1e6d1562"},
{file = "watchfiles-0.21.0-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:3ad692bc7792be8c32918c699638b660c0de078a6cbe464c46e1340dadb94c19"},
{file = "watchfiles-0.21.0-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:06247538e8253975bdb328e7683f8515ff5ff041f43be6c40bff62d989b7d0b0"},
{file = "watchfiles-0.21.0-cp38-none-win32.whl", hash = "sha256:9a0aa47f94ea9a0b39dd30850b0adf2e1cd32a8b4f9c7aa443d852aacf9ca214"},
{file = "watchfiles-0.21.0-cp38-none-win_amd64.whl", hash = "sha256:8d5f400326840934e3507701f9f7269247f7c026d1b6cfd49477d2be0933cfca"},
{file = "watchfiles-0.21.0-cp39-cp39-macosx_10_7_x86_64.whl", hash = "sha256:7f762a1a85a12cc3484f77eee7be87b10f8c50b0b787bb02f4e357403cad0c0e"},
{file = "watchfiles-0.21.0-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:6e9be3ef84e2bb9710f3f777accce25556f4a71e15d2b73223788d528fcc2052"},
{file = "watchfiles-0.21.0-cp39-cp39-manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:4c48a10d17571d1275701e14a601e36959ffada3add8cdbc9e5061a6e3579a5d"},
{file = "watchfiles-0.21.0-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:6c889025f59884423428c261f212e04d438de865beda0b1e1babab85ef4c0f01"},
{file = "watchfiles-0.21.0-cp39-cp39-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:66fac0c238ab9a2e72d026b5fb91cb902c146202bbd29a9a1a44e8db7b710b6f"},
{file = "watchfiles-0.21.0-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:b4a21f71885aa2744719459951819e7bf5a906a6448a6b2bbce8e9cc9f2c8128"},
{file = "watchfiles-0.21.0-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:1c9198c989f47898b2c22201756f73249de3748e0fc9de44adaf54a8b259cc0c"},
{file = "watchfiles-0.21.0-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:d8f57c4461cd24fda22493109c45b3980863c58a25b8bec885ca8bea6b8d4b28"},
{file = "watchfiles-0.21.0-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:853853cbf7bf9408b404754b92512ebe3e3a83587503d766d23e6bf83d092ee6"},
{file = "watchfiles-0.21.0-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:d5b1dc0e708fad9f92c296ab2f948af403bf201db8fb2eb4c8179db143732e49"},
{file = "watchfiles-0.21.0-cp39-none-win32.whl", hash = "sha256:59137c0c6826bd56c710d1d2bda81553b5e6b7c84d5a676747d80caf0409ad94"},
{file = "watchfiles-0.21.0-cp39-none-win_amd64.whl", hash = "sha256:6cb8fdc044909e2078c248986f2fc76f911f72b51ea4a4fbbf472e01d14faa58"},
{file = "watchfiles-0.21.0-pp310-pypy310_pp73-macosx_10_7_x86_64.whl", hash = "sha256:ab03a90b305d2588e8352168e8c5a1520b721d2d367f31e9332c4235b30b8994"},
{file = "watchfiles-0.21.0-pp310-pypy310_pp73-macosx_11_0_arm64.whl", hash = "sha256:927c589500f9f41e370b0125c12ac9e7d3a2fd166b89e9ee2828b3dda20bfe6f"},
{file = "watchfiles-0.21.0-pp310-pypy310_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:1bd467213195e76f838caf2c28cd65e58302d0254e636e7c0fca81efa4a2e62c"},
{file = "watchfiles-0.21.0-pp310-pypy310_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:02b73130687bc3f6bb79d8a170959042eb56eb3a42df3671c79b428cd73f17cc"},
{file = "watchfiles-0.21.0-pp38-pypy38_pp73-macosx_10_7_x86_64.whl", hash = "sha256:08dca260e85ffae975448e344834d765983237ad6dc308231aa16e7933db763e"},
{file = "watchfiles-0.21.0-pp38-pypy38_pp73-macosx_11_0_arm64.whl", hash = "sha256:3ccceb50c611c433145502735e0370877cced72a6c70fd2410238bcbc7fe51d8"},
{file = "watchfiles-0.21.0-pp38-pypy38_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:57d430f5fb63fea141ab71ca9c064e80de3a20b427ca2febcbfcef70ff0ce895"},
{file = "watchfiles-0.21.0-pp38-pypy38_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:0dd5fad9b9c0dd89904bbdea978ce89a2b692a7ee8a0ce19b940e538c88a809c"},
{file = "watchfiles-0.21.0-pp39-pypy39_pp73-macosx_10_7_x86_64.whl", hash = "sha256:be6dd5d52b73018b21adc1c5d28ac0c68184a64769052dfeb0c5d9998e7f56a2"},
{file = "watchfiles-0.21.0-pp39-pypy39_pp73-macosx_11_0_arm64.whl", hash = "sha256:b3cab0e06143768499384a8a5efb9c4dc53e19382952859e4802f294214f36ec"},
{file = "watchfiles-0.21.0-pp39-pypy39_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:8c6ed10c2497e5fedadf61e465b3ca12a19f96004c15dcffe4bd442ebadc2d85"},
{file = "watchfiles-0.21.0-pp39-pypy39_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:43babacef21c519bc6631c5fce2a61eccdfc011b4bcb9047255e9620732c8097"},
{file = "watchfiles-0.21.0.tar.gz", hash = "sha256:c76c635fabf542bb78524905718c39f736a98e5ab25b23ec6d4abede1a85a6a3"},
]
[package.dependencies]
anyio = ">=3.0.0"
[[package]]
name = "websockets"
version = "12.0"
@ -2891,4 +3240,4 @@ local = []
[metadata]
lock-version = "2.0"
python-versions = ">=3.10,<3.13"
content-hash = "200c17e119f7ba7fdb64de320bdf464c65daf06f62bcc41258b32247a99e3dc1"
content-hash = "33e71f349d108a5bc98b0f8cd0f5c14736202f3db30b0ea1acf588163ef5fbe3"

View file

@ -26,18 +26,18 @@ langflow-base = "langflow.__main__:main"
[tool.poetry.dependencies]
python = ">=3.10,<3.13"
fastapi = "^0.110.1"
fastapi = "^0.111.0"
httpx = "*"
uvicorn = "^0.29.0"
gunicorn = "^22.0.0"
langchain = "~0.1.16"
langchain = "~0.2.0"
langchainhub = "~0.1.15"
sqlmodel = "^0.0.16"
sqlmodel = "^0.0.18"
loguru = "^0.7.1"
rich = "^13.7.0"
langchain-experimental = "*"
pydantic = "^2.5.0"
pydantic-settings = "^2.1.0"
pydantic = "^2.7.0"
pydantic-settings = "^2.2.0"
websockets = "*"
typer = "^0.12.0"
cachetools = "^5.3.1"
@ -56,9 +56,9 @@ duckdb = "^0.10.2"
python-socketio = "^5.11.0"
python-docx = "^1.1.0"
jq = { version = "^1.7.0", markers = "sys_platform != 'win32'" }
pypdf = "^4.1.0"
pypdf = "^4.2.0"
nest-asyncio = "^1.6.0"
emoji = "^2.11.0"
emoji = "^2.12.0"
cryptography = "^42.0.5"
asyncer = "^0.0.5"

View file

@ -15,6 +15,7 @@ import {
} from "./constants/constants";
import { AuthContext } from "./contexts/authContext";
import { autoLogin, getGlobalVariables, getHealth } from "./controllers/API";
import useTrackLastVisitedPath from "./hooks/use-track-last-visited-path";
import Router from "./routes";
import useAlertStore from "./stores/alertStore";
import { useDarkStore } from "./stores/darkStore";
@ -24,6 +25,8 @@ import { useGlobalVariablesStore } from "./stores/globalVariablesStore/globalVar
import { useStoreStore } from "./stores/storeStore";
import { useTypesStore } from "./stores/typesStore";
export default function App() {
useTrackLastVisitedPath();
const removeFromTempNotificationList = useAlertStore(
(state) => state.removeFromTempNotificationList,
);
@ -104,7 +107,6 @@ export default function App() {
const fetchAllData = async () => {
setTimeout(async () => {
await Promise.all([refreshStars(), refreshVersion(), fetchData()]);
getFoldersApi();
}, 1000);
};
@ -112,6 +114,7 @@ export default function App() {
return new Promise<void>(async (resolve, reject) => {
if (isAuthenticated) {
try {
await getFoldersApi();
await getTypes();
await refreshFlows();
const res = await getGlobalVariables();
@ -208,7 +211,7 @@ export default function App() {
<div className="flex flex-col-reverse" style={{ zIndex: 999 }}>
{tempNotificationList.map((alert) => (
<div key={alert.id}>
{alert.type === "error" && (
{alert.type === "error" ? (
<ErrorAlert
key={alert.id}
title={alert.title}
@ -216,26 +219,12 @@ export default function App() {
id={alert.id}
removeAlert={removeAlert}
/>
)}
</div>
))}
</div>
<div className="z-40 flex flex-col-reverse">
{tempNotificationList.map((alert) => (
<div key={alert.id}>
{alert.type === "notice" ? (
<NoticeAlert
key={alert.id}
title={alert.title}
link={alert.link}
id={alert.id}
removeAlert={removeAlert}
/>
) : (
alert.type === "success" && (
<SuccessAlert
alert.type === "notice" && (
<NoticeAlert
key={alert.id}
title={alert.title}
link={alert.link}
id={alert.id}
removeAlert={removeAlert}
/>
@ -244,6 +233,20 @@ export default function App() {
</div>
))}
</div>
<div className="z-40 flex flex-col-reverse">
{tempNotificationList.map((alert) => (
<div key={alert.id}>
{alert.type === "success" && (
<SuccessAlert
key={alert.id}
title={alert.title}
id={alert.id}
removeAlert={removeAlert}
/>
)}
</div>
))}
</div>
</div>
</div>
);

View file

@ -1,3 +1,3 @@
export default function sortByName(stringList: string[]): string[] {
return stringList.sort((a, b) => a.localeCompare(b));
}
}

View file

@ -1,3 +1,3 @@
export function convertTestName(name: string): string {
return name.replace(/ /g, "-").toLowerCase();
return name.replace(/ /g, "-").toLowerCase();
}

View file

@ -8,7 +8,6 @@ import {
} from "../../../ui/dropdown-menu";
import { useNavigate } from "react-router-dom";
import { Node } from "reactflow";
import { UPLOAD_ERROR_ALERT } from "../../../../constants/alerts_constants";
import { SAVED_HOVER } from "../../../../constants/constants";
import ExportModal from "../../../../modals/exportModal";
@ -22,11 +21,7 @@ import IconComponent from "../../../genericIconComponent";
import ShadTooltip from "../../../shadTooltipComponent";
import { Button } from "../../../ui/button";
export const MenuBar = ({
removeFunction,
}: {
removeFunction: (nodes: Node[]) => void;
}): JSX.Element => {
export const MenuBar = ({}: {}): JSX.Element => {
const addFlow = useFlowsManagerStore((state) => state.addFlow);
const currentFlow = useFlowsManagerStore((state) => state.currentFlow);
const setErrorData = useAlertStore((state) => state.setErrorData);
@ -36,7 +31,6 @@ export const MenuBar = ({
const saveLoading = useFlowsManagerStore((state) => state.saveLoading);
const [openSettings, setOpenSettings] = useState(false);
const [openLogs, setOpenLogs] = useState(false);
const nodes = useFlowStore((state) => state.nodes);
const uploadFlow = useFlowsManagerStore((state) => state.uploadFlow);
const navigate = useNavigate();
const isBuilding = useFlowStore((state) => state.isBuilding);
@ -72,14 +66,6 @@ export const MenuBar = ({
return currentFlow ? (
<div className="round-button-div">
<button
onClick={() => {
removeFunction(nodes);
navigate("/");
}}
>
<IconComponent name="ChevronLeft" className="w-4" />
</button>
<div className="header-menu-bar">
<DropdownMenu>
<DropdownMenuTrigger asChild>

View file

@ -3,14 +3,17 @@ import { FaDiscord, FaGithub } from "react-icons/fa";
import { RiTwitterXFill } from "react-icons/ri";
import { Link, useLocation, useNavigate, useParams } from "react-router-dom";
import AlertDropdown from "../../alerts/alertDropDown";
import { USER_PROJECTS_HEADER } from "../../constants/constants";
import {
LOCATIONS_TO_RETURN,
USER_PROJECTS_HEADER,
} from "../../constants/constants";
import { AuthContext } from "../../contexts/authContext";
import { Node } from "reactflow";
import useAlertStore from "../../stores/alertStore";
import { useDarkStore } from "../../stores/darkStore";
import useFlowStore from "../../stores/flowStore";
import useFlowsManagerStore from "../../stores/flowsManagerStore";
import { useLocationStore } from "../../stores/locationStore";
import { useStoreStore } from "../../stores/storeStore";
import { gradients } from "../../utils/styleUtils";
import IconComponent from "../genericIconComponent";
@ -29,6 +32,7 @@ import MenuBar from "./components/menuBar";
export default function Header(): JSX.Element {
const notificationCenter = useAlertStore((state) => state.notificationCenter);
const location = useLocation();
const { logout, autoLogin, isAdmin, userData } = useContext(AuthContext);
const navigate = useNavigate();
const removeFlow = useFlowsManagerStore((store) => store.removeFlow);
@ -40,20 +44,56 @@ export default function Header(): JSX.Element {
const setDark = useDarkStore((state) => state.setDark);
const stars = useDarkStore((state) => state.stars);
async function checkForChanges(nodes: Node[]): Promise<void> {
const routeHistory = useLocationStore((state) => state.routeHistory);
async function checkForChanges(): Promise<void> {
if (nodes.length === 0) {
await removeFlow(id!);
}
}
const redirectToLastLocation = () => {
const lastFlowVisitedIndex = routeHistory
.reverse()
.findIndex(
(path) => path.includes("/flow/") && path !== location.pathname,
);
const lastFlowVisited = routeHistory[lastFlowVisitedIndex];
lastFlowVisited && !location.pathname.includes("/flow")
? navigate(lastFlowVisited)
: navigate("/all");
};
const visitedFlowPathBefore = () => {
const lastThreeVisitedPaths = routeHistory.slice(-3);
return lastThreeVisitedPaths.some((path) => path.includes("/flow/"));
};
const showArrowReturnIcon =
LOCATIONS_TO_RETURN.some((path) => location.pathname.includes(path)) &&
visitedFlowPathBefore();
return (
<div className="header-arrangement">
<div className="header-start-display lg:w-[30%]">
<Link to="/" onClick={() => checkForChanges(nodes)}>
<Link to="/all" className="cursor-pointer" onClick={checkForChanges}>
<span className="ml-4 text-2xl"></span>
</Link>
<MenuBar removeFunction={checkForChanges} />
{showArrowReturnIcon && (
<button
onClick={() => {
checkForChanges();
redirectToLastLocation();
}}
>
<IconComponent name="ChevronLeft" className="w-4" />
</button>
)}
<MenuBar />
</div>
<div className="round-button-div">
<Link to="/">
<Button
@ -65,9 +105,7 @@ export default function Header(): JSX.Element {
: "secondary"
}
size="sm"
onClick={() => {
checkForChanges(nodes);
}}
onClick={checkForChanges}
>
<IconComponent name="Home" className="h-4 w-4" />
<div className="hidden flex-1 md:block">{USER_PROJECTS_HEADER}</div>
@ -80,9 +118,7 @@ export default function Header(): JSX.Element {
className="gap-2"
variant={location.pathname === "/store" ? "primary" : "secondary"}
size="sm"
onClick={() => {
checkForChanges(nodes);
}}
onClick={checkForChanges}
data-testid="button-store"
>
<IconComponent name="Store" className="h-4 w-4" />

View file

@ -33,6 +33,8 @@ export default function InputComponent({
optionButton,
objectOptions,
isObjectOption = false,
name,
onChangeFolderName,
}: InputComponentType): JSX.Element {
const [pwdVisible, setPwdVisible] = useState(false);
const refInput = useRef<HTMLInputElement>(null);
@ -53,6 +55,7 @@ export default function InputComponent({
{isForm ? (
<Form.Control asChild>
<Input
name={name}
id={"form-" + id}
ref={refInput}
onBlur={onInputLostFocus}
@ -72,6 +75,9 @@ export default function InputComponent({
)}
placeholder={password && editNode ? "Key" : placeholder}
onChange={(e) => {
if (onChangeFolderName) {
return onChangeFolderName(e);
}
onChange && onChange(e.target.value);
}}
onCopy={(e) => {

View file

@ -11,10 +11,7 @@ type SideBarButtonsComponentProps = {
pathname: string;
handleOpenNewFolderModal?: () => void;
};
const SideBarButtonsComponent = ({
items,
handleOpenNewFolderModal,
}: SideBarButtonsComponentProps) => {
const SideBarButtonsComponent = ({ items }: SideBarButtonsComponentProps) => {
return (
<>
{items.map((item) => (
@ -26,7 +23,6 @@ const SideBarButtonsComponent = ({
buttonVariants({ variant: "ghost" }),
"!w-[200px] cursor-pointer justify-start gap-2 border border-transparent hover:border-border hover:bg-transparent",
)}
onClick={handleOpenNewFolderModal}
>
{item.title}
</div>

View file

@ -1,16 +1,18 @@
import { useEffect, useRef, useState } from "react";
import { useLocation } from "react-router-dom";
import { FolderType } from "../../../../pages/MainPage/entities";
import { addFolder, updateFolder } from "../../../../pages/MainPage/services";
import { handleDownloadFolderFn } from "../../../../pages/MainPage/utils/handle-download-folder";
import useFlowsManagerStore from "../../../../stores/flowsManagerStore";
import { useFolderStore } from "../../../../stores/foldersStore";
import { handleKeyDown } from "../../../../utils/reactflowUtils";
import { cn } from "../../../../utils/utils";
import DropdownButton from "../../../dropdownButtonComponent";
import IconComponent, {
ForwardedIconComponent,
} from "../../../genericIconComponent";
import { Button, buttonVariants } from "../../../ui/button";
import { Input } from "../../../ui/input";
import useFileDrop from "../../hooks/use-on-file-drop";
import useFlowsManagerStore from "../../../../stores/flowsManagerStore";
import { handleDownloadFolderFn } from "../../../../pages/MainPage/utils/handle-download-folder";
import useAlertStore from "../../../../stores/alertStore";
type SideBarFoldersButtonsComponentProps = {
folders: FolderType[];
@ -18,22 +20,27 @@ type SideBarFoldersButtonsComponentProps = {
handleChangeFolder?: (id: string) => void;
handleEditFolder?: (item: FolderType) => void;
handleDeleteFolder?: (item: FolderType) => void;
handleAddFolder?: () => void;
};
const SideBarFoldersButtonsComponent = ({
folders,
pathname,
handleAddFolder,
handleChangeFolder,
handleEditFolder,
handleDeleteFolder,
}: SideBarFoldersButtonsComponentProps) => {
const refInput = useRef<HTMLInputElement>(null);
const setFolders = useFolderStore((state) => state.setFolders);
const folders = useFolderStore((state) => state.folders);
const [foldersNames, setFoldersNames] = useState({});
const takeSnapshot = useFlowsManagerStore((state) => state.takeSnapshot);
const [editFolders, setEditFolderName] = useState(
folders.map((obj) => ({ name: obj.name, edit: false })),
);
const uploadFolder = useFolderStore((state) => state.uploadFolder);
const currentFolder = pathname.split("/");
const urlWithoutPath = pathname.split("/").length < 4;
const myCollectionId = useFolderStore((state) => state.myCollectionId);
const allFlows = useFlowsManagerStore((state) => state.allFlows);
const setErrorData = useAlertStore((state) => state.setErrorData);
const getFoldersApi = useFolderStore((state) => state.getFoldersApi);
const folderIdDragging = useFolderStore((state) => state.folderIdDragging);
const checkPathName = (itemId: string) => {
if (urlWithoutPath && itemId === myCollectionId) {
@ -62,20 +69,44 @@ const SideBarFoldersButtonsComponent = ({
handleDownloadFolderFn(id);
};
function addNewFolder() {
addFolder({ name: "New Folder", parent_id: null, description: "" }).then(
(res) => {
getFoldersApi(true);
},
);
}
function handleEditFolderName(e, name): void {
const {
target: { value },
} = e;
setFoldersNames((old) => ({
...old,
[name]: value,
}));
}
useEffect(() => {
folders.map((obj) => ({ name: obj.name, edit: false }));
}, [folders]);
console.log(folderId, folderIdDragging);
return (
<>
<div className="flex shrink-0 items-center justify-between">
<DropdownButton
firstButtonName="New Folder"
onFirstBtnClick={handleAddFolder!}
options={[]}
plusButton={true}
dropdownOptions={false}
/>
<Button variant="primary" onClick={addNewFolder}>
<ForwardedIconComponent
name="Plus"
className="main-page-nav-button"
/>
New Folder
</Button>
<Button
variant="primary"
onClick={handleUploadFlowsToFolder}
className="px-7"
onClick={handleUploadFlowsToFolder}
>
<ForwardedIconComponent
name="Upload"
@ -87,81 +118,206 @@ const SideBarFoldersButtonsComponent = ({
<div className="flex gap-2 overflow-auto lg:h-[70vh] lg:flex-col">
<>
{folders.map((item, index) => (
<div
onDragOver={dragOver}
onDragEnter={dragEnter}
onDragLeave={dragLeave}
onDrop={(e) => onDrop(e, item.id!)}
key={item.id}
data-testid={`sidebar-nav-${item.name}`}
className={cn(
buttonVariants({ variant: "ghost" }),
checkPathName(item.id!)
? "border border-border bg-muted hover:bg-muted"
: "border hover:bg-transparent lg:border-transparent lg:hover:border-border",
"group flex w-full shrink-0 cursor-pointer gap-2 opacity-100 lg:min-w-full",
)}
onClick={() => handleChangeFolder!(item.id!)}
>
<div className="flex w-full items-center gap-2">
<IconComponent
name={"folder"}
className="mr-2 w-4 flex-shrink-0 justify-start stroke-[1.5] opacity-100"
/>
<span className="block max-w-full truncate opacity-100">
{item.name}
</span>
<div className="flex-1" />
{index > 0 && (
<Button
className="hidden p-0 hover:bg-white group-hover:block hover:dark:bg-[#0c101a00]"
onClick={(e) => {
handleDeleteFolder!(item);
e.stopPropagation();
e.preventDefault();
}}
variant={"ghost"}
>
<IconComponent
name={"trash"}
className=" w-4 stroke-[1.5]"
/>
</Button>
{folders.map((item, index) => {
const editFolderName = editFolders?.filter(
(folder) => folder.name === item.name,
)[0];
return (
<div
onDragOver={(e) => dragOver(e, item.id!)}
onDragEnter={(e) => dragEnter(e, item.id!)}
onDragLeave={dragLeave}
onDrop={(e) => onDrop(e, item.id!)}
key={item.id}
data-testid={`sidebar-nav-${item.name}`}
className={cn(
buttonVariants({ variant: "ghost" }),
checkPathName(item.id!)
? "border border-border bg-muted hover:bg-muted"
: "border hover:bg-transparent lg:border-transparent lg:hover:border-border",
"group flex w-full shrink-0 cursor-pointer gap-2 opacity-100 lg:min-w-full",
folderIdDragging === item.id! ? "bg-border" : "",
)}
{index > 0 && (
onClick={() => handleChangeFolder!(item.id!)}
>
<div
onDoubleClick={(event) => {
if (item.name === "My Projects") {
return;
}
if (!foldersNames[item.name]) {
setFoldersNames({ [item.name]: item.name });
}
if (
editFolders.find((obj) => obj.name === item.name)?.name
) {
const newEditFolders = editFolders.map((obj) => {
if (obj.name === item.name) {
return { name: item.name, edit: true };
}
return { name: obj.name, edit: false };
});
setEditFolderName(newEditFolders);
takeSnapshot();
event.stopPropagation();
event.preventDefault();
return;
}
setEditFolderName((old) => [
...old,
{ name: item.name, edit: true },
]);
setFoldersNames((oldFolder) => ({
...oldFolder,
[item.name]: item.name,
}));
takeSnapshot();
event.stopPropagation();
event.preventDefault();
}}
className="flex w-full items-center gap-2"
>
<IconComponent
name={"folder"}
className="mr-2 w-4 flex-shrink-0 justify-start stroke-[1.5] opacity-100"
/>
{editFolderName?.edit ? (
<div>
<Input
className="w-36"
onChange={(e) => {
handleEditFolderName(e, item.name);
}}
ref={refInput}
onKeyDown={(e) => {
if (e.key === "Escape") {
const newEditFolders = editFolders.map((obj) => {
if (obj.name === item.name) {
return { name: item.name, edit: false };
}
return { name: obj.name, edit: false };
});
setEditFolderName(newEditFolders);
setFoldersNames({});
setEditFolderName(
folders.map((obj) => ({
name: obj.name,
edit: false,
})),
);
}
if (e.key === "Enter") {
refInput.current?.blur();
}
handleKeyDown(e, e.key, "");
}}
autoFocus={true}
onBlur={async () => {
const newEditFolders = editFolders.map((obj) => {
if (obj.name === item.name) {
return { name: item.name, edit: false };
}
return { name: obj.name, edit: false };
});
setEditFolderName(newEditFolders);
if (foldersNames[item.name].trim() !== "") {
setFoldersNames((old) => ({
...old,
[item.name]: foldersNames[item.name],
}));
const body = {
...item,
name: foldersNames[item.name],
flows: item.flows?.length > 0 ? item.flows : [],
components:
item.components?.length > 0
? item.components
: [],
};
const updatedFolder = await updateFolder(
body,
item.id!,
);
const updateFolders = folders.filter(
(f) => f.name !== item.name,
);
setFolders([...updateFolders, updatedFolder]);
setFoldersNames({});
setEditFolderName(
folders.map((obj) => ({
name: obj.name,
edit: false,
})),
);
} else {
setFoldersNames((old) => ({
...old,
[item.name]: item.name,
}));
}
}}
value={foldersNames[item.name]}
id={`input-folder-${item.name}`}
/>
</div>
) : (
<span className="block max-w-full truncate opacity-100">
{item.name}
</span>
)}
<div className="flex-1" />
{index > 0 && (
<Button
className="hidden p-0 hover:bg-white group-hover:block hover:dark:bg-[#0c101a00]"
onClick={(e) => {
handleDeleteFolder!(item);
e.stopPropagation();
e.preventDefault();
}}
variant={"ghost"}
>
<IconComponent
name={"trash"}
className=" w-4 stroke-[1.5]"
/>
</Button>
)}
{/* {index > 0 && (
<Button
className="hidden p-0 hover:bg-white group-hover:block hover:dark:bg-[#0c101a00]"
onClick={(e) => {
e.stopPropagation();
e.preventDefault();
}}
variant={"ghost"}
>
<IconComponent
name={"pencil"}
className=" w-4 stroke-[1.5] text-white "
/>
</Button>
)} */}
<Button
className="hidden p-0 hover:bg-white group-hover:block hover:dark:bg-[#0c101a00]"
onClick={(e) => {
handleEditFolder!(item);
handleDownloadFolder(item.id!);
e.stopPropagation();
e.preventDefault();
}}
variant={"ghost"}
>
<IconComponent
name={"pencil"}
name={"Download"}
className=" w-4 stroke-[1.5] text-white "
/>
</Button>
)}
<Button
className="hidden p-0 hover:bg-white group-hover:block hover:dark:bg-[#0c101a00]"
onClick={(e) => {
handleDownloadFolder(item.id!);
e.stopPropagation();
e.preventDefault();
}}
variant={"ghost"}
>
<IconComponent
name={"Download"}
className=" w-4 stroke-[1.5] text-white "
/>
</Button>
</div>
</div>
</div>
))}
);
})}
</>
</div>
</>

View file

@ -7,13 +7,16 @@ import { uploadFlowsFromFolders } from "../../../pages/MainPage/services";
import useAlertStore from "../../../stores/alertStore";
import useFlowsManagerStore from "../../../stores/flowsManagerStore";
import { useFolderStore } from "../../../stores/foldersStore";
import { FlowType } from "../../../types/flow";
import { addVersionToDuplicates } from "../../../utils/reactflowUtils";
const useFileDrop = (folderId, folderChangeCallback) => {
const setFolderDragging = useFolderStore((state) => state.setFolderDragging);
const setFolderIdDragging = useFolderStore(
(state) => state.setFolderIdDragging,
);
const setErrorData = useAlertStore((state) => state.setErrorData);
const getFoldersApi = useFolderStore((state) => state.getFoldersApi);
const refreshFlows = useFlowsManagerStore((state) => state.refreshFlows);
const flows = useFlowsManagerStore((state) => state.flows);
const triggerFolderChange = (folderId) => {
@ -42,12 +45,14 @@ const useFileDrop = (folderId, folderChangeCallback) => {
| React.DragEvent<HTMLDivElement>
| React.DragEvent<HTMLButtonElement>
| React.DragEvent<HTMLAnchorElement>,
folderId: string,
) => {
e.preventDefault();
if (e.dataTransfer.types.some((types) => types === "Files")) {
setFolderDragging(true);
}
setFolderIdDragging(folderId);
};
const dragEnter = (
@ -55,10 +60,12 @@ const useFileDrop = (folderId, folderChangeCallback) => {
| React.DragEvent<HTMLDivElement>
| React.DragEvent<HTMLButtonElement>
| React.DragEvent<HTMLAnchorElement>,
folderId: string,
) => {
if (e.dataTransfer.types.some((types) => types === "Files")) {
setFolderDragging(true);
}
setFolderIdDragging(folderId);
e.preventDefault();
};
@ -71,6 +78,7 @@ const useFileDrop = (folderId, folderChangeCallback) => {
e.preventDefault();
if (e.target === e.currentTarget) {
setFolderDragging(false);
setFolderIdDragging("");
}
};
@ -92,7 +100,6 @@ const useFileDrop = (folderId, folderChangeCallback) => {
e.preventDefault();
handleFileDrop(e);
setFolderDragging(false);
};
const uploadFromDragCard = (flowId, folderId) => {
@ -101,11 +108,15 @@ const useFileDrop = (folderId, folderChangeCallback) => {
if (!selectedFlow) {
throw new Error("Flow not found");
}
const updatedFlow = { ...selectedFlow, folder_id: folderId };
const newName = addVersionToDuplicates(updatedFlow, flows);
updatedFlow.name = newName;
setFolderDragging(false);
setFolderIdDragging("");
const updatedFlow: FlowType = {
...selectedFlow,
folder_id: folderId,
};
updateFlowInDatabase(updatedFlow).then(() => {
getFoldersApi(true);
triggerFolderChange(folderId);
@ -115,11 +126,11 @@ const useFileDrop = (folderId, folderChangeCallback) => {
const uploadFormData = (data) => {
const formData = new FormData();
formData.append("file", data);
setFolderDragging(false);
setFolderIdDragging("");
uploadFlowsFromFolders(formData).then(() => {
getFoldersApi(true);
triggerFolderChange(folderId);
refreshFlows();
});
};

View file

@ -5,6 +5,9 @@ import { cn } from "../../utils/utils";
import HorizontalScrollFadeComponent from "../horizontalScrollFadeComponent";
import SideBarButtonsComponent from "./components/sideBarButtons";
import SideBarFoldersButtonsComponent from "./components/sideBarFolderButtons";
import { addFolder } from "../../pages/MainPage/services";
import { useNavigate } from "react-router-dom";
import useFlowStore from "../../stores/flowStore";
type SidebarNavProps = {
items: {
@ -22,7 +25,6 @@ type SidebarNavProps = {
export default function SidebarNav({
className,
items,
handleOpenNewFolderModal,
handleChangeFolder,
handleEditFolder,
handleDeleteFolder,
@ -39,11 +41,7 @@ export default function SidebarNav({
return (
<nav className={cn(className)} {...props}>
<HorizontalScrollFadeComponent>
<SideBarButtonsComponent
items={items}
pathname={pathname}
handleOpenNewFolderModal={handleOpenNewFolderModal}
/>
<SideBarButtonsComponent items={items} pathname={pathname} />
{!loadingFolders && folders?.length > 0 && isFolderPath && (
<SideBarFoldersButtonsComponent
@ -52,7 +50,6 @@ export default function SidebarNav({
handleChangeFolder={handleChangeFolder}
handleEditFolder={handleEditFolder}
handleDeleteFolder={handleDeleteFolder}
handleAddFolder={handleOpenNewFolderModal}
/>
)}
</HorizontalScrollFadeComponent>

View file

@ -32,51 +32,6 @@ const TableComponent = forwardRef<
ref,
) => {
const dark = useDarkStore((state) => state.dark);
var currentRowHeight: number;
var minRowHeight = 25;
const getRowHeight = useCallback(() => {
return currentRowHeight;
}, []);
const onGridReady = useCallback((params: any) => {
minRowHeight = params.api.getSizesForCurrentTheme().rowHeight;
currentRowHeight = minRowHeight;
}, []);
const updateRowHeight = (params: { api: any }) => {
const bodyViewport = document.querySelector(".ag-body-viewport");
if (!bodyViewport) {
return;
}
var gridHeight = bodyViewport.clientHeight;
var renderedRowCount = params.api.getDisplayedRowCount();
if (renderedRowCount * minRowHeight >= gridHeight) {
if (currentRowHeight !== minRowHeight) {
currentRowHeight = minRowHeight;
params.api.resetRowHeights();
}
} else {
currentRowHeight = Math.floor(gridHeight / renderedRowCount);
params.api.resetRowHeights();
}
};
const onFirstDataRendered = useCallback(
(params: any) => {
updateRowHeight(params);
},
[updateRowHeight],
);
const onGridSizeChanged = useCallback(
(params: any) => {
updateRowHeight(params);
},
[updateRowHeight],
);
if (props.rowData.length === 0) {
return (
<div className="flex h-full w-full items-center justify-center rounded-md border">
@ -102,10 +57,6 @@ const TableComponent = forwardRef<
<AgGridReact
{...props}
className={cn(props.className, "custom-scroll")}
getRowHeight={getRowHeight}
onGridReady={onGridReady}
onFirstDataRendered={onFirstDataRendered}
onGridSizeChanged={onGridSizeChanged}
defaultColDef={{
minWidth: 100,
}}

View file

@ -800,8 +800,19 @@ export const NATIVE_CATEGORIES = [
"agents",
];
export const AUTHORIZED_DUPLICATE_REQUESTS = [
"/health",
"/flows",
"/logout",
"/refresh",
"/login",
"/auto_login",
];
export const SAVE_DEBOUNCE_TIME = 300;
export const DEFAULT_TABLE_ALERT_MSG = `Oops! It seems there's no data to display right now. Please check back later.`;
export const DEFAULT_TABLE_ALERT_TITLE = "No Data Available";
export const LOCATIONS_TO_RETURN = ["/flow/", "/settings/"];

View file

@ -2,6 +2,7 @@ import axios, { AxiosError, AxiosInstance } from "axios";
import { useContext, useEffect } from "react";
import { Cookies } from "react-cookie";
import { renewAccessToken } from ".";
import { AUTHORIZED_DUPLICATE_REQUESTS } from "../../constants/constants";
import { BuildStatus } from "../../constants/enums";
import { AuthContext } from "../../contexts/authContext";
import useAlertStore from "../../stores/alertStore";
@ -81,16 +82,26 @@ function ApiInterceptor() {
const requestInterceptor = api.interceptors.request.use(
(config) => {
const lastUrl = localStorage.getItem("lastUrlCalled");
const lastMethodCalled = localStorage.getItem("lastMethodCalled");
const isContained = AUTHORIZED_DUPLICATE_REQUESTS.some((request) =>
config?.url!.includes(request),
);
if (
config?.url === lastUrl &&
config?.url !== "/health" &&
config?.method === "get"
!isContained &&
lastMethodCalled === config.method
) {
return Promise.reject("Duplicate request");
}
localStorage.setItem("lastUrlCalled", config.url ?? "");
localStorage.setItem("lastMethodCalled", config.method ?? "");
localStorage.setItem(
"lastRequestData",
JSON.stringify(config.data) ?? "",
);
const accessToken = cookies.get("access_token_lf");
if (accessToken && !isAuthorizedURL(config?.url)) {

View file

@ -173,8 +173,6 @@ export default function ParameterComponent({
renderTooltips();
}, [tooltipTitle, flow]);
console.log(left === true && type === "dict");
return !showNode ? (
left && LANGFLOW_SUPPORTED_TYPES.has(type ?? "") && !optionalHandle ? (
<></>

View file

@ -1,10 +1,10 @@
import { APITemplateType } from "../../types/api";
export default function getFieldTitle(
template: APITemplateType,
templateField: string,
): string {
return template[templateField].display_name
? template[templateField].display_name!
: template[templateField].name ?? templateField;
}
template: APITemplateType,
templateField: string,
): string {
return template[templateField].display_name
? template[templateField].display_name!
: template[templateField].name ?? templateField;
}

View file

@ -1,40 +1,40 @@
import { priorityFields } from "../../constants/constants";
export default function sortFields(a, b, fieldOrder) {
// Early return for empty fields
if (!a && !b) return 0;
if (!a) return 1;
if (!b) return -1;
// Normalize the case to ensure case-insensitive comparison
const normalizedFieldA = a.toLowerCase();
const normalizedFieldB = b.toLowerCase();
const aIsPriority = priorityFields.has(normalizedFieldA);
const bIsPriority = priorityFields.has(normalizedFieldB);
// Sort by priority
if (aIsPriority && !bIsPriority) return -1;
if (!aIsPriority && bIsPriority) return 1;
// Check if either field is in the fieldOrder array
const indexOfA = fieldOrder.indexOf(normalizedFieldA);
const indexOfB = fieldOrder.indexOf(normalizedFieldB);
// If both fields are in fieldOrder, sort by their order in the array
if (indexOfA !== -1 && indexOfB !== -1) {
return indexOfA - indexOfB;
}
// If only one of the fields is in fieldOrder, that field comes first
if (indexOfA !== -1) {
return -1;
}
if (indexOfB !== -1) {
return 1;
}
// Default case for fields not in priorityFields and not found in fieldOrder
// You might want to sort them alphabetically or in another specific manner
return a.localeCompare(b);
// Early return for empty fields
if (!a && !b) return 0;
if (!a) return 1;
if (!b) return -1;
// Normalize the case to ensure case-insensitive comparison
const normalizedFieldA = a.toLowerCase();
const normalizedFieldB = b.toLowerCase();
const aIsPriority = priorityFields.has(normalizedFieldA);
const bIsPriority = priorityFields.has(normalizedFieldB);
// Sort by priority
if (aIsPriority && !bIsPriority) return -1;
if (!aIsPriority && bIsPriority) return 1;
// Check if either field is in the fieldOrder array
const indexOfA = fieldOrder.indexOf(normalizedFieldA);
const indexOfB = fieldOrder.indexOf(normalizedFieldB);
// If both fields are in fieldOrder, sort by their order in the array
if (indexOfA !== -1 && indexOfB !== -1) {
return indexOfA - indexOfB;
}
// If only one of the fields is in fieldOrder, that field comes first
if (indexOfA !== -1) {
return -1;
}
if (indexOfB !== -1) {
return 1;
}
// Default case for fields not in priorityFields and not found in fieldOrder
// You might want to sort them alphabetically or in another specific manner
return a.localeCompare(b);
}

View file

@ -0,0 +1,14 @@
import { useEffect } from "react";
import { useLocation } from "react-router-dom";
import { useLocationStore } from "../stores/locationStore";
function useTrackLastVisitedPath() {
const location = useLocation();
const setHistory = useLocationStore((state) => state.setRouteHistory);
useEffect(() => {
setHistory(location.pathname);
}, [location]);
}
export default useTrackLastVisitedPath;

View file

@ -5,13 +5,13 @@
* @returns {string} - The curl code
*/
export default function getCurlCode(
flowId: string,
isAuth: boolean,
tweaksBuildedObject,
): string {
const tweaksObject = tweaksBuildedObject[0];
return `curl -X POST \\
flowId: string,
isAuth: boolean,
tweaksBuildedObject,
): string {
const tweaksObject = tweaksBuildedObject[0];
return `curl -X POST \\
${window.location.protocol}//${
window.location.host
}/api/v1/run/${flowId}?stream=false \\
@ -23,4 +23,4 @@ export default function getCurlCode(
"input_type": "chat",
"tweaks": ${JSON.stringify(tweaksObject, null, 2)}'
`;
}
}

View file

@ -6,20 +6,20 @@
* @returns {string} - The python code
*/
export default function getPythonApiCode(
flowId: string,
isAuth: boolean,
tweaksBuildedObject,
): string {
const tweaksObject = tweaksBuildedObject[0];
return `import requests
flowId: string,
isAuth: boolean,
tweaksBuildedObject,
): string {
const tweaksObject = tweaksBuildedObject[0];
return `import requests
from typing import Optional
BASE_API_URL = "${window.location.protocol}//${window.location.host}/api/v1/run"
FLOW_ID = "${flowId}"
# You can tweak the flow by adding a tweaks dictionary
# e.g {"OpenAI-XXXXX": {"model_name": "gpt-4"}}
TWEAKS = ${JSON.stringify(tweaksObject, null, 2)}
def run_flow(message: str,
flow_id: str,
output_type: str = "chat",
@ -28,14 +28,14 @@ export default function getPythonApiCode(
api_key: Optional[str] = None) -> dict:
"""
Run a flow with a given message and optional tweaks.
:param message: The message to send to the flow
:param flow_id: The ID of the flow to run
:param tweaks: Optional tweaks to customize the flow
:return: The JSON response from the flow
"""
api_url = f"{BASE_API_URL}/{flow_id}"
payload = {
"input_value": message,
"output_type": output_type,
@ -48,11 +48,11 @@ export default function getPythonApiCode(
headers = {"x-api-key": api_key}
response = requests.post(api_url, json=payload, headers=headers)
return response.json()
# Setup any tweaks you want to apply to the flow
message = "message"
${!isAuth ? `api_key = "<your api key>"` : ""}
print(run_flow(message=message, flow_id=FLOW_ID, tweaks=TWEAKS${
!isAuth ? `, api_key=api_key` : ""
}))`;
}
!isAuth ? `, api_key=api_key` : ""
}))`;
}

View file

@ -4,14 +4,17 @@
* @param {any[]} tweak - The tweaks
* @returns {string} - The python code
*/
export default function getPythonCode(flowName: string, tweaksBuildedObject): string {
const tweaksObject = tweaksBuildedObject[0];
return `from langflow.load import run_flow_from_json
export default function getPythonCode(
flowName: string,
tweaksBuildedObject,
): string {
const tweaksObject = tweaksBuildedObject[0];
return `from langflow.load import run_flow_from_json
TWEAKS = ${JSON.stringify(tweaksObject, null, 2)}
result = run_flow_from_json(flow="${flowName}.json",
input_value="message",
fallback_to_env_vars=True, # False by default
tweaks=TWEAKS)`;
}
}

View file

@ -4,12 +4,12 @@
* @returns {string} - The widget code
*/
export default function getWidgetCode(
flowId: string,
flowName: string,
isAuth: boolean,
): string {
return `<script src="https://cdn.jsdelivr.net/gh/langflow-ai/langflow-embedded-chat@1.0_alpha/dist/build/static/js/bundle.min.js"></script>
flowId: string,
flowName: string,
isAuth: boolean,
): string {
return `<script src="https://cdn.jsdelivr.net/gh/langflow-ai/langflow-embedded-chat@1.0_alpha/dist/build/static/js/bundle.min.js"></script>
<langflow-chat
window_title="${flowName}"
flow_id="${flowId}"
@ -19,6 +19,6 @@ export default function getWidgetCode(
api_key="..."`
: ""
}
></langflow-chat>`;
}
}

View file

@ -1,40 +1,6 @@
export default function tabsArray(codes: string[], method: number) {
if (!method) return;
if (method === 0) {
return [
{
name: "cURL",
mode: "bash",
image: "https://curl.se/logo/curl-symbol-transparent.png",
language: "sh",
code: codes[0],
},
{
name: "Python API",
mode: "python",
image:
"https://images.squarespace-cdn.com/content/v1/5df3d8c5d2be5962e4f87890/1628015119369-OY4TV3XJJ53ECO0W2OLQ/Python+API+Training+Logo.png?format=1000w",
language: "py",
code: codes[1],
},
{
name: "Python Code",
mode: "python",
image: "https://cdn-icons-png.flaticon.com/512/5968/5968350.png",
language: "py",
code: codes[2],
},
{
name: "Chat Widget HTML",
description:
"Insert this code anywhere in your &lt;body&gt; tag. To use with react and other libs, check our <a class='link-color' href='https://langflow.org/guidelines/widget'>documentation</a>.",
mode: "html",
image: "https://cdn-icons-png.flaticon.com/512/5968/5968350.png",
language: "py",
code: codes[3],
},
];
}
if (!method) return;
if (method === 0) {
return [
{
name: "cURL",
@ -54,8 +20,8 @@ export default function tabsArray(codes: string[], method: number) {
{
name: "Python Code",
mode: "python",
language: "py",
image: "https://cdn-icons-png.flaticon.com/512/5968/5968350.png",
language: "py",
code: codes[2],
},
{
@ -67,12 +33,46 @@ export default function tabsArray(codes: string[], method: number) {
language: "py",
code: codes[3],
},
{
name: "Tweaks",
mode: "python",
image: "https://cdn-icons-png.flaticon.com/512/5968/5968350.png",
language: "py",
code: codes[4],
},
];
}
return [
{
name: "cURL",
mode: "bash",
image: "https://curl.se/logo/curl-symbol-transparent.png",
language: "sh",
code: codes[0],
},
{
name: "Python API",
mode: "python",
image:
"https://images.squarespace-cdn.com/content/v1/5df3d8c5d2be5962e4f87890/1628015119369-OY4TV3XJJ53ECO0W2OLQ/Python+API+Training+Logo.png?format=1000w",
language: "py",
code: codes[1],
},
{
name: "Python Code",
mode: "python",
language: "py",
image: "https://cdn-icons-png.flaticon.com/512/5968/5968350.png",
code: codes[2],
},
{
name: "Chat Widget HTML",
description:
"Insert this code anywhere in your &lt;body&gt; tag. To use with react and other libs, check our <a class='link-color' href='https://langflow.org/guidelines/widget'>documentation</a>.",
mode: "html",
image: "https://cdn-icons-png.flaticon.com/512/5968/5968350.png",
language: "py",
code: codes[3],
},
{
name: "Tweaks",
mode: "python",
image: "https://cdn-icons-png.flaticon.com/512/5968/5968350.png",
language: "py",
code: codes[4],
},
];
}

View file

@ -1,9 +1,9 @@
import { useEffect, useState } from "react";
import { useEffect, useRef, useState } from "react";
import IconComponent from "../../components/genericIconComponent";
import { Tabs, TabsList, TabsTrigger } from "../../components/ui/tabs";
import useFlowsManagerStore from "../../stores/flowsManagerStore";
import { FlowSettingsPropsType } from "../../types/components";
import { FlowType } from "../../types/flow";
import { FlowType, NodeDataType } from "../../types/flow";
import BaseModal from "../baseModal";
import TableComponent from "../../components/tableComponent";
import { getMessagesTable, getTransactionTable } from "../../controllers/API";
@ -12,15 +12,20 @@ import {
ColGroupDef,
SizeColumnsToFitGridStrategy,
} from "ag-grid-community";
import useAlertStore from "../../stores/alertStore";
import useFlowStore from "../../stores/flowStore";
export default function FlowLogsModal({
open,
setOpen,
}: FlowSettingsPropsType): JSX.Element {
const saveFlow = useFlowsManagerStore((state) => state.saveFlow);
const nodes = useFlowStore((state) => state.nodes);
const currentFlow = useFlowsManagerStore((state) => state.currentFlow);
const currentFlowId = useFlowsManagerStore((state) => state.currentFlowId);
const flows = useFlowsManagerStore((state) => state.flows);
const setNoticeData = useAlertStore((state) => state.setNoticeData);
useEffect(() => {
setName(currentFlow!.name);
setDescription(currentFlow!.description);
@ -31,6 +36,7 @@ export default function FlowLogsModal({
const [columns, setColumns] = useState<Array<ColDef | ColGroupDef>>([]);
const [rows, setRows] = useState<any>([]);
const [activeTab, setActiveTab] = useState("Executions");
const noticed = useRef(false);
function handleClick(): void {
currentFlow!.name = name;
@ -53,6 +59,25 @@ export default function FlowLogsModal({
setRows(rows);
});
}
if (open && activeTab === "Messages" && !noticed.current) {
const haStream = nodes
.map((nodes) => (nodes.data as NodeDataType).node!.template)
.some((template) => template["stream"] && template["stream"].value);
console.log(
haStream,
nodes.map((nodes) => (nodes.data as NodeDataType).node!.template),
);
if (haStream) {
setNoticeData({
title: "Streamed messages will not appear in this table.",
});
noticed.current = true;
}
}
if (!open) {
noticed.current = false;
}
}, [open, activeTab]);
const [nameLists, setNameList] = useState<string[]>([]);

View file

@ -129,14 +129,14 @@ export default function ShareModal({
title: "Error sharing " + is_component ? "component" : "flow",
list: [err["response"]["data"]["detail"]],
});
}
},
);
else
updateFlowStore(
flow!,
getTagsIds(selectedTags, tags),
sharePublic,
unavaliableNames.find((e) => e.name === name)!.id
unavaliableNames.find((e) => e.name === name)!.id,
).then(successShare, (err) => {
setErrorData({
title: "Error sharing " + is_component ? "component" : "flow",
@ -287,7 +287,7 @@ export default function ShareModal({
className={is_component ? "w-40" : "w-28"}
onClick={() => {
const isNameAvailable = !unavaliableNames.some(
(element) => element.name === name
(element) => element.name === name,
);
if (isNameAvailable) {

View file

@ -1,8 +1,8 @@
export default function getTagsIds(
tags: string[],
tagListId: { name: string; id: string }[],
) {
return tags
.map((tag) => tagListId.find((tagObj) => tagObj.name === tag))!
.map((tag) => tag!.id);
tags: string[],
tagListId: { name: string; id: string }[],
) {
return tags
.map((tag) => tagListId.find((tagObj) => tagObj.name === tag))!
.map((tag) => tag!.id);
}

View file

@ -3,33 +3,33 @@ import { getRandomElement } from "../../../../../utils/reactflowUtils";
import { toTitleCase } from "../../../../../utils/utils";
export default function getRandomName(
retry: number = 0,
noSpace: boolean = false,
maxRetries: number = 3,
): string {
const left: string[] = ADJECTIVES;
const right: string[] = NOUNS;
const lv = getRandomElement(left);
const rv = getRandomElement(right);
// Condition to avoid "boring wozniak"
if (lv === "boring" && rv === "wozniak") {
if (retry < maxRetries) {
return getRandomName(retry + 1, noSpace, maxRetries);
} else {
console.warn("Max retries reached, returning as is");
}
retry: number = 0,
noSpace: boolean = false,
maxRetries: number = 3,
): string {
const left: string[] = ADJECTIVES;
const right: string[] = NOUNS;
const lv = getRandomElement(left);
const rv = getRandomElement(right);
// Condition to avoid "boring wozniak"
if (lv === "boring" && rv === "wozniak") {
if (retry < maxRetries) {
return getRandomName(retry + 1, noSpace, maxRetries);
} else {
console.warn("Max retries reached, returning as is");
}
// Append a suffix if retrying and noSpace is true
if (retry > 0 && noSpace) {
const retrySuffix = Math.floor(Math.random() * 10);
return `${lv}_${rv}${retrySuffix}`;
}
// Construct the final name
let final_name = noSpace ? `${lv}_${rv}` : `${lv} ${rv}`;
// Return title case final name
return toTitleCase(final_name);
}
}
// Append a suffix if retrying and noSpace is true
if (retry > 0 && noSpace) {
const retrySuffix = Math.floor(Math.random() * 10);
return `${lv}_${rv}${retrySuffix}`;
}
// Construct the final name
let final_name = noSpace ? `${lv}_${rv}` : `${lv} ${rv}`;
// Return title case final name
return toTitleCase(final_name);
}

View file

@ -19,10 +19,7 @@ import {
nodeIconsLucide,
nodeNames,
} from "../../../../utils/styleUtils";
import {
classNames,
removeCountFromString,
} from "../../../../utils/utils";
import { classNames, removeCountFromString } from "../../../../utils/utils";
import DisclosureComponent from "../DisclosureComponent";
import ParentDisclosureComponent from "../ParentDisclosureComponent";
import SidebarDraggableComponent from "./sideBarDraggableComponent";
@ -45,7 +42,7 @@ export default function ExtraSidebar(): JSX.Element {
const [search, setSearch] = useState("");
function onDragStart(
event: React.DragEvent<any>,
data: { type: string; node?: APIClassType }
data: { type: string; node?: APIClassType },
): void {
//start drag event
var crt = event.currentTarget.cloneNode(true);
@ -71,7 +68,7 @@ export default function ExtraSidebar(): JSX.Element {
let keys = Object.keys(data[d]).filter(
(nd) =>
nd.toLowerCase().includes(e.toLowerCase()) ||
data[d][nd].display_name?.toLowerCase().includes(e.toLowerCase())
data[d][nd].display_name?.toLowerCase().includes(e.toLowerCase()),
);
keys.forEach((element) => {
ret[d][element] = data[d][element];
@ -138,7 +135,7 @@ export default function ExtraSidebar(): JSX.Element {
if (filtered.some((x) => x !== "")) {
let keys = Object.keys(dataClone[d]).filter((nd) =>
filtered.includes(nd)
filtered.includes(nd),
);
Object.keys(dataClone[d]).forEach((element) => {
if (!keys.includes(element)) {
@ -175,7 +172,7 @@ export default function ExtraSidebar(): JSX.Element {
if (filtered.some((x) => x !== "")) {
let keys = Object.keys(dataClone[d]).filter((nd) =>
filtered.includes(nd)
filtered.includes(nd),
);
Object.keys(dataClone[d]).forEach((element) => {
if (!keys.includes(element)) {
@ -204,7 +201,7 @@ export default function ExtraSidebar(): JSX.Element {
"extra-side-bar-buttons gap-[4px] text-sm font-semibold",
!hasApiKey || !validApiKey || !hasStore
? "button-disable cursor-default text-muted-foreground"
: ""
: "",
)}
>
<IconComponent
@ -213,14 +210,14 @@ export default function ExtraSidebar(): JSX.Element {
"-m-0.5 -ml-1 h-6 w-6",
!hasApiKey || !validApiKey || !hasStore
? "extra-side-bar-save-disable"
: ""
: "",
)}
/>
Share
</button>
</ShareModal>
),
[hasApiKey, validApiKey, currentFlow, hasStore]
[hasApiKey, validApiKey, currentFlow, hasStore],
);
const ExportMemo = useMemo(
@ -231,7 +228,7 @@ export default function ExtraSidebar(): JSX.Element {
</button>
</ExportModal>
),
[]
[],
);
const getIcon = useMemo(() => {
@ -315,8 +312,8 @@ export default function ExtraSidebar(): JSX.Element {
.sort((a, b) =>
sensitiveSort(
dataFilter[SBSectionName][a].display_name,
dataFilter[SBSectionName][b].display_name
)
dataFilter[SBSectionName][b].display_name,
),
)
.map((SBItemName: string, index) => (
<ShadTooltip
@ -360,7 +357,7 @@ export default function ExtraSidebar(): JSX.Element {
</>
) : (
<div key={index}></div>
)
),
)}{" "}
<ParentDisclosureComponent
openDisc={false}
@ -397,8 +394,8 @@ export default function ExtraSidebar(): JSX.Element {
.sort((a, b) =>
sensitiveSort(
dataFilter[SBSectionName][a].display_name,
dataFilter[SBSectionName][b].display_name
)
dataFilter[SBSectionName][b].display_name,
),
)
.map((SBItemName: string, index) => (
<ShadTooltip
@ -472,7 +469,7 @@ export default function ExtraSidebar(): JSX.Element {
</>
) : (
<div key={index}></div>
)
),
)}
</ParentDisclosureComponent>
</div>

View file

@ -1,25 +1,24 @@
export default function sensitiveSort(a: string, b: string): number {
// Extract the name and number from each string using regular expressions
const regex = /(.+) \((\w+)\)/;
const matchA = a.match(regex);
const matchB = b.match(regex);
if (matchA && matchB) {
// Compare the names alphabetically
const nameA = matchA[1];
const nameB = matchB[1];
if (nameA !== nameB) {
return nameA.localeCompare(nameB);
}
// If the names are the same, compare the numbers numerically
const numberA = parseInt(matchA[2]);
const numberB = parseInt(matchB[2]);
return numberA - numberB;
} else {
// Handle cases where one or both strings do not match the expected pattern
// Simple strings are treated as pure alphabetical comparisons
return a.localeCompare(b);
// Extract the name and number from each string using regular expressions
const regex = /(.+) \((\w+)\)/;
const matchA = a.match(regex);
const matchB = b.match(regex);
if (matchA && matchB) {
// Compare the names alphabetically
const nameA = matchA[1];
const nameB = matchB[1];
if (nameA !== nameB) {
return nameA.localeCompare(nameB);
}
// If the names are the same, compare the numbers numerically
const numberA = parseInt(matchA[2]);
const numberB = parseInt(matchB[2]);
return numberA - numberB;
} else {
// Handle cases where one or both strings do not match the expected pattern
// Simple strings are treated as pure alphabetical comparisons
return a.localeCompare(b);
}
}

View file

@ -1,5 +1,5 @@
import { useEffect } from "react";
import { useParams } from "react-router-dom";
import { useNavigate, useParams } from "react-router-dom";
import FlowToolbar from "../../components/chatComponent";
import Header from "../../components/headerComponent";
import { useDarkStore } from "../../stores/darkStore";
@ -16,9 +16,19 @@ export default function FlowPage({ view }: { view?: boolean }): JSX.Element {
const setOnFlowPage = useFlowStore((state) => state.setOnFlowPage);
const currentFlow = useFlowsManagerStore((state) => state.currentFlow);
const { id } = useParams();
const navigate = useNavigate();
const flows = useFlowsManagerStore((state) => state.flows);
// Set flow tab id
useEffect(() => {
const isAnExistingFlow = flows.some((flow) => flow.id === id);
if (!isAnExistingFlow) {
navigate("/all");
return;
}
setCurrentFlowId(id!);
setOnFlowPage(true);

View file

@ -6,13 +6,14 @@ export type FolderType = {
id?: string | null;
parent_id: string;
flows: FlowType[];
components: string[];
};
export type AddFolderType = {
name: string;
description: string;
id?: string | null;
parent_id: string;
parent_id: string | null;
flows?: string[];
components?: string[];
};

View file

@ -1,7 +1,7 @@
import { BASE_URL_API } from "../../../constants/constants";
import { api } from "../../../controllers/API/api";
import { FlowType } from "../../../types/flow";
import { AddFolderType, FolderType, StarterProjectsType } from "../entities";
import { AddFolderType, FolderType } from "../entities";
export async function getFolders(): Promise<FolderType[]> {
try {
@ -30,12 +30,12 @@ export async function addFolder(data: AddFolderType): Promise<FolderType> {
export async function updateFolder(
body: FolderType,
folderId: string,
folderId: string
): Promise<FolderType> {
try {
const response = await api.patch(
`${BASE_URL_API}folders/${folderId}`,
body,
body
);
return response?.data;
} catch (error) {
@ -61,15 +61,6 @@ export async function getFolderById(folderId: string): Promise<FolderType> {
}
}
export async function getStarterProjects(): Promise<StarterProjectsType> {
try {
const response = await api.get(`${BASE_URL_API}folders/starter-projects`);
return response?.data;
} catch (error) {
throw error;
}
}
export async function downloadFlowsFromFolders(folderId: string): Promise<{
flows: FlowType[];
folder_name: string;
@ -77,7 +68,7 @@ export async function downloadFlowsFromFolders(folderId: string): Promise<{
}> {
try {
const response = await api.get(
`${BASE_URL_API}folders/download/${folderId}`,
`${BASE_URL_API}folders/download/${folderId}`
);
if (response?.status !== 200) {
throw new Error(`HTTP error! status: ${response?.status}`);
@ -91,7 +82,7 @@ export async function downloadFlowsFromFolders(folderId: string): Promise<{
}
export async function uploadFlowsFromFolders(
flows: FormData,
flows: FormData
): Promise<FlowType[]> {
try {
const response = await api.post(`${BASE_URL_API}folders/upload/`, flows);
@ -108,11 +99,11 @@ export async function uploadFlowsFromFolders(
export async function moveFlowToFolder(
flowId: string,
folderId: string,
folderId: string
): Promise<FlowType> {
try {
const response = await api.patch(
`${BASE_URL_API}folders/move_to_folder/${flowId}/${folderId}`,
`${BASE_URL_API}folders/move_to_folder/${flowId}/${folderId}`
);
return response?.data;
} catch (error) {

View file

@ -36,7 +36,7 @@ export const useDarkStore = create<DarkStoreType>((set, get) => ({
window.localStorage.setItem("githubStars", res.toString());
window.localStorage.setItem(
"githubStarsLastUpdated",
new Date().toString()
new Date().toString(),
);
set(() => ({ stars: res, lastUpdated: new Date() }));
});

View file

@ -11,7 +11,6 @@ import {
updateFlowInDatabase,
uploadFlowsToDatabase,
} from "../controllers/API";
import { getStarterProjects } from "../pages/MainPage/services";
import { FlowType, NodeDataType } from "../types/flow";
import {
FlowsManagerStoreType,
@ -81,38 +80,40 @@ const useFlowsManagerStore = create<FlowsManagerStoreType>((set, get) => ({
return new Promise<void>((resolve, reject) => {
set({ isLoading: true });
getStarterProjects().then((starterProjects) => {
get().setExamples(starterProjects?.flows!);
const starterFolderId = useFolderStore.getState().starterProjectId;
readFlowsFromDatabase()
.then((dbData) => {
if (dbData) {
const { data, flows } = processFlows(dbData, false);
const starterProjectsIds = starterProjects.flows!.map(
(flow) => flow.id,
);
get().setFlows(
flows.filter((f) => !starterProjectsIds.includes(f.id)),
);
useTypesStore.setState((state) => ({
data: { ...state.data, ["saved_components"]: data },
ComponentFields: extractFieldsFromComponenents({
...state.data,
["saved_components"]: data,
}),
}));
set({ isLoading: false });
resolve();
}
})
.catch((e) => {
readFlowsFromDatabase()
.then((dbData) => {
if (dbData) {
const { data, flows } = processFlows(dbData, false);
const examples = flows.filter(
(flow) => flow.folder_id === starterFolderId,
);
get().setExamples(examples);
const flowsWithoutStarterFolder = flows.filter(
(flow) => flow.folder_id !== starterFolderId,
);
get().setFlows(flowsWithoutStarterFolder);
useTypesStore.setState((state) => ({
data: { ...state.data, ["saved_components"]: data },
ComponentFields: extractFieldsFromComponenents({
...state.data,
["saved_components"]: data,
}),
}));
set({ isLoading: false });
useAlertStore.getState().setErrorData({
title: "Could not load flows from database",
});
reject(e);
resolve();
}
})
.catch((e) => {
set({ isLoading: false });
useAlertStore.getState().setErrorData({
title: "Could not load flows from database",
});
});
reject(e);
});
});
},
autoSaveCurrentFlow: (nodes: Node[], edges: Edge[], viewport: Viewport) => {
@ -204,11 +205,16 @@ const useFlowsManagerStore = create<FlowsManagerStoreType>((set, get) => ({
: { nodes: [], edges: [], viewport: { zoom: 1, x: 0, y: 0 } };
// Create a new flow with a default name if no flow is provided.
const folder_id = useFolderStore.getState().folderUrl;
const my_collection_id = useFolderStore.getState().myCollectionId;
if (override) {
get().deleteComponent(flow!.name);
const newFlow = createNewFlow(flowData!, flow!);
newFlow.folder_id = useFolderStore.getState().folderUrl;
const newFlow = createNewFlow(
flowData!,
flow!,
folder_id || my_collection_id!,
);
const { id } = await saveFlowToDatabase(newFlow);
newFlow.id = id;
//setTimeout to prevent update state with wrong state
@ -227,8 +233,12 @@ const useFlowsManagerStore = create<FlowsManagerStoreType>((set, get) => ({
// addFlowToLocalState(newFlow);
return;
}
const newFlow = createNewFlow(flowData!, flow!);
console.log("folder id", folder_id);
const newFlow = createNewFlow(
flowData!,
flow!,
folder_id || my_collection_id!,
);
const newName = addVersionToDuplicates(newFlow, get().flows);

View file

@ -1,5 +1,5 @@
import { create } from "zustand";
import { DEFAULT_FOLDER } from "../constants/constants";
import { DEFAULT_FOLDER, STARTER_FOLDER_NAME } from "../constants/constants";
import {
getFolderById,
getFolders,
@ -11,24 +11,44 @@ import useFlowsManagerStore from "./flowsManagerStore";
export const useFolderStore = create<FoldersStoreType>((set, get) => ({
folders: [],
getFoldersApi: (refetch = false) => {
if (get()?.folders.length === 0 || refetch === true) {
get().setLoading(true);
getFolders().then(
(res) => {
set({ folders: res });
const myCollectionId = res?.find(
(f) => f.name === DEFAULT_FOLDER,
)?.id;
set({ myCollectionId });
get().setLoading(false);
useFlowsManagerStore.getState().refreshFlows();
},
() => {
set({ folders: [] });
get().setLoading(false);
},
);
}
return new Promise<void>((resolve, reject) => {
if (get()?.folders.length === 0 || refetch === true) {
get().setLoading(true);
getFolders().then(
(res) => {
const foldersWithoutStarterProjects = res.filter(
(folder) => folder.name !== STARTER_FOLDER_NAME,
);
const starterProjects = res.find(
(folder) => folder.name === STARTER_FOLDER_NAME,
);
set({ starterProjectId: starterProjects!.id ?? "" });
set({ folders: foldersWithoutStarterProjects });
const myCollectionId = res?.find(
(f) => f.name === DEFAULT_FOLDER,
)?.id;
set({ myCollectionId });
if (refetch === true) {
useFlowsManagerStore.getState().refreshFlows();
useFlowsManagerStore.getState().setAllFlows;
}
get().setLoading(false);
resolve();
},
() => {
set({ folders: [] });
get().setLoading(false);
reject();
},
);
}
});
},
setFolders: (folders) => set(() => ({ folders: folders })),
loading: false,
@ -93,12 +113,12 @@ export const useFolderStore = create<FoldersStoreType>((set, get) => ({
formData.append("file", file);
uploadFlowsFromFolders(formData).then(() => {
get().getFoldersApi(true);
useFlowsManagerStore.getState().refreshFlows();
});
useFlowsManagerStore.getState().setAllFlows;
}
};
input.click();
});
},
starterProjectId: "",
setStarterProjectId: (id) => set(() => ({ starterProjectId: id })),
}));

View file

@ -0,0 +1,21 @@
import { create } from "zustand";
import { LocationStoreType } from "../types/zustand/location";
export const useLocationStore = create<LocationStoreType>((set, get) => ({
routeHistory: [],
setRouteHistory: (location) => {
let routeHistoryArray = get().routeHistory;
routeHistoryArray.push(location);
if (routeHistoryArray?.length > 9) {
routeHistoryArray.shift();
set({
routeHistory: routeHistoryArray,
});
}
set({
routeHistory: routeHistoryArray,
});
},
}));

Some files were not shown because too many files have changed in this diff Show more