Merge branch 'dev' into feat/slack-directory-loader
This commit is contained in:
commit
8db30348d8
30 changed files with 494 additions and 404 deletions
2
src/backend/langflow/cache/base.py
vendored
2
src/backend/langflow/cache/base.py
vendored
|
|
@ -120,7 +120,7 @@ def save_binary_file(content: str, file_name: str, accepted_types: list[str]) ->
|
|||
|
||||
# Get the destination folder
|
||||
cache_path = Path(tempfile.gettempdir()) / PREFIX
|
||||
if content is None:
|
||||
if not content:
|
||||
raise ValueError("Please, reload the file in the loader.")
|
||||
data = content.split(",")[1]
|
||||
decoded_bytes = base64.b64decode(data)
|
||||
|
|
|
|||
|
|
@ -43,16 +43,19 @@ documentloaders:
|
|||
- GitbookLoader
|
||||
- ReadTheDocsLoader
|
||||
- SlackDirectoryLoader
|
||||
- NotionDirectoryLoader
|
||||
embeddings:
|
||||
- OpenAIEmbeddings
|
||||
- HuggingFaceEmbeddings
|
||||
|
||||
- CohereEmbeddings
|
||||
llms:
|
||||
- OpenAI
|
||||
# - AzureOpenAI
|
||||
- ChatOpenAI
|
||||
- HuggingFaceHub
|
||||
- LlamaCpp
|
||||
- CTransformers
|
||||
- Cohere
|
||||
memories:
|
||||
- ConversationBufferMemory
|
||||
- ConversationSummaryMemory
|
||||
|
|
@ -63,6 +66,9 @@ prompts:
|
|||
- ZeroShotPrompt
|
||||
textsplitters:
|
||||
- CharacterTextSplitter
|
||||
- RecursiveCharacterTextSplitter
|
||||
- LatexTextSplitter
|
||||
- PythonCodeTextSplitter
|
||||
toolkits:
|
||||
- OpenAPIToolkit
|
||||
- JsonToolkit
|
||||
|
|
@ -114,7 +120,7 @@ vectorstores:
|
|||
- Qdrant
|
||||
- Weaviate
|
||||
wrappers:
|
||||
- RequestsWrapper # Wait more tests
|
||||
- RequestsWrapper
|
||||
# - ChatPromptTemplate
|
||||
# - SystemMessagePromptTemplate
|
||||
# - HumanMessagePromptTemplate
|
||||
|
|
|
|||
|
|
@ -53,30 +53,33 @@ class LangChainTypeCreator(BaseModel, ABC):
|
|||
signature = self.get_signature(name)
|
||||
if signature is None:
|
||||
logger.error(f"Node {name} not loaded")
|
||||
return None
|
||||
if isinstance(signature, FrontendNode):
|
||||
return signature
|
||||
fields = [
|
||||
TemplateField(
|
||||
name=key,
|
||||
field_type=value["type"],
|
||||
required=value.get("required", False),
|
||||
placeholder=value.get("placeholder", ""),
|
||||
is_list=value.get("list", False),
|
||||
show=value.get("show", True),
|
||||
multiline=value.get("multiline", False),
|
||||
value=value.get("value", None),
|
||||
suffixes=value.get("suffixes", []),
|
||||
file_types=value.get("fileTypes", []),
|
||||
content=value.get("content", None),
|
||||
if not isinstance(signature, FrontendNode):
|
||||
fields = [
|
||||
TemplateField(
|
||||
name=key,
|
||||
field_type=value["type"],
|
||||
required=value.get("required", False),
|
||||
placeholder=value.get("placeholder", ""),
|
||||
is_list=value.get("list", False),
|
||||
show=value.get("show", True),
|
||||
multiline=value.get("multiline", False),
|
||||
value=value.get("value", None),
|
||||
suffixes=value.get("suffixes", []),
|
||||
file_types=value.get("fileTypes", []),
|
||||
content=value.get("content", None),
|
||||
)
|
||||
for key, value in signature["template"].items()
|
||||
if key != "_type"
|
||||
]
|
||||
template = Template(type_name=name, fields=fields)
|
||||
signature = self.frontend_node_class(
|
||||
template=template,
|
||||
description=signature.get("description", ""),
|
||||
base_classes=signature["base_classes"],
|
||||
name=name,
|
||||
)
|
||||
for key, value in signature["template"].items()
|
||||
if key != "_type"
|
||||
]
|
||||
template = Template(type_name=name, fields=fields)
|
||||
return self.frontend_node_class(
|
||||
template=template,
|
||||
description=signature.get("description", ""),
|
||||
base_classes=signature["base_classes"],
|
||||
name=name,
|
||||
)
|
||||
|
||||
signature.add_extra_fields()
|
||||
|
||||
return signature
|
||||
|
|
|
|||
|
|
@ -121,7 +121,7 @@ class DocumentLoaderCreator(LangChainTypeCreator):
|
|||
"value": "",
|
||||
"display_name": "Web Page",
|
||||
}
|
||||
elif name in {"ReadTheDocsLoader"}:
|
||||
elif name in {"ReadTheDocsLoader", "NotionDirectoryLoader"}:
|
||||
signature["template"]["path"] = {
|
||||
"type": "str",
|
||||
"required": True,
|
||||
|
|
|
|||
|
|
@ -44,7 +44,7 @@ def try_setting_streaming_options(langchain_object, websocket):
|
|||
langchain_object.llm_chain, "llm"
|
||||
):
|
||||
llm = langchain_object.llm_chain.llm
|
||||
if isinstance(llm, BaseLanguageModel):
|
||||
llm.streaming = bool(hasattr(llm, "streaming"))
|
||||
if isinstance(llm, BaseLanguageModel) and hasattr(llm, "streaming"):
|
||||
llm.streaming = True
|
||||
|
||||
return langchain_object
|
||||
|
|
|
|||
|
|
@ -24,6 +24,9 @@ class FrontendNode(BaseModel):
|
|||
}
|
||||
}
|
||||
|
||||
def add_extra_fields(self) -> None:
|
||||
pass
|
||||
|
||||
@staticmethod
|
||||
def format_field(field: TemplateField, name: Optional[str] = None) -> None:
|
||||
"""Formats a given field based on its attributes and value."""
|
||||
|
|
|
|||
|
|
@ -22,6 +22,22 @@ class EmbeddingFrontendNode(FrontendNode):
|
|||
field.display_name = "Jina API URL"
|
||||
field.password = False
|
||||
|
||||
@staticmethod
|
||||
def format_openai_fields(field: TemplateField):
|
||||
if "openai" in field.name:
|
||||
field.show = True
|
||||
field.advanced = True
|
||||
split_name = field.name.split("_")
|
||||
title_name = " ".join([s.capitalize() for s in split_name])
|
||||
field.display_name = title_name.replace("Openai", "OpenAI").replace(
|
||||
"Api", "API"
|
||||
)
|
||||
|
||||
if "api_key" in field.name:
|
||||
field.password = True
|
||||
field.show = True
|
||||
field.advanced = False
|
||||
|
||||
@staticmethod
|
||||
def format_field(field: TemplateField, name: Optional[str] = None) -> None:
|
||||
FrontendNode.format_field(field, name)
|
||||
|
|
@ -30,9 +46,6 @@ class EmbeddingFrontendNode(FrontendNode):
|
|||
if field.name == "headers":
|
||||
field.show = False
|
||||
|
||||
if "openai" in field.name:
|
||||
field.show = True
|
||||
field.advanced = "api_key" not in field.name
|
||||
|
||||
# Format Jina fields
|
||||
EmbeddingFrontendNode.format_jina_fields(field)
|
||||
EmbeddingFrontendNode.format_openai_fields(field)
|
||||
|
|
|
|||
|
|
@ -43,7 +43,7 @@ class LLMFrontendNode(FrontendNode):
|
|||
field.field_type = "code"
|
||||
field.advanced = True
|
||||
field.show = True
|
||||
elif field.name in ["model_name", "temperature"]:
|
||||
elif field.name in ["model_name", "temperature", "model_file", "model_type"]:
|
||||
field.advanced = False
|
||||
field.show = True
|
||||
|
||||
|
|
|
|||
|
|
@ -5,6 +5,21 @@ from langflow.template.frontend_node.base import FrontendNode
|
|||
|
||||
|
||||
class VectorStoreFrontendNode(FrontendNode):
|
||||
def add_extra_fields(self) -> None:
|
||||
if self.template.type_name == "Weaviate":
|
||||
extra_field = TemplateField(
|
||||
name="weaviate_url",
|
||||
field_type="str",
|
||||
required=True,
|
||||
placeholder="http://localhost:8080",
|
||||
show=True,
|
||||
advanced=False,
|
||||
multiline=False,
|
||||
value="http://localhost:8080",
|
||||
)
|
||||
|
||||
self.template.add_field(extra_field)
|
||||
|
||||
@staticmethod
|
||||
def format_field(field: TemplateField, name: Optional[str] = None) -> None:
|
||||
FrontendNode.format_field(field, name)
|
||||
|
|
|
|||
|
|
@ -23,3 +23,6 @@ class Template(BaseModel):
|
|||
result = {field.name: field.to_dict() for field in self.fields}
|
||||
result["_type"] = self.type_name # type: ignore
|
||||
return result
|
||||
|
||||
def add_field(self, field: TemplateField) -> None:
|
||||
self.fields.append(field)
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue