From 2212458bef65f9eb883c3b1d4e81873d0d556072 Mon Sep 17 00:00:00 2001 From: italojohnny Date: Thu, 20 Jun 2024 17:12:53 -0300 Subject: [PATCH 01/15] fix return value error reported by mypy --- src/backend/base/langflow/template/template/base.py | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/src/backend/base/langflow/template/template/base.py b/src/backend/base/langflow/template/template/base.py index ef6082cf8..bbedd14b2 100644 --- a/src/backend/base/langflow/template/template/base.py +++ b/src/backend/base/langflow/template/template/base.py @@ -1,4 +1,4 @@ -from typing import Callable, Union +from typing import Callable, Union, cast from pydantic import BaseModel, Field, model_serializer @@ -9,7 +9,8 @@ from langflow.utils.constants import DIRECT_TYPES class Template(BaseModel): type_name: str = Field(serialization_alias="_type") - fields: list[Input | InputTypes] + fields: list[Union[Input, InputTypes]] + def process_fields( self, @@ -49,7 +50,7 @@ class Template(BaseModel): field = next((field for field in self.fields if field.name == field_name), None) if field is None: raise ValueError(f"Field {field_name} not found in template {self.type_name}") - return field + return cast(Input, field) def update_field(self, field_name: str, field: Input) -> None: """Updates the field with the given name.""" From 6903eca138f252a530ac465d7a6383afe5001734 Mon Sep 17 00:00:00 2001 From: italojohnny Date: Thu, 20 Jun 2024 17:22:36 -0300 Subject: [PATCH 02/15] fix arg-type error reported by mypy --- src/backend/base/langflow/schema/message.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/backend/base/langflow/schema/message.py b/src/backend/base/langflow/schema/message.py index 4a436a3a3..cfe589b10 100644 --- a/src/backend/base/langflow/schema/message.py +++ b/src/backend/base/langflow/schema/message.py @@ -1,5 +1,5 @@ from datetime import datetime, timezone -from typing import Annotated, Any, AsyncIterator, Iterator, Optional +from typing import Annotated, Any, AsyncIterator, Iterator, Optional, List from fastapi.encoders import jsonable_encoder from langchain_core.load import load @@ -42,7 +42,7 @@ class Message(Data): return value def model_post_init(self, __context: Any) -> None: - new_files = [] + new_files: List[Any] = [] for file in self.files or []: if is_image_file(file): new_files.append(Image(path=file)) From 7704c2e302d1b09c59822a6ce952af0e68aca86d Mon Sep 17 00:00:00 2001 From: italojohnny Date: Thu, 20 Jun 2024 17:56:54 -0300 Subject: [PATCH 03/15] fix arg-type error reported by mypy --- src/backend/base/langflow/api/v1/chat.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/backend/base/langflow/api/v1/chat.py b/src/backend/base/langflow/api/v1/chat.py index 747668b9e..27e8191d6 100644 --- a/src/backend/base/langflow/api/v1/chat.py +++ b/src/backend/base/langflow/api/v1/chat.py @@ -111,7 +111,7 @@ async def retrieve_vertices_order( run_id = uuid.uuid4() graph.set_run_id(run_id) vertices_to_run = list(graph.vertices_to_run) + get_top_level_vertices(graph, graph.vertices_to_run) - await chat_service.set_cache(flow_id, graph) + await chat_service.set_cache(str(flow_id), graph) return VerticesOrderResponse(ids=first_layer, run_id=run_id, vertices_to_run=vertices_to_run) except Exception as exc: From 7e92f74f28becd8d66f95ebfa2a224ac7513d9a5 Mon Sep 17 00:00:00 2001 From: Gabriel Luiz Freitas Almeida Date: Thu, 20 Jun 2024 18:00:33 -0300 Subject: [PATCH 04/15] refactor: Update data.py to use a copy of the data dictionary in the to_lc_message method --- src/backend/base/langflow/schema/data.py | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/src/backend/base/langflow/schema/data.py b/src/backend/base/langflow/schema/data.py index 861f40878..919b165d9 100644 --- a/src/backend/base/langflow/schema/data.py +++ b/src/backend/base/langflow/schema/data.py @@ -106,8 +106,9 @@ class Data(BaseModel): Returns: Document: The converted Document. """ - text = self.data.pop(self.text_key, self.default_value) - return Document(page_content=text, metadata=self.data) + data_copy = self.data.copy() + text = data_copy.pop(self.text_key, self.default_value) + return Document(page_content=text, metadata=data_copy) def to_lc_message( self, From 43058045ebc082ea4f2007a5ca6d84028641c251 Mon Sep 17 00:00:00 2001 From: Gabriel Luiz Freitas Almeida Date: Thu, 20 Jun 2024 18:09:10 -0300 Subject: [PATCH 05/15] refactor: Update LCModelComponent to use BaseMessage instead of HumanMessage and SystemMessage --- src/backend/base/langflow/base/models/model.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/backend/base/langflow/base/models/model.py b/src/backend/base/langflow/base/models/model.py index 810fa092c..1e4152b28 100644 --- a/src/backend/base/langflow/base/models/model.py +++ b/src/backend/base/langflow/base/models/model.py @@ -3,7 +3,7 @@ import warnings from typing import Optional, Union from langchain_core.language_models.llms import LLM -from langchain_core.messages import AIMessage, HumanMessage, SystemMessage +from langchain_core.messages import AIMessage, BaseMessage, HumanMessage, SystemMessage from langflow.custom import Component from langflow.field_typing import LanguageModel @@ -120,7 +120,7 @@ class LCModelComponent(Component): def get_chat_result( self, runnable: LanguageModel, stream: bool, input_value: str | Message, system_message: Optional[str] = None ): - messages: list[Union[HumanMessage, SystemMessage]] = [] + messages: list[Union[BaseMessage]] = [] if not input_value and not system_message: raise ValueError("The message you want to send to the model is empty.") if system_message: From 75836a478c371aa9bd354689b70a95184caaa1b6 Mon Sep 17 00:00:00 2001 From: Gabriel Luiz Freitas Almeida Date: Thu, 20 Jun 2024 18:09:18 -0300 Subject: [PATCH 06/15] refactor: Remove unused build_base_retriever method from vector store components --- .../base/langflow/components/models/AmazonBedrockModel.py | 2 +- .../base/langflow/components/models/HuggingFaceModel.py | 2 +- src/backend/base/langflow/components/models/VertexAiModel.py | 1 + src/backend/base/langflow/components/vectorstores/AstraDB.py | 4 ---- .../base/langflow/components/vectorstores/Cassandra.py | 3 --- .../base/langflow/components/vectorstores/Couchbase.py | 3 --- .../langflow/components/vectorstores/MongoDBAtlasVector.py | 3 --- .../base/langflow/components/vectorstores/Pinecone.py | 5 +---- src/backend/base/langflow/components/vectorstores/Qdrant.py | 3 --- .../langflow/components/vectorstores/SupabaseVectorStore.py | 3 --- src/backend/base/langflow/components/vectorstores/Upstash.py | 3 --- .../base/langflow/components/vectorstores/Weaviate.py | 3 --- .../base/langflow/components/vectorstores/pgvector.py | 3 --- 13 files changed, 4 insertions(+), 34 deletions(-) diff --git a/src/backend/base/langflow/components/models/AmazonBedrockModel.py b/src/backend/base/langflow/components/models/AmazonBedrockModel.py index 2d5c434cd..ef4f8450b 100644 --- a/src/backend/base/langflow/components/models/AmazonBedrockModel.py +++ b/src/backend/base/langflow/components/models/AmazonBedrockModel.py @@ -78,7 +78,7 @@ class AmazonBedrockComponent(LCModelComponent): cache = self.cache stream = self.stream try: - output = ChatBedrock( + output = ChatBedrock( # type: ignore credentials_profile_name=credentials_profile_name, model_id=model_id, region_name=region_name, diff --git a/src/backend/base/langflow/components/models/HuggingFaceModel.py b/src/backend/base/langflow/components/models/HuggingFaceModel.py index a3ec98799..021f15793 100644 --- a/src/backend/base/langflow/components/models/HuggingFaceModel.py +++ b/src/backend/base/langflow/components/models/HuggingFaceModel.py @@ -43,7 +43,7 @@ class HuggingFaceEndpointsComponent(LCModelComponent): model_kwargs = self.model_kwargs or {} try: - llm = HuggingFaceEndpoint( + llm = HuggingFaceEndpoint( # type: ignore endpoint_url=endpoint_url, task=task, huggingfacehub_api_token=huggingfacehub_api_token, diff --git a/src/backend/base/langflow/components/models/VertexAiModel.py b/src/backend/base/langflow/components/models/VertexAiModel.py index 63438b49f..fb06ac5f2 100644 --- a/src/backend/base/langflow/components/models/VertexAiModel.py +++ b/src/backend/base/langflow/components/models/VertexAiModel.py @@ -1,5 +1,6 @@ from langchain_google_vertexai import ChatVertexAI +from langflow.base.constants import STREAM_INFO_TEXT from langflow.base.models.model import LCModelComponent from langflow.field_typing import LanguageModel from langflow.io import BoolInput, FileInput, FloatInput, IntInput, MessageInput, MultilineInput, Output, StrInput diff --git a/src/backend/base/langflow/components/vectorstores/AstraDB.py b/src/backend/base/langflow/components/vectorstores/AstraDB.py index 8c757cb1d..2be70ac80 100644 --- a/src/backend/base/langflow/components/vectorstores/AstraDB.py +++ b/src/backend/base/langflow/components/vectorstores/AstraDB.py @@ -181,10 +181,6 @@ class AstraVectorStoreComponent(LCVectorStoreComponent): if self.add_to_vector_store: self._add_documents_to_vector_store(vector_store) - return vector_store - - def build_base_retriever(self): - vector_store = self.build_vector_store() self.status = self._astradb_collection_to_data(vector_store.collection) return vector_store diff --git a/src/backend/base/langflow/components/vectorstores/Cassandra.py b/src/backend/base/langflow/components/vectorstores/Cassandra.py index 480519581..04d80bdec 100644 --- a/src/backend/base/langflow/components/vectorstores/Cassandra.py +++ b/src/backend/base/langflow/components/vectorstores/Cassandra.py @@ -99,9 +99,6 @@ class CassandraVectorStoreComponent(Component): def build_vector_store(self) -> Cassandra: return self._build_cassandra() - def build_base_retriever(self) -> Retriever: - return self._build_cassandra() - def _build_cassandra(self) -> Cassandra: try: import cassio diff --git a/src/backend/base/langflow/components/vectorstores/Couchbase.py b/src/backend/base/langflow/components/vectorstores/Couchbase.py index 20332d79d..aa264d424 100644 --- a/src/backend/base/langflow/components/vectorstores/Couchbase.py +++ b/src/backend/base/langflow/components/vectorstores/Couchbase.py @@ -66,9 +66,6 @@ class CouchbaseVectorStoreComponent(Component): def build_vector_store(self) -> CouchbaseVectorStore: return self._build_couchbase() - def build_base_retriever(self) -> Retriever: - return self._build_couchbase() - def _build_couchbase(self) -> CouchbaseVectorStore: try: from couchbase.auth import PasswordAuthenticator # type: ignore diff --git a/src/backend/base/langflow/components/vectorstores/MongoDBAtlasVector.py b/src/backend/base/langflow/components/vectorstores/MongoDBAtlasVector.py index 0124805ef..a679f2303 100644 --- a/src/backend/base/langflow/components/vectorstores/MongoDBAtlasVector.py +++ b/src/backend/base/langflow/components/vectorstores/MongoDBAtlasVector.py @@ -63,9 +63,6 @@ class MongoVectorStoreComponent(Component): def build_vector_store(self) -> MongoDBAtlasVectorSearch: return self._build_mongodb_atlas() - def build_base_retriever(self) -> Retriever: - return self._build_mongodb_atlas() - def _build_mongodb_atlas(self) -> MongoDBAtlasVectorSearch: try: from pymongo import MongoClient diff --git a/src/backend/base/langflow/components/vectorstores/Pinecone.py b/src/backend/base/langflow/components/vectorstores/Pinecone.py index 91c87d258..a98ad73fc 100644 --- a/src/backend/base/langflow/components/vectorstores/Pinecone.py +++ b/src/backend/base/langflow/components/vectorstores/Pinecone.py @@ -67,10 +67,7 @@ class PineconeVectorStoreComponent(Component): Output(display_name="Search Results", name="search_results", method="search_documents"), ] - def build_vector_store(self) -> Pinecone: - return self._build_pinecone() - - def build_base_retriever(self) -> Retriever: + def build_vector_store(self) -> Retriever: return self._build_pinecone() def _build_pinecone(self) -> Pinecone: diff --git a/src/backend/base/langflow/components/vectorstores/Qdrant.py b/src/backend/base/langflow/components/vectorstores/Qdrant.py index 1515b4c4b..d90d44f68 100644 --- a/src/backend/base/langflow/components/vectorstores/Qdrant.py +++ b/src/backend/base/langflow/components/vectorstores/Qdrant.py @@ -71,9 +71,6 @@ class QdrantVectorStoreComponent(Component): def build_vector_store(self) -> Qdrant: return self._build_qdrant() - def build_base_retriever(self) -> Retriever: - return self._build_qdrant() - def _build_qdrant(self) -> Qdrant: qdrant_kwargs = { "collection_name": self.collection_name, diff --git a/src/backend/base/langflow/components/vectorstores/SupabaseVectorStore.py b/src/backend/base/langflow/components/vectorstores/SupabaseVectorStore.py index 6bd17e9fe..151ebee86 100644 --- a/src/backend/base/langflow/components/vectorstores/SupabaseVectorStore.py +++ b/src/backend/base/langflow/components/vectorstores/SupabaseVectorStore.py @@ -58,9 +58,6 @@ class SupabaseVectorStoreComponent(Component): def build_vector_store(self) -> SupabaseVectorStore: return self._build_supabase() - def build_base_retriever(self) -> Retriever: - return self._build_supabase() - def _build_supabase(self) -> SupabaseVectorStore: supabase: Client = create_client(self.supabase_url, supabase_key=self.supabase_service_key) diff --git a/src/backend/base/langflow/components/vectorstores/Upstash.py b/src/backend/base/langflow/components/vectorstores/Upstash.py index a9b5e36fb..6850f7f5c 100644 --- a/src/backend/base/langflow/components/vectorstores/Upstash.py +++ b/src/backend/base/langflow/components/vectorstores/Upstash.py @@ -74,9 +74,6 @@ class UpstashVectorStoreComponent(Component): def build_vector_store(self) -> UpstashVectorStore: return self._build_upstash() - def build_base_retriever(self) -> Retriever: - return self._build_upstash() - def _build_upstash(self) -> UpstashVectorStore: use_upstash_embedding = self.embedding is None diff --git a/src/backend/base/langflow/components/vectorstores/Weaviate.py b/src/backend/base/langflow/components/vectorstores/Weaviate.py index 3d853ad2c..3ebb0e236 100644 --- a/src/backend/base/langflow/components/vectorstores/Weaviate.py +++ b/src/backend/base/langflow/components/vectorstores/Weaviate.py @@ -59,9 +59,6 @@ class WeaviateVectorStoreComponent(Component): def build_vector_store(self) -> Weaviate: return self._build_weaviate() - def build_base_retriever(self) -> Retriever: - return self._build_weaviate() - def _build_weaviate(self) -> Weaviate: if self.api_key: auth_config = weaviate.AuthApiKey(api_key=self.api_key) diff --git a/src/backend/base/langflow/components/vectorstores/pgvector.py b/src/backend/base/langflow/components/vectorstores/pgvector.py index 59b8707e6..1e6006413 100644 --- a/src/backend/base/langflow/components/vectorstores/pgvector.py +++ b/src/backend/base/langflow/components/vectorstores/pgvector.py @@ -56,9 +56,6 @@ class PGVectorStoreComponent(Component): def build_vector_store(self) -> PGVector: return self._build_pgvector() - def build_base_retriever(self) -> Retriever: - return self._build_pgvector() - def _build_pgvector(self) -> PGVector: if self.add_to_vector_store: documents = [] From de0657acf31710c3de8be30994d72afd70edf399 Mon Sep 17 00:00:00 2001 From: Gabriel Luiz Freitas Almeida Date: Thu, 20 Jun 2024 18:09:32 -0300 Subject: [PATCH 07/15] refactor: Update langchain-mongodb package to version 0.1.6 --- poetry.lock | 18 +++++++++++++++++- pyproject.toml | 1 + 2 files changed, 18 insertions(+), 1 deletion(-) diff --git a/poetry.lock b/poetry.lock index 67b2adf27..8a2ce60c2 100644 --- a/poetry.lock +++ b/poetry.lock @@ -4353,6 +4353,22 @@ httpx-sse = ">=0.3.1,<1" langchain-core = ">=0.2.0,<0.3" tokenizers = ">=0.15.1,<1" +[[package]] +name = "langchain-mongodb" +version = "0.1.6" +description = "An integration package connecting MongoDB and LangChain" +optional = false +python-versions = "<4.0,>=3.8.1" +files = [ + {file = "langchain_mongodb-0.1.6-py3-none-any.whl", hash = "sha256:ba5e1e388131ae00e8fcd39c4b38ce42c29f00c4bc39c58023b354b597ffa8df"}, + {file = "langchain_mongodb-0.1.6.tar.gz", hash = "sha256:a7a6b66d5270d6f8732c4e848f9a3742bbd4485c8829a2d629332ee683b936d1"}, +] + +[package.dependencies] +langchain-core = ">=0.1.46,<0.3" +numpy = ">=1,<2" +pymongo = ">=4.6.1,<5.0" + [[package]] name = "langchain-openai" version = "0.1.8" @@ -10610,4 +10626,4 @@ local = ["ctransformers", "llama-cpp-python", "sentence-transformers"] [metadata] lock-version = "2.0" python-versions = ">=3.10,<3.13" -content-hash = "65701c22864b203bdeb0fbdd0e51d0b58855e77aa65e49df3dad2c9ebb04c976" +content-hash = "332baeb07342a5ad1367ce6b13a87bd96504f628d2e91e33dfda1a8317b2de13" diff --git a/pyproject.toml b/pyproject.toml index 16af85a59..704ec2038 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -90,6 +90,7 @@ gitpython = "^3.1.43" cassio = { extras = ["cassio"], version = "^0.1.7", optional = true } unstructured = {extras = ["docx", "md", "pptx"], version = "^0.14.4"} langchain-aws = "^0.1.6" +langchain-mongodb = "^0.1.6" [tool.poetry.group.dev.dependencies] From ac627e831f4081d3e3334bad482a45999032db0e Mon Sep 17 00:00:00 2001 From: Gabriel Luiz Freitas Almeida Date: Thu, 20 Jun 2024 18:18:04 -0300 Subject: [PATCH 08/15] refactor: Update OpenAIModelComponent to include seed in model_kwargs --- .../base/langflow/components/models/OpenAIModel.py | 9 +++++---- 1 file changed, 5 insertions(+), 4 deletions(-) diff --git a/src/backend/base/langflow/components/models/OpenAIModel.py b/src/backend/base/langflow/components/models/OpenAIModel.py index db8e8f60d..6545cf3dc 100644 --- a/src/backend/base/langflow/components/models/OpenAIModel.py +++ b/src/backend/base/langflow/components/models/OpenAIModel.py @@ -82,25 +82,26 @@ class OpenAIModelComponent(LCModelComponent): temperature = self.temperature model_name: str = self.model_name max_tokens = self.max_tokens - model_kwargs = self.model_kwargs + model_kwargs = self.model_kwargs or {} openai_api_base = self.openai_api_base or "https://api.openai.com/v1" json_mode = bool(output_schema_dict) seed = self.seed + model_kwargs["seed"] = seed + if openai_api_key: api_key = SecretStr(openai_api_key) else: api_key = None output = ChatOpenAI( max_tokens=max_tokens or None, - model_kwargs=model_kwargs or {}, + model_kwargs=model_kwargs, model=model_name, base_url=openai_api_base, api_key=api_key, temperature=temperature or 0.1, - seed=seed, ) if json_mode: - output = output.with_structured_output(schema=output_schema_dict, method="json_mode") + output = output.with_structured_output(schema=output_schema_dict, method="json_mode") # type: ignore return output From 6b3a8b69bc5a6883ff837c8f1e536f968db0991b Mon Sep 17 00:00:00 2001 From: Gabriel Luiz Freitas Almeida Date: Thu, 20 Jun 2024 18:18:09 -0300 Subject: [PATCH 09/15] refactor: Update AnthropicModelComponent to handle ImportError gracefully --- src/backend/base/langflow/components/models/AnthropicModel.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/backend/base/langflow/components/models/AnthropicModel.py b/src/backend/base/langflow/components/models/AnthropicModel.py index 9b4b4dca3..dd7ccb4f5 100644 --- a/src/backend/base/langflow/components/models/AnthropicModel.py +++ b/src/backend/base/langflow/components/models/AnthropicModel.py @@ -98,9 +98,9 @@ class AnthropicModelComponent(LCModelComponent): try: from anthropic import BadRequestError except ImportError: - return + return None if isinstance(exception, BadRequestError): message = exception.body.get("error", {}).get("message") # type: ignore if message: return message - return + return None From 954c703cd80492ddf6aa0359e2908d07d95afedb Mon Sep 17 00:00:00 2001 From: italojohnny Date: Thu, 20 Jun 2024 18:20:16 -0300 Subject: [PATCH 10/15] fix arg-type error reported by mypy --- src/backend/base/langflow/base/models/model.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/backend/base/langflow/base/models/model.py b/src/backend/base/langflow/base/models/model.py index 1e4152b28..d767d637c 100644 --- a/src/backend/base/langflow/base/models/model.py +++ b/src/backend/base/langflow/base/models/model.py @@ -136,7 +136,7 @@ class LCModelComponent(Component): messages.append(input_value.to_lc_message()) else: messages.append(HumanMessage(content=input_value)) - inputs = messages or {} + inputs: Union[list, dict] = messages or {} try: if stream: return runnable.stream(inputs) From c811e5f0454c5b59d873edddce88315fab88b322 Mon Sep 17 00:00:00 2001 From: Gabriel Luiz Freitas Almeida Date: Thu, 20 Jun 2024 18:21:47 -0300 Subject: [PATCH 11/15] apply ruff --- .../embeddings/AmazonBedrockEmbeddings.py | 4 +- .../embeddings/AzureOpenAIEmbeddings.py | 1 - .../components/embeddings/CohereEmbeddings.py | 2 +- .../embeddings/HuggingFaceEmbeddings.py | 2 - .../HuggingFaceInferenceAPIEmbeddings.py | 4 +- .../components/embeddings/OllamaEmbeddings.py | 2 - .../embeddings/VertexAIEmbeddings.py | 2 - .../model_specs/ChatAnthropicSpecs.py | 86 ------------------- .../components/models/AmazonBedrockModel.py | 2 +- .../components/models/AzureOpenAIModel.py | 2 +- .../models/GoogleGenerativeAIModel.py | 2 +- .../RecursiveCharacterTextSplitter.py | 6 +- .../components/vectorstores/Cassandra.py | 1 - .../components/vectorstores/Chroma.py | 2 +- .../components/vectorstores/Couchbase.py | 1 - .../vectorstores/MongoDBAtlasVector.py | 2 - .../components/vectorstores/Qdrant.py | 1 - .../vectorstores/SupabaseVectorStore.py | 1 - .../components/vectorstores/Upstash.py | 1 - .../components/vectorstores/Weaviate.py | 1 - .../components/vectorstores/pgvector.py | 2 - src/backend/base/langflow/graph/graph/base.py | 1 - .../base/langflow/template/template/base.py | 1 - 23 files changed, 10 insertions(+), 119 deletions(-) delete mode 100644 src/backend/base/langflow/components/model_specs/ChatAnthropicSpecs.py diff --git a/src/backend/base/langflow/components/embeddings/AmazonBedrockEmbeddings.py b/src/backend/base/langflow/components/embeddings/AmazonBedrockEmbeddings.py index ab0ae3fff..2c1c8bd48 100644 --- a/src/backend/base/langflow/components/embeddings/AmazonBedrockEmbeddings.py +++ b/src/backend/base/langflow/components/embeddings/AmazonBedrockEmbeddings.py @@ -1,9 +1,7 @@ -from typing import Optional - from langchain_community.embeddings import BedrockEmbeddings from langflow.base.models.model import LCModelComponent from langflow.field_typing import Embeddings -from langflow.io import DropdownInput, Output, SecretStrInput, TextInput +from langflow.io import DropdownInput, Output, TextInput class AmazonBedrockEmbeddingsComponent(LCModelComponent): diff --git a/src/backend/base/langflow/components/embeddings/AzureOpenAIEmbeddings.py b/src/backend/base/langflow/components/embeddings/AzureOpenAIEmbeddings.py index a31ffaac4..927520c75 100644 --- a/src/backend/base/langflow/components/embeddings/AzureOpenAIEmbeddings.py +++ b/src/backend/base/langflow/components/embeddings/AzureOpenAIEmbeddings.py @@ -1,4 +1,3 @@ -from typing import Optional from langchain_openai import AzureOpenAIEmbeddings from pydantic.v1 import SecretStr diff --git a/src/backend/base/langflow/components/embeddings/CohereEmbeddings.py b/src/backend/base/langflow/components/embeddings/CohereEmbeddings.py index f5cb7a3b4..7f4f6a513 100644 --- a/src/backend/base/langflow/components/embeddings/CohereEmbeddings.py +++ b/src/backend/base/langflow/components/embeddings/CohereEmbeddings.py @@ -2,7 +2,7 @@ from langchain_community.embeddings.cohere import CohereEmbeddings from langflow.base.models.model import LCModelComponent from langflow.field_typing import Embeddings -from langflow.io import BoolInput, DictInput, DropdownInput, FloatInput, IntInput, Output, SecretStrInput, TextInput +from langflow.io import DropdownInput, FloatInput, IntInput, Output, SecretStrInput, TextInput class CohereEmbeddingsComponent(LCModelComponent): diff --git a/src/backend/base/langflow/components/embeddings/HuggingFaceEmbeddings.py b/src/backend/base/langflow/components/embeddings/HuggingFaceEmbeddings.py index aa54b9047..86a6d909c 100644 --- a/src/backend/base/langflow/components/embeddings/HuggingFaceEmbeddings.py +++ b/src/backend/base/langflow/components/embeddings/HuggingFaceEmbeddings.py @@ -1,5 +1,3 @@ -from typing import Dict, Optional - from langchain_community.embeddings.huggingface import HuggingFaceEmbeddings from langflow.base.models.model import LCModelComponent diff --git a/src/backend/base/langflow/components/embeddings/HuggingFaceInferenceAPIEmbeddings.py b/src/backend/base/langflow/components/embeddings/HuggingFaceInferenceAPIEmbeddings.py index 648f178ed..6fef75ef1 100644 --- a/src/backend/base/langflow/components/embeddings/HuggingFaceInferenceAPIEmbeddings.py +++ b/src/backend/base/langflow/components/embeddings/HuggingFaceInferenceAPIEmbeddings.py @@ -1,11 +1,9 @@ -from typing import Dict, Optional - from langchain_community.embeddings.huggingface import HuggingFaceInferenceAPIEmbeddings from pydantic.v1.types import SecretStr from langflow.base.models.model import LCModelComponent from langflow.field_typing import Embeddings -from langflow.io import BoolInput, DictInput, FloatInput, Output, SecretStrInput, TextInput +from langflow.io import BoolInput, DictInput, Output, SecretStrInput, TextInput class HuggingFaceInferenceAPIEmbeddingsComponent(LCModelComponent): diff --git a/src/backend/base/langflow/components/embeddings/OllamaEmbeddings.py b/src/backend/base/langflow/components/embeddings/OllamaEmbeddings.py index 7764c2d02..a9f832dee 100644 --- a/src/backend/base/langflow/components/embeddings/OllamaEmbeddings.py +++ b/src/backend/base/langflow/components/embeddings/OllamaEmbeddings.py @@ -1,5 +1,3 @@ -from typing import Optional - from langchain_community.embeddings import OllamaEmbeddings from langflow.base.models.model import LCModelComponent from langflow.field_typing import Embeddings diff --git a/src/backend/base/langflow/components/embeddings/VertexAIEmbeddings.py b/src/backend/base/langflow/components/embeddings/VertexAIEmbeddings.py index 30f1eda02..28b1f1c7c 100644 --- a/src/backend/base/langflow/components/embeddings/VertexAIEmbeddings.py +++ b/src/backend/base/langflow/components/embeddings/VertexAIEmbeddings.py @@ -1,5 +1,3 @@ -from typing import List, Optional - from langflow.base.models.model import LCModelComponent from langflow.field_typing import Embeddings from langflow.io import BoolInput, DictInput, FileInput, FloatInput, IntInput, Output, TextInput diff --git a/src/backend/base/langflow/components/model_specs/ChatAnthropicSpecs.py b/src/backend/base/langflow/components/model_specs/ChatAnthropicSpecs.py deleted file mode 100644 index 6f8583a9d..000000000 --- a/src/backend/base/langflow/components/model_specs/ChatAnthropicSpecs.py +++ /dev/null @@ -1,86 +0,0 @@ -from typing import Optional - -from langchain_anthropic import ChatAnthropic -from pydantic.v1.types import SecretStr - -from langflow.field_typing import LanguageModel - - -class AnthropicLLM(CustomComponent): - display_name: str = "Anthropic" - description: str = "Generate text using Anthropic Chat&Completion LLMs." - icon = "Anthropic" - - field_order = [ - "model", - "anthropic_api_key", - "max_tokens", - "temperature", - "anthropic_api_url", - ] - - def build_config(self): - return { - "model": { - "display_name": "Model Name", - "options": [ - "claude-3-opus-20240229", - "claude-3-sonnet-20240229", - "claude-3-haiku-20240307", - "claude-2.1", - "claude-2.0", - "claude-instant-1.2", - "claude-instant-1", - ], - "info": "Name of the model to use.", - "required": True, - "value": "claude-3-opus-20240229", - }, - "anthropic_api_key": { - "display_name": "Anthropic API Key", - "required": True, - "password": True, - "info": "Your Anthropic API key.", - }, - "max_tokens": { - "display_name": "Max Tokens", - "advanced": True, - "info": "The maximum number of tokens to generate. Set to 0 for unlimited tokens.", - }, - "temperature": { - "display_name": "Temperature", - "field_type": "float", - "value": 0.1, - }, - "anthropic_api_url": { - "display_name": "Anthropic API URL", - "advanced": True, - "info": "Endpoint of the Anthropic API. Defaults to 'https://api.anthropic.com' if not specified.", - }, - "code": {"show": False}, - } - - def build( - self, - model: str, - anthropic_api_key: Optional[str] = None, - max_tokens: Optional[int] = 1000, - temperature: Optional[float] = None, - anthropic_api_url: Optional[str] = None, - ) -> LanguageModel: - # Set default API endpoint if not provided - if not anthropic_api_url: - anthropic_api_url = "https://api.anthropic.com" - - try: - output = ChatAnthropic( - model_name=model, - anthropic_api_key=(SecretStr(anthropic_api_key) if anthropic_api_key else None), - max_tokens_to_sample=max_tokens, # type: ignore - temperature=temperature, - anthropic_api_url=anthropic_api_url, - ) - except Exception as e: - raise ValueError("Could not connect to Anthropic API.") from e - - return output diff --git a/src/backend/base/langflow/components/models/AmazonBedrockModel.py b/src/backend/base/langflow/components/models/AmazonBedrockModel.py index ef4f8450b..ba06c6723 100644 --- a/src/backend/base/langflow/components/models/AmazonBedrockModel.py +++ b/src/backend/base/langflow/components/models/AmazonBedrockModel.py @@ -2,7 +2,7 @@ from langchain_aws import ChatBedrock from langflow.base.constants import STREAM_INFO_TEXT from langflow.base.models.model import LCModelComponent -from langflow.field_typing import LanguageModel, Text +from langflow.field_typing import LanguageModel from langflow.io import BoolInput, DictInput, DropdownInput, MessageInput, Output, StrInput diff --git a/src/backend/base/langflow/components/models/AzureOpenAIModel.py b/src/backend/base/langflow/components/models/AzureOpenAIModel.py index 65b5e23fd..9a2ebbbe0 100644 --- a/src/backend/base/langflow/components/models/AzureOpenAIModel.py +++ b/src/backend/base/langflow/components/models/AzureOpenAIModel.py @@ -3,7 +3,7 @@ from pydantic.v1 import SecretStr from langflow.base.constants import STREAM_INFO_TEXT from langflow.base.models.model import LCModelComponent -from langflow.field_typing import LanguageModel, Text +from langflow.field_typing import LanguageModel from langflow.io import BoolInput, DropdownInput, FloatInput, IntInput, MessageInput, Output, SecretStrInput, StrInput diff --git a/src/backend/base/langflow/components/models/GoogleGenerativeAIModel.py b/src/backend/base/langflow/components/models/GoogleGenerativeAIModel.py index 33684e8da..377e307a9 100644 --- a/src/backend/base/langflow/components/models/GoogleGenerativeAIModel.py +++ b/src/backend/base/langflow/components/models/GoogleGenerativeAIModel.py @@ -2,7 +2,7 @@ from pydantic.v1 import SecretStr from langflow.base.constants import STREAM_INFO_TEXT from langflow.base.models.model import LCModelComponent -from langflow.field_typing import LanguageModel, Text +from langflow.field_typing import LanguageModel from langflow.io import BoolInput, DropdownInput, FloatInput, IntInput, MessageInput, Output, SecretStrInput, StrInput diff --git a/src/backend/base/langflow/components/textsplitters/RecursiveCharacterTextSplitter.py b/src/backend/base/langflow/components/textsplitters/RecursiveCharacterTextSplitter.py index fc5057409..138a491aa 100644 --- a/src/backend/base/langflow/components/textsplitters/RecursiveCharacterTextSplitter.py +++ b/src/backend/base/langflow/components/textsplitters/RecursiveCharacterTextSplitter.py @@ -47,7 +47,7 @@ class RecursiveCharacterTextSplitterComponent(Component): Split text into chunks of a specified length. Args: - separators (list[str]): The characters to split on. + separators (list[str] | None): The characters to split on. chunk_size (int): The maximum length of each chunk. chunk_overlap (int): The amount of overlap between chunks. @@ -63,9 +63,9 @@ class RecursiveCharacterTextSplitterComponent(Component): self.separators = [unescape_string(x) for x in self.separators] # Make sure chunk_size and chunk_overlap are ints - if isinstance(self.chunk_size, str): + if self.chunk_size: self.chunk_size = int(self.chunk_size) - if isinstance(self.chunk_overlap, str): + if self.chunk_overlap: self.chunk_overlap = int(self.chunk_overlap) splitter = RecursiveCharacterTextSplitter( separators=self.separators, diff --git a/src/backend/base/langflow/components/vectorstores/Cassandra.py b/src/backend/base/langflow/components/vectorstores/Cassandra.py index 04d80bdec..4446feabe 100644 --- a/src/backend/base/langflow/components/vectorstores/Cassandra.py +++ b/src/backend/base/langflow/components/vectorstores/Cassandra.py @@ -7,7 +7,6 @@ from langflow.custom import Component from langflow.helpers.data import docs_to_data from langflow.io import BoolInput, DropdownInput, HandleInput, IntInput, Output, SecretStrInput, StrInput from langflow.schema import Data -from langflow.field_typing import Retriever class CassandraVectorStoreComponent(Component): diff --git a/src/backend/base/langflow/components/vectorstores/Chroma.py b/src/backend/base/langflow/components/vectorstores/Chroma.py index 3b3a8abd5..a8b25a5c0 100644 --- a/src/backend/base/langflow/components/vectorstores/Chroma.py +++ b/src/backend/base/langflow/components/vectorstores/Chroma.py @@ -1,5 +1,5 @@ from copy import deepcopy -from typing import TYPE_CHECKING, List +from typing import TYPE_CHECKING from chromadb.config import Settings from langchain_chroma.vectorstores import Chroma diff --git a/src/backend/base/langflow/components/vectorstores/Couchbase.py b/src/backend/base/langflow/components/vectorstores/Couchbase.py index aa264d424..deac2b478 100644 --- a/src/backend/base/langflow/components/vectorstores/Couchbase.py +++ b/src/backend/base/langflow/components/vectorstores/Couchbase.py @@ -8,7 +8,6 @@ from langflow.custom import Component from langflow.helpers.data import docs_to_data from langflow.io import BoolInput, HandleInput, IntInput, Output, SecretStrInput, StrInput from langflow.schema import Data -from langflow.field_typing import Retriever class CouchbaseVectorStoreComponent(Component): diff --git a/src/backend/base/langflow/components/vectorstores/MongoDBAtlasVector.py b/src/backend/base/langflow/components/vectorstores/MongoDBAtlasVector.py index a679f2303..68ced0269 100644 --- a/src/backend/base/langflow/components/vectorstores/MongoDBAtlasVector.py +++ b/src/backend/base/langflow/components/vectorstores/MongoDBAtlasVector.py @@ -8,8 +8,6 @@ from langflow.helpers.data import docs_to_data from langflow.io import BoolInput, HandleInput, IntInput, Output, StrInput from langflow.schema import Data -from langflow.field_typing import Retriever - class MongoVectorStoreComponent(Component): display_name = "MongoDB Atlas" diff --git a/src/backend/base/langflow/components/vectorstores/Qdrant.py b/src/backend/base/langflow/components/vectorstores/Qdrant.py index d90d44f68..f1c25aa57 100644 --- a/src/backend/base/langflow/components/vectorstores/Qdrant.py +++ b/src/backend/base/langflow/components/vectorstores/Qdrant.py @@ -4,7 +4,6 @@ from langchain_community.vectorstores import Qdrant from langchain_core.retrievers import BaseRetriever from langflow.custom import Component -from langflow.field_typing import Retriever from langflow.helpers.data import docs_to_data from langflow.io import BoolInput, DropdownInput, HandleInput, IntInput, Output, SecretStrInput, StrInput from langflow.schema import Data diff --git a/src/backend/base/langflow/components/vectorstores/SupabaseVectorStore.py b/src/backend/base/langflow/components/vectorstores/SupabaseVectorStore.py index 151ebee86..f3b8ef273 100644 --- a/src/backend/base/langflow/components/vectorstores/SupabaseVectorStore.py +++ b/src/backend/base/langflow/components/vectorstores/SupabaseVectorStore.py @@ -5,7 +5,6 @@ from langchain_core.retrievers import BaseRetriever from supabase.client import Client, create_client from langflow.custom import Component -from langflow.field_typing import Retriever from langflow.helpers.data import docs_to_data from langflow.io import HandleInput, IntInput, Output, StrInput from langflow.schema import Data diff --git a/src/backend/base/langflow/components/vectorstores/Upstash.py b/src/backend/base/langflow/components/vectorstores/Upstash.py index 6850f7f5c..3793254a6 100644 --- a/src/backend/base/langflow/components/vectorstores/Upstash.py +++ b/src/backend/base/langflow/components/vectorstores/Upstash.py @@ -4,7 +4,6 @@ from langchain_community.vectorstores import UpstashVectorStore from langchain_core.retrievers import BaseRetriever from langflow.custom import Component -from langflow.field_typing import Retriever from langflow.helpers.data import docs_to_data from langflow.io import BoolInput, HandleInput, IntInput, Output, StrInput from langflow.schema import Data diff --git a/src/backend/base/langflow/components/vectorstores/Weaviate.py b/src/backend/base/langflow/components/vectorstores/Weaviate.py index 3ebb0e236..a1a988875 100644 --- a/src/backend/base/langflow/components/vectorstores/Weaviate.py +++ b/src/backend/base/langflow/components/vectorstores/Weaviate.py @@ -5,7 +5,6 @@ from langchain_community.vectorstores import Weaviate from langchain_core.retrievers import BaseRetriever from langflow.custom import Component -from langflow.field_typing import Retriever from langflow.helpers.data import docs_to_data from langflow.io import BoolInput, HandleInput, IntInput, Output, SecretStrInput, StrInput from langflow.schema import Data diff --git a/src/backend/base/langflow/components/vectorstores/pgvector.py b/src/backend/base/langflow/components/vectorstores/pgvector.py index 1e6006413..48f8ac13c 100644 --- a/src/backend/base/langflow/components/vectorstores/pgvector.py +++ b/src/backend/base/langflow/components/vectorstores/pgvector.py @@ -8,8 +8,6 @@ from langflow.helpers.data import docs_to_data from langflow.io import BoolInput, HandleInput, IntInput, Output, StrInput from langflow.schema import Data -from langflow.field_typing import Retriever - class PGVectorStoreComponent(Component): display_name = "PGVector" diff --git a/src/backend/base/langflow/graph/graph/base.py b/src/backend/base/langflow/graph/graph/base.py index 038791a2f..be71519f0 100644 --- a/src/backend/base/langflow/graph/graph/base.py +++ b/src/backend/base/langflow/graph/graph/base.py @@ -6,7 +6,6 @@ from itertools import chain from typing import TYPE_CHECKING, Dict, Generator, List, Optional, Tuple, Type, Union from loguru import logger -from langflow.exceptions.component import ComponentBuildException from langflow.exceptions.component import ComponentBuildException from langflow.graph.edge.base import ContractEdge from langflow.graph.graph.constants import lazy_load_vertex_dict diff --git a/src/backend/base/langflow/template/template/base.py b/src/backend/base/langflow/template/template/base.py index bbedd14b2..7c0c7fa0f 100644 --- a/src/backend/base/langflow/template/template/base.py +++ b/src/backend/base/langflow/template/template/base.py @@ -11,7 +11,6 @@ class Template(BaseModel): type_name: str = Field(serialization_alias="_type") fields: list[Union[Input, InputTypes]] - def process_fields( self, format_field_func: Union[Callable, None] = None, From 96f77878c11dd7fb1e42c86cbd7d7280716dde2f Mon Sep 17 00:00:00 2001 From: Gabriel Luiz Freitas Almeida Date: Thu, 20 Jun 2024 18:23:31 -0300 Subject: [PATCH 12/15] refactor: Update CohereEmbeddingsComponent to use type hinting for CohereEmbeddings return value --- .../base/langflow/components/embeddings/CohereEmbeddings.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/backend/base/langflow/components/embeddings/CohereEmbeddings.py b/src/backend/base/langflow/components/embeddings/CohereEmbeddings.py index 7f4f6a513..7c4062c99 100644 --- a/src/backend/base/langflow/components/embeddings/CohereEmbeddings.py +++ b/src/backend/base/langflow/components/embeddings/CohereEmbeddings.py @@ -34,7 +34,7 @@ class CohereEmbeddingsComponent(LCModelComponent): ] def build_embeddings(self) -> Embeddings: - return CohereEmbeddings( + return CohereEmbeddings( # type: ignore cohere_api_key=self.cohere_api_key, model=self.model, truncate=self.truncate, From 1935029f664607bc8c238e454a3f867bd28dd6f6 Mon Sep 17 00:00:00 2001 From: Gabriel Luiz Freitas Almeida Date: Thu, 20 Jun 2024 18:23:36 -0300 Subject: [PATCH 13/15] refactor: Update EmbedComponent build method return type to Data --- src/backend/base/langflow/components/experimental/Embed.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/backend/base/langflow/components/experimental/Embed.py b/src/backend/base/langflow/components/experimental/Embed.py index e99ab0d03..a67c6c4cf 100644 --- a/src/backend/base/langflow/components/experimental/Embed.py +++ b/src/backend/base/langflow/components/experimental/Embed.py @@ -9,7 +9,7 @@ class EmbedComponent(CustomComponent): def build_config(self): return {"texts": {"display_name": "Texts"}, "embbedings": {"display_name": "Embeddings"}} - def build(self, texts: list[str], embbedings: Embeddings) -> Embeddings: + def build(self, texts: list[str], embbedings: Embeddings) -> Data: vectors = Data(vector=embbedings.embed_documents(texts)) self.status = vectors return vectors From a9fc3ea5f7d14fa5b19d0942bc0767e03cf275aa Mon Sep 17 00:00:00 2001 From: Gabriel Luiz Freitas Almeida Date: Thu, 20 Jun 2024 18:23:41 -0300 Subject: [PATCH 14/15] refactor: Update PineconeVectorStoreComponent build_vector_store return type to Pinecone --- src/backend/base/langflow/components/vectorstores/Pinecone.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/backend/base/langflow/components/vectorstores/Pinecone.py b/src/backend/base/langflow/components/vectorstores/Pinecone.py index a98ad73fc..47fdefd06 100644 --- a/src/backend/base/langflow/components/vectorstores/Pinecone.py +++ b/src/backend/base/langflow/components/vectorstores/Pinecone.py @@ -67,7 +67,7 @@ class PineconeVectorStoreComponent(Component): Output(display_name="Search Results", name="search_results", method="search_documents"), ] - def build_vector_store(self) -> Retriever: + def build_vector_store(self) -> Pinecone: return self._build_pinecone() def _build_pinecone(self) -> Pinecone: From 55cdff818ed9f317ed3172f968130362303e6ff5 Mon Sep 17 00:00:00 2001 From: italojohnny Date: Thu, 20 Jun 2024 18:27:10 -0300 Subject: [PATCH 15/15] fix no-redef error reported by mypy --- src/backend/base/langflow/graph/vertex/base.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/backend/base/langflow/graph/vertex/base.py b/src/backend/base/langflow/graph/vertex/base.py index e7e12e86c..37714e77d 100644 --- a/src/backend/base/langflow/graph/vertex/base.py +++ b/src/backend/base/langflow/graph/vertex/base.py @@ -198,8 +198,8 @@ class Vertex: self.description: str = self.data["node"].get("description", "") self.frozen: bool = self.data["node"].get("frozen", False) - self.is_input: bool = self.data["node"].get("is_input") or self.is_input - self.is_output: bool = self.data["node"].get("is_output") or self.is_output + self.is_input = self.data["node"].get("is_input") or self.is_input + self.is_output = self.data["node"].get("is_output") or self.is_output template_dicts = {key: value for key, value in self.data["node"]["template"].items() if isinstance(value, dict)} self.has_session_id = "session_id" in template_dicts