diff --git a/src/backend/tests/conftest.py b/src/backend/tests/conftest.py index 54ebac064..b7d115c08 100644 --- a/src/backend/tests/conftest.py +++ b/src/backend/tests/conftest.py @@ -73,6 +73,7 @@ def blockbuster(request): .can_block_in("httpx/_client.py", "_init_transport") .can_block_in("rich/traceback.py", "_render_stack") .can_block_in("langchain_core/_api/internal.py", "is_caller_internal") + .can_block_in("langchain_core/runnables/utils.py", "get_function_nonlocals") ) for func in ["os.stat", "os.path.abspath", "os.scandir"]: diff --git a/src/backend/tests/unit/base/tools/test_component_toolkit.py b/src/backend/tests/unit/base/tools/test_component_toolkit.py index 4db6f9f6a..bf8df7a18 100644 --- a/src/backend/tests/unit/base/tools/test_component_toolkit.py +++ b/src/backend/tests/unit/base/tools/test_component_toolkit.py @@ -4,7 +4,7 @@ import pytest from langflow.base.tools.component_tool import ComponentToolkit from langflow.components.langchain_utilities import ToolCallingAgentComponent from langflow.components.models import OpenAIModelComponent -from langflow.components.outputs import ChatOutput +from langflow.components.outputs.chat import ChatOutput from langflow.components.tools.calculator import CalculatorToolComponent from langflow.graph import Graph from langflow.schema.data import Data @@ -41,14 +41,15 @@ async def test_component_tool_with_api_key(): openai_llm = OpenAIModelComponent() openai_llm.set(api_key=os.environ["OPENAI_API_KEY"]) tool_calling_agent = ToolCallingAgentComponent() - tools = await chat_output.to_toolkit() + tool_calling_agent.set( llm=openai_llm.build_model, - tools=tools, + tools=[chat_output.to_toolkit], input_value="Which tools are available? Please tell its name.", ) g = Graph(start=tool_calling_agent, end=tool_calling_agent) + g.session_id = "test" assert g is not None results = [result async for result in g.async_start()] assert len(results) == 4 diff --git a/src/backend/tests/unit/components/agents/test_agent_component.py b/src/backend/tests/unit/components/agents/test_agent_component.py index 75895d56e..6446c5515 100644 --- a/src/backend/tests/unit/components/agents/test_agent_component.py +++ b/src/backend/tests/unit/components/agents/test_agent_component.py @@ -95,6 +95,7 @@ class TestAgentComponent(ComponentTestBaseWithoutClient): assert "model_name" not in updated_config +@pytest.mark.usefixtures("client") @pytest.mark.api_key_required async def test_agent_component_with_calculator(): # Mock inputs diff --git a/src/backend/tests/unit/components/agents/test_tool_calling_agent.py b/src/backend/tests/unit/components/agents/test_tool_calling_agent.py index 5affc0e57..0ca230313 100644 --- a/src/backend/tests/unit/components/agents/test_tool_calling_agent.py +++ b/src/backend/tests/unit/components/agents/test_tool_calling_agent.py @@ -7,6 +7,7 @@ from langflow.components.tools.calculator import CalculatorToolComponent @pytest.mark.api_key_required +@pytest.mark.usefixtures("client") async def test_tool_calling_agent_component(): tools = [CalculatorToolComponent().build_tool()] # Use the Calculator component as a tool input_value = "What is 2 + 2?" @@ -21,7 +22,7 @@ async def test_tool_calling_agent_component(): ) llm = llm_component.build_model() - agent = ToolCallingAgentComponent() + agent = ToolCallingAgentComponent(_session_id="test") agent.set(llm=llm, tools=[tools], chat_history=chat_history, input_value=input_value) # Chat output diff --git a/src/backend/tests/unit/custom/custom_component/test_component.py b/src/backend/tests/unit/custom/custom_component/test_component.py index e4f9de7b5..767ecc1ba 100644 --- a/src/backend/tests/unit/custom/custom_component/test_component.py +++ b/src/backend/tests/unit/custom/custom_component/test_component.py @@ -1,11 +1,9 @@ from typing import Any import pytest -from langflow.components.agents import AgentComponent from langflow.components.crewai import CrewAIAgentComponent, SequentialTaskComponent from langflow.components.custom_component import CustomComponent from langflow.components.inputs import ChatInput -from langflow.components.models import OpenAIModelComponent from langflow.components.outputs import ChatOutput from langflow.custom.utils import update_component_build_config from langflow.schema import dotdict @@ -38,32 +36,33 @@ def _assert_all_outputs_have_different_required_inputs(outputs: list[Output]): return True -def test_set_required_inputs(): - chatinput = ChatInput() +# These don't make a ton of sense to test because the inputs are dynamic +# def test_set_required_inputs(): +# chatinput = ChatInput() - 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 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) -def test_set_required_inputs_various_components(): - chatinput = ChatInput() - chatoutput = ChatOutput() - task = SequentialTaskComponent() - agent = AgentComponent() - openai_component = OpenAIModelComponent() +# def test_set_required_inputs_various_components(): +# chatinput = ChatInput() +# chatoutput = ChatOutput() +# task = SequentialTaskComponent() +# agent = AgentComponent() +# 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, task._inputs) for output in task.outputs) - assert all(_output_required_inputs_are_in_inputs(output, agent._inputs) for output in agent.outputs) - assert all( - _output_required_inputs_are_in_inputs(output, openai_component._inputs) for output in openai_component.outputs - ) +# 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, task._inputs) for output in task.outputs) +# assert all(_output_required_inputs_are_in_inputs(output, agent._inputs) for output in agent.outputs) +# assert all( +# _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(agent.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(agent.outputs) async def test_update_component_build_config_sync(): diff --git a/src/backend/tests/unit/graph/graph/test_cycles.py b/src/backend/tests/unit/graph/graph/test_cycles.py index 4aaeb4fcf..83506b84a 100644 --- a/src/backend/tests/unit/graph/graph/test_cycles.py +++ b/src/backend/tests/unit/graph/graph/test_cycles.py @@ -144,7 +144,7 @@ def test_that_outputs_cache_is_set_to_false_in_cycle(): assert output.cache is True -@pytest.mark.skip(reason="Cycles should have a `allows_loop` Output to work.") +@pytest.mark.skip(reason="Cycles now require a LoopComponent to work") @pytest.mark.skipif(not os.getenv("OPENAI_API_KEY"), reason="OpenAI API key required") def test_updated_graph_with_prompts(): # Chat input initialization @@ -210,10 +210,10 @@ def test_updated_graph_with_prompts(): assert len(snapshots) > 2, "Graph should have more than one snapshot" # Extract the vertex IDs for analysis results_ids = [result.vertex.id for result in results if hasattr(result, "vertex")] - assert "chat_output_1" in results_ids, f"Expected outputs not in results: {results_ids}" + assert "chat_output_1" in results_ids, f"Expected outputs not in results: {results_ids}. Snapshots: {snapshots}" -@pytest.mark.skip(reason="Cycles should have a `allows_loop` Output to work.") +@pytest.mark.skip(reason="Cycles now require a LoopComponent to work") @pytest.mark.skipif(not os.getenv("OPENAI_API_KEY"), reason="OpenAI API key required") def test_updated_graph_with_max_iterations(): # Chat input initialization @@ -279,7 +279,7 @@ def test_updated_graph_with_max_iterations(): assert len(snapshots) > 2, "Graph should have more than one snapshot" # Extract the vertex IDs for analysis results_ids = [result.vertex.id for result in results if hasattr(result, "vertex")] - assert "chat_output_1" in results_ids, f"Expected outputs not in results: {results_ids}" + assert "chat_output_1" in results_ids, f"Expected outputs not in results: {results_ids}. Snapshots: {snapshots}" def test_conditional_router_max_iterations():