Merge branch 'dev' into feat/slack-directory-loader

This commit is contained in:
Gabriel Luiz Freitas Almeida 2023-05-29 18:36:32 -03:00 committed by GitHub
commit 8db30348d8
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
30 changed files with 494 additions and 404 deletions

View file

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

View file

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

View file

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

View file

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

View file

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

View file

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

View file

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

View file

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

View file

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

View file

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