| from langflow.custom import Component |
| from langflow.inputs import MessageTextInput |
| from langflow.io import HandleInput, NestedDictInput, Output, StrInput |
| from langflow.schema import Data |
|
|
|
|
| class AlterMetadataComponent(Component): |
| display_name = "Alter Metadata" |
| description = "Adds/Removes Metadata Dictionary on inputs" |
| icon = "merge" |
| name = "AlterMetadata" |
|
|
| inputs = [ |
| HandleInput( |
| name="input_value", |
| display_name="Input", |
| info="Object(s) to which Metadata should be added", |
| required=False, |
| input_types=["Message", "Data"], |
| is_list=True, |
| ), |
| StrInput( |
| name="text_in", |
| display_name="User Text", |
| info="Text input; value will be in 'text' attribute of Data object. Empty text entries are ignored.", |
| required=False, |
| ), |
| NestedDictInput( |
| name="metadata", |
| display_name="Metadata", |
| info="Metadata to add to each object", |
| input_types=["Data"], |
| required=True, |
| ), |
| MessageTextInput( |
| name="remove_fields", |
| display_name="Fields to Remove", |
| info="Metadata Fields to Remove", |
| required=False, |
| is_list=True, |
| ), |
| ] |
|
|
| outputs = [ |
| Output( |
| name="data", |
| display_name="Data", |
| info="List of Input objects each with added Metadata", |
| method="process_output", |
| ), |
| ] |
|
|
| def _as_clean_dict(self, obj): |
| """Convert a Data object or a standard dictionary to a standard dictionary.""" |
| if isinstance(obj, dict): |
| as_dict = obj |
| elif isinstance(obj, Data): |
| as_dict = obj.data |
| else: |
| msg = f"Expected a Data object or a dictionary but got {type(obj)}." |
| raise TypeError(msg) |
|
|
| return {k: v for k, v in (as_dict or {}).items() if k and k.strip()} |
|
|
| def process_output(self) -> list[Data]: |
| |
| metadata = self._as_clean_dict(self.metadata) |
|
|
| |
| data_objects = [Data(text=self.text_in)] if self.text_in else [] |
|
|
| |
| if self.input_value: |
| data_objects.extend(self.input_value) |
|
|
| |
| for data in data_objects: |
| data.data.update(metadata) |
|
|
| |
| if self.remove_fields: |
| fields_to_remove = {field.strip() for field in self.remove_fields if field.strip()} |
|
|
| |
| for data in data_objects: |
| data.data = {k: v for k, v in data.data.items() if k not in fields_to_remove} |
|
|
| |
| self.status = data_objects |
| return data_objects |
|
|