Commit graph

892 commits

Author SHA1 Message Date
Gabriel Luiz Freitas Almeida
97572bea25 🔥 refactor(constants.py): remove unused import and unused CustomComponent from CUSTOM_TOOLS dictionary
The import statement for CustomComponent is no longer needed as it is not used in the CUSTOM_TOOLS dictionary. Removing the unused import and the unused CustomComponent entry from the dictionary improves code cleanliness and reduces potential confusion.
2023-07-06 23:57:17 -03:00
Gabriel Luiz Freitas Almeida
97399632e2 feat(custom.py): add CustomComponent class to handle custom code components
🐛 fix(custom.py): fix typo in function_entrypoint_name variable assignment
The CustomComponent class is added to handle custom code components. It includes methods to handle imports, classes, and functions in the provided code. The class also has methods to extract class information, get entrypoint function arguments and return type, build a template configuration, validate the class template, and get the entrypoint function. A typo in the assignment of the function_entrypoint_name variable is fixed.
2023-07-06 23:57:04 -03:00
Gabriel Luiz Freitas Almeida
692994f100 feat(custom): add custom component interface and base classes
🔧 chore(custom): create a custom component creator class to handle custom component creation and loading

The commit adds two new files: `__init__.py` and `base.py` under the `src/backend/langflow/interface/custom` directory. The `__init__.py` file imports the `CustomComponentCreator` and `CustomComponent` classes from the `base.py` file. The `base.py` file defines the `CustomComponentCreator` class, which is responsible for creating and loading custom components. It also includes necessary imports and a `CustomComponentFrontendNode` class.

The addition of these files is necessary to support custom components in the application. The `CustomComponentCreator` class provides a way to create and load custom components, and the `CustomComponent` class represents a custom component. This allows for the dynamic creation and usage of custom components in the application.
2023-07-06 23:56:49 -03:00
Gabriel Luiz Freitas Almeida
5e4507852c feat(constants.py): add constants file for langflow interface custom types
This commit adds a new file `constants.py` to the `src/backend/langflow/interface/custom` directory. The file defines a dictionary `LANGCHAIN_BASE_TYPES` which maps string names to corresponding langflow interface custom types. This file will be used to store and access the custom types used in the langflow interface.
2023-07-06 23:56:21 -03:00
Gabriel Luiz Freitas Almeida
024cd3398a 🔧 fix(types.py): import correct module for custom component creator
🔧 fix(types.py): fix import for CustomComponent class
🔧 fix(types.py): remove unused imports
🔧 fix(types.py): fix function signature for add_new_custom_field
🔧 fix(types.py): fix function signature for build_langchain_template_custom_component
🔧 fix(types.py): fix return type validation and error handling in build_langchain_template_custom_component
🔧 fix(types.py): fix appending base classes to frontend_node in build_langchain_template_custom_component
🔧 fix(types.py): fix return statement in build_langchain_template_custom_component
The changes in this commit fix import statements, function signatures, and error handling in the types.py file. The correct module is now imported for the custom component creator. The import for the CustomComponent class is fixed. Unused imports are removed. The function signature for add_new_custom_field is fixed to include the field_config parameter. The function signature for build_langchain_template_custom_component is fixed to include the field_config parameter. The return type validation and error handling in build_langchain_template_custom_component are fixed to handle invalid return types. The base classes are correctly appended to the frontend_node in build_langchain_template_custom_component. The return statement in build_langchain_template_custom_component is fixed to return the frontend_node.
2023-07-06 23:56:04 -03:00
Gabriel Luiz Freitas Almeida
f41cd1905f 🚀 feat(listing.py): add support for custom components in the type dictionary
The type dictionary now includes a new key "custom_components" which contains a list of custom components created using the custom_component_creator. This allows for better organization and management of custom components within the application.
2023-07-06 23:53:38 -03:00
Gabriel Luiz Freitas Almeida
fc615bf319 🔥 refactor(customs.py): remove unused "CustomComponent" node from CUSTOM_NODES dictionary
The "CustomComponent" node was removed from the CUSTOM_NODES dictionary as it was no longer being used. This improves code cleanliness and removes unnecessary clutter.
2023-07-06 23:53:27 -03:00
Gabriel Luiz Freitas Almeida
bed962e513 🔀 refactor(endpoints.py): fix import statement for CustomComponent
The import statement for CustomComponent has been updated to reflect the correct module path. This ensures that the correct CustomComponent class is imported and used in the code.
2023-07-06 23:52:59 -03:00
Gabriel Luiz Freitas Almeida
a29b83e4fa 🔧 chore(settings.py): add support for custom components in the settings
 feat(settings.py): allow updating custom components in the settings
The `custom_components` attribute has been added to the `Settings` class to support custom components in the application. This allows users to define and use their own components in addition to the built-in ones. The `update_settings` method has been updated to include the `custom_components` attribute when updating the settings. This change improves the flexibility and extensibility of the application.
2023-07-06 23:52:43 -03:00
Gabriel Luiz Freitas Almeida
2459e4ecb9 🔀 chore(config.yaml): remove unused CustomComponent entry and add custom configuration for CustomComponent
🔀 fix(config.yaml): fix indentation issue in the custom configuration section
The unused CustomComponent entry has been removed from the tools section to clean up the configuration file. Additionally, a custom configuration section has been added for the CustomComponent, allowing for specific configuration options for this component. The indentation issue in the custom configuration section has also been fixed for consistency.
2023-07-06 17:42:20 -03:00
gustavoschaedler
38da799224 Add langchain imports and format error detail message
- Import new modules for langchain functionality
- Format error detail message for better readability and organization
2023-07-06 01:05:56 +01:00
gustavoschaedler
11cece92b8 Refactor code for CustomComponent class
- Refactored code to replace the deprecated is_valid property with the is_check_valid method.
- Added validation for the entrypoint function name and return type.
- Modified the error messages to provide more specific details.

This commit implements the necessary changes to refactor the CustomComponent class in the endpoints.py file. The is_valid property has been replaced with the is_check_valid method to check the validity of the custom component. Additionally, validation has been added to ensure the presence of a valid entrypoint function and a valid return type. If any of the validation checks fail, appropriate error messages are raised to provide detailed traceback information.
2023-07-06 01:02:34 +01:00
gustavoschaedler
f92fefba46 Refactor code for CustomComponent class and build_langchain_template_custom_component function
The code in the CustomComponent class has been refactored to improve readability and maintainability. The `_handle_function` method now handles function arguments correctly. Additionally, the `is_valid_class_template` method has been renamed to `_class_template_validation`, and it now raises an HTTPException with a detailed error message when the main class or the build function contains invalid information.

In the `build_langchain_template_custom_component` function, base classes are now retrieved from the `return_type` and added to the `template.base_classes` list. A try-except block is used to handle possible KeyError or AttributeError exceptions, and an HTTPException is raised with the corresponding error message and traceback if an error occurs.

These changes ensure more accurate validation and handle potential errors more gracefully.
2023-07-06 00:21:35 +01:00
Gabriel Luiz Freitas Almeida
d9891b9c86 🔧 chore(base.py): refactor code to improve readability and handle optional parameters
📝 chore(base.py): update comments and remove unused imports
The code in the `Vertex` class has been refactored to improve readability and handle optional parameters more effectively. The code now checks if a parameter is of type "code", "str", or "prompt" and if it is not already set in the `params` dictionary, it sets it to the corresponding value from the `value` dictionary. Additionally, if a parameter is not required and not set in the `params` dictionary, it checks if a default value is provided and sets it to the default value if available, otherwise it removes the parameter from the `params` dictionary. This change improves the handling of optional parameters and makes the code more maintainable.
2023-07-05 17:00:50 -03:00
gustavoschaedler
f12efa104d Refactor API v1 endpoints and remove unnecessary imports and code duplication
The `endpoints` module in the API v1 folder has been modified to remove an unnecessary import and some code duplication. These changes improve the code organization and maintainability.

This commit also removes a commented-out test endpoint that was intended for testing purposes but was never used. The endpoint has been removed from the codebase to avoid confusion and clutter.

The changes include removing an unused import statement from the module and removing an unused endpoint. The unused endpoint was a commented-out code block that contained example error responses. Since these examples were not needed for testing or documentation purposes, the endpoint has been safely removed.
2023-07-05 19:59:38 +01:00
gustavoschaedler
ecbb0feeab Refactor tools and constants modules
- Refactored the tools module to improve code readability and maintainability.
- Fixed import statements in the constants module to correctly import modules.
- Updated documentation and added comments for better understanding of the code.
2023-07-05 19:57:28 +01:00
gustavoschaedler
e3b6037fe9 Merge from form_io to python_custom_node_component 2023-07-05 19:56:41 +01:00
gustavoschaedler
68c6ac8ea2 Refactor base class removal logic and add dict representation
- Extracted the logic for removing unwanted base classes to a separate method called `process_base_classes`.
- Created a list `CLASSES_TO_REMOVE` which contains the names of the base classes to be removed.
- Updated `to_dict` method to call `process_base_classes` before generating the dict representation of the frontend node.
- Added a new method `process_base_classes` which removes the unwanted base classes from the list of base classes.
- The method `process_base_classes` updates the `base_classes` list, removing any base classes present in `CLASSES_TO_REMOVE`.

This commit enhances the code by separating the concerns of base class removal logic and dict representation generation.
2023-07-05 17:23:53 +01:00
gustavoschaedler
ae5bc1e203 Refactor custom.py for better error handling
- Modifies the `CustomComponent` class to handle errors using `HTTPException` from FastAPI
- Removes the unused `HTTPExceptionWithTraceback` class
- Updates the error response format with `err.msg` and `traceback.format_exc()`
2023-07-05 16:23:32 +01:00
gustavoschaedler
a21582589c import custom.py: Add HTTPExceptionWithTraceback class
This commit adds a new class `HTTPExceptionWithTraceback` that extends `HTTPException` from the `fastapi` module. This new class includes a `traceback` attribute. Additionally, in the `extract_class_info` method of the `CustomComponent` class, a try-except block is added to catch any syntax errors raised by parsing the provided code. If a syntax error is encountered, an HTTPException is raised with the error message and traceback.
2023-07-05 16:22:22 +01:00
gustavoschaedler
53656dcc1f feat: Add dynamic field support
This commit adds support for dynamic fields in the template field creator class. The "dynamic" attribute has been added to the class definition and its default value is set to False.
2023-07-05 15:04:22 +01:00
gustavoschaedler
bc809c6a9e Add dynamic option for custom component code in FrontendNode. 2023-07-05 14:51:57 +01:00
gustavoschaedler
fd16b385ab feat: Add dynamic field to code field in types module
This commit adds a dynamic field to the code field in the types module. The dynamic field is set to True, indicating that the field allows updates.

refactor: Remove dynamic field from FrontendNode class

In the FrontendNode class of the base module, the dynamic field has been removed. This change aligns with the removal of the dynamic field in the types module.

refactor: Remove dynamic field from CustomComponentNode class

The dynamic field has been removed from the CustomComponentNode class in the tools module. This aligns with the removal of the dynamic field in the FrontendNode class.
2023-07-05 14:44:11 +01:00
Gabriel Luiz Freitas Almeida
a69225bb07 🔧 chore(loading.py): remove unused import statement
🐛 fix(loading.py): remove unnecessary None default value for file_filter parameter
The unused import statement from langchain.prompts.base has been removed to improve code cleanliness. The None default value for the file_filter parameter in the instantiate_documentloader function has been removed as it is unnecessary and can be safely assumed that the parameter will always be provided.
2023-07-05 09:46:27 -03:00
Gabriel Luiz Freitas Almeida
5879ad99f2 🔥 refactor(main.py): remove unused /dynamic_node endpoint and template_node variable
💡 chore(main.py): clean up code by removing an unused endpoint and a template_node variable that is no longer needed
The /dynamic_node endpoint and the template_node variable are no longer used in the application and can be safely removed. This improves code cleanliness and reduces unnecessary complexity.
2023-07-05 09:41:40 -03:00
Gabriel Luiz Freitas Almeida
3059e8c670 🐛 fix(base.py): fix add_edge method to prevent adding duplicate edges
🐛 fix(base.py): fix __eq__ method in Edge class to correctly compare objects
The add_edge method in the Vertex class has been modified to prevent adding duplicate edges. Now, before adding an edge, it checks if the edge already exists in the edges list to avoid duplicates.

The __eq__ method in the Edge class has been fixed to correctly compare objects. It now compares the string representation of the objects to determine equality, ensuring that the comparison is accurate.
2023-07-05 09:37:25 -03:00
gustavoschaedler
48345dd8dd Refactor MyPythonClass build method to accept openai_api_key parameter.
- The `build` method of `MyPythonClass` is modified to accept an `openai_api_key` parameter instead of using a hardcoded value.
- This change allows for dynamic usage of different API keys when constructing an instance of `ConversationChain`.
- The `my_conversation` method now takes `openai_api_key` as an argument and uses it to initialize the `llm` instance of `OpenAI`.
- The `build` method simply delegates the `openai_api_key` argument to the `my_conversation` method and returns the resulting `ConversationChain` instance.
2023-07-05 03:37:18 +01:00
gustavoschaedler
839e9737cc Refactor code to extract class name from custom code
- Updatethe `get_function_custom` function to use the `validate.extract_class_name` function to extract class name from the `code` parameter.
- Modify `instantiate_tool` function to update the `class_object` with the return value of `get_function_custom` and call the `build` method on the instantiated object with the remaining params.
- Add a new function `extract_class_name` in the `validate` module to extract class name from the `code` parameter.
2023-07-05 03:34:16 +01:00
Gabriel Luiz Freitas Almeida
5445adbbce 🐛 fix(validate.py): set new field value with the old value if variable already exists in the template
The code now checks if the variable already exists in the template and if so, sets the new field value with the old value. This ensures that the existing value is preserved when adding new variables to the template.
2023-07-04 23:32:25 -03:00
Gabriel Luiz Freitas Almeida
244aeae916 🔧 chore(validate.py): add multiline option to input_variables field in add_new_variables_to_template function
The multiline option is added to the input_variables field in the add_new_variables_to_template function. This allows the field to accept multiline input, which can be useful in certain scenarios where multiple lines of text need to be entered.
2023-07-04 23:30:24 -03:00
gustavoschaedler
ac569f3405 Refactor code, improve type validation, and update build function name 2023-07-05 02:03:22 +01:00
gustavoschaedler
64e5a3a98d Add a dynamic flag to CustomComponentNode
- Added a dynamic flag to CustomComponentNode class in tools.py for enabling dynamic behavior.
- This flag allows for flexibility in executing the Python class.
- The flag defaults to True.
2023-07-05 01:30:40 +01:00
gustavoschaedler
4028554ef6 Refactor build method argument name for clarity
Previously, the `build` method in the `MyPythonClass` class had an argument named `name`, which could be confusing. This commit changes the argument name to `my_custom_input` to improve readability and clarity.
2023-07-05 00:57:16 +01:00
gustavoschaedler
92b747b6da Update Vertex params with code type and add a my_conversation method to the MyPythonClass. Modify the instantiate_tool function to properly handle the CustomComponent node type. Add a dynamic field to the FrontendNode class. 2023-07-05 00:46:51 +01:00
gustavoschaedler
13bb0280f5 [extract_info_from_class.py] Remove unnecessary code
This commit removes the file `extract_info_from_class.py` which contained unnecessary code.

[v1/endpoints.py] Fix error handling in custom_component endpoint

This commit fixes the error handling in the `custom_component` endpoint in `endpoints.py`. If the class template extracted from the code is not valid, an error message is printed.

[importing/utils.py] Comment out unused code

This commit comments out unused code in `get_function_custom` function in `utils.py` file.

[initialize/loading.py] Comment out unused code

This commit comments out unused code in the `instantiate_tool` function in `loading.py` file.

[interface/tools/custom.py] Refactor code and add properties

This commit refactors the code in `CustomComponent` class in `custom.py` file. It adds properties for `data`, `is_valid`, and `args_and_return_type`.

[interface/types.py] Add base classes to custom component template

This commit adds base classes to the custom component template in the `build_langchain_template_custom_component` function in `types.py` file.

[utils/constants.py] Remove unnecessary import

This commit removes an unnecessary import in `DEFAULT_CUSTOM_COMPONENT_CODE` constant in `constants.py` file.
2023-07-04 21:00:02 +01:00
Gabriel Luiz Freitas Almeida
8a4f1406de 🐛 fix(validate.py): fix input_types in add_new_variables_to_template function to use correct input types
The input_types in the add_new_variables_to_template function were incorrect. They were set to ["BaseLoader", "BaseOutputParser"] instead of ["Document", "BaseOutputParser"]. This fix ensures that the correct input types are used for the template field.
2023-07-04 09:49:00 -03:00
Gabriel Luiz Freitas Almeida
9e1bb15003 🐛 fix(main.py): fix formatting of multiline string in my_user_python_function value
🔀 chore(main.py): add trailing commas to dictionary entries for improved readability
The multiline string in the value of the `my_user_python_function` key was not properly formatted. The double quotes were changed to triple quotes to match the Python docstring convention. Trailing commas were added to the dictionary entries for improved readability and maintainability.
2023-07-03 23:27:59 -03:00
Gabriel Luiz Freitas Almeida
3c7ecd15f7 🐛 fix(validate.py): check if variable is already in the list before appending and remove variable from custom_fields and template when not in input_variables
The code now checks if the variable is already in the list before appending it to the custom_fields. Additionally, when removing old variables from the template, the code now also removes the variable from the custom_fields associated with the given name. This ensures that the custom_fields and template stay in sync with the input_variables.
2023-07-03 23:27:49 -03:00
Gabriel Luiz Freitas Almeida
6431b50fa6 🐛 fix(base.py): change custom_fields default value from an empty list to a defaultdict to prevent potential errors
The custom_fields attribute in the FrontendNode class now has a default value of defaultdict(list) instead of an empty list. This change ensures that custom_fields is always a defaultdict, which prevents potential errors when accessing or modifying the custom_fields attribute.
2023-07-03 23:11:08 -03:00
Gabriel Luiz Freitas Almeida
88dbff7bf5 🚀 feat(base.py): add 'name' field to ValidatePromptRequest model for improved data validation
The 'name' field is added to the ValidatePromptRequest model to enhance data validation. This field will allow for more specific identification and validation of prompt names in the API.
2023-07-03 23:10:56 -03:00
Gabriel Luiz Freitas Almeida
d5c7fb9dc5 🐛 fix(validate.py): rename parameter 'prompt' to 'prompt_request' in post_validate_prompt function for clarity
 feat(validate.py): refactor post_validate_prompt function to improve code readability and maintainability
The parameter 'prompt' in the 'post_validate_prompt' function has been renamed to 'prompt_request' to improve clarity and avoid confusion with the 'prompt' variable used within the function. The function has also been refactored to improve code readability and maintainability by extracting logic into separate helper functions. The helper functions 'get_old_custom_fields', 'add_new_variables_to_template', 'remove_old_variables_from_template', and 'update_input_variables_field' have been added to handle specific tasks within the 'post_validate_prompt' function. This refactoring improves the overall structure and organization of the code.
2023-07-03 23:10:41 -03:00
Gabriel Luiz Freitas Almeida
19d161aec3 📝 docs(config.yaml): add documentation links for new modules and update existing links
🔖 chore(config.yaml): update documentation links for vectorstores and output parsers
Added documentation links for the following new modules:
- MongoDBChatMessageHistory
- ChatMessagePromptTemplate
- HumanMessagePromptTemplate
- SystemMessagePromptTemplate
- ChatPromptTemplate

Updated documentation links for the following existing modules:
- MongoDBAtlasVectorSearch

Also, added documentation links for the following output parsers:
- StructuredOutputParser
- ResponseSchema

The documentation links were added or updated to provide easy access to relevant documentation for each module and output parser.
2023-07-03 22:09:02 -03:00
Gabriel Luiz Freitas Almeida
18a04ad170 🔀 refactor(constants.py): refactor VERTEX_TYPE_MAP to use explicit import paths for better readability and maintainability
The VERTEX_TYPE_MAP dictionary in constants.py has been refactored to use explicit import paths for each vertex type. This improves the readability and maintainability of the code by making it clear where each vertex type is coming from.
2023-07-03 21:56:49 -03:00
Gabriel Luiz Freitas Almeida
3bab730e65 🔀 refactor(base.py): import field_formatters module instead of importing specific module
🔀 refactor(base.py): move FieldFormatters class to the top of the file for better organization
The import statement in the base.py file has been updated to import the field_formatters module instead of importing specific modules. This change improves maintainability and readability by reducing the number of import statements and consolidating them into a single import. Additionally, the FieldFormatters class has been moved to the top of the file for better organization and readability.
2023-07-03 21:56:28 -03:00
Lucas Oliveira
d0217f0c26 Merge branch 'dev' into form_io, bugs on backend 2023-07-03 21:53:56 -03:00
Gabriel Luiz Freitas Almeida
f79ee7092a 🐛 fix(validate.py): update input_types in template_field to ["Document", "BaseOutputParser"] for better accuracy
🐛 fix(base.py): remove "object" from CLASSES_TO_REMOVE list to prevent unnecessary removal
In validate.py, the input_types in the template_field for the "prompt" variable is updated to ["Document", "BaseOutputParser"] to accurately reflect the expected input types.

In base.py, the "object" class is removed from the CLASSES_TO_REMOVE list to prevent unnecessary removal of the "object" class from the FrontendNode class inheritance.
2023-07-03 17:35:44 -03:00
Gabriel Luiz Freitas Almeida
0cfcfcb912 🐛 fix(types.py): remove extra blank line to improve code readability
🐛 fix(GenericNode/index.tsx): remove unused imports and unused variable to improve code cleanliness
The extra blank line in the `types.py` file has been removed to improve the readability of the code. In the `GenericNode/index.tsx` file, unused imports and an unused variable have been removed to clean up the code and improve maintainability.
2023-07-03 16:38:06 -03:00
Gabriel Luiz Freitas Almeida
db17aceb3b 🔧 fix(base.py): add output_types field to FrontendNode class to support specifying output types
🔧 fix(documentloaders.py): add_extra_base_classes method to set base_classes and output_types for DocumentLoaderFrontNode
🔧 fix(textsplitters.py): add_extra_base_classes method to set base_classes and output_types for TextSplittersFrontendNode
🔧 fix(vectorstores.py): change field_type to "Document" for documents field in VectorStoreFrontendNode
🔧 fix(index.ts): add output_types field to APIClassType interface
The changes were made to add support for specifying output types in the FrontendNode class and its subclasses. This allows for more flexibility in defining the behavior and capabilities of the frontend nodes in the application.
2023-07-03 16:37:37 -03:00
Gabriel Luiz Freitas Almeida
51b0ff2bb4 🔧 chore(chat.py): add missing build step for root node in graph
📝 docs(chat.py): explain the need for building the root node before the rest of the graph
The root node in the graph was not being built before the rest of the graph, which caused issues when certain nodes required parameters that were not connected to them. By adding the missing build step for the root node, we ensure that all necessary connections and parameters are properly set up before building the rest of the graph. This improves the overall functionality and reliability of the chat module.
2023-07-03 09:43:08 -03:00
Gabriel Luiz Freitas Almeida
5333dbf021 📝 docs(config.yaml): add PyPDFDirectoryLoader documentation link
Added the documentation link for the PyPDFDirectoryLoader in the config.yaml file. This allows users to access the documentation on how to use the PyPDFDirectoryLoader for loading PDF documents.
2023-07-01 17:09:35 -03:00