Merge branch 'two_edges' of https://github.com/langflow-ai/langflow into two_edges

This commit is contained in:
cristhianzl 2024-06-20 18:30:16 -03:00
commit cd49b2e55a
37 changed files with 54 additions and 173 deletions

View file

@ -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:

View file

@ -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:
@ -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)

View file

@ -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):

View file

@ -1,4 +1,3 @@
from typing import Optional
from langchain_openai import AzureOpenAIEmbeddings
from pydantic.v1 import SecretStr

View file

@ -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):
@ -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,

View file

@ -1,5 +1,3 @@
from typing import Dict, Optional
from langchain_community.embeddings.huggingface import HuggingFaceEmbeddings
from langflow.base.models.model import LCModelComponent

View file

@ -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):

View file

@ -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

View file

@ -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

View file

@ -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

View file

@ -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

View file

@ -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
@ -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,

View file

@ -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

View file

@ -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

View file

@ -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

View file

@ -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,

View file

@ -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

View file

@ -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

View file

@ -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,

View file

@ -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

View file

@ -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):
@ -99,9 +98,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

View file

@ -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

View file

@ -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):
@ -66,9 +65,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

View file

@ -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"
@ -63,9 +61,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

View file

@ -70,9 +70,6 @@ class PineconeVectorStoreComponent(Component):
def build_vector_store(self) -> Pinecone:
return self._build_pinecone()
def build_base_retriever(self) -> Retriever:
return self._build_pinecone()
def _build_pinecone(self) -> Pinecone:
from langchain_pinecone._utilities import DistanceStrategy
from langchain_pinecone.vectorstores import Pinecone

View file

@ -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
@ -71,9 +70,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,

View file

@ -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
@ -58,9 +57,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)

View file

@ -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
@ -74,9 +73,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

View file

@ -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
@ -59,9 +58,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)

View file

@ -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"
@ -56,9 +54,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 = []

View file

@ -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

View file

@ -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

View file

@ -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,

View file

@ -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))

View file

@ -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,7 @@ 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 +49,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."""