diff --git a/src/backend/langflow/api/v1/schemas.py b/src/backend/langflow/api/v1/schemas.py index 9d8314d48..e28d9bca1 100644 --- a/src/backend/langflow/api/v1/schemas.py +++ b/src/backend/langflow/api/v1/schemas.py @@ -259,7 +259,7 @@ class VerticesBuiltResponse(BaseModel): class InputValueRequest(BaseModel): - components: Optional[List[str]] = None + components: Optional[List[str]] = [] input_value: Optional[str] = None # add an example diff --git a/src/backend/langflow/graph/graph/base.py b/src/backend/langflow/graph/graph/base.py index 96da64eda..f8d20d599 100644 --- a/src/backend/langflow/graph/graph/base.py +++ b/src/backend/langflow/graph/graph/base.py @@ -171,8 +171,7 @@ class Graph: raise ValueError(f"Error running graph: {exc}") from exc # Get the outputs vertex_outputs = [] - for vertex_id in self.vertices: - vertex = self.get_vertex(vertex_id) + for vertex in self.vertices: if vertex is None: raise ValueError(f"Vertex {vertex_id} not found") @@ -202,8 +201,10 @@ class Graph: for input_dict in inputs: components: Union[str, list[str]] = input_dict.get("components", []) - if not isinstance(components, list): - components = [components] + if components and not isinstance(components, list): + raise ValueError(f"Invalid components value: {components}. Expected list") + elif components is None: + components = [] if INPUT_FIELD_NAME not in input_dict: input_value = "" diff --git a/src/backend/langflow/graph/schema.py b/src/backend/langflow/graph/schema.py index a9f06ac1e..cf1afc3fe 100644 --- a/src/backend/langflow/graph/schema.py +++ b/src/backend/langflow/graph/schema.py @@ -13,6 +13,8 @@ class ResultData(BaseModel): messages: Optional[list[ChatOutputResponse]] = Field(default_factory=list) timedelta: Optional[float] = None duration: Optional[str] = None + component_display_name: Optional[str] = None + component_id: Optional[str] = None @field_serializer("results") def serialize_results(self, value): diff --git a/src/backend/langflow/graph/vertex/base.py b/src/backend/langflow/graph/vertex/base.py index 9738b65f5..58f52a522 100644 --- a/src/backend/langflow/graph/vertex/base.py +++ b/src/backend/langflow/graph/vertex/base.py @@ -428,6 +428,8 @@ class Vertex: results=result_dict, artifacts=artifacts, messages=messages, + component_display_name=self.display_name, + component_id=self.id, ) self.set_result(result_dict) diff --git a/src/backend/langflow/processing/process.py b/src/backend/langflow/processing/process.py index 49053e572..9c312a9e0 100644 --- a/src/backend/langflow/processing/process.py +++ b/src/backend/langflow/processing/process.py @@ -272,6 +272,9 @@ def process_tweaks(graph_data: Dict[str, Any], tweaks: Union["Tweaks", Dict[str, :raises ValueError: If the input is not in the expected format. """ + if not isinstance(tweaks, dict): + tweaks = tweaks.model_dump() + nodes = validate_input(graph_data, tweaks) nodes_map = {node.get("id"): node for node in nodes} diff --git a/src/frontend/src/App.tsx b/src/frontend/src/App.tsx index 0af87df78..be45e2eab 100644 --- a/src/frontend/src/App.tsx +++ b/src/frontend/src/App.tsx @@ -103,7 +103,7 @@ export default function App() {
-
+
{tempNotificationList.map((alert) => (
{alert.type === "error" && ( @@ -118,7 +118,7 @@ export default function App() {
))}
-
+
{tempNotificationList.map((alert) => (
{alert.type === "notice" ? ( @@ -129,13 +129,15 @@ export default function App() { id={alert.id} removeAlert={removeAlert} /> - ) : alert.type === "success" && ( - + ) : ( + alert.type === "success" && ( + + ) )}
))} diff --git a/src/frontend/src/CustomNodes/GenericNode/index.tsx b/src/frontend/src/CustomNodes/GenericNode/index.tsx index 38de618de..ac12eee3f 100644 --- a/src/frontend/src/CustomNodes/GenericNode/index.tsx +++ b/src/frontend/src/CustomNodes/GenericNode/index.tsx @@ -75,7 +75,11 @@ export default function GenericNode({ // This one should run only once // first check if data.type in NATIVE_CATEGORIES // if not return - if (!NATIVE_CATEGORIES.includes(types[data.type]) || !data.node?.template?.code?.value) return; + if ( + !NATIVE_CATEGORIES.includes(types[data.type]) || + !data.node?.template?.code?.value + ) + return; const thisNodeTemplate = templates[data.type].template; // if the template does not have a code key // return @@ -110,7 +114,7 @@ export default function GenericNode({ updateNodeInternals(data.id); }, - [data.id, data.node, setNode,setIsOutdated] + [data.id, data.node, setNode, setIsOutdated] ); if (!data.node!.template) { diff --git a/src/frontend/src/utils/utils.ts b/src/frontend/src/utils/utils.ts index 9651169eb..eda9a2707 100644 --- a/src/frontend/src/utils/utils.ts +++ b/src/frontend/src/utils/utils.ts @@ -386,7 +386,7 @@ export function getCurlCode( -H 'Content-Type: application/json'\\${ !isAuth ? `\n -H 'x-api-key: '\\` : "" } - -d '{"inputs": ${inputs}, "tweaks": ${ + -d '{"inputs": [${inputs}], "tweaks": ${ tweak && tweak.length > 0 ? buildTweakObject(tweak) : JSON.stringify(tweaks, null, 2) diff --git a/tests/test_helper_components.py b/tests/test_helper_components.py index 82515b699..fcbb3b3f3 100644 --- a/tests/test_helper_components.py +++ b/tests/test_helper_components.py @@ -24,9 +24,7 @@ def test_document_to_record_component(): # Act # Replace with your actual test data - document = Document( - page_content="key: value", metadata={"url": "https://example.com"} - ) + document = Document(page_content="key: value", metadata={"url": "https://example.com"}) result = document_to_record_component.build(document) # Assert @@ -44,9 +42,7 @@ def test_uuid_generator_component(): # Act build_config = frontend_node.get("template") field_name = "unique_id" - build_config = uuid_generator_component.update_build_config( - build_config, None, field_name - ) + build_config = uuid_generator_component.update_build_config(build_config, None, field_name) unique_id = build_config["unique_id"]["value"] result = uuid_generator_component.build(unique_id)