fix: validate flow_name presence in flow components before retrieving flow data (#3218)
* refactor: handle Data type in Vertex class The code changes in `base.py` modify the `Vertex` class to handle the `Data` type. Specifically, it adds a condition to check if the value is an instance of `Data` and then unescapes the string using `val.get_text()`. This change improves the functionality and data management in the `Vertex` class. * fix: skip artifacts without text in ComponentVertex processing Added a check to continue if the message_dict does not have a "text" field in the ComponentVertex class * fix: retrieve flow_name from attributes in SubFlowComponent Updated SubFlowComponent to ensure flow_name is fetched correctly from attributes before execution * fix: validate flow_name presence in RunFlowComponent before execution Added a conditional check to ensure flow_name is provided in attributes * fix: validate flow_name presence in FlowToolComponent before retrieving flow data Added check to ensure flow_name is provided in attributes
This commit is contained in:
parent
f0bbf127c5
commit
d44505f589
5 changed files with 16 additions and 6 deletions
|
|
@ -1,12 +1,11 @@
|
||||||
from typing import Any, List, Optional
|
from typing import Any, List, Optional
|
||||||
|
|
||||||
|
|
||||||
from langflow.base.langchain_utilities.model import LCToolComponent
|
from langflow.base.langchain_utilities.model import LCToolComponent
|
||||||
from langflow.base.tools.flow_tool import FlowTool
|
from langflow.base.tools.flow_tool import FlowTool
|
||||||
from langflow.field_typing import Tool
|
from langflow.field_typing import Tool
|
||||||
from langflow.graph.graph.base import Graph
|
from langflow.graph.graph.base import Graph
|
||||||
from langflow.helpers.flow import get_flow_inputs
|
from langflow.helpers.flow import get_flow_inputs
|
||||||
from langflow.io import BoolInput, DropdownInput, StrInput, Output
|
from langflow.io import BoolInput, DropdownInput, Output, StrInput
|
||||||
from langflow.schema import Data
|
from langflow.schema import Data
|
||||||
from langflow.schema.dotdict import dotdict
|
from langflow.schema.dotdict import dotdict
|
||||||
|
|
||||||
|
|
@ -73,7 +72,10 @@ class FlowToolComponent(LCToolComponent):
|
||||||
|
|
||||||
def build_tool(self) -> Tool:
|
def build_tool(self) -> Tool:
|
||||||
FlowTool.update_forward_refs()
|
FlowTool.update_forward_refs()
|
||||||
flow_data = self.get_flow(self.flow_name)
|
if "flow_name" not in self._attributes or not self._attributes["flow_name"]:
|
||||||
|
raise ValueError("Flow name is required")
|
||||||
|
flow_name = self._attributes["flow_name"]
|
||||||
|
flow_data = self.get_flow(flow_name)
|
||||||
if not flow_data:
|
if not flow_data:
|
||||||
raise ValueError("Flow not found.")
|
raise ValueError("Flow not found.")
|
||||||
graph = Graph.from_payload(flow_data.data["data"])
|
graph = Graph.from_payload(flow_data.data["data"])
|
||||||
|
|
|
||||||
|
|
@ -48,8 +48,12 @@ class RunFlowComponent(Component):
|
||||||
]
|
]
|
||||||
|
|
||||||
async def generate_results(self) -> List[Data]:
|
async def generate_results(self) -> List[Data]:
|
||||||
|
if "flow_name" not in self._attributes or not self._attributes["flow_name"]:
|
||||||
|
raise ValueError("Flow name is required")
|
||||||
|
flow_name = self._attributes["flow_name"]
|
||||||
|
|
||||||
results: List[Optional[RunOutputs]] = await self.run_flow(
|
results: List[Optional[RunOutputs]] = await self.run_flow(
|
||||||
inputs={"input_value": self.input_value}, flow_name=self.flow_name, tweaks=self.tweaks
|
inputs={"input_value": self.input_value}, flow_name=flow_name, tweaks=self.tweaks
|
||||||
)
|
)
|
||||||
if isinstance(results, list):
|
if isinstance(results, list):
|
||||||
data = []
|
data = []
|
||||||
|
|
|
||||||
|
|
@ -89,10 +89,10 @@ class SubFlowComponent(Component):
|
||||||
if node not in tweaks.keys():
|
if node not in tweaks.keys():
|
||||||
tweaks[node] = {}
|
tweaks[node] = {}
|
||||||
tweaks[node][name] = self._attributes[field]
|
tweaks[node][name] = self._attributes[field]
|
||||||
|
flow_name = self._attributes.get("flow_name")
|
||||||
run_outputs = await self.run_flow(
|
run_outputs = await self.run_flow(
|
||||||
tweaks=tweaks,
|
tweaks=tweaks,
|
||||||
flow_name=self.flow_name,
|
flow_name=flow_name,
|
||||||
output_type="all",
|
output_type="all",
|
||||||
)
|
)
|
||||||
data: list[Data] = []
|
data: list[Data] = []
|
||||||
|
|
|
||||||
|
|
@ -383,6 +383,8 @@ class Vertex:
|
||||||
params[field_name] = [unescape_string(v) for v in val]
|
params[field_name] = [unescape_string(v) for v in val]
|
||||||
elif isinstance(val, str):
|
elif isinstance(val, str):
|
||||||
params[field_name] = unescape_string(val)
|
params[field_name] = unescape_string(val)
|
||||||
|
elif isinstance(val, Data):
|
||||||
|
params[field_name] = unescape_string(val.get_text())
|
||||||
elif field.get("type") == "bool" and val is not None:
|
elif field.get("type") == "bool" and val is not None:
|
||||||
if isinstance(val, bool):
|
if isinstance(val, bool):
|
||||||
params[field_name] = val
|
params[field_name] = val
|
||||||
|
|
|
||||||
|
|
@ -138,6 +138,8 @@ class ComponentVertex(Vertex):
|
||||||
) and not isinstance(artifact, Message):
|
) and not isinstance(artifact, Message):
|
||||||
continue
|
continue
|
||||||
message_dict = artifact if isinstance(artifact, dict) else artifact.model_dump()
|
message_dict = artifact if isinstance(artifact, dict) else artifact.model_dump()
|
||||||
|
if not message_dict.get("text"):
|
||||||
|
continue
|
||||||
try:
|
try:
|
||||||
messages.append(
|
messages.append(
|
||||||
ChatOutputResponse(
|
ChatOutputResponse(
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue