fix: Optimize Setting of Output Required Inputs (#4389)

Update component.py

Fix required inputs not updated if its already defined
This commit is contained in:
Edwin Jose 2024-11-05 00:31:13 -05:00 • committed by GitHub
commit 7cc497aa52
No known key found for this signature in database
GPG key ID: B5690EEEBB952194
4 changed files with 40 additions and 20 deletions

View file

@ -1,3 +1,4 @@
from .agent import AgentComponent
from .crewai import CrewAIAgentComponent from .crewai import CrewAIAgentComponent
from .csv import CSVAgentComponent from .csv import CSVAgentComponent
from .hierarchical_crew import HierarchicalCrewComponent from .hierarchical_crew import HierarchicalCrewComponent
@ -26,4 +27,5 @@ __all__ = [
"VectorStoreAgentComponent", "VectorStoreAgentComponent",
"VectorStoreRouterAgentComponent", "VectorStoreRouterAgentComponent",
"XMLAgentComponent", "XMLAgentComponent",
"AgentComponent",
] ]

View file

@ -10,6 +10,7 @@ from langflow.field_typing import LanguageModel
from langflow.field_typing.range_spec import RangeSpec from langflow.field_typing.range_spec import RangeSpec
from langflow.inputs import BoolInput, DictInput, DropdownInput, FloatInput, IntInput, SecretStrInput, StrInput from langflow.inputs import BoolInput, DictInput, DropdownInput, FloatInput, IntInput, SecretStrInput, StrInput
from langflow.inputs.inputs import HandleInput from langflow.inputs.inputs import HandleInput
from langflow.io import Output
class OpenAIModelComponent(LCModelComponent): class OpenAIModelComponent(LCModelComponent):
@ -81,6 +82,10 @@ class OpenAIModelComponent(LCModelComponent):
input_types=["OutputParser"], input_types=["OutputParser"],
), ),
] ]
outputs = [
Output(display_name="Text", name="text_output", method="text_response"),
Output(display_name="Language Model", name="model_output", method="build_model"),
]
def build_model(self) -> LanguageModel: # type: ignore[type-var] def build_model(self) -> LanguageModel: # type: ignore[type-var]
# self.output_schema is a list of dictionaries # self.output_schema is a list of dictionaries

View file

@ -369,6 +369,8 @@ class Component(CustomComponent):
def _set_output_required_inputs(self) -> None: def _set_output_required_inputs(self) -> None:
for output in self.outputs: for output in self.outputs:
if output.required_inputs:
continue
if not output.method: if not output.method:
continue continue
method = getattr(self, output.method, None) method = getattr(self, output.method, None)

View file

@ -1,5 +1,5 @@
import pytest import pytest
from langflow.components.agents import CrewAIAgentComponent, ToolCallingAgentComponent from langflow.components.agents import AgentComponent, CrewAIAgentComponent, ToolCallingAgentComponent
from langflow.components.helpers import SequentialTaskComponent from langflow.components.helpers import SequentialTaskComponent
from langflow.components.inputs import ChatInput from langflow.components.inputs import ChatInput
from langflow.components.models import OpenAIModelComponent from langflow.components.models import OpenAIModelComponent
@ -32,33 +32,44 @@ def _assert_all_outputs_have_different_required_inputs(outputs: list[Output]):
return True return True
def test_set_required_inputs(): def test_set_required_inputs_chat_input():
chatinput = ChatInput() chatinput = ChatInput()
assert all(_output_required_inputs_are_in_inputs(output, chatinput._inputs) for output in chatinput.outputs) assert all(_output_required_inputs_are_in_inputs(output, chatinput._inputs) for output in chatinput.outputs)
assert _assert_all_outputs_have_different_required_inputs(chatinput.outputs) assert _assert_all_outputs_have_different_required_inputs(chatinput.outputs)
def test_set_required_inputs_various_components(): def test_set_required_inputs_chat_output():
chatinput = ChatInput()
chatoutput = ChatOutput() chatoutput = ChatOutput()
task = SequentialTaskComponent()
tool_calling_agent = ToolCallingAgentComponent()
openai_component = OpenAIModelComponent()
assert all(_output_required_inputs_are_in_inputs(output, chatinput._inputs) for output in chatinput.outputs)
assert all(_output_required_inputs_are_in_inputs(output, chatoutput._inputs) for output in chatoutput.outputs) assert all(_output_required_inputs_are_in_inputs(output, chatoutput._inputs) for output in chatoutput.outputs)
assert all(_output_required_inputs_are_in_inputs(output, task._inputs) for output in task.outputs) assert _assert_all_outputs_have_different_required_inputs(chatoutput.outputs)
assert all(
_output_required_inputs_are_in_inputs(output, tool_calling_agent._inputs)
for output in tool_calling_agent.outputs def test_set_required_inputs_openai_component():
) openai_component = OpenAIModelComponent()
assert all( assert all(
_output_required_inputs_are_in_inputs(output, openai_component._inputs) for output in openai_component.outputs _output_required_inputs_are_in_inputs(output, openai_component._inputs) for output in openai_component.outputs
) )
assert _assert_all_outputs_have_different_required_inputs(chatinput.outputs)
assert _assert_all_outputs_have_different_required_inputs(chatoutput.outputs)
assert _assert_all_outputs_have_different_required_inputs(task.outputs)
assert _assert_all_outputs_have_different_required_inputs(tool_calling_agent.outputs)
assert _assert_all_outputs_have_different_required_inputs(openai_component.outputs) assert _assert_all_outputs_have_different_required_inputs(openai_component.outputs)
def test_set_required_inputs_tool_calling_agent_component():
tool_calling_agent_component = ToolCallingAgentComponent()
assert all(
_output_required_inputs_are_in_inputs(output, tool_calling_agent_component._inputs)
for output in tool_calling_agent_component.outputs
)
assert _assert_all_outputs_have_different_required_inputs(tool_calling_agent_component.outputs)
def test_set_required_inputs_agent_component():
agent_component = AgentComponent()
assert all(
_output_required_inputs_are_in_inputs(output, agent_component._inputs) for output in agent_component.outputs
)
assert _assert_all_outputs_have_different_required_inputs(agent_component.outputs)
def test_set_required_inputs_sequential_task_component():
task = SequentialTaskComponent()
assert all(_output_required_inputs_are_in_inputs(output, task._inputs) for output in task.outputs)
assert _assert_all_outputs_have_different_required_inputs(task.outputs)