refactor: improve attribute compatibility and error messages (#3367)
* feat: Refactor how configuration attributes are handled in Component class. * refactor: Update method name to handle singular and plural inputs. * refactor: Add value validation for input and attribute assignment. * test: Add test for setting invalid input in task component. * fix: add param without underscore to inputs * test(astra): Refactor AstraDB imports in test_astra_component (#3413) * test(astra): Refactor AstraDB imports in test_astra_component * fix: Add AstraVectorizeComponent to AstraDB tests. * fix: Refactor custom component error message for setting parameter or attribute. * test(astra): Refactor AstraDB imports in test_astra_component (#3413) * test(astra): Refactor AstraDB imports in test_astra_component * fix: Add AstraVectorizeComponent to AstraDB tests. * chore: Refactor joining methods list in _set_parameter_or_attribute function. * refactor: Refactor error message string formatting in Component class.
This commit is contained in:
parent
0db81f01f7
commit
bf650ecec5
2 changed files with 36 additions and 1 deletions
|
|
@ -26,6 +26,7 @@ if TYPE_CHECKING:
|
||||||
from langflow.inputs.inputs import InputTypes
|
from langflow.inputs.inputs import InputTypes
|
||||||
|
|
||||||
BACKWARDS_COMPATIBLE_ATTRIBUTES = ["user_id", "vertex", "tracing_service"]
|
BACKWARDS_COMPATIBLE_ATTRIBUTES = ["user_id", "vertex", "tracing_service"]
|
||||||
|
CONFIG_ATTRIBUTES = ["_display_name", "_description", "_icon", "_name"]
|
||||||
|
|
||||||
|
|
||||||
class Component(CustomComponent):
|
class Component(CustomComponent):
|
||||||
|
|
@ -43,6 +44,8 @@ class Component(CustomComponent):
|
||||||
for key, value in kwargs.items():
|
for key, value in kwargs.items():
|
||||||
if key.startswith("_"):
|
if key.startswith("_"):
|
||||||
config[key] = value
|
config[key] = value
|
||||||
|
elif key in CONFIG_ATTRIBUTES:
|
||||||
|
config[key[1:]] = value
|
||||||
else:
|
else:
|
||||||
inputs[key] = value
|
inputs[key] = value
|
||||||
self._inputs: dict[str, "InputTypes"] = {}
|
self._inputs: dict[str, "InputTypes"] = {}
|
||||||
|
|
@ -142,7 +145,7 @@ class Component(CustomComponent):
|
||||||
KeyError: If the specified input name does not exist.
|
KeyError: If the specified input name does not exist.
|
||||||
"""
|
"""
|
||||||
for key, value in kwargs.items():
|
for key, value in kwargs.items():
|
||||||
self._process_connection_or_parameter(key, value)
|
self._process_connection_or_parameters(key, value)
|
||||||
return self
|
return self
|
||||||
|
|
||||||
def list_inputs(self):
|
def list_inputs(self):
|
||||||
|
|
@ -320,6 +323,14 @@ class Component(CustomComponent):
|
||||||
else:
|
else:
|
||||||
self._set_parameter_or_attribute(key, value)
|
self._set_parameter_or_attribute(key, value)
|
||||||
|
|
||||||
|
def _process_connection_or_parameters(self, key, value):
|
||||||
|
# if value is a list of components, we need to process each component
|
||||||
|
if isinstance(value, list):
|
||||||
|
for val in value:
|
||||||
|
self._process_connection_or_parameter(key, val)
|
||||||
|
else:
|
||||||
|
self._process_connection_or_parameter(key, value)
|
||||||
|
|
||||||
def _get_or_create_input(self, key):
|
def _get_or_create_input(self, key):
|
||||||
try:
|
try:
|
||||||
return self._inputs[key]
|
return self._inputs[key]
|
||||||
|
|
@ -358,6 +369,12 @@ class Component(CustomComponent):
|
||||||
)
|
)
|
||||||
|
|
||||||
def _set_parameter_or_attribute(self, key, value):
|
def _set_parameter_or_attribute(self, key, value):
|
||||||
|
if isinstance(value, Component):
|
||||||
|
methods = ", ".join([f"'{output.method}'" for output in value.outputs])
|
||||||
|
raise ValueError(
|
||||||
|
f"You set {value.display_name} as value for `{key}`. "
|
||||||
|
f"You should pass one of the following: {methods}"
|
||||||
|
)
|
||||||
self._set_input_value(key, value)
|
self._set_input_value(key, value)
|
||||||
self._parameters[key] = value
|
self._parameters[key] = value
|
||||||
self._attributes[key] = value
|
self._attributes[key] = value
|
||||||
|
|
@ -396,6 +413,12 @@ class Component(CustomComponent):
|
||||||
def _set_input_value(self, name: str, value: Any):
|
def _set_input_value(self, name: str, value: Any):
|
||||||
if name in self._inputs:
|
if name in self._inputs:
|
||||||
input_value = self._inputs[name].value
|
input_value = self._inputs[name].value
|
||||||
|
if isinstance(input_value, Component):
|
||||||
|
methods = ", ".join([f"'{output.method}'" for output in input_value.outputs])
|
||||||
|
raise ValueError(
|
||||||
|
f"You set {input_value.display_name} as value for `{name}`. "
|
||||||
|
f"You should pass one of the following: {methods}"
|
||||||
|
)
|
||||||
if callable(input_value):
|
if callable(input_value):
|
||||||
raise ValueError(
|
raise ValueError(
|
||||||
f"Input {name} is connected to {input_value.__self__.display_name}.{input_value.__name__}"
|
f"Input {name} is connected to {input_value.__self__.display_name}.{input_value.__name__}"
|
||||||
|
|
|
||||||
|
|
@ -1,5 +1,7 @@
|
||||||
import pytest
|
import pytest
|
||||||
|
|
||||||
|
from langflow.components.agents.CrewAIAgent import CrewAIAgentComponent
|
||||||
|
from langflow.components.helpers.SequentialTask import SequentialTaskComponent
|
||||||
from langflow.components.inputs.ChatInput import ChatInput
|
from langflow.components.inputs.ChatInput import ChatInput
|
||||||
from langflow.components.outputs import ChatOutput
|
from langflow.components.outputs import ChatOutput
|
||||||
|
|
||||||
|
|
@ -14,3 +16,13 @@ def test_set_invalid_output():
|
||||||
chatoutput = ChatOutput()
|
chatoutput = ChatOutput()
|
||||||
with pytest.raises(ValueError):
|
with pytest.raises(ValueError):
|
||||||
chatoutput.set(input_value=chatinput.build_config)
|
chatoutput.set(input_value=chatinput.build_config)
|
||||||
|
|
||||||
|
|
||||||
|
def test_set_invalid_input():
|
||||||
|
crewai_agent = CrewAIAgentComponent()
|
||||||
|
task = SequentialTaskComponent()
|
||||||
|
with pytest.raises(
|
||||||
|
ValueError,
|
||||||
|
match="You set CrewAI Agent as value for `agent`. You should pass one of the following: 'build_output'",
|
||||||
|
):
|
||||||
|
task.set(agent=crewai_agent)
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue