refactor: reorganize components and update PromptComponent with priority attribute (#8667)

* Update styleUtils.ts

* update to prompt component

* update to template

* update to mcp component

* update to smart function

* [autofix.ci] apply automated fixes

* update to templates

* fix sidebar

* change name

* update import

* update import

* update import

* [autofix.ci] apply automated fixes

* fix import

* fix ollama

* fix ruff

* refactor(agent): standardize memory handling and update chat history logic (#8715)

* update chat history

* update to agents

* Update Simple Agent.json

* update to templates

* ruff errors

* Update agent.py

* Update test_agent_component.py

* [autofix.ci] apply automated fixes

* update templates

* test fix

---------

Co-authored-by: autofix-ci[bot] <114827586+autofix-ci[bot]@users.noreply.github.com>
Co-authored-by: Mike Fortman <michael.fortman@datastax.com>

* fix prompt change

* feat(message): support sequencing of multiple streamable models (#8434)

* feat: update OpenAI model parameters handling for reasoning models

* feat: extend input_value type in LCModelComponent to support AsyncIterator and Iterator

* refactor: remove assert_streaming_sequence method and related checks from Graph class

* feat: add consume_iterator method to Message class for handling iterators

* test: add unit tests for OpenAIModelComponent functionality and integration

* feat: update OpenAIModelComponent to include temperature and seed parameters in build_model method

* feat: rename consume_iterator method to consume_iterator_in_text and update its implementation for handling text

* feat: add is_connected_to_chat_output method to Component class for improved message handling

* feat: refactor LCModelComponent methods to support asynchronous message handling and improve chat output integration

* refactor: remove consume_iterator_in_text method from Message class and clean up LCModelComponent input handling

* fix: update import paths for input components in multiple starter project JSON files

* fix: enhance error message formatting in ErrorMessage class to handle additional exception attributes

* refactor: remove validate_stream calls from generate_flow_events and Graph class to streamline flow processing

* fix: handle asyncio.CancelledError in aadd_messagetables to ensure proper session rollback and retry logic

* refactor: streamline message handling in LCModelComponent by replacing async invocation with synchronous calls and updating message text handling

* refactor: enhance message handling in LCModelComponent by introducing lf_message for improved return value management and updating properties for consistency

* feat: add _build_source method to Component class for enhanced source handling and flexibility in source object management

* feat: enhance LCModelComponent by adding _handle_stream method for improved streaming response handling and refactoring chat output integration

* feat: update MemoryComponent to enhance message retrieval and storage functionality, including new sender type handling and output options for text and dataframe formats

* test: refactor LanguageModelComponent tests to use ComponentTestBaseWithoutClient and add tests for Google model creation and error handling

* test: add fixtures for API keys and implement live API tests for OpenAI, Anthropic, and Google models

* fix: reorder JSON properties for consistency in starter projects

* Updated JSON files for various starter projects to ensure consistent ordering of properties, specifically moving "type" to follow "selected_output" for better readability and maintainability.
* Affected files: Basic Prompt Chaining.json, Blog Writer.json, Financial Report Parser.json, Hybrid Search RAG.json, SEO Keyword Generator.json.

* refactor: simplify input_value type in LCModelComponent

* Updated the input_value parameter in LCModelComponent to remove AsyncIterator and Iterator types, streamlining the input options to only str and Message for improved clarity and maintainability.
* This change enhances the documentation and understanding of the expected input types for the component.

* fix: clarify comment for handling source in Component class

* refactor: remove unnecessary mocking in OpenAI model integration tests

* auto update

* update

* [autofix.ci] apply automated fixes

* fix openai import

* revert template changes

* test fixes

* update templates

* [autofix.ci] apply automated fixes

* fix tests

* fix order

* fix prompts import

* fix frontend tests

* fix frontend

* [autofix.ci] apply automated fixes

* add charmander

* [autofix.ci] apply automated fixes

* fix prompt frontend

* fix frontend

* test fix

* [autofix.ci] apply automated fixes

* change pokedex

* remove pokedex extra

* update template

* name fix

* update template

* mcp test fix

---------

Co-authored-by: autofix-ci[bot] <114827586+autofix-ci[bot]@users.noreply.github.com>
Co-authored-by: cristhianzl <cristhian.lousa@gmail.com>
Co-authored-by: Yuqi Tang <yuqi.tang@datastax.com>
Co-authored-by: Mike Fortman <michael.fortman@datastax.com>
Co-authored-by: Gabriel Luiz Freitas Almeida <gabriel@langflow.org>
This commit is contained in:
Edwin Jose 2025-06-27 12:02:06 -05:00 • committed by GitHub
commit 5ba8f91c9a
No known key found for this signature in database
GPG key ID: B5690EEEBB952194
96 changed files with 234 additions and 218 deletions

View file

@ -4,7 +4,7 @@ import pytest
from astrapy import DataAPIClient
from langchain_astradb import AstraDBVectorStore, VectorServiceOptions
from langchain_core.documents import Document
from langflow.components.embeddings import OpenAIEmbeddingsComponent
from langflow.components.openai.openai import OpenAIEmbeddingsComponent
from langflow.components.vectorstores import AstraDBVectorStoreComponent
from langflow.schema.data import Data

View file

@ -6,7 +6,7 @@ from tests.integration.utils import run_single_component
# TODO: Add more tests for MCPToolsComponent
@pytest.mark.asyncio
async def test_mcp_component():
from langflow.components.data.mcp_component import MCPToolsComponent
from langflow.components.agents.mcp_component import MCPToolsComponent
inputs = {}

View file

@ -2,8 +2,8 @@ import os
import pytest
from langflow.components.helpers import OutputParserComponent
from langflow.components.languagemodels import OpenAIModelComponent
from langflow.components.prompts import PromptComponent
from langflow.components.openai.openai_chat_model import OpenAIModelComponent
from langflow.components.processing import PromptComponent
from tests.integration.utils import ComponentInputHandle, run_single_component

View file

@ -1,4 +1,4 @@
from langflow.components.prompts import PromptComponent
from langflow.components.processing import PromptComponent
from langflow.schema.message import Message
from tests.integration.utils import run_single_component

View file

@ -1,5 +1,5 @@
from langflow.components.input_output import ChatInput, ChatOutput
from langflow.components.prompts import PromptComponent
from langflow.components.processing import PromptComponent
from langflow.graph import Graph
from langflow.schema.message import Message

View file

@ -7,7 +7,7 @@ from langflow.base.tools.component_tool import ComponentToolkit
from langflow.components.data.sql_executor import SQLComponent
from langflow.components.input_output.chat_output import ChatOutput
from langflow.components.langchain_utilities import ToolCallingAgentComponent
from langflow.components.languagemodels import OpenAIModelComponent
from langflow.components.openai.openai_chat_model import OpenAIModelComponent
from langflow.components.tools.calculator import CalculatorToolComponent
from langflow.graph.graph.base import Graph
from pydantic import BaseModel

View file

@ -2,7 +2,7 @@ import os
import pytest
from langflow.components.langchain_utilities import ToolCallingAgentComponent
from langflow.components.languagemodels.openai_chat_model import OpenAIModelComponent
from langflow.components.openai.openai_chat_model import OpenAIModelComponent
from langflow.components.tools.calculator import CalculatorToolComponent

View file

@ -2,7 +2,7 @@ import asyncio
from unittest.mock import AsyncMock, MagicMock, patch
import pytest
from langflow.components.data.mcp_component import MCPSseClient, MCPStdioClient, MCPToolsComponent
from langflow.components.agents.mcp_component import MCPSseClient, MCPStdioClient, MCPToolsComponent
from tests.base import ComponentTestBaseWithoutClient, VersionComponentMapping

View file

@ -2,7 +2,7 @@ from unittest.mock import AsyncMock, MagicMock, patch
import pytest
from langchain_ollama import ChatOllama
from langflow.components.languagemodels.ollama import ChatOllamaComponent
from langflow.components.ollama.ollama import ChatOllamaComponent
from tests.base import ComponentTestBaseWithoutClient
@ -40,7 +40,7 @@ class TestChatOllamaComponent(ComponentTestBaseWithoutClient):
# Provide an empty list or the actual mapping if versioned files exist
return []
@patch("langflow.components.languagemodels.ollama.ChatOllama")
@patch("langflow.components.ollama.ollama.ChatOllama")
async def test_build_model(self, mock_chat_ollama, component_class, default_kwargs):
mock_instance = MagicMock()
mock_chat_ollama.return_value = mock_instance
@ -68,7 +68,7 @@ class TestChatOllamaComponent(ComponentTestBaseWithoutClient):
)
assert model == mock_instance
@patch("langflow.components.languagemodels.ollama.ChatOllama")
@patch("langflow.components.ollama.ollama.ChatOllama")
async def test_build_model_missing_base_url(self, mock_chat_ollama, component_class, default_kwargs):
# Make the mock raise an exception to simulate connection failure
mock_chat_ollama.side_effect = Exception("connection error")
@ -78,8 +78,8 @@ class TestChatOllamaComponent(ComponentTestBaseWithoutClient):
component.build_model()
@pytest.mark.asyncio
@patch("langflow.components.languagemodels.ollama.httpx.AsyncClient.post")
@patch("langflow.components.languagemodels.ollama.httpx.AsyncClient.get")
@patch("langflow.components.ollama.ollama.httpx.AsyncClient.post")
@patch("langflow.components.ollama.ollama.httpx.AsyncClient.get")
async def test_get_models_success(self, mock_get, mock_post):
component = ChatOllamaComponent()
mock_get_response = AsyncMock()
@ -107,7 +107,7 @@ class TestChatOllamaComponent(ComponentTestBaseWithoutClient):
assert mock_post.call_count == 2
@pytest.mark.asyncio
@patch("langflow.components.languagemodels.ollama.httpx.AsyncClient.get")
@patch("langflow.components.ollama.ollama.httpx.AsyncClient.get")
async def test_get_models_failure(self, mock_get):
import httpx
@ -147,7 +147,7 @@ class TestChatOllamaComponent(ComponentTestBaseWithoutClient):
assert updated_config["mirostat_eta"]["value"] == 0.2
assert updated_config["mirostat_tau"]["value"] == 10
@patch("langflow.components.languagemodels.ollama.httpx.AsyncClient.get")
@patch("langflow.components.ollama.ollama.httpx.AsyncClient.get")
@pytest.mark.asyncio
async def test_update_build_config_model_name(self, mock_get):
component = ChatOllamaComponent()

View file

@ -1,4 +1,4 @@
from langflow.components.languagemodels.huggingface import DEFAULT_MODEL, HuggingFaceEndpointsComponent
from langflow.components.huggingface.huggingface import DEFAULT_MODEL, HuggingFaceEndpointsComponent
from langflow.inputs.inputs import DictInput, DropdownInput, FloatInput, IntInput, SecretStrInput, SliderInput, StrInput

View file

@ -3,7 +3,7 @@ from unittest.mock import MagicMock, patch
import pytest
from langchain_openai import ChatOpenAI
from langflow.components.languagemodels.openai_chat_model import OpenAIModelComponent
from langflow.components.openai.openai_chat_model import OpenAIModelComponent
from tests.base import ComponentTestBaseWithoutClient
@ -33,7 +33,7 @@ class TestOpenAIModelComponent(ComponentTestBaseWithoutClient):
# Provide an empty list or the actual mapping if versioned files exist
return []
@patch("langflow.components.languagemodels.openai_chat_model.ChatOpenAI")
@patch("langflow.components.openai.openai_chat_model.ChatOpenAI")
async def test_build_model(self, mock_chat_openai, component_class, default_kwargs):
mock_instance = MagicMock()
mock_chat_openai.return_value = mock_instance
@ -53,7 +53,7 @@ class TestOpenAIModelComponent(ComponentTestBaseWithoutClient):
)
assert model == mock_instance
@patch("langflow.components.languagemodels.openai_chat_model.ChatOpenAI")
@patch("langflow.components.openai.openai_chat_model.ChatOpenAI")
async def test_build_model_reasoning_model(self, mock_chat_openai, component_class, default_kwargs):
mock_instance = MagicMock()
mock_chat_openai.return_value = mock_instance
@ -78,7 +78,7 @@ class TestOpenAIModelComponent(ComponentTestBaseWithoutClient):
assert "temperature" not in kwargs
assert "seed" not in kwargs
@patch("langflow.components.languagemodels.openai_chat_model.ChatOpenAI")
@patch("langflow.components.openai.openai_chat_model.ChatOpenAI")
async def test_build_model_with_json_mode(self, mock_chat_openai, component_class, default_kwargs):
mock_instance = MagicMock()
mock_bound_instance = MagicMock()
@ -93,7 +93,7 @@ class TestOpenAIModelComponent(ComponentTestBaseWithoutClient):
mock_instance.bind.assert_called_once_with(response_format={"type": "json_object"})
assert model == mock_bound_instance
@patch("langflow.components.languagemodels.openai_chat_model.ChatOpenAI")
@patch("langflow.components.openai.openai_chat_model.ChatOpenAI")
async def test_build_model_no_api_key(self, mock_chat_openai, component_class, default_kwargs):
mock_instance = MagicMock()
mock_chat_openai.return_value = mock_instance
@ -105,7 +105,7 @@ class TestOpenAIModelComponent(ComponentTestBaseWithoutClient):
args, kwargs = mock_chat_openai.call_args
assert kwargs["api_key"] is None
@patch("langflow.components.languagemodels.openai_chat_model.ChatOpenAI")
@patch("langflow.components.openai.openai_chat_model.ChatOpenAI")
async def test_build_model_max_tokens_zero(self, mock_chat_openai, component_class, default_kwargs):
mock_instance = MagicMock()
mock_chat_openai.return_value = mock_instance

View file

@ -1,5 +1,5 @@
import pytest
from langflow.components.prompts import PromptComponent
from langflow.components.processing import PromptComponent
from tests.base import ComponentTestBaseWithClient

View file

@ -19,7 +19,7 @@ class TestChromaVectorStoreComponent(ComponentTestBaseWithoutClient):
@pytest.fixture
def default_kwargs(self, tmp_path: Path) -> dict[str, Any]:
"""Return the default kwargs for the component."""
from langflow.components.embeddings.openai import OpenAIEmbeddingsComponent
from langflow.components.openai.openai import OpenAIEmbeddingsComponent
if os.getenv("OPENAI_API_KEY") is None:
pytest.skip("OPENAI_API_KEY is not set")

View file

@ -21,7 +21,7 @@ class TestLocalDBComponent(ComponentTestBaseWithoutClient):
@pytest.fixture
def default_kwargs(self, tmp_path: Path) -> dict[str, Any]:
"""Return the default kwargs for the component."""
from langflow.components.embeddings.openai import OpenAIEmbeddingsComponent
from langflow.components.openai.openai import OpenAIEmbeddingsComponent
if os.getenv("OPENAI_API_KEY") is None:
pytest.skip("OPENAI_API_KEY is not set")

View file

@ -2,8 +2,8 @@ import re
import pytest
from langflow.components.input_output import ChatInput, ChatOutput
from langflow.components.languagemodels import OpenAIModelComponent
from langflow.components.prompts import PromptComponent
from langflow.components.openai.openai_chat_model import OpenAIModelComponent
from langflow.components.processing import PromptComponent
from langflow.graph.graph.base import Graph

View file

@ -3,9 +3,9 @@ import os
import pytest
from langflow.components.input_output import ChatInput, ChatOutput, TextOutputComponent
from langflow.components.input_output.text import TextInputComponent
from langflow.components.languagemodels import OpenAIModelComponent
from langflow.components.logic.conditional_router import ConditionalRouterComponent
from langflow.components.prompts import PromptComponent
from langflow.components.openai.openai_chat_model import OpenAIModelComponent
from langflow.components.processing import PromptComponent
from langflow.custom.custom_component.component import Component
from langflow.graph.graph.base import Graph
from langflow.graph.graph.utils import find_cycle_vertices

View file

@ -3,9 +3,9 @@ from typing import TYPE_CHECKING
import pytest
from langflow.components.helpers.memory import MemoryComponent
from langflow.components.input_output import ChatInput, ChatOutput
from langflow.components.languagemodels import OpenAIModelComponent
from langflow.components.openai.openai_chat_model import OpenAIModelComponent
from langflow.components.processing import PromptComponent
from langflow.components.processing.converter import TypeConverterComponent
from langflow.components.prompts import PromptComponent
from langflow.graph.graph.base import Graph
from langflow.graph.graph.constants import Finish
from langflow.graph.graph.state_model import create_state_model_from_graph

View file

@ -5,9 +5,9 @@ from typing import TYPE_CHECKING
import pytest
from langflow.components.helpers.memory import MemoryComponent
from langflow.components.input_output import ChatInput, ChatOutput
from langflow.components.languagemodels import OpenAIModelComponent
from langflow.components.openai.openai_chat_model import OpenAIModelComponent
from langflow.components.processing import PromptComponent
from langflow.components.processing.converter import TypeConverterComponent
from langflow.components.prompts import PromptComponent
from langflow.graph.graph.base import Graph
from langflow.graph.graph.constants import Finish
@ -131,7 +131,7 @@ def test_memory_chatbot_dump_components_and_edges(memory_chatbot_graph: Graph):
assert nodes[3]["data"]["type"] == "OpenAIModel"
assert nodes[3]["id"] == "openai"
assert nodes[4]["data"]["type"] == "Prompt"
assert nodes[4]["data"]["type"] == "Prompt Template"
assert nodes[4]["id"] == "prompt"
# Check edges

View file

@ -4,12 +4,11 @@ from textwrap import dedent
import pytest
from langflow.components.data import FileComponent
from langflow.components.embeddings import OpenAIEmbeddingsComponent
from langflow.components.input_output import ChatInput, ChatOutput
from langflow.components.languagemodels import OpenAIModelComponent
from langflow.components.processing import ParseDataComponent
from langflow.components.openai.openai import OpenAIEmbeddingsComponent
from langflow.components.openai.openai_chat_model import OpenAIModelComponent
from langflow.components.processing import ParseDataComponent, PromptComponent
from langflow.components.processing.split_text import SplitTextComponent
from langflow.components.prompts import PromptComponent
from langflow.components.vectorstores import AstraDBVectorStoreComponent
from langflow.graph.graph.base import Graph
from langflow.graph.graph.constants import Finish
@ -199,7 +198,7 @@ def test_vector_store_rag_dump_components_and_edges(ingestion_graph, rag_graph):
assert rag_nodes[4]["data"]["type"] == "ParseData"
assert rag_nodes[4]["id"] == "parse-data-123"
assert rag_nodes[5]["data"]["type"] == "Prompt"
assert rag_nodes[5]["data"]["type"] == "Prompt Template"
assert rag_nodes[5]["id"] == "prompt-123"
assert rag_nodes[6]["data"]["type"] == "AstraDB"
@ -259,7 +258,7 @@ def test_vector_store_rag_add(ingestion_graph: Graph, rag_graph: Graph):
{"id": "openai-123", "type": "OpenAIModel"},
{"id": "openai-embeddings-124", "type": "OpenAIEmbeddings"},
{"id": "parse-data-123", "type": "ParseData"},
{"id": "prompt-123", "type": "Prompt"},
{"id": "prompt-123", "type": "Prompt Template"},
{"id": "rag-vector-store-123", "type": "AstraDB"},
],
key=operator.itemgetter("id"),

View file

@ -143,7 +143,7 @@ async def test_get_all(client: AsyncClient, logged_in_headers):
files
) # Less or equal because we might have some files that don't have the dependencies installed
assert "ChatInput" in json_response["input_output"]
assert "Prompt" in json_response["prompts"]
assert "Prompt Template" in json_response["processing"]
assert "ChatOutput" in json_response["input_output"]