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:
parent
d93d95cbeb
commit
5ba8f91c9a
96 changed files with 234 additions and 218 deletions
|
|
@ -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
|
||||
|
|
|
|||
|
|
@ -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
|
||||
|
||||
|
||||
|
|
|
|||
|
|
@ -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
|
||||
|
||||
|
|
|
|||
|
|
@ -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()
|
||||
|
|
|
|||
|
|
@ -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
|
||||
|
||||
|
||||
|
|
|
|||
|
|
@ -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
|
||||
|
|
|
|||
|
|
@ -1,5 +1,5 @@
|
|||
import pytest
|
||||
from langflow.components.prompts import PromptComponent
|
||||
from langflow.components.processing import PromptComponent
|
||||
|
||||
from tests.base import ComponentTestBaseWithClient
|
||||
|
||||
|
|
|
|||
|
|
@ -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")
|
||||
|
|
|
|||
|
|
@ -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")
|
||||
|
|
|
|||
|
|
@ -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
|
||||
|
||||
|
||||
|
|
|
|||
|
|
@ -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
|
||||
|
|
|
|||
|
|
@ -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
|
||||
|
|
|
|||
|
|
@ -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
|
||||
|
|
|
|||
|
|
@ -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"),
|
||||
|
|
|
|||
|
|
@ -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"]
|
||||
|
||||
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue