From f0c507a6604b87b8fb941f1117f55fca3cab1aec Mon Sep 17 00:00:00 2001 From: Gabriel Luiz Freitas Almeida Date: Tue, 20 Jun 2023 16:14:16 -0300 Subject: [PATCH 001/169] =?UTF-8?q?=F0=9F=90=9B=20fix(loading.py):=20inclu?= =?UTF-8?q?de=20"config"=20in=20the=20list=20of=20keys=20to=20check=20for?= =?UTF-8?q?=20*kwargs=20=E2=9C=A8=20feat(constants.py):=20add=20default=20?= =?UTF-8?q?config=20for=20CTransformers=20=F0=9F=9A=80=20feat(llms.py):=20?= =?UTF-8?q?add=20method=20to=20format=20ctransformers=20field=20in=20LLMFr?= =?UTF-8?q?ontendNode=20The=20fix=20in=20loading.py=20ensures=20that=20the?= =?UTF-8?q?=20*kwargs=20are=20converted=20to=20a=20dictionary=20when=20the?= =?UTF-8?q?=20key=20contains=20"config".=20The=20addition=20of=20the=20def?= =?UTF-8?q?ault=20config=20for=20CTransformers=20in=20constants.py=20provi?= =?UTF-8?q?des=20a=20default=20configuration=20for=20the=20CTransformers?= =?UTF-8?q?=20model.=20The=20new=20method=20in=20llms.py=20formats=20the?= =?UTF-8?q?=20ctransformers=20field=20in=20the=20LLMFrontendNode.?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/backend/langflow/interface/loading.py | 10 ++++++++-- .../template/frontend_node/constants.py | 17 +++++++++++++++++ .../langflow/template/frontend_node/llms.py | 10 ++++++++++ 3 files changed, 35 insertions(+), 2 deletions(-) diff --git a/src/backend/langflow/interface/loading.py b/src/backend/langflow/interface/loading.py index a765d3b9b..85ace0b41 100644 --- a/src/backend/langflow/interface/loading.py +++ b/src/backend/langflow/interface/loading.py @@ -53,8 +53,8 @@ def convert_params_to_sets(params): def convert_kwargs(params): # if *kwargs are passed as a string, convert to dict - # first find any key that has kwargs in it - kwargs_keys = [key for key in params.keys() if "kwargs" in key] + # first find any key that has kwargs or config in it + kwargs_keys = [key for key in params.keys() if "kwargs" in key or "config" in key] for key in kwargs_keys: if isinstance(params[key], str): params[key] = json.loads(params[key]) @@ -82,10 +82,16 @@ def instantiate_based_on_type(class_object, base_type, node_type, params): return instantiate_utility(node_type, class_object, params) elif base_type == "chains": return instantiate_chains(node_type, class_object, params) + elif base_type == "llms": + return instantiate_llm(node_type, class_object, params) else: return class_object(**params) +def instantiate_llm(node_type, class_object, params): + return class_object(**params) + + def instantiate_chains(node_type, class_object, params): if "retriever" in params and hasattr(params["retriever"], "as_retriever"): params["retriever"] = params["retriever"].as_retriever() diff --git a/src/backend/langflow/template/frontend_node/constants.py b/src/backend/langflow/template/frontend_node/constants.py index 20b8a0c61..f9894a317 100644 --- a/src/backend/langflow/template/frontend_node/constants.py +++ b/src/backend/langflow/template/frontend_node/constants.py @@ -32,3 +32,20 @@ You are a good listener and you can talk about anything. HUMAN_PROMPT = "{input}" QA_CHAIN_TYPES = ["stuff", "map_reduce", "map_rerank", "refine"] + +CTRANSFORMERS_DEFAULT_CONFIG = { + "top_k": 40, + "top_p": 0.95, + "temperature": 0.8, + "repetition_penalty": 1.1, + "last_n_tokens": 64, + "seed": -1, + "max_new_tokens": 256, + "stop": None, + "stream": False, + "reset": True, + "batch_size": 8, + "threads": -1, + "context_length": -1, + "gpu_layers": 0, +} diff --git a/src/backend/langflow/template/frontend_node/llms.py b/src/backend/langflow/template/frontend_node/llms.py index 272e42c7f..fcd28df6c 100644 --- a/src/backend/langflow/template/frontend_node/llms.py +++ b/src/backend/langflow/template/frontend_node/llms.py @@ -1,7 +1,9 @@ +import json from typing import Optional from langflow.template.field.base import TemplateField from langflow.template.frontend_node.base import FrontendNode +from langflow.template.frontend_node.constants import CTRANSFORMERS_DEFAULT_CONFIG class LLMFrontendNode(FrontendNode): @@ -31,6 +33,13 @@ class LLMFrontendNode(FrontendNode): field.show = True field.advanced = not field.required + @staticmethod + def format_ctransformers_field(field: TemplateField): + if field.name == "config": + field.show = True + field.advanced = True + field.value = json.dumps(CTRANSFORMERS_DEFAULT_CONFIG, indent=2) + @staticmethod def format_field(field: TemplateField, name: Optional[str] = None) -> None: display_names_dict = { @@ -38,6 +47,7 @@ class LLMFrontendNode(FrontendNode): } FrontendNode.format_field(field, name) LLMFrontendNode.format_openai_field(field) + LLMFrontendNode.format_ctransformers_field(field) if name and "azure" in name.lower(): LLMFrontendNode.format_azure_field(field) if name and "llama" in name.lower(): From fc2e6c112eb8a6a5390ced06d6bebcae7585af96 Mon Sep 17 00:00:00 2001 From: Gabriel Luiz Freitas Almeida Date: Fri, 23 Jun 2023 09:28:25 -0300 Subject: [PATCH 002/169] =?UTF-8?q?=F0=9F=90=9B=20fix(chat.py):=20delete?= =?UTF-8?q?=20flow=20from=20cache=20if=20it=20already=20exists=20before=20?= =?UTF-8?q?initializing=20build=20The=20code=20now=20checks=20if=20the=20f?= =?UTF-8?q?low=20already=20exists=20in=20the=20cache=20and=20deletes=20it?= =?UTF-8?q?=20before=20initializing=20the=20build.=20This=20ensures=20that?= =?UTF-8?q?=20the=20cache=20is=20always=20up=20to=20date=20and=20avoids=20?= =?UTF-8?q?any=20inconsistencies=20that=20may=20arise=20from=20having=20ou?= =?UTF-8?q?tdated=20data=20in=20the=20cache.?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/backend/langflow/api/v1/chat.py | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/src/backend/langflow/api/v1/chat.py b/src/backend/langflow/api/v1/chat.py index 262defed6..ae9fb8b30 100644 --- a/src/backend/langflow/api/v1/chat.py +++ b/src/backend/langflow/api/v1/chat.py @@ -39,6 +39,11 @@ async def init_build(graph_data: dict): try: flow_id = graph_data.get("id") + # Delete from cache if already exists + if flow_id in chat_manager.in_memory_cache: + with chat_manager.in_memory_cache._lock: + chat_manager.in_memory_cache.delete(flow_id) + logger.debug(f"Deleted flow {flow_id} from cache") if flow_id is None: raise ValueError("No ID provided") flow_data_store[flow_id] = graph_data From 8ccdeb9dd541a0da24788f4b1728054300c6cdcb Mon Sep 17 00:00:00 2001 From: Gabriel Luiz Freitas Almeida Date: Fri, 23 Jun 2023 09:54:15 -0300 Subject: [PATCH 003/169] =?UTF-8?q?=F0=9F=90=9B=20fix(chat.py):=20fix=20st?= =?UTF-8?q?ream=5Fbuild=20function=20to=20return=20StreamData=20objects=20?= =?UTF-8?q?instead=20of=20strings=20=E2=9C=A8=20feat(chat.py):=20add=20pro?= =?UTF-8?q?gress=20information=20to=20the=20stream=5Fbuild=20function=20Th?= =?UTF-8?q?e=20stream=5Fbuild=20function=20now=20returns=20StreamData=20ob?= =?UTF-8?q?jects=20instead=20of=20strings,=20which=20improves=20the=20read?= =?UTF-8?q?ability=20of=20the=20code.=20The=20function=20also=20now=20incl?= =?UTF-8?q?udes=20progress=20information=20in=20the=20response,=20which=20?= =?UTF-8?q?allows=20the=20client=20to=20track=20the=20progress=20of=20the?= =?UTF-8?q?=20build=20process.?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/backend/langflow/api/v1/chat.py | 65 +++++++++++++++++--------- src/backend/langflow/api/v1/schemas.py | 8 ++++ 2 files changed, 51 insertions(+), 22 deletions(-) diff --git a/src/backend/langflow/api/v1/chat.py b/src/backend/langflow/api/v1/chat.py index ae9fb8b30..a730758d2 100644 --- a/src/backend/langflow/api/v1/chat.py +++ b/src/backend/langflow/api/v1/chat.py @@ -1,4 +1,3 @@ -import json from fastapi import ( APIRouter, HTTPException, @@ -7,7 +6,7 @@ from fastapi import ( status, ) from fastapi.responses import StreamingResponse -from langflow.api.v1.schemas import BuiltResponse, InitResponse +from langflow.api.v1.schemas import BuiltResponse, InitResponse, StreamData from langflow.chat.manager import ChatManager from langflow.graph.graph.base import Graph @@ -39,14 +38,18 @@ async def init_build(graph_data: dict): try: flow_id = graph_data.get("id") + if flow_id is None: + raise ValueError("No ID provided") + # Check if already building + if flow_id in flow_data_store and flow_data_store[flow_id].get("building"): + return InitResponse(flowId=flow_id) + # Delete from cache if already exists if flow_id in chat_manager.in_memory_cache: with chat_manager.in_memory_cache._lock: chat_manager.in_memory_cache.delete(flow_id) logger.debug(f"Deleted flow {flow_id} from cache") - if flow_id is None: - raise ValueError("No ID provided") - flow_data_store[flow_id] = graph_data + flow_data_store[flow_id] = {"graph_data": graph_data, "building": False} return InitResponse(flowId=flow_id) except Exception as exc: @@ -76,26 +79,44 @@ async def stream_build(flow_id: str): """Stream the build process based on stored flow data.""" async def event_stream(flow_id): - final_response = json.dumps({"end_of_stream": True}) + final_response = {"end_of_stream": True} try: if flow_id not in flow_data_store: error_message = "Invalid session ID" - yield f"data: {json.dumps({'error': error_message})}\n\n" + yield str(StreamData(event="error", data={"error": error_message})) + return + + if flow_data_store[flow_id].get("building"): + error_message = "Already building" + yield str(StreamData(event="error", data={"error": error_message})) return graph_data = flow_data_store[flow_id].get("data") if not graph_data: error_message = "No data provided" - yield f"data: {json.dumps({'error': error_message})}\n\n" + yield str(StreamData(event="error", data={"error": error_message})) return logger.debug("Building langchain object") - graph = Graph.from_payload(graph_data) - for node in graph.generator_build(): + try: + # Some error could happen when building the graph + graph = Graph.from_payload(graph_data) + except Exception as exc: + logger.exception(exc) + error_message = str(exc) + yield str(StreamData(event="error", data={"error": error_message})) + return + + number_of_nodes = len(graph.nodes) + for i, vertex in enumerate(graph.generator_build(), 1): try: - node.build() - params = node._built_object_repr() + log_dict = { + "log": f"Building node {vertex.vertex_type}", + } + yield str(StreamData(event="log", data=log_dict)) + vertex.build() + params = vertex._built_object_repr() valid = True logger.debug( f"Building node {params[:50]}{'...' if len(params) > 50 else ''}" @@ -104,21 +125,21 @@ async def stream_build(flow_id: str): params = str(exc) valid = False - response = json.dumps( - { - "valid": valid, - "params": params, - "id": node.id, - } - ) - yield f"data: {response}\n\n" + response = { + "valid": valid, + "params": params, + "id": vertex.id, + "progress": round(i / number_of_nodes, 2), + } + + yield str(StreamData(event="message", data=response)) chat_manager.set_cache(flow_id, graph.build()) except Exception as exc: logger.error("Error while building the flow: %s", exc) - yield f"error: {json.dumps({'error': str(exc)})}\n\n" + yield str(StreamData(event="error", data={"error": str(exc)})) finally: - yield f"data: {final_response}\n\n" + yield str(StreamData(event="message", data=final_response)) try: return StreamingResponse(event_stream(flow_id), media_type="text/event-stream") diff --git a/src/backend/langflow/api/v1/schemas.py b/src/backend/langflow/api/v1/schemas.py index 714f0df7f..263221d75 100644 --- a/src/backend/langflow/api/v1/schemas.py +++ b/src/backend/langflow/api/v1/schemas.py @@ -101,3 +101,11 @@ class InitResponse(BaseModel): class BuiltResponse(BaseModel): built: bool + + +class StreamData(BaseModel): + event: str + data: dict + + def __str__(self) -> str: + return f"event: {self.event}\ndata: {json.dumps(self.data)}\n\n" From 4e01de9e395bff36d2d1ab8834b42ef77a79ee48 Mon Sep 17 00:00:00 2001 From: Cristhian Zanforlin Lousa Date: Fri, 23 Jun 2023 19:18:31 -0300 Subject: [PATCH 004/169] =?UTF-8?q?=F0=9F=90=9B=20fix(inputListComponent):?= =?UTF-8?q?=20set=20inputList=20state=20to=20value=20prop=20on=20value=20p?= =?UTF-8?q?rop=20change=20to=20fix=20inputList=20not=20updating=20on=20pro?= =?UTF-8?q?p=20change=20=F0=9F=94=92=20chore(utils.ts):=20add=20random=20n?= =?UTF-8?q?umber=20to=20getRandomKeyByssmm=20function=20to=20reduce=20the?= =?UTF-8?q?=20chance=20of=20key=20collision?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/frontend/src/components/inputListComponent/index.tsx | 5 +++++ src/frontend/src/utils.ts | 2 +- 2 files changed, 6 insertions(+), 1 deletion(-) diff --git a/src/frontend/src/components/inputListComponent/index.tsx b/src/frontend/src/components/inputListComponent/index.tsx index 951d7a7ed..245ea93f0 100644 --- a/src/frontend/src/components/inputListComponent/index.tsx +++ b/src/frontend/src/components/inputListComponent/index.tsx @@ -19,6 +19,11 @@ export default function InputListComponent({ onChange([""]); } }, [disabled, onChange]); + + useEffect(() => { + setInputList(value); + }, [value]); + return (
Date: Fri, 23 Jun 2023 20:15:44 -0300 Subject: [PATCH 005/169] =?UTF-8?q?=F0=9F=90=9B=20fix(inputListComponent):?= =?UTF-8?q?=20fix=20onChange=20event=20not=20being=20triggered=20when=20in?= =?UTF-8?q?put=20value=20changes=20=E2=9C=A8=20feat(inputListComponent):?= =?UTF-8?q?=20add=20PopUpContext=20to=20be=20able=20to=20close=20pop-ups?= =?UTF-8?q?=20when=20input=20value=20changes?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/frontend/src/components/inputListComponent/index.tsx | 9 +++++++-- 1 file changed, 7 insertions(+), 2 deletions(-) diff --git a/src/frontend/src/components/inputListComponent/index.tsx b/src/frontend/src/components/inputListComponent/index.tsx index 245ea93f0..f50626e15 100644 --- a/src/frontend/src/components/inputListComponent/index.tsx +++ b/src/frontend/src/components/inputListComponent/index.tsx @@ -5,6 +5,7 @@ import { TabsContext } from "../../contexts/tabsContext"; import _ from "lodash"; import { INPUT_STYLE } from "../../constants"; import { X, Plus } from "lucide-react"; +import { PopUpContext } from "../../contexts/popUpContext"; export default function InputListComponent({ value, @@ -13,6 +14,8 @@ export default function InputListComponent({ editNode = false, }: InputListComponentType) { const [inputList, setInputList] = useState(value ?? [""]); + const { closePopUp } = useContext(PopUpContext); + useEffect(() => { if (disabled) { setInputList([""]); @@ -22,8 +25,10 @@ export default function InputListComponent({ useEffect(() => { setInputList(value); - }, [value]); + }, [closePopUp]); + + return (
{ let newInputList = _.cloneDeep(old); newInputList[idx] = e.target.value; + onChange(newInputList); return newInputList; }); - onChange(inputList); }} /> {idx === inputList.length - 1 ? ( From 94cc554834363281f0e83052c6ac1c1a391f0bb5 Mon Sep 17 00:00:00 2001 From: Cristhian Zanforlin Lousa Date: Sat, 24 Jun 2023 11:03:36 -0300 Subject: [PATCH 006/169] =?UTF-8?q?=F0=9F=90=9B=20fix(dropdownComponent):?= =?UTF-8?q?=20add=20missing=20context=20imports=20and=20dependencies=20?= =?UTF-8?q?=F0=9F=90=9B=20fix(floatComponent):=20add=20missing=20context?= =?UTF-8?q?=20imports=20and=20dependencies=20=F0=9F=90=9B=20fix(intCompone?= =?UTF-8?q?nt):=20add=20missing=20context=20imports=20and=20dependencies?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../src/components/dropdownComponent/index.tsx | 12 ++++++++++-- src/frontend/src/components/floatComponent/index.tsx | 5 ++++- src/frontend/src/components/intComponent/index.tsx | 5 ++++- 3 files changed, 18 insertions(+), 4 deletions(-) diff --git a/src/frontend/src/components/dropdownComponent/index.tsx b/src/frontend/src/components/dropdownComponent/index.tsx index 522078629..605a24041 100644 --- a/src/frontend/src/components/dropdownComponent/index.tsx +++ b/src/frontend/src/components/dropdownComponent/index.tsx @@ -1,9 +1,11 @@ import { Listbox, Transition } from "@headlessui/react"; -import { Fragment, useEffect, useState } from "react"; +import { Fragment, useContext, useEffect, useState } from "react"; import { DropDownComponentType } from "../../types/components"; import { classNames } from "../../utils"; import { INPUT_STYLE } from "../../constants"; import { ChevronsUpDown, Check } from "lucide-react"; +import { PopUpContext } from "../../contexts/popUpContext"; +import { TabsContext } from "../../contexts/tabsContext"; export default function Dropdown({ value, @@ -12,12 +14,16 @@ export default function Dropdown({ editNode = false, numberOfOptions = 0, }: DropDownComponentType) { + const { closePopUp } = useContext(PopUpContext); + + let [internalValue, setInternalValue] = useState( value === "" || !value ? "Choose an option" : value ); + useEffect(() => { setInternalValue(value === "" || !value ? "Choose an option" : value); - }, [value]); + }, [closePopUp]); return ( <> @@ -81,7 +87,9 @@ export default function Dropdown({ ) } value={option} + > + {({ selected, active }) => ( <> { setMyValue(value); - }, [value]); + }, [closePopUp]); + return (
{ if (disabled) { @@ -24,7 +26,8 @@ export default function IntComponent({ useEffect(() => { setMyValue(value); - }, [value]); + }, [closePopUp]); + return (
Date: Sat, 24 Jun 2023 16:31:39 -0300 Subject: [PATCH 007/169] Update settings structure --- src/backend/langflow/config.yaml | 358 ++++++++++++++++++++----------- src/backend/langflow/settings.py | 27 ++- 2 files changed, 243 insertions(+), 142 deletions(-) diff --git a/src/backend/langflow/config.yaml b/src/backend/langflow/config.yaml index d8cd4a325..a8f4f6b53 100644 --- a/src/backend/langflow/config.yaml +++ b/src/backend/langflow/config.yaml @@ -1,141 +1,243 @@ ---- agents: - - ZeroShotAgent - - JsonAgent - - CSVAgent - - AgentInitializer - - VectorStoreAgent - - VectorStoreRouterAgent - - SQLAgent + ZeroShotAgent: + documentation: "https://python.langchain.com/docs/modules/agents/how_to/custom_mrkl_agent" + JsonAgent: + documentation: "https://python.langchain.com/docs/modules/agents/toolkits/openapi" + CSVAgent: + documentation: "https://python.langchain.com/docs/modules/agents/toolkits/csv" + AgentInitializer: + documentation: "https://python.langchain.com/docs/modules/agents/agent_types/" + VectorStoreAgent: + documentation: "https://example.com/VectorStoreAgent" + VectorStoreRouterAgent: + documentation: "https://example.com/VectorStoreRouterAgent" + SQLAgent: + documentation: "https://example.com/SQLAgent" chains: - - LLMChain - - LLMMathChain - - LLMCheckerChain - - ConversationChain - - SeriesCharacterChain - - MidJourneyPromptChain - - TimeTravelGuideChain - - SQLDatabaseChain - - RetrievalQA - - RetrievalQAWithSourcesChain - - ConversationalRetrievalChain - - CombineDocsChain + LLMChain: + documentation: "https://python.langchain.com/docs/modules/chains/foundational/llm_chain" + LLMMathChain: + documentation: "https://python.langchain.com/docs/modules/chains/additional/llm_math" + LLMCheckerChain: + documentation: "https://python.langchain.com/docs/modules/chains/additional/llm_checker" + ConversationChain: + documentation: "https://example.com/ConversationChain" + SeriesCharacterChain: + documentation: "https://example.com/SeriesCharacterChain" + MidJourneyPromptChain: + documentation: "https://example.com/MidJourneyPromptChain" + TimeTravelGuideChain: + documentation: "https://example.com/TimeTravelGuideChain" + SQLDatabaseChain: + documentation: "https://example.com/SQLDatabaseChain" + RetrievalQA: + documentation: "https://python.langchain.com/docs/modules/chains/popular/vector_db_qa" + RetrievalQAWithSourcesChain: + documentation: "https://example.com/RetrievalQAWithSourcesChain" + ConversationalRetrievalChain: + documentation: "https://python.langchain.com/docs/modules/chains/popular/chat_vector_db" + CombineDocsChain: + documentation: "https://example.com/CombineDocsChain" documentloaders: - - AirbyteJSONLoader - - CoNLLULoader - - CSVLoader - - UnstructuredEmailLoader - - EverNoteLoader - - FacebookChatLoader - - GutenbergLoader - - BSHTMLLoader - - UnstructuredHTMLLoader - # - UnstructuredImageLoader # Issue with Python 3.11 (https://github.com/Unstructured-IO/unstructured-inference/issues/83) - - UnstructuredMarkdownLoader - - PyPDFLoader - - UnstructuredPowerPointLoader - - SRTLoader - - TelegramChatLoader - - TextLoader - - UnstructuredWordDocumentLoader - - WebBaseLoader - - AZLyricsLoader - - CollegeConfidentialLoader - - HNLoader - - IFixitLoader - - IMSDbLoader - - GitbookLoader - - ReadTheDocsLoader - - SlackDirectoryLoader - - NotionDirectoryLoader - - DirectoryLoader - - GitLoader + AirbyteJSONLoader: + documentation: "https://example.com/AirbyteJSONLoader" + CoNLLULoader: + documentation: "https://example.com/CoNLLULoader" + CSVLoader: + documentation: "https://example.com/CSVLoader" + UnstructuredEmailLoader: + documentation: "https://example.com/UnstructuredEmailLoader" + EverNoteLoader: + documentation: "https://example.com/EverNoteLoader" + FacebookChatLoader: + documentation: "https://example.com/FacebookChatLoader" + GutenbergLoader: + documentation: "https://example.com/GutenbergLoader" + BSHTMLLoader: + documentation: "https://example.com/BSHTMLLoader" + UnstructuredHTMLLoader: + documentation: "https://example.com/UnstructuredHTMLLoader" + UnstructuredMarkdownLoader: + documentation: "https://example.com/UnstructuredMarkdownLoader" + PyPDFLoader: + documentation: "https://example.com/PyPDFLoader" + UnstructuredPowerPointLoader: + documentation: "https://example.com/UnstructuredPowerPointLoader" + SRTLoader: + documentation: "https://example.com/SRTLoader" + TelegramChatLoader: + documentation: "https://example.com/TelegramChatLoader" + TextLoader: + documentation: "https://example.com/TextLoader" + UnstructuredWordDocumentLoader: + documentation: "https://example.com/UnstructuredWordDocumentLoader" + WebBaseLoader: + documentation: "https://example.com/WebBaseLoader" + AZLyricsLoader: + documentation: "https://example.com/AZLyricsLoader" + CollegeConfidentialLoader: + documentation: "https://example.com/CollegeConfidentialLoader" + HNLoader: + documentation: "https://example.com/HNLoader" + IFixitLoader: + documentation: "https://example.com/IFixitLoader" + IMSDbLoader: + documentation: "https://example.com/IMSDbLoader" + GitbookLoader: + documentation: "https://example.com/GitbookLoader" + ReadTheDocsLoader: + documentation: "https://example.com/ReadTheDocsLoader" + SlackDirectoryLoader: + documentation: "https://example.com/SlackDirectoryLoader" + NotionDirectoryLoader: + documentation: "https://example.com/NotionDirectoryLoader" + DirectoryLoader: + documentation: "https://example.com/DirectoryLoader" + GitLoader: + documentation: "https://example.com/GitLoader" embeddings: - - OpenAIEmbeddings - - HuggingFaceEmbeddings - - CohereEmbeddings + OpenAIEmbeddings: + documentation: "https://example.com/OpenAIEmbeddings" + HuggingFaceEmbeddings: + documentation: "https://example.com/HuggingFaceEmbeddings" + CohereEmbeddings: + documentation: "https://example.com/CohereEmbeddings" llms: - - OpenAI - # - AzureOpenAI - # - AzureChatOpenAI - - ChatOpenAI - - LlamaCpp - - CTransformers - - Cohere - - Anthropic - - ChatAnthropic - - HuggingFaceHub + OpenAI: + documentation: "https://example.com/OpenAI" + ChatOpenAI: + documentation: "https://example.com/ChatOpenAI" + LlamaCpp: + documentation: "https://example.com/LlamaCpp" + CTransformers: + documentation: "https://example.com/CTransformers" + Cohere: + documentation: "https://example.com/Cohere" + Anthropic: + documentation: "https://example.com/Anthropic" + ChatAnthropic: + documentation: "https://example.com/ChatAnthropic" + HuggingFaceHub: + documentation: "https://example.com/HuggingFaceHub" memories: - - ConversationBufferMemory - - ConversationSummaryMemory - - ConversationKGMemory + ConversationBufferMemory: + documentation: "https://example.com/ConversationBufferMemory" + ConversationSummaryMemory: + documentation: "https://example.com/ConversationSummaryMemory" + ConversationKGMemory: + documentation: "https://example.com/ConversationKGMemory" prompts: - - PromptTemplate - - FewShotPromptTemplate - - ZeroShotPrompt + PromptTemplate: + documentation: "https://python.langchain.com/docs/modules/model_io/prompts/prompt_templates/" + ZeroShotPrompt: + documentation: "https://python.langchain.com/docs/modules/agents/how_to/custom_mrkl_agent" textsplitters: - - CharacterTextSplitter - - RecursiveCharacterTextSplitter - # - LatexTextSplitter - # - PythonCodeTextSplitter + CharacterTextSplitter: + documentation: "https://python.langchain.com/docs/modules/data_connection/document_transformers/text_splitters/character_text_splitter" + RecursiveCharacterTextSplitter: + documentation: "https://python.langchain.com/docs/modules/data_connection/document_transformers/text_splitters/recursive_text_splitter" toolkits: - - OpenAPIToolkit - - JsonToolkit - - VectorStoreInfo - - VectorStoreRouterToolkit - - VectorStoreToolkit + OpenAPIToolkit: + documentation: "https://example.com/OpenAPIToolkit" + JsonToolkit: + documentation: "https://example.com/JsonToolkit" + VectorStoreInfo: + documentation: "https://example.com/VectorStoreInfo" + VectorStoreRouterToolkit: + documentation: "https://example.com/VectorStoreRouterToolkit" + VectorStoreToolkit: + documentation: "https://example.com/VectorStoreToolkit" tools: - - Search - - PAL-MATH - - Calculator - - Serper Search - - Tool - - PythonFunctionTool - - PythonFunction - - JsonSpec - - News API - - TMDB API - - Podcast API - - QuerySQLDataBaseTool - - InfoSQLDatabaseTool - - ListSQLDatabaseTool - # - QueryCheckerTool - - BingSearchRun - - GoogleSearchRun - - GoogleSearchResults - - GoogleSerperRun - - JsonListKeysTool - - JsonGetValueTool - - PythonREPLTool - - PythonAstREPLTool - - RequestsGetTool - - RequestsPostTool - - RequestsPatchTool - - RequestsPutTool - - RequestsDeleteTool - - WikipediaQueryRun - - WolframAlphaQueryRun + Search: + documentation: "https://example.com/Search" + PAL-MATH: + documentation: "https://example.com/PAL-MATH" + Calculator: + documentation: "https://example.com/Calculator" + Serper Search: + documentation: "https://example.com/SerperSearch" + Tool: + documentation: "https://example.com/Tool" + PythonFunctionTool: + documentation: "https://example.com/PythonFunctionTool" + PythonFunction: + documentation: "https://example.com/PythonFunction" + JsonSpec: + documentation: "https://example.com/JsonSpec" + News API: + documentation: "https://example.com/NewsAPI" + TMDB API: + documentation: "https://example.com/TMDBAPI" + Podcast API: + documentation: "https://example.com/PodcastAPI" + QuerySQLDataBaseTool: + documentation: "https://example.com/QuerySQLDataBaseTool" + InfoSQLDatabaseTool: + documentation: "https://example.com/InfoSQLDatabaseTool" + ListSQLDatabaseTool: + documentation: "https://example.com/ListSQLDatabaseTool" + BingSearchRun: + documentation: "https://example.com/BingSearchRun" + GoogleSearchRun: + documentation: "https://example.com/GoogleSearchRun" + GoogleSearchResults: + documentation: "https://example.com/GoogleSearchResults" + GoogleSerperRun: + documentation: "https://example.com/GoogleSerperRun" + JsonListKeysTool: + documentation: "https://example.com/JsonListKeysTool" + JsonGetValueTool: + documentation: "https://example.com/JsonGetValueTool" + PythonREPLTool: + documentation: "https://example.com/PythonREPLTool" + PythonAstREPLTool: + documentation: "https://example.com/PythonAstREPLTool" + RequestsGetTool: + documentation: "https://example.com/RequestsGetTool" + RequestsPostTool: + documentation: "https://example.com/RequestsPostTool" + RequestsPatchTool: + documentation: "https://example.com/RequestsPatchTool" + RequestsPutTool: + documentation: "https://example.com/RequestsPutTool" + RequestsDeleteTool: + documentation: "https://example.com/RequestsDeleteTool" + WikipediaQueryRun: + documentation: "https://example.com/WikipediaQueryRun" + WolframAlphaQueryRun: + documentation: "https://example.com/WolframAlphaQueryRun" utilities: - - BingSearchAPIWrapper - - GoogleSearchAPIWrapper - - GoogleSerperAPIWrapper - - SearxResults - - SearxSearchWrapper - - SerpAPIWrapper - - WikipediaAPIWrapper - - WolframAlphaAPIWrapper - # - ZapierNLAWrapper - - SQLDatabase + BingSearchAPIWrapper: + documentation: "https://example.com/BingSearchAPIWrapper" + GoogleSearchAPIWrapper: + documentation: "https://example.com/GoogleSearchAPIWrapper" + GoogleSerperAPIWrapper: + documentation: "https://example.com/GoogleSerperAPIWrapper" + SearxResults: + documentation: "https://example.com/SearxResults" + SearxSearchWrapper: + documentation: "https://example.com/SearxSearchWrapper" + SerpAPIWrapper: + documentation: "https://example.com/SerpAPIWrapper" + WikipediaAPIWrapper: + documentation: "https://example.com/WikipediaAPIWrapper" + WolframAlphaAPIWrapper: + documentation: "https://example.com/WolframAlphaAPIWrapper" vectorstores: - - Chroma - - Qdrant - - Weaviate - - FAISS - - Pinecone - - SupabaseVectorStore - - MongoDBAtlasVectorSearch + Chroma: + documentation: "https://example.com/Chroma" + Qdrant: + documentation: "https://example.com/Qdrant" + Weaviate: + documentation: "https://example.com/Weaviate" + FAISS: + documentation: "https://example.com/FAISS" + Pinecone: + documentation: "https://example.com/Pinecone" + SupabaseVectorStore: + documentation: "https://example.com/SupabaseVectorStore" + MongoDBAtlasVectorSearch: + documentation: "https://example.com/MongoDBAtlasVectorSearch" wrappers: - - RequestsWrapper - # - ChatPromptTemplate - # - SystemMessagePromptTemplate - # - HumanMessagePromptTemplate + RequestsWrapper: + documentation: "https://example.com/RequestsWrapper" diff --git a/src/backend/langflow/settings.py b/src/backend/langflow/settings.py index 9d6ac3fa9..fac0dab8b 100644 --- a/src/backend/langflow/settings.py +++ b/src/backend/langflow/settings.py @@ -1,24 +1,23 @@ import os -from typing import List import yaml from pydantic import BaseSettings, root_validator class Settings(BaseSettings): - chains: List[str] = [] - agents: List[str] = [] - prompts: List[str] = [] - llms: List[str] = [] - tools: List[str] = [] - memories: List[str] = [] - embeddings: List[str] = [] - vectorstores: List[str] = [] - documentloaders: List[str] = [] - wrappers: List[str] = [] - toolkits: List[str] = [] - textsplitters: List[str] = [] - utilities: List[str] = [] + chains: dict = {} + agents: dict = {} + prompts: dict = {} + llms: dict = {} + tools: dict = {} + memories: dict = {} + embeddings: dict = {} + vectorstores: dict = {} + documentloaders: dict = {} + wrappers: dict = {} + toolkits: dict = {} + textsplitters: dict = {} + utilities: dict = {} dev: bool = False database_url: str = "sqlite:///./langflow.db" remove_api_keys: bool = False From 08cdc15d98bc850680584503be74218333beaa7b Mon Sep 17 00:00:00 2001 From: Gabriel Luiz Freitas Almeida Date: Sat, 24 Jun 2023 16:31:47 -0300 Subject: [PATCH 008/169] =?UTF-8?q?=F0=9F=94=8D=20refactor(base.py):=20add?= =?UTF-8?q?=20documentation=20support=20to=20LangChainTypeCreator=20This?= =?UTF-8?q?=20commit=20adds=20a=20new=20property=20to=20the=20LangChainTyp?= =?UTF-8?q?eCreator=20class=20called=20docs=5Fmap,=20which=20is=20a=20dict?= =?UTF-8?q?ionary=20that=20maps=20the=20name=20of=20the=20component=20to?= =?UTF-8?q?=20its=20documentation=20link.=20The=20docs=5Fmap=20property=20?= =?UTF-8?q?is=20used=20to=20set=20the=20documentation=20of=20the=20compone?= =?UTF-8?q?nt=20in=20the=20signature=20of=20the=20component.=20This=20chan?= =?UTF-8?q?ge=20improves=20the=20readability=20and=20maintainability=20of?= =?UTF-8?q?=20the=20code=20by=20making=20it=20easier=20to=20add=20and=20up?= =?UTF-8?q?date=20documentation=20for=20components.?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/backend/langflow/interface/base.py | 20 +++++++++++++++++++- 1 file changed, 19 insertions(+), 1 deletion(-) diff --git a/src/backend/langflow/interface/base.py b/src/backend/langflow/interface/base.py index df0c2c50c..6e1522dd2 100644 --- a/src/backend/langflow/interface/base.py +++ b/src/backend/langflow/interface/base.py @@ -8,6 +8,7 @@ from langflow.template.field.base import TemplateField from langflow.template.frontend_node.base import FrontendNode from langflow.template.template.base import Template from langflow.utils.logger import logger +from langflow.settings import settings # Assuming necessary imports for Field, Template, and FrontendNode classes @@ -15,12 +16,29 @@ from langflow.utils.logger import logger class LangChainTypeCreator(BaseModel, ABC): type_name: str type_dict: Optional[Dict] = None + name_docs_dict: Optional[Dict[str, str]] = None @property def frontend_node_class(self) -> Type[FrontendNode]: """The class type of the FrontendNode created in frontend_node.""" return FrontendNode + @property + def docs_map(self) -> Dict[str, str]: + """A dict with the name of the component as key and the documentation link as value.""" + if self.name_docs_dict is None: + try: + type_settings = getattr(settings, self.type_name) + self.name_docs_dict = { + name: value_dict["documentation"] + for name, value_dict in type_settings.items() + } + except AttributeError as exc: + logger.error(exc) + + self.name_docs_dict = {} + return self.name_docs_dict + @property @abstractmethod def type_to_loader_dict(self) -> Dict: @@ -83,7 +101,7 @@ class LangChainTypeCreator(BaseModel, ABC): signature.add_extra_fields() signature.add_extra_base_classes() - + signature.set_documentation(self.docs_map.get(name, "")) return signature From 2de86cbac4ac74792f631d53108788d012dd69c6 Mon Sep 17 00:00:00 2001 From: Gabriel Luiz Freitas Almeida Date: Sat, 24 Jun 2023 16:32:00 -0300 Subject: [PATCH 009/169] =?UTF-8?q?=F0=9F=93=9D=20docs(frontend=5Fnode):?= =?UTF-8?q?=20add=20set=5Fdocumentation=20method=20to=20set=20the=20docume?= =?UTF-8?q?ntation=20of=20the=20frontend=20node=20=E2=9C=A8=20feat(fronten?= =?UTF-8?q?d=5Fnode):=20add=20documentation=20field=20to=20the=20frontend?= =?UTF-8?q?=20node=20dict=20representation=20The=20`set=5Fdocumentation`?= =?UTF-8?q?=20method=20is=20added=20to=20the=20`FrontendNode`=20class=20to?= =?UTF-8?q?=20allow=20setting=20the=20documentation=20of=20the=20frontend?= =?UTF-8?q?=20node.=20The=20`to=5Fdict`=20method=20is=20updated=20to=20inc?= =?UTF-8?q?lude=20the=20`documentation`=20field=20in=20the=20dict=20repres?= =?UTF-8?q?entation=20of=20the=20frontend=20node.=20This=20improves=20the?= =?UTF-8?q?=20readability=20and=20usability=20of=20the=20frontend=20node?= =?UTF-8?q?=20by=20providing=20documentation=20for=20the=20node.?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/backend/langflow/template/frontend_node/base.py | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/src/backend/langflow/template/frontend_node/base.py b/src/backend/langflow/template/frontend_node/base.py index 4801da086..751ecb709 100644 --- a/src/backend/langflow/template/frontend_node/base.py +++ b/src/backend/langflow/template/frontend_node/base.py @@ -15,14 +15,21 @@ class FrontendNode(BaseModel): base_classes: List[str] name: str = "" display_name: str = "" + documentation: str = "" + + def set_documentation(self, documentation: str) -> None: + """Sets the documentation of the frontend node.""" + self.documentation = documentation def to_dict(self) -> dict: + """Returns a dict representation of the frontend node.""" return { self.name: { "template": self.template.to_dict(self.format_field), "description": self.description, "base_classes": self.base_classes, "display_name": self.display_name or self.name, + "documentation": self.documentation, }, } From f52feac7e5bad32f396e189655d520e8edc8337f Mon Sep 17 00:00:00 2001 From: Gabriel Luiz Freitas Almeida Date: Sat, 24 Jun 2023 16:32:32 -0300 Subject: [PATCH 010/169] =?UTF-8?q?=F0=9F=8E=A8=20style(GenericNode/index.?= =?UTF-8?q?tsx):=20remove=20unused=20imports=20and=20add=20documentation?= =?UTF-8?q?=20link=20to=20node=20toolbar=20=F0=9F=9A=80=20feat(api/index.t?= =?UTF-8?q?s):=20add=20documentation=20field=20to=20APIClassType=20The=20u?= =?UTF-8?q?nused=20imports=20were=20removed=20to=20improve=20code=20readab?= =?UTF-8?q?ility.=20A=20documentation=20link=20was=20added=20to=20the=20no?= =?UTF-8?q?de=20toolbar=20to=20allow=20users=20to=20easily=20access=20the?= =?UTF-8?q?=20documentation=20for=20the=20node.=20The=20documentation=20fi?= =?UTF-8?q?eld=20was=20added=20to=20the=20APIClassType=20to=20allow=20for?= =?UTF-8?q?=20the=20storage=20of=20a=20link=20to=20the=20documentation=20f?= =?UTF-8?q?or=20the=20API=20class.?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../src/CustomNodes/GenericNode/index.tsx | 25 ++++++++++--------- src/frontend/src/types/api/index.ts | 1 + 2 files changed, 14 insertions(+), 12 deletions(-) diff --git a/src/frontend/src/CustomNodes/GenericNode/index.tsx b/src/frontend/src/CustomNodes/GenericNode/index.tsx index 1668b1d4e..c2c58decf 100644 --- a/src/frontend/src/CustomNodes/GenericNode/index.tsx +++ b/src/frontend/src/CustomNodes/GenericNode/index.tsx @@ -6,16 +6,7 @@ import { } from "../../utils"; import ParameterComponent from "./components/parameterComponent"; import { typesContext } from "../../contexts/typesContext"; -import { - useContext, - useState, - useEffect, - useRef, - ForwardRefExoticComponent, - ComponentType, - SVGProps, - ReactNode, -} from "react"; +import { useContext, useState, useEffect, useRef } from "react"; import { NodeDataType } from "../../types/flow"; import { alertContext } from "../../contexts/alertContext"; import { PopUpContext } from "../../contexts/popUpContext"; @@ -23,10 +14,9 @@ import NodeModal from "../../modals/NodeModal"; import Tooltip from "../../components/TooltipComponent"; import { NodeToolbar } from "reactflow"; import NodeToolbarComponent from "../../pages/FlowPage/components/nodeToolbarComponent"; - +import { Info } from "lucide-react"; import ShadTooltip from "../../components/ShadTooltipComponent"; import { useSSE } from "../../contexts/SSEContext"; -import { ReactElement } from "react-markdown/lib/react-markdown"; export default function GenericNode({ data, @@ -124,6 +114,17 @@ export default function GenericNode({ >
+
+ + + + + +
| string | APITemplateType; }; export type TemplateVariableType = { From 99f0b803e9b81ce0cffaf50840121edaaba400b2 Mon Sep 17 00:00:00 2001 From: Gabriel Luiz Freitas Almeida Date: Sat, 24 Jun 2023 16:32:48 -0300 Subject: [PATCH 011/169] =?UTF-8?q?=F0=9F=94=A8=20refactor(tabsContext.tsx?= =?UTF-8?q?):=20improve=20code=20readability=20by=20adding=20whitespace=20?= =?UTF-8?q?and=20consistent=20formatting=20The=20code=20has=20been=20refac?= =?UTF-8?q?tored=20to=20improve=20readability=20by=20adding=20whitespace?= =?UTF-8?q?=20and=20consistent=20formatting.=20The=20function=20names=20ha?= =?UTF-8?q?ve=20been=20updated=20to=20use=20camelCase=20for=20consistency.?= =?UTF-8?q?=20The=20updateDisplay=5Fname=20function=20has=20been=20updated?= =?UTF-8?q?=20to=20use=20a=20logical=20OR=20operator=20instead=20of=20a=20?= =?UTF-8?q?ternary=20operator=20for=20better=20readability.=20The=20update?= =?UTF-8?q?NodeDocumentation=20function=20has=20been=20added=20to=20update?= =?UTF-8?q?=20the=20node=20documentation.=20The=20updateNodeBaseClasses,?= =?UTF-8?q?=20updateNodeEdges,=20updateNodeDescription,=20and=20updateNode?= =?UTF-8?q?Template=20functions=20have=20been=20updated=20to=20use=20consi?= =?UTF-8?q?stent=20parameter=20names=20and=20whitespace.?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/frontend/src/contexts/tabsContext.tsx | 30 +++++++++++++++-------- 1 file changed, 20 insertions(+), 10 deletions(-) diff --git a/src/frontend/src/contexts/tabsContext.tsx b/src/frontend/src/contexts/tabsContext.tsx index 7637699e3..8a2e17465 100644 --- a/src/frontend/src/contexts/tabsContext.tsx +++ b/src/frontend/src/contexts/tabsContext.tsx @@ -192,39 +192,49 @@ export function TabsProvider({ children }: { children: ReactNode }) { } function processFlowEdges(flow) { - if(!flow.data || !flow.data.edges) return; + if (!flow.data || !flow.data.edges) return; flow.data.edges.forEach((edge) => { edge.className = ""; edge.style = { stroke: "#555555" }; }); } - function updateDisplay_name(node:NodeType,template:APIClassType) { - node.data.node.display_name = template["display_name"]?template["display_name"]:node.data.type; + + function updateDisplay_name(node: NodeType, template: APIClassType) { + node.data.node.display_name = template["display_name"] || node.data.type; + } + + function updateNodeDocumentation(node: NodeType, template: APIClassType) { + node.data.node.documentation = template["documentation"]; } function processFlowNodes(flow) { - if(!flow.data || !flow.data.nodes) return; - flow.data.nodes.forEach((node:NodeType) => { + if (!flow.data || !flow.data.nodes) return; + flow.data.nodes.forEach((node: NodeType) => { const template = templates[node.data.type]; if (!template) { setErrorData({ title: `Unknown node type: ${node.data.type}` }); return; } if (Object.keys(template["template"]).length > 0) { - updateDisplay_name(node,template); + updateDisplay_name(node, template); updateNodeBaseClasses(node, template); updateNodeEdges(flow, node, template); updateNodeDescription(node, template); updateNodeTemplate(node, template); + updateNodeDocumentation(node, template); } }); } - function updateNodeBaseClasses(node:NodeType,template:APIClassType) { + function updateNodeBaseClasses(node: NodeType, template: APIClassType) { node.data.node.base_classes = template["base_classes"]; } - function updateNodeEdges(flow:FlowType, node:NodeType,template:APIClassType) { + function updateNodeEdges( + flow: FlowType, + node: NodeType, + template: APIClassType + ) { flow.data.edges.forEach((edge) => { if (edge.source === node.id) { edge.sourceHandle = edge.sourceHandle @@ -236,11 +246,11 @@ export function TabsProvider({ children }: { children: ReactNode }) { }); } - function updateNodeDescription(node:NodeType,template:APIClassType) { + function updateNodeDescription(node: NodeType, template: APIClassType) { node.data.node.description = template["description"]; } - function updateNodeTemplate(node:NodeType,template:APIClassType) { + function updateNodeTemplate(node: NodeType, template: APIClassType) { node.data.node.template = updateTemplate( template["template"] as unknown as APITemplateType, node.data.node.template as APITemplateType From aa4b7bfc327f22191dc75df670610faabac354a0 Mon Sep 17 00:00:00 2001 From: Gabriel Luiz Freitas Almeida Date: Sat, 24 Jun 2023 16:38:11 -0300 Subject: [PATCH 012/169] =?UTF-8?q?=F0=9F=90=9B=20fix(GenericNode):=20add?= =?UTF-8?q?=20conditional=20rendering=20to=20documentation=20link=20to=20p?= =?UTF-8?q?revent=20empty=20href=20The=20documentation=20link=20was=20prev?= =?UTF-8?q?iously=20always=20rendered,=20even=20if=20the=20href=20was=20em?= =?UTF-8?q?pty.=20This=20caused=20an=20issue=20where=20the=20link=20would?= =?UTF-8?q?=20be=20clickable=20but=20lead=20to=20nowhere.=20The=20fix=20ad?= =?UTF-8?q?ds=20a=20conditional=20rendering=20to=20the=20link,=20so=20it?= =?UTF-8?q?=20is=20only=20rendered=20if=20the=20href=20is=20not=20empty.?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../src/CustomNodes/GenericNode/index.tsx | 20 ++++++++++--------- 1 file changed, 11 insertions(+), 9 deletions(-) diff --git a/src/frontend/src/CustomNodes/GenericNode/index.tsx b/src/frontend/src/CustomNodes/GenericNode/index.tsx index c2c58decf..0bab24969 100644 --- a/src/frontend/src/CustomNodes/GenericNode/index.tsx +++ b/src/frontend/src/CustomNodes/GenericNode/index.tsx @@ -115,15 +115,17 @@ export default function GenericNode({
- - - - - + {data.node.documentation !== "" && ( + + + + + + )}
Date: Sat, 24 Jun 2023 16:38:24 -0300 Subject: [PATCH 013/169] =?UTF-8?q?=F0=9F=90=9B=20fix(settings.py):=20chan?= =?UTF-8?q?ge=20default=20values=20of=20settings=20attributes=20from=20lis?= =?UTF-8?q?t=20to=20dictionary=20The=20default=20values=20of=20the=20setti?= =?UTF-8?q?ngs=20attributes=20were=20changed=20from=20an=20empty=20list=20?= =?UTF-8?q?to=20an=20empty=20dictionary.=20This=20change=20was=20made=20to?= =?UTF-8?q?=20avoid=20errors=20that=20could=20occur=20when=20trying=20to?= =?UTF-8?q?=20access=20a=20non-existent=20key=20in=20the=20dictionary.?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/backend/langflow/settings.py | 20 ++++++++++---------- 1 file changed, 10 insertions(+), 10 deletions(-) diff --git a/src/backend/langflow/settings.py b/src/backend/langflow/settings.py index fac0dab8b..0a50a907f 100644 --- a/src/backend/langflow/settings.py +++ b/src/backend/langflow/settings.py @@ -36,16 +36,16 @@ class Settings(BaseSettings): def update_from_yaml(self, file_path: str, dev: bool = False): new_settings = load_settings_from_yaml(file_path) - self.chains = new_settings.chains or [] - self.agents = new_settings.agents or [] - self.prompts = new_settings.prompts or [] - self.llms = new_settings.llms or [] - self.tools = new_settings.tools or [] - self.memories = new_settings.memories or [] - self.wrappers = new_settings.wrappers or [] - self.toolkits = new_settings.toolkits or [] - self.textsplitters = new_settings.textsplitters or [] - self.utilities = new_settings.utilities or [] + self.chains = new_settings.chains or {} + self.agents = new_settings.agents or {} + self.prompts = new_settings.prompts or {} + self.llms = new_settings.llms or {} + self.tools = new_settings.tools or {} + self.memories = new_settings.memories or {} + self.wrappers = new_settings.wrappers or {} + self.toolkits = new_settings.toolkits or {} + self.textsplitters = new_settings.textsplitters or {} + self.utilities = new_settings.utilities or {} self.dev = dev def update_settings(self, **kwargs): From d0893d2eb79913bb10400c57be31951b83d031f2 Mon Sep 17 00:00:00 2001 From: Gabriel Luiz Freitas Almeida Date: Sat, 24 Jun 2023 16:53:13 -0300 Subject: [PATCH 014/169] =?UTF-8?q?=F0=9F=94=A5=20chore(test=5Fprompts=5Ft?= =?UTF-8?q?emplate.py):=20remove=20unused=20test=5Ffew=5Fshot=5Fprompt=5Ft?= =?UTF-8?q?emplate=20function=20The=20test=5Ffew=5Fshot=5Fprompt=5Ftemplat?= =?UTF-8?q?e=20function=20is=20not=20being=20used=20and=20is=20not=20neces?= =?UTF-8?q?sary=20for=20the=20tests.=20Removing=20it=20will=20make=20the?= =?UTF-8?q?=20code=20cleaner=20and=20easier=20to=20maintain.?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- tests/test_prompts_template.py | 79 ---------------------------------- 1 file changed, 79 deletions(-) diff --git a/tests/test_prompts_template.py b/tests/test_prompts_template.py index a8562898c..5094f50f0 100644 --- a/tests/test_prompts_template.py +++ b/tests/test_prompts_template.py @@ -88,85 +88,6 @@ def test_prompt_template(client: TestClient): } -def test_few_shot_prompt_template(client: TestClient): - response = client.get("api/v1/all") - assert response.status_code == 200 - json_response = response.json() - prompts = json_response["prompts"] - - prompt = prompts["FewShotPromptTemplate"] - template = prompt["template"] - # Test other fields in the template similar to PromptTemplate - assert template["examples"] == { - "required": False, - "placeholder": "", - "show": True, - "multiline": True, - "password": False, - "name": "examples", - "type": "prompt", - "list": True, - "advanced": False, - } - assert template["example_selector"] == { - "required": False, - "placeholder": "", - "show": False, - "multiline": False, - "password": False, - "name": "example_selector", - "type": "BaseExampleSelector", - "list": False, - "advanced": False, - } - assert template["example_prompt"] == { - "required": True, - "placeholder": "", - "show": True, - "multiline": False, - "password": False, - "name": "example_prompt", - "type": "PromptTemplate", - "list": False, - "advanced": False, - } - assert template["suffix"] == { - "required": True, - "placeholder": "", - "show": True, - "multiline": True, - "password": False, - "name": "suffix", - "type": "prompt", - "list": False, - "advanced": False, - } - assert template["example_separator"] == { - "required": False, - "placeholder": "", - "show": False, - "multiline": False, - "value": "\n\n", - "password": False, - "name": "example_separator", - "type": "str", - "list": False, - "advanced": False, - } - assert template["prefix"] == { - "required": False, - "placeholder": "", - "show": True, - "multiline": True, - "value": "", - "password": False, - "name": "prefix", - "type": "prompt", - "list": False, - "advanced": False, - } - - def test_zero_shot_prompt(client: TestClient): response = client.get("api/v1/all") assert response.status_code == 200 From d523b7f8b07194a81a832f174a77ccb21b488182 Mon Sep 17 00:00:00 2001 From: Gabriel Luiz Freitas Almeida Date: Sun, 25 Jun 2023 09:26:13 -0300 Subject: [PATCH 015/169] fix: removing placeholders --- src/backend/langflow/config.yaml | 204 +++++++++++++++---------------- 1 file changed, 102 insertions(+), 102 deletions(-) diff --git a/src/backend/langflow/config.yaml b/src/backend/langflow/config.yaml index a8f4f6b53..0abeb7a7e 100644 --- a/src/backend/langflow/config.yaml +++ b/src/backend/langflow/config.yaml @@ -8,11 +8,11 @@ agents: AgentInitializer: documentation: "https://python.langchain.com/docs/modules/agents/agent_types/" VectorStoreAgent: - documentation: "https://example.com/VectorStoreAgent" + documentation: "" VectorStoreRouterAgent: - documentation: "https://example.com/VectorStoreRouterAgent" + documentation: "" SQLAgent: - documentation: "https://example.com/SQLAgent" + documentation: "" chains: LLMChain: documentation: "https://python.langchain.com/docs/modules/chains/foundational/llm_chain" @@ -21,111 +21,111 @@ chains: LLMCheckerChain: documentation: "https://python.langchain.com/docs/modules/chains/additional/llm_checker" ConversationChain: - documentation: "https://example.com/ConversationChain" + documentation: "" SeriesCharacterChain: - documentation: "https://example.com/SeriesCharacterChain" + documentation: "" MidJourneyPromptChain: - documentation: "https://example.com/MidJourneyPromptChain" + documentation: "" TimeTravelGuideChain: - documentation: "https://example.com/TimeTravelGuideChain" + documentation: "" SQLDatabaseChain: - documentation: "https://example.com/SQLDatabaseChain" + documentation: "" RetrievalQA: documentation: "https://python.langchain.com/docs/modules/chains/popular/vector_db_qa" RetrievalQAWithSourcesChain: - documentation: "https://example.com/RetrievalQAWithSourcesChain" + documentation: "" ConversationalRetrievalChain: documentation: "https://python.langchain.com/docs/modules/chains/popular/chat_vector_db" CombineDocsChain: - documentation: "https://example.com/CombineDocsChain" + documentation: "" documentloaders: AirbyteJSONLoader: - documentation: "https://example.com/AirbyteJSONLoader" + documentation: "" CoNLLULoader: - documentation: "https://example.com/CoNLLULoader" + documentation: "" CSVLoader: - documentation: "https://example.com/CSVLoader" + documentation: "" UnstructuredEmailLoader: - documentation: "https://example.com/UnstructuredEmailLoader" + documentation: "" EverNoteLoader: - documentation: "https://example.com/EverNoteLoader" + documentation: "" FacebookChatLoader: - documentation: "https://example.com/FacebookChatLoader" + documentation: "" GutenbergLoader: - documentation: "https://example.com/GutenbergLoader" + documentation: "" BSHTMLLoader: - documentation: "https://example.com/BSHTMLLoader" + documentation: "" UnstructuredHTMLLoader: - documentation: "https://example.com/UnstructuredHTMLLoader" + documentation: "" UnstructuredMarkdownLoader: - documentation: "https://example.com/UnstructuredMarkdownLoader" + documentation: "" PyPDFLoader: - documentation: "https://example.com/PyPDFLoader" + documentation: "" UnstructuredPowerPointLoader: - documentation: "https://example.com/UnstructuredPowerPointLoader" + documentation: "" SRTLoader: - documentation: "https://example.com/SRTLoader" + documentation: "" TelegramChatLoader: - documentation: "https://example.com/TelegramChatLoader" + documentation: "" TextLoader: - documentation: "https://example.com/TextLoader" + documentation: "" UnstructuredWordDocumentLoader: - documentation: "https://example.com/UnstructuredWordDocumentLoader" + documentation: "" WebBaseLoader: - documentation: "https://example.com/WebBaseLoader" + documentation: "" AZLyricsLoader: - documentation: "https://example.com/AZLyricsLoader" + documentation: "" CollegeConfidentialLoader: - documentation: "https://example.com/CollegeConfidentialLoader" + documentation: "" HNLoader: - documentation: "https://example.com/HNLoader" + documentation: "" IFixitLoader: - documentation: "https://example.com/IFixitLoader" + documentation: "" IMSDbLoader: - documentation: "https://example.com/IMSDbLoader" + documentation: "" GitbookLoader: - documentation: "https://example.com/GitbookLoader" + documentation: "" ReadTheDocsLoader: - documentation: "https://example.com/ReadTheDocsLoader" + documentation: "" SlackDirectoryLoader: - documentation: "https://example.com/SlackDirectoryLoader" + documentation: "" NotionDirectoryLoader: - documentation: "https://example.com/NotionDirectoryLoader" + documentation: "" DirectoryLoader: - documentation: "https://example.com/DirectoryLoader" + documentation: "" GitLoader: - documentation: "https://example.com/GitLoader" + documentation: "" embeddings: OpenAIEmbeddings: - documentation: "https://example.com/OpenAIEmbeddings" + documentation: "" HuggingFaceEmbeddings: - documentation: "https://example.com/HuggingFaceEmbeddings" + documentation: "" CohereEmbeddings: - documentation: "https://example.com/CohereEmbeddings" + documentation: "" llms: OpenAI: - documentation: "https://example.com/OpenAI" + documentation: "" ChatOpenAI: - documentation: "https://example.com/ChatOpenAI" + documentation: "" LlamaCpp: - documentation: "https://example.com/LlamaCpp" + documentation: "" CTransformers: - documentation: "https://example.com/CTransformers" + documentation: "" Cohere: - documentation: "https://example.com/Cohere" + documentation: "" Anthropic: - documentation: "https://example.com/Anthropic" + documentation: "" ChatAnthropic: - documentation: "https://example.com/ChatAnthropic" + documentation: "" HuggingFaceHub: - documentation: "https://example.com/HuggingFaceHub" + documentation: "" memories: ConversationBufferMemory: - documentation: "https://example.com/ConversationBufferMemory" + documentation: "" ConversationSummaryMemory: - documentation: "https://example.com/ConversationSummaryMemory" + documentation: "" ConversationKGMemory: - documentation: "https://example.com/ConversationKGMemory" + documentation: "" prompts: PromptTemplate: documentation: "https://python.langchain.com/docs/modules/model_io/prompts/prompt_templates/" @@ -138,106 +138,106 @@ textsplitters: documentation: "https://python.langchain.com/docs/modules/data_connection/document_transformers/text_splitters/recursive_text_splitter" toolkits: OpenAPIToolkit: - documentation: "https://example.com/OpenAPIToolkit" + documentation: "" JsonToolkit: - documentation: "https://example.com/JsonToolkit" + documentation: "" VectorStoreInfo: - documentation: "https://example.com/VectorStoreInfo" + documentation: "" VectorStoreRouterToolkit: - documentation: "https://example.com/VectorStoreRouterToolkit" + documentation: "" VectorStoreToolkit: - documentation: "https://example.com/VectorStoreToolkit" + documentation: "" tools: Search: - documentation: "https://example.com/Search" + documentation: "" PAL-MATH: - documentation: "https://example.com/PAL-MATH" + documentation: "" Calculator: - documentation: "https://example.com/Calculator" + documentation: "" Serper Search: - documentation: "https://example.com/SerperSearch" + documentation: "" Tool: - documentation: "https://example.com/Tool" + documentation: "" PythonFunctionTool: - documentation: "https://example.com/PythonFunctionTool" + documentation: "" PythonFunction: - documentation: "https://example.com/PythonFunction" + documentation: "" JsonSpec: - documentation: "https://example.com/JsonSpec" + documentation: "" News API: - documentation: "https://example.com/NewsAPI" + documentation: "" TMDB API: - documentation: "https://example.com/TMDBAPI" + documentation: "" Podcast API: - documentation: "https://example.com/PodcastAPI" + documentation: "" QuerySQLDataBaseTool: - documentation: "https://example.com/QuerySQLDataBaseTool" + documentation: "" InfoSQLDatabaseTool: - documentation: "https://example.com/InfoSQLDatabaseTool" + documentation: "" ListSQLDatabaseTool: - documentation: "https://example.com/ListSQLDatabaseTool" + documentation: "" BingSearchRun: - documentation: "https://example.com/BingSearchRun" + documentation: "" GoogleSearchRun: - documentation: "https://example.com/GoogleSearchRun" + documentation: "" GoogleSearchResults: - documentation: "https://example.com/GoogleSearchResults" + documentation: "" GoogleSerperRun: - documentation: "https://example.com/GoogleSerperRun" + documentation: "" JsonListKeysTool: - documentation: "https://example.com/JsonListKeysTool" + documentation: "" JsonGetValueTool: - documentation: "https://example.com/JsonGetValueTool" + documentation: "" PythonREPLTool: - documentation: "https://example.com/PythonREPLTool" + documentation: "" PythonAstREPLTool: - documentation: "https://example.com/PythonAstREPLTool" + documentation: "" RequestsGetTool: - documentation: "https://example.com/RequestsGetTool" + documentation: "" RequestsPostTool: - documentation: "https://example.com/RequestsPostTool" + documentation: "" RequestsPatchTool: - documentation: "https://example.com/RequestsPatchTool" + documentation: "" RequestsPutTool: - documentation: "https://example.com/RequestsPutTool" + documentation: "" RequestsDeleteTool: - documentation: "https://example.com/RequestsDeleteTool" + documentation: "" WikipediaQueryRun: - documentation: "https://example.com/WikipediaQueryRun" + documentation: "" WolframAlphaQueryRun: - documentation: "https://example.com/WolframAlphaQueryRun" + documentation: "" utilities: BingSearchAPIWrapper: - documentation: "https://example.com/BingSearchAPIWrapper" + documentation: "" GoogleSearchAPIWrapper: - documentation: "https://example.com/GoogleSearchAPIWrapper" + documentation: "" GoogleSerperAPIWrapper: - documentation: "https://example.com/GoogleSerperAPIWrapper" + documentation: "" SearxResults: - documentation: "https://example.com/SearxResults" + documentation: "" SearxSearchWrapper: - documentation: "https://example.com/SearxSearchWrapper" + documentation: "" SerpAPIWrapper: - documentation: "https://example.com/SerpAPIWrapper" + documentation: "" WikipediaAPIWrapper: - documentation: "https://example.com/WikipediaAPIWrapper" + documentation: "" WolframAlphaAPIWrapper: - documentation: "https://example.com/WolframAlphaAPIWrapper" + documentation: "" vectorstores: Chroma: - documentation: "https://example.com/Chroma" + documentation: "" Qdrant: - documentation: "https://example.com/Qdrant" + documentation: "" Weaviate: - documentation: "https://example.com/Weaviate" + documentation: "" FAISS: - documentation: "https://example.com/FAISS" + documentation: "" Pinecone: - documentation: "https://example.com/Pinecone" + documentation: "" SupabaseVectorStore: - documentation: "https://example.com/SupabaseVectorStore" + documentation: "" MongoDBAtlasVectorSearch: - documentation: "https://example.com/MongoDBAtlasVectorSearch" + documentation: "" wrappers: RequestsWrapper: - documentation: "https://example.com/RequestsWrapper" + documentation: "" From 02befe50526fa454cb24409c7d925d936716da72 Mon Sep 17 00:00:00 2001 From: Gabriel Luiz Freitas Almeida Date: Sun, 25 Jun 2023 09:27:44 -0300 Subject: [PATCH 016/169] =?UTF-8?q?=F0=9F=93=9D=20docs(config.yaml):=20add?= =?UTF-8?q?=20documentation=20links=20for=20LlamaCpp=20and=20CTransformers?= =?UTF-8?q?=20integrations=20This=20commit=20adds=20documentation=20links?= =?UTF-8?q?=20for=20the=20LlamaCpp=20and=20CTransformers=20integrations=20?= =?UTF-8?q?in=20the=20config.yaml=20file.=20The=20links=20point=20to=20the?= =?UTF-8?q?=20relevant=20documentation=20pages=20on=20the=20LangChain=20we?= =?UTF-8?q?bsite.=20This=20improves=20the=20accessibility=20of=20the=20doc?= =?UTF-8?q?umentation=20for=20these=20integrations.?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/backend/langflow/config.yaml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/backend/langflow/config.yaml b/src/backend/langflow/config.yaml index 0abeb7a7e..0077b4ba1 100644 --- a/src/backend/langflow/config.yaml +++ b/src/backend/langflow/config.yaml @@ -108,9 +108,9 @@ llms: ChatOpenAI: documentation: "" LlamaCpp: - documentation: "" + documentation: "https://python.langchain.com/docs/modules/model_io/models/llms/integrations/llamacpp" CTransformers: - documentation: "" + documentation: "https://python.langchain.com/docs/modules/model_io/models/llms/integrations/ctransformers" Cohere: documentation: "" Anthropic: From a45947c01beb0da9c91e410e4122ca0882bca30b Mon Sep 17 00:00:00 2001 From: Gabriel Luiz Freitas Almeida Date: Sun, 25 Jun 2023 18:37:05 -0300 Subject: [PATCH 017/169] =?UTF-8?q?=F0=9F=9A=80=20feat(vectorstores.py):?= =?UTF-8?q?=20add=20VectorStoreRetriever=20as=20an=20extra=20base=20class?= =?UTF-8?q?=20to=20VectorStoreFrontendNode=20The=20VectorStoreFrontendNode?= =?UTF-8?q?=20class=20now=20has=20VectorStoreRetriever=20as=20an=20extra?= =?UTF-8?q?=20base=20class=20in=20addition=20to=20BaseRetriever.=20This=20?= =?UTF-8?q?change=20was=20made=20to=20improve=20the=20functionality=20of?= =?UTF-8?q?=20the=20class=20by=20allowing=20it=20to=20inherit=20from=20Vec?= =?UTF-8?q?torStoreRetriever.?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/backend/langflow/template/frontend_node/vectorstores.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/backend/langflow/template/frontend_node/vectorstores.py b/src/backend/langflow/template/frontend_node/vectorstores.py index 01b6bfe53..58cfcdc34 100644 --- a/src/backend/langflow/template/frontend_node/vectorstores.py +++ b/src/backend/langflow/template/frontend_node/vectorstores.py @@ -200,7 +200,7 @@ class VectorStoreFrontendNode(FrontendNode): self.template.add_field(field) def add_extra_base_classes(self) -> None: - self.base_classes.append("BaseRetriever") + self.base_classes.extend(("BaseRetriever", "VectorStoreRetriever")) @staticmethod def format_field(field: TemplateField, name: Optional[str] = None) -> None: From d4599a52b352701288c6c8872cf41ba6a7a72122 Mon Sep 17 00:00:00 2001 From: Gabriel Luiz Freitas Almeida Date: Sun, 25 Jun 2023 18:37:18 -0300 Subject: [PATCH 018/169] =?UTF-8?q?=F0=9F=93=9D=20docs(config.yaml):=20add?= =?UTF-8?q?=20documentation=20links=20for=20new=20integrations=20and=20mem?= =?UTF-8?q?ories=20Added=20documentation=20links=20for=20new=20integration?= =?UTF-8?q?s=20and=20memories=20to=20improve=20the=20documentation=20of=20?= =?UTF-8?q?the=20project.=20The=20new=20integrations=20are=20Cohere=20and?= =?UTF-8?q?=20HuggingFaceHub,=20and=20the=20new=20memories=20are=20Convers?= =?UTF-8?q?ationBufferWindowMemory=20and=20VectorStoreRetrieverMemory.?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/backend/langflow/config.yaml | 14 +++++++++----- 1 file changed, 9 insertions(+), 5 deletions(-) diff --git a/src/backend/langflow/config.yaml b/src/backend/langflow/config.yaml index 0077b4ba1..65b470f21 100644 --- a/src/backend/langflow/config.yaml +++ b/src/backend/langflow/config.yaml @@ -112,20 +112,24 @@ llms: CTransformers: documentation: "https://python.langchain.com/docs/modules/model_io/models/llms/integrations/ctransformers" Cohere: - documentation: "" + documentation: "https://python.langchain.com/docs/modules/model_io/models/llms/integrations/cohere" Anthropic: documentation: "" ChatAnthropic: documentation: "" HuggingFaceHub: - documentation: "" + documentation: "https://python.langchain.com/docs/modules/model_io/models/llms/integrations/huggingface_hub" memories: ConversationBufferMemory: - documentation: "" + documentation: "https://python.langchain.com/docs/modules/memory/how_to/summary" ConversationSummaryMemory: - documentation: "" + documentation: "https://python.langchain.com/docs/modules/memory/how_to/summary" ConversationKGMemory: - documentation: "" + documentation: "https://python.langchain.com/docs/modules/memory/how_to/kg" + ConversationBufferWindowMemory: + documentation: "https://python.langchain.com/docs/modules/memory/how_to/buffer_window" + VectorStoreRetrieverMemory: + documentation: "https://python.langchain.com/docs/modules/memory/how_to/vectorstore_retriever_memory" prompts: PromptTemplate: documentation: "https://python.langchain.com/docs/modules/model_io/prompts/prompt_templates/" From 217225467f5f35395d3d9fc2627024213d6b340d Mon Sep 17 00:00:00 2001 From: Gabriel Luiz Freitas Almeida Date: Sun, 25 Jun 2023 18:57:35 -0300 Subject: [PATCH 019/169] =?UTF-8?q?=F0=9F=94=A8=20refactor(loading.py):=20?= =?UTF-8?q?add=20type=20hints=20to=20function=20parameters=20and=20return?= =?UTF-8?q?=20types=20This=20commit=20adds=20type=20hints=20to=20the=20fun?= =?UTF-8?q?ction=20parameters=20and=20return=20types=20in=20the=20loading.?= =?UTF-8?q?py=20file.=20This=20improves=20the=20readability=20and=20mainta?= =?UTF-8?q?inability=20of=20the=20codebase=20by=20making=20it=20easier=20t?= =?UTF-8?q?o=20understand=20the=20expected=20types=20of=20the=20parameters?= =?UTF-8?q?=20and=20return=20values=20of=20the=20functions.?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../langflow/interface/initialize/loading.py | 36 ++++++++++++------- 1 file changed, 24 insertions(+), 12 deletions(-) diff --git a/src/backend/langflow/interface/initialize/loading.py b/src/backend/langflow/interface/initialize/loading.py index 88b981f9d..4acc21383 100644 --- a/src/backend/langflow/interface/initialize/loading.py +++ b/src/backend/langflow/interface/initialize/loading.py @@ -1,5 +1,5 @@ import json -from typing import Any, Callable, Dict, Sequence +from typing import Any, Callable, Dict, Sequence, Type from langchain.agents import ZeroShotAgent from langchain.agents import agent as agent_module @@ -16,6 +16,12 @@ from langflow.interface.toolkits.base import toolkits_creator from langflow.interface.chains.base import chain_creator from langflow.interface.utils import load_file_into_dict from langflow.utils import validate +from langchain.text_splitter import TextSplitter +from langchain.chains.base import Chain +from langchain.vectorstores.base import VectorStore +from langchain.document_loaders.base import BaseLoader +from langchain.embeddings.base import Embeddings +from langchain.prompts.base import BasePromptTemplate def instantiate_class(node_type: str, base_type: str, params: Dict) -> Any: @@ -76,7 +82,7 @@ def instantiate_based_on_type(class_object, base_type, node_type, params): return class_object(**params) -def instantiate_chains(node_type, class_object, params): +def instantiate_chains(node_type, class_object: Type[Chain], params: Dict): if "retriever" in params and hasattr(params["retriever"], "as_retriever"): params["retriever"] = params["retriever"].as_retriever() if node_type in chain_creator.from_method_nodes: @@ -88,11 +94,11 @@ def instantiate_chains(node_type, class_object, params): return class_object(**params) -def instantiate_agent(class_object, params): +def instantiate_agent(class_object: Type[Chain], params: Dict): return load_agent_executor(class_object, params) -def instantiate_prompt(node_type, class_object, params): +def instantiate_prompt(node_type, class_object: Type[BasePromptTemplate], params: Dict): if node_type == "ZeroShotPrompt": if "tools" not in params: params["tools"] = [] @@ -100,7 +106,7 @@ def instantiate_prompt(node_type, class_object, params): return class_object(**params) -def instantiate_tool(node_type, class_object, params): +def instantiate_tool(node_type, class_object: Type[BaseTool], params: Dict): if node_type == "JsonSpec": params["dict_"] = load_file_into_dict(params.pop("path")) return class_object(**params) @@ -118,7 +124,7 @@ def instantiate_tool(node_type, class_object, params): return class_object(**params) -def instantiate_toolkit(node_type, class_object, params): +def instantiate_toolkit(node_type, class_object: Type[BaseToolkit], params: Dict): loaded_toolkit = class_object(**params) # Commenting this out for now to use toolkits as normal tools # if toolkits_creator.has_create_function(node_type): @@ -128,7 +134,7 @@ def instantiate_toolkit(node_type, class_object, params): return loaded_toolkit -def instantiate_embedding(class_object, params): +def instantiate_embedding(class_object: Type[Embeddings], params: Dict): params.pop("model", None) params.pop("headers", None) try: @@ -142,7 +148,7 @@ def instantiate_embedding(class_object, params): return class_object(**params) -def instantiate_vectorstore(class_object, params): +def instantiate_vectorstore(class_object: Type[VectorStore], params: Dict): search_kwargs = params.pop("search_kwargs", {}) if initializer := vecstore_initializer.get(class_object.__name__): vecstore = initializer(class_object, params) @@ -158,7 +164,7 @@ def instantiate_vectorstore(class_object, params): return vecstore -def instantiate_documentloader(class_object, params): +def instantiate_documentloader(class_object: Type[BaseLoader], params: Dict): if "file_filter" in params: # file_filter will be a string but we need a function # that will be used to filter the files using file_filter @@ -187,7 +193,7 @@ def instantiate_documentloader(class_object, params): return docs -def instantiate_textsplitter(class_object, params): +def instantiate_textsplitter(class_object: Type[TextSplitter], params: Dict): try: documents = params.pop("documents") except KeyError as e: @@ -195,11 +201,17 @@ def instantiate_textsplitter(class_object, params): "The source you provided did not load correctly or was empty." "Try changing the chunk_size of the Text Splitter." ) from e - text_splitter = class_object(**params) + if "separator_type" in params and params["separator_type"] == "Text": + text_splitter = class_object(**params) + else: + params["language"] = params.pop("separator_type", None) + params.pop("separators", None) + text_splitter = class_object.from_language(**params) + return text_splitter.split_documents(documents) -def instantiate_utility(node_type, class_object, params): +def instantiate_utility(node_type, class_object, params: Dict): if node_type == "SQLDatabase": return class_object.from_uri(params.pop("uri")) return class_object(**params) From 005e7ec51ce88b6870a2b43b9c0482b1a38725dd Mon Sep 17 00:00:00 2001 From: Gabriel Luiz Freitas Almeida Date: Sun, 25 Jun 2023 18:57:45 -0300 Subject: [PATCH 020/169] =?UTF-8?q?=F0=9F=9A=80=20feat(textsplitters.py):?= =?UTF-8?q?=20add=20a=20field=20for=20separator=20type=20in=20RecursiveCha?= =?UTF-8?q?racterTextSplitter=20The=20RecursiveCharacterTextSplitter=20cla?= =?UTF-8?q?ss=20in=20textsplitters.py=20now=20has=20a=20new=20field=20call?= =?UTF-8?q?ed=20separator=5Ftype.=20This=20field=20is=20used=20to=20specif?= =?UTF-8?q?y=20the=20type=20of=20separator=20to=20be=20used=20in=20the=20s?= =?UTF-8?q?plitter.=20The=20separator=5Ftype=20field=20is=20a=20string=20a?= =?UTF-8?q?nd=20can=20take=20any=20value=20from=20the=20Language=20enum=20?= =?UTF-8?q?or=20"Text".=20This=20change=20was=20made=20to=20improve=20the?= =?UTF-8?q?=20flexibility=20of=20the=20RecursiveCharacterTextSplitter=20cl?= =?UTF-8?q?ass.?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../template/frontend_node/textsplitters.py | 17 +++++++++++++++++ 1 file changed, 17 insertions(+) diff --git a/src/backend/langflow/template/frontend_node/textsplitters.py b/src/backend/langflow/template/frontend_node/textsplitters.py index 03880379d..0a444ff08 100644 --- a/src/backend/langflow/template/frontend_node/textsplitters.py +++ b/src/backend/langflow/template/frontend_node/textsplitters.py @@ -1,5 +1,6 @@ from langflow.template.field.base import TemplateField from langflow.template.frontend_node.base import FrontendNode +from langchain.text_splitter import Language class TextSplittersFrontendNode(FrontendNode): @@ -17,6 +18,22 @@ class TextSplittersFrontendNode(FrontendNode): name = "separator" elif self.template.type_name == "RecursiveCharacterTextSplitter": name = "separators" + # Add a field for type of separator + # which will have Text or any value from the + # Language enum + self.template.add_field( + TemplateField( + field_type="str", + required=True, + show=True, + name="separator_type", + advanced=False, + is_list=True, + options=[x.value for x in Language], + value="Text", + display_name="Separator Type", + ) + ) self.template.add_field( TemplateField( field_type="str", From 9510474aa67dc30bf4a26a5789f965b58de51736 Mon Sep 17 00:00:00 2001 From: Gabriel Luiz Freitas Almeida Date: Sun, 25 Jun 2023 18:59:40 -0300 Subject: [PATCH 021/169] =?UTF-8?q?=F0=9F=93=9D=20docs(config.yaml):=20add?= =?UTF-8?q?=20documentation=20links=20to=20vectorstores=20integrations=20A?= =?UTF-8?q?dded=20documentation=20links=20to=20the=20vectorstores=20integr?= =?UTF-8?q?ations=20in=20the=20config.yaml=20file.=20This=20will=20make=20?= =?UTF-8?q?it=20easier=20for=20developers=20to=20access=20the=20documentat?= =?UTF-8?q?ion=20for=20each=20integration.?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/backend/langflow/config.yaml | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) diff --git a/src/backend/langflow/config.yaml b/src/backend/langflow/config.yaml index 65b470f21..b0e5499b3 100644 --- a/src/backend/langflow/config.yaml +++ b/src/backend/langflow/config.yaml @@ -229,19 +229,19 @@ utilities: documentation: "" vectorstores: Chroma: - documentation: "" + documentation: "https://python.langchain.com/docs/modules/data_connection/vectorstores/integrations/chroma" Qdrant: - documentation: "" + documentation: "https://python.langchain.com/docs/modules/data_connection/vectorstores/integrations/qdrant" Weaviate: - documentation: "" + documentation: "https://python.langchain.com/docs/modules/data_connection/vectorstores/integrations/weaviate" FAISS: - documentation: "" + documentation: "https://python.langchain.com/docs/modules/data_connection/vectorstores/integrations/faiss" Pinecone: - documentation: "" + documentation: "https://python.langchain.com/docs/modules/data_connection/vectorstores/integrations/pinecone" SupabaseVectorStore: - documentation: "" + documentation: "https://python.langchain.com/docs/modules/data_connection/vectorstores/integrations/supabase" MongoDBAtlasVectorSearch: - documentation: "" + documentation: "https://python.langchain.com/docs/modules/data_connection/vectorstores/integrations/mongodb_atlas_vector_search" wrappers: RequestsWrapper: documentation: "" From 0c398fb6c59fc5a03456511b7a7be1ba7caa4807 Mon Sep 17 00:00:00 2001 From: Gabriel Luiz Freitas Almeida Date: Sun, 25 Jun 2023 19:34:25 -0300 Subject: [PATCH 022/169] =?UTF-8?q?=F0=9F=94=A8=20refactor(loading.py):=20?= =?UTF-8?q?add=20type=20hinting=20to=20instantiate=5Fagent=20function=20?= =?UTF-8?q?=F0=9F=90=9B=20fix(loading.py):=20fix=20type=20hinting=20in=20i?= =?UTF-8?q?nstantiate=5Fembedding=20function=20=F0=9F=94=A8=20refactor(loa?= =?UTF-8?q?ding.py):=20add=20type=20hinting=20to=20instantiate=5Ftextsplit?= =?UTF-8?q?ter=20function=20The=20changes=20in=20this=20commit=20add=20typ?= =?UTF-8?q?e=20hinting=20to=20the=20`instantiate=5Fagent`,=20`instantiate?= =?UTF-8?q?=5Fembedding`,=20and=20`instantiate=5Ftextsplitter`=20functions?= =?UTF-8?q?=20to=20improve=20code=20readability=20and=20maintainability.?= =?UTF-8?q?=20The=20`instantiate=5Fembedding`=20function=20had=20a=20bug?= =?UTF-8?q?=20in=20its=20type=20hinting=20which=20has=20been=20fixed.?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../langflow/interface/initialize/loading.py | 30 +++++++++++-------- 1 file changed, 17 insertions(+), 13 deletions(-) diff --git a/src/backend/langflow/interface/initialize/loading.py b/src/backend/langflow/interface/initialize/loading.py index 4acc21383..a928ea586 100644 --- a/src/backend/langflow/interface/initialize/loading.py +++ b/src/backend/langflow/interface/initialize/loading.py @@ -16,11 +16,10 @@ from langflow.interface.toolkits.base import toolkits_creator from langflow.interface.chains.base import chain_creator from langflow.interface.utils import load_file_into_dict from langflow.utils import validate -from langchain.text_splitter import TextSplitter +from langchain.text_splitter import TextSplitter, RecursiveCharacterTextSplitter from langchain.chains.base import Chain from langchain.vectorstores.base import VectorStore from langchain.document_loaders.base import BaseLoader -from langchain.embeddings.base import Embeddings from langchain.prompts.base import BasePromptTemplate @@ -94,7 +93,7 @@ def instantiate_chains(node_type, class_object: Type[Chain], params: Dict): return class_object(**params) -def instantiate_agent(class_object: Type[Chain], params: Dict): +def instantiate_agent(class_object: Type[agent_module.Agent], params: Dict): return load_agent_executor(class_object, params) @@ -134,7 +133,7 @@ def instantiate_toolkit(node_type, class_object: Type[BaseToolkit], params: Dict return loaded_toolkit -def instantiate_embedding(class_object: Type[Embeddings], params: Dict): +def instantiate_embedding(class_object, params: Dict): params.pop("model", None) params.pop("headers", None) try: @@ -193,20 +192,25 @@ def instantiate_documentloader(class_object: Type[BaseLoader], params: Dict): return docs -def instantiate_textsplitter(class_object: Type[TextSplitter], params: Dict): +def instantiate_textsplitter( + class_object: Type[TextSplitter], + params: Dict, +): try: documents = params.pop("documents") - except KeyError as e: + except KeyError as exc: raise ValueError( "The source you provided did not load correctly or was empty." "Try changing the chunk_size of the Text Splitter." - ) from e - if "separator_type" in params and params["separator_type"] == "Text": - text_splitter = class_object(**params) - else: - params["language"] = params.pop("separator_type", None) - params.pop("separators", None) - text_splitter = class_object.from_language(**params) + ) from exc + + if type(class_object) == RecursiveCharacterTextSplitter: + if "separator_type" in params and params["separator_type"] == "Text": + text_splitter = class_object(**params) + else: + params["language"] = params.pop("separator_type", None) + params.pop("separators", None) + text_splitter = class_object.from_language(**params) return text_splitter.split_documents(documents) From 7d415e62df66ddeea0d86833cc02486a9166ec88 Mon Sep 17 00:00:00 2001 From: Gabriel Luiz Freitas Almeida Date: Sun, 25 Jun 2023 21:32:48 -0300 Subject: [PATCH 023/169] =?UTF-8?q?=F0=9F=8E=A8=20style(GenericNode):=20re?= =?UTF-8?q?factor=20tooltip=20to=20improve=20accessibility=20and=20user=20?= =?UTF-8?q?experience=20The=20tooltip=20now=20includes=20a=20link=20to=20t?= =?UTF-8?q?he=20documentation=20of=20the=20node,=20which=20makes=20it=20mo?= =?UTF-8?q?re=20accessible=20and=20user-friendly.=20The=20link=20is=20now?= =?UTF-8?q?=20wrapped=20in=20the=20tooltip=20title,=20which=20improves=20t?= =?UTF-8?q?he=20semantics=20of=20the=20code.?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../src/CustomNodes/GenericNode/index.tsx | 20 +++++++++++-------- 1 file changed, 12 insertions(+), 8 deletions(-) diff --git a/src/frontend/src/CustomNodes/GenericNode/index.tsx b/src/frontend/src/CustomNodes/GenericNode/index.tsx index 0bab24969..a84a88093 100644 --- a/src/frontend/src/CustomNodes/GenericNode/index.tsx +++ b/src/frontend/src/CustomNodes/GenericNode/index.tsx @@ -116,14 +116,18 @@ export default function GenericNode({
{data.node.documentation !== "" && ( - - - - + + {`Open ${data.node.display_name} documentation`} + + } + > + )}
From 6459a27777deec92cda0028eb6319fd40c89a122 Mon Sep 17 00:00:00 2001 From: Gabriel Luiz Freitas Almeida Date: Sun, 25 Jun 2023 21:37:24 -0300 Subject: [PATCH 024/169] =?UTF-8?q?=F0=9F=90=9B=20fix(loading.py):=20use?= =?UTF-8?q?=20'is'=20instead=20of=20'=3D=3D'=20to=20compare=20object=20typ?= =?UTF-8?q?es=20The=20commit=20changes=20the=20comparison=20operator=20fro?= =?UTF-8?q?m=20'=3D=3D'=20to=20'is'=20to=20compare=20object=20types.=20Thi?= =?UTF-8?q?s=20is=20because=20'is'=20compares=20the=20object=20identity=20?= =?UTF-8?q?while=20'=3D=3D'=20compares=20the=20object=20value.=20In=20this?= =?UTF-8?q?=20case,=20we=20want=20to=20compare=20the=20object=20identity,?= =?UTF-8?q?=20so=20'is'=20is=20the=20correct=20operator=20to=20use.?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/backend/langflow/interface/initialize/loading.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/backend/langflow/interface/initialize/loading.py b/src/backend/langflow/interface/initialize/loading.py index a928ea586..d362ab844 100644 --- a/src/backend/langflow/interface/initialize/loading.py +++ b/src/backend/langflow/interface/initialize/loading.py @@ -204,7 +204,7 @@ def instantiate_textsplitter( "Try changing the chunk_size of the Text Splitter." ) from exc - if type(class_object) == RecursiveCharacterTextSplitter: + if class_object is RecursiveCharacterTextSplitter: if "separator_type" in params and params["separator_type"] == "Text": text_splitter = class_object(**params) else: From 2d77aaaa15f4055d0e0325309a98e7ccc4c08abd Mon Sep 17 00:00:00 2001 From: Gabriel Luiz Freitas Almeida Date: Mon, 26 Jun 2023 07:58:49 -0300 Subject: [PATCH 025/169] =?UTF-8?q?=F0=9F=90=9B=20fix(loading.py):=20fix?= =?UTF-8?q?=20instantiation=20of=20TextSplitter=20by=20removing=20unnecess?= =?UTF-8?q?ary=20check=20for=20RecursiveCharacterTextSplitter=20The=20impo?= =?UTF-8?q?rt=20of=20RecursiveCharacterTextSplitter=20was=20removed=20as?= =?UTF-8?q?=20it=20was=20not=20being=20used=20in=20the=20code.=20The=20ins?= =?UTF-8?q?tantiation=20of=20TextSplitter=20was=20fixed=20by=20removing=20?= =?UTF-8?q?the=20unnecessary=20check=20for=20RecursiveCharacterTextSplitte?= =?UTF-8?q?r=20and=20simplifying=20the=20code.=20=F0=9F=94=A5=20refactor(l?= =?UTF-8?q?oading.py):=20remove=20unused=20import=20of=20RecursiveCharacte?= =?UTF-8?q?rTextSplitter?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../langflow/interface/initialize/loading.py | 16 +++++++--------- 1 file changed, 7 insertions(+), 9 deletions(-) diff --git a/src/backend/langflow/interface/initialize/loading.py b/src/backend/langflow/interface/initialize/loading.py index d362ab844..756588058 100644 --- a/src/backend/langflow/interface/initialize/loading.py +++ b/src/backend/langflow/interface/initialize/loading.py @@ -16,7 +16,6 @@ from langflow.interface.toolkits.base import toolkits_creator from langflow.interface.chains.base import chain_creator from langflow.interface.utils import load_file_into_dict from langflow.utils import validate -from langchain.text_splitter import TextSplitter, RecursiveCharacterTextSplitter from langchain.chains.base import Chain from langchain.vectorstores.base import VectorStore from langchain.document_loaders.base import BaseLoader @@ -193,7 +192,7 @@ def instantiate_documentloader(class_object: Type[BaseLoader], params: Dict): def instantiate_textsplitter( - class_object: Type[TextSplitter], + class_object, params: Dict, ): try: @@ -204,13 +203,12 @@ def instantiate_textsplitter( "Try changing the chunk_size of the Text Splitter." ) from exc - if class_object is RecursiveCharacterTextSplitter: - if "separator_type" in params and params["separator_type"] == "Text": - text_splitter = class_object(**params) - else: - params["language"] = params.pop("separator_type", None) - params.pop("separators", None) - text_splitter = class_object.from_language(**params) + if "separator_type" in params and params["separator_type"] == "Text": + text_splitter = class_object(**params) + else: + params["language"] = params.pop("separator_type", None) + params.pop("separators", None) + text_splitter = class_object.from_language(**params) return text_splitter.split_documents(documents) From fcedf0807392344f30c47aef0aebb865878db741 Mon Sep 17 00:00:00 2001 From: Cristhian Zanforlin Lousa Date: Mon, 26 Jun 2023 17:11:47 -0300 Subject: [PATCH 026/169] =?UTF-8?q?=F0=9F=94=A7=20refactor(frontend):=20re?= =?UTF-8?q?move=20unnecessary=20blank=20lines=20in=20multiple=20components?= =?UTF-8?q?=20=F0=9F=94=A7=20refactor(tabsContext.tsx):=20add=20missing=20?= =?UTF-8?q?type=20annotations=20and=20improve=20code=20readability=20?= =?UTF-8?q?=F0=9F=94=A7=20refactor(ApiModal):=20improve=20code=20readabili?= =?UTF-8?q?ty=20by=20adding=20a=20new=20line=20to=20a=20JSX=20element=20?= =?UTF-8?q?=F0=9F=94=A7=20refactor(EditNodeModal):=20remove=20unnecessary?= =?UTF-8?q?=20blank=20line=20in=20a=20JSX=20element?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/frontend/package-lock.json | 39 ++++++++++--------- .../components/dropdownComponent/index.tsx | 3 -- .../src/components/floatComponent/index.tsx | 1 - .../components/inputListComponent/index.tsx | 2 - .../src/components/intComponent/index.tsx | 1 - src/frontend/src/contexts/tabsContext.tsx | 28 +++++++------ src/frontend/src/modals/ApiModal/index.tsx | 4 +- .../src/modals/EditNodeModal/index.tsx | 2 +- 8 files changed, 41 insertions(+), 39 deletions(-) diff --git a/src/frontend/package-lock.json b/src/frontend/package-lock.json index 673f56f10..0edd88d0d 100644 --- a/src/frontend/package-lock.json +++ b/src/frontend/package-lock.json @@ -1212,15 +1212,15 @@ "integrity": "sha512-I7K1Uu0MBPzaFKg4nI5Q7Vs2t+3gWWW648spaF+Rg7pI9ds18Ugn+lvg4SHczUdKlHI5LWBXyqfS8+DufyBsgQ==" }, "node_modules/@mui/system": { - "version": "5.13.5", - "resolved": "https://registry.npmjs.org/@mui/system/-/system-5.13.5.tgz", - "integrity": "sha512-n0gzUxoZ2ZHZgnExkh2Htvo9uW2oakofgPRQrDoa/GQOWyRD0NH9MDszBwOb6AAoXZb+OV5TE7I4LeZ/dzgHYA==", + "version": "5.13.6", + "resolved": "https://registry.npmjs.org/@mui/system/-/system-5.13.6.tgz", + "integrity": "sha512-G3Xr28uLqU3DyF6r2LQkHGw/ku4P0AHzlKVe7FGXOPl7X1u+hoe2xxj8Vdiq/69II/mh9OP21i38yBWgWb7WgQ==", "dependencies": { - "@babel/runtime": "^7.21.0", + "@babel/runtime": "^7.22.5", "@mui/private-theming": "^5.13.1", "@mui/styled-engine": "^5.13.2", "@mui/types": "^7.2.4", - "@mui/utils": "^5.13.1", + "@mui/utils": "^5.13.6", "clsx": "^1.2.1", "csstype": "^3.1.2", "prop-types": "^15.8.1" @@ -1280,11 +1280,11 @@ } }, "node_modules/@mui/utils": { - "version": "5.13.1", - "resolved": "https://registry.npmjs.org/@mui/utils/-/utils-5.13.1.tgz", - "integrity": "sha512-6lXdWwmlUbEU2jUI8blw38Kt+3ly7xkmV9ljzY4Q20WhsJMWiNry9CX8M+TaP/HbtuyR8XKsdMgQW7h7MM3n3A==", + "version": "5.13.6", + "resolved": "https://registry.npmjs.org/@mui/utils/-/utils-5.13.6.tgz", + "integrity": "sha512-ggNlxl5NPSbp+kNcQLmSig6WVB0Id+4gOxhx644987v4fsji+CSXc+MFYLocFB/x4oHtzCUlSzbVHlJfP/fXoQ==", "dependencies": { - "@babel/runtime": "^7.21.0", + "@babel/runtime": "^7.22.5", "@types/prop-types": "^15.7.5", "@types/react-is": "^18.2.0", "prop-types": "^15.8.1", @@ -3444,7 +3444,7 @@ "version": "16.18.12", "resolved": "https://registry.npmjs.org/@types/node/-/node-16.18.12.tgz", "integrity": "sha512-vzLe5NaNMjIE3mcddFVGlAXN1LEWueUsMsOJWaT6wWMJGyljHAWHznqfnKUQWGzu7TLPrGvWdNAsvQYW+C0xtw==", - "devOptional": true + "dev": true }, "node_modules/@types/parse-json": { "version": "4.0.0", @@ -3714,9 +3714,9 @@ } }, "node_modules/aria-query": { - "version": "5.2.1", - "resolved": "https://registry.npmjs.org/aria-query/-/aria-query-5.2.1.tgz", - "integrity": "sha512-7uFg4b+lETFgdaJyETnILsXgnnzVnkHcgRbwbPwevm5x/LmUlt3MjczMRe1zg824iBgXZNRPTBftNYyRSKLp2g==", + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/aria-query/-/aria-query-5.3.0.tgz", + "integrity": "sha512-b0P0sZPKtyu8HkeRAfCq0IfURZK+SuwMjY1UXGBU27wpAiTwQAIlq56IbIO+ytk/JjS1fMR14ee5WBBfKi5J6A==", "dev": true, "dependencies": { "dequal": "^2.0.3" @@ -5010,9 +5010,9 @@ } }, "node_modules/electron-to-chromium": { - "version": "1.4.438", - "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.4.438.tgz", - "integrity": "sha512-x94U0FhphEsHsOloCvlsujHCvoir0ZQ73ZAs/QN4PLx98uNvyEU79F75rq1db75Bx/atvuh7KPeuxelh+xfYJw==" + "version": "1.4.440", + "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.4.440.tgz", + "integrity": "sha512-r6dCgNpRhPwiWlxbHzZQ/d9swfPaEJGi8ekqRBwQYaR3WmA5VkqQfBWSDDjuJU1ntO+W9tHx8OHV/96Q8e0dVw==" }, "node_modules/emoji-regex": { "version": "8.0.0", @@ -5504,6 +5504,7 @@ "version": "2.3.2", "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.2.tgz", "integrity": "sha512-xiqMQR4xAeHTuB9uWm+fFRcIOgKBMiOBP+eXiyT7jsgVCq1bkVygt00oASowB7EdtpOHaaPgKt812P9ab+DDKA==", + "dev": true, "hasInstallScript": true, "optional": true, "os": [ @@ -6745,9 +6746,9 @@ } }, "node_modules/katex": { - "version": "0.16.7", - "resolved": "https://registry.npmjs.org/katex/-/katex-0.16.7.tgz", - "integrity": "sha512-Xk9C6oGKRwJTfqfIbtr0Kes9OSv6IFsuhFGc7tW4urlpMJtuh+7YhzU6YEG9n8gmWKcMAFzkp7nr+r69kV0zrA==", + "version": "0.16.8", + "resolved": "https://registry.npmjs.org/katex/-/katex-0.16.8.tgz", + "integrity": "sha512-ftuDnJbcbOckGY11OO+zg3OofESlbR5DRl2cmN8HeWeeFIV7wTXvAOx8kEjZjobhA+9wh2fbKeO6cdcA9Mnovg==", "funding": [ "https://opencollective.com/katex", "https://github.com/sponsors/katex" diff --git a/src/frontend/src/components/dropdownComponent/index.tsx b/src/frontend/src/components/dropdownComponent/index.tsx index 605a24041..e252e1b21 100644 --- a/src/frontend/src/components/dropdownComponent/index.tsx +++ b/src/frontend/src/components/dropdownComponent/index.tsx @@ -16,7 +16,6 @@ export default function Dropdown({ }: DropDownComponentType) { const { closePopUp } = useContext(PopUpContext); - let [internalValue, setInternalValue] = useState( value === "" || !value ? "Choose an option" : value ); @@ -87,9 +86,7 @@ export default function Dropdown({ ) } value={option} - > - {({ selected, active }) => ( <> { setInputList(value); }, [closePopUp]); - - return (
{ edge.className = ""; edge.style = { stroke: "#555555" }; }); } - function updateDisplay_name(node:NodeType,template:APIClassType) { - node.data.node.display_name = template["display_name"]?template["display_name"]:node.data.type; + function updateDisplay_name(node: NodeType, template: APIClassType) { + node.data.node.display_name = template["display_name"] + ? template["display_name"] + : node.data.type; } function processFlowNodes(flow) { - if(!flow.data || !flow.data.nodes) return; - flow.data.nodes.forEach((node:NodeType) => { + if (!flow.data || !flow.data.nodes) return; + flow.data.nodes.forEach((node: NodeType) => { const template = templates[node.data.type]; if (!template) { setErrorData({ title: `Unknown node type: ${node.data.type}` }); return; } if (Object.keys(template["template"]).length > 0) { - updateDisplay_name(node,template); + updateDisplay_name(node, template); updateNodeBaseClasses(node, template); updateNodeEdges(flow, node, template); updateNodeDescription(node, template); @@ -220,11 +222,15 @@ export function TabsProvider({ children }: { children: ReactNode }) { }); } - function updateNodeBaseClasses(node:NodeType,template:APIClassType) { + function updateNodeBaseClasses(node: NodeType, template: APIClassType) { node.data.node.base_classes = template["base_classes"]; } - function updateNodeEdges(flow:FlowType, node:NodeType,template:APIClassType) { + function updateNodeEdges( + flow: FlowType, + node: NodeType, + template: APIClassType + ) { flow.data.edges.forEach((edge) => { if (edge.source === node.id) { edge.sourceHandle = edge.sourceHandle @@ -236,11 +242,11 @@ export function TabsProvider({ children }: { children: ReactNode }) { }); } - function updateNodeDescription(node:NodeType,template:APIClassType) { + function updateNodeDescription(node: NodeType, template: APIClassType) { node.data.node.description = template["description"]; } - function updateNodeTemplate(node:NodeType,template:APIClassType) { + function updateNodeTemplate(node: NodeType, template: APIClassType) { node.data.node.template = updateTemplate( template["template"] as unknown as APITemplateType, node.data.node.template as APITemplateType @@ -404,7 +410,7 @@ export function TabsProvider({ children }: { children: ReactNode }) { y: insidePosition.y + n.position.y - minimumY, }, data: { - ...n.data, + ..._.cloneDeep(n.data), id: newId, }, }; diff --git a/src/frontend/src/modals/ApiModal/index.tsx b/src/frontend/src/modals/ApiModal/index.tsx index 8b373c4e2..d6fff5d9f 100644 --- a/src/frontend/src/modals/ApiModal/index.tsx +++ b/src/frontend/src/modals/ApiModal/index.tsx @@ -103,7 +103,9 @@ export default function ApiModal({ flow }: { flow: FlowType }) {
{tabs.map((tab, index) => ( - {tab.name} + + {tab.name} + ))}
diff --git a/src/frontend/src/modals/EditNodeModal/index.tsx b/src/frontend/src/modals/EditNodeModal/index.tsx index fa7563bfb..e2f9c7bca 100644 --- a/src/frontend/src/modals/EditNodeModal/index.tsx +++ b/src/frontend/src/modals/EditNodeModal/index.tsx @@ -79,7 +79,7 @@ export default function EditNodeModal({ data }: { data: NodeDataType }) { } return ( - + From 47fcdaef419d31956e56ea38b5b1013cb633f08d Mon Sep 17 00:00:00 2001 From: Cristhian Zanforlin Lousa Date: Mon, 26 Jun 2023 18:29:27 -0300 Subject: [PATCH 027/169] =?UTF-8?q?=F0=9F=8E=A8=20style(GenericNode/index.?= =?UTF-8?q?tsx):=20refactor=20GenericNode=20component=20to=20use=20a=20mor?= =?UTF-8?q?e=20readable=20and=20maintainable=20code=20structure=20?= =?UTF-8?q?=E2=9C=A8=20feat(GenericNode/index.tsx):=20add=20documentation?= =?UTF-8?q?=20link=20to=20GenericNode=20component=20and=20display=20it=20a?= =?UTF-8?q?s=20a=20tooltip=20when=20hovering=20over=20the=20info=20icon.?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../src/CustomNodes/GenericNode/index.tsx | 61 +++++++++++++------ 1 file changed, 42 insertions(+), 19 deletions(-) diff --git a/src/frontend/src/CustomNodes/GenericNode/index.tsx b/src/frontend/src/CustomNodes/GenericNode/index.tsx index a84a88093..743339a48 100644 --- a/src/frontend/src/CustomNodes/GenericNode/index.tsx +++ b/src/frontend/src/CustomNodes/GenericNode/index.tsx @@ -14,7 +14,7 @@ import NodeModal from "../../modals/NodeModal"; import Tooltip from "../../components/TooltipComponent"; import { NodeToolbar } from "reactflow"; import NodeToolbarComponent from "../../pages/FlowPage/components/nodeToolbarComponent"; -import { Info } from "lucide-react"; +import { FileText, Info } from "lucide-react"; import ShadTooltip from "../../components/ShadTooltipComponent"; import { useSSE } from "../../contexts/SSEContext"; @@ -36,6 +36,7 @@ export default function GenericNode({ const [validationStatus, setValidationStatus] = useState(null); // State for outline color const { sseData, isBuilding } = useSSE(); + const refHtml = useRef(null); // useEffect(() => { // if (reactFlowInstance) { @@ -69,6 +70,22 @@ export default function GenericNode({ useEffect(() => {}, [closePopUp, data.node.template]); + useEffect(() => { + refHtml.current = ( +
+ {`${data.node.display_name} Documentation`} + + + +
+ ); + }, []); + return ( <> @@ -93,7 +110,7 @@ export default function GenericNode({ color: nodeColors[types[data.type]] ?? nodeColors.unknown, }} /> -
+
+
+ {data.node.documentation !== "" && ( + + + + + + )} +
@@ -114,23 +154,6 @@ export default function GenericNode({ >
-
- {data.node.documentation !== "" && ( - - {`Open ${data.node.display_name} documentation`} - - } - > - - - )} -
Date: Mon, 26 Jun 2023 19:53:51 -0300 Subject: [PATCH 028/169] =?UTF-8?q?=F0=9F=93=9D=20docs(config.yaml):=20add?= =?UTF-8?q?=20documentation=20links=20for=20various=20document=20loaders,?= =?UTF-8?q?=20embeddings,=20and=20llms=20Added=20documentation=20links=20f?= =?UTF-8?q?or=20various=20document=20loaders,=20embeddings,=20and=20llms?= =?UTF-8?q?=20to=20improve=20the=20readability=20and=20usability=20of=20th?= =?UTF-8?q?e=20config.yaml=20file.=20These=20links=20provide=20a=20quick?= =?UTF-8?q?=20reference=20to=20the=20documentation=20for=20each=20of=20the?= =?UTF-8?q?=20modules,=20making=20it=20easier=20for=20developers=20to=20un?= =?UTF-8?q?derstand=20and=20use=20them.?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/backend/langflow/config.yaml | 68 ++++++++++++++++---------------- 1 file changed, 34 insertions(+), 34 deletions(-) diff --git a/src/backend/langflow/config.yaml b/src/backend/langflow/config.yaml index b0e5499b3..518ff7029 100644 --- a/src/backend/langflow/config.yaml +++ b/src/backend/langflow/config.yaml @@ -40,73 +40,73 @@ chains: documentation: "" documentloaders: AirbyteJSONLoader: - documentation: "" + documentation: "https://python.langchain.com/docs/modules/data_connection/document_loaders/integrations/airbyte_json" CoNLLULoader: - documentation: "" + documentation: "https://python.langchain.com/docs/modules/data_connection/document_loaders/integrations/conll-u" CSVLoader: - documentation: "" + documentation: "https://python.langchain.com/docs/modules/data_connection/document_loaders/integrations/csv" UnstructuredEmailLoader: - documentation: "" + documentation: "https://python.langchain.com/docs/modules/data_connection/document_loaders/integrations/email" EverNoteLoader: - documentation: "" + documentation: "https://python.langchain.com/docs/modules/data_connection/document_loaders/integrations/evernote" FacebookChatLoader: - documentation: "" + documentation: "https://python.langchain.com/docs/modules/data_connection/document_loaders/integrations/facebook_chat" GutenbergLoader: - documentation: "" + documentation: "https://python.langchain.com/docs/modules/data_connection/document_loaders/integrations/gutenberg" BSHTMLLoader: - documentation: "" + documentation: "https://python.langchain.com/docs/modules/data_connection/document_loaders/how_to/html" UnstructuredHTMLLoader: - documentation: "" + documentation: "https://python.langchain.com/docs/modules/data_connection/document_loaders/how_to/html" UnstructuredMarkdownLoader: - documentation: "" + documentation: "https://python.langchain.com/docs/modules/data_connection/document_loaders/how_to/markdown" PyPDFLoader: - documentation: "" + documentation: "https://python.langchain.com/docs/modules/data_connection/document_loaders/how_to/pdf" UnstructuredPowerPointLoader: - documentation: "" + documentation: "https://python.langchain.com/docs/modules/data_connection/document_loaders/integrations/microsoft_powerpoint" SRTLoader: - documentation: "" + documentation: "https://python.langchain.com/docs/modules/data_connection/document_loaders/integrations/subtitle" TelegramChatLoader: - documentation: "" + documentation: "https://python.langchain.com/docs/modules/data_connection/document_loaders/integrations/telegram" TextLoader: - documentation: "" + documentation: "https://python.langchain.com/docs/modules/data_connection/document_loaders/" UnstructuredWordDocumentLoader: - documentation: "" + documentation: "https://python.langchain.com/docs/modules/data_connection/document_loaders/integrations/microsoft_word" WebBaseLoader: - documentation: "" + documentation: "https://python.langchain.com/docs/modules/data_connection/document_loaders/integrations/web_base" AZLyricsLoader: - documentation: "" + documentation: "https://python.langchain.com/docs/modules/data_connection/document_loaders/integrations/azlyrics" CollegeConfidentialLoader: - documentation: "" + documentation: "https://python.langchain.com/docs/modules/data_connection/document_loaders/integrations/college_confidential" HNLoader: - documentation: "" + documentation: "https://python.langchain.com/docs/modules/data_connection/document_loaders/integrations/hacker_news" IFixitLoader: - documentation: "" + documentation: "https://python.langchain.com/docs/modules/data_connection/document_loaders/integrations/ifixit" IMSDbLoader: - documentation: "" + documentation: "https://python.langchain.com/docs/modules/data_connection/document_loaders/integrations/imsdb" GitbookLoader: - documentation: "" + documentation: "https://python.langchain.com/docs/modules/data_connection/document_loaders/integrations/gitbook" ReadTheDocsLoader: - documentation: "" + documentation: "https://python.langchain.com/docs/modules/data_connection/document_loaders/integrations/readthedocs_documentation" SlackDirectoryLoader: - documentation: "" + documentation: "https://python.langchain.com/docs/modules/data_connection/document_loaders/integrations/slack" NotionDirectoryLoader: - documentation: "" + documentation: "https://python.langchain.com/docs/modules/data_connection/document_loaders/integrations/notion" DirectoryLoader: - documentation: "" + documentation: "https://python.langchain.com/docs/modules/data_connection/document_loaders/how_to/file_directory" GitLoader: - documentation: "" + documentation: "https://python.langchain.com/docs/modules/data_connection/document_loaders/integrations/git" embeddings: OpenAIEmbeddings: - documentation: "" + documentation: "https://python.langchain.com/docs/modules/data_connection/text_embedding/integrations/openai" HuggingFaceEmbeddings: - documentation: "" + documentation: "https://python.langchain.com/docs/modules/data_connection/text_embedding/integrations/sentence_transformers" CohereEmbeddings: - documentation: "" + documentation: "https://python.langchain.com/docs/modules/data_connection/text_embedding/integrations/cohere" llms: OpenAI: - documentation: "" + documentation: "https://python.langchain.com/docs/modules/model_io/models/llms/integrations/openai" ChatOpenAI: - documentation: "" + documentation: "https://python.langchain.com/docs/modules/model_io/models/chat/integrations/openai" LlamaCpp: documentation: "https://python.langchain.com/docs/modules/model_io/models/llms/integrations/llamacpp" CTransformers: @@ -116,7 +116,7 @@ llms: Anthropic: documentation: "" ChatAnthropic: - documentation: "" + documentation: "https://python.langchain.com/docs/modules/model_io/models/chat/integrations/anthropic" HuggingFaceHub: documentation: "https://python.langchain.com/docs/modules/model_io/models/llms/integrations/huggingface_hub" memories: From 87af22d0592d87bf9e0f54e4c2f265df5a8fdc8f Mon Sep 17 00:00:00 2001 From: Gabriel Luiz Freitas Almeida Date: Tue, 27 Jun 2023 07:33:01 -0300 Subject: [PATCH 029/169] =?UTF-8?q?=F0=9F=94=A8=20refactor(components):=20?= =?UTF-8?q?add=20info=20property=20to=20ParameterComponentType=20The=20Par?= =?UTF-8?q?ameterComponent=20now=20has=20an=20info=20icon=20and=20tooltip?= =?UTF-8?q?=20to=20show=20additional=20information=20about=20the=20paramet?= =?UTF-8?q?er.=20The=20GenericNode=20component=20now=20passes=20the=20info?= =?UTF-8?q?=20prop=20to=20the=20ParameterComponent=20to=20show=20the=20add?= =?UTF-8?q?itional=20information.=20The=20ParameterComponentType=20has=20b?= =?UTF-8?q?een=20refactored=20to=20include=20the=20info=20property.=20?= =?UTF-8?q?=F0=9F=8E=A8=20style(parameterComponent):=20add=20info=20icon?= =?UTF-8?q?=20and=20tooltip=20to=20show=20additional=20information=20?= =?UTF-8?q?=F0=9F=9A=80=20feat(GenericNode):=20pass=20info=20prop=20to=20P?= =?UTF-8?q?arameterComponent=20to=20show=20additional=20information?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../components/parameterComponent/index.tsx | 34 ++++++++++++++++++- .../src/CustomNodes/GenericNode/index.tsx | 1 + src/frontend/src/types/components/index.ts | 9 ++--- 3 files changed, 36 insertions(+), 8 deletions(-) diff --git a/src/frontend/src/CustomNodes/GenericNode/components/parameterComponent/index.tsx b/src/frontend/src/CustomNodes/GenericNode/components/parameterComponent/index.tsx index 4347b88ca..0701bfcd4 100644 --- a/src/frontend/src/CustomNodes/GenericNode/components/parameterComponent/index.tsx +++ b/src/frontend/src/CustomNodes/GenericNode/components/parameterComponent/index.tsx @@ -25,6 +25,7 @@ import { nodeColors } from "../../../../utils"; import ShadTooltip from "../../../../components/ShadTooltipComponent"; import { PopUpContext } from "../../../../contexts/popUpContext"; import ToggleShadComponent from "../../../../components/toggleShadComponent"; +import { Info } from "lucide-react"; export default function ParameterComponent({ left, @@ -36,9 +37,11 @@ export default function ParameterComponent({ type, name = "", required = false, + info = "", }: ParameterComponentType) { const ref = useRef(null); const refHtml = useRef(null); + const infoHtml = useRef(null); const updateNodeInternals = useUpdateNodeInternals(); const [position, setPosition] = useState(0); const { closePopUp } = useContext(PopUpContext); @@ -79,6 +82,18 @@ export default function ParameterComponent({ }); }; + useEffect(() => { + infoHtml.current = ( +
+ {info.split("\n").map((line, i) => ( +

+ {line} +

+ ))} +
+ ); + }, [info]); + useEffect(() => { const groupedObj = groupByFamily(myData, tooltipTitle); @@ -126,8 +141,25 @@ export default function ParameterComponent({ className="w-full flex flex-wrap justify-between items-center bg-muted dark:bg-gray-800 dark:text-white mt-1 px-5 py-2" > <> -
+
{title} +
+ {info !== "" && ( + + + + )} +
{required ? " *" : ""}
{left && diff --git a/src/frontend/src/CustomNodes/GenericNode/index.tsx b/src/frontend/src/CustomNodes/GenericNode/index.tsx index 743339a48..40a306ce6 100644 --- a/src/frontend/src/CustomNodes/GenericNode/index.tsx +++ b/src/frontend/src/CustomNodes/GenericNode/index.tsx @@ -244,6 +244,7 @@ export default function GenericNode({ ? toTitleCase(data.node.template[t].name) : toTitleCase(t) } + info={data.node.template[t].info} name={t} tooltipTitle={data.node.template[t].type} required={data.node.template[t].required} diff --git a/src/frontend/src/types/components/index.ts b/src/frontend/src/types/components/index.ts index 630526193..b1570ddda 100644 --- a/src/frontend/src/types/components/index.ts +++ b/src/frontend/src/types/components/index.ts @@ -1,10 +1,4 @@ -import { - ComponentType, - ForwardRefExoticComponent, - ReactElement, - ReactNode, - SVGProps, -} from "react"; +import { ReactElement, ReactNode } from "react"; import { NodeDataType } from "../flow/index"; import { typesContextType } from "../typesContext"; export type InputComponentType = { @@ -41,6 +35,7 @@ export type ParameterComponentType = { name?: string; tooltipTitle: string; dataContext?: typesContextType; + info?: string; }; export type InputListComponentType = { value: string[]; From 415bee73847e66b749ef3d2cb19cfc1720c5591d Mon Sep 17 00:00:00 2001 From: Gabriel Luiz Freitas Almeida Date: Tue, 27 Jun 2023 07:33:35 -0300 Subject: [PATCH 030/169] =?UTF-8?q?=F0=9F=94=A7=20chore(base.py,=20constan?= =?UTF-8?q?ts.py,=20llms.py):=20add=20info=20field=20to=20TemplateField=20?= =?UTF-8?q?and=20OPENAI=5FAPI=5FBASE=5FINFO=20constant=20The=20`info`=20fi?= =?UTF-8?q?eld=20is=20added=20to=20the=20`TemplateField`=20class=20to=20pr?= =?UTF-8?q?ovide=20additional=20information=20about=20the=20field.=20The?= =?UTF-8?q?=20`OPENAI=5FAPI=5FBASE=5FINFO`=20constant=20is=20added=20to=20?= =?UTF-8?q?the=20`constants.py`=20file=20to=20provide=20information=20abou?= =?UTF-8?q?t=20the=20base=20URL=20of=20the=20OpenAI=20API=20and=20how=20it?= =?UTF-8?q?=20can=20be=20changed=20to=20use=20other=20APIs=20like=20Prem?= =?UTF-8?q?=20and=20LocalAI.=20The=20`info`=20field=20is=20set=20to=20`OPE?= =?UTF-8?q?NAI=5FAPI=5FBASE=5FINFO`=20for=20the=20`openai=5Fapi=5Fbase`=20?= =?UTF-8?q?field=20in=20the=20`LLMFrontendNode`=20class=20in=20`llms.py`.?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/backend/langflow/template/field/base.py | 1 + .../langflow/template/frontend_node/constants.py | 10 ++++++++++ src/backend/langflow/template/frontend_node/llms.py | 4 ++++ 3 files changed, 15 insertions(+) diff --git a/src/backend/langflow/template/field/base.py b/src/backend/langflow/template/field/base.py index a9c18ff63..fdfdca562 100644 --- a/src/backend/langflow/template/field/base.py +++ b/src/backend/langflow/template/field/base.py @@ -21,6 +21,7 @@ class TemplateFieldCreator(BaseModel, ABC): name: str = "" display_name: Optional[str] = None advanced: bool = False + info: Optional[str] = "" def to_dict(self): result = self.dict() diff --git a/src/backend/langflow/template/frontend_node/constants.py b/src/backend/langflow/template/frontend_node/constants.py index 20b8a0c61..ac2e400b3 100644 --- a/src/backend/langflow/template/frontend_node/constants.py +++ b/src/backend/langflow/template/frontend_node/constants.py @@ -32,3 +32,13 @@ You are a good listener and you can talk about anything. HUMAN_PROMPT = "{input}" QA_CHAIN_TYPES = ["stuff", "map_reduce", "map_rerank", "refine"] + + +# This variable is used to tell the user +# that it can be changed to use other APIs +# like Prem and LocalAI +OPENAI_API_BASE_INFO = """ +The base URL of the OpenAI API. Defaults to https://api.openai.com/v1. + +You can change this to use other APIs like Prem and LocalAI. +""" diff --git a/src/backend/langflow/template/frontend_node/llms.py b/src/backend/langflow/template/frontend_node/llms.py index 272e42c7f..65bffc303 100644 --- a/src/backend/langflow/template/frontend_node/llms.py +++ b/src/backend/langflow/template/frontend_node/llms.py @@ -2,6 +2,7 @@ from typing import Optional from langflow.template.field.base import TemplateField from langflow.template.frontend_node.base import FrontendNode +from langflow.template.frontend_node.constants import OPENAI_API_BASE_INFO class LLMFrontendNode(FrontendNode): @@ -15,6 +16,9 @@ class LLMFrontendNode(FrontendNode): if "key" not in field.name.lower() and "token" not in field.name.lower(): field.password = False + if field.name == "openai_api_base": + field.info = OPENAI_API_BASE_INFO + @staticmethod def format_azure_field(field: TemplateField): if field.name == "model_name": From 0d84d196573f3b620c8431ab080cfe4bd1f389f4 Mon Sep 17 00:00:00 2001 From: Gabriel Luiz Freitas Almeida Date: Tue, 27 Jun 2023 07:44:20 -0300 Subject: [PATCH 031/169] =?UTF-8?q?=F0=9F=93=9D=20docs(constants.py):=20up?= =?UTF-8?q?date=20OpenAI=20API=20base=20info=20to=20include=20additional?= =?UTF-8?q?=20API=20options=20This=20commit=20updates=20the=20documentatio?= =?UTF-8?q?n=20in=20the=20constants.py=20file=20to=20include=20additional?= =?UTF-8?q?=20API=20options=20that=20can=20be=20used=20instead=20of=20the?= =?UTF-8?q?=20default=20OpenAI=20API.=20The=20new=20options=20are=20JinaCh?= =?UTF-8?q?at,=20LocalAI,=20and=20Prem.=20This=20change=20provides=20more?= =?UTF-8?q?=20information=20to=20the=20user=20and=20allows=20them=20to=20m?= =?UTF-8?q?ake=20an=20informed=20decision=20when=20choosing=20an=20API=20t?= =?UTF-8?q?o=20use.?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/backend/langflow/template/frontend_node/constants.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/backend/langflow/template/frontend_node/constants.py b/src/backend/langflow/template/frontend_node/constants.py index ac2e400b3..d30239ff7 100644 --- a/src/backend/langflow/template/frontend_node/constants.py +++ b/src/backend/langflow/template/frontend_node/constants.py @@ -40,5 +40,5 @@ QA_CHAIN_TYPES = ["stuff", "map_reduce", "map_rerank", "refine"] OPENAI_API_BASE_INFO = """ The base URL of the OpenAI API. Defaults to https://api.openai.com/v1. -You can change this to use other APIs like Prem and LocalAI. +You can change this to use other APIs like JinaChat, LocalAI and Prem. """ From f78088bdb24dbd2c0ef3eb4d6429098618c15a2c Mon Sep 17 00:00:00 2001 From: Gabriel Luiz Freitas Almeida Date: Tue, 27 Jun 2023 09:44:20 -0300 Subject: [PATCH 032/169] =?UTF-8?q?=F0=9F=94=A7=20refactor(=5F=5Fmain=5F?= =?UTF-8?q?=5F.py,=20main.py):=20move=20setup=5Fstatic=5Ffiles=20function?= =?UTF-8?q?=20to=20main.py=20and=20rename=20create=5Fapp=20to=20setup=5Fap?= =?UTF-8?q?p=20=E2=9C=A8=20feat(=5F=5Fmain=5F=5F.py,=20main.py):=20add=20s?= =?UTF-8?q?upport=20for=20a=20custom=20static=20files=20directory=20to=20b?= =?UTF-8?q?e=20passed=20as=20an=20argument=20to=20the=20app=20The=20`setup?= =?UTF-8?q?=5Fstatic=5Ffiles`=20function=20has=20been=20moved=20from=20`?= =?UTF-8?q?=5F=5Fmain=5F=5F.py`=20to=20`main.py`=20to=20improve=20code=20o?= =?UTF-8?q?rganization.=20The=20function=20has=20also=20been=20renamed=20t?= =?UTF-8?q?o=20`setup=5Fapp`=20to=20better=20reflect=20its=20purpose.=20Th?= =?UTF-8?q?e=20`create=5Fapp`=20function=20has=20been=20renamed=20to=20`se?= =?UTF-8?q?tup=5Fapp`=20to=20follow=20the=20naming=20convention=20of=20the?= =?UTF-8?q?=20new=20function.=20The=20`setup=5Fapp`=20function=20now=20acc?= =?UTF-8?q?epts=20an=20optional=20argument=20`static=5Ffiles=5Fdir`=20whic?= =?UTF-8?q?h=20allows=20the=20user=20to=20specify=20a=20custom=20directory?= =?UTF-8?q?=20for=20static=20files.=20This=20improves=20the=20flexibility?= =?UTF-8?q?=20of=20the=20app=20as=20it=20can=20now=20be=20run=20with=20a?= =?UTF-8?q?=20custom=20frontend.?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/backend/langflow/__main__.py | 40 ++++---------------------------- src/backend/langflow/main.py | 40 ++++++++++++++++++++++++++++++++ 2 files changed, 44 insertions(+), 36 deletions(-) diff --git a/src/backend/langflow/__main__.py b/src/backend/langflow/__main__.py index a3841ec93..377339c98 100644 --- a/src/backend/langflow/__main__.py +++ b/src/backend/langflow/__main__.py @@ -1,6 +1,5 @@ import sys import time -from fastapi import FastAPI import httpx from multiprocess import Process, cpu_count # type: ignore import platform @@ -11,9 +10,7 @@ from rich.panel import Panel from rich import box from rich import print as rprint import typer -from fastapi.staticfiles import StaticFiles -from fastapi.responses import FileResponse -from langflow.main import create_app +from langflow.main import setup_app from langflow.settings import settings from langflow.utils.logger import configure, logger import webbrowser @@ -144,15 +141,9 @@ def serve( remove_api_keys=remove_api_keys, cache=cache, ) - # get the directory of the current file - if not path: - frontend_path = Path(__file__).parent - static_files_dir = frontend_path / "frontend" - else: - static_files_dir = Path(path) - - app = create_app() - setup_static_files(app, static_files_dir) + # create path object if path is provided + path = Path(path) if path else path + app = setup_app(static_files_dir=path) # check if port is being used if is_port_in_use(port, host): port = get_free_port(port) @@ -200,29 +191,6 @@ def run_on_windows(host, port, log_level, options, app): run_langflow(host, port, log_level, options, app) -def setup_static_files(app: FastAPI, static_files_dir: Path): - """ - Setup the static files directory. - - Args: - app (FastAPI): FastAPI app. - path (str): Path to the static files directory. - """ - app.mount( - "/", - StaticFiles(directory=static_files_dir, html=True), - name="static", - ) - - @app.exception_handler(404) - async def custom_404_handler(request, __): - path = static_files_dir / "index.html" - - if not path.exists(): - raise RuntimeError(f"File at path {path} does not exist.") - return FileResponse(path) - - def is_port_in_use(port, host="localhost"): """ Check if a port is in use. diff --git a/src/backend/langflow/main.py b/src/backend/langflow/main.py index 2a1293f2e..e937931d6 100644 --- a/src/backend/langflow/main.py +++ b/src/backend/langflow/main.py @@ -1,5 +1,9 @@ +from pathlib import Path +from typing import Optional from fastapi import FastAPI from fastapi.middleware.cors import CORSMiddleware +from fastapi.responses import FileResponse +from fastapi.staticfiles import StaticFiles from langflow.api import router from langflow.database.base import create_db_and_tables @@ -33,6 +37,42 @@ def create_app(): return app +def setup_static_files(app: FastAPI, static_files_dir: Path): + """ + Setup the static files directory. + Args: + app (FastAPI): FastAPI app. + path (str): Path to the static files directory. + """ + app.mount( + "/", + StaticFiles(directory=static_files_dir, html=True), + name="static", + ) + + @app.exception_handler(404) + async def custom_404_handler(request, __): + path = static_files_dir / "index.html" + + if not path.exists(): + raise RuntimeError(f"File at path {path} does not exist.") + return FileResponse(path) + + +# app = create_app() +# setup_static_files(app, static_files_dir) +def setup_app(static_files_dir: Optional[Path]) -> FastAPI: + """Setup the FastAPI app.""" + # get the directory of the current file + if not static_files_dir: + frontend_path = Path(__file__).parent + static_files_dir = frontend_path / "frontend" + + app = create_app() + setup_static_files(app, static_files_dir) + return app + + app = create_app() From c86f72e7a622828ff6c0ae512ce444c79cf003dc Mon Sep 17 00:00:00 2001 From: Gabriel Luiz Freitas Almeida Date: Tue, 27 Jun 2023 10:11:39 -0300 Subject: [PATCH 033/169] =?UTF-8?q?=F0=9F=8E=89=20feat(config.py):=20add?= =?UTF-8?q?=20ChatConfig=20class=20with=20streaming=20attribute=20set=20to?= =?UTF-8?q?=20True=20The=20ChatConfig=20class=20is=20added=20to=20the=20pr?= =?UTF-8?q?oject=20with=20a=20single=20attribute,=20streaming,=20set=20to?= =?UTF-8?q?=20True.=20This=20attribute=20is=20used=20to=20determine=20whet?= =?UTF-8?q?her=20the=20chatbot=20should=20use=20streaming=20or=20request-r?= =?UTF-8?q?esponse=20communication=20with=20the=20client.?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/backend/langflow/chat/config.py | 2 ++ 1 file changed, 2 insertions(+) create mode 100644 src/backend/langflow/chat/config.py diff --git a/src/backend/langflow/chat/config.py b/src/backend/langflow/chat/config.py new file mode 100644 index 000000000..274f4d5bd --- /dev/null +++ b/src/backend/langflow/chat/config.py @@ -0,0 +1,2 @@ +class ChatConfig: + streaming: bool = True From 7c6845b15eb101f80f13d6395169dbebe77c5ffb Mon Sep 17 00:00:00 2001 From: Gabriel Luiz Freitas Almeida Date: Tue, 27 Jun 2023 10:16:19 -0300 Subject: [PATCH 034/169] =?UTF-8?q?=F0=9F=94=A7=20chore(loading.py):=20add?= =?UTF-8?q?=20instantiate=5Fllm=20function=20to=20handle=20LLM=20instantia?= =?UTF-8?q?tion=20and=20set=20ChatConfig.streaming=20based=20on=20openai?= =?UTF-8?q?=5Fapi=5Fbase=20parameter=20This=20commit=20adds=20a=20new=20fu?= =?UTF-8?q?nction=20`instantiate=5Fllm`=20to=20handle=20LLM=20(Language=20?= =?UTF-8?q?Model)=20instantiation.=20It=20also=20sets=20the=20`ChatConfig.?= =?UTF-8?q?streaming`=20attribute=20based=20on=20the=20`openai=5Fapi=5Fbas?= =?UTF-8?q?e`=20parameter.=20This=20is=20a=20workaround=20to=20ensure=20th?= =?UTF-8?q?at=20JinaChat=20works=20until=20streaming=20is=20implemented.?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../langflow/interface/initialize/loading.py | 13 +++++++++++++ 1 file changed, 13 insertions(+) diff --git a/src/backend/langflow/interface/initialize/loading.py b/src/backend/langflow/interface/initialize/loading.py index 756588058..cfa5b5717 100644 --- a/src/backend/langflow/interface/initialize/loading.py +++ b/src/backend/langflow/interface/initialize/loading.py @@ -6,6 +6,7 @@ from langchain.agents import agent as agent_module from langchain.agents.agent import AgentExecutor from langchain.agents.agent_toolkits.base import BaseToolkit from langchain.agents.tools import BaseTool + from langflow.interface.initialize.vector_store import vecstore_initializer from pydantic import ValidationError @@ -20,6 +21,7 @@ from langchain.chains.base import Chain from langchain.vectorstores.base import VectorStore from langchain.document_loaders.base import BaseLoader from langchain.prompts.base import BasePromptTemplate +from langflow.chat.config import ChatConfig def instantiate_class(node_type: str, base_type: str, params: Dict) -> Any: @@ -76,10 +78,21 @@ def instantiate_based_on_type(class_object, base_type, node_type, params): return instantiate_utility(node_type, class_object, params) elif base_type == "chains": return instantiate_chains(node_type, class_object, params) + elif base_type == "llms": + return instantiate_llm(node_type, class_object, params) else: return class_object(**params) +def instantiate_llm(node_type, class_object, params: Dict): + # This is a workaround so JinaChat works until streaming is implemented + # if "openai_api_base" in params and "jina" in params["openai_api_base"]: + # False if condition is True + ChatConfig.streaming = "jina" not in params.get("openai_api_base", "") + + return class_object(**params) + + def instantiate_chains(node_type, class_object: Type[Chain], params: Dict): if "retriever" in params and hasattr(params["retriever"], "as_retriever"): params["retriever"] = params["retriever"].as_retriever() From b741853454370f4dbb4f4de254a4741f4af4c077 Mon Sep 17 00:00:00 2001 From: Gabriel Luiz Freitas Almeida Date: Tue, 27 Jun 2023 10:16:41 -0300 Subject: [PATCH 035/169] =?UTF-8?q?=F0=9F=94=A7=20chore(utils.py):=20use?= =?UTF-8?q?=20ChatConfig=20to=20set=20streaming=20option=20The=20first=20c?= =?UTF-8?q?hange=20removes=20an=20extra=20blank=20line=20in=20the=20ChatMa?= =?UTF-8?q?nager=20class.=20The=20second=20change=20updates=20the=20try=5F?= =?UTF-8?q?setting=5Fstreaming=5Foptions=20function=20to=20use=20the=20Cha?= =?UTF-8?q?tConfig=20class=20to=20set=20the=20streaming=20option=20instead?= =?UTF-8?q?=20of=20hardcoding=20it.=20This=20makes=20the=20code=20more=20m?= =?UTF-8?q?odular=20and=20easier=20to=20maintain.?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/backend/langflow/chat/manager.py | 2 ++ src/backend/langflow/interface/utils.py | 6 ++++-- 2 files changed, 6 insertions(+), 2 deletions(-) diff --git a/src/backend/langflow/chat/manager.py b/src/backend/langflow/chat/manager.py index 4a1b8e77c..b693e00a3 100644 --- a/src/backend/langflow/chat/manager.py +++ b/src/backend/langflow/chat/manager.py @@ -209,3 +209,5 @@ class ChatManager: except Exception as e: logger.error(e) self.disconnect(client_id) + + diff --git a/src/backend/langflow/interface/utils.py b/src/backend/langflow/interface/utils.py index 8d45aa1b1..ff89e92bf 100644 --- a/src/backend/langflow/interface/utils.py +++ b/src/backend/langflow/interface/utils.py @@ -4,10 +4,12 @@ import os from io import BytesIO import re + import yaml from langchain.base_language import BaseLanguageModel from PIL.Image import Image from langflow.utils.logger import logger +from langflow.chat.config import ChatConfig def load_file_into_dict(file_path: str) -> dict: @@ -49,9 +51,9 @@ def try_setting_streaming_options(langchain_object, websocket): if isinstance(llm, BaseLanguageModel): if hasattr(llm, "streaming") and isinstance(llm.streaming, bool): - llm.streaming = True + llm.streaming = ChatConfig.streaming elif hasattr(llm, "stream") and isinstance(llm.stream, bool): - llm.stream = True + llm.stream = ChatConfig.streaming return langchain_object From 93c3f7a2a6279b696ddec97dd12f8752a2359fe7 Mon Sep 17 00:00:00 2001 From: Gabriel Luiz Freitas Almeida Date: Tue, 27 Jun 2023 11:09:26 -0300 Subject: [PATCH 036/169] =?UTF-8?q?=E2=9C=A8=20feat(=5F=5Fmain=5F=5F.py):?= =?UTF-8?q?=20add=20optional=20static=5Ffiles=5Fdir=20parameter=20to=20set?= =?UTF-8?q?up=5Fapp=20function=20The=20variable=20name=20static=5Ffiles=5F?= =?UTF-8?q?dir=20was=20changed=20to=20improve=20semantics.=20It=20is=20now?= =?UTF-8?q?=20more=20clear=20that=20it=20is=20a=20directory=20path.=20An?= =?UTF-8?q?=20optional=20static=5Ffiles=5Fdir=20parameter=20was=20added=20?= =?UTF-8?q?to=20the=20setup=5Fapp=20function=20to=20allow=20for=20a=20dire?= =?UTF-8?q?ctory=20path=20to=20be=20passed=20in.=20This=20allows=20for=20m?= =?UTF-8?q?ore=20flexibility=20in=20serving=20static=20files.=20?= =?UTF-8?q?=F0=9F=90=9B=20fix(=5F=5Fmain=5F=5F.py):=20fix=20static=5Ffiles?= =?UTF-8?q?=5Fdir=20variable=20name=20to=20improve=20semantics?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/backend/langflow/__main__.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/backend/langflow/__main__.py b/src/backend/langflow/__main__.py index 377339c98..9980a5d2f 100644 --- a/src/backend/langflow/__main__.py +++ b/src/backend/langflow/__main__.py @@ -142,8 +142,8 @@ def serve( cache=cache, ) # create path object if path is provided - path = Path(path) if path else path - app = setup_app(static_files_dir=path) + static_files_dir: Optional[Path] = Path(path) if path else None + app = setup_app(static_files_dir=static_files_dir) # check if port is being used if is_port_in_use(port, host): port = get_free_port(port) From 23cf37eee5f910a783754bed9cf1eb0f3dc6b7a8 Mon Sep 17 00:00:00 2001 From: Gabriel Luiz Freitas Almeida Date: Tue, 27 Jun 2023 13:21:40 -0300 Subject: [PATCH 037/169] =?UTF-8?q?=F0=9F=94=96=20chore(pyproject.toml):?= =?UTF-8?q?=20update=20package=20version=20to=200.2.3=20=F0=9F=94=A5=20ref?= =?UTF-8?q?actor(manager.py):=20remove=20unnecessary=20blank=20line=20at?= =?UTF-8?q?=20the=20end=20of=20the=20file=20The=20package=20version=20has?= =?UTF-8?q?=20been=20updated=20to=200.2.3=20in=20the=20pyproject.toml=20fi?= =?UTF-8?q?le.=20This=20is=20a=20chore=20as=20it=20does=20not=20affect=20t?= =?UTF-8?q?he=20functionality=20of=20the=20package.=20The=20blank=20line?= =?UTF-8?q?=20at=20the=20end=20of=20the=20manager.py=20file=20has=20been?= =?UTF-8?q?=20removed=20as=20it=20is=20unnecessary=20and=20does=20not=20ad?= =?UTF-8?q?d=20any=20value=20to=20the=20code.=20This=20is=20a=20refactor?= =?UTF-8?q?=20as=20it=20improves=20the=20code=20readability.?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- poetry.lock | 12 ++++++------ pyproject.toml | 2 +- src/backend/langflow/chat/manager.py | 2 -- 3 files changed, 7 insertions(+), 9 deletions(-) diff --git a/poetry.lock b/poetry.lock index b13392910..b854f5c2e 100644 --- a/poetry.lock +++ b/poetry.lock @@ -1565,14 +1565,14 @@ uritemplate = ">=3.0.1,<5" [[package]] name = "google-auth" -version = "2.20.0" +version = "2.21.0" description = "Google Authentication Library" category = "main" optional = false python-versions = ">=3.6" files = [ - {file = "google-auth-2.20.0.tar.gz", hash = "sha256:030af34138909ccde0fbce611afc178f1d65d32fbff281f25738b1fe1c6f3eaa"}, - {file = "google_auth-2.20.0-py2.py3-none-any.whl", hash = "sha256:23b7b0950fcda519bfb6692bf0d5289d2ea49fc143717cc7188458ec620e63fa"}, + {file = "google-auth-2.21.0.tar.gz", hash = "sha256:b28e8048e57727e7cf0e5bd8e7276b212aef476654a09511354aa82753b45c66"}, + {file = "google_auth-2.21.0-py2.py3-none-any.whl", hash = "sha256:da3f18d074fa0f5a7061d99b9af8cee3aa6189c987af7c1b07d94566b6b11268"}, ] [package.dependencies] @@ -4977,14 +4977,14 @@ files = [ [[package]] name = "pywin32-ctypes" -version = "0.2.1" +version = "0.2.2" description = "A (partial) reimplementation of pywin32 using ctypes/cffi" category = "main" optional = false python-versions = ">=3.6" files = [ - {file = "pywin32-ctypes-0.2.1.tar.gz", hash = "sha256:934a2def1e5cbc472b2b6bf80680c0f03cd87df65dfd58bfd1846969de095b03"}, - {file = "pywin32_ctypes-0.2.1-py3-none-any.whl", hash = "sha256:b9a53ef754c894a525469933ab2a447c74ec1ea6b9d2ef446f40ec50d3dcec9f"}, + {file = "pywin32-ctypes-0.2.2.tar.gz", hash = "sha256:3426e063bdd5fd4df74a14fa3cf80a0b42845a87e1d1e81f6549f9daec593a60"}, + {file = "pywin32_ctypes-0.2.2-py3-none-any.whl", hash = "sha256:bf490a1a709baf35d688fe0ecf980ed4de11d2b3e37b51e5442587a75d9957e7"}, ] [[package]] diff --git a/pyproject.toml b/pyproject.toml index da75b0207..4fc5e3ce3 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -1,6 +1,6 @@ [tool.poetry] name = "langflow" -version = "0.2.2" +version = "0.2.3" description = "A Python package with a built-in web application" authors = ["Logspace "] maintainers = [ diff --git a/src/backend/langflow/chat/manager.py b/src/backend/langflow/chat/manager.py index b693e00a3..4a1b8e77c 100644 --- a/src/backend/langflow/chat/manager.py +++ b/src/backend/langflow/chat/manager.py @@ -209,5 +209,3 @@ class ChatManager: except Exception as e: logger.error(e) self.disconnect(client_id) - - From 1880484a6ca5b496bd2941ab6bed2b443b2cda53 Mon Sep 17 00:00:00 2001 From: Gabriel Luiz Freitas Almeida Date: Tue, 27 Jun 2023 13:25:59 -0300 Subject: [PATCH 038/169] fix: add info field to tests --- tests/test_agents_template.py | 10 ++++++++++ tests/test_chains_template.py | 21 +++++++++++++++++++++ tests/test_llms_template.py | 29 +++++++++++++++++++++++++++++ tests/test_prompts_template.py | 9 +++++++++ 4 files changed, 69 insertions(+) diff --git a/tests/test_agents_template.py b/tests/test_agents_template.py index 0497283b9..bf89f9996 100644 --- a/tests/test_agents_template.py +++ b/tests/test_agents_template.py @@ -26,6 +26,7 @@ def test_zero_shot_agent(client: TestClient): "type": "LLMChain", "list": False, "advanced": False, + "info": "", } assert template["allowed_tools"] == { "required": False, @@ -37,6 +38,7 @@ def test_zero_shot_agent(client: TestClient): "type": "Tool", "list": True, "advanced": False, + "info": "", } @@ -60,6 +62,7 @@ def test_json_agent(client: TestClient): "type": "BaseToolkit", "list": False, "advanced": False, + "info": "", } assert template["llm"] == { "required": True, @@ -72,6 +75,7 @@ def test_json_agent(client: TestClient): "list": False, "advanced": False, "display_name": "LLM", + "info": "", } @@ -99,6 +103,7 @@ def test_csv_agent(client: TestClient): "list": False, "file_path": None, "advanced": False, + "info": "", } assert template["llm"] == { "required": True, @@ -111,6 +116,7 @@ def test_csv_agent(client: TestClient): "list": False, "advanced": False, "display_name": "LLM", + "info": "", } @@ -143,6 +149,7 @@ def test_initialize_agent(client: TestClient): "type": "str", "list": True, "advanced": False, + "info": "", } assert template["memory"] == { "required": False, @@ -154,6 +161,7 @@ def test_initialize_agent(client: TestClient): "type": "BaseChatMemory", "list": False, "advanced": False, + "info": "", } assert template["tools"] == { "required": False, @@ -165,6 +173,7 @@ def test_initialize_agent(client: TestClient): "type": "Tool", "list": True, "advanced": False, + "info": "", } assert template["llm"] == { "required": True, @@ -177,4 +186,5 @@ def test_initialize_agent(client: TestClient): "list": False, "advanced": False, "display_name": "LLM", + "info": "", } diff --git a/tests/test_chains_template.py b/tests/test_chains_template.py index cba973272..63e236018 100644 --- a/tests/test_chains_template.py +++ b/tests/test_chains_template.py @@ -38,6 +38,7 @@ def test_conversation_chain(client: TestClient): "type": "BaseMemory", "list": False, "advanced": False, + "info": "", } assert template["verbose"] == { "required": False, @@ -49,6 +50,7 @@ def test_conversation_chain(client: TestClient): "type": "bool", "list": False, "advanced": True, + "info": "", } assert template["llm"] == { "required": True, @@ -60,6 +62,7 @@ def test_conversation_chain(client: TestClient): "type": "BaseLanguageModel", "list": False, "advanced": False, + "info": "", } assert template["input_key"] == { "required": True, @@ -72,6 +75,7 @@ def test_conversation_chain(client: TestClient): "type": "str", "list": False, "advanced": True, + "info": "", } assert template["output_key"] == { "required": True, @@ -84,6 +88,7 @@ def test_conversation_chain(client: TestClient): "type": "str", "list": False, "advanced": True, + "info": "", } assert template["_type"] == "ConversationChain" @@ -120,6 +125,7 @@ def test_llm_chain(client: TestClient): "type": "BaseMemory", "list": False, "advanced": False, + "info": "", } assert template["verbose"] == { "required": False, @@ -132,6 +138,7 @@ def test_llm_chain(client: TestClient): "type": "bool", "list": False, "advanced": True, + "info": "", } assert template["llm"] == { "required": True, @@ -143,6 +150,7 @@ def test_llm_chain(client: TestClient): "type": "BaseLanguageModel", "list": False, "advanced": False, + "info": "", } assert template["output_key"] == { "required": True, @@ -155,6 +163,7 @@ def test_llm_chain(client: TestClient): "type": "str", "list": False, "advanced": True, + "info": "", } @@ -184,6 +193,7 @@ def test_llm_checker_chain(client: TestClient): "type": "BaseLanguageModel", "list": False, "advanced": False, + "info": "", } assert template["_type"] == "LLMCheckerChain" @@ -217,6 +227,7 @@ def test_llm_math_chain(client: TestClient): "type": "BaseMemory", "list": False, "advanced": False, + "info": "", } assert template["verbose"] == { "required": False, @@ -229,6 +240,7 @@ def test_llm_math_chain(client: TestClient): "type": "bool", "list": False, "advanced": True, + "info": "", } assert template["llm"] == { "required": True, @@ -240,6 +252,7 @@ def test_llm_math_chain(client: TestClient): "type": "BaseLanguageModel", "list": False, "advanced": False, + "info": "", } assert template["input_key"] == { "required": True, @@ -252,6 +265,7 @@ def test_llm_math_chain(client: TestClient): "type": "str", "list": False, "advanced": True, + "info": "", } assert template["output_key"] == { "required": True, @@ -264,6 +278,7 @@ def test_llm_math_chain(client: TestClient): "type": "str", "list": False, "advanced": True, + "info": "", } assert template["_type"] == "LLMMathChain" @@ -304,6 +319,7 @@ def test_series_character_chain(client: TestClient): "type": "BaseLanguageModel", "list": False, "advanced": False, + "info": "", } assert template["character"] == { "required": True, @@ -315,6 +331,7 @@ def test_series_character_chain(client: TestClient): "type": "str", "list": False, "advanced": False, + "info": "", } assert template["series"] == { "required": True, @@ -326,6 +343,7 @@ def test_series_character_chain(client: TestClient): "type": "str", "list": False, "advanced": False, + "info": "", } assert template["_type"] == "SeriesCharacterChain" @@ -367,6 +385,7 @@ def test_mid_journey_prompt_chain(client: TestClient): "type": "BaseLanguageModel", "list": False, "advanced": False, + "info": "", } # Test the description object assert ( @@ -406,6 +425,7 @@ def test_time_travel_guide_chain(client: TestClient): "type": "BaseLanguageModel", "list": False, "advanced": False, + "info": "", } assert template["memory"] == { "required": False, @@ -417,6 +437,7 @@ def test_time_travel_guide_chain(client: TestClient): "type": "BaseChatMemory", "list": False, "advanced": False, + "info": "", } assert chain["description"] == "Time travel guide chain." diff --git a/tests/test_llms_template.py b/tests/test_llms_template.py index 3f8c09079..859b722e1 100644 --- a/tests/test_llms_template.py +++ b/tests/test_llms_template.py @@ -121,6 +121,7 @@ def test_openai(client: TestClient): "type": "bool", "list": False, "advanced": False, + "info": "", } assert template["verbose"] == { "required": False, @@ -132,6 +133,7 @@ def test_openai(client: TestClient): "type": "bool", "list": False, "advanced": False, + "info": "", } assert template["client"] == { "required": False, @@ -143,6 +145,7 @@ def test_openai(client: TestClient): "type": "Any", "list": False, "advanced": False, + "info": "", } assert template["model_name"] == { "required": False, @@ -162,6 +165,7 @@ def test_openai(client: TestClient): "type": "str", "list": True, "advanced": False, + "info": "", } # Add more assertions for other properties here assert template["temperature"] == { @@ -175,6 +179,7 @@ def test_openai(client: TestClient): "type": "float", "list": False, "advanced": False, + "info": "", } assert template["max_tokens"] == { "required": False, @@ -187,6 +192,7 @@ def test_openai(client: TestClient): "type": "int", "list": False, "advanced": False, + "info": "", } assert template["top_p"] == { "required": False, @@ -199,6 +205,7 @@ def test_openai(client: TestClient): "type": "float", "list": False, "advanced": False, + "info": "", } assert template["frequency_penalty"] == { "required": False, @@ -211,6 +218,7 @@ def test_openai(client: TestClient): "type": "float", "list": False, "advanced": False, + "info": "", } assert template["presence_penalty"] == { "required": False, @@ -223,6 +231,7 @@ def test_openai(client: TestClient): "type": "float", "list": False, "advanced": False, + "info": "", } assert template["n"] == { "required": False, @@ -235,6 +244,7 @@ def test_openai(client: TestClient): "type": "int", "list": False, "advanced": False, + "info": "", } assert template["best_of"] == { "required": False, @@ -247,6 +257,7 @@ def test_openai(client: TestClient): "type": "int", "list": False, "advanced": False, + "info": "", } assert template["model_kwargs"] == { "required": False, @@ -258,6 +269,7 @@ def test_openai(client: TestClient): "type": "code", "list": False, "advanced": True, + "info": "", } assert template["openai_api_key"] == { "required": False, @@ -271,6 +283,7 @@ def test_openai(client: TestClient): "type": "str", "list": False, "advanced": False, + "info": "", } assert template["batch_size"] == { "required": False, @@ -283,6 +296,7 @@ def test_openai(client: TestClient): "type": "int", "list": False, "advanced": False, + "info": "", } assert template["request_timeout"] == { "required": False, @@ -294,6 +308,7 @@ def test_openai(client: TestClient): "type": "float", "list": False, "advanced": False, + "info": "", } assert template["logit_bias"] == { "required": False, @@ -305,6 +320,7 @@ def test_openai(client: TestClient): "type": "code", "list": False, "advanced": False, + "info": "", } assert template["max_retries"] == { "required": False, @@ -317,6 +333,7 @@ def test_openai(client: TestClient): "type": "int", "list": False, "advanced": False, + "info": "", } assert template["streaming"] == { "required": False, @@ -329,6 +346,7 @@ def test_openai(client: TestClient): "type": "bool", "list": False, "advanced": False, + "info": "", } @@ -352,6 +370,7 @@ def test_chat_open_ai(client: TestClient): "type": "bool", "list": False, "advanced": False, + "info": "", } assert template["client"] == { "required": False, @@ -363,6 +382,7 @@ def test_chat_open_ai(client: TestClient): "type": "Any", "list": False, "advanced": False, + "info": "", } assert template["model_name"] == { "required": False, @@ -385,6 +405,7 @@ def test_chat_open_ai(client: TestClient): "type": "str", "list": True, "advanced": False, + "info": "", } assert template["temperature"] == { "required": False, @@ -397,6 +418,7 @@ def test_chat_open_ai(client: TestClient): "type": "float", "list": False, "advanced": False, + "info": "", } assert template["model_kwargs"] == { "required": False, @@ -408,6 +430,7 @@ def test_chat_open_ai(client: TestClient): "type": "code", "list": False, "advanced": True, + "info": "", } assert template["openai_api_key"] == { "required": False, @@ -421,6 +444,7 @@ def test_chat_open_ai(client: TestClient): "type": "str", "list": False, "advanced": False, + "info": "", } assert template["request_timeout"] == { "required": False, @@ -432,6 +456,7 @@ def test_chat_open_ai(client: TestClient): "type": "float", "list": False, "advanced": False, + "info": "", } assert template["max_retries"] == { "required": False, @@ -444,6 +469,7 @@ def test_chat_open_ai(client: TestClient): "type": "int", "list": False, "advanced": False, + "info": "", } assert template["streaming"] == { "required": False, @@ -456,6 +482,7 @@ def test_chat_open_ai(client: TestClient): "type": "bool", "list": False, "advanced": False, + "info": "", } assert template["n"] == { "required": False, @@ -468,6 +495,7 @@ def test_chat_open_ai(client: TestClient): "type": "int", "list": False, "advanced": False, + "info": "", } assert template["max_tokens"] == { @@ -480,6 +508,7 @@ def test_chat_open_ai(client: TestClient): "type": "int", "list": False, "advanced": False, + "info": "", } assert template["_type"] == "ChatOpenAI" assert ( diff --git a/tests/test_prompts_template.py b/tests/test_prompts_template.py index 5094f50f0..4e6030cab 100644 --- a/tests/test_prompts_template.py +++ b/tests/test_prompts_template.py @@ -28,6 +28,7 @@ def test_prompt_template(client: TestClient): "type": "str", "list": True, "advanced": False, + "info": "", } assert template["output_parser"] == { "required": False, @@ -39,6 +40,7 @@ def test_prompt_template(client: TestClient): "type": "BaseOutputParser", "list": False, "advanced": False, + "info": "", } assert template["partial_variables"] == { "required": False, @@ -50,6 +52,7 @@ def test_prompt_template(client: TestClient): "type": "code", "list": False, "advanced": False, + "info": "", } assert template["template"] == { "required": True, @@ -61,6 +64,7 @@ def test_prompt_template(client: TestClient): "type": "prompt", "list": False, "advanced": False, + "info": "", } assert template["template_format"] == { "required": False, @@ -73,6 +77,7 @@ def test_prompt_template(client: TestClient): "type": "str", "list": False, "advanced": False, + "info": "", } assert template["validate_template"] == { "required": False, @@ -85,6 +90,7 @@ def test_prompt_template(client: TestClient): "type": "bool", "list": False, "advanced": False, + "info": "", } @@ -106,6 +112,7 @@ def test_zero_shot_prompt(client: TestClient): "type": "prompt", "list": False, "advanced": False, + "info": "", } assert template["suffix"] == { "required": True, @@ -118,6 +125,7 @@ def test_zero_shot_prompt(client: TestClient): "type": "prompt", "list": False, "advanced": False, + "info": "", } assert template["format_instructions"] == { "required": True, @@ -130,4 +138,5 @@ def test_zero_shot_prompt(client: TestClient): "type": "prompt", "list": False, "advanced": False, + "info": "", } From e10d271e223d29817ea47a11c36ca6c560561923 Mon Sep 17 00:00:00 2001 From: Gabriel Luiz Freitas Almeida Date: Tue, 27 Jun 2023 15:26:53 -0300 Subject: [PATCH 039/169] =?UTF-8?q?=F0=9F=94=A7=20refactor(ShadTooltipComp?= =?UTF-8?q?onent):=20destructure=20props=20and=20add=20types=20The=20ShadT?= =?UTF-8?q?ooltipComponent=20has=20been=20refactored=20to=20destructure=20?= =?UTF-8?q?the=20props=20and=20add=20types=20to=20improve=20readability=20?= =?UTF-8?q?and=20maintainability.=20The=20ShadTooltipProps=20type=20has=20?= =?UTF-8?q?been=20added=20to=20the=20types/components/index.ts=20file=20to?= =?UTF-8?q?=20define=20the=20expected=20props=20for=20the=20ShadTooltipCom?= =?UTF-8?q?ponent.=20The=20delayDuration,=20side,=20content,=20and=20child?= =?UTF-8?q?ren=20props=20are=20now=20destructured=20from=20the=20props=20o?= =?UTF-8?q?bject=20and=20have=20their=20respective=20types=20defined.?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../components/ShadTooltipComponent/index.tsx | 20 ++++++++++--------- src/frontend/src/types/components/index.ts | 9 +++++++++ 2 files changed, 20 insertions(+), 9 deletions(-) diff --git a/src/frontend/src/components/ShadTooltipComponent/index.tsx b/src/frontend/src/components/ShadTooltipComponent/index.tsx index 44ffac075..aa31b534b 100644 --- a/src/frontend/src/components/ShadTooltipComponent/index.tsx +++ b/src/frontend/src/components/ShadTooltipComponent/index.tsx @@ -1,3 +1,4 @@ +import { ShadTooltipProps } from "../../types/components"; import { Tooltip, TooltipContent, @@ -5,18 +6,19 @@ import { TooltipTrigger, } from "../ui/tooltip"; -const ShadTooltip = (props) => { +const ShadTooltip = ({ + delayDuration = 500, + side, + content, + children, +}: ShadTooltipProps) => { return ( - - {props.children} + + {children} - - {props.content} + + {content} diff --git a/src/frontend/src/types/components/index.ts b/src/frontend/src/types/components/index.ts index b1570ddda..2ac6960fd 100644 --- a/src/frontend/src/types/components/index.ts +++ b/src/frontend/src/types/components/index.ts @@ -110,3 +110,12 @@ export type RadialProgressType = { value?: number; color?: string; }; + +export type Side = "top" | "right" | "bottom" | "left"; + +export type ShadTooltipProps = { + delayDuration?: number; + side?: Side; + content: ReactNode; + children: ReactNode; +}; From 0a3648c23e6c80fd03522da55ae9984540174125 Mon Sep 17 00:00:00 2001 From: Gabriel Luiz Freitas Almeida Date: Tue, 27 Jun 2023 15:29:20 -0300 Subject: [PATCH 040/169] =?UTF-8?q?=F0=9F=94=A8=20refactor(GenericNode):?= =?UTF-8?q?=20remove=20unused=20imports=20and=20simplify=20documentation?= =?UTF-8?q?=20tooltip=20The=20required=20indicator=20is=20now=20next=20to?= =?UTF-8?q?=20the=20title,=20which=20improves=20readability=20and=20makes?= =?UTF-8?q?=20it=20easier=20to=20see=20which=20parameters=20are=20required?= =?UTF-8?q?.=20The=20documentation=20tooltip=20has=20been=20simplified=20t?= =?UTF-8?q?o=20only=20show=20the=20documentation=20link,=20which=20improve?= =?UTF-8?q?s=20the=20user=20experience=20by=20reducing=20clutter.=20Unused?= =?UTF-8?q?=20imports=20have=20been=20removed=20to=20improve=20code=20qual?= =?UTF-8?q?ity.=20=F0=9F=94=A8=20refactor(parameterComponent):=20move=20re?= =?UTF-8?q?quired=20indicator=20next=20to=20title?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../components/parameterComponent/index.tsx | 8 +--- .../src/CustomNodes/GenericNode/index.tsx | 45 +------------------ 2 files changed, 3 insertions(+), 50 deletions(-) diff --git a/src/frontend/src/CustomNodes/GenericNode/components/parameterComponent/index.tsx b/src/frontend/src/CustomNodes/GenericNode/components/parameterComponent/index.tsx index 0701bfcd4..ccc18a5fa 100644 --- a/src/frontend/src/CustomNodes/GenericNode/components/parameterComponent/index.tsx +++ b/src/frontend/src/CustomNodes/GenericNode/components/parameterComponent/index.tsx @@ -149,18 +149,14 @@ export default function ParameterComponent({ } > {title} + {required ? " *" : ""}
{info !== "" && ( - + )}
- {required ? " *" : ""}
{left && (type === "str" || diff --git a/src/frontend/src/CustomNodes/GenericNode/index.tsx b/src/frontend/src/CustomNodes/GenericNode/index.tsx index 40a306ce6..aaa8030b5 100644 --- a/src/frontend/src/CustomNodes/GenericNode/index.tsx +++ b/src/frontend/src/CustomNodes/GenericNode/index.tsx @@ -14,7 +14,6 @@ import NodeModal from "../../modals/NodeModal"; import Tooltip from "../../components/TooltipComponent"; import { NodeToolbar } from "reactflow"; import NodeToolbarComponent from "../../pages/FlowPage/components/nodeToolbarComponent"; -import { FileText, Info } from "lucide-react"; import ShadTooltip from "../../components/ShadTooltipComponent"; import { useSSE } from "../../contexts/SSEContext"; @@ -70,22 +69,6 @@ export default function GenericNode({ useEffect(() => {}, [closePopUp, data.node.template]); - useEffect(() => { - refHtml.current = ( -
- {`${data.node.display_name} Documentation`} - - - -
- ); - }, []); - return ( <> @@ -111,37 +94,11 @@ export default function GenericNode({ }} />
- +
{data.node.display_name}
-
- {data.node.documentation !== "" && ( - - - - - - )} -
From 37239e27c9aee424902a6b6b024a9d8f374ed5a5 Mon Sep 17 00:00:00 2001 From: Gabriel Luiz Freitas Almeida Date: Tue, 27 Jun 2023 15:29:40 -0300 Subject: [PATCH 041/169] =?UTF-8?q?=F0=9F=8E=A8=20style(extraSidebarCompon?= =?UTF-8?q?ent):=20remove=20delayDuration=20from=20ShadTooltip=20component?= =?UTF-8?q?=20The=20delayDuration=20prop=20was=20removed=20from=20all=20Sh?= =?UTF-8?q?adTooltip=20components=20in=20the=20ExtraSidebar=20component.?= =?UTF-8?q?=20This=20improves=20the=20user=20experience=20by=20removing=20?= =?UTF-8?q?the=20delay=20before=20the=20tooltip=20is=20displayed.?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../FlowPage/components/extraSidebarComponent/index.tsx | 9 ++++----- 1 file changed, 4 insertions(+), 5 deletions(-) diff --git a/src/frontend/src/pages/FlowPage/components/extraSidebarComponent/index.tsx b/src/frontend/src/pages/FlowPage/components/extraSidebarComponent/index.tsx index b4f380164..5da2d8e28 100644 --- a/src/frontend/src/pages/FlowPage/components/extraSidebarComponent/index.tsx +++ b/src/frontend/src/pages/FlowPage/components/extraSidebarComponent/index.tsx @@ -62,7 +62,7 @@ export default function ExtraSidebar() { return (
- + - + - + - + - {nodeLength > 0 && ( - - - - )} + } + }} + > + + + + + + + {/* -
diff --git a/src/frontend/src/components/textAreaComponent/index.tsx b/src/frontend/src/components/textAreaComponent/index.tsx index 4b4cd1582..160579d1a 100644 --- a/src/frontend/src/components/textAreaComponent/index.tsx +++ b/src/frontend/src/components/textAreaComponent/index.tsx @@ -53,7 +53,7 @@ export default function TextAreaComponent({ className={ editNode ? "truncate cursor-pointer placeholder:text-center text-gray-500 border-1 block w-full pt-0.5 pb-0.5 form-input dark:bg-gray-900 dark:text-gray-300 dark:border-gray-600 rounded-md border-gray-300 shadow-sm sm:text-sm" + - INPUT_STYLE + INPUT_STYLE + (disabled ? " bg-gray-200 " : "") : "truncate block w-full text-gray-500 dark:text-muted px-3 py-2 rounded-md border border-gray-300 dark:border-gray-700 shadow-sm sm:text-sm" + (disabled ? " bg-gray-200" : "") } diff --git a/src/frontend/src/components/ui/accordion.tsx b/src/frontend/src/components/ui/accordion.tsx new file mode 100644 index 000000000..9679cf1c3 --- /dev/null +++ b/src/frontend/src/components/ui/accordion.tsx @@ -0,0 +1,60 @@ +"use client" + +import * as React from "react" +import * as AccordionPrimitive from "@radix-ui/react-accordion" +import { ChevronDownIcon } from "@radix-ui/react-icons" +import { cn } from "../../utils" + + +const Accordion = AccordionPrimitive.Root + +const AccordionItem = React.forwardRef< + React.ElementRef, + React.ComponentPropsWithoutRef +>(({ className, ...props }, ref) => ( + +)) +AccordionItem.displayName = "AccordionItem" + +const AccordionTrigger = React.forwardRef< + React.ElementRef, + React.ComponentPropsWithoutRef +>(({ className, children, ...props }, ref) => ( + + svg]:rotate-180", + className + )} + {...props} + > + {children} + + + +)) +AccordionTrigger.displayName = AccordionPrimitive.Trigger.displayName + +const AccordionContent = React.forwardRef< + React.ElementRef, + React.ComponentPropsWithoutRef +>(({ className, children, ...props }, ref) => ( + +
{children}
+
+)) +AccordionContent.displayName = AccordionPrimitive.Content.displayName + +export { Accordion, AccordionItem, AccordionTrigger, AccordionContent } diff --git a/src/frontend/src/modals/ApiModal/index.tsx b/src/frontend/src/modals/ApiModal/index.tsx index 8b373c4e2..bc4ecac87 100644 --- a/src/frontend/src/modals/ApiModal/index.tsx +++ b/src/frontend/src/modals/ApiModal/index.tsx @@ -1,4 +1,4 @@ -import { useContext, useState } from "react"; +import { useContext, useEffect, useRef, useState } from "react"; import { PopUpContext } from "../../contexts/popUpContext"; import "ace-builds/src-noconflict/mode-python"; import "ace-builds/src-noconflict/theme-github"; @@ -26,6 +26,28 @@ import { TabsTrigger, } from "../../components/ui/tabs"; import { Check, Clipboard, Code2 } from "lucide-react"; +import { + Table, + TableBody, + TableCaption, + TableCell, + TableHead, + TableHeader, + TableRow, +} from "../../components/ui/table"; +import { buildTweaks, classNames, limitScrollFieldsModal } from "../../utils"; +import AccordionComponent from "../../components/AccordionComponent"; +import CodeAreaComponent from "../../components/codeAreaComponent"; +import Dropdown from "../../components/dropdownComponent"; +import FloatComponent from "../../components/floatComponent"; +import InputComponent from "../../components/inputComponent"; +import InputFileComponent from "../../components/inputFileComponent"; +import InputListComponent from "../../components/inputListComponent"; +import IntComponent from "../../components/intComponent"; +import PromptAreaComponent from "../../components/promptComponent"; +import TextAreaComponent from "../../components/textAreaComponent"; +import ToggleShadComponent from "../../components/toggleShadComponent"; +import ShadTooltip from "../../components/ShadTooltipComponent"; export default function ApiModal({ flow }: { flow: FlowType }) { const [open, setOpen] = useState(true); @@ -33,6 +55,8 @@ export default function ApiModal({ flow }: { flow: FlowType }) { const { closePopUp } = useContext(PopUpContext); const [activeTab, setActiveTab] = useState("0"); const [isCopied, setIsCopied] = useState(false); + const [enabled, setEnabled] = useState(null); + const tweak = useRef([]); const copyToClipboard = () => { if (!navigator.clipboard || !navigator.clipboard.writeText) { @@ -54,10 +78,14 @@ export default function ApiModal({ flow }: { flow: FlowType }) { } } - const pythonApiCode = getPythonApiCode(flow); + useEffect(() => { + console.log(tweak.current); + }, [closePopUp]); + const pythonApiCode = getPythonApiCode(flow); const curl_code = getCurlCode(flow); const pythonCode = getPythonCode(flow); + const tweaksCode = buildTweaks(flow); const tabs = [ { @@ -80,10 +108,81 @@ export default function ApiModal({ flow }: { flow: FlowType }) { code: pythonCode, }, ]; + + if (Object.keys(tweaksCode).length > 0) { + tabs.push({ + name: "Tweaks", + mode: "python", + image: "https://cdn-icons-png.flaticon.com/512/5968/5968350.png", + code: pythonCode, + }); + } + + function buildTweakObject(tw, changes, template) { + if (template.type === "float") { + changes = parseFloat(changes); + } + if (template.type === "int") { + changes = parseInt(changes); + } + if (template.list === true && Array.isArray(changes)) { + changes = changes?.filter((x) => x !== ""); + } + + const existingTweak = tweak.current.find((element) => + element.hasOwnProperty(tw) + ); + + if (existingTweak) { + existingTweak[tw][template["name"]] = changes; + + if (template.list === true) { + if (changes.length === 0) { + if (existingTweak[tw] && existingTweak[tw][template["name"]]) { + delete existingTweak[tw][template["name"]]; + } + } + } + + if (existingTweak[tw][template["name"]] == template.value) { + tweak.current.forEach((element) => { + if (element[tw] && element[tw][template["name"]]) { + delete element[tw][template["name"]]; + } + if (element[tw] && Object.keys(element[tw])?.length === 0) { + tweak.current = tweak.current.filter((obj) => { + const prop = obj[Object.keys(obj)[0]].prop; + return prop !== undefined && prop !== null && prop !== ""; + }); + delete element[tw]; + } + }); + } + } else { + const newTweak = { + [tw]: { + [template["name"]]: changes, + }, + }; + tweak.current.push(newTweak); + } + + console.log(tweak.current); + } + + function buildContent(value) { + const htmlContent = ( +
+ {value != null && value != '' ? value : 'None'} +
+ ); + return htmlContent; + } + return ( - + Code @@ -103,32 +202,391 @@ export default function ApiModal({ flow }: { flow: FlowType }) {
{tabs.map((tab, index) => ( - {tab.name} + + {tab.name} + ))} -
- -
+ {Number(activeTab) < 3 && ( +
+ +
+ )}
{tabs.map((tab, index) => ( - - {tab.code} - + {index < 3 ? ( + + {tab.code} + + ) : index === 3 ? ( + <> +
+
+ {flow["data"]["nodes"].map((t: any, index) => ( +
+ +
+ + + + + PARAM + + + VALUE + + + + + {Object.keys(t["data"]["node"]["template"]) + .filter( + (n) => + n.charAt(0) !== "_" && + t.data.node.template[n].show && + (t.data.node.template[n].type === + "str" || + t.data.node.template[n].type === + "bool" || + t.data.node.template[n].type === + "float" || + t.data.node.template[n].type === + "code" || + t.data.node.template[n].type === + "prompt" || + t.data.node.template[n].type === + "file" || + t.data.node.template[n].type === + "int") + ) + .map((n, i) => { + // console.log(t.data.node.template[n]); + + return ( + + + {n} + + +
+ {t.data.node.template[n].type === + "str" && + !t.data.node.template[n] + .options ? ( +
+ {t.data.node.template[n] + .list ? ( + {}} + onAddInput={(k) => { + buildTweakObject( + t["data"]["id"], + k, + t.data.node.template[ + n + ] + ); + }} + /> + ) : t.data.node.template[n] + .multiline ? ( +
+ + {}} + /> + +
+ ) : ( + { + buildTweakObject( + t["data"]["id"], + k, + t.data.node.template[ + n + ] + ); + }} + /> + )} +
+ ) : t.data.node.template[n] + .type === "bool" ? ( +
+ {" "} + { + t.data.node.template[ + n + ].value = e; + setEnabled(e); + buildTweakObject( + t["data"]["id"], + e, + t.data.node.template[n] + ); + }} + size="small" + disabled={false} + /> +
+ ) + : + t.data.node.template[n] + .type === "file" ? ( + +
+ { + + }} + fileTypes={ + t.data.node.template[n] + .fileTypes + } + suffixes={ + t.data.node.template[n] + .suffixes + } + onFileChange={(k: any) => { + }} + > +
+
+ + ) + : t.data.node.template[n] + .type === "float" ? ( +
+ { + buildTweakObject( + t["data"]["id"], + k, + t.data.node.template[n] + ); + }} + /> +
+ ) : t.data.node.template[n] + .type === "str" && + t.data.node.template[n] + .options ? ( +
+ + buildTweakObject( + t["data"]["id"], + k, + t.data.node.template[n] + ) + } + value={ + t.data.node.template[n] + .value ?? + "Choose an option" + } + > +
+ ) : t.data.node.template[n] + .type === "int" ? ( +
+ { + buildTweakObject( + t["data"]["id"], + k, + t.data.node.template[n] + ); + }} + /> +
+ ) : t.data.node.template[n] + .type === "prompt" ? ( + +
+ {}} + /> +
+
+ ) : t.data.node.template[n] + .type === "code" ? ( + +
+ {}} + /> +
+
+ ) : t.data.node.template[n] + .type === "Any" ? ( + "-" + ) : ( +
+ )} +
+
+
+ ); + })} +
+
+
+
+
+ ))} + + {/* +
+ + + + + TWEAK + + + VALUE + + + + + {invoices.map((invoice) => ( + + + {invoice.paymentStatus} + + + {invoice.paymentMethod} + + + ))} + +
+
*/} +
+
+ + ) : null}
))} diff --git a/src/frontend/src/types/components/index.ts b/src/frontend/src/types/components/index.ts index 630526193..0adbdc1d3 100644 --- a/src/frontend/src/types/components/index.ts +++ b/src/frontend/src/types/components/index.ts @@ -28,6 +28,7 @@ export type DropDownComponentType = { options: string[]; onSelect: (value: string) => void; editNode?: boolean; + apiModal?: boolean; numberOfOptions?: number; }; export type ParameterComponentType = { @@ -47,6 +48,8 @@ export type InputListComponentType = { onChange: (value: string[]) => void; disabled: boolean; editNode?: boolean; + onAddInput?: (value?: string[]) => void; + }; export type TextAreaComponentType = { @@ -115,3 +118,9 @@ export type RadialProgressType = { value?: number; color?: string; }; + +export type AccordionComponentType = { + children?: ReactElement; + value?: string; + trigger?: string; +}; \ No newline at end of file diff --git a/src/frontend/tailwind.config.js b/src/frontend/tailwind.config.js index 5561b1044..50d27a3c7 100644 --- a/src/frontend/tailwind.config.js +++ b/src/frontend/tailwind.config.js @@ -90,6 +90,20 @@ module.exports = { }, }, extend: { + keyframes: { + "accordion-down": { + from: { height: 0 }, + to: { height: "var(--radix-accordion-content-height)" }, + }, + "accordion-up": { + from: { height: "var(--radix-accordion-content-height)" }, + to: { height: 0 }, + }, + }, + animation: { + "accordion-down": "accordion-down 0.2s ease-out", + "accordion-up": "accordion-up 0.2s ease-out", + }, colors: { border: "hsl(var(--border))", input: "hsl(var(--input))", From ebee617b52a96ab9b5981815bb88ef671c297054 Mon Sep 17 00:00:00 2001 From: Cristhian Zanforlin Lousa Date: Tue, 27 Jun 2023 17:24:19 -0300 Subject: [PATCH 045/169] =?UTF-8?q?=F0=9F=94=A8=20refactor(constants.tsx):?= =?UTF-8?q?=20add=20optional=20parameter=20to=20getPythonApiCode,=20getCur?= =?UTF-8?q?lCode=20and=20getPythonCode=20functions=20to=20allow=20tweaking?= =?UTF-8?q?=20of=20the=20flow=20=E2=9C=A8=20feat(ApiModal):=20pass=20the?= =?UTF-8?q?=20tweak.current=20value=20to=20the=20getPythonApiCode,=20getCu?= =?UTF-8?q?rlCode=20and=20getPythonCode=20functions=20to=20allow=20tweakin?= =?UTF-8?q?g=20of=20the=20flow.=20Update=20the=20tabs=20with=20the=20new?= =?UTF-8?q?=20code=20after=20a=20tweak=20is=20added.?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/frontend/src/constants.tsx | 22 ++++++++++++---------- src/frontend/src/modals/ApiModal/index.tsx | 18 +++++++++++------- 2 files changed, 23 insertions(+), 17 deletions(-) diff --git a/src/frontend/src/constants.tsx b/src/frontend/src/constants.tsx index f569046ea..4cebb9b54 100644 --- a/src/frontend/src/constants.tsx +++ b/src/frontend/src/constants.tsx @@ -54,7 +54,7 @@ export const TEXT_DIALOG_SUBTITLE = "Edit your text."; * @param {string} flowId - The id of the flow * @returns {string} - The python code */ -export const getPythonApiCode = (flow: FlowType): string => { +export const getPythonApiCode = (flow: FlowType, tweak?): string => { const flowId = flow.id; // create a dictionary of node ids and the values is an empty dictionary @@ -70,7 +70,9 @@ BASE_API_URL = "${window.location.protocol}//${ FLOW_ID = "${flowId}" # You can tweak the flow by adding a tweaks dictionary # e.g {"OpenAI-XXXXX": {"model_name": "gpt-4"}} -TWEAKS = ${JSON.stringify(tweaks, null, 2)} +TWEAKS = ${ + tweak ? JSON.stringify(tweak, null, 2) : JSON.stringify(tweaks, null, 2) + } def run_flow(message: str, flow_id: str, tweaks: dict = None) -> dict: """ @@ -100,7 +102,7 @@ print(run_flow("Your message", flow_id=FLOW_ID, tweaks=TWEAKS))`; * @param {string} flowId - The id of the flow * @returns {string} - The curl code */ -export const getCurlCode = (flow: FlowType): string => { +export const getCurlCode = (flow: FlowType, tweak?): string => { const flowId = flow.id; const tweaks = buildTweaks(flow); return `curl -X POST \\ @@ -108,22 +110,22 @@ export const getCurlCode = (flow: FlowType): string => { window.location.host }/api/v1/process/${flowId} \\ -H 'Content-Type: application/json' \\ - -d '{"inputs": {"input": message}, "tweaks": ${JSON.stringify( - tweaks, - null, - 2 - )}}'`; + -d '{"inputs": {"input": message}, "tweaks": ${ + tweak ? JSON.stringify(tweak, null, 2) : JSON.stringify(tweaks, null, 2) + }}'`; }; /** * Function to get the python code for the API * @param {string} flowName - The name of the flow * @returns {string} - The python code */ -export const getPythonCode = (flow: FlowType): string => { +export const getPythonCode = (flow: FlowType, tweak?): string => { const flowName = flow.name; const tweaks = buildTweaks(flow); return `from langflow import load_flow_from_json -TWEAKS = ${JSON.stringify(tweaks, null, 2)} +TWEAKS = ${ + tweak ? JSON.stringify(tweak, null, 2) : JSON.stringify(tweaks, null, 2) + } flow = load_flow_from_json("${flowName}.json", tweaks=TWEAKS) # Now you can use it like any chain flow("Hey, have you heard of LangFlow?")`; diff --git a/src/frontend/src/modals/ApiModal/index.tsx b/src/frontend/src/modals/ApiModal/index.tsx index bc4ecac87..cfef3bd37 100644 --- a/src/frontend/src/modals/ApiModal/index.tsx +++ b/src/frontend/src/modals/ApiModal/index.tsx @@ -78,13 +78,9 @@ export default function ApiModal({ flow }: { flow: FlowType }) { } } - useEffect(() => { - console.log(tweak.current); - }, [closePopUp]); - - const pythonApiCode = getPythonApiCode(flow); - const curl_code = getCurlCode(flow); - const pythonCode = getPythonCode(flow); + const pythonApiCode = getPythonApiCode(flow, tweak.current); + const curl_code = getCurlCode(flow, tweak.current); + const pythonCode = getPythonCode(flow, tweak.current); const tweaksCode = buildTweaks(flow); const tabs = [ @@ -167,6 +163,14 @@ export default function ApiModal({ flow }: { flow: FlowType }) { tweak.current.push(newTweak); } + const pythonApiCode = getPythonApiCode(flow, tweak.current); + const curl_code = getCurlCode(flow, tweak.current); + const pythonCode = getPythonCode(flow, tweak.current); + + tabs[0].code = curl_code; + tabs[1].code = pythonApiCode; + tabs[2].code = pythonCode; + console.log(tweak.current); } From f3e22b0080381a5ae883d55eafad485b7b476074 Mon Sep 17 00:00:00 2001 From: Gabriel Luiz Freitas Almeida Date: Tue, 27 Jun 2023 18:25:05 -0300 Subject: [PATCH 046/169] fix: docs open in a new tab now --- .../src/pages/FlowPage/components/nodeToolbarComponent/index.tsx | 1 + 1 file changed, 1 insertion(+) diff --git a/src/frontend/src/pages/FlowPage/components/nodeToolbarComponent/index.tsx b/src/frontend/src/pages/FlowPage/components/nodeToolbarComponent/index.tsx index 7bc392e14..73ebff1d1 100644 --- a/src/frontend/src/pages/FlowPage/components/nodeToolbarComponent/index.tsx +++ b/src/frontend/src/pages/FlowPage/components/nodeToolbarComponent/index.tsx @@ -81,6 +81,7 @@ const NodeToolbarComponent = (props) => { ? " text-muted-foreground" : " text-foreground") )} + target="_blank" href={props.data.node.documentation} // deactivate link if no documentation is provided onClick={(event) => { From 0200b22189f76eff8cb73c1bbf384665f26ef6d8 Mon Sep 17 00:00:00 2001 From: Gabriel Luiz Freitas Almeida Date: Tue, 27 Jun 2023 18:26:01 -0300 Subject: [PATCH 047/169] =?UTF-8?q?=F0=9F=8E=A8=20style(nodeToolbarCompone?= =?UTF-8?q?nt):=20add=20noopener=20and=20noreferrer=20attributes=20to=20do?= =?UTF-8?q?cumentation=20link=20The=20noopener=20and=20noreferrer=20attrib?= =?UTF-8?q?utes=20were=20added=20to=20the=20documentation=20link=20to=20im?= =?UTF-8?q?prove=20security=20by=20preventing=20the=20linked=20page=20from?= =?UTF-8?q?=20having=20access=20to=20the=20window.opener=20object=20and=20?= =?UTF-8?q?to=20prevent=20the=20referrer=20header=20from=20being=20sent=20?= =?UTF-8?q?to=20the=20linked=20page,=20respectively.?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../src/pages/FlowPage/components/nodeToolbarComponent/index.tsx | 1 + 1 file changed, 1 insertion(+) diff --git a/src/frontend/src/pages/FlowPage/components/nodeToolbarComponent/index.tsx b/src/frontend/src/pages/FlowPage/components/nodeToolbarComponent/index.tsx index 73ebff1d1..a60c928b6 100644 --- a/src/frontend/src/pages/FlowPage/components/nodeToolbarComponent/index.tsx +++ b/src/frontend/src/pages/FlowPage/components/nodeToolbarComponent/index.tsx @@ -82,6 +82,7 @@ const NodeToolbarComponent = (props) => { : " text-foreground") )} target="_blank" + rel="noopener noreferrer" href={props.data.node.documentation} // deactivate link if no documentation is provided onClick={(event) => { From 8aeb7c5fb1c6778f0239dcae1528c6bd778796cc Mon Sep 17 00:00:00 2001 From: Gabriel Luiz Freitas Almeida Date: Tue, 27 Jun 2023 18:28:01 -0300 Subject: [PATCH 048/169] =?UTF-8?q?=F0=9F=94=96=20chore(pyproject.toml):?= =?UTF-8?q?=20bump=20version=20to=200.2.4=20The=20version=20number=20has?= =?UTF-8?q?=20been=20updated=20from=200.2.3=20to=200.2.4.=20This=20is=20a?= =?UTF-8?q?=20chore=20commit=20as=20it=20does=20not=20introduce=20any=20ne?= =?UTF-8?q?w=20features=20or=20bug=20fixes,=20but=20rather=20updates=20the?= =?UTF-8?q?=20version=20number=20to=20reflect=20changes=20made=20in=20the?= =?UTF-8?q?=20package.?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- poetry.lock | 6 +++--- pyproject.toml | 2 +- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/poetry.lock b/poetry.lock index b854f5c2e..edcb3bb3c 100644 --- a/poetry.lock +++ b/poetry.lock @@ -4690,14 +4690,14 @@ diagrams = ["jinja2", "railroad-diagrams"] [[package]] name = "pypdf" -version = "3.11.0" +version = "3.11.1" description = "A pure-python PDF library capable of splitting, merging, cropping, and transforming PDF files" category = "main" optional = false python-versions = ">=3.6" files = [ - {file = "pypdf-3.11.0-py3-none-any.whl", hash = "sha256:4f1fd2c1ee05e381e05447152d9e993016666647578fcdd7cf15739d13536861"}, - {file = "pypdf-3.11.0.tar.gz", hash = "sha256:2f5b9b28763234427cd6e525795e583aae7e36a79bdadd48ba8ab5277c12182a"}, + {file = "pypdf-3.11.1-py3-none-any.whl", hash = "sha256:2afc8914355a784fb184f60ae82fe10f9b992aa0733b705f0746966e470f98bd"}, + {file = "pypdf-3.11.1.tar.gz", hash = "sha256:198c4d0231525d0b730cbbd11a5fc7d9a2e410dfc8ae2928c8de000b7ef149c5"}, ] [package.dependencies] diff --git a/pyproject.toml b/pyproject.toml index 4fc5e3ce3..bbd55eaf9 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -1,6 +1,6 @@ [tool.poetry] name = "langflow" -version = "0.2.3" +version = "0.2.4" description = "A Python package with a built-in web application" authors = ["Logspace "] maintainers = [ From 132b2e367b162db69b97ad8b3a28ecb0a880726d Mon Sep 17 00:00:00 2001 From: Cristhian Zanforlin Lousa Date: Tue, 27 Jun 2023 19:51:53 -0300 Subject: [PATCH 049/169] =?UTF-8?q?=F0=9F=90=9B=20fix(constants.tsx):=20ad?= =?UTF-8?q?d=20check=20for=20empty=20tweak=20array=20to=20avoid=20JSON.str?= =?UTF-8?q?ingify=20error?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/frontend/src/constants.tsx | 6 +++--- src/frontend/src/modals/ApiModal/index.tsx | 1 + 2 files changed, 4 insertions(+), 3 deletions(-) diff --git a/src/frontend/src/constants.tsx b/src/frontend/src/constants.tsx index 4cebb9b54..4aee27d83 100644 --- a/src/frontend/src/constants.tsx +++ b/src/frontend/src/constants.tsx @@ -71,7 +71,7 @@ FLOW_ID = "${flowId}" # You can tweak the flow by adding a tweaks dictionary # e.g {"OpenAI-XXXXX": {"model_name": "gpt-4"}} TWEAKS = ${ - tweak ? JSON.stringify(tweak, null, 2) : JSON.stringify(tweaks, null, 2) + tweak && tweak.length > 0 ? JSON.stringify(tweak, null, 2) : JSON.stringify(tweaks, null, 2) } def run_flow(message: str, flow_id: str, tweaks: dict = None) -> dict: @@ -111,7 +111,7 @@ export const getCurlCode = (flow: FlowType, tweak?): string => { }/api/v1/process/${flowId} \\ -H 'Content-Type: application/json' \\ -d '{"inputs": {"input": message}, "tweaks": ${ - tweak ? JSON.stringify(tweak, null, 2) : JSON.stringify(tweaks, null, 2) + tweak && tweak.length > 0 ? JSON.stringify(tweak, null, 2) : JSON.stringify(tweaks, null, 2) }}'`; }; /** @@ -124,7 +124,7 @@ export const getPythonCode = (flow: FlowType, tweak?): string => { const tweaks = buildTweaks(flow); return `from langflow import load_flow_from_json TWEAKS = ${ - tweak ? JSON.stringify(tweak, null, 2) : JSON.stringify(tweaks, null, 2) + tweak && tweak.length > 0 ? JSON.stringify(tweak, null, 2) : JSON.stringify(tweaks, null, 2) } flow = load_flow_from_json("${flowName}.json", tweaks=TWEAKS) # Now you can use it like any chain diff --git a/src/frontend/src/modals/ApiModal/index.tsx b/src/frontend/src/modals/ApiModal/index.tsx index cfef3bd37..5d4241338 100644 --- a/src/frontend/src/modals/ApiModal/index.tsx +++ b/src/frontend/src/modals/ApiModal/index.tsx @@ -77,6 +77,7 @@ export default function ApiModal({ flow }: { flow: FlowType }) { closePopUp(); } } + const pythonApiCode = getPythonApiCode(flow, tweak.current); const curl_code = getCurlCode(flow, tweak.current); From 4ac1326f3a252a698df09df0e3efbd4d78c5f0b7 Mon Sep 17 00:00:00 2001 From: Cristhian Zanforlin Lousa Date: Tue, 27 Jun 2023 23:35:27 -0300 Subject: [PATCH 050/169] =?UTF-8?q?=F0=9F=90=9B=20fix(AccordionComponent):?= =?UTF-8?q?=20remove=20extra=20whitespace=20in=20AccordionTrigger=20classN?= =?UTF-8?q?ame=20for=20consistent=20styling?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit ✨ feat(tabsContext): add setTweak and getTweak functions to TabsContext to manage tweak state 🐛 fix(ApiModal): remove unused imports and console.log statements ✨ feat(ApiModal): add functionality to get and set tweak state in TabsContext 🐛 fix(ApiModal): fix key prop warning in map function 🐛 fix(ApiModal): fix unused variable warning ✨ feat(ApiModal): add getValue function to get the value from tweak state or default value 🐛 fix(ApiModal): remove unused onChange functions 🐛 fix(ApiModal): fix key prop warning in map function 🐛 fix(ApiModal): fix unused variable warning ✨ feat(ApiModal): add functionality to get and set tweak state in TabsContext 🐛 fix(ApiModal): remove unused imports and console.log statements ✨ feat(tabsContext): add setTweak and getTweak functions to TabsContext to manage tweak state --- .../components/AccordionComponent/index.tsx | 3 +- src/frontend/src/contexts/tabsContext.tsx | 5 ++ src/frontend/src/modals/ApiModal/index.tsx | 78 ++++++++++++++----- src/frontend/src/types/tabs/index.ts | 2 + 4 files changed, 67 insertions(+), 21 deletions(-) diff --git a/src/frontend/src/components/AccordionComponent/index.tsx b/src/frontend/src/components/AccordionComponent/index.tsx index 1c2b41b46..19a811f87 100644 --- a/src/frontend/src/components/AccordionComponent/index.tsx +++ b/src/frontend/src/components/AccordionComponent/index.tsx @@ -14,10 +14,11 @@ export default function AccordionComponent({ children, }: AccordionComponentType) { + return <> - {trigger} + {trigger} {children} diff --git a/src/frontend/src/contexts/tabsContext.tsx b/src/frontend/src/contexts/tabsContext.tsx index 7637699e3..1cccd4b06 100644 --- a/src/frontend/src/contexts/tabsContext.tsx +++ b/src/frontend/src/contexts/tabsContext.tsx @@ -53,6 +53,8 @@ const TabsContextInitialValue: TabsContextType = { tabsState: {}, setTabsState: (state: TabsState) => {}, getNodeId: (nodeType: string) => "", + setTweak: (tweak: any) => {}, + getTweak: {}, paste: ( selection: { nodes: any; edges: any }, position: { x: number; y: number; paneX?: number; paneY?: number } @@ -73,6 +75,7 @@ export function TabsProvider({ children }: { children: ReactNode }) { const { templates, reactFlowInstance } = useContext(typesContext); const [lastCopiedSelection, setLastCopiedSelection] = useState(null); const [tabsState, setTabsState] = useState({}); + const [getTweak, setTweak] = useState({}); const newNodeId = useRef(uid()); function incrementNodeId() { @@ -634,6 +637,8 @@ export function TabsProvider({ children }: { children: ReactNode }) { tabsState, setTabsState, paste, + getTweak, + setTweak }} > {children} diff --git a/src/frontend/src/modals/ApiModal/index.tsx b/src/frontend/src/modals/ApiModal/index.tsx index 5d4241338..27522ece8 100644 --- a/src/frontend/src/modals/ApiModal/index.tsx +++ b/src/frontend/src/modals/ApiModal/index.tsx @@ -48,6 +48,8 @@ import PromptAreaComponent from "../../components/promptComponent"; import TextAreaComponent from "../../components/textAreaComponent"; import ToggleShadComponent from "../../components/toggleShadComponent"; import ShadTooltip from "../../components/ShadTooltipComponent"; +import { cloneDeep } from "lodash"; +import { TabsContext } from "../../contexts/tabsContext"; export default function ApiModal({ flow }: { flow: FlowType }) { const [open, setOpen] = useState(true); @@ -57,7 +59,7 @@ export default function ApiModal({ flow }: { flow: FlowType }) { const [isCopied, setIsCopied] = useState(false); const [enabled, setEnabled] = useState(null); const tweak = useRef([]); - + const { setTweak, getTweak } = useContext(TabsContext); const copyToClipboard = () => { if (!navigator.clipboard || !navigator.clipboard.writeText) { return; @@ -78,7 +80,6 @@ export default function ApiModal({ flow }: { flow: FlowType }) { } } - const pythonApiCode = getPythonApiCode(flow, tweak.current); const curl_code = getCurlCode(flow, tweak.current); const pythonCode = getPythonCode(flow, tweak.current); @@ -171,8 +172,8 @@ export default function ApiModal({ flow }: { flow: FlowType }) { tabs[0].code = curl_code; tabs[1].code = pythonApiCode; tabs[2].code = pythonCode; - - console.log(tweak.current); + + setTweak(tweak.current); } function buildContent(value) { @@ -184,6 +185,33 @@ export default function ApiModal({ flow }: { flow: FlowType }) { return htmlContent; } + function getValue(value, node, template){ + + let returnValue = value ?? ""; + + if(getTweak.length > 0){ + for (const obj of getTweak) { + // Obtém a chave do objeto interno + const key = Object.keys(obj)[0]; + // Obtém o valor do objeto interno + const value = obj[key]; + if(key == node['id']){ + Object.keys(value).forEach((key) => { + if(key == template['name']){ + returnValue = value[key]; + } + }) + } + } + } + else{ + return value ?? ""; + } + return returnValue; + } + + + return ( @@ -251,7 +279,7 @@ export default function ApiModal({ flow }: { flow: FlowType }) { )} > {flow["data"]["nodes"].map((t: any, index) => ( -
+
@@ -318,7 +346,9 @@ export default function ApiModal({ flow }: { flow: FlowType }) { : t.data.node .template[n].value } - onChange={(k) => {}} + onChange={(k) => { + + }} onAddInput={(k) => { buildTweakObject( t["data"]["id"], @@ -348,7 +378,8 @@ export default function ApiModal({ flow }: { flow: FlowType }) { .template[n] .value ?? "" } - onChange={(k) => {}} + onChange={(k) => { + }} /> @@ -361,8 +392,10 @@ export default function ApiModal({ flow }: { flow: FlowType }) { .password ?? false } value={ - t.data.node.template[n] - .value ?? "" + + getValue(t.data.node.template[n] + .value, t.data, t.data.node.template[n]) + } onChange={(k) => { buildTweakObject( @@ -420,7 +453,6 @@ export default function ApiModal({ flow }: { flow: FlowType }) { .value ?? "" } onChange={(k: any) => { - }} fileTypes={ t.data.node.template[n] @@ -444,8 +476,8 @@ export default function ApiModal({ flow }: { flow: FlowType }) { disabled={false} editNode={true} value={ - t.data.node.template[n] - .value ?? "" + getValue(t.data.node.template[n] + .value, t.data, t.data.node.template[n]) } onChange={(k) => { buildTweakObject( @@ -468,17 +500,21 @@ export default function ApiModal({ flow }: { flow: FlowType }) { t.data.node.template[n] .options } - onSelect={(k) => + onSelect={(k) =>{ + + + buildTweakObject( t["data"]["id"], k, t.data.node.template[n] ) } + + } value={ - t.data.node.template[n] - .value ?? - "Choose an option" + getValue(t.data.node.template[n] + .value, t.data, t.data.node.template[n]) } > @@ -489,8 +525,8 @@ export default function ApiModal({ flow }: { flow: FlowType }) { disabled={false} editNode={true} value={ - t.data.node.template[n] - .value ?? "" + getValue(t.data.node.template[n] + .value, t.data, t.data.node.template[n]) } onChange={(k) => { buildTweakObject( @@ -518,7 +554,8 @@ export default function ApiModal({ flow }: { flow: FlowType }) { t.data.node.template[n] .value ?? "" } - onChange={(k) => {}} + onChange={(k) => { + }} /> @@ -539,7 +576,8 @@ export default function ApiModal({ flow }: { flow: FlowType }) { t.data.node.template[n] .value ?? "" } - onChange={(k) => {}} + onChange={(k) => { + }} /> diff --git a/src/frontend/src/types/tabs/index.ts b/src/frontend/src/types/tabs/index.ts index 55829d6ca..8f823535c 100644 --- a/src/frontend/src/types/tabs/index.ts +++ b/src/frontend/src/types/tabs/index.ts @@ -28,6 +28,8 @@ export type TabsContextType = { ) => void; lastCopiedSelection: { nodes: any; edges: any }; setLastCopiedSelection: (selection: { nodes: any; edges: any }) => void; + setTweak: (tweak: any) => void; + getTweak: any; }; export type TabsState = { From d157fffee3de4634a7d9a738d473029fcb7bae70 Mon Sep 17 00:00:00 2001 From: zhenjianpeng Date: Wed, 28 Jun 2023 15:20:06 +0800 Subject: [PATCH 051/169] adding pg support for external message persistance --- src/backend/langflow/config.yaml | 1 + src/backend/langflow/custom/customs.py | 3 ++ .../langflow/interface/initialize/loading.py | 2 + .../template/frontend_node/memories.py | 40 +++++++++++++++++++ 4 files changed, 46 insertions(+) diff --git a/src/backend/langflow/config.yaml b/src/backend/langflow/config.yaml index d8cd4a325..0205cbb31 100644 --- a/src/backend/langflow/config.yaml +++ b/src/backend/langflow/config.yaml @@ -69,6 +69,7 @@ memories: - ConversationBufferMemory - ConversationSummaryMemory - ConversationKGMemory + - PostgresChatMessageHistory prompts: - PromptTemplate - FewShotPromptTemplate diff --git a/src/backend/langflow/custom/customs.py b/src/backend/langflow/custom/customs.py index fb6c1da16..0f1e44308 100644 --- a/src/backend/langflow/custom/customs.py +++ b/src/backend/langflow/custom/customs.py @@ -21,6 +21,9 @@ CUSTOM_NODES = { "utilities": { "SQLDatabase": frontend_node.agents.SQLDatabaseNode(), }, + "memories": { + "PostgresChatMessageHistory": frontend_node.memories.PostgresChatMessageHistoryFrontendNode(), + }, "chains": { "SeriesCharacterChain": frontend_node.chains.SeriesCharacterChainNode(), "TimeTravelGuideChain": frontend_node.chains.TimeTravelGuideChainNode(), diff --git a/src/backend/langflow/interface/initialize/loading.py b/src/backend/langflow/interface/initialize/loading.py index 88b981f9d..c527d745a 100644 --- a/src/backend/langflow/interface/initialize/loading.py +++ b/src/backend/langflow/interface/initialize/loading.py @@ -225,6 +225,7 @@ def load_agent_executor(agent_class: type[agent_module.Agent], params, **kwargs) """Load agent executor from agent class, tools and chain""" allowed_tools: Sequence[BaseTool] = params.get("allowed_tools", []) llm_chain = params["llm_chain"] + memory = params["memory"] # if allowed_tools is not a list or set, make it a list if not isinstance(allowed_tools, (list, set)) and isinstance( allowed_tools, BaseTool @@ -237,6 +238,7 @@ def load_agent_executor(agent_class: type[agent_module.Agent], params, **kwargs) return AgentExecutor.from_agent_and_tools( agent=agent, tools=allowed_tools, + memory=memory, **kwargs, ) diff --git a/src/backend/langflow/template/frontend_node/memories.py b/src/backend/langflow/template/frontend_node/memories.py index 4b312c926..e2f533e7f 100644 --- a/src/backend/langflow/template/frontend_node/memories.py +++ b/src/backend/langflow/template/frontend_node/memories.py @@ -2,6 +2,7 @@ from typing import Optional from langflow.template.field.base import TemplateField from langflow.template.frontend_node.base import FrontendNode +from langflow.template.template.base import Template class MemoryFrontendNode(FrontendNode): @@ -64,3 +65,42 @@ class MemoryFrontendNode(FrontendNode): field.value = "" if field.name == "memory_key": field.value = "chat_history" + + +class PostgresChatMessageHistoryFrontendNode(MemoryFrontendNode): + name: str = "PostgresChatMessageHistory" + template: Template = Template( + type_name="PostgresChatMessageHistory", + fields=[ + TemplateField( + field_type="str", + required=True, + placeholder="", + is_list=False, + show=True, + multiline=False, + name="session_id", + ), + TemplateField( + field_type="str", + required=True, + show=True, + name="connection_string", + ), + TemplateField( + field_type="str", + required=True, + placeholder="", + is_list=False, + show=True, + multiline=False, + value="message_store", + name="table_name", + ), + ], + ) + description: str = "Memory store with Postgres" + base_classes: list[str] = [ + "PostgresChatMessageHistory", + "BaseChatMessageHistory" + ] \ No newline at end of file From 7364ba41f80144af91f147c041f275a65dd3e6d7 Mon Sep 17 00:00:00 2001 From: Gabriel Luiz Freitas Almeida Date: Wed, 28 Jun 2023 08:59:31 -0300 Subject: [PATCH 052/169] =?UTF-8?q?=F0=9F=90=9B=20fix(loading.py):=20handl?= =?UTF-8?q?e=20case=20where=20metadata=20is=20an=20empty=20dict=20and=20do?= =?UTF-8?q?cument=20already=20has=20metadata=20=F0=9F=90=9B=20fix(loading.?= =?UTF-8?q?py):=20handle=20case=20where=20separator=5Ftype=20is=20not=20pr?= =?UTF-8?q?ovided=20in=20params=20The=20first=20fix=20ensures=20that=20if?= =?UTF-8?q?=20the=20metadata=20is=20an=20empty=20dict,=20it=20will=20not?= =?UTF-8?q?=20be=20added=20to=20the=20documents=20if=20they=20already=20ha?= =?UTF-8?q?ve=20metadata.=20This=20prevents=20overwriting=20existing=20met?= =?UTF-8?q?adata.?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit The second fix handles the case where the separator_type is not provided in the params. In this case, the text_splitter will be instantiated using the class_object and the params as is. --- .../langflow/interface/initialize/loading.py | 29 ++++++++++++------- 1 file changed, 18 insertions(+), 11 deletions(-) diff --git a/src/backend/langflow/interface/initialize/loading.py b/src/backend/langflow/interface/initialize/loading.py index cfa5b5717..14642828a 100644 --- a/src/backend/langflow/interface/initialize/loading.py +++ b/src/backend/langflow/interface/initialize/loading.py @@ -188,18 +188,22 @@ def instantiate_documentloader(class_object: Type[BaseLoader], params: Dict): extension.strip() in x for extension in extensions ) metadata = params.pop("metadata", None) + if metadata and isinstance(metadata, str): + try: + metadata = json.loads(metadata) + except json.JSONDecodeError as exc: + raise ValueError( + "The metadata you provided is not a valid JSON string." + ) from exc docs = class_object(**params).load() + # Now if metadata is an empty dict, we will not add it to the documents if metadata: - if isinstance(metadata, str): - try: - metadata = json.loads(metadata) - except json.JSONDecodeError as exc: - raise ValueError( - "The metadata you provided is not a valid JSON string." - ) from exc - for doc in docs: - doc.metadata = metadata + # If the document already has metadata, we will not overwrite it + if not doc.metadata: + doc.metadata = metadata + else: + doc.metadata.update(metadata) return docs @@ -216,13 +220,16 @@ def instantiate_textsplitter( "Try changing the chunk_size of the Text Splitter." ) from exc - if "separator_type" in params and params["separator_type"] == "Text": + if ( + "separator_type" in params + and params["separator_type"] == "Text" + or "separator_type" not in params + ): text_splitter = class_object(**params) else: params["language"] = params.pop("separator_type", None) params.pop("separators", None) text_splitter = class_object.from_language(**params) - return text_splitter.split_documents(documents) From e5b12ae05a20ad337576a58294cb151ff55997bf Mon Sep 17 00:00:00 2001 From: Gabriel Luiz Freitas Almeida Date: Wed, 28 Jun 2023 09:19:07 -0300 Subject: [PATCH 053/169] =?UTF-8?q?=F0=9F=94=96=20chore(pyproject.toml):?= =?UTF-8?q?=20update=20langchain=20dependency=20version=20to=20^0.0.218=20?= =?UTF-8?q?The=20langchain=20dependency=20version=20has=20been=20updated?= =?UTF-8?q?=20to=20^0.0.218=20to=20ensure=20compatibility=20with=20the=20l?= =?UTF-8?q?atest=20features=20and=20bug=20fixes.?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- poetry.lock | 13 +++++++------ pyproject.toml | 4 ++-- 2 files changed, 9 insertions(+), 8 deletions(-) diff --git a/poetry.lock b/poetry.lock index edcb3bb3c..135c6f2c7 100644 --- a/poetry.lock +++ b/poetry.lock @@ -2604,14 +2604,14 @@ testing = ["pytest (>=6)", "pytest-black (>=0.3.7)", "pytest-checkdocs (>=2.4)", [[package]] name = "langchain" -version = "0.0.215" +version = "0.0.218" description = "Building applications with LLMs through composability" category = "main" optional = false python-versions = ">=3.8.1,<4.0" files = [ - {file = "langchain-0.0.215-py3-none-any.whl", hash = "sha256:af9587c2eb317a6e33123f8a4ee8ccd8685cfab62359ea4fec52c962d9646acf"}, - {file = "langchain-0.0.215.tar.gz", hash = "sha256:a6b261f3be941eeac2d9b37fbf8996fa4279ef724f064e8c90813046126da85b"}, + {file = "langchain-0.0.218-py3-none-any.whl", hash = "sha256:c78b0bd65791b80ddf132913ce2239d4cb2dca2dde0ce20a77f36af0c12d397c"}, + {file = "langchain-0.0.218.tar.gz", hash = "sha256:85a237d5b3664bf9acc87420c813df245c03ef1a68cc2424eeb0d81e60d7a0b7"}, ] [package.dependencies] @@ -2629,13 +2629,14 @@ SQLAlchemy = ">=1.4,<3" tenacity = ">=8.1.0,<9.0.0" [package.extras] -all = ["O365 (>=2.0.26,<3.0.0)", "aleph-alpha-client (>=2.15.0,<3.0.0)", "anthropic (>=0.2.6,<0.3.0)", "arxiv (>=1.4,<2.0)", "atlassian-python-api (>=3.36.0,<4.0.0)", "awadb (>=0.3.3,<0.4.0)", "azure-ai-formrecognizer (>=3.2.1,<4.0.0)", "azure-ai-vision (>=0.11.1b1,<0.12.0)", "azure-cognitiveservices-speech (>=1.28.0,<2.0.0)", "azure-cosmos (>=4.4.0b1,<5.0.0)", "azure-identity (>=1.12.0,<2.0.0)", "beautifulsoup4 (>=4,<5)", "clarifai (==9.1.0)", "clickhouse-connect (>=0.5.14,<0.6.0)", "cohere (>=3,<4)", "deeplake (>=3.6.2,<4.0.0)", "docarray[hnswlib] (>=0.32.0,<0.33.0)", "duckduckgo-search (>=3.8.3,<4.0.0)", "elasticsearch (>=8,<9)", "faiss-cpu (>=1,<2)", "google-api-python-client (==2.70.0)", "google-auth (>=2.18.1,<3.0.0)", "google-search-results (>=2,<3)", "gptcache (>=0.1.7)", "html2text (>=2020.1.16,<2021.0.0)", "huggingface_hub (>=0,<1)", "jina (>=3.14,<4.0)", "jinja2 (>=3,<4)", "jq (>=1.4.1,<2.0.0)", "lancedb (>=0.1,<0.2)", "langkit (>=0.0.1.dev3,<0.1.0)", "lark (>=1.1.5,<2.0.0)", "lxml (>=4.9.2,<5.0.0)", "manifest-ml (>=0.0.1,<0.0.2)", "momento (>=1.5.0,<2.0.0)", "nebula3-python (>=3.4.0,<4.0.0)", "neo4j (>=5.8.1,<6.0.0)", "networkx (>=2.6.3,<3.0.0)", "nlpcloud (>=1,<2)", "nltk (>=3,<4)", "nomic (>=1.0.43,<2.0.0)", "openai (>=0,<1)", "openlm (>=0.0.5,<0.0.6)", "opensearch-py (>=2.0.0,<3.0.0)", "pdfminer-six (>=20221105,<20221106)", "pexpect (>=4.8.0,<5.0.0)", "pgvector (>=0.1.6,<0.2.0)", "pinecone-client (>=2,<3)", "pinecone-text (>=0.4.2,<0.5.0)", "psycopg2-binary (>=2.9.5,<3.0.0)", "pymongo (>=4.3.3,<5.0.0)", "pyowm (>=3.3.0,<4.0.0)", "pypdf (>=3.4.0,<4.0.0)", "pytesseract (>=0.3.10,<0.4.0)", "pyvespa (>=0.33.0,<0.34.0)", "qdrant-client (>=1.1.2,<2.0.0)", "redis (>=4,<5)", "requests-toolbelt (>=1.0.0,<2.0.0)", "sentence-transformers (>=2,<3)", "singlestoredb (>=0.7.1,<0.8.0)", "spacy (>=3,<4)", "steamship (>=2.16.9,<3.0.0)", "tensorflow-text (>=2.11.0,<3.0.0)", "tigrisdb (>=1.0.0b6,<2.0.0)", "tiktoken (>=0.3.2,<0.4.0)", "torch (>=1,<3)", "transformers (>=4,<5)", "weaviate-client (>=3,<4)", "wikipedia (>=1,<2)", "wolframalpha (==5.0.0)"] +all = ["O365 (>=2.0.26,<3.0.0)", "aleph-alpha-client (>=2.15.0,<3.0.0)", "anthropic (>=0.2.6,<0.3.0)", "arxiv (>=1.4,<2.0)", "atlassian-python-api (>=3.36.0,<4.0.0)", "awadb (>=0.3.3,<0.4.0)", "azure-ai-formrecognizer (>=3.2.1,<4.0.0)", "azure-ai-vision (>=0.11.1b1,<0.12.0)", "azure-cognitiveservices-speech (>=1.28.0,<2.0.0)", "azure-cosmos (>=4.4.0b1,<5.0.0)", "azure-identity (>=1.12.0,<2.0.0)", "beautifulsoup4 (>=4,<5)", "clarifai (==9.1.0)", "clickhouse-connect (>=0.5.14,<0.6.0)", "cohere (>=3,<4)", "deeplake (>=3.6.2,<4.0.0)", "docarray[hnswlib] (>=0.32.0,<0.33.0)", "duckduckgo-search (>=3.8.3,<4.0.0)", "elasticsearch (>=8,<9)", "esprima (>=4.0.1,<5.0.0)", "faiss-cpu (>=1,<2)", "google-api-python-client (==2.70.0)", "google-auth (>=2.18.1,<3.0.0)", "google-search-results (>=2,<3)", "gptcache (>=0.1.7)", "html2text (>=2020.1.16,<2021.0.0)", "huggingface_hub (>=0,<1)", "jina (>=3.14,<4.0)", "jinja2 (>=3,<4)", "jq (>=1.4.1,<2.0.0)", "lancedb (>=0.1,<0.2)", "langkit (>=0.0.1.dev3,<0.1.0)", "lark (>=1.1.5,<2.0.0)", "lxml (>=4.9.2,<5.0.0)", "manifest-ml (>=0.0.1,<0.0.2)", "momento (>=1.5.0,<2.0.0)", "nebula3-python (>=3.4.0,<4.0.0)", "neo4j (>=5.8.1,<6.0.0)", "networkx (>=2.6.3,<3.0.0)", "nlpcloud (>=1,<2)", "nltk (>=3,<4)", "nomic (>=1.0.43,<2.0.0)", "openai (>=0,<1)", "openlm (>=0.0.5,<0.0.6)", "opensearch-py (>=2.0.0,<3.0.0)", "pdfminer-six (>=20221105,<20221106)", "pexpect (>=4.8.0,<5.0.0)", "pgvector (>=0.1.6,<0.2.0)", "pinecone-client (>=2,<3)", "pinecone-text (>=0.4.2,<0.5.0)", "psycopg2-binary (>=2.9.5,<3.0.0)", "pymongo (>=4.3.3,<5.0.0)", "pyowm (>=3.3.0,<4.0.0)", "pypdf (>=3.4.0,<4.0.0)", "pytesseract (>=0.3.10,<0.4.0)", "pyvespa (>=0.33.0,<0.34.0)", "qdrant-client (>=1.1.2,<2.0.0)", "redis (>=4,<5)", "requests-toolbelt (>=1.0.0,<2.0.0)", "sentence-transformers (>=2,<3)", "singlestoredb (>=0.7.1,<0.8.0)", "spacy (>=3,<4)", "steamship (>=2.16.9,<3.0.0)", "tensorflow-text (>=2.11.0,<3.0.0)", "tigrisdb (>=1.0.0b6,<2.0.0)", "tiktoken (>=0.3.2,<0.4.0)", "torch (>=1,<3)", "transformers (>=4,<5)", "weaviate-client (>=3,<4)", "wikipedia (>=1,<2)", "wolframalpha (==5.0.0)"] azure = ["azure-ai-formrecognizer (>=3.2.1,<4.0.0)", "azure-ai-vision (>=0.11.1b1,<0.12.0)", "azure-cognitiveservices-speech (>=1.28.0,<2.0.0)", "azure-core (>=1.26.4,<2.0.0)", "azure-cosmos (>=4.4.0b1,<5.0.0)", "azure-identity (>=1.12.0,<2.0.0)", "azure-search-documents (==11.4.0a20230509004)", "openai (>=0,<1)"] clarifai = ["clarifai (==9.1.0)"] cohere = ["cohere (>=3,<4)"] docarray = ["docarray[hnswlib] (>=0.32.0,<0.33.0)"] embeddings = ["sentence-transformers (>=2,<3)"] -extended-testing = ["atlassian-python-api (>=3.36.0,<4.0.0)", "beautifulsoup4 (>=4,<5)", "bibtexparser (>=1.4.0,<2.0.0)", "chardet (>=5.1.0,<6.0.0)", "gql (>=3.4.1,<4.0.0)", "html2text (>=2020.1.16,<2021.0.0)", "jq (>=1.4.1,<2.0.0)", "lxml (>=4.9.2,<5.0.0)", "openai (>=0,<1)", "pandas (>=2.0.1,<3.0.0)", "pdfminer-six (>=20221105,<20221106)", "pgvector (>=0.1.6,<0.2.0)", "psychicapi (>=0.5,<0.6)", "py-trello (>=0.19.0,<0.20.0)", "pymupdf (>=1.22.3,<2.0.0)", "pypdf (>=3.4.0,<4.0.0)", "pypdfium2 (>=4.10.0,<5.0.0)", "pyspark (>=3.4.0,<4.0.0)", "requests-toolbelt (>=1.0.0,<2.0.0)", "scikit-learn (>=1.2.2,<2.0.0)", "streamlit (>=1.18.0,<2.0.0)", "telethon (>=1.28.5,<2.0.0)", "tqdm (>=4.48.0)", "zep-python (>=0.31)"] +extended-testing = ["atlassian-python-api (>=3.36.0,<4.0.0)", "beautifulsoup4 (>=4,<5)", "bibtexparser (>=1.4.0,<2.0.0)", "chardet (>=5.1.0,<6.0.0)", "esprima (>=4.0.1,<5.0.0)", "gql (>=3.4.1,<4.0.0)", "html2text (>=2020.1.16,<2021.0.0)", "jq (>=1.4.1,<2.0.0)", "lxml (>=4.9.2,<5.0.0)", "openai (>=0,<1)", "pandas (>=2.0.1,<3.0.0)", "pdfminer-six (>=20221105,<20221106)", "pgvector (>=0.1.6,<0.2.0)", "psychicapi (>=0.8.0,<0.9.0)", "py-trello (>=0.19.0,<0.20.0)", "pymupdf (>=1.22.3,<2.0.0)", "pypdf (>=3.4.0,<4.0.0)", "pypdfium2 (>=4.10.0,<5.0.0)", "pyspark (>=3.4.0,<4.0.0)", "requests-toolbelt (>=1.0.0,<2.0.0)", "scikit-learn (>=1.2.2,<2.0.0)", "streamlit (>=1.18.0,<2.0.0)", "telethon (>=1.28.5,<2.0.0)", "tqdm (>=4.48.0)", "zep-python (>=0.31)"] +javascript = ["esprima (>=4.0.1,<5.0.0)"] llms = ["anthropic (>=0.2.6,<0.3.0)", "clarifai (==9.1.0)", "cohere (>=3,<4)", "huggingface_hub (>=0,<1)", "manifest-ml (>=0.0.1,<0.0.2)", "nlpcloud (>=1,<2)", "openai (>=0,<1)", "openllm (>=0.1.6)", "openlm (>=0.0.5,<0.0.6)", "torch (>=1,<3)", "transformers (>=4,<5)"] openai = ["openai (>=0,<1)", "tiktoken (>=0.3.2,<0.4.0)"] qdrant = ["qdrant-client (>=1.1.2,<2.0.0)"] @@ -7115,4 +7116,4 @@ deploy = ["langchain-serve"] [metadata] lock-version = "2.0" python-versions = ">=3.9,<3.12" -content-hash = "2f8373e1c80ce345f39ed9247fd4759ae94b5c754c4e850d3aa72183556eb92b" +content-hash = "678e32f48c532893c302fda95dcb038add66aaf3e5fe9886d8ba19fa386a4d2e" diff --git a/pyproject.toml b/pyproject.toml index bbd55eaf9..1688e1ccf 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -1,6 +1,6 @@ [tool.poetry] name = "langflow" -version = "0.2.4" +version = "0.2.5" description = "A Python package with a built-in web application" authors = ["Logspace "] maintainers = [ @@ -30,7 +30,7 @@ google-search-results = "^2.4.1" google-api-python-client = "^2.79.0" typer = "^0.9.0" gunicorn = "^20.1.0" -langchain = "^0.0.215" +langchain = "^0.0.218" openai = "^0.27.8" types-pyyaml = "^6.0.12.8" pandas = "^1.5.3" From b29a54c6782f765b604d99f812d54872101e7d9f Mon Sep 17 00:00:00 2001 From: Cristhian Zanforlin Lousa Date: Wed, 28 Jun 2023 11:35:30 -0300 Subject: [PATCH 054/169] =?UTF-8?q?=F0=9F=94=A7=20fix(AccordionComponent/i?= =?UTF-8?q?ndex.tsx):=20fix=20import=20formatting=20and=20add=20missing=20?= =?UTF-8?q?semicolon=20=E2=9C=A8=20feat(AccordionComponent/index.tsx):=20a?= =?UTF-8?q?dd=20support=20for=20opening=20and=20closing=20accordion=20item?= =?UTF-8?q?s=20on=20click=20=F0=9F=94=A7=20fix(popUpContext.tsx):=20add=20?= =?UTF-8?q?missing=20semicolon=20and=20fix=20formatting=20=E2=9C=A8=20feat?= =?UTF-8?q?(popUpContext.tsx):=20add=20closeEdit=20state=20and=20setCloseE?= =?UTF-8?q?dit=20function=20to=20manage=20closing=20edit=20pop-up?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 🐛 fix(ApiModal/index.tsx): add missing dependencies to useEffect to prevent stale data ✨ feat(ApiModal/index.tsx): add support for opening and closing accordion when there are tweaks present 🔧 chore(ApiModal/index.tsx): refactor getValue function to improve readability and maintainability 🔧 chore(ApiModal/index.tsx): refactor buildContent function to improve readability and maintainability 🔧 chore(ApiModal/index.tsx): refactor buildTweakObject function to improve readability and maintainability 🔧 chore(ApiModal/index.tsx): refactor onChange functions to improve readability and maintainability 🔧 chore(ApiModal/index.tsx): refactor value props to improve readability and maintainability 🔧 fix(codeAreaModal): add setCloseEdit function to PopUpContext to handle closing editcode 🔧 fix(promptModal): add setCloseEdit function to PopUpContext to handle closing prompt 🔧 fix(textAreaModal): add setCloseEdit function to PopUpContext to handle closing textarea 🔧 fix(components): change value prop to open prop in AccordionComponentType for better semantics --- .../components/AccordionComponent/index.tsx | 40 ++- src/frontend/src/contexts/popUpContext.tsx | 8 +- src/frontend/src/modals/ApiModal/index.tsx | 257 +++++++++++------- .../src/modals/codeAreaModal/index.tsx | 4 +- src/frontend/src/modals/promptModal/index.tsx | 3 +- .../src/modals/textAreaModal/index.tsx | 3 +- src/frontend/src/types/components/index.ts | 2 +- 7 files changed, 195 insertions(+), 122 deletions(-) diff --git a/src/frontend/src/components/AccordionComponent/index.tsx b/src/frontend/src/components/AccordionComponent/index.tsx index 19a811f87..c1174269a 100644 --- a/src/frontend/src/components/AccordionComponent/index.tsx +++ b/src/frontend/src/components/AccordionComponent/index.tsx @@ -1,5 +1,8 @@ import { ReactElement, useContext, useEffect, useRef, useState } from "react"; -import { AccordionComponentType, ProgressBarType } from "../../types/components"; +import { + AccordionComponentType, + ProgressBarType, +} from "../../types/components"; import { Progress } from "../../components/ui/progress"; import { setInterval } from "timers/promises"; import { @@ -7,22 +10,33 @@ import { AccordionContent, AccordionItem, AccordionTrigger, -} from "../../components/ui/accordion" +} from "../../components/ui/accordion"; export default function AccordionComponent({ trigger, children, + open = false, }: AccordionComponentType) { + const [value, setValue] = useState(!open ? "" : trigger); + function handleClick() { + value == "" ? setValue(trigger) : setValue(""); + } - - return <> - - - {trigger} - - {children} - - - - + return ( + <> + + + { + handleClick(); + }} + className="ml-3" + > + {trigger} + + {children} + + + + ); } diff --git a/src/frontend/src/contexts/popUpContext.tsx b/src/frontend/src/contexts/popUpContext.tsx index 371aeefce..a59eb0f9f 100644 --- a/src/frontend/src/contexts/popUpContext.tsx +++ b/src/frontend/src/contexts/popUpContext.tsx @@ -5,12 +5,15 @@ import React, { useState } from "react"; export const PopUpContext = createContext({ openPopUp: (popUpElement: JSX.Element) => {}, closePopUp: () => {}, + setCloseEdit: (value: string) => {}, + closeEdit: "", }); interface PopUpProviderProps { children: React.ReactNode; } + const PopUpProvider = ({ children }: PopUpProviderProps) => { const [popUpElements, setPopUpElements] = useState([]); @@ -22,8 +25,11 @@ const PopUpProvider = ({ children }: PopUpProviderProps) => { setPopUpElements((prevPopUps) => prevPopUps.slice(1)); }; + const [closeEdit, setCloseEdit] = useState(""); + + return ( - + {children} {popUpElements[0]} diff --git a/src/frontend/src/modals/ApiModal/index.tsx b/src/frontend/src/modals/ApiModal/index.tsx index 27522ece8..a41b361e8 100644 --- a/src/frontend/src/modals/ApiModal/index.tsx +++ b/src/frontend/src/modals/ApiModal/index.tsx @@ -54,10 +54,11 @@ import { TabsContext } from "../../contexts/tabsContext"; export default function ApiModal({ flow }: { flow: FlowType }) { const [open, setOpen] = useState(true); const { dark } = useContext(darkContext); - const { closePopUp } = useContext(PopUpContext); + const { closePopUp, closeEdit, setCloseEdit } = useContext(PopUpContext); const [activeTab, setActiveTab] = useState("0"); const [isCopied, setIsCopied] = useState(false); const [enabled, setEnabled] = useState(null); + const [openAccordion, setOpenAccordion] = useState(false); const tweak = useRef([]); const { setTweak, getTweak } = useContext(TabsContext); const copyToClipboard = () => { @@ -76,10 +77,19 @@ export default function ApiModal({ flow }: { flow: FlowType }) { function setModalOpen(x: boolean) { setOpen(x); if (x === false) { + setCloseEdit(""); + setTweak([]); closePopUp(); } } - + + useEffect(() => { + if (closeEdit !== "") { + setActiveTab("3"); + setOpenAccordion(true); + } + }, [closeEdit]); + const pythonApiCode = getPythonApiCode(flow, tweak.current); const curl_code = getCurlCode(flow, tweak.current); const pythonCode = getPythonCode(flow, tweak.current); @@ -172,46 +182,42 @@ export default function ApiModal({ flow }: { flow: FlowType }) { tabs[0].code = curl_code; tabs[1].code = pythonApiCode; tabs[2].code = pythonCode; - + setTweak(tweak.current); } function buildContent(value) { const htmlContent = (
- {value != null && value != '' ? value : 'None'} + {value != null && value != "" ? value : "None"}
); return htmlContent; } - function getValue(value, node, template){ - + function getValue(value, node, template) { let returnValue = value ?? ""; - if(getTweak.length > 0){ + if (getTweak.length > 0) { for (const obj of getTweak) { // Obtém a chave do objeto interno - const key = Object.keys(obj)[0]; - // Obtém o valor do objeto interno - const value = obj[key]; - if(key == node['id']){ - Object.keys(value).forEach((key) => { - if(key == template['name']){ - returnValue = value[key]; - } - }) - } + const key = Object.keys(obj)[0]; + // Obtém o valor do objeto interno + const value = obj[key]; + if (key == node["id"]) { + Object.keys(value).forEach((key) => { + if (key == template["name"]) { + returnValue = value[key]; + } + }); } - } - else{ + } + } else { return value ?? ""; } return returnValue; } - - return ( @@ -228,9 +234,15 @@ export default function ApiModal({ flow }: { flow: FlowType }) { setActiveTab(value)} + onValueChange={(value) => { + setActiveTab(value) + + if(tweak.current.length > 0){ + setOpenAccordion(true); + } + }} >
@@ -280,7 +292,10 @@ export default function ApiModal({ flow }: { flow: FlowType }) { > {flow["data"]["nodes"].map((t: any, index) => (
- +
@@ -309,7 +324,7 @@ export default function ApiModal({ flow }: { flow: FlowType }) { "code" || t.data.node.template[n].type === "prompt" || - t.data.node.template[n].type === + t.data.node.template[n].type === "file" || t.data.node.template[n].type === "int") @@ -346,9 +361,7 @@ export default function ApiModal({ flow }: { flow: FlowType }) { : t.data.node .template[n].value } - onChange={(k) => { - - }} + onChange={(k) => {}} onAddInput={(k) => { buildTweakObject( t["data"]["id"], @@ -371,14 +384,23 @@ export default function ApiModal({ flow }: { flow: FlowType }) { )} > { + buildTweakObject( + t["data"]["id"], + k, + t.data.node + .template[n] + ); }} /> @@ -391,12 +413,12 @@ export default function ApiModal({ flow }: { flow: FlowType }) { t.data.node.template[n] .password ?? false } - value={ - - getValue(t.data.node.template[n] - .value, t.data, t.data.node.template[n]) - - } + value={getValue( + t.data.node.template[n] + .value, + t.data, + t.data.node.template[n] + )} onChange={(k) => { buildTweakObject( t["data"]["id"], @@ -433,52 +455,54 @@ export default function ApiModal({ flow }: { flow: FlowType }) { disabled={false} /> - ) - : - t.data.node.template[n] + ) : t.data.node.template[n] .type === "file" ? ( - + .value, + t.data, + t.data.node.template[n] + ) + )} + >
- { - }} - fileTypes={ - t.data.node.template[n] - .fileTypes - } - suffixes={ - t.data.node.template[n] - .suffixes - } - onFileChange={(k: any) => { - }} - > -
-
- - ) - : t.data.node.template[n] + {}} + fileTypes={ + t.data.node.template[n] + .fileTypes + } + suffixes={ + t.data.node.template[n] + .suffixes + } + onFileChange={( + k: any + ) => {}} + > + + + ) : t.data.node.template[n] .type === "float" ? (
{ buildTweakObject( t["data"]["id"], @@ -500,22 +524,19 @@ export default function ApiModal({ flow }: { flow: FlowType }) { t.data.node.template[n] .options } - onSelect={(k) =>{ - - - + onSelect={(k) => { buildTweakObject( t["data"]["id"], k, t.data.node.template[n] - ) - } - - } - value={ - getValue(t.data.node.template[n] - .value, t.data, t.data.node.template[n]) - } + ); + }} + value={getValue( + t.data.node.template[n] + .value, + t.data, + t.data.node.template[n] + )} >
) : t.data.node.template[n] @@ -524,10 +545,12 @@ export default function ApiModal({ flow }: { flow: FlowType }) { { buildTweakObject( t["data"]["id"], @@ -542,19 +565,32 @@ export default function ApiModal({ flow }: { flow: FlowType }) {
{ + buildTweakObject( + t["data"]["id"], + k, + t.data.node.template[ + n + ] + ); }} />
@@ -564,19 +600,32 @@ export default function ApiModal({ flow }: { flow: FlowType }) {
{ + buildTweakObject( + t["data"]["id"], + k, + t.data.node.template[ + n + ] + ); }} />
diff --git a/src/frontend/src/modals/codeAreaModal/index.tsx b/src/frontend/src/modals/codeAreaModal/index.tsx index f6e4b8e1c..0f9a26f33 100644 --- a/src/frontend/src/modals/codeAreaModal/index.tsx +++ b/src/frontend/src/modals/codeAreaModal/index.tsx @@ -34,13 +34,15 @@ export default function CodeAreaModal({ const [code, setCode] = useState(value); const { dark } = useContext(darkContext); const { setErrorData, setSuccessData } = useContext(alertContext); - const { closePopUp } = useContext(PopUpContext); + const { closePopUp,setCloseEdit } = useContext(PopUpContext); const ref = useRef(); function setModalOpen(x: boolean) { setOpen(x); if (x === false) { setTimeout(() => { closePopUp(); + setCloseEdit("editcode"); + }, 300); } } diff --git a/src/frontend/src/modals/promptModal/index.tsx b/src/frontend/src/modals/promptModal/index.tsx index 8a3ce4185..f051de427 100644 --- a/src/frontend/src/modals/promptModal/index.tsx +++ b/src/frontend/src/modals/promptModal/index.tsx @@ -16,12 +16,13 @@ export default function PromptAreaModal({ const [myValue, setMyValue] = useState(value); const { dark } = useContext(darkContext); const { setErrorData, setSuccessData } = useContext(alertContext); - const { closePopUp } = useContext(PopUpContext); + const { closePopUp, setCloseEdit } = useContext(PopUpContext); const ref = useRef(); function setModalOpen(x: boolean) { setOpen(x); if (x === false) { setTimeout(() => { + setCloseEdit("prompt"); closePopUp(); }, 300); } diff --git a/src/frontend/src/modals/textAreaModal/index.tsx b/src/frontend/src/modals/textAreaModal/index.tsx index a72f74643..4dee61385 100644 --- a/src/frontend/src/modals/textAreaModal/index.tsx +++ b/src/frontend/src/modals/textAreaModal/index.tsx @@ -15,12 +15,13 @@ export default function TextAreaModal({ }) { const [open, setOpen] = useState(true); const [myValue, setMyValue] = useState(value); - const { closePopUp } = useContext(PopUpContext); + const { closePopUp, setCloseEdit } = useContext(PopUpContext); const ref = useRef(); function setModalOpen(x: boolean) { setOpen(x); if (x === false) { setTimeout(() => { + setCloseEdit("textarea"); closePopUp(); }, 300); } diff --git a/src/frontend/src/types/components/index.ts b/src/frontend/src/types/components/index.ts index 0adbdc1d3..4c936cabe 100644 --- a/src/frontend/src/types/components/index.ts +++ b/src/frontend/src/types/components/index.ts @@ -121,6 +121,6 @@ export type RadialProgressType = { export type AccordionComponentType = { children?: ReactElement; - value?: string; + open?: boolean; trigger?: string; }; \ No newline at end of file From dc4d1ccd65539602199f9fefd8f1357610929cbc Mon Sep 17 00:00:00 2001 From: Cristhian Zanforlin Lousa Date: Wed, 28 Jun 2023 11:43:21 -0300 Subject: [PATCH 055/169] =?UTF-8?q?=F0=9F=90=9B=20fix(ApiModal):=20remove?= =?UTF-8?q?=20unnecessary=20div=20tag=20to=20fix=20layout=20issue=20?= =?UTF-8?q?=F0=9F=90=9B=20fix(codeAreaModal):=20fix=20closePopUp=20functio?= =?UTF-8?q?n=20call=20placement=20to=20ensure=20proper=20functionality=20?= =?UTF-8?q?=F0=9F=90=9B=20fix(genericModal):=20set=20closeEdit=20value=20t?= =?UTF-8?q?o=20"generic"=20to=20fix=20issue=20with=20closing=20the=20modal?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/frontend/src/modals/ApiModal/index.tsx | 8 +++++--- src/frontend/src/modals/codeAreaModal/index.tsx | 3 +-- src/frontend/src/modals/genericModal/index.tsx | 3 ++- 3 files changed, 8 insertions(+), 6 deletions(-) diff --git a/src/frontend/src/modals/ApiModal/index.tsx b/src/frontend/src/modals/ApiModal/index.tsx index a41b361e8..76c07c5aa 100644 --- a/src/frontend/src/modals/ApiModal/index.tsx +++ b/src/frontend/src/modals/ApiModal/index.tsx @@ -374,8 +374,7 @@ export default function ApiModal({ flow }: { flow: FlowType }) { /> ) : t.data.node.template[n] .multiline ? ( -
- +
+ -
+
+ ) : ( { - closePopUp(); setCloseEdit("editcode"); - + closePopUp(); }, 300); } } diff --git a/src/frontend/src/modals/genericModal/index.tsx b/src/frontend/src/modals/genericModal/index.tsx index 6f89e24a6..8223cb3f8 100644 --- a/src/frontend/src/modals/genericModal/index.tsx +++ b/src/frontend/src/modals/genericModal/index.tsx @@ -38,11 +38,12 @@ export default function GenericModal({ const [myValue, setMyValue] = useState(value); const { dark } = useContext(darkContext); const { setErrorData, setSuccessData } = useContext(alertContext); - const { closePopUp } = useContext(PopUpContext); + const { closePopUp, setCloseEdit } = useContext(PopUpContext); const ref = useRef(); function setModalOpen(x: boolean) { setOpen(x); if (x === false) { + setCloseEdit("generic"); closePopUp(); } } From ab0fcc9cb0fa12f4e6d6610ef2aff585b5cb81e3 Mon Sep 17 00:00:00 2001 From: Cristhian Zanforlin Lousa Date: Wed, 28 Jun 2023 12:16:27 -0300 Subject: [PATCH 056/169] =?UTF-8?q?=F0=9F=94=A7=20chore(ApiModal):=20add?= =?UTF-8?q?=20tweak.current=20assignment=20to=20improve=20code=20readabili?= =?UTF-8?q?ty=20and=20maintainability?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/frontend/src/modals/ApiModal/index.tsx | 1 + 1 file changed, 1 insertion(+) diff --git a/src/frontend/src/modals/ApiModal/index.tsx b/src/frontend/src/modals/ApiModal/index.tsx index 76c07c5aa..b179e44b0 100644 --- a/src/frontend/src/modals/ApiModal/index.tsx +++ b/src/frontend/src/modals/ApiModal/index.tsx @@ -87,6 +87,7 @@ export default function ApiModal({ flow }: { flow: FlowType }) { if (closeEdit !== "") { setActiveTab("3"); setOpenAccordion(true); + tweak.current = getTweak; } }, [closeEdit]); From 4f0d928a57a159089e0c7bda6058648266e2dcd7 Mon Sep 17 00:00:00 2001 From: Cristhian Zanforlin Lousa Date: Wed, 28 Jun 2023 14:07:46 -0300 Subject: [PATCH 057/169] =?UTF-8?q?=F0=9F=90=9B=20fix(ApiModal/index.tsx):?= =?UTF-8?q?=20import=20the=20'filter'=20function=20from=20lodash=20to=20fi?= =?UTF-8?q?x=20missing=20reference=20error=20=E2=9C=A8=20feat(ApiModal/ind?= =?UTF-8?q?ex.tsx):=20add=20functionality=20to=20filter=20nodes=20and=20di?= =?UTF-8?q?splay=20only=20nodes=20with=20certain=20types=20in=20the=20twea?= =?UTF-8?q?ks=20list=20=F0=9F=90=9B=20fix(ApiModal/index.tsx):=20fix=20iss?= =?UTF-8?q?ue=20with=20the=20tweaks=20list=20not=20updating=20when=20the?= =?UTF-8?q?=20flow=20changes=20=F0=9F=90=9B=20fix(ApiModal/index.tsx):=20f?= =?UTF-8?q?ix=20issue=20with=20the=20tweaks=20list=20not=20updating=20when?= =?UTF-8?q?=20the=20flow=20changes=20=F0=9F=90=9B=20fix(ApiModal/index.tsx?= =?UTF-8?q?):=20fix=20issue=20with=20the=20tweaks=20list=20not=20updating?= =?UTF-8?q?=20when=20the=20flow=20changes=20=F0=9F=90=9B=20fix(ApiModal/in?= =?UTF-8?q?dex.tsx):=20fix=20issue=20with=20the=20tweaks=20list=20not=20up?= =?UTF-8?q?dating=20when=20the=20flow=20changes=20=F0=9F=90=9B=20fix(ApiMo?= =?UTF-8?q?dal/index.tsx):=20fix=20issue=20with=20the=20tweaks=20list=20no?= =?UTF-8?q?t=20updating=20when=20the=20flow=20changes=20=F0=9F=90=9B=20fix?= =?UTF-8?q?(ApiModal/index.tsx):=20fix=20issue=20with=20the=20tweaks=20lis?= =?UTF-8?q?t=20not=20updating=20when=20the=20flow=20changes=20=F0=9F=90=9B?= =?UTF-8?q?=20fix(ApiModal/index.tsx):=20fix=20issue=20with=20the=20tweaks?= =?UTF-8?q?=20list=20not=20updating=20when=20the=20flow=20changes=20?= =?UTF-8?q?=F0=9F=90=9B=20fix(ApiModal/index.tsx):=20fix=20issue=20with=20?= =?UTF-8?q?the=20tweaks=20list=20not=20updating=20when=20the=20flow=20chan?= =?UTF-8?q?ges=20=F0=9F=90=9B=20fix(ApiModal/index.tsx):=20fix=20issue=20w?= =?UTF-8?q?ith=20the=20tweaks=20list=20not=20updating=20when=20the=20flow?= =?UTF-8?q?=20changes=20=F0=9F=90=9B=20fix(ApiModal/index.tsx):=20fix=20is?= =?UTF-8?q?sue=20with=20the=20tweaks=20list=20not=20updating=20when=20the?= =?UTF-8?q?=20flow=20changes=20=F0=9F=90=9B=20fix(ApiModal/index.tsx):=20f?= =?UTF-8?q?ix=20issue=20with=20the=20tweaks=20list=20not=20updating=20when?= =?UTF-8?q?=20the=20flow=20changes=20=F0=9F=90=9B=20fix(ApiModal/index.tsx?= =?UTF-8?q?):=20fix=20issue=20with=20the=20tweaks=20list=20not=20updating?= =?UTF-8?q?=20when=20the=20flow=20changes=20=F0=9F=90=9B=20fix(ApiModal/in?= =?UTF-8?q?dex.tsx):=20fix=20issue=20with=20the=20tweaks=20list=20not=20up?= =?UTF-8?q?dating=20when=20the=20flow=20changes=20=F0=9F=90=9B=20fix(ApiMo?= =?UTF-8?q?dal/index.tsx):=20fix=20issue=20with=20the=20tweaks=20list=20no?= =?UTF-8?q?t=20updating=20when=20the=20flow=20changes=20=F0=9F=90=9B=20fix?= =?UTF-8?q?(ApiModal/index.tsx):=20fix=20issue=20with=20the=20tweaks=20lis?= =?UTF-8?q?t=20not=20updating=20when=20the=20flow=20changes=20=F0=9F=90=9B?= =?UTF-8?q?=20fix(ApiModal/index.tsx):=20fix=20issue=20with=20the=20tweaks?= =?UTF-8?q?=20list=20not=20updating=20when=20the=20flow=20changes=20?= =?UTF-8?q?=F0=9F=90=9B=20fix(ApiModal/index.tsx):=20fix=20issue=20with=20?= =?UTF-8?q?the=20tweaks=20list=20not=20updating=20when=20the=20flow=20chan?= =?UTF-8?q?ges=20=F0=9F=90=9B=20fix(ApiModal/index.tsx):=20fix=20issue=20w?= =?UTF-8?q?ith=20the=20tweaks=20list=20not=20updating=20when=20the=20flow?= =?UTF-8?q?=20changes=20=F0=9F=90=9B=20fix(ApiModal/index.tsx):=20fix=20is?= =?UTF-8?q?sue=20with=20the=20tweaks=20list=20not=20updating=20when=20the?= =?UTF-8?q?=20flow=20changes=20=F0=9F=90=9B=20fix(ApiModal/index.tsx):=20f?= =?UTF-8?q?ix=20issue=20with=20the=20tweaks=20list=20not=20updating=20when?= =?UTF-8?q?=20the=20flow=20changes=20=F0=9F=90=9B=20fix(ApiModal/index.tsx?= =?UTF-8?q?):=20fix=20issue=20with=20the=20tweaks=20list=20not=20updating?= =?UTF-8?q?=20when=20the=20flow=20changes=20=F0=9F=90=9B=20fix(ApiModal/in?= =?UTF-8?q?dex.tsx):=20fix=20issue=20with=20the=20tweaks=20list=20not=20up?= =?UTF-8?q?dating=20when=20the=20flow=20changes=20=F0=9F=90=9B=20fix(ApiMo?= =?UTF-8?q?dal/index.tsx):=20fix=20issue=20with=20the=20tweaks=20list=20no?= =?UTF-8?q?t=20updating=20when=20the=20flow=20changes=20=F0=9F=90=9B=20fix?= =?UTF-8?q?(ApiModal/index.tsx):=20fix=20issue=20with=20the=20tweaks=20lis?= =?UTF-8?q?t=20not=20updating=20when=20the=20flow=20changes=20=F0=9F=90=9B?= =?UTF-8?q?=20fix(ApiModal/index.tsx):=20fix=20issue=20with=20the=20tweaks?= =?UTF-8?q?=20list=20not=20updating=20when=20the=20flow=20changes=20?= =?UTF-8?q?=F0=9F=90=9B=20fix(ApiModal/index.tsx):=20fix=20issue=20with=20?= =?UTF-8?q?the=20tweaks=20list=20not=20updating=20when=20the=20flow=20chan?= =?UTF-8?q?ges=20=F0=9F=90=9B=20fix(ApiModal/index.tsx):=20fix=20issue=20w?= =?UTF-8?q?ith=20the=20tweaks=20list=20not=20updating=20when=20the=20flow?= =?UTF-8?q?=20changes=20=F0=9F=90=9B=20fix(ApiModal/index.tsx):=20fix=20is?= =?UTF-8?q?sue=20with=20the=20tweaks=20list=20not=20updating=20when=20the?= =?UTF-8?q?=20flow=20changes=20=F0=9F=90=9B=20fix(ApiModal/index.tsx):=20f?= =?UTF-8?q?ix=20issue=20with=20the=20tweaks=20list=20not=20updating=20when?= =?UTF-8?q?=20the=20flow=20changes=20=F0=9F=90=9B=20fix(ApiModal/index.tsx?= =?UTF-8?q?):=20fix=20issue=20with=20the=20tweaks=20list=20not=20updating?= =?UTF-8?q?=20when=20the=20flow=20changes=20=F0=9F=90=9B=20fix(ApiModal/in?= =?UTF-8?q?dex.tsx):=20fix=20issue=20with=20the=20tweaks=20list=20not=20up?= =?UTF-8?q?dating=20when=20the=20flow=20changes=20=F0=9F=90=9B=20fix(ApiMo?= =?UTF-8?q?dal/index.tsx):=20fix=20issue=20with=20the=20tweaks=20list=20no?= =?UTF-8?q?t=20updating=20when=20the=20flow=20changes=20=F0=9F=90=9B=20fix?= =?UTF-8?q?(ApiModal/index.tsx):=20fix=20issue=20with=20the?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/frontend/src/modals/ApiModal/index.tsx | 90 ++++++++++++++++++---- 1 file changed, 73 insertions(+), 17 deletions(-) diff --git a/src/frontend/src/modals/ApiModal/index.tsx b/src/frontend/src/modals/ApiModal/index.tsx index b179e44b0..ee0222ce1 100644 --- a/src/frontend/src/modals/ApiModal/index.tsx +++ b/src/frontend/src/modals/ApiModal/index.tsx @@ -48,7 +48,7 @@ import PromptAreaComponent from "../../components/promptComponent"; import TextAreaComponent from "../../components/textAreaComponent"; import ToggleShadComponent from "../../components/toggleShadComponent"; import ShadTooltip from "../../components/ShadTooltipComponent"; -import { cloneDeep } from "lodash"; +import { cloneDeep, filter } from "lodash"; import { TabsContext } from "../../contexts/tabsContext"; export default function ApiModal({ flow }: { flow: FlowType }) { @@ -60,6 +60,7 @@ export default function ApiModal({ flow }: { flow: FlowType }) { const [enabled, setEnabled] = useState(null); const [openAccordion, setOpenAccordion] = useState(false); const tweak = useRef([]); + const tweaksList = useRef([]); const { setTweak, getTweak } = useContext(TabsContext); const copyToClipboard = () => { if (!navigator.clipboard || !navigator.clipboard.writeText) { @@ -91,11 +92,54 @@ export default function ApiModal({ flow }: { flow: FlowType }) { } }, [closeEdit]); + + const pythonApiCode = getPythonApiCode(flow, tweak.current); const curl_code = getCurlCode(flow, tweak.current); const pythonCode = getPythonCode(flow, tweak.current); const tweaksCode = buildTweaks(flow); + useEffect(() => { + filterNodes(); + + }, []) + function filterNodes(){ + + let arrNodesWithValues = []; + + flow["data"]["nodes"].forEach(t => { + + Object.keys(t['data']['node']['template']).filter( + (n) => + n.charAt(0) !== "_" && + t.data.node.template[n].show && + (t.data.node.template[n].type === + "str" || + t.data.node.template[n].type === + "bool" || + t.data.node.template[n].type === + "float" || + t.data.node.template[n].type === + "code" || + t.data.node.template[n].type === + "prompt" || + t.data.node.template[n].type === + "file" || + t.data.node.template[n].type === + "int") + ) + .map((n, i) => { + arrNodesWithValues.push(t['id']) + }) + + }) + + tweaksList.current = arrNodesWithValues.filter((value, index, self) => { + return self.indexOf(value) === index; + }); + + } + const tabs = [ { name: "cURL", @@ -238,9 +282,9 @@ export default function ApiModal({ flow }: { flow: FlowType }) { value={activeTab} className="w-full h-full overflow-hidden text-center bg-muted rounded-md border" onValueChange={(value) => { - setActiveTab(value) - - if(tweak.current.length > 0){ + setActiveTab(value); + + if (tweak.current.length > 0) { setOpenAccordion(true); } }} @@ -293,6 +337,12 @@ export default function ApiModal({ flow }: { flow: FlowType }) { > {flow["data"]["nodes"].map((t: any, index) => (
+ {( + + + tweaksList.current.includes(t["data"]["id"]) && + + { - // console.log(t.data.node.template[n]); + //console.log(t.data.node.template[n]); return ( ) : t.data.node.template[n] .multiline ? ( - -
- + +
-
+
- ) : (
+ )} + + {( + tweaksList.current.length === 0 && + <> +
No tweaks are available for this flow.
+ + )} +
))} From 1251cf70a9d093d1cc948f876e8b914ab8af8527 Mon Sep 17 00:00:00 2001 From: Cristhian Zanforlin Lousa Date: Wed, 28 Jun 2023 14:20:53 -0300 Subject: [PATCH 058/169] formatting --- src/frontend/src/modals/ApiModal/index.tsx | 717 +++++++++++---------- 1 file changed, 361 insertions(+), 356 deletions(-) diff --git a/src/frontend/src/modals/ApiModal/index.tsx b/src/frontend/src/modals/ApiModal/index.tsx index ee0222ce1..1000a52d6 100644 --- a/src/frontend/src/modals/ApiModal/index.tsx +++ b/src/frontend/src/modals/ApiModal/index.tsx @@ -92,8 +92,6 @@ export default function ApiModal({ flow }: { flow: FlowType }) { } }, [closeEdit]); - - const pythonApiCode = getPythonApiCode(flow, tweak.current); const curl_code = getCurlCode(flow, tweak.current); const pythonCode = getPythonCode(flow, tweak.current); @@ -101,43 +99,32 @@ export default function ApiModal({ flow }: { flow: FlowType }) { useEffect(() => { filterNodes(); - - }, []) - function filterNodes(){ - + }, []); + function filterNodes() { let arrNodesWithValues = []; - - flow["data"]["nodes"].forEach(t => { - - Object.keys(t['data']['node']['template']).filter( - (n) => - n.charAt(0) !== "_" && - t.data.node.template[n].show && - (t.data.node.template[n].type === - "str" || - t.data.node.template[n].type === - "bool" || - t.data.node.template[n].type === - "float" || - t.data.node.template[n].type === - "code" || - t.data.node.template[n].type === - "prompt" || - t.data.node.template[n].type === - "file" || - t.data.node.template[n].type === - "int") - ) - .map((n, i) => { - arrNodesWithValues.push(t['id']) - }) - - }) + + flow["data"]["nodes"].forEach((t) => { + Object.keys(t["data"]["node"]["template"]) + .filter( + (n) => + n.charAt(0) !== "_" && + t.data.node.template[n].show && + (t.data.node.template[n].type === "str" || + t.data.node.template[n].type === "bool" || + t.data.node.template[n].type === "float" || + t.data.node.template[n].type === "code" || + t.data.node.template[n].type === "prompt" || + t.data.node.template[n].type === "file" || + t.data.node.template[n].type === "int") + ) + .map((n, i) => { + arrNodesWithValues.push(t["id"]); + }); + }); tweaksList.current = arrNodesWithValues.filter((value, index, self) => { return self.indexOf(value) === index; }); - } const tabs = [ @@ -337,329 +324,222 @@ export default function ApiModal({ flow }: { flow: FlowType }) { > {flow["data"]["nodes"].map((t: any, index) => (
- {( + {tweaksList.current.includes(t["data"]["id"]) && ( + +
+
+ + + + PARAM + + + VALUE + + + + + {Object.keys(t["data"]["node"]["template"]) + .filter( + (n) => + n.charAt(0) !== "_" && + t.data.node.template[n].show && + (t.data.node.template[n].type === + "str" || + t.data.node.template[n].type === + "bool" || + t.data.node.template[n].type === + "float" || + t.data.node.template[n].type === + "code" || + t.data.node.template[n].type === + "prompt" || + t.data.node.template[n].type === + "file" || + t.data.node.template[n].type === + "int") + ) + .map((n, i) => { + //console.log(t.data.node.template[n]); - - tweaksList.current.includes(t["data"]["id"]) && - - - -
-
- - - - PARAM - - - VALUE - - - - - {Object.keys(t["data"]["node"]["template"]) - .filter( - (n) => - n.charAt(0) !== "_" && - t.data.node.template[n].show && - (t.data.node.template[n].type === - "str" || - t.data.node.template[n].type === - "bool" || - t.data.node.template[n].type === - "float" || - t.data.node.template[n].type === - "code" || - t.data.node.template[n].type === - "prompt" || - t.data.node.template[n].type === - "file" || - t.data.node.template[n].type === - "int") - ) - .map((n, i) => { - //console.log(t.data.node.template[n]); - - return ( - - - {n} - - -
- {t.data.node.template[n].type === - "str" && - !t.data.node.template[n] - .options ? ( -
- {t.data.node.template[n] - .list ? ( - {}} - onAddInput={(k) => { - buildTweakObject( - t["data"]["id"], - k, + return ( + + + {n} + + +
+ {t.data.node.template[n] + .type === "str" && + !t.data.node.template[n] + .options ? ( +
+ {t.data.node.template[n] + .list ? ( + - ) : t.data.node.template[n] - .multiline ? ( - -
- {}} + onAddInput={(k) => { + buildTweakObject( + t["data"]["id"], + k, t.data.node .template[n] - .value, - t.data, - t.data.node - .template[n] - )} - onChange={(k) => { - buildTweakObject( - t["data"]["id"], - k, + ); + }} + /> + ) : t.data.node.template[n] + .multiline ? ( + +
+ -
-
- ) : ( - { + buildTweakObject( + t["data"]["id"], + k, + t.data.node + .template[n] + ); + }} + /> +
+
+ ) : ( + { + buildTweakObject( + t["data"]["id"], + k, + t.data.node + .template[n] + ); + }} + /> + )} +
+ ) : t.data.node.template[n] + .type === "bool" ? ( +
+ {" "} + { + setEnabled={(e) => { + t.data.node.template[ + n + ].value = e; + setEnabled(e); buildTweakObject( t["data"]["id"], - k, + e, t.data.node.template[ n ] ); }} + size="small" + disabled={false} /> - )} -
- ) : t.data.node.template[n] - .type === "bool" ? ( -
- {" "} - { - t.data.node.template[ - n - ].value = e; - setEnabled(e); - buildTweakObject( - t["data"]["id"], - e, - t.data.node.template[n] - ); - }} - size="small" - disabled={false} - /> -
- ) : t.data.node.template[n] - .type === "file" ? ( - -
- {}} - fileTypes={ - t.data.node.template[n] - .fileTypes - } - suffixes={ - t.data.node.template[n] - .suffixes - } - onFileChange={( - k: any - ) => {}} - >
-
- ) : t.data.node.template[n] - .type === "float" ? ( -
- { - buildTweakObject( - t["data"]["id"], - k, - t.data.node.template[n] - ); - }} - /> -
- ) : t.data.node.template[n] - .type === "str" && - t.data.node.template[n] - .options ? ( -
- { - buildTweakObject( - t["data"]["id"], - k, - t.data.node.template[n] - ); - }} - value={getValue( - t.data.node.template[n] - .value, - t.data, - t.data.node.template[n] - )} - > -
- ) : t.data.node.template[n] - .type === "int" ? ( -
- { - buildTweakObject( - t["data"]["id"], - k, - t.data.node.template[n] - ); - }} - /> -
- ) : t.data.node.template[n] - .type === "prompt" ? ( - -
- { - buildTweakObject( - t["data"]["id"], - k, + ) + )} + > +
+ -
- - ) : t.data.node.template[n] - .type === "code" ? ( - + ].value ?? "" + } + onChange={( + k: any + ) => {}} + fileTypes={ + t.data.node.template[ + n + ].fileTypes + } + suffixes={ + t.data.node.template[ + n + ].suffixes + } + onFileChange={( + k: any + ) => {}} + > +
+
+ ) : t.data.node.template[n] + .type === "float" ? (
-
- - ) : t.data.node.template[n] - .type === "Any" ? ( - "-" - ) : ( -
- )} -
-
-
- ); - })} - -
-
-
- )} - - {( - tweaksList.current.length === 0 && - <> -
No tweaks are available for this flow.
- - )} + ) : t.data.node.template[n] + .type === "str" && + t.data.node.template[n] + .options ? ( +
+ { + buildTweakObject( + t["data"]["id"], + k, + t.data.node.template[ + n + ] + ); + }} + value={getValue( + t.data.node.template[n] + .value, + t.data, + t.data.node.template[n] + )} + > +
+ ) : t.data.node.template[n] + .type === "int" ? ( +
+ { + buildTweakObject( + t["data"]["id"], + k, + t.data.node.template[ + n + ] + ); + }} + /> +
+ ) : t.data.node.template[n] + .type === "prompt" ? ( + +
+ { + buildTweakObject( + t["data"]["id"], + k, + t.data.node + .template[n] + ); + }} + /> +
+
+ ) : t.data.node.template[n] + .type === "code" ? ( + +
+ { + buildTweakObject( + t["data"]["id"], + k, + t.data.node + .template[n] + ); + }} + /> +
+
+ ) : t.data.node.template[n] + .type === "Any" ? ( + "-" + ) : ( +
+ )} +
+ + + ); + })} + + +
+ + )} + {tweaksList.current.length === 0 && ( + <> +
+ No tweaks are available for this flow. +
+ + )}
))} From 8c12e17ad07d0bf36a407054dc5365c71443eeb5 Mon Sep 17 00:00:00 2001 From: Gabriel Luiz Freitas Almeida Date: Wed, 28 Jun 2023 18:06:46 -0300 Subject: [PATCH 059/169] =?UTF-8?q?=F0=9F=93=9D=20docs(config.yaml):=20upd?= =?UTF-8?q?ate=20documentation=20link=20for=20ConversationBufferMemory=20i?= =?UTF-8?q?n=20memories=20section=20The=20documentation=20link=20for=20Con?= =?UTF-8?q?versationBufferMemory=20in=20the=20memories=20section=20has=20b?= =?UTF-8?q?een=20updated=20to=20point=20to=20the=20correct=20URL=20"https:?= =?UTF-8?q?//python.langchain.com/docs/modules/memory/how=5Fto/buffer".=20?= =?UTF-8?q?This=20change=20ensures=20that=20users=20can=20access=20the=20c?= =?UTF-8?q?orrect=20documentation=20for=20using=20ConversationBufferMemory?= =?UTF-8?q?.?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/backend/langflow/config.yaml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/backend/langflow/config.yaml b/src/backend/langflow/config.yaml index 518ff7029..310117381 100644 --- a/src/backend/langflow/config.yaml +++ b/src/backend/langflow/config.yaml @@ -121,7 +121,7 @@ llms: documentation: "https://python.langchain.com/docs/modules/model_io/models/llms/integrations/huggingface_hub" memories: ConversationBufferMemory: - documentation: "https://python.langchain.com/docs/modules/memory/how_to/summary" + documentation: "https://python.langchain.com/docs/modules/memory/how_to/buffer" ConversationSummaryMemory: documentation: "https://python.langchain.com/docs/modules/memory/how_to/summary" ConversationKGMemory: From 3485893be04bbca558cd5f7f8198a9fffc08e348 Mon Sep 17 00:00:00 2001 From: Gabriel Luiz Freitas Almeida Date: Wed, 28 Jun 2023 18:16:04 -0300 Subject: [PATCH 060/169] =?UTF-8?q?=F0=9F=94=80=20refactor(textsplitters.p?= =?UTF-8?q?y):=20extract=20options=20list=20into=20a=20variable=20for=20re?= =?UTF-8?q?usability=20and=20sorting=20The=20options=20list=20for=20the=20?= =?UTF-8?q?separator=5Ftype=20field=20in=20the=20TextSplittersFrontendNode?= =?UTF-8?q?=20class=20has=20been=20extracted=20into=20a=20variable=20calle?= =?UTF-8?q?d=20options.=20This=20improves=20code=20readability=20and=20all?= =?UTF-8?q?ows=20for=20easier=20modification=20and=20sorting=20of=20the=20?= =?UTF-8?q?options=20list.?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/backend/langflow/template/frontend_node/textsplitters.py | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/src/backend/langflow/template/frontend_node/textsplitters.py b/src/backend/langflow/template/frontend_node/textsplitters.py index 0a444ff08..65a2be6f6 100644 --- a/src/backend/langflow/template/frontend_node/textsplitters.py +++ b/src/backend/langflow/template/frontend_node/textsplitters.py @@ -21,6 +21,8 @@ class TextSplittersFrontendNode(FrontendNode): # Add a field for type of separator # which will have Text or any value from the # Language enum + options = [x.value for x in Language] + ["Text"] + options.sort() self.template.add_field( TemplateField( field_type="str", @@ -29,7 +31,7 @@ class TextSplittersFrontendNode(FrontendNode): name="separator_type", advanced=False, is_list=True, - options=[x.value for x in Language], + options=options, value="Text", display_name="Separator Type", ) From 36212884e4f3f8f7e11b9b47e6dbc572783f2a9c Mon Sep 17 00:00:00 2001 From: Gabriel Luiz Freitas Almeida Date: Wed, 28 Jun 2023 18:16:13 -0300 Subject: [PATCH 061/169] =?UTF-8?q?=F0=9F=90=9B=20fix(loading.py):=20refac?= =?UTF-8?q?tor=20instantiate=5Ftextsplitter=20function=20to=20improve=20re?= =?UTF-8?q?adability=20and=20remove=20unnecessary=20code=20The=20`instanti?= =?UTF-8?q?ate=5Ftextsplitter`=20function=20has=20been=20refactored=20to?= =?UTF-8?q?=20improve=20readability=20and=20remove=20unnecessary=20code.?= =?UTF-8?q?=20The=20condition=20for=20creating=20the=20`text=5Fsplitter`?= =?UTF-8?q?=20object=20has=20been=20simplified=20and=20the=20`separator=5F?= =?UTF-8?q?type`=20parameter=20is=20now=20removed=20from=20the=20`params`?= =?UTF-8?q?=20dictionary=20if=20it=20exists.=20Additionally,=20the=20`lang?= =?UTF-8?q?uage`=20parameter=20is=20now=20passed=20as=20an=20instance=20of?= =?UTF-8?q?=20the=20`Language`=20class=20from=20the=20`langchain.text=5Fsp?= =?UTF-8?q?litter`=20module.=20This=20change=20ensures=20that=20the=20`tex?= =?UTF-8?q?t=5Fsplitter`=20object=20is=20created=20correctly=20and=20the?= =?UTF-8?q?=20`split=5Fdocuments`=20method=20is=20called=20with=20the=20ap?= =?UTF-8?q?propriate=20parameters.?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../langflow/interface/initialize/loading.py | 13 ++++++++----- 1 file changed, 8 insertions(+), 5 deletions(-) diff --git a/src/backend/langflow/interface/initialize/loading.py b/src/backend/langflow/interface/initialize/loading.py index 14642828a..3ddb64c24 100644 --- a/src/backend/langflow/interface/initialize/loading.py +++ b/src/backend/langflow/interface/initialize/loading.py @@ -221,14 +221,17 @@ def instantiate_textsplitter( ) from exc if ( - "separator_type" in params - and params["separator_type"] == "Text" - or "separator_type" not in params - ): + "separator_type" in params and params["separator_type"] == "Text" + ) or "separator_type" not in params: + params.pop("separator_type", None) text_splitter = class_object(**params) else: - params["language"] = params.pop("separator_type", None) + from langchain.text_splitter import Language + + language = params.pop("separator_type", None) + params["language"] = Language(language) params.pop("separators", None) + text_splitter = class_object.from_language(**params) return text_splitter.split_documents(documents) From 14da6494bf15fca7da472ff9e61b24477911f067 Mon Sep 17 00:00:00 2001 From: Gabriel Luiz Freitas Almeida Date: Wed, 28 Jun 2023 18:17:58 -0300 Subject: [PATCH 062/169] =?UTF-8?q?=F0=9F=94=96=20chore(pyproject.toml):?= =?UTF-8?q?=20update=20package=20version=20to=200.2.6=20The=20package=20ve?= =?UTF-8?q?rsion=20has=20been=20updated=20from=200.2.5=20to=200.2.6.=20Thi?= =?UTF-8?q?s=20change=20is=20made=20to=20reflect=20the=20latest=20changes?= =?UTF-8?q?=20and=20improvements=20in=20the=20package.?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- poetry.lock | 6 +++--- pyproject.toml | 2 +- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/poetry.lock b/poetry.lock index 135c6f2c7..a000e3d77 100644 --- a/poetry.lock +++ b/poetry.lock @@ -2523,14 +2523,14 @@ i18n = ["Babel (>=2.7)"] [[package]] name = "joblib" -version = "1.2.0" +version = "1.3.0" description = "Lightweight pipelining with Python functions" category = "main" optional = false python-versions = ">=3.7" files = [ - {file = "joblib-1.2.0-py3-none-any.whl", hash = "sha256:091138ed78f800342968c523bdde947e7a305b8594b910a0fea2ab83c3c6d385"}, - {file = "joblib-1.2.0.tar.gz", hash = "sha256:e1cee4a79e4af22881164f218d4311f60074197fb707e082e803b61f6d137018"}, + {file = "joblib-1.3.0-py3-none-any.whl", hash = "sha256:172d56d4c43dd6bcd953bea213018c4084cf754963bbf54b8dae40faea716b98"}, + {file = "joblib-1.3.0.tar.gz", hash = "sha256:0b12a65dc76c530dbd790dd92881f75c40932b4254a7c8e608a868df408ca0a3"}, ] [[package]] diff --git a/pyproject.toml b/pyproject.toml index 1688e1ccf..9d549a405 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -1,6 +1,6 @@ [tool.poetry] name = "langflow" -version = "0.2.5" +version = "0.2.6" description = "A Python package with a built-in web application" authors = ["Logspace "] maintainers = [ From e1872be72812b04875d0bf47701d1fb9e8bf5bcc Mon Sep 17 00:00:00 2001 From: Sean Javiya <70726692+sudo-update@users.noreply.github.com> Date: Wed, 28 Jun 2023 17:09:58 -0700 Subject: [PATCH 063/169] Fix: Required input llm for module LLMChain not found There is a recurring intermittent bug, where Chains fail to validate, with an error "Required module ____ for module ____ not found". This happens frequently for all LLMs that inherit from the LLM class (example Cohere's wrapper). This is caused by this chunk of code. This also explains why the bug is intermittent and not every time. "in" is matching LLM from source_types with BaseLLM from target_reqs. Also, this doesn't need to be a nested loop, it can be done with one loop. I'm a user of LangFlow, and a first time contributor. Thanks! --- src/backend/langflow/graph/edge/base.py | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/src/backend/langflow/graph/edge/base.py b/src/backend/langflow/graph/edge/base.py index 08f084a5c..b7a71ffa1 100644 --- a/src/backend/langflow/graph/edge/base.py +++ b/src/backend/langflow/graph/edge/base.py @@ -30,8 +30,7 @@ class Edge: ( output for output in self.source_types - for target_req in self.target_reqs - if output in target_req + if output in self.target_reqs ), None, ) From 5da374b71364dd2367b9914b93af90e3177e656a Mon Sep 17 00:00:00 2001 From: Gabriel Luiz Freitas Almeida Date: Wed, 28 Jun 2023 22:29:46 -0300 Subject: [PATCH 064/169] =?UTF-8?q?=E2=9C=A8=20feat(schemas.py):=20add=20B?= =?UTF-8?q?uildStatus=20enum=20to=20represent=20the=20status=20of=20a=20bu?= =?UTF-8?q?ild=20The=20BuildStatus=20enum=20is=20added=20to=20represent=20?= =?UTF-8?q?the=20different=20statuses=20that=20a=20build=20can=20have:=20S?= =?UTF-8?q?UCCESS,=20FAILURE,=20and=20IN=5FPROGRESS.=20This=20enum=20will?= =?UTF-8?q?=20be=20used=20to=20provide=20a=20more=20structured=20and=20con?= =?UTF-8?q?sistent=20way=20of=20handling=20build=20statuses=20in=20the=20a?= =?UTF-8?q?pplication.?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/backend/langflow/api/v1/schemas.py | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/src/backend/langflow/api/v1/schemas.py b/src/backend/langflow/api/v1/schemas.py index ed5bf8b3b..2cf62a504 100644 --- a/src/backend/langflow/api/v1/schemas.py +++ b/src/backend/langflow/api/v1/schemas.py @@ -1,3 +1,4 @@ +from enum import Enum from pathlib import Path from typing import Any, Dict, List, Optional, Union from langflow.database.models.flow import FlowCreate, FlowRead @@ -5,6 +6,14 @@ from pydantic import BaseModel, Field, validator import json +class BuildStatus(Enum): + """Status of the build.""" + + SUCCESS = "success" + FAILURE = "failure" + IN_PROGRESS = "in_progress" + + class GraphData(BaseModel): """Data inside the exported flow.""" From 48d40bfdd30abaf8c218b4c353e0d2b7f8ce819b Mon Sep 17 00:00:00 2001 From: Gabriel Luiz Freitas Almeida Date: Wed, 28 Jun 2023 22:29:56 -0300 Subject: [PATCH 065/169] =?UTF-8?q?=E2=9C=A8=20feat(chat.py):=20add=20stat?= =?UTF-8?q?us=20field=20to=20flow=5Fdata=5Fstore=20to=20track=20build=20st?= =?UTF-8?q?atus=20of=20flows=20The=20import=20statement=20for=20the=20Buil?= =?UTF-8?q?dStatus=20enum=20in=20the=20schemas=20module=20has=20been=20upd?= =?UTF-8?q?ated=20to=20ensure=20the=20correct=20import.=20Additionally,=20?= =?UTF-8?q?a=20new=20"status"=20field=20has=20been=20added=20to=20the=20fl?= =?UTF-8?q?ow=5Fdata=5Fstore=20dictionary=20to=20track=20the=20build=20sta?= =?UTF-8?q?tus=20of=20flows.=20The=20status=20is=20set=20to=20BuildStatus.?= =?UTF-8?q?IN=5FPROGRESS=20when=20a=20flow=20is=20being=20built,=20BuildSt?= =?UTF-8?q?atus.SUCCESS=20when=20the=20build=20is=20successful,=20and=20Bu?= =?UTF-8?q?ildStatus.FAILURE=20when=20there=20is=20an=20error=20during=20t?= =?UTF-8?q?he=20build=20process.=20This=20allows=20for=20better=20tracking?= =?UTF-8?q?=20and=20management=20of=20flow=20builds.=20=F0=9F=90=9B=20fix(?= =?UTF-8?q?chat.py):=20change=20import=20statement=20for=20BuildStatus=20i?= =?UTF-8?q?n=20schemas=20module?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/backend/langflow/api/v1/chat.py | 17 ++++++++++++----- 1 file changed, 12 insertions(+), 5 deletions(-) diff --git a/src/backend/langflow/api/v1/chat.py b/src/backend/langflow/api/v1/chat.py index a730758d2..b992afe9a 100644 --- a/src/backend/langflow/api/v1/chat.py +++ b/src/backend/langflow/api/v1/chat.py @@ -6,7 +6,7 @@ from fastapi import ( status, ) from fastapi.responses import StreamingResponse -from langflow.api.v1.schemas import BuiltResponse, InitResponse, StreamData +from langflow.api.v1.schemas import BuildStatus, BuiltResponse, InitResponse, StreamData from langflow.chat.manager import ChatManager from langflow.graph.graph.base import Graph @@ -49,7 +49,10 @@ async def init_build(graph_data: dict): with chat_manager.in_memory_cache._lock: chat_manager.in_memory_cache.delete(flow_id) logger.debug(f"Deleted flow {flow_id} from cache") - flow_data_store[flow_id] = {"graph_data": graph_data, "building": False} + flow_data_store[flow_id] = { + "graph_data": graph_data, + "status": BuildStatus.IN_PROGRESS, + } return InitResponse(flowId=flow_id) except Exception as exc: @@ -61,8 +64,9 @@ async def init_build(graph_data: dict): async def build_status(flow_id: str): """Check the flow_id is in the flow_data_store.""" try: - built = flow_id in flow_data_store and not isinstance( - flow_data_store[flow_id], dict + built = ( + flow_id in flow_data_store + and flow_data_store[flow_id]["status"] == BuildStatus.SUCCESS ) return BuiltResponse( @@ -86,7 +90,7 @@ async def stream_build(flow_id: str): yield str(StreamData(event="error", data={"error": error_message})) return - if flow_data_store[flow_id].get("building"): + if flow_data_store[flow_id].get("status") == BuildStatus.IN_PROGRESS: error_message = "Already building" yield str(StreamData(event="error", data={"error": error_message})) return @@ -124,6 +128,7 @@ async def stream_build(flow_id: str): except Exception as exc: params = str(exc) valid = False + flow_data_store[flow_id]["status"] = BuildStatus.FAILURE response = { "valid": valid, @@ -135,8 +140,10 @@ async def stream_build(flow_id: str): yield str(StreamData(event="message", data=response)) chat_manager.set_cache(flow_id, graph.build()) + flow_data_store[flow_id]["status"] = BuildStatus.SUCCESS except Exception as exc: logger.error("Error while building the flow: %s", exc) + flow_data_store[flow_id]["status"] = BuildStatus.FAILURE yield str(StreamData(event="error", data={"error": str(exc)})) finally: yield str(StreamData(event="message", data=final_response)) From 85b7ff1d31ef6f17c54a47c23ce2d8b7785f65b8 Mon Sep 17 00:00:00 2001 From: Gabriel Luiz Freitas Almeida Date: Wed, 28 Jun 2023 22:45:37 -0300 Subject: [PATCH 066/169] =?UTF-8?q?=F0=9F=94=A7=20chore(chat.py):=20update?= =?UTF-8?q?=20init=5Fbuild=20endpoint=20to=20include=20flow=5Fid=20as=20a?= =?UTF-8?q?=20path=20parameter=20The=20unnecessary=20imports=20have=20been?= =?UTF-8?q?=20removed=20from=20the=20chat.py=20file=20to=20improve=20code?= =?UTF-8?q?=20cleanliness=20and=20readability.=20The=20init=5Fbuild=20endp?= =?UTF-8?q?oint=20in=20the=20chat.py=20file=20has=20been=20updated=20to=20?= =?UTF-8?q?include=20the=20flow=5Fid=20as=20a=20path=20parameter=20instead?= =?UTF-8?q?=20of=20extracting=20it=20from=20the=20graph=5Fdata=20dictionar?= =?UTF-8?q?y.=20This=20change=20allows=20for=20a=20more=20explicit=20and?= =?UTF-8?q?=20consistent=20API=20design.=20=F0=9F=94=A7=20chore(chat.py):?= =?UTF-8?q?=20remove=20unnecessary=20imports=20and=20reformat=20code=20for?= =?UTF-8?q?=20better=20readability?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/backend/langflow/api/v1/chat.py | 18 +++++++----------- src/frontend/src/controllers/API/index.ts | 2 +- 2 files changed, 8 insertions(+), 12 deletions(-) diff --git a/src/backend/langflow/api/v1/chat.py b/src/backend/langflow/api/v1/chat.py index b992afe9a..fd0232189 100644 --- a/src/backend/langflow/api/v1/chat.py +++ b/src/backend/langflow/api/v1/chat.py @@ -1,10 +1,4 @@ -from fastapi import ( - APIRouter, - HTTPException, - WebSocket, - WebSocketException, - status, -) +from fastapi import APIRouter, HTTPException, WebSocket, WebSocketException, status from fastapi.responses import StreamingResponse from langflow.api.v1.schemas import BuildStatus, BuiltResponse, InitResponse, StreamData @@ -32,16 +26,18 @@ async def chat(client_id: str, websocket: WebSocket): await websocket.close(code=status.WS_1011_INTERNAL_ERROR, reason=str(exc)) -@router.post("/build/init", response_model=InitResponse, status_code=201) -async def init_build(graph_data: dict): +@router.post("/build/init/{flow_id}", response_model=InitResponse, status_code=201) +async def init_build(graph_data: dict, flow_id: str): """Initialize the build by storing graph data and returning a unique session ID.""" try: - flow_id = graph_data.get("id") if flow_id is None: raise ValueError("No ID provided") # Check if already building - if flow_id in flow_data_store and flow_data_store[flow_id].get("building"): + if ( + flow_id in flow_data_store + and flow_data_store[flow_id]["status"] == BuildStatus.IN_PROGRESS + ): return InitResponse(flowId=flow_id) # Delete from cache if already exists diff --git a/src/frontend/src/controllers/API/index.ts b/src/frontend/src/controllers/API/index.ts index 2651a0058..cfae748d8 100644 --- a/src/frontend/src/controllers/API/index.ts +++ b/src/frontend/src/controllers/API/index.ts @@ -311,7 +311,7 @@ export async function getBuildStatus( export async function postBuildInit( flow: FlowType ): Promise> { - return await axios.post(`/api/v1/build/init`, flow); + return await axios.post(`/api/v1/build/init/${flow.id}`, flow); } // fetch(`/upload/${id}`, { From ce34ac4825449584bd937c72732f7cdcbff7a4d4 Mon Sep 17 00:00:00 2001 From: Gabriel Luiz Freitas Almeida Date: Wed, 28 Jun 2023 22:50:55 -0300 Subject: [PATCH 067/169] =?UTF-8?q?=F0=9F=90=9B=20fix(test=5Fwebsocket.py)?= =?UTF-8?q?:=20fix=20the=20endpoint=20URL=20in=20the=20test=5Finit=5Fbuild?= =?UTF-8?q?=20test=20The=20endpoint=20URL=20in=20the=20test=5Finit=5Fbuild?= =?UTF-8?q?=20test=20has=20been=20fixed=20to=20"api/v1/build/init/test"=20?= =?UTF-8?q?to=20match=20the=20correct=20URL=20pattern.=20This=20ensures=20?= =?UTF-8?q?that=20the=20test=20is=20accurately=20testing=20the=20intended?= =?UTF-8?q?=20functionality.?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- tests/test_websocket.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tests/test_websocket.py b/tests/test_websocket.py index f571671e8..0199ff14b 100644 --- a/tests/test_websocket.py +++ b/tests/test_websocket.py @@ -7,7 +7,7 @@ import pytest def test_init_build(client): response = client.post( - "api/v1/build/init", json={"id": "test", "data": {"key": "value"}} + "api/v1/build/init/test", json={"id": "test", "data": {"key": "value"}} ) assert response.status_code == 201 assert response.json() == {"flowId": "test"} From df43dbc6bcc0776ab6e3d82f0498adeb898b479f Mon Sep 17 00:00:00 2001 From: zhenjianpeng Date: Thu, 29 Jun 2023 10:26:27 +0800 Subject: [PATCH 068/169] add custom nodes for signature, fix some problem --- src/backend/langflow/interface/memories/base.py | 3 +++ src/backend/langflow/template/frontend_node/memories.py | 9 +++++++++ 2 files changed, 12 insertions(+) diff --git a/src/backend/langflow/interface/memories/base.py b/src/backend/langflow/interface/memories/base.py index f0d8f88f5..a211517f5 100644 --- a/src/backend/langflow/interface/memories/base.py +++ b/src/backend/langflow/interface/memories/base.py @@ -7,6 +7,7 @@ from langflow.template.frontend_node.base import FrontendNode from langflow.template.frontend_node.memories import MemoryFrontendNode from langflow.utils.logger import logger from langflow.utils.util import build_template_from_class +from langflow.custom.customs import get_custom_nodes class MemoryCreator(LangChainTypeCreator): @@ -26,6 +27,8 @@ class MemoryCreator(LangChainTypeCreator): def get_signature(self, name: str) -> Optional[Dict]: """Get the signature of a memory.""" try: + if name in get_custom_nodes(self.type_name).keys(): + return get_custom_nodes(self.type_name)[name] return build_template_from_class(name, memory_type_to_cls_dict) except ValueError as exc: raise ValueError("Memory not found") from exc diff --git a/src/backend/langflow/template/frontend_node/memories.py b/src/backend/langflow/template/frontend_node/memories.py index e2f533e7f..1ba0737aa 100644 --- a/src/backend/langflow/template/frontend_node/memories.py +++ b/src/backend/langflow/template/frontend_node/memories.py @@ -8,6 +8,11 @@ from langflow.template.template.base import Template class MemoryFrontendNode(FrontendNode): #! Needs testing def add_extra_fields(self) -> None: + # chat history should have another way to add common field? + # prevent adding incorect field in ChatMessageHistory + if "BaseChatMessageHistory" in self.base_classes: + pass + # add return_messages field self.template.add_field( TemplateField( @@ -65,6 +70,10 @@ class MemoryFrontendNode(FrontendNode): field.value = "" if field.name == "memory_key": field.value = "chat_history" + if field.name == "chat_memory": + field.show = True + field.advanced = False + field.required = False class PostgresChatMessageHistoryFrontendNode(MemoryFrontendNode): From d1fbbd5fffed94657aab39f0e3d2c1b686c26656 Mon Sep 17 00:00:00 2001 From: zhenjianpeng Date: Thu, 29 Jun 2023 10:38:45 +0800 Subject: [PATCH 069/169] fix bug about extra fields --- src/backend/langflow/template/frontend_node/memories.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/backend/langflow/template/frontend_node/memories.py b/src/backend/langflow/template/frontend_node/memories.py index 1ba0737aa..7064eaa05 100644 --- a/src/backend/langflow/template/frontend_node/memories.py +++ b/src/backend/langflow/template/frontend_node/memories.py @@ -11,7 +11,7 @@ class MemoryFrontendNode(FrontendNode): # chat history should have another way to add common field? # prevent adding incorect field in ChatMessageHistory if "BaseChatMessageHistory" in self.base_classes: - pass + return # add return_messages field self.template.add_field( From 177b50695d13d49228f0ce542ea3c879f81c2ab8 Mon Sep 17 00:00:00 2001 From: zhenjianpeng Date: Thu, 29 Jun 2023 10:44:08 +0800 Subject: [PATCH 070/169] adding dependencies for langchain pg support --- pyproject.toml | 3 +++ 1 file changed, 3 insertions(+) diff --git a/pyproject.toml b/pyproject.toml index da75b0207..9c3c3d748 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -70,6 +70,9 @@ pinecone-client = "^2.2.2" supabase = "^1.0.3" pymongo = "^4.4.0" certifi = "^2023.5.7" +psycopg = "^3.1.9" +psycopg-binary = "^3.1.9" +psycopg-c = "^3.1.9" [tool.poetry.dev-dependencies] From 281e6062f4a1231a688c05d441f51dca1a1b27c3 Mon Sep 17 00:00:00 2001 From: zhenjianpeng Date: Thu, 29 Jun 2023 11:15:09 +0800 Subject: [PATCH 071/169] remove psycopg-c --- pyproject.toml | 1 - 1 file changed, 1 deletion(-) diff --git a/pyproject.toml b/pyproject.toml index 9c3c3d748..8dea6bb60 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -72,7 +72,6 @@ pymongo = "^4.4.0" certifi = "^2023.5.7" psycopg = "^3.1.9" psycopg-binary = "^3.1.9" -psycopg-c = "^3.1.9" [tool.poetry.dev-dependencies] From ed2d4c549ed788331c642d421fcf0876a5072e01 Mon Sep 17 00:00:00 2001 From: zhenjianpeng Date: Thu, 29 Jun 2023 11:24:12 +0800 Subject: [PATCH 072/169] commit poetry lock --- poetry.lock | 104 ++++++++++++++++++++++++++++++++++++++++++++++++- pyproject.toml | 2 - 2 files changed, 102 insertions(+), 4 deletions(-) diff --git a/poetry.lock b/poetry.lock index b13392910..add7e0732 100644 --- a/poetry.lock +++ b/poetry.lock @@ -1,4 +1,4 @@ -# This file is automatically @generated by Poetry 1.4.0 and should not be changed by hand. +# This file is automatically @generated by Poetry 1.4.2 and should not be changed by hand. [[package]] name = "aiofiles" @@ -4274,6 +4274,94 @@ files = [ [package.extras] test = ["enum34", "ipaddress", "mock", "pywin32", "wmi"] +[[package]] +name = "psycopg" +version = "3.1.9" +description = "PostgreSQL database adapter for Python" +category = "main" +optional = false +python-versions = ">=3.7" +files = [ + {file = "psycopg-3.1.9-py3-none-any.whl", hash = "sha256:fbbac339274d8733ee70ba9822297af3e8871790a26e967b5ea53e30a4b74dcc"}, + {file = "psycopg-3.1.9.tar.gz", hash = "sha256:ab400f207a8c120bafdd8077916d8f6c0106e809401378708485b016508c30c9"}, +] + +[package.dependencies] +typing-extensions = ">=4.1" +tzdata = {version = "*", markers = "sys_platform == \"win32\""} + +[package.extras] +binary = ["psycopg-binary (==3.1.9)"] +c = ["psycopg-c (==3.1.9)"] +dev = ["black (>=23.1.0)", "dnspython (>=2.1)", "flake8 (>=4.0)", "mypy (>=1.2)", "types-setuptools (>=57.4)", "wheel (>=0.37)"] +docs = ["Sphinx (>=5.0)", "furo (==2022.6.21)", "sphinx-autobuild (>=2021.3.14)", "sphinx-autodoc-typehints (>=1.12)"] +pool = ["psycopg-pool"] +test = ["anyio (>=3.6.2)", "mypy (>=1.2)", "pproxy (>=2.7)", "pytest (>=6.2.5)", "pytest-cov (>=3.0)", "pytest-randomly (>=3.5)"] + +[[package]] +name = "psycopg-binary" +version = "3.1.9" +description = "PostgreSQL database adapter for Python -- C optimisation distribution" +category = "main" +optional = false +python-versions = ">=3.7" +files = [ + {file = "psycopg_binary-3.1.9-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:284038cbe3f5a0f3de417af9b5eaa2a9524a3a06211523cf245111c71b566506"}, + {file = "psycopg_binary-3.1.9-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:d2cea4bb0b19245c83486868d7c66f73238c4caa266b5b3c3d664d10dab2ab56"}, + {file = "psycopg_binary-3.1.9-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:dfe5c5c31f59ccb1d1f473466baa93d800138186286e80e251f930e49c80d208"}, + {file = "psycopg_binary-3.1.9-cp310-cp310-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:82704a899d57c29beba5399d41eab5ef5c238b810d7e25e2d1916d2b34c4b1a3"}, + {file = "psycopg_binary-3.1.9-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:eab449e39db1c429cac79b7aa27e6827aad4995f32137e922db7254f43fed7b5"}, + {file = "psycopg_binary-3.1.9-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:87e0c97733b11eeca3d24e56df70f3f9d792b2abd46f48be2fb2348ffc3e7e39"}, + {file = "psycopg_binary-3.1.9-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:81e34d6df54329424944d5ca91b1cc77df6b8a9130cb5480680d56f53d4e485c"}, + {file = "psycopg_binary-3.1.9-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:e2f463079d99568a343ed0b766150b30627e9ed41de99fd82e945e7e2bec764a"}, + {file = "psycopg_binary-3.1.9-cp310-cp310-musllinux_1_1_ppc64le.whl", hash = "sha256:f2cbdef6568da21c39dfd45c2074e85eabbd00e1b721832ba94980f01f582dd4"}, + {file = "psycopg_binary-3.1.9-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:53afb0cc2ebe74651f339e22d05ec082a0f44939715d9138d357852f074fcf55"}, + {file = "psycopg_binary-3.1.9-cp310-cp310-win_amd64.whl", hash = "sha256:09167f106e7685591b4cdf58eff0191fb7435d586f384133a0dd30df646cf409"}, + {file = "psycopg_binary-3.1.9-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:a8aaa47c1791fc05c0229ec1003dd49e13238fba9434e1fc3b879632f749c3c4"}, + {file = "psycopg_binary-3.1.9-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:3d91ee0d33ac7b42d0488a9be2516efa2ec00901b81d69566ff34a7a94b66c0b"}, + {file = "psycopg_binary-3.1.9-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:f5e36504373e5bcdc954b1da1c6fe66379007fe1e329790e8fb72b879a01e097"}, + {file = "psycopg_binary-3.1.9-cp311-cp311-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:4c1def6c2d28e257325b3b208cf1966343b498282a0f4d390fda7b7e0577da64"}, + {file = "psycopg_binary-3.1.9-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:055537a9c20efe9bf17cb72bd879602eda71de6f737ebafa1953e017c6a37fbe"}, + {file = "psycopg_binary-3.1.9-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:5b164355d023a91b23dcc4bb3112bc7d6e9b9c938fb5abcb6e54457d2da1f317"}, + {file = "psycopg_binary-3.1.9-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:03b08545ce1c627f4d5e6384eda2946660c4ba6ceb0a09ae47de07419f725669"}, + {file = "psycopg_binary-3.1.9-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:1e31bac3d2d41e6446b20b591f638943328c958f4d1ce13d6f1c5db97c3a8dee"}, + {file = "psycopg_binary-3.1.9-cp311-cp311-musllinux_1_1_ppc64le.whl", hash = "sha256:a274c63c8fb9d419509bed2ef72befc1fd04243972e17e7f5afc5725cb13a560"}, + {file = "psycopg_binary-3.1.9-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:98d9d156b9ada08c271a79662fc5fcc1731b4d7c1f651ef5843d818d35f15ba0"}, + {file = "psycopg_binary-3.1.9-cp311-cp311-win_amd64.whl", hash = "sha256:c3a13aa022853891cadbc7256a9804e5989def760115c82334bddf0d19783b0b"}, + {file = "psycopg_binary-3.1.9-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:b1a321ef3579a8de0545ade6ff1edfde0c88b8847d58c5615c03751c76054796"}, + {file = "psycopg_binary-3.1.9-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:5833bda4c14f24c6a8ac08d3c5712acaa4f35aab31f9ccd2265e9e9a7d0151c8"}, + {file = "psycopg_binary-3.1.9-cp37-cp37m-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:a207d5a7f4212443b7452851c9ccd88df9c6d4d58fa2cea2ead4dd9cb328e578"}, + {file = "psycopg_binary-3.1.9-cp37-cp37m-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:07414daa86662f7657e9fabe49af85a32a975e92e6568337887d9c9ffedc224f"}, + {file = "psycopg_binary-3.1.9-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:17c5d4936c746f5125c6ef9eb43655e27d4d0c9ffe34c3073878b43c3192511d"}, + {file = "psycopg_binary-3.1.9-cp37-cp37m-musllinux_1_1_aarch64.whl", hash = "sha256:5cdc13c8ec1437240801e43d07e27ff6479ac9dd8583ecf647345bfd2e8390e4"}, + {file = "psycopg_binary-3.1.9-cp37-cp37m-musllinux_1_1_i686.whl", hash = "sha256:3836bdaf030a5648bd5f5b452e4b068b265e28f9199060c5b70dbf4a218cde6e"}, + {file = "psycopg_binary-3.1.9-cp37-cp37m-musllinux_1_1_ppc64le.whl", hash = "sha256:96725d9691a84a21eb3e81c884a2e043054e33e176801a57a05e9ac38d142c6e"}, + {file = "psycopg_binary-3.1.9-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:dade344aa90bb0b57d1cfc13304ed83ab9a36614b8ddd671381b2de72fe1483d"}, + {file = "psycopg_binary-3.1.9-cp37-cp37m-win_amd64.whl", hash = "sha256:db866cc557d9761036771d666d17fa4176c537af7e6098f42a6bf8f64217935f"}, + {file = "psycopg_binary-3.1.9-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:3b62545cc64dd69ea0ae5ffe18d7c97e03660ab8244aa8c5172668a21c41daa0"}, + {file = "psycopg_binary-3.1.9-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:058ab0d79be0b229338f0e61fec6f475077518cba63c22c593645a69f01c3e23"}, + {file = "psycopg_binary-3.1.9-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:2340ca2531f69e5ebd9d18987362ba57ed6ab6a271511d8026814a46a2a87b59"}, + {file = "psycopg_binary-3.1.9-cp38-cp38-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:3b816ce0e27a2a8786d34b61d3e36e01029245025879d64b88554326b794a4f0"}, + {file = "psycopg_binary-3.1.9-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:7b36fe4314a784fbe45c9fd71c902b9bf57341aff9b97c0cbd22f8409a271e2f"}, + {file = "psycopg_binary-3.1.9-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:b246fed629482b06f938b23e9281c4af592329daa3ec2cd4a6841ccbfdeb4d68"}, + {file = "psycopg_binary-3.1.9-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:90787ac05b932c0fc678cbf470ccea9c385b8077583f0490136b4569ed3fb652"}, + {file = "psycopg_binary-3.1.9-cp38-cp38-musllinux_1_1_i686.whl", hash = "sha256:9c114f678e8f4a96530fa79cfd84f65f26358ecfc6cca70cfa2d5e3ae5ef217a"}, + {file = "psycopg_binary-3.1.9-cp38-cp38-musllinux_1_1_ppc64le.whl", hash = "sha256:3a82e77400d1ef6c5bbcf3e600e8bdfacf1a554512f96c090c43ceca3d1ce3b6"}, + {file = "psycopg_binary-3.1.9-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:c7d990f14a37345ca05a5192cd5ac938c9cbedca9c929872af6ae311158feb0e"}, + {file = "psycopg_binary-3.1.9-cp38-cp38-win_amd64.whl", hash = "sha256:e0ca74fd85718723bb9f08e0c6898e901a0c365aef20b3c3a4ef8709125d6210"}, + {file = "psycopg_binary-3.1.9-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:ce8f4dea5934aa6c4933e559c74bef4beb3413f51fbcf17f306ce890216ac33a"}, + {file = "psycopg_binary-3.1.9-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:f41a9e0de4db194c053bcc7c00c35422a4d19d92a8187e8065b1c560626efe35"}, + {file = "psycopg_binary-3.1.9-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:2f94a7985135e084e122b143956c6f589d17aef743ecd0a434a3d3a222631d5a"}, + {file = "psycopg_binary-3.1.9-cp39-cp39-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:3bb86d58b90faefdc0bbedf08fdea4cc2afcb1cfa4340f027d458bfd01d8b812"}, + {file = "psycopg_binary-3.1.9-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:6c696dc84f9ff155761df15779181d8e4af7746b98908e130add8259912e4bb7"}, + {file = "psycopg_binary-3.1.9-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:4213953da44324850c8f789301cf665f46fb94301ba403301e7af58546c3a428"}, + {file = "psycopg_binary-3.1.9-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:25e3ce947aaaa1bd9f1920fca76d7281660646304f9ea5bc036b201dd8790655"}, + {file = "psycopg_binary-3.1.9-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:9c75be2a9b986139e3ff6bc0a2852081ac00811040f9b82d3aa539821311122e"}, + {file = "psycopg_binary-3.1.9-cp39-cp39-musllinux_1_1_ppc64le.whl", hash = "sha256:63e8d1dbe253657c70dbfa9c59423f4654d82698fc5ed6868b8dc0765abe20b6"}, + {file = "psycopg_binary-3.1.9-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:f4da4ca9b2365fc1d3fc741c3bbd3efccd892ce813444b884c8911a1acf1c932"}, + {file = "psycopg_binary-3.1.9-cp39-cp39-win_amd64.whl", hash = "sha256:c0b8d6bbeff1dba760a208d8bc205a05b745e6cee02b839f969f72cf56a8b80d"}, +] + [[package]] name = "psycopg2-binary" version = "2.9.6" @@ -6471,6 +6559,18 @@ files = [ mypy-extensions = ">=0.3.0" typing-extensions = ">=3.7.4" +[[package]] +name = "tzdata" +version = "2023.3" +description = "Provider of IANA time zone data" +category = "main" +optional = false +python-versions = ">=2" +files = [ + {file = "tzdata-2023.3-py2.py3-none-any.whl", hash = "sha256:7e65763eef3120314099b6939b5546db7adce1e7d6f2e179e3df563c70511eda"}, + {file = "tzdata-2023.3.tar.gz", hash = "sha256:11ef1e08e54acb0d4f95bdb1be05da659673de4acbd21bf9c69e94cc5e907a3a"}, +] + [[package]] name = "unstructured" version = "0.5.13" @@ -7115,4 +7215,4 @@ deploy = ["langchain-serve"] [metadata] lock-version = "2.0" python-versions = ">=3.9,<3.12" -content-hash = "2f8373e1c80ce345f39ed9247fd4759ae94b5c754c4e850d3aa72183556eb92b" +content-hash = "88f4b394eb96c8307d7734e8216304b074a9aedcc52b2299ea750fa2a76ceb4b" diff --git a/pyproject.toml b/pyproject.toml index 8dea6bb60..da75b0207 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -70,8 +70,6 @@ pinecone-client = "^2.2.2" supabase = "^1.0.3" pymongo = "^4.4.0" certifi = "^2023.5.7" -psycopg = "^3.1.9" -psycopg-binary = "^3.1.9" [tool.poetry.dev-dependencies] From 303c0ff5d2c87f115f1ff3fa8f28587e0e15240c Mon Sep 17 00:00:00 2001 From: zhenjianpeng Date: Thu, 29 Jun 2023 11:31:50 +0800 Subject: [PATCH 073/169] something wrong about pyproject.toml --- pyproject.toml | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/pyproject.toml b/pyproject.toml index da75b0207..07df52cb2 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -70,7 +70,8 @@ pinecone-client = "^2.2.2" supabase = "^1.0.3" pymongo = "^4.4.0" certifi = "^2023.5.7" - +psycopg = "^3.1.9" +psycopg-binary = "^3.1.9" [tool.poetry.dev-dependencies] black = "^23.1.0" From 78831f1051f23d4f483e48cdee96535ef54e5322 Mon Sep 17 00:00:00 2001 From: zhenjianpeng Date: Thu, 29 Jun 2023 11:54:28 +0800 Subject: [PATCH 074/169] remove memory support and make it a proposal --- src/backend/langflow/interface/initialize/loading.py | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/src/backend/langflow/interface/initialize/loading.py b/src/backend/langflow/interface/initialize/loading.py index c527d745a..41867085e 100644 --- a/src/backend/langflow/interface/initialize/loading.py +++ b/src/backend/langflow/interface/initialize/loading.py @@ -225,7 +225,8 @@ def load_agent_executor(agent_class: type[agent_module.Agent], params, **kwargs) """Load agent executor from agent class, tools and chain""" allowed_tools: Sequence[BaseTool] = params.get("allowed_tools", []) llm_chain = params["llm_chain"] - memory = params["memory"] + # agent has hidden args for memory. might need to be support + # memory = params["memory"] # if allowed_tools is not a list or set, make it a list if not isinstance(allowed_tools, (list, set)) and isinstance( allowed_tools, BaseTool @@ -238,7 +239,7 @@ def load_agent_executor(agent_class: type[agent_module.Agent], params, **kwargs) return AgentExecutor.from_agent_and_tools( agent=agent, tools=allowed_tools, - memory=memory, + # memory=memory, **kwargs, ) From df0b3160402c8b0ef28709145bc91dca42125392 Mon Sep 17 00:00:00 2001 From: Gabriel Luiz Freitas Almeida Date: Thu, 29 Jun 2023 06:49:24 -0300 Subject: [PATCH 075/169] =?UTF-8?q?=F0=9F=94=80=20chore(pyproject.toml):?= =?UTF-8?q?=20update=20dependencies=20versions=20=E2=AC=86=EF=B8=8F=20feat?= =?UTF-8?q?(pyproject.toml):=20update=20beautifulsoup4=20to=20version=204.?= =?UTF-8?q?12.2=20=E2=AC=86=EF=B8=8F=20feat(pyproject.toml):=20update=20la?= =?UTF-8?q?ngchain=20to=20version=200.0.219=20=E2=AC=86=EF=B8=8F=20feat(py?= =?UTF-8?q?project.toml):=20update=20pandas=20to=20version=202.0.0=20?= =?UTF-8?q?=E2=AC=86=EF=B8=8F=20feat(pyproject.toml):=20update=20huggingfa?= =?UTF-8?q?ce-hub=20to=20version=200.15.0=20=E2=AC=86=EF=B8=8F=20feat(pypr?= =?UTF-8?q?oject.toml):=20update=20unstructured=20to=20version=200.7.0=20?= =?UTF-8?q?=E2=AC=86=EF=B8=8F=20feat(pyproject.toml):=20update=20pypdf=20t?= =?UTF-8?q?o=20version=203.11.0=20=E2=AC=86=EF=B8=8F=20feat(pyproject.toml?= =?UTF-8?q?):=20update=20langchain-serve=20to=20version=20>0.0.47=20?= =?UTF-8?q?=E2=AC=86=EF=B8=8F=20feat(pyproject.toml):=20update=20qdrant-cl?= =?UTF-8?q?ient=20to=20version=201.3.0=20=E2=AC=86=EF=B8=8F=20feat(pyproje?= =?UTF-8?q?ct.toml):=20update=20ctransformers=20to=20version=200.2.10=20?= =?UTF-8?q?=E2=AC=86=EF=B8=8F=20feat(pyproject.toml):=20update=20cohere=20?= =?UTF-8?q?to=20version=204.11.0=20=E2=AC=86=EF=B8=8F=20feat(pyproject.tom?= =?UTF-8?q?l):=20update=20anthropic=20to=20version=200.3.0=20=E2=AC=86?= =?UTF-8?q?=EF=B8=8F=20feat(pyproject.toml):=20update=20types-pyyaml=20to?= =?UTF-8?q?=20version=206.0.12.8?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit The dependencies in the pyproject.toml file have been updated to their latest versions. These updates include various bug fixes, performance improvements, and new features. It is important to keep the dependencies up to date to ensure compatibility and take advantage of the latest enhancements and fixes provided by the library maintainers. --- poetry.lock | 696 ++++++++++++++++++++++++++++++++++--------------- pyproject.toml | 24 +- 2 files changed, 502 insertions(+), 218 deletions(-) diff --git a/poetry.lock b/poetry.lock index 51dd06f9b..c1d7dda7e 100644 --- a/poetry.lock +++ b/poetry.lock @@ -1,4 +1,4 @@ -# This file is automatically @generated by Poetry 1.4.2 and should not be changed by hand. +# This file is automatically @generated by Poetry 1.4.0 and should not be changed by hand. [[package]] name = "aiofiles" @@ -150,24 +150,23 @@ files = [ [[package]] name = "anthropic" -version = "0.2.10" -description = "Library for accessing the anthropic API" +version = "0.3.0" +description = "Client library for the anthropic API" category = "main" optional = false -python-versions = ">=3.8" +python-versions = ">=3.7,<4.0" files = [ - {file = "anthropic-0.2.10-py3-none-any.whl", hash = "sha256:a007496207fd186b0bcb9592b00ca130069d2a427f3d6f602a61dbbd1ac6316e"}, - {file = "anthropic-0.2.10.tar.gz", hash = "sha256:e4da061a86d8ffb86072c0b0feaf219a3a4f7dfddd4224df9ba769e469498c19"}, + {file = "anthropic-0.3.0-py3-none-any.whl", hash = "sha256:13d1d5eb6c835dfa79922eef66589d602c09294105a2951bc7f4284a0581090c"}, + {file = "anthropic-0.3.0.tar.gz", hash = "sha256:e239046e9276486391152f147c81d990b226facd4434ad968585912ffff4e031"}, ] [package.dependencies] -aiohttp = "*" -httpx = "*" -requests = "*" -tokenizers = "*" - -[package.extras] -dev = ["black (>=22.3.0)", "pytest"] +anyio = ">=3.5.0" +distro = ">=1.7.0" +httpx = ">=0.23.0" +pydantic = ">=1.9.0" +tokenizers = ">=0.13.0" +typing-extensions = ">=4.1.1" [[package]] name = "anyio" @@ -770,19 +769,20 @@ sqlalchemy = ["sqlalchemy (>1.3.21,<2.0)"] [[package]] name = "cohere" -version = "4.9.0" +version = "4.11.2" description = "" category = "main" optional = false python-versions = ">=3.7,<4.0" files = [ - {file = "cohere-4.9.0-py3-none-any.whl", hash = "sha256:d29affeb26e882518b0a28ee85aabb8bfbe65576228de04ec2a9aa375f582729"}, - {file = "cohere-4.9.0.tar.gz", hash = "sha256:e1df3dc7e3e0e47652532c6bc87e8eb8c30688c7de1d7417e56cb45d2fbea1b6"}, + {file = "cohere-4.11.2-py3-none-any.whl", hash = "sha256:c5032f4a2aafbcfdf1cacd5b49121c8cc4804fbd121d4a7ac0dfea499398ea28"}, + {file = "cohere-4.11.2.tar.gz", hash = "sha256:4d3e663a306e6fcb87c41cded2195257ebc6992d361a70417f6616f045c4ec47"}, ] [package.dependencies] aiohttp = ">=3.0,<4.0" backoff = ">=2.0,<3.0" +importlib_metadata = ">=6.0,<7.0" requests = ">=2.0,<3.0" [[package]] @@ -1079,6 +1079,18 @@ files = [ [package.extras] graph = ["objgraph (>=1.7.2)"] +[[package]] +name = "distro" +version = "1.8.0" +description = "Distro - an OS platform information API" +category = "main" +optional = false +python-versions = ">=3.6" +files = [ + {file = "distro-1.8.0-py3-none-any.whl", hash = "sha256:99522ca3e365cac527b44bde033f64c6945d90eb9f769703caaec52b09bbd3ff"}, + {file = "distro-1.8.0.tar.gz", hash = "sha256:02e111d1dc6a50abb8eed6bf31c3e48ed8b0830d1ea2a1b78c61765c2513fdd8"}, +] + [[package]] name = "dnspython" version = "2.3.0" @@ -1395,6 +1407,18 @@ files = [ docs = ["furo (>=2023.5.20)", "sphinx (>=7.0.1)", "sphinx-autodoc-typehints (>=1.23,!=1.23.4)"] testing = ["covdefaults (>=2.3)", "coverage (>=7.2.7)", "diff-cover (>=7.5)", "pytest (>=7.3.1)", "pytest-cov (>=4.1)", "pytest-mock (>=3.10)", "pytest-timeout (>=2.1)"] +[[package]] +name = "filetype" +version = "1.2.0" +description = "Infer file type and MIME type of any file/buffer. No external dependencies." +category = "main" +optional = false +python-versions = "*" +files = [ + {file = "filetype-1.2.0-py2.py3-none-any.whl", hash = "sha256:7ce71b6880181241cf7ac8697a2f1eb6a8bd9b429f7ad6d27b8db9ba5f1c2d25"}, + {file = "filetype-1.2.0.tar.gz", hash = "sha256:66b56cd6474bf41d8c54660347d37afcc3f7d1970648de365c102ef77548aadb"}, +] + [[package]] name = "flatbuffers" version = "23.5.26" @@ -1491,6 +1515,42 @@ files = [ {file = "frozenlist-1.3.3.tar.gz", hash = "sha256:58bcc55721e8a90b88332d6cd441261ebb22342e238296bb330968952fbb3a6a"}, ] +[[package]] +name = "fsspec" +version = "2023.6.0" +description = "File-system specification" +category = "main" +optional = false +python-versions = ">=3.8" +files = [ + {file = "fsspec-2023.6.0-py3-none-any.whl", hash = "sha256:1cbad1faef3e391fba6dc005ae9b5bdcbf43005c9167ce78c915549c352c869a"}, + {file = "fsspec-2023.6.0.tar.gz", hash = "sha256:d0b2f935446169753e7a5c5c55681c54ea91996cc67be93c39a154fb3a2742af"}, +] + +[package.extras] +abfs = ["adlfs"] +adl = ["adlfs"] +arrow = ["pyarrow (>=1)"] +dask = ["dask", "distributed"] +devel = ["pytest", "pytest-cov"] +dropbox = ["dropbox", "dropboxdrivefs", "requests"] +full = ["adlfs", "aiohttp (!=4.0.0a0,!=4.0.0a1)", "dask", "distributed", "dropbox", "dropboxdrivefs", "fusepy", "gcsfs", "libarchive-c", "ocifs", "panel", "paramiko", "pyarrow (>=1)", "pygit2", "requests", "s3fs", "smbprotocol", "tqdm"] +fuse = ["fusepy"] +gcs = ["gcsfs"] +git = ["pygit2"] +github = ["requests"] +gs = ["gcsfs"] +gui = ["panel"] +hdfs = ["pyarrow (>=1)"] +http = ["aiohttp (!=4.0.0a0,!=4.0.0a1)", "requests"] +libarchive = ["libarchive-c"] +oci = ["ocifs"] +s3 = ["s3fs"] +sftp = ["paramiko"] +smb = ["smbprotocol"] +ssh = ["paramiko"] +tqdm = ["tqdm"] + [[package]] name = "gitdb" version = "4.0.10" @@ -2076,18 +2136,19 @@ socks = ["socksio (>=1.0.0,<2.0.0)"] [[package]] name = "huggingface-hub" -version = "0.13.4" +version = "0.15.1" description = "Client library to download and publish models, datasets and other repos on the huggingface.co hub" category = "main" optional = false python-versions = ">=3.7.0" files = [ - {file = "huggingface_hub-0.13.4-py3-none-any.whl", hash = "sha256:4d3d40593de6673d624a4baaaf249b9bf5165bfcafd1ad58de361931f0b4fda5"}, - {file = "huggingface_hub-0.13.4.tar.gz", hash = "sha256:db83d9c2f76aed8cf49893ffadd6be24e82074da2f64b1d36b8ba40eb255e115"}, + {file = "huggingface_hub-0.15.1-py3-none-any.whl", hash = "sha256:05b0fb0abbf1f625dfee864648ac3049fe225ac4371c7bafaca0c2d3a2f83445"}, + {file = "huggingface_hub-0.15.1.tar.gz", hash = "sha256:a61b7d1a7769fe10119e730277c72ab99d95c48d86a3d6da3e9f3d0f632a4081"}, ] [package.dependencies] filelock = "*" +fsspec = "*" packaging = ">=20.9" pyyaml = ">=5.1" requests = "*" @@ -2095,13 +2156,13 @@ tqdm = ">=4.42.1" typing-extensions = ">=3.7.4.3" [package.extras] -all = ["InquirerPy (==0.3.4)", "Jinja2", "Pillow", "black (>=23.1,<24.0)", "jedi", "mypy (==0.982)", "pytest", "pytest-cov", "pytest-env", "pytest-xdist", "ruff (>=0.0.241)", "soundfile", "types-PyYAML", "types-requests", "types-simplejson", "types-toml", "types-tqdm", "types-urllib3"] +all = ["InquirerPy (==0.3.4)", "Jinja2", "Pillow", "black (>=23.1,<24.0)", "gradio", "jedi", "mypy (==0.982)", "numpy", "pytest", "pytest-cov", "pytest-env", "pytest-vcr", "pytest-xdist", "ruff (>=0.0.241)", "soundfile", "types-PyYAML", "types-requests", "types-simplejson", "types-toml", "types-tqdm", "types-urllib3", "urllib3 (<2.0)"] cli = ["InquirerPy (==0.3.4)"] -dev = ["InquirerPy (==0.3.4)", "Jinja2", "Pillow", "black (>=23.1,<24.0)", "jedi", "mypy (==0.982)", "pytest", "pytest-cov", "pytest-env", "pytest-xdist", "ruff (>=0.0.241)", "soundfile", "types-PyYAML", "types-requests", "types-simplejson", "types-toml", "types-tqdm", "types-urllib3"] +dev = ["InquirerPy (==0.3.4)", "Jinja2", "Pillow", "black (>=23.1,<24.0)", "gradio", "jedi", "mypy (==0.982)", "numpy", "pytest", "pytest-cov", "pytest-env", "pytest-vcr", "pytest-xdist", "ruff (>=0.0.241)", "soundfile", "types-PyYAML", "types-requests", "types-simplejson", "types-toml", "types-tqdm", "types-urllib3", "urllib3 (<2.0)"] fastai = ["fastai (>=2.4)", "fastcore (>=1.3.27)", "toml"] quality = ["black (>=23.1,<24.0)", "mypy (==0.982)", "ruff (>=0.0.241)"] tensorflow = ["graphviz", "pydot", "tensorflow"] -testing = ["InquirerPy (==0.3.4)", "Jinja2", "Pillow", "jedi", "pytest", "pytest-cov", "pytest-env", "pytest-xdist", "soundfile"] +testing = ["InquirerPy (==0.3.4)", "Jinja2", "Pillow", "gradio", "jedi", "numpy", "pytest", "pytest-cov", "pytest-env", "pytest-vcr", "pytest-xdist", "soundfile", "urllib3 (<2.0)"] torch = ["torch"] typing = ["types-PyYAML", "types-requests", "types-simplejson", "types-toml", "types-tqdm", "types-urllib3"] @@ -2146,21 +2207,21 @@ files = [ [[package]] name = "importlib-metadata" -version = "4.13.0" +version = "6.0.1" description = "Read metadata from Python packages" category = "main" optional = false python-versions = ">=3.7" files = [ - {file = "importlib_metadata-4.13.0-py3-none-any.whl", hash = "sha256:8a8a81bcf996e74fee46f0d16bd3eaa382a7eb20fd82445c3ad11f4090334116"}, - {file = "importlib_metadata-4.13.0.tar.gz", hash = "sha256:dd0173e8f150d6815e098fd354f6414b0f079af4644ddfe90c71e2fc6174346d"}, + {file = "importlib_metadata-6.0.1-py3-none-any.whl", hash = "sha256:1543daade821c89b1c4a55986c326f36e54f2e6ca3bad96be4563d0acb74dcd4"}, + {file = "importlib_metadata-6.0.1.tar.gz", hash = "sha256:950127d57e35a806d520817d3e92eec3f19fdae9f0cd99da77a407c5aabefba3"}, ] [package.dependencies] zipp = ">=0.5" [package.extras] -docs = ["furo", "jaraco.packaging (>=9)", "jaraco.tidelift (>=1.4)", "rst.linker (>=1.9)", "sphinx (>=3.5)"] +docs = ["furo", "jaraco.packaging (>=9)", "jaraco.tidelift (>=1.4)", "rst.linker (>=1.9)", "sphinx (>=3.5)", "sphinx-lint"] perf = ["ipython"] testing = ["flake8 (<5)", "flufl.flake8", "importlib-resources (>=1.3)", "packaging", "pyfakefs", "pytest (>=6)", "pytest-black (>=0.3.7)", "pytest-checkdocs (>=2.4)", "pytest-cov", "pytest-enabler (>=1.3)", "pytest-flake8", "pytest-mypy (>=0.9.1)", "pytest-perf (>=0.9.2)"] @@ -2604,14 +2665,14 @@ testing = ["pytest (>=6)", "pytest-black (>=0.3.7)", "pytest-checkdocs (>=2.4)", [[package]] name = "langchain" -version = "0.0.218" +version = "0.0.219" description = "Building applications with LLMs through composability" category = "main" optional = false python-versions = ">=3.8.1,<4.0" files = [ - {file = "langchain-0.0.218-py3-none-any.whl", hash = "sha256:c78b0bd65791b80ddf132913ce2239d4cb2dca2dde0ce20a77f36af0c12d397c"}, - {file = "langchain-0.0.218.tar.gz", hash = "sha256:85a237d5b3664bf9acc87420c813df245c03ef1a68cc2424eeb0d81e60d7a0b7"}, + {file = "langchain-0.0.219-py3-none-any.whl", hash = "sha256:1f08a00e622f1c75087d6013f34e82be3f8dd1859266eb583a0fd7bc045090cf"}, + {file = "langchain-0.0.219.tar.gz", hash = "sha256:842f8212939e5ac4005906d2215574ffb3e34d2fe28f5bc0f46eb3b28fb29c5d"}, ] [package.dependencies] @@ -2629,7 +2690,7 @@ SQLAlchemy = ">=1.4,<3" tenacity = ">=8.1.0,<9.0.0" [package.extras] -all = ["O365 (>=2.0.26,<3.0.0)", "aleph-alpha-client (>=2.15.0,<3.0.0)", "anthropic (>=0.2.6,<0.3.0)", "arxiv (>=1.4,<2.0)", "atlassian-python-api (>=3.36.0,<4.0.0)", "awadb (>=0.3.3,<0.4.0)", "azure-ai-formrecognizer (>=3.2.1,<4.0.0)", "azure-ai-vision (>=0.11.1b1,<0.12.0)", "azure-cognitiveservices-speech (>=1.28.0,<2.0.0)", "azure-cosmos (>=4.4.0b1,<5.0.0)", "azure-identity (>=1.12.0,<2.0.0)", "beautifulsoup4 (>=4,<5)", "clarifai (==9.1.0)", "clickhouse-connect (>=0.5.14,<0.6.0)", "cohere (>=3,<4)", "deeplake (>=3.6.2,<4.0.0)", "docarray[hnswlib] (>=0.32.0,<0.33.0)", "duckduckgo-search (>=3.8.3,<4.0.0)", "elasticsearch (>=8,<9)", "esprima (>=4.0.1,<5.0.0)", "faiss-cpu (>=1,<2)", "google-api-python-client (==2.70.0)", "google-auth (>=2.18.1,<3.0.0)", "google-search-results (>=2,<3)", "gptcache (>=0.1.7)", "html2text (>=2020.1.16,<2021.0.0)", "huggingface_hub (>=0,<1)", "jina (>=3.14,<4.0)", "jinja2 (>=3,<4)", "jq (>=1.4.1,<2.0.0)", "lancedb (>=0.1,<0.2)", "langkit (>=0.0.1.dev3,<0.1.0)", "lark (>=1.1.5,<2.0.0)", "lxml (>=4.9.2,<5.0.0)", "manifest-ml (>=0.0.1,<0.0.2)", "momento (>=1.5.0,<2.0.0)", "nebula3-python (>=3.4.0,<4.0.0)", "neo4j (>=5.8.1,<6.0.0)", "networkx (>=2.6.3,<3.0.0)", "nlpcloud (>=1,<2)", "nltk (>=3,<4)", "nomic (>=1.0.43,<2.0.0)", "openai (>=0,<1)", "openlm (>=0.0.5,<0.0.6)", "opensearch-py (>=2.0.0,<3.0.0)", "pdfminer-six (>=20221105,<20221106)", "pexpect (>=4.8.0,<5.0.0)", "pgvector (>=0.1.6,<0.2.0)", "pinecone-client (>=2,<3)", "pinecone-text (>=0.4.2,<0.5.0)", "psycopg2-binary (>=2.9.5,<3.0.0)", "pymongo (>=4.3.3,<5.0.0)", "pyowm (>=3.3.0,<4.0.0)", "pypdf (>=3.4.0,<4.0.0)", "pytesseract (>=0.3.10,<0.4.0)", "pyvespa (>=0.33.0,<0.34.0)", "qdrant-client (>=1.1.2,<2.0.0)", "redis (>=4,<5)", "requests-toolbelt (>=1.0.0,<2.0.0)", "sentence-transformers (>=2,<3)", "singlestoredb (>=0.7.1,<0.8.0)", "spacy (>=3,<4)", "steamship (>=2.16.9,<3.0.0)", "tensorflow-text (>=2.11.0,<3.0.0)", "tigrisdb (>=1.0.0b6,<2.0.0)", "tiktoken (>=0.3.2,<0.4.0)", "torch (>=1,<3)", "transformers (>=4,<5)", "weaviate-client (>=3,<4)", "wikipedia (>=1,<2)", "wolframalpha (==5.0.0)"] +all = ["O365 (>=2.0.26,<3.0.0)", "aleph-alpha-client (>=2.15.0,<3.0.0)", "anthropic (>=0.2.6,<0.3.0)", "arxiv (>=1.4,<2.0)", "atlassian-python-api (>=3.36.0,<4.0.0)", "awadb (>=0.3.3,<0.4.0)", "azure-ai-formrecognizer (>=3.2.1,<4.0.0)", "azure-ai-vision (>=0.11.1b1,<0.12.0)", "azure-cognitiveservices-speech (>=1.28.0,<2.0.0)", "azure-cosmos (>=4.4.0b1,<5.0.0)", "azure-identity (>=1.12.0,<2.0.0)", "beautifulsoup4 (>=4,<5)", "clarifai (==9.1.0)", "clickhouse-connect (>=0.5.14,<0.6.0)", "cohere (>=3,<4)", "deeplake (>=3.6.2,<4.0.0)", "docarray[hnswlib] (>=0.32.0,<0.33.0)", "duckduckgo-search (>=3.8.3,<4.0.0)", "elasticsearch (>=8,<9)", "esprima (>=4.0.1,<5.0.0)", "faiss-cpu (>=1,<2)", "google-api-python-client (==2.70.0)", "google-auth (>=2.18.1,<3.0.0)", "google-search-results (>=2,<3)", "gptcache (>=0.1.7)", "html2text (>=2020.1.16,<2021.0.0)", "huggingface_hub (>=0,<1)", "jina (>=3.14,<4.0)", "jinja2 (>=3,<4)", "jq (>=1.4.1,<2.0.0)", "lancedb (>=0.1,<0.2)", "langkit (>=0.0.1.dev3,<0.1.0)", "lark (>=1.1.5,<2.0.0)", "lxml (>=4.9.2,<5.0.0)", "manifest-ml (>=0.0.1,<0.0.2)", "momento (>=1.5.0,<2.0.0)", "nebula3-python (>=3.4.0,<4.0.0)", "neo4j (>=5.8.1,<6.0.0)", "networkx (>=2.6.3,<3.0.0)", "nlpcloud (>=1,<2)", "nltk (>=3,<4)", "nomic (>=1.0.43,<2.0.0)", "octoai-sdk (>=0.1.1,<0.2.0)", "openai (>=0,<1)", "openlm (>=0.0.5,<0.0.6)", "opensearch-py (>=2.0.0,<3.0.0)", "pdfminer-six (>=20221105,<20221106)", "pexpect (>=4.8.0,<5.0.0)", "pgvector (>=0.1.6,<0.2.0)", "pinecone-client (>=2,<3)", "pinecone-text (>=0.4.2,<0.5.0)", "psycopg2-binary (>=2.9.5,<3.0.0)", "pymongo (>=4.3.3,<5.0.0)", "pyowm (>=3.3.0,<4.0.0)", "pypdf (>=3.4.0,<4.0.0)", "pytesseract (>=0.3.10,<0.4.0)", "pyvespa (>=0.33.0,<0.34.0)", "qdrant-client (>=1.1.2,<2.0.0)", "redis (>=4,<5)", "requests-toolbelt (>=1.0.0,<2.0.0)", "sentence-transformers (>=2,<3)", "singlestoredb (>=0.7.1,<0.8.0)", "spacy (>=3,<4)", "steamship (>=2.16.9,<3.0.0)", "tensorflow-text (>=2.11.0,<3.0.0)", "tigrisdb (>=1.0.0b6,<2.0.0)", "tiktoken (>=0.3.2,<0.4.0)", "torch (>=1,<3)", "transformers (>=4,<5)", "weaviate-client (>=3,<4)", "wikipedia (>=1,<2)", "wolframalpha (==5.0.0)"] azure = ["azure-ai-formrecognizer (>=3.2.1,<4.0.0)", "azure-ai-vision (>=0.11.1b1,<0.12.0)", "azure-cognitiveservices-speech (>=1.28.0,<2.0.0)", "azure-core (>=1.26.4,<2.0.0)", "azure-cosmos (>=4.4.0b1,<5.0.0)", "azure-identity (>=1.12.0,<2.0.0)", "azure-search-documents (==11.4.0a20230509004)", "openai (>=0,<1)"] clarifai = ["clarifai (==9.1.0)"] cohere = ["cohere (>=3,<4)"] @@ -2644,13 +2705,13 @@ text-helpers = ["chardet (>=5.1.0,<6.0.0)"] [[package]] name = "langchain-serve" -version = "0.0.47" +version = "0.0.48" description = "Langchain Serve - serve your langchain apps on Jina AI Cloud." category = "main" optional = true python-versions = "*" files = [ - {file = "langchain-serve-0.0.47.tar.gz", hash = "sha256:2b7827ddaffa4fe6eb8fa988fc8b9be827ded702340f1644f065200b89fdc3a9"}, + {file = "langchain-serve-0.0.48.tar.gz", hash = "sha256:4644eb7a6aa733edcd809a0becf49a2899c285a5adb0bab454f91bbb8e0be39b"}, ] [package.dependencies] @@ -2685,6 +2746,27 @@ pydantic = ">=1,<2" requests = ">=2,<3" tenacity = ">=8.1.0,<9.0.0" +[[package]] +name = "linkify-it-py" +version = "2.0.2" +description = "Links recognition library with FULL unicode support." +category = "main" +optional = true +python-versions = ">=3.7" +files = [ + {file = "linkify-it-py-2.0.2.tar.gz", hash = "sha256:19f3060727842c254c808e99d465c80c49d2c7306788140987a1a7a29b0d6ad2"}, + {file = "linkify_it_py-2.0.2-py3-none-any.whl", hash = "sha256:a3a24428f6c96f27370d7fe61d2ac0be09017be5190d68d8658233171f1b6541"}, +] + +[package.dependencies] +uc-micro-py = "*" + +[package.extras] +benchmark = ["pytest", "pytest-benchmark"] +dev = ["black", "flake8", "isort", "pre-commit", "pyproject-flake8"] +doc = ["myst-parser", "sphinx", "sphinx-book-theme"] +test = ["coverage", "pytest", "pytest-cov"] + [[package]] name = "llama-cpp-python" version = "0.1.55" @@ -2881,17 +2963,19 @@ testing = ["coverage", "pyyaml"] [[package]] name = "markdown-it-py" -version = "3.0.0" +version = "2.2.0" description = "Python port of markdown-it. Markdown parsing, done right!" category = "main" optional = false -python-versions = ">=3.8" +python-versions = ">=3.7" files = [ - {file = "markdown-it-py-3.0.0.tar.gz", hash = "sha256:e3f60a94fa066dc52ec76661e37c851cb232d92f9886b15cb560aaada2df8feb"}, - {file = "markdown_it_py-3.0.0-py3-none-any.whl", hash = "sha256:355216845c60bd96232cd8d8c40e8f9765cc86f46880e43a8fd22dc1a1a8cab1"}, + {file = "markdown-it-py-2.2.0.tar.gz", hash = "sha256:7c9a5e412688bc771c67432cbfebcdd686c93ce6484913dccf06cb5a0bea35a1"}, + {file = "markdown_it_py-2.2.0-py3-none-any.whl", hash = "sha256:5a35f8d1870171d9acc47b99612dc146129b631baf04970128b568f190d0cc30"}, ] [package.dependencies] +linkify-it-py = {version = ">=1,<3", optional = true, markers = "extra == \"linkify\""} +mdit-py-plugins = {version = "*", optional = true, markers = "extra == \"plugins\""} mdurl = ">=0.1,<1.0" [package.extras] @@ -2901,7 +2985,7 @@ compare = ["commonmark (>=0.9,<1.0)", "markdown (>=3.4,<4.0)", "mistletoe (>=1.0 linkify = ["linkify-it-py (>=1,<3)"] plugins = ["mdit-py-plugins"] profiling = ["gprof2dot"] -rtd = ["jupyter_sphinx", "mdit-py-plugins", "myst-parser", "pyyaml", "sphinx", "sphinx-copybutton", "sphinx-design", "sphinx_book_theme"] +rtd = ["attrs", "myst-parser", "pyyaml", "sphinx", "sphinx-copybutton", "sphinx-design", "sphinx_book_theme"] testing = ["coverage", "pytest", "pytest-cov", "pytest-regressions"] [[package]] @@ -3015,6 +3099,26 @@ files = [ [package.dependencies] traitlets = "*" +[[package]] +name = "mdit-py-plugins" +version = "0.4.0" +description = "Collection of plugins for markdown-it-py" +category = "main" +optional = true +python-versions = ">=3.8" +files = [ + {file = "mdit_py_plugins-0.4.0-py3-none-any.whl", hash = "sha256:b51b3bb70691f57f974e257e367107857a93b36f322a9e6d44ca5bf28ec2def9"}, + {file = "mdit_py_plugins-0.4.0.tar.gz", hash = "sha256:d8ab27e9aed6c38aa716819fedfde15ca275715955f8a185a8e1cf90fb1d2c1b"}, +] + +[package.dependencies] +markdown-it-py = ">=1.0.0,<4.0.0" + +[package.extras] +code-style = ["pre-commit"] +rtd = ["myst-parser", "sphinx-book-theme"] +testing = ["coverage", "pytest", "pytest-cov", "pytest-regressions"] + [[package]] name = "mdurl" version = "0.1.2" @@ -3257,18 +3361,6 @@ files = [ {file = "mypy_extensions-1.0.0.tar.gz", hash = "sha256:75dbf8955dc00442a438fc4d0666508a9a97b6bd41aa2f0ffe9d2f2725af0782"}, ] -[[package]] -name = "nanoid" -version = "2.0.0" -description = "A tiny, secure, URL-friendly, unique string ID generator for Python" -category = "main" -optional = true -python-versions = "*" -files = [ - {file = "nanoid-2.0.0-py3-none-any.whl", hash = "sha256:90aefa650e328cffb0893bbd4c236cfd44c48bc1f2d0b525ecc53c3187b653bb"}, - {file = "nanoid-2.0.0.tar.gz", hash = "sha256:5a80cad5e9c6e9ae3a41fa2fb34ae189f7cb420b2a5d8f82bd9d23466e4efa68"}, -] - [[package]] name = "nest-asyncio" version = "1.5.6" @@ -3512,77 +3604,97 @@ et-xmlfile = "*" [[package]] name = "opentelemetry-api" -version = "1.16.0" +version = "1.18.0" description = "OpenTelemetry Python API" category = "main" optional = false python-versions = ">=3.7" files = [ - {file = "opentelemetry_api-1.16.0-py3-none-any.whl", hash = "sha256:79e8f0cf88dbdd36b6abf175d2092af1efcaa2e71552d0d2b3b181a9707bf4bc"}, - {file = "opentelemetry_api-1.16.0.tar.gz", hash = "sha256:4b0e895a3b1f5e1908043ebe492d33e33f9ccdbe6d02d3994c2f8721a63ddddb"}, + {file = "opentelemetry_api-1.18.0-py3-none-any.whl", hash = "sha256:d05bcc94ec239fd76fd90d784c5e3ad081a8a1ac2ffc8a2c83a49ace052d1492"}, + {file = "opentelemetry_api-1.18.0.tar.gz", hash = "sha256:2bbf29739fcef268c419e3bf1735566c2e7f81026c14bcc78b62a0b97f8ecf2f"}, ] [package.dependencies] deprecated = ">=1.2.6" +importlib-metadata = ">=6.0.0,<6.1.0" setuptools = ">=16.0" [[package]] name = "opentelemetry-exporter-otlp" -version = "1.16.0" +version = "1.18.0" description = "OpenTelemetry Collector Exporters" category = "main" optional = false python-versions = ">=3.7" files = [ - {file = "opentelemetry_exporter_otlp-1.16.0-py3-none-any.whl", hash = "sha256:e1a91a267afb7ae0196cb25ed0bc0a991ff5d9f3d6b3a7ff7c0bce57be2d72d5"}, - {file = "opentelemetry_exporter_otlp-1.16.0.tar.gz", hash = "sha256:5d76b4a44aa5c11e93b9280eaf93ae497557cf01046485ec1c7bfb2c492dabc4"}, + {file = "opentelemetry_exporter_otlp-1.18.0-py3-none-any.whl", hash = "sha256:2b8d18aa3f8fa360df2fe6c274132cf38939a02f8aa621d6ed060a920aa9e4c6"}, + {file = "opentelemetry_exporter_otlp-1.18.0.tar.gz", hash = "sha256:cafcf7f28debbcc22e06d52cdc4f65a118f17b730dabe8f9d4b87587e95b1481"}, ] [package.dependencies] -opentelemetry-exporter-otlp-proto-grpc = "1.16.0" -opentelemetry-exporter-otlp-proto-http = "1.16.0" +opentelemetry-exporter-otlp-proto-grpc = "1.18.0" +opentelemetry-exporter-otlp-proto-http = "1.18.0" + +[[package]] +name = "opentelemetry-exporter-otlp-proto-common" +version = "1.18.0" +description = "OpenTelemetry Protobuf encoding" +category = "main" +optional = false +python-versions = ">=3.7" +files = [ + {file = "opentelemetry_exporter_otlp_proto_common-1.18.0-py3-none-any.whl", hash = "sha256:276073ccc8c6e6570fe05ca8ca0de77d662bc89bc614ec8bfbc855112f7e25e3"}, + {file = "opentelemetry_exporter_otlp_proto_common-1.18.0.tar.gz", hash = "sha256:4d9883d6929aabe75e485950bbe8b149a14d95e50b1570426832daa6913b0871"}, +] + +[package.dependencies] +opentelemetry-proto = "1.18.0" [[package]] name = "opentelemetry-exporter-otlp-proto-grpc" -version = "1.16.0" +version = "1.18.0" description = "OpenTelemetry Collector Protobuf over gRPC Exporter" category = "main" optional = false python-versions = ">=3.7" files = [ - {file = "opentelemetry_exporter_otlp_proto_grpc-1.16.0-py3-none-any.whl", hash = "sha256:ace2cedc43bc30e1b2475b14f72acf1a1528716965209d31fb0a72c59f0f4fe4"}, - {file = "opentelemetry_exporter_otlp_proto_grpc-1.16.0.tar.gz", hash = "sha256:0853ea1e566c1fab5633e7f7bca2a650ba445b04ba02f93173920b0f5c561f63"}, + {file = "opentelemetry_exporter_otlp_proto_grpc-1.18.0-py3-none-any.whl", hash = "sha256:c773bc9df2c9d6464f0d5936963399b2fc440f0616c1277f29512d540ad7e0a2"}, + {file = "opentelemetry_exporter_otlp_proto_grpc-1.18.0.tar.gz", hash = "sha256:8eddfde4267da876871e62f1b58369986bdb7e47e43032c498f1ea807d7191c4"}, ] [package.dependencies] backoff = {version = ">=1.10.0,<3.0.0", markers = "python_version >= \"3.7\""} +deprecated = ">=1.2.6" googleapis-common-protos = ">=1.52,<2.0" grpcio = ">=1.0.0,<2.0.0" opentelemetry-api = ">=1.15,<2.0" -opentelemetry-proto = "1.16.0" -opentelemetry-sdk = ">=1.16.0,<1.17.0" +opentelemetry-exporter-otlp-proto-common = "1.18.0" +opentelemetry-proto = "1.18.0" +opentelemetry-sdk = ">=1.18.0,<1.19.0" [package.extras] test = ["pytest-grpc"] [[package]] name = "opentelemetry-exporter-otlp-proto-http" -version = "1.16.0" +version = "1.18.0" description = "OpenTelemetry Collector Protobuf over HTTP Exporter" category = "main" optional = false python-versions = ">=3.7" files = [ - {file = "opentelemetry_exporter_otlp_proto_http-1.16.0-py3-none-any.whl", hash = "sha256:f27cabd0e071fb8cc258bcaaad51b0c228fef1156bf6e6b1f9ae738881d9bf51"}, - {file = "opentelemetry_exporter_otlp_proto_http-1.16.0.tar.gz", hash = "sha256:d7f14ae8b41b3606ee3e4ab12d42cb48610d8419f1d8b92c7d3ff5813c7a10d7"}, + {file = "opentelemetry_exporter_otlp_proto_http-1.18.0-py3-none-any.whl", hash = "sha256:c22110705473f1c61bd4d74ded3b8bd3fac66ffbe7d9ba376267d8539919ed90"}, + {file = "opentelemetry_exporter_otlp_proto_http-1.18.0.tar.gz", hash = "sha256:d9a2118558decf9e9a2d6573ad9d33876f3a44d7dc43f10d38a900d5a6f867d6"}, ] [package.dependencies] backoff = {version = ">=1.10.0,<3.0.0", markers = "python_version >= \"3.7\""} +deprecated = ">=1.2.6" googleapis-common-protos = ">=1.52,<2.0" opentelemetry-api = ">=1.15,<2.0" -opentelemetry-proto = "1.16.0" -opentelemetry-sdk = ">=1.16.0,<1.17.0" +opentelemetry-exporter-otlp-proto-common = "1.18.0" +opentelemetry-proto = "1.18.0" +opentelemetry-sdk = ">=1.18.0,<1.19.0" requests = ">=2.7,<3.0" [package.extras] @@ -3607,14 +3719,14 @@ prometheus-client = ">=0.5.0,<1.0.0" [[package]] name = "opentelemetry-instrumentation" -version = "0.37b0" +version = "0.39b0" description = "Instrumentation Tools & Auto Instrumentation for OpenTelemetry Python" category = "main" optional = false python-versions = ">=3.7" files = [ - {file = "opentelemetry_instrumentation-0.37b0-py3-none-any.whl", hash = "sha256:0dbd4d869608667b9dfaf39914312c5979370d5fc5faa36678f5e25fa54f045b"}, - {file = "opentelemetry_instrumentation-0.37b0.tar.gz", hash = "sha256:2a172a7ef8d35332f24a97caf6b7b62fe418a48cf841ae2bcdaed338fea37b41"}, + {file = "opentelemetry_instrumentation-0.39b0-py3-none-any.whl", hash = "sha256:fcfd74413159fe797e343104f7e85a3f8146713634debcac10a057ac7f1eb011"}, + {file = "opentelemetry_instrumentation-0.39b0.tar.gz", hash = "sha256:2a6d1f386aa769dc763e6f2c6b483f50c4024f1bc76a78b57f05ae05970ce5f4"}, ] [package.dependencies] @@ -3624,21 +3736,21 @@ wrapt = ">=1.0.0,<2.0.0" [[package]] name = "opentelemetry-instrumentation-aiohttp-client" -version = "0.37b0" +version = "0.39b0" description = "OpenTelemetry aiohttp client instrumentation" category = "main" optional = false python-versions = ">=3.7" files = [ - {file = "opentelemetry_instrumentation_aiohttp_client-0.37b0-py3-none-any.whl", hash = "sha256:d047c711dff98e35b31ed5b6c801fc59ee5f79cb3d2a6217761a366894d73269"}, - {file = "opentelemetry_instrumentation_aiohttp_client-0.37b0.tar.gz", hash = "sha256:eb21d618aa810ad72764d02b5a6da3d578116ddcb5213c84feba721f0dff7060"}, + {file = "opentelemetry_instrumentation_aiohttp_client-0.39b0-py3-none-any.whl", hash = "sha256:315adf314f35532677b7ae2abd9a663ec86df7183594605592f0e89e599d86ca"}, + {file = "opentelemetry_instrumentation_aiohttp_client-0.39b0.tar.gz", hash = "sha256:20fd66f4aa757728e48efae1351d9eed98d6e352595933f47ca042df9d83fc78"}, ] [package.dependencies] opentelemetry-api = ">=1.12,<2.0" -opentelemetry-instrumentation = "0.37b0" -opentelemetry-semantic-conventions = "0.37b0" -opentelemetry-util-http = "0.37b0" +opentelemetry-instrumentation = "0.39b0" +opentelemetry-semantic-conventions = "0.39b0" +opentelemetry-util-http = "0.39b0" wrapt = ">=1.0.0,<2.0.0" [package.extras] @@ -3647,83 +3759,83 @@ test = ["opentelemetry-instrumentation-aiohttp-client[instruments]"] [[package]] name = "opentelemetry-instrumentation-asgi" -version = "0.37b0" +version = "0.39b0" description = "ASGI instrumentation for OpenTelemetry" category = "main" optional = false python-versions = ">=3.7" files = [ - {file = "opentelemetry_instrumentation_asgi-0.37b0-py3-none-any.whl", hash = "sha256:71ded26c8425b2f44573a2a1ef0b41941436e0b4d1e91067d84ef6ebc1bba49f"}, - {file = "opentelemetry_instrumentation_asgi-0.37b0.tar.gz", hash = "sha256:b8557d8823a04e083aae18f285a4c2ed75746acf9f2e63e44778f2aa8942af02"}, + {file = "opentelemetry_instrumentation_asgi-0.39b0-py3-none-any.whl", hash = "sha256:cb9cbf56e32be12b0e5e70c21cf27999f10920afc73110457f4e4b0ec4078c5f"}, + {file = "opentelemetry_instrumentation_asgi-0.39b0.tar.gz", hash = "sha256:28b76aa6b9fe41fcfa52214c2e554a79cc371927d13c40b22e7a02aff35760eb"}, ] [package.dependencies] asgiref = ">=3.0,<4.0" opentelemetry-api = ">=1.12,<2.0" -opentelemetry-instrumentation = "0.37b0" -opentelemetry-semantic-conventions = "0.37b0" -opentelemetry-util-http = "0.37b0" +opentelemetry-instrumentation = "0.39b0" +opentelemetry-semantic-conventions = "0.39b0" +opentelemetry-util-http = "0.39b0" [package.extras] instruments = ["asgiref (>=3.0,<4.0)"] -test = ["opentelemetry-instrumentation-asgi[instruments]", "opentelemetry-test-utils (==0.37b0)"] +test = ["opentelemetry-instrumentation-asgi[instruments]", "opentelemetry-test-utils (==0.39b0)"] [[package]] name = "opentelemetry-instrumentation-fastapi" -version = "0.37b0" +version = "0.39b0" description = "OpenTelemetry FastAPI Instrumentation" category = "main" optional = false python-versions = ">=3.7" files = [ - {file = "opentelemetry_instrumentation_fastapi-0.37b0-py3-none-any.whl", hash = "sha256:dc983910d9c582addb934f051848158cf0155f4ccca83b5cc10904991c4d429c"}, - {file = "opentelemetry_instrumentation_fastapi-0.37b0.tar.gz", hash = "sha256:84e50dc92b3ae65f4e18d0cad6538db267690361a55644553a5f3b32f64e2de9"}, + {file = "opentelemetry_instrumentation_fastapi-0.39b0-py3-none-any.whl", hash = "sha256:33223b46393ef63229d35c4e0903e900674d3dfc65ada49fbfd51db8742295cb"}, + {file = "opentelemetry_instrumentation_fastapi-0.39b0.tar.gz", hash = "sha256:02d4d583a0a62efc9a94d489f1a736ca2905fb6f7d445ac686608de51d7e375b"}, ] [package.dependencies] opentelemetry-api = ">=1.12,<2.0" -opentelemetry-instrumentation = "0.37b0" -opentelemetry-instrumentation-asgi = "0.37b0" -opentelemetry-semantic-conventions = "0.37b0" -opentelemetry-util-http = "0.37b0" +opentelemetry-instrumentation = "0.39b0" +opentelemetry-instrumentation-asgi = "0.39b0" +opentelemetry-semantic-conventions = "0.39b0" +opentelemetry-util-http = "0.39b0" [package.extras] -instruments = ["fastapi (<=0.90.1)"] -test = ["httpx (>=0.22,<1.0)", "opentelemetry-instrumentation-fastapi[instruments]", "opentelemetry-test-utils (==0.37b0)", "requests (>=2.23,<3.0)"] +instruments = ["fastapi (>=0.58,<1.0)"] +test = ["httpx (>=0.22,<1.0)", "opentelemetry-instrumentation-fastapi[instruments]", "opentelemetry-test-utils (==0.39b0)", "requests (>=2.23,<3.0)"] [[package]] name = "opentelemetry-instrumentation-grpc" -version = "0.37b0" +version = "0.39b0" description = "OpenTelemetry gRPC instrumentation" category = "main" optional = false python-versions = ">=3.7" files = [ - {file = "opentelemetry_instrumentation_grpc-0.37b0-py3-none-any.whl", hash = "sha256:a40ceb2b744b182b9956dd365f9978b2ec24ad01a3ee3945ae000ff5119215d8"}, - {file = "opentelemetry_instrumentation_grpc-0.37b0.tar.gz", hash = "sha256:80d6d3084e0402849a2f5a1fc9bbbcc6821c3dc12b05834765bf4882aa36fe67"}, + {file = "opentelemetry_instrumentation_grpc-0.39b0-py3-none-any.whl", hash = "sha256:1ab7a1e4a43efd8e827d1666065253fdc4dca76ca7bcf43417fe7523999e3145"}, + {file = "opentelemetry_instrumentation_grpc-0.39b0.tar.gz", hash = "sha256:766ea59ff2677301e5354d2113a635c20e462611ecd4b5fb764121759d945bb2"}, ] [package.dependencies] opentelemetry-api = ">=1.12,<2.0" -opentelemetry-instrumentation = "0.37b0" +opentelemetry-instrumentation = "0.39b0" opentelemetry-sdk = ">=1.12,<2.0" -opentelemetry-semantic-conventions = "0.37b0" +opentelemetry-semantic-conventions = "0.39b0" wrapt = ">=1.0.0,<2.0.0" [package.extras] instruments = ["grpcio (>=1.27,<2.0)"] -test = ["opentelemetry-instrumentation-grpc[instruments]", "opentelemetry-sdk (>=1.12,<2.0)", "opentelemetry-test-utils (==0.37b0)", "protobuf (>=3.13,<4.0)"] +test = ["opentelemetry-instrumentation-grpc[instruments]", "opentelemetry-sdk (>=1.12,<2.0)", "opentelemetry-test-utils (==0.39b0)", "protobuf (>=3.13,<4.0)"] [[package]] name = "opentelemetry-proto" -version = "1.16.0" +version = "1.18.0" description = "OpenTelemetry Python Proto" category = "main" optional = false python-versions = ">=3.7" files = [ - {file = "opentelemetry_proto-1.16.0-py3-none-any.whl", hash = "sha256:160326d300faf43c3f72c4a916516ee5b63289ceb9828294b698ef943697cbd5"}, - {file = "opentelemetry_proto-1.16.0.tar.gz", hash = "sha256:e58832dfec64621972a9836f8ae163fb3063946eb02bdf43fae0f76f8cf46d0a"}, + {file = "opentelemetry_proto-1.18.0-py3-none-any.whl", hash = "sha256:34d1c49283f0246a58761d9322d5a79702a09afda0bb181bb6378ed26862e446"}, + {file = "opentelemetry_proto-1.18.0.tar.gz", hash = "sha256:4f38d01049c3926b9fd09833574bfb5e172d84c8ca85e2ab7f4b5a198d75aeef"}, ] [package.dependencies] @@ -3731,44 +3843,44 @@ protobuf = ">=3.19,<5.0" [[package]] name = "opentelemetry-sdk" -version = "1.16.0" +version = "1.18.0" description = "OpenTelemetry Python SDK" category = "main" optional = false python-versions = ">=3.7" files = [ - {file = "opentelemetry_sdk-1.16.0-py3-none-any.whl", hash = "sha256:15f03915eec4839f885a5e6ed959cde59b8690c8c012d07c95b4b138c98dc43f"}, - {file = "opentelemetry_sdk-1.16.0.tar.gz", hash = "sha256:4d3bb91e9e209dbeea773b5565d901da4f76a29bf9dbc1c9500be3cabb239a4e"}, + {file = "opentelemetry_sdk-1.18.0-py3-none-any.whl", hash = "sha256:a097cc1e0db6ff33b4d250a9350dc17975d24a22aa667fca2866e60c51306723"}, + {file = "opentelemetry_sdk-1.18.0.tar.gz", hash = "sha256:cd3230930a2ab288b1df149d261e9cd2bd48dee54ad18465a777831cb6779e90"}, ] [package.dependencies] -opentelemetry-api = "1.16.0" -opentelemetry-semantic-conventions = "0.37b0" +opentelemetry-api = "1.18.0" +opentelemetry-semantic-conventions = "0.39b0" setuptools = ">=16.0" typing-extensions = ">=3.7.4" [[package]] name = "opentelemetry-semantic-conventions" -version = "0.37b0" +version = "0.39b0" description = "OpenTelemetry Semantic Conventions" category = "main" optional = false python-versions = ">=3.7" files = [ - {file = "opentelemetry_semantic_conventions-0.37b0-py3-none-any.whl", hash = "sha256:462982278a42dab01f68641cd89f8460fe1f93e87c68a012a76fb426dcdba5ee"}, - {file = "opentelemetry_semantic_conventions-0.37b0.tar.gz", hash = "sha256:087ce2e248e42f3ffe4d9fa2303111de72bb93baa06a0f4655980bc1557c4228"}, + {file = "opentelemetry_semantic_conventions-0.39b0-py3-none-any.whl", hash = "sha256:0dd7a9dc0dfde2335f643705bba8f7c44182c797bc208b7601f0b8e8211cfd5c"}, + {file = "opentelemetry_semantic_conventions-0.39b0.tar.gz", hash = "sha256:06a9f198574e0dab6ebc072b59d89092cf9f115638a8a02157586769b6b7a69a"}, ] [[package]] name = "opentelemetry-util-http" -version = "0.37b0" +version = "0.39b0" description = "Web util for OpenTelemetry" category = "main" optional = false python-versions = ">=3.7" files = [ - {file = "opentelemetry_util_http-0.37b0-py3-none-any.whl", hash = "sha256:6d3ddba5429918dc3a3e250858a819dad617a4a415f16b6ca6531065501f342a"}, - {file = "opentelemetry_util_http-0.37b0.tar.gz", hash = "sha256:591a5332db31bb6056ef2741c435e38ad4979d3c595b20b4c4dd62cbf1693524"}, + {file = "opentelemetry_util_http-0.39b0-py3-none-any.whl", hash = "sha256:587c3f8931b8a1e910a04fd736e8ff1386fe25c09dc92dc85104679112221483"}, + {file = "opentelemetry_util_http-0.39b0.tar.gz", hash = "sha256:1a78e53e97c8f0b05216dbe4d93836ae5f5f94ba877003e56d065f089373f0ce"}, ] [[package]] @@ -3853,39 +3965,37 @@ files = [ [[package]] name = "pandas" -version = "1.5.3" +version = "2.0.3" description = "Powerful data structures for data analysis, time series, and statistics" category = "main" optional = false python-versions = ">=3.8" files = [ - {file = "pandas-1.5.3-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:3749077d86e3a2f0ed51367f30bf5b82e131cc0f14260c4d3e499186fccc4406"}, - {file = "pandas-1.5.3-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:972d8a45395f2a2d26733eb8d0f629b2f90bebe8e8eddbb8829b180c09639572"}, - {file = "pandas-1.5.3-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:50869a35cbb0f2e0cd5ec04b191e7b12ed688874bd05dd777c19b28cbea90996"}, - {file = "pandas-1.5.3-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:c3ac844a0fe00bfaeb2c9b51ab1424e5c8744f89860b138434a363b1f620f354"}, - {file = "pandas-1.5.3-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:7a0a56cef15fd1586726dace5616db75ebcfec9179a3a55e78f72c5639fa2a23"}, - {file = "pandas-1.5.3-cp310-cp310-win_amd64.whl", hash = "sha256:478ff646ca42b20376e4ed3fa2e8d7341e8a63105586efe54fa2508ee087f328"}, - {file = "pandas-1.5.3-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:6973549c01ca91ec96199e940495219c887ea815b2083722821f1d7abfa2b4dc"}, - {file = "pandas-1.5.3-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:c39a8da13cede5adcd3be1182883aea1c925476f4e84b2807a46e2775306305d"}, - {file = "pandas-1.5.3-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:f76d097d12c82a535fda9dfe5e8dd4127952b45fea9b0276cb30cca5ea313fbc"}, - {file = "pandas-1.5.3-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:e474390e60ed609cec869b0da796ad94f420bb057d86784191eefc62b65819ae"}, - {file = "pandas-1.5.3-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:5f2b952406a1588ad4cad5b3f55f520e82e902388a6d5a4a91baa8d38d23c7f6"}, - {file = "pandas-1.5.3-cp311-cp311-win_amd64.whl", hash = "sha256:bc4c368f42b551bf72fac35c5128963a171b40dce866fb066540eeaf46faa003"}, - {file = "pandas-1.5.3-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:14e45300521902689a81f3f41386dc86f19b8ba8dd5ac5a3c7010ef8d2932813"}, - {file = "pandas-1.5.3-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:9842b6f4b8479e41968eced654487258ed81df7d1c9b7b870ceea24ed9459b31"}, - {file = "pandas-1.5.3-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:26d9c71772c7afb9d5046e6e9cf42d83dd147b5cf5bcb9d97252077118543792"}, - {file = "pandas-1.5.3-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:5fbcb19d6fceb9e946b3e23258757c7b225ba450990d9ed63ccceeb8cae609f7"}, - {file = "pandas-1.5.3-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:565fa34a5434d38e9d250af3c12ff931abaf88050551d9fbcdfafca50d62babf"}, - {file = "pandas-1.5.3-cp38-cp38-win32.whl", hash = "sha256:87bd9c03da1ac870a6d2c8902a0e1fd4267ca00f13bc494c9e5a9020920e1d51"}, - {file = "pandas-1.5.3-cp38-cp38-win_amd64.whl", hash = "sha256:41179ce559943d83a9b4bbacb736b04c928b095b5f25dd2b7389eda08f46f373"}, - {file = "pandas-1.5.3-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:c74a62747864ed568f5a82a49a23a8d7fe171d0c69038b38cedf0976831296fa"}, - {file = "pandas-1.5.3-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:c4c00e0b0597c8e4f59e8d461f797e5d70b4d025880516a8261b2817c47759ee"}, - {file = "pandas-1.5.3-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:a50d9a4336a9621cab7b8eb3fb11adb82de58f9b91d84c2cd526576b881a0c5a"}, - {file = "pandas-1.5.3-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:dd05f7783b3274aa206a1af06f0ceed3f9b412cf665b7247eacd83be41cf7bf0"}, - {file = "pandas-1.5.3-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:9f69c4029613de47816b1bb30ff5ac778686688751a5e9c99ad8c7031f6508e5"}, - {file = "pandas-1.5.3-cp39-cp39-win32.whl", hash = "sha256:7cec0bee9f294e5de5bbfc14d0573f65526071029d036b753ee6507d2a21480a"}, - {file = "pandas-1.5.3-cp39-cp39-win_amd64.whl", hash = "sha256:dfd681c5dc216037e0b0a2c821f5ed99ba9f03ebcf119c7dac0e9a7b960b9ec9"}, - {file = "pandas-1.5.3.tar.gz", hash = "sha256:74a3fd7e5a7ec052f183273dc7b0acd3a863edf7520f5d3a1765c04ffdb3b0b1"}, + {file = "pandas-2.0.3-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:e4c7c9f27a4185304c7caf96dc7d91bc60bc162221152de697c98eb0b2648dd8"}, + {file = "pandas-2.0.3-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:f167beed68918d62bffb6ec64f2e1d8a7d297a038f86d4aed056b9493fca407f"}, + {file = "pandas-2.0.3-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:ce0c6f76a0f1ba361551f3e6dceaff06bde7514a374aa43e33b588ec10420183"}, + {file = "pandas-2.0.3-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:ba619e410a21d8c387a1ea6e8a0e49bb42216474436245718d7f2e88a2f8d7c0"}, + {file = "pandas-2.0.3-cp310-cp310-win32.whl", hash = "sha256:3ef285093b4fe5058eefd756100a367f27029913760773c8bf1d2d8bebe5d210"}, + {file = "pandas-2.0.3-cp310-cp310-win_amd64.whl", hash = "sha256:9ee1a69328d5c36c98d8e74db06f4ad518a1840e8ccb94a4ba86920986bb617e"}, + {file = "pandas-2.0.3-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:b084b91d8d66ab19f5bb3256cbd5ea661848338301940e17f4492b2ce0801fe8"}, + {file = "pandas-2.0.3-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:37673e3bdf1551b95bf5d4ce372b37770f9529743d2498032439371fc7b7eb26"}, + {file = "pandas-2.0.3-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:b9cb1e14fdb546396b7e1b923ffaeeac24e4cedd14266c3497216dd4448e4f2d"}, + {file = "pandas-2.0.3-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:d9cd88488cceb7635aebb84809d087468eb33551097d600c6dad13602029c2df"}, + {file = "pandas-2.0.3-cp311-cp311-win32.whl", hash = "sha256:694888a81198786f0e164ee3a581df7d505024fbb1f15202fc7db88a71d84ebd"}, + {file = "pandas-2.0.3-cp311-cp311-win_amd64.whl", hash = "sha256:6a21ab5c89dcbd57f78d0ae16630b090eec626360085a4148693def5452d8a6b"}, + {file = "pandas-2.0.3-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:9e4da0d45e7f34c069fe4d522359df7d23badf83abc1d1cef398895822d11061"}, + {file = "pandas-2.0.3-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:32fca2ee1b0d93dd71d979726b12b61faa06aeb93cf77468776287f41ff8fdc5"}, + {file = "pandas-2.0.3-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:258d3624b3ae734490e4d63c430256e716f488c4fcb7c8e9bde2d3aa46c29089"}, + {file = "pandas-2.0.3-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:9eae3dc34fa1aa7772dd3fc60270d13ced7346fcbcfee017d3132ec625e23bb0"}, + {file = "pandas-2.0.3-cp38-cp38-win32.whl", hash = "sha256:f3421a7afb1a43f7e38e82e844e2bca9a6d793d66c1a7f9f0ff39a795bbc5e02"}, + {file = "pandas-2.0.3-cp38-cp38-win_amd64.whl", hash = "sha256:69d7f3884c95da3a31ef82b7618af5710dba95bb885ffab339aad925c3e8ce78"}, + {file = "pandas-2.0.3-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:5247fb1ba347c1261cbbf0fcfba4a3121fbb4029d95d9ef4dc45406620b25c8b"}, + {file = "pandas-2.0.3-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:81af086f4543c9d8bb128328b5d32e9986e0c84d3ee673a2ac6fb57fd14f755e"}, + {file = "pandas-2.0.3-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:1994c789bf12a7c5098277fb43836ce090f1073858c10f9220998ac74f37c69b"}, + {file = "pandas-2.0.3-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:5ec591c48e29226bcbb316e0c1e9423622bc7a4eaf1ef7c3c9fa1a3981f89641"}, + {file = "pandas-2.0.3-cp39-cp39-win32.whl", hash = "sha256:04dbdbaf2e4d46ca8da896e1805bc04eb85caa9a82e259e8eed00254d5e0c682"}, + {file = "pandas-2.0.3-cp39-cp39-win_amd64.whl", hash = "sha256:1168574b036cd8b93abc746171c9b4f1b83467438a5e45909fed645cf8692dbc"}, + {file = "pandas-2.0.3.tar.gz", hash = "sha256:c02f372a88e0d17f36d3093a644c73cfc1788e876a7c4bcb4020a77512e2043c"}, ] [package.dependencies] @@ -3894,11 +4004,32 @@ numpy = [ {version = ">=1.21.0", markers = "python_version >= \"3.10\""}, {version = ">=1.23.2", markers = "python_version >= \"3.11\""}, ] -python-dateutil = ">=2.8.1" +python-dateutil = ">=2.8.2" pytz = ">=2020.1" +tzdata = ">=2022.1" [package.extras] -test = ["hypothesis (>=5.5.3)", "pytest (>=6.0)", "pytest-xdist (>=1.31)"] +all = ["PyQt5 (>=5.15.1)", "SQLAlchemy (>=1.4.16)", "beautifulsoup4 (>=4.9.3)", "bottleneck (>=1.3.2)", "brotlipy (>=0.7.0)", "fastparquet (>=0.6.3)", "fsspec (>=2021.07.0)", "gcsfs (>=2021.07.0)", "html5lib (>=1.1)", "hypothesis (>=6.34.2)", "jinja2 (>=3.0.0)", "lxml (>=4.6.3)", "matplotlib (>=3.6.1)", "numba (>=0.53.1)", "numexpr (>=2.7.3)", "odfpy (>=1.4.1)", "openpyxl (>=3.0.7)", "pandas-gbq (>=0.15.0)", "psycopg2 (>=2.8.6)", "pyarrow (>=7.0.0)", "pymysql (>=1.0.2)", "pyreadstat (>=1.1.2)", "pytest (>=7.3.2)", "pytest-asyncio (>=0.17.0)", "pytest-xdist (>=2.2.0)", "python-snappy (>=0.6.0)", "pyxlsb (>=1.0.8)", "qtpy (>=2.2.0)", "s3fs (>=2021.08.0)", "scipy (>=1.7.1)", "tables (>=3.6.1)", "tabulate (>=0.8.9)", "xarray (>=0.21.0)", "xlrd (>=2.0.1)", "xlsxwriter (>=1.4.3)", "zstandard (>=0.15.2)"] +aws = ["s3fs (>=2021.08.0)"] +clipboard = ["PyQt5 (>=5.15.1)", "qtpy (>=2.2.0)"] +compression = ["brotlipy (>=0.7.0)", "python-snappy (>=0.6.0)", "zstandard (>=0.15.2)"] +computation = ["scipy (>=1.7.1)", "xarray (>=0.21.0)"] +excel = ["odfpy (>=1.4.1)", "openpyxl (>=3.0.7)", "pyxlsb (>=1.0.8)", "xlrd (>=2.0.1)", "xlsxwriter (>=1.4.3)"] +feather = ["pyarrow (>=7.0.0)"] +fss = ["fsspec (>=2021.07.0)"] +gcp = ["gcsfs (>=2021.07.0)", "pandas-gbq (>=0.15.0)"] +hdf5 = ["tables (>=3.6.1)"] +html = ["beautifulsoup4 (>=4.9.3)", "html5lib (>=1.1)", "lxml (>=4.6.3)"] +mysql = ["SQLAlchemy (>=1.4.16)", "pymysql (>=1.0.2)"] +output-formatting = ["jinja2 (>=3.0.0)", "tabulate (>=0.8.9)"] +parquet = ["pyarrow (>=7.0.0)"] +performance = ["bottleneck (>=1.3.2)", "numba (>=0.53.1)", "numexpr (>=2.7.1)"] +plot = ["matplotlib (>=3.6.1)"] +postgresql = ["SQLAlchemy (>=1.4.16)", "psycopg2 (>=2.8.6)"] +spss = ["pyreadstat (>=1.1.2)"] +sql-other = ["SQLAlchemy (>=1.4.16)"] +test = ["hypothesis (>=6.34.2)", "pytest (>=7.3.2)", "pytest-asyncio (>=0.17.0)", "pytest-xdist (>=2.2.0)"] +xml = ["lxml (>=4.6.3)"] [[package]] name = "pandas-stubs" @@ -3944,6 +4075,42 @@ files = [ {file = "pathspec-0.11.1.tar.gz", hash = "sha256:2798de800fa92780e33acca925945e9a19a133b715067cf165b8866c15a31687"}, ] +[[package]] +name = "pdf2image" +version = "1.16.3" +description = "A wrapper around the pdftoppm and pdftocairo command line tools to convert PDF to a PIL Image list." +category = "main" +optional = false +python-versions = "*" +files = [ + {file = "pdf2image-1.16.3-py3-none-any.whl", hash = "sha256:b6154164af3677211c22cbb38b2bd778b43aca02758e962fe1e231f6d3b0e380"}, + {file = "pdf2image-1.16.3.tar.gz", hash = "sha256:74208810c2cef4d9e347769b8e62a52303982ddb4f2dfd744c7ab4b940ae287e"}, +] + +[package.dependencies] +pillow = "*" + +[[package]] +name = "pdfminer-six" +version = "20221105" +description = "PDF parser and analyzer" +category = "main" +optional = false +python-versions = ">=3.6" +files = [ + {file = "pdfminer.six-20221105-py3-none-any.whl", hash = "sha256:1eaddd712d5b2732f8ac8486824533514f8ba12a0787b3d5fe1e686cd826532d"}, + {file = "pdfminer.six-20221105.tar.gz", hash = "sha256:8448ab7b939d18b64820478ecac5394f482d7a79f5f7eaa7703c6c959c175e1d"}, +] + +[package.dependencies] +charset-normalizer = ">=2.0.0" +cryptography = ">=36.0.0" + +[package.extras] +dev = ["black", "mypy (==0.931)", "nox", "pytest"] +docs = ["sphinx", "sphinx-argparse"] +image = ["Pillow"] + [[package]] name = "pexpect" version = "4.8.0" @@ -5489,6 +5656,67 @@ files = [ {file = "ruff-0.0.254.tar.gz", hash = "sha256:0eb66c9520151d3bd950ea43b3a088618a8e4e10a5014a72687881e6f3606312"}, ] +[[package]] +name = "safetensors" +version = "0.3.1" +description = "Fast and Safe Tensor serialization" +category = "main" +optional = false +python-versions = "*" +files = [ + {file = "safetensors-0.3.1-cp310-cp310-macosx_10_11_x86_64.whl", hash = "sha256:2ae9b7dd268b4bae6624729dac86deb82104820e9786429b0583e5168db2f770"}, + {file = "safetensors-0.3.1-cp310-cp310-macosx_12_0_arm64.whl", hash = "sha256:08c85c1934682f1e2cd904d38433b53cd2a98245a7cc31f5689f9322a2320bbf"}, + {file = "safetensors-0.3.1-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:ba625c7af9e1c5d0d91cb83d2fba97d29ea69d4db2015d9714d24c7f6d488e15"}, + {file = "safetensors-0.3.1-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:b57d5890c619ec10d9f1b6426b8690d0c9c2868a90dc52f13fae6f6407ac141f"}, + {file = "safetensors-0.3.1-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:5c9f562ea696d50b95cadbeb1716dc476714a87792ffe374280c0835312cbfe2"}, + {file = "safetensors-0.3.1-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:5c115951b3a865ece8d98ee43882f2fd0a999c0200d6e6fec24134715ebe3b57"}, + {file = "safetensors-0.3.1-cp310-cp310-win32.whl", hash = "sha256:118f8f7503ea312fc7af27e934088a1b589fb1eff5a7dea2cd1de6c71ee33391"}, + {file = "safetensors-0.3.1-cp310-cp310-win_amd64.whl", hash = "sha256:54846eaae25fded28a7bebbb66be563cad221b4c80daee39e2f55df5e5e0266f"}, + {file = "safetensors-0.3.1-cp311-cp311-macosx_10_11_universal2.whl", hash = "sha256:5af82e10946c4822506db0f29269f43147e889054704dde994d4e22f0c37377b"}, + {file = "safetensors-0.3.1-cp311-cp311-macosx_12_0_arm64.whl", hash = "sha256:626c86dd1d930963c8ea7f953a3787ae85322551e3a5203ac731d6e6f3e18f44"}, + {file = "safetensors-0.3.1-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:12e30677e6af1f4cc4f2832546e91dbb3b0aa7d575bfa473d2899d524e1ace08"}, + {file = "safetensors-0.3.1-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:d534b80bc8d39945bb902f34b0454773971fe9e5e1f2142af451759d7e52b356"}, + {file = "safetensors-0.3.1-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:ddd0ddd502cf219666e7d30f23f196cb87e829439b52b39f3e7da7918c3416df"}, + {file = "safetensors-0.3.1-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:997a2cc14023713f423e6d16536d55cb16a3d72850f142e05f82f0d4c76d383b"}, + {file = "safetensors-0.3.1-cp311-cp311-win32.whl", hash = "sha256:6ae9ca63d9e22f71ec40550207bd284a60a6b4916ae6ca12c85a8d86bf49e0c3"}, + {file = "safetensors-0.3.1-cp311-cp311-win_amd64.whl", hash = "sha256:62aa7421ca455418423e35029524489480adda53e3f702453580180ecfebe476"}, + {file = "safetensors-0.3.1-cp37-cp37m-macosx_10_11_x86_64.whl", hash = "sha256:6d54b3ed367b6898baab75dfd057c24f36ec64d3938ffff2af981d56bfba2f42"}, + {file = "safetensors-0.3.1-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:262423aeda91117010f8c607889066028f680fbb667f50cfe6eae96f22f9d150"}, + {file = "safetensors-0.3.1-cp37-cp37m-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:10efe2513a8327fd628cea13167089588acc23093ba132aecfc536eb9a4560fe"}, + {file = "safetensors-0.3.1-cp37-cp37m-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:689b3d6a7ebce70ee9438267ee55ea89b575c19923876645e927d08757b552fe"}, + {file = "safetensors-0.3.1-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:14cd9a87bc73ce06903e9f8ee8b05b056af6f3c9f37a6bd74997a16ed36ff5f4"}, + {file = "safetensors-0.3.1-cp37-cp37m-win32.whl", hash = "sha256:a77cb39624480d5f143c1cc272184f65a296f573d61629eff5d495d2e0541d3e"}, + {file = "safetensors-0.3.1-cp37-cp37m-win_amd64.whl", hash = "sha256:9eff3190bfbbb52eef729911345c643f875ca4dbb374aa6c559675cfd0ab73db"}, + {file = "safetensors-0.3.1-cp38-cp38-macosx_10_11_x86_64.whl", hash = "sha256:05cbfef76e4daa14796db1bbb52072d4b72a44050c368b2b1f6fd3e610669a89"}, + {file = "safetensors-0.3.1-cp38-cp38-macosx_12_0_arm64.whl", hash = "sha256:c49061461f4a81e5ec3415070a3f135530834c89cbd6a7db7cd49e3cb9d9864b"}, + {file = "safetensors-0.3.1-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:22cf7e73ca42974f098ce0cf4dd8918983700b6b07a4c6827d50c8daefca776e"}, + {file = "safetensors-0.3.1-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:04f909442d6223ff0016cd2e1b2a95ef8039b92a558014627363a2e267213f62"}, + {file = "safetensors-0.3.1-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:2c573c5a0d5d45791ae8c179e26d74aff86e719056591aa7edb3ca7be55bc961"}, + {file = "safetensors-0.3.1-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:6994043b12e717cf2a6ba69077ac41f0d3675b2819734f07f61819e854c622c7"}, + {file = "safetensors-0.3.1-cp38-cp38-win32.whl", hash = "sha256:158ede81694180a0dbba59422bc304a78c054b305df993c0c6e39c6330fa9348"}, + {file = "safetensors-0.3.1-cp38-cp38-win_amd64.whl", hash = "sha256:afdc725beff7121ea8d39a7339f5a6abcb01daa189ea56290b67fe262d56e20f"}, + {file = "safetensors-0.3.1-cp39-cp39-macosx_10_11_x86_64.whl", hash = "sha256:cba910fcc9e5e64d32d62b837388721165e9c7e45d23bc3a38ad57694b77f40d"}, + {file = "safetensors-0.3.1-cp39-cp39-macosx_12_0_arm64.whl", hash = "sha256:a4f7dbfe7285573cdaddd85ef6fa84ebbed995d3703ab72d71257944e384612f"}, + {file = "safetensors-0.3.1-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:54aed0802f9eaa83ca7b1cbb986bfb90b8e2c67b6a4bcfe245627e17dad565d4"}, + {file = "safetensors-0.3.1-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:34b75a766f3cfc99fd4c33e329b76deae63f5f388e455d863a5d6e99472fca8e"}, + {file = "safetensors-0.3.1-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:1a0f31904f35dc14919a145b2d7a2d8842a43a18a629affe678233c4ea90b4af"}, + {file = "safetensors-0.3.1-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:dcf527ecc5f58907fd9031510378105487f318cc91ecdc5aee3c7cc8f46030a8"}, + {file = "safetensors-0.3.1-cp39-cp39-win32.whl", hash = "sha256:e2f083112cf97aa9611e2a05cc170a2795eccec5f6ff837f4565f950670a9d83"}, + {file = "safetensors-0.3.1-cp39-cp39-win_amd64.whl", hash = "sha256:5f4f614b8e8161cd8a9ca19c765d176a82b122fa3d3387b77862145bfe9b4e93"}, + {file = "safetensors-0.3.1.tar.gz", hash = "sha256:571da56ff8d0bec8ae54923b621cda98d36dcef10feb36fd492c4d0c2cd0e869"}, +] + +[package.extras] +all = ["black (==22.3)", "click (==8.0.4)", "flake8 (>=3.8.3)", "flax (>=0.6.3)", "h5py (>=3.7.0)", "huggingface-hub (>=0.12.1)", "isort (>=5.5.4)", "jax (>=0.3.25)", "jaxlib (>=0.3.25)", "numpy (>=1.21.6)", "paddlepaddle (>=2.4.1)", "pytest (>=7.2.0)", "pytest-benchmark (>=4.0.0)", "setuptools-rust (>=1.5.2)", "tensorflow (>=2.11.0)", "torch (>=1.10)"] +dev = ["black (==22.3)", "click (==8.0.4)", "flake8 (>=3.8.3)", "flax (>=0.6.3)", "h5py (>=3.7.0)", "huggingface-hub (>=0.12.1)", "isort (>=5.5.4)", "jax (>=0.3.25)", "jaxlib (>=0.3.25)", "numpy (>=1.21.6)", "paddlepaddle (>=2.4.1)", "pytest (>=7.2.0)", "pytest-benchmark (>=4.0.0)", "setuptools-rust (>=1.5.2)", "tensorflow (>=2.11.0)", "torch (>=1.10)"] +jax = ["flax (>=0.6.3)", "jax (>=0.3.25)", "jaxlib (>=0.3.25)"] +numpy = ["numpy (>=1.21.6)"] +paddlepaddle = ["paddlepaddle (>=2.4.1)"] +quality = ["black (==22.3)", "click (==8.0.4)", "flake8 (>=3.8.3)", "isort (>=5.5.4)"] +tensorflow = ["tensorflow (>=2.11.0)"] +testing = ["h5py (>=3.7.0)", "huggingface-hub (>=0.12.1)", "numpy (>=1.21.6)", "pytest (>=7.2.0)", "pytest-benchmark (>=4.0.0)", "setuptools-rust (>=1.5.2)"] +torch = ["torch (>=1.10)"] + [[package]] name = "scikit-learn" version = "1.2.2" @@ -5534,31 +5762,31 @@ tests = ["black (>=22.3.0)", "flake8 (>=3.8.2)", "matplotlib (>=3.1.3)", "mypy ( [[package]] name = "scipy" -version = "1.11.0" +version = "1.11.1" description = "Fundamental algorithms for scientific computing in Python" category = "main" optional = false python-versions = "<3.13,>=3.9" files = [ - {file = "scipy-1.11.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:2e4f14c11fbf825319dbd7f467639a241e7c956c34edb1e036ec7bb6271e4f7b"}, - {file = "scipy-1.11.0-cp310-cp310-macosx_12_0_arm64.whl", hash = "sha256:b269ed44e2e2e43611f2ae95ba551fd98abbdc1a7ea8268f72f75876982368c4"}, - {file = "scipy-1.11.0-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:2c29bae479b17d85208dfdfc67e50d5944ee23211f236728aadde9b0b7c1c33e"}, - {file = "scipy-1.11.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:a53f9cebcfda6158c241c35a559407a4ef6b8cb0863eb4144958fe0a0b7c3dae"}, - {file = "scipy-1.11.0-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:ebf4b2ea26d50312731ddba2406389c5ddcbff9d777cf3277ea11decc81e5dfb"}, - {file = "scipy-1.11.0-cp310-cp310-win_amd64.whl", hash = "sha256:894ced9a2cdb050ff5e392f274617af46dca896d5c9112fa4a2019929554d321"}, - {file = "scipy-1.11.0-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:7a92bd3cd4acad2e0e0b360176d5ec68b100983c8145add8a8233acddf4e5fcc"}, - {file = "scipy-1.11.0-cp311-cp311-macosx_12_0_arm64.whl", hash = "sha256:586608ea35206257d4e0ce6f154a6cfef71723b2c1f6d40de5e0b0e8a81cd2ff"}, - {file = "scipy-1.11.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:d8e631c3c49c24f30828580b8126fe3be5cca5409dad5b797418a5b8965eeafa"}, - {file = "scipy-1.11.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:ccc70892ea674f93183c5c4139557b611e42f644dd755da4b19ca974ab770672"}, - {file = "scipy-1.11.0-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:80015b8928f91bd40377b2b1010ba2e09b03680cbfc291208740494aeb8debf2"}, - {file = "scipy-1.11.0-cp311-cp311-win_amd64.whl", hash = "sha256:6302c7cba5bf99c901653ff158746625526cc438f058bce41514d7469b79b2c3"}, - {file = "scipy-1.11.0-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:c61ea63124da6a3cff38126426912cc86420898b4902a9bc5e5b6524547a6dcb"}, - {file = "scipy-1.11.0-cp39-cp39-macosx_12_0_arm64.whl", hash = "sha256:684d44607eacd5dd367c7a9e76e922523fa9c0a7f2379a4d0fc4d70d751464cc"}, - {file = "scipy-1.11.0-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:f0c9c160d117fe71cd2a12ef21cce8e0475ade2fd97c761ef327b9839089bd16"}, - {file = "scipy-1.11.0-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:83867a63515c4e3fce3272d81200dda614d70f4c3a22f047d84021bfe83d7929"}, - {file = "scipy-1.11.0-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:6666a1e31b2123a077f0dc7ab1053e36479cfd457fb9f5c367e7198505c6607a"}, - {file = "scipy-1.11.0-cp39-cp39-win_amd64.whl", hash = "sha256:fad4006248513528e0c496de295a9f4d2b65086cc0e388f748e7dbf49fa12760"}, - {file = "scipy-1.11.0.tar.gz", hash = "sha256:f9b0248cb9d08eead44cde47cbf6339f1e9aa0dfde28f5fb27950743e317bd5d"}, + {file = "scipy-1.11.1-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:aec8c62fbe52914f9cf28d846cf0401dd80ab80788bbab909434eb336ed07c04"}, + {file = "scipy-1.11.1-cp310-cp310-macosx_12_0_arm64.whl", hash = "sha256:3b9963798df1d8a52db41a6fc0e6fa65b1c60e85d73da27ae8bb754de4792481"}, + {file = "scipy-1.11.1-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:3e8eb42db36526b130dfbc417609498a6192381abc1975b91e3eb238e0b41c1a"}, + {file = "scipy-1.11.1-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:366a6a937110d80dca4f63b3f5b00cc89d36f678b2d124a01067b154e692bab1"}, + {file = "scipy-1.11.1-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:08d957ca82d3535b3b9ba6c8ff355d78fe975271874e2af267cb5add5bd78625"}, + {file = "scipy-1.11.1-cp310-cp310-win_amd64.whl", hash = "sha256:e866514bc2d660608447b6ba95c8900d591f2865c07cca0aa4f7ff3c4ca70f30"}, + {file = "scipy-1.11.1-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:ba94eeef3c9caa4cea7b402a35bb02a5714ee1ee77eb98aca1eed4543beb0f4c"}, + {file = "scipy-1.11.1-cp311-cp311-macosx_12_0_arm64.whl", hash = "sha256:512fdc18c65f76dadaca139348e525646d440220d8d05f6d21965b8d4466bccd"}, + {file = "scipy-1.11.1-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:cce154372f0ebe88556ed06d7b196e9c2e0c13080ecb58d0f35062dc7cc28b47"}, + {file = "scipy-1.11.1-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:b4bb943010203465ac81efa392e4645265077b4d9e99b66cf3ed33ae12254173"}, + {file = "scipy-1.11.1-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:249cfa465c379c9bb2c20123001e151ff5e29b351cbb7f9c91587260602c58d0"}, + {file = "scipy-1.11.1-cp311-cp311-win_amd64.whl", hash = "sha256:ffb28e3fa31b9c376d0fb1f74c1f13911c8c154a760312fbee87a21eb21efe31"}, + {file = "scipy-1.11.1-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:39154437654260a52871dfde852adf1b93b1d1bc5dc0ffa70068f16ec0be2624"}, + {file = "scipy-1.11.1-cp39-cp39-macosx_12_0_arm64.whl", hash = "sha256:b588311875c58d1acd4ef17c983b9f1ab5391755a47c3d70b6bd503a45bfaf71"}, + {file = "scipy-1.11.1-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:d51565560565a0307ed06fa0ec4c6f21ff094947d4844d6068ed04400c72d0c3"}, + {file = "scipy-1.11.1-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:b41a0f322b4eb51b078cb3441e950ad661ede490c3aca66edef66f4b37ab1877"}, + {file = "scipy-1.11.1-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:396fae3f8c12ad14c5f3eb40499fd06a6fef8393a6baa352a652ecd51e74e029"}, + {file = "scipy-1.11.1-cp39-cp39-win_amd64.whl", hash = "sha256:be8c962a821957fdde8c4044efdab7a140c13294997a407eaee777acf63cbf0c"}, + {file = "scipy-1.11.1.tar.gz", hash = "sha256:fb5b492fa035334fd249f0973cc79ecad8b09c604b42a127a677b45a9a3d4289"}, ] [package.dependencies] @@ -5943,14 +6171,14 @@ typing-extensions = ">=4.2.0,<5.0.0" [[package]] name = "strenum" -version = "0.4.10" +version = "0.4.12" description = "An Enum that inherits from str." category = "main" optional = false python-versions = "*" files = [ - {file = "StrEnum-0.4.10-py3-none-any.whl", hash = "sha256:aebf04bba8e5af435937c452d69a86798b6f8d5ca5f20ba18561dbfad571ccdd"}, - {file = "StrEnum-0.4.10.tar.gz", hash = "sha256:898cc0ebb5054ee07400341ac1d75fdfee489d76d6df3fbc1c2eaf95971e3916"}, + {file = "StrEnum-0.4.12-py3-none-any.whl", hash = "sha256:d75cdebe07e2537989a925089a248673a34e8a6e9d8fe6846fd04b1aa2e1f44f"}, + {file = "StrEnum-0.4.12.tar.gz", hash = "sha256:75e234fea070aabae9b03b63385880e286defdcdf6fb2933cde4f964f7763544"}, ] [package.extras] @@ -6009,6 +6237,21 @@ files = [ [package.dependencies] mpmath = ">=0.19" +[[package]] +name = "tabulate" +version = "0.9.0" +description = "Pretty-print tabular data" +category = "main" +optional = false +python-versions = ">=3.7" +files = [ + {file = "tabulate-0.9.0-py3-none-any.whl", hash = "sha256:024ca478df22e9340661486f85298cff5f6dcdba14f3813e8830015b9ed1948f"}, + {file = "tabulate-0.9.0.tar.gz", hash = "sha256:0095b12bf5966de529c0feb1fa08671671b3368eec77d7ef7ab114be2c068b3c"}, +] + +[package.extras] +widechars = ["wcwidth"] + [[package]] name = "tenacity" version = "8.2.2" @@ -6026,21 +6269,21 @@ doc = ["reno", "sphinx", "tornado (>=4.5)"] [[package]] name = "textual" -version = "0.10.1" +version = "0.28.1" description = "Modern Text User Interface framework" category = "main" optional = true python-versions = ">=3.7,<4.0" files = [ - {file = "textual-0.10.1-py3-none-any.whl", hash = "sha256:dd9a5b38a74cf42364a0f247e8f57e3ded7d69d44a63ee664af333f986c48e81"}, - {file = "textual-0.10.1.tar.gz", hash = "sha256:928cfeec37c60b212963f484e806b25380afdddb5a2aecd888ce8c9b46f93553"}, + {file = "textual-0.28.1-py3-none-any.whl", hash = "sha256:cb6f6230fea390178f8e727d2f9e542337a655549ea44331e22336da799a900f"}, + {file = "textual-0.28.1.tar.gz", hash = "sha256:f63a873d810b5d01f7318d8eb8f706d530550f3a90a6892628d17d47ecefcd41"}, ] [package.dependencies] -importlib-metadata = ">=4.11.3,<5.0.0" -nanoid = ">=2.0.0" -rich = ">12.6.0" -typing-extensions = {version = ">=4.0.0,<5.0.0", markers = "python_version < \"3.10\""} +importlib-metadata = ">=4.11.3" +markdown-it-py = {version = ">=2.1.0,<3.0.0", extras = ["linkify", "plugins"]} +rich = ">=13.3.3" +typing-extensions = ">=4.4.0,<5.0.0" [package.extras] dev = ["aiohttp (>=3.8.1)", "click (>=8.1.2)", "msgpack (>=1.0.3)"] @@ -6333,45 +6576,47 @@ test = ["argcomplete (>=2.0)", "pre-commit", "pytest", "pytest-mock"] [[package]] name = "transformers" -version = "4.29.0" +version = "4.30.2" description = "State-of-the-art Machine Learning for JAX, PyTorch and TensorFlow" category = "main" optional = false python-versions = ">=3.7.0" files = [ - {file = "transformers-4.29.0-py3-none-any.whl", hash = "sha256:51f89cbdd515dffac38c002277511d004e1a12a284ab852a4d5641430a409d1f"}, - {file = "transformers-4.29.0.tar.gz", hash = "sha256:b5dff9ce3708dc6639d892435fa69c51dee5c89870f888fa59ef0fc3baa3d8c7"}, + {file = "transformers-4.30.2-py3-none-any.whl", hash = "sha256:c332e3a3097f9ed89ce556b403251235931c00237b8bc2d7adaa19d226c13f1d"}, + {file = "transformers-4.30.2.tar.gz", hash = "sha256:f4a8aac4e1baffab4033f4a345b0d7dc7957d12a4f1ba969afea08205a513045"}, ] [package.dependencies] filelock = "*" -huggingface-hub = ">=0.11.0,<1.0" +huggingface-hub = ">=0.14.1,<1.0" numpy = ">=1.17" packaging = ">=20.0" pyyaml = ">=5.1" regex = "!=2019.12.17" requests = "*" +safetensors = ">=0.3.1" tokenizers = ">=0.11.1,<0.11.3 || >0.11.3,<0.14" tqdm = ">=4.27" [package.extras] -accelerate = ["accelerate (>=0.19.0)"] -all = ["Pillow", "accelerate (>=0.19.0)", "av (==9.2.0)", "codecarbon (==1.2.0)", "decord (==0.6.0)", "flax (>=0.4.1,<=0.6.9)", "jax (>=0.2.8,!=0.3.2,<=0.3.6)", "jaxlib (>=0.1.65,<=0.3.6)", "kenlm", "keras-nlp (>=0.3.1)", "librosa", "numba (<0.57.0)", "onnxconverter-common", "optax (>=0.0.8,<=0.1.4)", "optuna", "phonemizer", "protobuf (<=3.20.2)", "pyctcdecode (>=0.4.0)", "ray[tune]", "sentencepiece (>=0.1.91,!=0.1.92)", "sigopt", "tensorflow (>=2.4,<2.13)", "tensorflow-text (<2.13)", "tf2onnx", "timm", "tokenizers (>=0.11.1,!=0.11.3,<0.14)", "torch (>=1.9,!=1.12.0)", "torchaudio", "torchvision"] -audio = ["kenlm", "librosa", "numba (<0.57.0)", "phonemizer", "pyctcdecode (>=0.4.0)"] +accelerate = ["accelerate (>=0.20.2)"] +agents = ["Pillow", "accelerate (>=0.20.2)", "datasets (!=2.5.0)", "diffusers", "opencv-python", "sentencepiece (>=0.1.91,!=0.1.92)", "torch (>=1.9,!=1.12.0)"] +all = ["Pillow", "accelerate (>=0.20.2)", "av (==9.2.0)", "codecarbon (==1.2.0)", "decord (==0.6.0)", "flax (>=0.4.1,<=0.6.9)", "jax (>=0.2.8,!=0.3.2,<=0.3.6)", "jaxlib (>=0.1.65,<=0.3.6)", "kenlm", "keras-nlp (>=0.3.1)", "librosa", "onnxconverter-common", "optax (>=0.0.8,<=0.1.4)", "optuna", "phonemizer", "protobuf (<=3.20.3)", "pyctcdecode (>=0.4.0)", "ray[tune]", "sentencepiece (>=0.1.91,!=0.1.92)", "sigopt", "tensorflow (>=2.4,<2.13)", "tensorflow-text (<2.13)", "tf2onnx", "timm", "tokenizers (>=0.11.1,!=0.11.3,<0.14)", "torch (>=1.9,!=1.12.0)", "torchaudio", "torchvision"] +audio = ["kenlm", "librosa", "phonemizer", "pyctcdecode (>=0.4.0)"] codecarbon = ["codecarbon (==1.2.0)"] -deepspeed = ["accelerate (>=0.19.0)", "deepspeed (>=0.8.3)"] -deepspeed-testing = ["GitPython (<3.1.19)", "accelerate (>=0.19.0)", "beautifulsoup4", "black (>=23.1,<24.0)", "cookiecutter (==1.7.3)", "datasets (!=2.5.0)", "deepspeed (>=0.8.3)", "dill (<0.3.5)", "evaluate (>=0.2.0)", "faiss-cpu", "hf-doc-builder (>=0.3.0)", "nltk", "optuna", "parameterized", "protobuf (<=3.20.2)", "psutil", "pytest", "pytest-timeout", "pytest-xdist", "rjieba", "rouge-score (!=0.0.7,!=0.0.8,!=0.1,!=0.1.1)", "sacrebleu (>=1.4.12,<2.0.0)", "sacremoses", "safetensors (>=0.2.1)", "sentencepiece (>=0.1.91,!=0.1.92)", "timeout-decorator"] -dev = ["GitPython (<3.1.19)", "Pillow", "accelerate (>=0.19.0)", "av (==9.2.0)", "beautifulsoup4", "black (>=23.1,<24.0)", "codecarbon (==1.2.0)", "cookiecutter (==1.7.3)", "datasets (!=2.5.0)", "decord (==0.6.0)", "dill (<0.3.5)", "evaluate (>=0.2.0)", "faiss-cpu", "flax (>=0.4.1,<=0.6.9)", "fugashi (>=1.0)", "hf-doc-builder", "hf-doc-builder (>=0.3.0)", "ipadic (>=1.0.0,<2.0)", "isort (>=5.5.4)", "jax (>=0.2.8,!=0.3.2,<=0.3.6)", "jaxlib (>=0.1.65,<=0.3.6)", "kenlm", "keras-nlp (>=0.3.1)", "librosa", "nltk", "numba (<0.57.0)", "onnxconverter-common", "optax (>=0.0.8,<=0.1.4)", "optuna", "parameterized", "phonemizer", "protobuf (<=3.20.2)", "psutil", "pyctcdecode (>=0.4.0)", "pytest", "pytest-timeout", "pytest-xdist", "ray[tune]", "rhoknp (>=1.1.0)", "rjieba", "rouge-score (!=0.0.7,!=0.0.8,!=0.1,!=0.1.1)", "ruff (>=0.0.241,<=0.0.259)", "sacrebleu (>=1.4.12,<2.0.0)", "sacremoses", "safetensors (>=0.2.1)", "scikit-learn", "sentencepiece (>=0.1.91,!=0.1.92)", "sigopt", "sudachidict-core (>=20220729)", "sudachipy (>=0.6.6)", "tensorflow (>=2.4,<2.13)", "tensorflow-text (<2.13)", "tf2onnx", "timeout-decorator", "timm", "tokenizers (>=0.11.1,!=0.11.3,<0.14)", "torch (>=1.9,!=1.12.0)", "torchaudio", "torchvision", "unidic (>=1.0.2)", "unidic-lite (>=1.0.7)", "urllib3 (<2.0.0)"] -dev-tensorflow = ["GitPython (<3.1.19)", "Pillow", "beautifulsoup4", "black (>=23.1,<24.0)", "cookiecutter (==1.7.3)", "datasets (!=2.5.0)", "dill (<0.3.5)", "evaluate (>=0.2.0)", "faiss-cpu", "hf-doc-builder", "hf-doc-builder (>=0.3.0)", "isort (>=5.5.4)", "kenlm", "keras-nlp (>=0.3.1)", "librosa", "nltk", "numba (<0.57.0)", "onnxconverter-common", "onnxruntime (>=1.4.0)", "onnxruntime-tools (>=1.4.2)", "parameterized", "phonemizer", "protobuf (<=3.20.2)", "psutil", "pyctcdecode (>=0.4.0)", "pytest", "pytest-timeout", "pytest-xdist", "rjieba", "rouge-score (!=0.0.7,!=0.0.8,!=0.1,!=0.1.1)", "ruff (>=0.0.241,<=0.0.259)", "sacrebleu (>=1.4.12,<2.0.0)", "sacremoses", "safetensors (>=0.2.1)", "scikit-learn", "sentencepiece (>=0.1.91,!=0.1.92)", "tensorflow (>=2.4,<2.13)", "tensorflow-text (<2.13)", "tf2onnx", "timeout-decorator", "tokenizers (>=0.11.1,!=0.11.3,<0.14)", "urllib3 (<2.0.0)"] -dev-torch = ["GitPython (<3.1.19)", "Pillow", "accelerate (>=0.19.0)", "beautifulsoup4", "black (>=23.1,<24.0)", "codecarbon (==1.2.0)", "cookiecutter (==1.7.3)", "datasets (!=2.5.0)", "dill (<0.3.5)", "evaluate (>=0.2.0)", "faiss-cpu", "fugashi (>=1.0)", "hf-doc-builder", "hf-doc-builder (>=0.3.0)", "ipadic (>=1.0.0,<2.0)", "isort (>=5.5.4)", "kenlm", "librosa", "nltk", "numba (<0.57.0)", "onnxruntime (>=1.4.0)", "onnxruntime-tools (>=1.4.2)", "optuna", "parameterized", "phonemizer", "protobuf (<=3.20.2)", "psutil", "pyctcdecode (>=0.4.0)", "pytest", "pytest-timeout", "pytest-xdist", "ray[tune]", "rhoknp (>=1.1.0)", "rjieba", "rouge-score (!=0.0.7,!=0.0.8,!=0.1,!=0.1.1)", "ruff (>=0.0.241,<=0.0.259)", "sacrebleu (>=1.4.12,<2.0.0)", "sacremoses", "safetensors (>=0.2.1)", "scikit-learn", "sentencepiece (>=0.1.91,!=0.1.92)", "sigopt", "sudachidict-core (>=20220729)", "sudachipy (>=0.6.6)", "timeout-decorator", "timm", "tokenizers (>=0.11.1,!=0.11.3,<0.14)", "torch (>=1.9,!=1.12.0)", "torchaudio", "torchvision", "unidic (>=1.0.2)", "unidic-lite (>=1.0.7)", "urllib3 (<2.0.0)"] -docs = ["Pillow", "accelerate (>=0.19.0)", "av (==9.2.0)", "codecarbon (==1.2.0)", "decord (==0.6.0)", "flax (>=0.4.1,<=0.6.9)", "hf-doc-builder", "jax (>=0.2.8,!=0.3.2,<=0.3.6)", "jaxlib (>=0.1.65,<=0.3.6)", "kenlm", "keras-nlp (>=0.3.1)", "librosa", "numba (<0.57.0)", "onnxconverter-common", "optax (>=0.0.8,<=0.1.4)", "optuna", "phonemizer", "protobuf (<=3.20.2)", "pyctcdecode (>=0.4.0)", "ray[tune]", "sentencepiece (>=0.1.91,!=0.1.92)", "sigopt", "tensorflow (>=2.4,<2.13)", "tensorflow-text (<2.13)", "tf2onnx", "timm", "tokenizers (>=0.11.1,!=0.11.3,<0.14)", "torch (>=1.9,!=1.12.0)", "torchaudio", "torchvision"] +deepspeed = ["accelerate (>=0.20.2)", "deepspeed (>=0.8.3)"] +deepspeed-testing = ["GitPython (<3.1.19)", "accelerate (>=0.20.2)", "beautifulsoup4", "black (>=23.1,<24.0)", "cookiecutter (==1.7.3)", "datasets (!=2.5.0)", "deepspeed (>=0.8.3)", "dill (<0.3.5)", "evaluate (>=0.2.0)", "faiss-cpu", "hf-doc-builder (>=0.3.0)", "nltk", "optuna", "parameterized", "protobuf (<=3.20.3)", "psutil", "pytest (>=7.2.0)", "pytest-timeout", "pytest-xdist", "rjieba", "rouge-score (!=0.0.7,!=0.0.8,!=0.1,!=0.1.1)", "sacrebleu (>=1.4.12,<2.0.0)", "sacremoses", "sentencepiece (>=0.1.91,!=0.1.92)", "timeout-decorator"] +dev = ["GitPython (<3.1.19)", "Pillow", "accelerate (>=0.20.2)", "av (==9.2.0)", "beautifulsoup4", "black (>=23.1,<24.0)", "codecarbon (==1.2.0)", "cookiecutter (==1.7.3)", "datasets (!=2.5.0)", "decord (==0.6.0)", "dill (<0.3.5)", "evaluate (>=0.2.0)", "faiss-cpu", "flax (>=0.4.1,<=0.6.9)", "fugashi (>=1.0)", "hf-doc-builder", "hf-doc-builder (>=0.3.0)", "ipadic (>=1.0.0,<2.0)", "isort (>=5.5.4)", "jax (>=0.2.8,!=0.3.2,<=0.3.6)", "jaxlib (>=0.1.65,<=0.3.6)", "kenlm", "keras-nlp (>=0.3.1)", "librosa", "nltk", "onnxconverter-common", "optax (>=0.0.8,<=0.1.4)", "optuna", "parameterized", "phonemizer", "protobuf (<=3.20.3)", "psutil", "pyctcdecode (>=0.4.0)", "pytest (>=7.2.0)", "pytest-timeout", "pytest-xdist", "ray[tune]", "rhoknp (>=1.1.0,<1.3.1)", "rjieba", "rouge-score (!=0.0.7,!=0.0.8,!=0.1,!=0.1.1)", "ruff (>=0.0.241,<=0.0.259)", "sacrebleu (>=1.4.12,<2.0.0)", "sacremoses", "scikit-learn", "sentencepiece (>=0.1.91,!=0.1.92)", "sigopt", "sudachidict-core (>=20220729)", "sudachipy (>=0.6.6)", "tensorflow (>=2.4,<2.13)", "tensorflow-text (<2.13)", "tf2onnx", "timeout-decorator", "timm", "tokenizers (>=0.11.1,!=0.11.3,<0.14)", "torch (>=1.9,!=1.12.0)", "torchaudio", "torchvision", "unidic (>=1.0.2)", "unidic-lite (>=1.0.7)", "urllib3 (<2.0.0)"] +dev-tensorflow = ["GitPython (<3.1.19)", "Pillow", "beautifulsoup4", "black (>=23.1,<24.0)", "cookiecutter (==1.7.3)", "datasets (!=2.5.0)", "dill (<0.3.5)", "evaluate (>=0.2.0)", "faiss-cpu", "hf-doc-builder", "hf-doc-builder (>=0.3.0)", "isort (>=5.5.4)", "kenlm", "keras-nlp (>=0.3.1)", "librosa", "nltk", "onnxconverter-common", "onnxruntime (>=1.4.0)", "onnxruntime-tools (>=1.4.2)", "parameterized", "phonemizer", "protobuf (<=3.20.3)", "psutil", "pyctcdecode (>=0.4.0)", "pytest (>=7.2.0)", "pytest-timeout", "pytest-xdist", "rjieba", "rouge-score (!=0.0.7,!=0.0.8,!=0.1,!=0.1.1)", "ruff (>=0.0.241,<=0.0.259)", "sacrebleu (>=1.4.12,<2.0.0)", "sacremoses", "scikit-learn", "sentencepiece (>=0.1.91,!=0.1.92)", "tensorflow (>=2.4,<2.13)", "tensorflow-text (<2.13)", "tf2onnx", "timeout-decorator", "tokenizers (>=0.11.1,!=0.11.3,<0.14)", "urllib3 (<2.0.0)"] +dev-torch = ["GitPython (<3.1.19)", "Pillow", "accelerate (>=0.20.2)", "beautifulsoup4", "black (>=23.1,<24.0)", "codecarbon (==1.2.0)", "cookiecutter (==1.7.3)", "datasets (!=2.5.0)", "dill (<0.3.5)", "evaluate (>=0.2.0)", "faiss-cpu", "fugashi (>=1.0)", "hf-doc-builder", "hf-doc-builder (>=0.3.0)", "ipadic (>=1.0.0,<2.0)", "isort (>=5.5.4)", "kenlm", "librosa", "nltk", "onnxruntime (>=1.4.0)", "onnxruntime-tools (>=1.4.2)", "optuna", "parameterized", "phonemizer", "protobuf (<=3.20.3)", "psutil", "pyctcdecode (>=0.4.0)", "pytest (>=7.2.0)", "pytest-timeout", "pytest-xdist", "ray[tune]", "rhoknp (>=1.1.0,<1.3.1)", "rjieba", "rouge-score (!=0.0.7,!=0.0.8,!=0.1,!=0.1.1)", "ruff (>=0.0.241,<=0.0.259)", "sacrebleu (>=1.4.12,<2.0.0)", "sacremoses", "scikit-learn", "sentencepiece (>=0.1.91,!=0.1.92)", "sigopt", "sudachidict-core (>=20220729)", "sudachipy (>=0.6.6)", "timeout-decorator", "timm", "tokenizers (>=0.11.1,!=0.11.3,<0.14)", "torch (>=1.9,!=1.12.0)", "torchaudio", "torchvision", "unidic (>=1.0.2)", "unidic-lite (>=1.0.7)", "urllib3 (<2.0.0)"] +docs = ["Pillow", "accelerate (>=0.20.2)", "av (==9.2.0)", "codecarbon (==1.2.0)", "decord (==0.6.0)", "flax (>=0.4.1,<=0.6.9)", "hf-doc-builder", "jax (>=0.2.8,!=0.3.2,<=0.3.6)", "jaxlib (>=0.1.65,<=0.3.6)", "kenlm", "keras-nlp (>=0.3.1)", "librosa", "onnxconverter-common", "optax (>=0.0.8,<=0.1.4)", "optuna", "phonemizer", "protobuf (<=3.20.3)", "pyctcdecode (>=0.4.0)", "ray[tune]", "sentencepiece (>=0.1.91,!=0.1.92)", "sigopt", "tensorflow (>=2.4,<2.13)", "tensorflow-text (<2.13)", "tf2onnx", "timm", "tokenizers (>=0.11.1,!=0.11.3,<0.14)", "torch (>=1.9,!=1.12.0)", "torchaudio", "torchvision"] docs-specific = ["hf-doc-builder"] fairscale = ["fairscale (>0.3)"] flax = ["flax (>=0.4.1,<=0.6.9)", "jax (>=0.2.8,!=0.3.2,<=0.3.6)", "jaxlib (>=0.1.65,<=0.3.6)", "optax (>=0.0.8,<=0.1.4)"] -flax-speech = ["kenlm", "librosa", "numba (<0.57.0)", "phonemizer", "pyctcdecode (>=0.4.0)"] +flax-speech = ["kenlm", "librosa", "phonemizer", "pyctcdecode (>=0.4.0)"] ftfy = ["ftfy"] integrations = ["optuna", "ray[tune]", "sigopt"] -ja = ["fugashi (>=1.0)", "ipadic (>=1.0.0,<2.0)", "rhoknp (>=1.1.0)", "sudachidict-core (>=20220729)", "sudachipy (>=0.6.6)", "unidic (>=1.0.2)", "unidic-lite (>=1.0.7)"] +ja = ["fugashi (>=1.0)", "ipadic (>=1.0.0,<2.0)", "rhoknp (>=1.1.0,<1.3.1)", "sudachidict-core (>=20220729)", "sudachipy (>=0.6.6)", "unidic (>=1.0.2)", "unidic-lite (>=1.0.7)"] modelcreation = ["cookiecutter (==1.7.3)"] natten = ["natten (>=0.14.6)"] onnx = ["onnxconverter-common", "onnxruntime (>=1.4.0)", "onnxruntime-tools (>=1.4.2)", "tf2onnx"] @@ -6381,21 +6626,21 @@ quality = ["GitPython (<3.1.19)", "black (>=23.1,<24.0)", "datasets (!=2.5.0)", ray = ["ray[tune]"] retrieval = ["datasets (!=2.5.0)", "faiss-cpu"] sagemaker = ["sagemaker (>=2.31.0)"] -sentencepiece = ["protobuf (<=3.20.2)", "sentencepiece (>=0.1.91,!=0.1.92)"] +sentencepiece = ["protobuf (<=3.20.3)", "sentencepiece (>=0.1.91,!=0.1.92)"] serving = ["fastapi", "pydantic", "starlette", "uvicorn"] sigopt = ["sigopt"] sklearn = ["scikit-learn"] -speech = ["kenlm", "librosa", "numba (<0.57.0)", "phonemizer", "pyctcdecode (>=0.4.0)", "torchaudio"] -testing = ["GitPython (<3.1.19)", "beautifulsoup4", "black (>=23.1,<24.0)", "cookiecutter (==1.7.3)", "datasets (!=2.5.0)", "dill (<0.3.5)", "evaluate (>=0.2.0)", "faiss-cpu", "hf-doc-builder (>=0.3.0)", "nltk", "parameterized", "protobuf (<=3.20.2)", "psutil", "pytest", "pytest-timeout", "pytest-xdist", "rjieba", "rouge-score (!=0.0.7,!=0.0.8,!=0.1,!=0.1.1)", "sacrebleu (>=1.4.12,<2.0.0)", "sacremoses", "safetensors (>=0.2.1)", "timeout-decorator"] +speech = ["kenlm", "librosa", "phonemizer", "pyctcdecode (>=0.4.0)", "torchaudio"] +testing = ["GitPython (<3.1.19)", "beautifulsoup4", "black (>=23.1,<24.0)", "cookiecutter (==1.7.3)", "datasets (!=2.5.0)", "dill (<0.3.5)", "evaluate (>=0.2.0)", "faiss-cpu", "hf-doc-builder (>=0.3.0)", "nltk", "parameterized", "protobuf (<=3.20.3)", "psutil", "pytest (>=7.2.0)", "pytest-timeout", "pytest-xdist", "rjieba", "rouge-score (!=0.0.7,!=0.0.8,!=0.1,!=0.1.1)", "sacrebleu (>=1.4.12,<2.0.0)", "sacremoses", "timeout-decorator"] tf = ["keras-nlp (>=0.3.1)", "onnxconverter-common", "tensorflow (>=2.4,<2.13)", "tensorflow-text (<2.13)", "tf2onnx"] tf-cpu = ["keras-nlp (>=0.3.1)", "onnxconverter-common", "tensorflow-cpu (>=2.4,<2.13)", "tensorflow-text (<2.13)", "tf2onnx"] -tf-speech = ["kenlm", "librosa", "numba (<0.57.0)", "phonemizer", "pyctcdecode (>=0.4.0)"] +tf-speech = ["kenlm", "librosa", "phonemizer", "pyctcdecode (>=0.4.0)"] timm = ["timm"] tokenizers = ["tokenizers (>=0.11.1,!=0.11.3,<0.14)"] -torch = ["accelerate (>=0.19.0)", "torch (>=1.9,!=1.12.0)"] -torch-speech = ["kenlm", "librosa", "numba (<0.57.0)", "phonemizer", "pyctcdecode (>=0.4.0)", "torchaudio"] +torch = ["accelerate (>=0.20.2)", "torch (>=1.9,!=1.12.0)"] +torch-speech = ["kenlm", "librosa", "phonemizer", "pyctcdecode (>=0.4.0)", "torchaudio"] torch-vision = ["Pillow", "torchvision"] -torchhub = ["filelock", "huggingface-hub (>=0.11.0,<1.0)", "importlib-metadata", "numpy (>=1.17)", "packaging (>=20.0)", "protobuf (<=3.20.2)", "regex (!=2019.12.17)", "requests", "sentencepiece (>=0.1.91,!=0.1.92)", "tokenizers (>=0.11.1,!=0.11.3,<0.14)", "torch (>=1.9,!=1.12.0)", "tqdm (>=4.27)"] +torchhub = ["filelock", "huggingface-hub (>=0.14.1,<1.0)", "importlib-metadata", "numpy (>=1.17)", "packaging (>=20.0)", "protobuf (<=3.20.3)", "regex (!=2019.12.17)", "requests", "sentencepiece (>=0.1.91,!=0.1.92)", "tokenizers (>=0.11.1,!=0.11.3,<0.14)", "torch (>=1.9,!=1.12.0)", "tqdm (>=4.27)"] video = ["av (==9.2.0)", "decord (==0.6.0)"] vision = ["Pillow"] @@ -6471,14 +6716,14 @@ files = [ [[package]] name = "types-pillow" -version = "9.5.0.4" +version = "9.5.0.5" description = "Typing stubs for Pillow" category = "dev" optional = false python-versions = "*" files = [ - {file = "types-Pillow-9.5.0.4.tar.gz", hash = "sha256:f1b6af47abd151847ee25911ffeba784899bc7dc7f9eba8ca6a5aac522b012ef"}, - {file = "types_Pillow-9.5.0.4-py3-none-any.whl", hash = "sha256:69427d9fa4320ff6e30f00fb9c0dd71185dc0a16de4757774220104759483466"}, + {file = "types-Pillow-9.5.0.5.tar.gz", hash = "sha256:de9877aa1e6226b6479459ca84df02fd7e999b970c79cfee3b8298840336e77c"}, + {file = "types_Pillow-9.5.0.5-py3-none-any.whl", hash = "sha256:2b17f95c5c16e4962e4032bdb95494766a85569fa278ee21e5fcbbd318e9ccd2"}, ] [[package]] @@ -6497,7 +6742,7 @@ files = [ name = "types-pyyaml" version = "6.0.12.10" description = "Typing stubs for PyYAML" -category = "main" +category = "dev" optional = false python-versions = "*" files = [ @@ -6572,41 +6817,63 @@ files = [ {file = "tzdata-2023.3.tar.gz", hash = "sha256:11ef1e08e54acb0d4f95bdb1be05da659673de4acbd21bf9c69e94cc5e907a3a"}, ] +[[package]] +name = "uc-micro-py" +version = "1.0.2" +description = "Micro subset of unicode data files for linkify-it-py projects." +category = "main" +optional = true +python-versions = ">=3.7" +files = [ + {file = "uc-micro-py-1.0.2.tar.gz", hash = "sha256:30ae2ac9c49f39ac6dce743bd187fcd2b574b16ca095fa74cd9396795c954c54"}, + {file = "uc_micro_py-1.0.2-py3-none-any.whl", hash = "sha256:8c9110c309db9d9e87302e2f4ad2c3152770930d88ab385cd544e7a7e75f3de0"}, +] + +[package.extras] +test = ["coverage", "pytest", "pytest-cov"] + [[package]] name = "unstructured" -version = "0.5.13" +version = "0.7.10" description = "A library that prepares raw documents for downstream ML tasks." category = "main" optional = false python-versions = ">=3.7.0" files = [ - {file = "unstructured-0.5.13-py3-none-any.whl", hash = "sha256:44ddc2848f1009fd64ced91a9b52d0e9dd15dee837f34a898ecd95863236b880"}, - {file = "unstructured-0.5.13.tar.gz", hash = "sha256:b25443a47353297bda5eec64615215111e07c2507771cf8ad5471d04ac9026b1"}, + {file = "unstructured-0.7.10-py3-none-any.whl", hash = "sha256:d36ae0b59bcf95751b4304a6f44864ec3187f584cf80ee66a68e99537e0e4a0d"}, + {file = "unstructured-0.7.10.tar.gz", hash = "sha256:93d65dd746151703c6873d69156d2a4bc9f9f1507044cdd617b1645373528d74"}, ] [package.dependencies] argilla = "*" -certifi = ">=2022.12.07" +chardet = "*" +filetype = "*" lxml = "*" markdown = "*" msg-parser = "*" nltk = "*" openpyxl = "*" pandas = "*" +pdf2image = "*" +"pdfminer.six" = "*" pillow = "*" pypandoc = "*" python-docx = "*" python-magic = "*" python-pptx = "*" requests = "*" +tabulate = "*" +xlrd = "*" [package.extras] azure = ["adlfs", "fsspec"] -github = ["pygithub (==1.57.0)"] +discord = ["discord-py"] +gcs = ["fsspec", "gcsfs"] +github = ["pygithub (==1.58.2)"] gitlab = ["python-gitlab"] -google-drive = ["google-api-python-client", "protobuf (<3.21)"] +google-drive = ["google-api-python-client"] huggingface = ["langdetect", "sacremoses", "sentencepiece", "torch", "transformers"] -local-inference = ["unstructured-inference (==0.3.2)"] +local-inference = ["unstructured-inference (==0.5.1)"] reddit = ["praw"] s3 = ["fsspec", "s3fs"] slack = ["slack-sdk"] @@ -7035,6 +7302,23 @@ files = [ {file = "wrapt-1.15.0.tar.gz", hash = "sha256:d06730c6aed78cee4126234cf2d071e01b44b915e725a6cb439a879ec9754a3a"}, ] +[[package]] +name = "xlrd" +version = "2.0.1" +description = "Library for developers to extract data from Microsoft Excel (tm) .xls spreadsheet files" +category = "main" +optional = false +python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*, !=3.4.*, !=3.5.*" +files = [ + {file = "xlrd-2.0.1-py2.py3-none-any.whl", hash = "sha256:6a33ee89877bd9abc1158129f6e94be74e2679636b8a205b43b85206c3f0bbdd"}, + {file = "xlrd-2.0.1.tar.gz", hash = "sha256:f72f148f54442c6b056bf931dbc34f986fd0c3b0b6b5a58d013c9aef274d0c88"}, +] + +[package.extras] +build = ["twine", "wheel"] +docs = ["sphinx"] +test = ["pytest", "pytest-cov"] + [[package]] name = "xlsxwriter" version = "3.1.2" @@ -7216,4 +7500,4 @@ deploy = ["langchain-serve"] [metadata] lock-version = "2.0" python-versions = ">=3.9,<3.12" -content-hash = "88f4b394eb96c8307d7734e8216304b074a9aedcc52b2299ea750fa2a76ceb4b" +content-hash = "3875f61e1228dfac1574076a6c3755703463fa6ed1fe737d064a171be94259d4" diff --git a/pyproject.toml b/pyproject.toml index 4b4a281c2..764948765 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -25,22 +25,21 @@ langflow = "langflow.__main__:main" python = ">=3.9,<3.12" fastapi = "^0.98.0" uvicorn = "^0.22.0" -beautifulsoup4 = "^4.11.2" +beautifulsoup4 = "^4.12.2" google-search-results = "^2.4.1" google-api-python-client = "^2.79.0" typer = "^0.9.0" gunicorn = "^20.1.0" -langchain = "^0.0.218" +langchain = "^0.0.219" openai = "^0.27.8" -types-pyyaml = "^6.0.12.8" -pandas = "^1.5.3" +pandas = "^2.0.0" chromadb = "^0.3.21" -huggingface-hub = "^0.13.3" +huggingface-hub = "^0.15.0" rich = "^13.4.2" llama-cpp-python = "~0.1.0" networkx = "^3.1" -unstructured = "^0.5.11" -pypdf = "^3.7.1" +unstructured = "^0.7.0" +pypdf = "^3.11.0" lxml = "^4.9.2" pysrt = "^1.1.2" fake-useragent = "^1.1.3" @@ -49,18 +48,18 @@ psycopg2-binary = "^2.9.6" pyarrow = "^12.0.0" tiktoken = "~0.4.0" wikipedia = "^1.4.0" -langchain-serve = { version = ">0.0.39", optional = true } -qdrant-client = "^1.2.0" +langchain-serve = { version = ">0.0.47", optional = true } +qdrant-client = "^1.3.0" websockets = "^10.3" weaviate-client = "^3.21.0" jina = "3.15.2" sentence-transformers = "^2.2.2" -ctransformers = "^0.2.2" -cohere = "^4.6.0" +ctransformers = "^0.2.10" +cohere = "^4.11.0" python-multipart = "^0.0.6" sqlmodel = "^0.0.8" faiss-cpu = "^1.7.4" -anthropic = "^0.2.10" +anthropic = "^0.3.0" orjson = "^3.9.1" multiprocess = "^0.70.14" cachetools = "^5.3.1" @@ -86,6 +85,7 @@ pytest-cov = "^4.0.0" pandas-stubs = "^2.0.0.230412" types-pillow = "^9.5.0.2" types-appdirs = "^1.4.3.5" +types-pyyaml = "^6.0.12.8" [tool.poetry.extras] From d272a682be9c75e35c4b31910eb3149611897bd0 Mon Sep 17 00:00:00 2001 From: Gabriel Luiz Freitas Almeida Date: Thu, 29 Jun 2023 08:26:23 -0300 Subject: [PATCH 076/169] =?UTF-8?q?=F0=9F=94=A7=20chore(chains.py):=20upda?= =?UTF-8?q?te=20field=20properties=20for=20"RetrievalQA"=20memory=20field?= =?UTF-8?q?=20The=20"RetrievalQA"=20memory=20field=20in=20the=20template?= =?UTF-8?q?=20frontend=20node=20is=20updated=20to=20have=20the=20"show"=20?= =?UTF-8?q?and=20"required"=20properties=20set=20to=20False.=20This=20chan?= =?UTF-8?q?ge=20is=20made=20to=20hide=20the=20memory=20field=20and=20make?= =?UTF-8?q?=20it=20optional.=20Additionally,=20the=20"advanced"=20property?= =?UTF-8?q?=20is=20set=20to=20False=20for=20all=20fields,=20and=20the=20"p?= =?UTF-8?q?assword"=20property=20is=20set=20to=20False=20for=20fields=20co?= =?UTF-8?q?ntaining=20the=20word=20"key"=20in=20their=20name.?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/backend/langflow/template/frontend_node/chains.py | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/src/backend/langflow/template/frontend_node/chains.py b/src/backend/langflow/template/frontend_node/chains.py index f29aa2065..ce8c1c62c 100644 --- a/src/backend/langflow/template/frontend_node/chains.py +++ b/src/backend/langflow/template/frontend_node/chains.py @@ -49,6 +49,10 @@ class ChainFrontendNode(FrontendNode): def format_field(field: TemplateField, name: Optional[str] = None) -> None: FrontendNode.format_field(field, name) + if "name" == "RetrievalQA" and field.name == "memory": + field.show = False + field.required = False + field.advanced = False if "key" in field.name: field.password = False From 75f0a80ded45d0cbb32cc19b35e7a8f6e744481c Mon Sep 17 00:00:00 2001 From: Gabriel Luiz Freitas Almeida Date: Thu, 29 Jun 2023 08:52:21 -0300 Subject: [PATCH 077/169] =?UTF-8?q?=F0=9F=8E=89=20feat(formatter):=20add?= =?UTF-8?q?=20base=20FieldFormatter=20class=20for=20formatting=20template?= =?UTF-8?q?=20fields=20The=20base.py=20file=20is=20a=20new=20addition=20to?= =?UTF-8?q?=20the=20project.=20It=20introduces=20the=20FieldFormatter=20cl?= =?UTF-8?q?ass,=20which=20is=20an=20abstract=20base=20class=20(ABC)=20for?= =?UTF-8?q?=20formatting=20template=20fields.=20This=20class=20provides=20?= =?UTF-8?q?a=20format()=20method=20that=20takes=20a=20TemplateField=20obje?= =?UTF-8?q?ct=20as=20input=20and=20is=20meant=20to=20be=20implemented=20by?= =?UTF-8?q?=20subclasses.=20This=20addition=20allows=20for=20the=20creatio?= =?UTF-8?q?n=20of=20custom=20field=20formatters=20in=20the=20project.?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../template/frontend_node/formatter/__init__.py | 0 .../langflow/template/frontend_node/formatter/base.py | 9 +++++++++ 2 files changed, 9 insertions(+) create mode 100644 src/backend/langflow/template/frontend_node/formatter/__init__.py create mode 100644 src/backend/langflow/template/frontend_node/formatter/base.py diff --git a/src/backend/langflow/template/frontend_node/formatter/__init__.py b/src/backend/langflow/template/frontend_node/formatter/__init__.py new file mode 100644 index 000000000..e69de29bb diff --git a/src/backend/langflow/template/frontend_node/formatter/base.py b/src/backend/langflow/template/frontend_node/formatter/base.py new file mode 100644 index 000000000..653480e03 --- /dev/null +++ b/src/backend/langflow/template/frontend_node/formatter/base.py @@ -0,0 +1,9 @@ +from abc import ABC, abstractmethod + +from langflow.template.field.base import TemplateField + + +class FieldFormatter(ABC): + @abstractmethod + def format(self, field: TemplateField): + pass From 5924aa444249dbd10ec6e2d13a006a9dbfa2cde5 Mon Sep 17 00:00:00 2001 From: Gabriel Luiz Freitas Almeida Date: Thu, 29 Jun 2023 08:52:26 -0300 Subject: [PATCH 078/169] =?UTF-8?q?=F0=9F=93=A6=20chore(field=5Fformatters?= =?UTF-8?q?.py):=20add=20field=20formatters=20for=20template=20frontend=5F?= =?UTF-8?q?node=20=F0=9F=94=A7=20refactor(field=5Fformatters.py):=20refact?= =?UTF-8?q?or=20field=20formatters=20for=20template=20frontend=5Fnode=20Th?= =?UTF-8?q?e=20commit=20adds=20a=20new=20file=20`field=5Fformatters.py`=20?= =?UTF-8?q?to=20the=20`frontend=5Fnode/formatter`=20directory=20in=20the?= =?UTF-8?q?=20`langflow/template`=20backend.=20This=20file=20contains=20mu?= =?UTF-8?q?ltiple=20field=20formatters=20for=20the=20template=20frontend?= =?UTF-8?q?=5Fnode.=20The=20formatters=20handle=20various=20formatting=20t?= =?UTF-8?q?asks=20such=20as=20formatting=20field=20names,=20setting=20fiel?= =?UTF-8?q?d=20options,=20handling=20special=20fields,=20and=20formatting?= =?UTF-8?q?=20field=20types.=20The=20commit=20aims=20to=20improve=20the=20?= =?UTF-8?q?code=20organization=20and=20maintainability=20by=20separating?= =?UTF-8?q?=20the=20field=20formatting=20logic=20into=20dedicated=20format?= =?UTF-8?q?ters.?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../formatter/field_formatters.py | 162 ++++++++++++++++++ 1 file changed, 162 insertions(+) create mode 100644 src/backend/langflow/template/frontend_node/formatter/field_formatters.py diff --git a/src/backend/langflow/template/frontend_node/formatter/field_formatters.py b/src/backend/langflow/template/frontend_node/formatter/field_formatters.py new file mode 100644 index 000000000..7987b134a --- /dev/null +++ b/src/backend/langflow/template/frontend_node/formatter/field_formatters.py @@ -0,0 +1,162 @@ +from typing import Optional +from langflow.template.field.base import TemplateField +from langflow.template.frontend_node.constants import FORCE_SHOW_FIELDS +from langflow.template.frontend_node.formatter.base import FieldFormatter +import re + +from langflow.utils.constants import ( + ANTHROPIC_MODELS, + CHAT_OPENAI_MODELS, + OPENAI_MODELS, +) + + +class OpenAIAPIKeyFormatter(FieldFormatter): + def format(self, field: TemplateField, name: Optional[str] = None) -> None: + if "api_key" in field.name and "OpenAI" in str(name): + field.display_name = "OpenAI API Key" + field.required = False + if field.value is None: + field.value = "" + + +class ModelSpecificFieldFormatter(FieldFormatter): + MODEL_DICT = { + "OpenAI": OPENAI_MODELS, + "ChatOpenAI": CHAT_OPENAI_MODELS, + "Anthropic": ANTHROPIC_MODELS, + "ChatAnthropic": ANTHROPIC_MODELS, + } + + def format(self, field: TemplateField, name: Optional[str] = None) -> None: + if name in self.MODEL_DICT and field.name == "model_name": + field.options = self.MODEL_DICT[name] + field.is_list = True + + +class KwargsFormatter(FieldFormatter): + def format(self, field: TemplateField, name: Optional[str] = None) -> None: + if "kwargs" in field.name.lower(): + field.advanced = True + field.required = False + field.show = False + + +class APIKeyFormatter(FieldFormatter): + def format(self, field: TemplateField, name: Optional[str] = None) -> None: + if "api" in field.name.lower() and "key" in field.name.lower(): + field.required = False + field.advanced = False + + field.display_name = field.name.replace("_", " ").title() + field.display_name = field.display_name.replace("Api", "API") + + +class RemoveOptionalFormatter(FieldFormatter): + def format(self, field: TemplateField, name: Optional[str] = None) -> None: + _type = field.field_type + field.field_type = re.sub(r"Optional\[(.*)\]", r"\1", _type) + + +class ListTypeFormatter(FieldFormatter): + def format(self, field: TemplateField, name: Optional[str] = None) -> None: + _type = field.field_type + is_list = "List" in _type or "Sequence" in _type + if is_list: + _type = re.sub(r"(List|Sequence)\[(.*)\]", r"\2", _type) + field.is_list = True + field.field_type = _type + + +class DictTypeFormatter(FieldFormatter): + def format(self, field: TemplateField, name: Optional[str] = None) -> None: + _type = field.field_type + _type = _type.replace("Mapping", "dict") + field.field_type = _type + + +class UnionTypeFormatter(FieldFormatter): + def format(self, field: TemplateField, name: Optional[str] = None) -> None: + _type = field.field_type + if "Union" in _type: + _type = _type.replace("Union[", "")[:-1] + _type = _type.split(",")[0] + _type = _type.replace("]", "").replace("[", "") + field.field_type = _type + + +class SpecialFieldFormatter(FieldFormatter): + SPECIAL_FIELD_HANDLERS = { + "allowed_tools": lambda field: "Tool", + "max_value_length": lambda field: "int", + } + + def format(self, field: TemplateField, name: Optional[str] = None) -> None: + handler = self.SPECIAL_FIELD_HANDLERS.get(field.name) + field.field_type = handler(field) if handler else field.field_type + + +class ShowFieldFormatter(FieldFormatter): + def format(self, field: TemplateField, name: Optional[str] = None) -> None: + key = field.name + required = field.required + field.show = ( + (required and key not in ["input_variables"]) + or key in FORCE_SHOW_FIELDS + or "api" in key + or ("key" in key and "input" not in key and "output" not in key) + ) + + +class PasswordFieldFormatter(FieldFormatter): + def format(self, field: TemplateField, name: Optional[str] = None) -> None: + key = field.name + show = field.show + if ( + any(text in key.lower() for text in {"password", "token", "api", "key"}) + and show + ): + field.password = True + + +class MultilineFieldFormatter(FieldFormatter): + def format(self, field: TemplateField, name: Optional[str] = None) -> None: + key = field.name + if key in { + "suffix", + "prefix", + "template", + "examples", + "code", + "headers", + "description", + }: + field.multiline = True + + +class DefaultValueFormatter(FieldFormatter): + def format(self, field: TemplateField, name: Optional[str] = None) -> None: + value = field.to_dict() + if "default" in value: + field.value = value["default"] + + +class HeadersDefaultValueFormatter(FieldFormatter): + def format(self, field: TemplateField, name: Optional[str] = None) -> None: + key = field.name + if key == "headers": + field.value = """{'Authorization': 'Bearer '}""" + + +class DictCodeFileFormatter(FieldFormatter): + def format(self, field: TemplateField, name: Optional[str] = None) -> None: + key = field.name + value = field.to_dict() + _type = value["type"] + if "dict" in _type.lower(): + if key == "dict_": + field.field_type = "file" + field.suffixes = [".json", ".yaml", ".yml"] + field.file_types = ["json", "yaml", "yml"] + else: + field.field_type = "code" From 3845a60bcfda2684fac62cab88b2e2e6f7fd442e Mon Sep 17 00:00:00 2001 From: Gabriel Luiz Freitas Almeida Date: Thu, 29 Jun 2023 08:52:45 -0300 Subject: [PATCH 079/169] =?UTF-8?q?=F0=9F=9A=80=20feat(memories.py):=20add?= =?UTF-8?q?=20default=20value=20for=20connection=5Fstring=20field=20in=20P?= =?UTF-8?q?ostgresChatMessageHistoryFrontendNode=20The=20trailing=20whites?= =?UTF-8?q?pace=20has=20been=20removed=20for=20consistency=20and=20readabi?= =?UTF-8?q?lity.=20The=20unused=20import=20of=20`DEFAULT=5FCONNECTION=5FST?= =?UTF-8?q?RING`=20from=20`langchain.memory.chat=5Fmessage=5Fhistories.pos?= =?UTF-8?q?tgres`=20has=20been=20removed.=20The=20`PostgresChatMessageHist?= =?UTF-8?q?oryFrontendNode`=20now=20has=20a=20default=20value=20for=20the?= =?UTF-8?q?=20`connection=5Fstring`=20field,=20which=20is=20set=20to=20`DE?= =?UTF-8?q?FAULT=5FCONNECTION=5FSTRING`.=20This=20ensures=20that=20the=20f?= =?UTF-8?q?ield=20has=20a=20default=20value=20when=20creating=20instances?= =?UTF-8?q?=20of=20the=20class.=20=F0=9F=94=A7=20chore(memories.py):=20rem?= =?UTF-8?q?ove=20trailing=20whitespace=20and=20unused=20import?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/backend/langflow/template/frontend_node/memories.py | 9 ++++----- 1 file changed, 4 insertions(+), 5 deletions(-) diff --git a/src/backend/langflow/template/frontend_node/memories.py b/src/backend/langflow/template/frontend_node/memories.py index 7064eaa05..936bdb8f4 100644 --- a/src/backend/langflow/template/frontend_node/memories.py +++ b/src/backend/langflow/template/frontend_node/memories.py @@ -3,6 +3,7 @@ from typing import Optional from langflow.template.field.base import TemplateField from langflow.template.frontend_node.base import FrontendNode from langflow.template.template.base import Template +from langchain.memory.chat_message_histories.postgres import DEFAULT_CONNECTION_STRING class MemoryFrontendNode(FrontendNode): @@ -10,7 +11,7 @@ class MemoryFrontendNode(FrontendNode): def add_extra_fields(self) -> None: # chat history should have another way to add common field? # prevent adding incorect field in ChatMessageHistory - if "BaseChatMessageHistory" in self.base_classes: + if "BaseChatMessageHistory" in self.base_classes: return # add return_messages field @@ -95,6 +96,7 @@ class PostgresChatMessageHistoryFrontendNode(MemoryFrontendNode): required=True, show=True, name="connection_string", + value=DEFAULT_CONNECTION_STRING, ), TemplateField( field_type="str", @@ -109,7 +111,4 @@ class PostgresChatMessageHistoryFrontendNode(MemoryFrontendNode): ], ) description: str = "Memory store with Postgres" - base_classes: list[str] = [ - "PostgresChatMessageHistory", - "BaseChatMessageHistory" - ] \ No newline at end of file + base_classes: list[str] = ["PostgresChatMessageHistory", "BaseChatMessageHistory"] From 8ed5287ac4c78d538938577856d0798411520711 Mon Sep 17 00:00:00 2001 From: Gabriel Luiz Freitas Almeida Date: Thu, 29 Jun 2023 09:01:28 -0300 Subject: [PATCH 080/169] =?UTF-8?q?=F0=9F=94=A7=20chore(base.py):=20refact?= =?UTF-8?q?or=20field=20formatting=20logic=20into=20a=20separate=20class?= =?UTF-8?q?=20=F0=9F=92=A1=20refactor(base.py):=20The=20field=20formatting?= =?UTF-8?q?=20logic=20in=20the=20FrontendNode=20class=20has=20been=20refac?= =?UTF-8?q?tored=20into=20a=20separate=20class=20called=20FieldFormatters.?= =?UTF-8?q?=20This=20improves=20code=20organization=20and=20separation=20o?= =?UTF-8?q?f=20concerns,=20making=20it=20easier=20to=20maintain=20and=20ex?= =?UTF-8?q?tend=20the=20field=20formatting=20functionality=20in=20the=20fu?= =?UTF-8?q?ture.?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../langflow/template/frontend_node/base.py | 65 +++++++++++-------- 1 file changed, 38 insertions(+), 27 deletions(-) diff --git a/src/backend/langflow/template/frontend_node/base.py b/src/backend/langflow/template/frontend_node/base.py index 751ecb709..0c0c1e06a 100644 --- a/src/backend/langflow/template/frontend_node/base.py +++ b/src/backend/langflow/template/frontend_node/base.py @@ -1,12 +1,41 @@ import re from typing import List, Optional -from pydantic import BaseModel +from pydantic import BaseModel, Field from langflow.template.frontend_node.constants import FORCE_SHOW_FIELDS from langflow.template.field.base import TemplateField from langflow.template.template.base import Template from langflow.utils import constants +from langflow.template.frontend_node.formatter import field_formatters + + +class FieldFormatters(BaseModel): + formatters = { + "openai_api_key": field_formatters.OpenAIAPIKeyFormatter(), + } + base_formatters = { + "kwargs": field_formatters.KwargsFormatter(), + "optional": field_formatters.RemoveOptionalFormatter(), + "list": field_formatters.ListTypeFormatter(), + "dict": field_formatters.DictTypeFormatter(), + "union": field_formatters.UnionTypeFormatter(), + "multiline": field_formatters.MultilineFieldFormatter(), + "show": field_formatters.ShowFieldFormatter(), + "password": field_formatters.PasswordFieldFormatter(), + "default": field_formatters.DefaultValueFormatter(), + "headers": field_formatters.HeadersDefaultValueFormatter(), + "dict_code_file": field_formatters.DictCodeFileFormatter(), + "model_fields": field_formatters.ModelSpecificFieldFormatter(), + } + + def format(self, field: TemplateField, name: Optional[str] = None) -> None: + for key, formatter in self.base_formatters.items(): + formatter.format(field, name) + + for key, formatter in self.formatters.items(): + if key == field.name: + formatter.format(field, name) class FrontendNode(BaseModel): @@ -16,6 +45,13 @@ class FrontendNode(BaseModel): name: str = "" display_name: str = "" documentation: str = "" + field_formatters: FieldFormatters = Field(default_factory=FieldFormatters) + + # field formatters is an instance attribute but it is not used in the class + # so we need to create a method to get it + @staticmethod + def get_field_formatters() -> FieldFormatters: + return FieldFormatters() def set_documentation(self, documentation: str) -> None: """Sets the documentation of the frontend node.""" @@ -42,33 +78,8 @@ class FrontendNode(BaseModel): @staticmethod def format_field(field: TemplateField, name: Optional[str] = None) -> None: """Formats a given field based on its attributes and value.""" - SPECIAL_FIELD_HANDLERS = { - "allowed_tools": lambda field: "Tool", - "max_value_length": lambda field: "int", - } - key = field.name - value = field.to_dict() - _type = value["type"] - - _type = FrontendNode.remove_optional(_type) - _type, is_list = FrontendNode.check_for_list_type(_type) - field.is_list = is_list or field.is_list - _type = FrontendNode.replace_mapping_with_dict(_type) - _type = FrontendNode.handle_union_type(_type) - - field.field_type = FrontendNode.handle_special_field( - field, key, _type, SPECIAL_FIELD_HANDLERS - ) - field.field_type = FrontendNode.handle_dict_type(field, _type) - field.show = FrontendNode.should_show_field(key, field.required) - field.password = FrontendNode.should_be_password(key, field.show) - field.multiline = FrontendNode.should_be_multiline(key) - - FrontendNode.replace_default_value(field, value) - FrontendNode.handle_specific_field_values(field, key, name) - FrontendNode.handle_kwargs_field(field) - FrontendNode.handle_api_key_field(field, key) + FrontendNode.get_field_formatters().format(field, name) @staticmethod def remove_optional(_type: str) -> str: From 197f1f9e71b2a105547edad1ad59284c8acc4c5d Mon Sep 17 00:00:00 2001 From: Gabriel Luiz Freitas Almeida Date: Thu, 29 Jun 2023 09:34:01 -0300 Subject: [PATCH 081/169] =?UTF-8?q?=F0=9F=94=A5=20refactor(utils.ts):=20re?= =?UTF-8?q?move=20unused=20imports=20and=20icons=20to=20improve=20code=20c?= =?UTF-8?q?leanliness=20and=20reduce=20bundle=20size=20=F0=9F=8E=A8=20styl?= =?UTF-8?q?e(utils.ts):=20reorganize=20nodeColors=20and=20nodeNames=20obje?= =?UTF-8?q?cts=20to=20improve=20readability=20and=20maintainability=20The?= =?UTF-8?q?=20changes=20in=20this=20commit=20remove=20unused=20imports=20a?= =?UTF-8?q?nd=20icons=20from=20the=20`utils.ts`=20file,=20which=20helps=20?= =?UTF-8?q?improve=20code=20cleanliness=20and=20reduces=20the=20bundle=20s?= =?UTF-8?q?ize.=20Additionally,=20the=20`nodeColors`=20and=20`nodeNames`?= =?UTF-8?q?=20objects=20have=20been=20reorganized=20to=20improve=20readabi?= =?UTF-8?q?lity=20and=20maintainability.?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/frontend/src/utils.ts | 86 +++------------------------------------ 1 file changed, 6 insertions(+), 80 deletions(-) diff --git a/src/frontend/src/utils.ts b/src/frontend/src/utils.ts index af75b2cdf..d89fe8a00 100644 --- a/src/frontend/src/utils.ts +++ b/src/frontend/src/utils.ts @@ -1,21 +1,3 @@ -import { - RocketLaunchIcon, - LinkIcon, - CpuChipIcon, - LightBulbIcon, - CommandLineIcon, - WrenchScrewdriverIcon, - WrenchIcon, - ComputerDesktopIcon, - GiftIcon, - PaperClipIcon, - QuestionMarkCircleIcon, - FingerPrintIcon, - ScissorsIcon, - CircleStackIcon, - Squares2X2Icon, - Bars3CenterLeftIcon, -} from "@heroicons/react/24/outline"; import { Connection, Edge, Node, ReactFlowInstance } from "reactflow"; import { FlowType, NodeType } from "./types/flow"; import { APITemplateType } from "./types/api"; @@ -58,6 +40,7 @@ import { Paperclip, Rocket, Scissors, + Search, TerminalSquare, Wand2, Wrench, @@ -139,6 +122,7 @@ export const nodeColors: { [char: string]: string } = { toolkits: "#DB2C2C", wrappers: "#E6277A", utilities: "#31A3CC", + retrievers: "#F5B85A", unknown: "#9CA3AF", }; @@ -157,72 +141,11 @@ export const nodeNames: { [char: string]: string } = { toolkits: "Toolkits", wrappers: "Wrappers", textsplitters: "Text Splitters", + retrievers: "Retrievers", utilities: "Utilities", unknown: "Unknown", }; -export const nodeIcons: { - [char: string]: React.ForwardRefExoticComponent< - React.SVGProps - >; -} = { - Chroma: ChromaIcon, - AirbyteJSONLoader: AirbyteIcon, - // SerpAPIWrapper: SerperIcon, - // AZLyricsLoader: AzIcon, - Anthropic: AnthropicIcon, - ChatAnthropic: AnthropicIcon, - BingSearchAPIWrapper: BingIcon, - BingSearchRun: BingIcon, - Cohere: CohereIcon, - CohereEmbeddings: CohereIcon, - EverNoteLoader: EvernoteIcon, - FacebookChatLoader: FBIcon, - GitbookLoader: GitBookIcon, - GoogleSearchAPIWrapper: GoogleIcon, - GoogleSearchResults: GoogleIcon, - GoogleSearchRun: GoogleIcon, - HNLoader: HackerNewsIcon, - HuggingFaceHub: HugginFaceIcon, - HuggingFaceEmbeddings: HugginFaceIcon, - IFixitLoader: IFixIcon, - Meta: MetaIcon, - Midjourney: MidjourneyIcon, - NotionDirectoryLoader: NotionIcon, - ChatOpenAI: OpenAiIcon, - OpenAI: OpenAiIcon, - OpenAIEmbeddings: OpenAiIcon, - Pinecone: PineconeIcon, - SupabaseVectorStore: SupabaseIcon, - MongoDBAtlasVectorSearch: MongoDBIcon, - // UnstructuredPowerPointLoader: PowerPointIcon, // word and powerpoint have differente styles - Qdrant: QDrantIcon, - // ReadTheDocsLoader: ReadTheDocsIcon, // does not work - Searx: SearxIcon, - SlackDirectoryLoader: SlackIcon, - // Weaviate: WeaviateIcon, // does not work - // WikipediaAPIWrapper: WikipediaIcon, - // WolframAlphaQueryRun: WolframIcon, - // WolframAlphaAPIWrapper: WolframIcon, - // UnstructuredWordDocumentLoader: WordIcon, // word and powerpoint have differente styles - agents: RocketLaunchIcon, - chains: LinkIcon, - memories: CpuChipIcon, - llms: LightBulbIcon, - prompts: CommandLineIcon, - tools: WrenchIcon, - advanced: ComputerDesktopIcon, - chat: Bars3CenterLeftIcon, - embeddings: FingerPrintIcon, - documentloaders: PaperClipIcon, - vectorstores: CircleStackIcon, - toolkits: WrenchScrewdriverIcon, - textsplitters: ScissorsIcon, - wrappers: GiftIcon, - utilities: Squares2X2Icon, - unknown: QuestionMarkCircleIcon, -}; - export const nodeIconsLucide: { [char: string]: React.ForwardRefExoticComponent< ComponentType> @@ -363,6 +286,9 @@ export const nodeIconsLucide: { utilities: Wand2 as React.ForwardRefExoticComponent< ComponentType> >, + retrievers: Search as React.ForwardRefExoticComponent< + ComponentType> + >, unknown: HelpCircle as React.ForwardRefExoticComponent< ComponentType> >, From c9f8a27983ebd1113f417b204ed0ef54d8654219 Mon Sep 17 00:00:00 2001 From: Gabriel Luiz Freitas Almeida Date: Thu, 29 Jun 2023 09:34:19 -0300 Subject: [PATCH 082/169] =?UTF-8?q?=F0=9F=94=80=20chore(NodeModal):=20upda?= =?UTF-8?q?te=20import=20and=20variable=20name=20for=20nodeIconsLucide=20t?= =?UTF-8?q?o=20improve=20code=20readability=20=F0=9F=92=84=20style(NodeMod?= =?UTF-8?q?al):=20remove=20unused=20import=20and=20variable=20to=20clean?= =?UTF-8?q?=20up=20code=20The=20import=20and=20variable=20name=20for=20`no?= =?UTF-8?q?deIconsLucide`=20has=20been=20updated=20to=20improve=20code=20r?= =?UTF-8?q?eadability.=20The=20unused=20import=20and=20variable=20`nodeIco?= =?UTF-8?q?ns`=20and=20`toNormalCase`=20have=20been=20removed=20to=20clean?= =?UTF-8?q?=20up=20the=20code.?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/frontend/src/modals/NodeModal/index.tsx | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/src/frontend/src/modals/NodeModal/index.tsx b/src/frontend/src/modals/NodeModal/index.tsx index 2065b1720..add842096 100644 --- a/src/frontend/src/modals/NodeModal/index.tsx +++ b/src/frontend/src/modals/NodeModal/index.tsx @@ -6,8 +6,7 @@ import { classNames, limitScrollFieldsModal, nodeColors, - nodeIcons, - toNormalCase, + nodeIconsLucide, toTitleCase, } from "../../utils"; import { typesContext } from "../../contexts/typesContext"; @@ -28,7 +27,7 @@ export default function NodeModal({ data }: { data: NodeDataType }) { } } // any to avoid type conflict - const Icon: any = nodeIcons[types[data.type]]; + const Icon: any = nodeIconsLucide[types[data.type]]; return ( Date: Thu, 29 Jun 2023 09:54:38 -0300 Subject: [PATCH 083/169] =?UTF-8?q?=F0=9F=93=9D=20docs(config.yaml):=20add?= =?UTF-8?q?=20documentation=20link=20for=20MultiQueryRetriever=20?= =?UTF-8?q?=F0=9F=94=A7=20chore(settings.py):=20add=20retrievers=20attribu?= =?UTF-8?q?te=20to=20Settings=20class=20The=20config.yaml=20file=20now=20i?= =?UTF-8?q?ncludes=20a=20documentation=20link=20for=20the=20MultiQueryRetr?= =?UTF-8?q?iever=20in=20the=20retrievers=20section.=20This=20link=20provid?= =?UTF-8?q?es=20additional=20information=20on=20how=20to=20use=20the=20Mul?= =?UTF-8?q?tiQueryRetriever.=20In=20the=20settings.py=20file,=20the=20Sett?= =?UTF-8?q?ings=20class=20now=20includes=20a=20retrievers=20attribute=20to?= =?UTF-8?q?=20store=20retriever-related=20settings.=20This=20allows=20for?= =?UTF-8?q?=20easier=20management=20and=20configuration=20of=20retrievers?= =?UTF-8?q?=20in=20the=20application.?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/backend/langflow/config.yaml | 3 +++ src/backend/langflow/settings.py | 6 ++++++ 2 files changed, 9 insertions(+) diff --git a/src/backend/langflow/config.yaml b/src/backend/langflow/config.yaml index 14d81308a..4bb93680f 100644 --- a/src/backend/langflow/config.yaml +++ b/src/backend/langflow/config.yaml @@ -230,6 +230,9 @@ utilities: documentation: "" WolframAlphaAPIWrapper: documentation: "" +retrievers: + MultiQueryRetriever: + documentation: "https://python.langchain.com/docs/modules/data_connection/retrievers/how_to/MultiQueryRetriever" vectorstores: Chroma: documentation: "https://python.langchain.com/docs/modules/data_connection/vectorstores/integrations/chroma" diff --git a/src/backend/langflow/settings.py b/src/backend/langflow/settings.py index f153ba706..d2de4f671 100644 --- a/src/backend/langflow/settings.py +++ b/src/backend/langflow/settings.py @@ -15,6 +15,7 @@ class Settings(BaseSettings): vectorstores: dict = {} documentloaders: dict = {} wrappers: dict = {} + retrievers: dict = {} toolkits: dict = {} textsplitters: dict = {} utilities: dict = {} @@ -47,6 +48,11 @@ class Settings(BaseSettings): self.toolkits = new_settings.toolkits or {} self.textsplitters = new_settings.textsplitters or {} self.utilities = new_settings.utilities or {} + self.embeddings = new_settings.embeddings or {} + self.vectorstores = new_settings.vectorstores or {} + self.documentloaders = new_settings.documentloaders or {} + self.retrievers = new_settings.retrievers or {} + self.dev = dev def update_settings(self, **kwargs): From f427e171662cfaa799e52ab056b82f4da8d6d800 Mon Sep 17 00:00:00 2001 From: Gabriel Luiz Freitas Almeida Date: Thu, 29 Jun 2023 09:55:59 -0300 Subject: [PATCH 084/169] =?UTF-8?q?=F0=9F=94=80=20refactor(endpoints.py):?= =?UTF-8?q?=20rename=20import=20of=20build=5Flangchain=5Ftypes=5Fdict=20to?= =?UTF-8?q?=20langchain=5Ftypes=5Fdict=20for=20consistency=20=F0=9F=94=80?= =?UTF-8?q?=20refactor(types.py):=20add=20langchain=5Ftypes=5Fdict=20as=20?= =?UTF-8?q?a=20separate=20variable=20to=20improve=20code=20readability=20a?= =?UTF-8?q?nd=20maintainability?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit The import statement in `endpoints.py` has been updated to import `langchain_types_dict` instead of `build_langchain_types_dict` for consistency with the variable name. This change improves code readability and maintainability. In `types.py`, a new variable `langchain_types_dict` has been added as a separate variable to store the result of `build_langchain_types_dict()`. This change improves code readability and makes it easier to understand the purpose of the variable. --- src/backend/langflow/api/v1/endpoints.py | 4 ++-- src/backend/langflow/interface/types.py | 5 +++++ 2 files changed, 7 insertions(+), 2 deletions(-) diff --git a/src/backend/langflow/api/v1/endpoints.py b/src/backend/langflow/api/v1/endpoints.py index f18e3056d..13cba6c2c 100644 --- a/src/backend/langflow/api/v1/endpoints.py +++ b/src/backend/langflow/api/v1/endpoints.py @@ -11,7 +11,7 @@ from langflow.api.v1.schemas import ( UploadFileResponse, ) -from langflow.interface.types import build_langchain_types_dict +from langflow.interface.types import langchain_types_dict from langflow.database.base import get_session from sqlmodel import Session @@ -21,7 +21,7 @@ router = APIRouter(tags=["Base"]) @router.get("/all") def get_all(): - return build_langchain_types_dict() + return langchain_types_dict # For backwards compatibility we will keep the old endpoint diff --git a/src/backend/langflow/interface/types.py b/src/backend/langflow/interface/types.py index 085537756..6b1ecb3e2 100644 --- a/src/backend/langflow/interface/types.py +++ b/src/backend/langflow/interface/types.py @@ -11,6 +11,7 @@ from langflow.interface.tools.base import tool_creator from langflow.interface.utilities.base import utility_creator from langflow.interface.vector_store.base import vectorstore_creator from langflow.interface.wrappers.base import wrapper_creator +from langflow.interface.retrievers.base import retriever_creator def get_type_list(): @@ -44,6 +45,7 @@ def build_langchain_types_dict(): # sourcery skip: dict-assign-update-to-union documentloader_creator, textsplitter_creator, utility_creator, + retriever_creator, ] all_types = {} @@ -52,3 +54,6 @@ def build_langchain_types_dict(): # sourcery skip: dict-assign-update-to-union if created_types[creator.type_name].values(): all_types.update(created_types) return all_types + + +langchain_types_dict = build_langchain_types_dict() From 28e770992b89ca3f226878c30ffcaa1b7ef6bbce Mon Sep 17 00:00:00 2001 From: Gabriel Luiz Freitas Almeida Date: Thu, 29 Jun 2023 09:56:17 -0300 Subject: [PATCH 085/169] =?UTF-8?q?=F0=9F=9A=80=20feat(listing.py):=20add?= =?UTF-8?q?=20support=20for=20retrievers=20in=20the=20type=20dictionary=20?= =?UTF-8?q?The=20type=20dictionary=20in=20the=20listing.py=20file=20now=20?= =?UTF-8?q?includes=20a=20"retrievers"=20key,=20which=20contains=20a=20lis?= =?UTF-8?q?t=20of=20retriever=20creators.=20This=20allows=20for=20the=20in?= =?UTF-8?q?clusion=20of=20retrievers=20as=20a=20supported=20type=20in=20th?= =?UTF-8?q?e=20application.?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/backend/langflow/interface/listing.py | 2 ++ 1 file changed, 2 insertions(+) diff --git a/src/backend/langflow/interface/listing.py b/src/backend/langflow/interface/listing.py index 3d73105c2..1e1421d32 100644 --- a/src/backend/langflow/interface/listing.py +++ b/src/backend/langflow/interface/listing.py @@ -11,6 +11,7 @@ from langflow.interface.tools.base import tool_creator from langflow.interface.utilities.base import utility_creator from langflow.interface.vector_store.base import vectorstore_creator from langflow.interface.wrappers.base import wrapper_creator +from langflow.interface.retrievers.base import retriever_creator def get_type_dict(): @@ -28,6 +29,7 @@ def get_type_dict(): "embeddings": embedding_creator.to_list(), "textSplitters": textsplitter_creator.to_list(), "utilities": utility_creator.to_list(), + "retrievers": retriever_creator.to_list(), } From 302efa103a1ad1960365e488a0edc94d7c755887 Mon Sep 17 00:00:00 2001 From: Gabriel Luiz Freitas Almeida Date: Thu, 29 Jun 2023 09:56:26 -0300 Subject: [PATCH 086/169] =?UTF-8?q?=E2=9C=A8=20feat(retrievers):=20add=20?= =?UTF-8?q?=5F=5Finit=5F=5F.py=20file=20to=20retrievers=20directory=20The?= =?UTF-8?q?=20=5F=5Finit=5F=5F.py=20file=20is=20added=20to=20the=20retriev?= =?UTF-8?q?ers=20directory=20to=20make=20it=20a=20Python=20package.=20This?= =?UTF-8?q?=20allows=20the=20directory=20to=20be=20recognized=20as=20a=20m?= =?UTF-8?q?odule=20and=20enables=20importing=20of=20modules=20and=20submod?= =?UTF-8?q?ules=20within=20the=20retrievers=20directory.?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/backend/langflow/interface/retrievers/__init__.py | 0 1 file changed, 0 insertions(+), 0 deletions(-) create mode 100644 src/backend/langflow/interface/retrievers/__init__.py diff --git a/src/backend/langflow/interface/retrievers/__init__.py b/src/backend/langflow/interface/retrievers/__init__.py new file mode 100644 index 000000000..e69de29bb From 894fd16e8ed99b3b0aba621ae13cec06ed83cb88 Mon Sep 17 00:00:00 2001 From: Gabriel Luiz Freitas Almeida Date: Thu, 29 Jun 2023 09:56:59 -0300 Subject: [PATCH 087/169] =?UTF-8?q?=E2=9C=A8=20feat(retrievers):=20add=20b?= =?UTF-8?q?ase=20retriever=20class=20and=20frontend=20node=20class=20?= =?UTF-8?q?=F0=9F=90=9B=20fix(util.py):=20handle=20non-string=20types=20in?= =?UTF-8?q?=20format=5Fdict=20function=20The=20base=20retriever=20class=20?= =?UTF-8?q?is=20added=20to=20provide=20a=20common=20interface=20for=20all?= =?UTF-8?q?=20retrievers=20in=20the=20language=20chain.=20The=20frontend?= =?UTF-8?q?=20node=20class=20for=20retrievers=20is=20also=20added=20to=20h?= =?UTF-8?q?andle=20the=20formatting=20of=20fields=20specific=20to=20retrie?= =?UTF-8?q?vers.?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit In the util.py file, a fix is made to handle non-string types in the format_dict function. Previously, if the type of a field was not a string, an error would occur. This fix ensures that the type is converted to a string before further processing. --- .../langflow/interface/retrievers/base.py | 49 +++++++++++++++++++ .../template/frontend_node/retrievers.py | 15 ++++++ src/backend/langflow/utils/util.py | 3 ++ 3 files changed, 67 insertions(+) create mode 100644 src/backend/langflow/interface/retrievers/base.py create mode 100644 src/backend/langflow/template/frontend_node/retrievers.py diff --git a/src/backend/langflow/interface/retrievers/base.py b/src/backend/langflow/interface/retrievers/base.py new file mode 100644 index 000000000..3eb38861e --- /dev/null +++ b/src/backend/langflow/interface/retrievers/base.py @@ -0,0 +1,49 @@ +from typing import Any, Dict, List, Optional, Type + +from langchain import retrievers + +from langflow.interface.base import LangChainTypeCreator +from langflow.interface.importing.utils import import_class +from langflow.settings import settings +from langflow.template.frontend_node.retrievers import RetrieverFrontendNode +from langflow.utils.logger import logger +from langflow.utils.util import build_template_from_method + + +class RetrieverCreator(LangChainTypeCreator): + type_name: str = "retrievers" + + @property + def frontend_node_class(self) -> Type[RetrieverFrontendNode]: + return RetrieverFrontendNode + + @property + def type_to_loader_dict(self) -> Dict: + if self.type_dict is None: + self.type_dict: dict[str, Any] = { + retriever_name: import_class(f"langchain.retrievers.{retriever_name}") + for retriever_name in retrievers.__all__ + } + return self.type_dict + + def get_signature(self, name: str) -> Optional[Dict]: + """Get the signature of an embedding.""" + try: + return build_template_from_method( + name, type_to_cls_dict=self.type_to_loader_dict, method_name="from_llm" + ) + except ValueError as exc: + raise ValueError(f"Retriever {name} not found") from exc + except AttributeError as exc: + logger.error(f"Retriever {name} not loaded: {exc}") + return None + + def to_list(self) -> List[str]: + return [ + retriever + for retriever in self.type_to_loader_dict.keys() + if retriever in settings.retrievers or settings.dev + ] + + +retriever_creator = RetrieverCreator() diff --git a/src/backend/langflow/template/frontend_node/retrievers.py b/src/backend/langflow/template/frontend_node/retrievers.py new file mode 100644 index 000000000..b482c8b84 --- /dev/null +++ b/src/backend/langflow/template/frontend_node/retrievers.py @@ -0,0 +1,15 @@ +from typing import Optional + +from langflow.template.field.base import TemplateField +from langflow.template.frontend_node.base import FrontendNode + + +class RetrieverFrontendNode(FrontendNode): + @staticmethod + def format_field(field: TemplateField, name: Optional[str] = None) -> None: + FrontendNode.format_field(field, name) + # Define common field attributes + field.show = True + if field.name == "parser_key": + field.display_name = "Parser Key" + field.password = False diff --git a/src/backend/langflow/utils/util.py b/src/backend/langflow/utils/util.py index 7fcf1f4d4..02a9520b4 100644 --- a/src/backend/langflow/utils/util.py +++ b/src/backend/langflow/utils/util.py @@ -233,6 +233,9 @@ def format_dict(d, name: Optional[str] = None): _type = value["type"] + if not isinstance(_type, str): + _type = _type.__name__ + # Remove 'Optional' wrapper if "Optional" in _type: _type = _type.replace("Optional[", "")[:-1] From 19828da83041b28eb7837f350d81805b7943156e Mon Sep 17 00:00:00 2001 From: Gabriel Luiz Freitas Almeida Date: Thu, 29 Jun 2023 09:57:09 -0300 Subject: [PATCH 088/169] =?UTF-8?q?=F0=9F=90=9B=20fix(utils.ts):=20rename?= =?UTF-8?q?=20Search=20icon=20to=20FileSearch=20for=20better=20clarity=20a?= =?UTF-8?q?nd=20accuracy=20The=20Search=20icon=20has=20been=20renamed=20to?= =?UTF-8?q?=20FileSearch=20to=20provide=20a=20more=20accurate=20representa?= =?UTF-8?q?tion=20of=20its=20purpose.=20This=20change=20improves=20clarity?= =?UTF-8?q?=20and=20ensures=20that=20the=20icon=20name=20aligns=20with=20i?= =?UTF-8?q?ts=20actual=20functionality.?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/frontend/src/utils.ts | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/frontend/src/utils.ts b/src/frontend/src/utils.ts index d89fe8a00..d8198ec3d 100644 --- a/src/frontend/src/utils.ts +++ b/src/frontend/src/utils.ts @@ -40,7 +40,7 @@ import { Paperclip, Rocket, Scissors, - Search, + FileSearch, TerminalSquare, Wand2, Wrench, @@ -286,7 +286,7 @@ export const nodeIconsLucide: { utilities: Wand2 as React.ForwardRefExoticComponent< ComponentType> >, - retrievers: Search as React.ForwardRefExoticComponent< + retrievers: FileSearch as React.ForwardRefExoticComponent< ComponentType> >, unknown: HelpCircle as React.ForwardRefExoticComponent< From e1bf25a4ff28d3769a4a6fc29b0e9f428712530d Mon Sep 17 00:00:00 2001 From: Gabriel Luiz Freitas Almeida Date: Thu, 29 Jun 2023 09:59:31 -0300 Subject: [PATCH 089/169] =?UTF-8?q?=F0=9F=93=A6=20chore(frontend):=20add?= =?UTF-8?q?=20dompurify=20package=20as=20a=20dependency=20The=20dompurify?= =?UTF-8?q?=20package=20is=20added=20as=20a=20dependency=20to=20the=20fron?= =?UTF-8?q?tend=20package.json=20file.=20This=20package=20is=20needed=20fo?= =?UTF-8?q?r=20sanitizing=20HTML=20to=20prevent=20cross-site=20scripting?= =?UTF-8?q?=20(XSS)=20attacks.?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/frontend/package-lock.json | 9 +++++++-- src/frontend/package.json | 1 + 2 files changed, 8 insertions(+), 2 deletions(-) diff --git a/src/frontend/package-lock.json b/src/frontend/package-lock.json index 0edd88d0d..5ff5c4e58 100644 --- a/src/frontend/package-lock.json +++ b/src/frontend/package-lock.json @@ -34,6 +34,7 @@ "base64-js": "^1.5.1", "class-variance-authority": "^0.6.0", "clsx": "^1.2.1", + "dompurify": "^3.0.3", "esbuild": "^0.17.18", "lodash": "^4.17.21", "lucide-react": "^0.233.0", @@ -3444,7 +3445,7 @@ "version": "16.18.12", "resolved": "https://registry.npmjs.org/@types/node/-/node-16.18.12.tgz", "integrity": "sha512-vzLe5NaNMjIE3mcddFVGlAXN1LEWueUsMsOJWaT6wWMJGyljHAWHznqfnKUQWGzu7TLPrGvWdNAsvQYW+C0xtw==", - "dev": true + "devOptional": true }, "node_modules/@types/parse-json": { "version": "4.0.0", @@ -5009,6 +5010,11 @@ "node": ">=12" } }, + "node_modules/dompurify": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/dompurify/-/dompurify-3.0.3.tgz", + "integrity": "sha512-axQ9zieHLnAnHh0sfAamKYiqXMJAVwu+LM/alQ7WDagoWessyWvMSFyW65CqF3owufNu8HBcE4cM2Vflu7YWcQ==" + }, "node_modules/electron-to-chromium": { "version": "1.4.440", "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.4.440.tgz", @@ -5504,7 +5510,6 @@ "version": "2.3.2", "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.2.tgz", "integrity": "sha512-xiqMQR4xAeHTuB9uWm+fFRcIOgKBMiOBP+eXiyT7jsgVCq1bkVygt00oASowB7EdtpOHaaPgKt812P9ab+DDKA==", - "dev": true, "hasInstallScript": true, "optional": true, "os": [ diff --git a/src/frontend/package.json b/src/frontend/package.json index 95e826736..ba0e6304d 100644 --- a/src/frontend/package.json +++ b/src/frontend/package.json @@ -29,6 +29,7 @@ "base64-js": "^1.5.1", "class-variance-authority": "^0.6.0", "clsx": "^1.2.1", + "dompurify": "^3.0.3", "esbuild": "^0.17.18", "lodash": "^4.17.21", "lucide-react": "^0.233.0", From 3faf5f5b9624c4648b1cb0bba19d3000cc293532 Mon Sep 17 00:00:00 2001 From: Gabriel Luiz Freitas Almeida Date: Thu, 29 Jun 2023 10:02:28 -0300 Subject: [PATCH 090/169] =?UTF-8?q?=F0=9F=90=9B=20fix(chatMessage):=20sani?= =?UTF-8?q?tize=20HTML=20content=20to=20prevent=20potential=20XSS=20attack?= =?UTF-8?q?s=20=E2=9C=A8=20feat(chatMessage):=20improve=20rendering=20of?= =?UTF-8?q?=20multi-line=20messages=20The=20`convert`=20variable=20is=20no?= =?UTF-8?q?w=20imported=20before=20being=20used=20to=20convert=20ANSI=20to?= =?UTF-8?q?=20HTML.=20Additionally,=20the=20`DOMPurify`=20library=20is=20i?= =?UTF-8?q?mported=20and=20used=20to=20sanitize=20the=20HTML=20content=20b?= =?UTF-8?q?efore=20rendering=20it,=20preventing=20potential=20XSS=20attack?= =?UTF-8?q?s.=20The=20rendering=20of=20multi-line=20messages=20has=20been?= =?UTF-8?q?=20improved=20by=20splitting=20the=20message=20by=20newline=20c?= =?UTF-8?q?haracters=20and=20rendering=20each=20line=20separately=20with?= =?UTF-8?q?=20a=20line=20break.?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../chatComponent/chatMessage/index.tsx | 9 +++++---- .../modals/chatModal/chatMessage/index.tsx | 19 +++++++++---------- 2 files changed, 14 insertions(+), 14 deletions(-) diff --git a/src/frontend/src/components/chatComponent/chatMessage/index.tsx b/src/frontend/src/components/chatComponent/chatMessage/index.tsx index ee11d69cb..5bb4e8b33 100644 --- a/src/frontend/src/components/chatComponent/chatMessage/index.tsx +++ b/src/frontend/src/components/chatComponent/chatMessage/index.tsx @@ -2,9 +2,9 @@ import { useState } from "react"; import { ChatMessageType } from "../../../types/chat"; import { nodeColors } from "../../../utils"; import Convert from "ansi-to-html"; -const convert = new Convert({ newline: true }); import { MessageCircle } from "lucide-react"; - +import DOMPurify from "dompurify"; +const convert = new Convert({ newline: true }); export default function ChatMessage({ chat }: { chat: ChatMessageType }) { const [hidden, setHidden] = useState(true); return ( @@ -23,13 +23,14 @@ export default function ChatMessage({ chat }: { chat: ChatMessageType }) {
)} + {chat.thought && chat.thought !== "" && !hidden && (
setHidden((prev) => !prev)} style={{ backgroundColor: nodeColors["thought"] }} - className=" text-start inline-block w-full pb-3 pt-3 px-5 cursor-pointer" + className="text-start inline-block w-full pb-3 pt-3 px-5 cursor-pointer" dangerouslySetInnerHTML={{ - __html: convert.toHtml(chat.thought), + __html: DOMPurify.sanitize(convert.toHtml(chat.thought)), }} >
)} diff --git a/src/frontend/src/modals/chatModal/chatMessage/index.tsx b/src/frontend/src/modals/chatModal/chatMessage/index.tsx index 3d4ce0b44..3b44ffe6f 100644 --- a/src/frontend/src/modals/chatModal/chatMessage/index.tsx +++ b/src/frontend/src/modals/chatModal/chatMessage/index.tsx @@ -11,7 +11,7 @@ import remarkMath from "remark-math"; import { CodeBlock } from "./codeBlock"; import Convert from "ansi-to-html"; import { User2, MessageCircle } from "lucide-react"; - +import DOMPurify from "dompurify"; export default function ChatMessage({ chat, lockChat, @@ -78,10 +78,9 @@ export default function ChatMessage({ {chat.thought && chat.thought !== "" && !hidden && (
setHidden((prev) => !prev)} - className=" text-start inline-block rounded-md text-gray-600 dark:text-gray-200 h-full border border-gray-300 dark:border-gray-500 - bg-muted dark:bg-gray-800 w-[95%] pb-3 pt-3 px-2 ml-3 cursor-pointer scrollbar-hide overflow-scroll" + className="text-start inline-block rounded-md text-gray-600 dark:text-gray-200 h-full border border-gray-300 dark:border-gray-500 bg-muted dark:bg-gray-800 w-[95%] pb-3 pt-3 px-2 ml-3 cursor-pointer scrollbar-hide overflow-scroll" dangerouslySetInnerHTML={{ - __html: convert.toHtml(chat.thought), + __html: DOMPurify.sanitize(convert.toHtml(chat.thought)), }} >
)} @@ -152,12 +151,12 @@ export default function ChatMessage({ ) : (
- "), - }} - > + {message.split("\n").map((line, index) => ( + + {line} +
+
+ ))}
)} From c954f8d33800fcbe1361a498a7d3ba15c44a0b12 Mon Sep 17 00:00:00 2001 From: Cristhian Zanforlin Lousa Date: Thu, 29 Jun 2023 10:44:32 -0300 Subject: [PATCH 091/169] =?UTF-8?q?=F0=9F=90=9B=20fix(AccordionComponent):?= =?UTF-8?q?=20fix=20the=20logic=20to=20set=20the=20initial=20value=20of=20?= =?UTF-8?q?the=20accordion=20based=20on=20the=20open=20prop=20array=20?= =?UTF-8?q?=E2=9C=A8=20feat(AccordionComponent):=20add=20support=20for=20m?= =?UTF-8?q?ultiple=20open=20accordions=20by=20changing=20the=20open=20prop?= =?UTF-8?q?=20from=20boolean=20to=20string=20array=20=F0=9F=90=9B=20fix(co?= =?UTF-8?q?nstants.tsx):=20remove=20escape=20characters=20from=20the=20JSO?= =?UTF-8?q?N=20stringified=20tweaks=20to=20fix=20parsing=20issues=20?= =?UTF-8?q?=E2=9C=A8=20feat(constants.tsx):=20add=20support=20for=20tweaks?= =?UTF-8?q?=20dictionary=20in=20the=20getCurlCode=20and=20getPythonCode=20?= =?UTF-8?q?functions=20=F0=9F=90=9B=20fix(ApiModal):=20fix=20the=20logic?= =?UTF-8?q?=20to=20set=20the=20initial=20value=20of=20the=20openAccordion?= =?UTF-8?q?=20state=20based=20on=20the=20getTweak=20array=20=E2=9C=A8=20fe?= =?UTF-8?q?at(ApiModal):=20add=20support=20for=20opening=20accordions=20ba?= =?UTF-8?q?sed=20on=20the=20getTweak=20array=20when=20switching=20to=20the?= =?UTF-8?q?=20Tweak=20tab=20=F0=9F=90=9B=20fix(ApiModal):=20fix=20the=20lo?= =?UTF-8?q?gic=20to=20filter=20and=20remove=20empty=20tweaks=20from=20the?= =?UTF-8?q?=20tweak.current=20array=20=E2=9C=A8=20feat(ApiModal):=20add=20?= =?UTF-8?q?support=20for=20adding=20new=20tweaks=20to=20the=20tweak.curren?= =?UTF-8?q?t=20array=20and=20generating=20Python=20API=20code=20?= =?UTF-8?q?=F0=9F=90=9B=20fix(ApiModal):=20fix=20the=20logic=20to=20get=20?= =?UTF-8?q?the=20value=20of=20a=20specific=20tweak=20template=20based=20on?= =?UTF-8?q?=20the=20node=20id=20and=20template=20name=20=E2=9C=A8=20feat(A?= =?UTF-8?q?piModal):=20add=20support=20for=20opening=20accordions=20based?= =?UTF-8?q?=20on=20the=20tweak.current=20array=20when=20switching=20to=20t?= =?UTF-8?q?he=20Tweak=20tab=20=F0=9F=90=9B=20fix(types):=20add=20missing?= =?UTF-8?q?=20newline=20at=20the=20end=20of=20the=20file?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/frontend/package-lock.json | 15 ++--- .../components/AccordionComponent/index.tsx | 16 ++++- src/frontend/src/constants.tsx | 6 +- src/frontend/src/modals/ApiModal/index.tsx | 63 ++++++++++--------- src/frontend/src/types/components/index.ts | 2 +- 5 files changed, 61 insertions(+), 41 deletions(-) diff --git a/src/frontend/package-lock.json b/src/frontend/package-lock.json index 1c185a3b9..a4128b48e 100644 --- a/src/frontend/package-lock.json +++ b/src/frontend/package-lock.json @@ -3563,7 +3563,7 @@ "version": "16.18.12", "resolved": "https://registry.npmjs.org/@types/node/-/node-16.18.12.tgz", "integrity": "sha512-vzLe5NaNMjIE3mcddFVGlAXN1LEWueUsMsOJWaT6wWMJGyljHAWHznqfnKUQWGzu7TLPrGvWdNAsvQYW+C0xtw==", - "devOptional": true + "dev": true }, "node_modules/@types/parse-json": { "version": "4.0.0", @@ -5633,6 +5633,7 @@ "version": "2.3.2", "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.2.tgz", "integrity": "sha512-xiqMQR4xAeHTuB9uWm+fFRcIOgKBMiOBP+eXiyT7jsgVCq1bkVygt00oASowB7EdtpOHaaPgKt812P9ab+DDKA==", + "dev": true, "hasInstallScript": true, "optional": true, "os": [ @@ -6992,9 +6993,9 @@ } }, "node_modules/log-symbols/node_modules/chalk": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-5.2.0.tgz", - "integrity": "sha512-ree3Gqw/nazQAPuJJEy+avdl7QfZMcUvmHIKgEZkGL+xOBzRvup5Hxo6LHuMceSxOabuJLJm5Yp/92R9eMmMvA==", + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-5.3.0.tgz", + "integrity": "sha512-dLitG79d+GV1Nb/VYcCDFivJeK1hiukt9QjRNVOsUtTy1rR1YJsmpGGTZ3qJos+uw7WmWF4wUwBd9jxjocFC2w==", "engines": { "node": "^12.17.0 || ^14.13 || >=16.0.0" }, @@ -8262,9 +8263,9 @@ } }, "node_modules/ora/node_modules/chalk": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-5.2.0.tgz", - "integrity": "sha512-ree3Gqw/nazQAPuJJEy+avdl7QfZMcUvmHIKgEZkGL+xOBzRvup5Hxo6LHuMceSxOabuJLJm5Yp/92R9eMmMvA==", + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-5.3.0.tgz", + "integrity": "sha512-dLitG79d+GV1Nb/VYcCDFivJeK1hiukt9QjRNVOsUtTy1rR1YJsmpGGTZ3qJos+uw7WmWF4wUwBd9jxjocFC2w==", "engines": { "node": "^12.17.0 || ^14.13 || >=16.0.0" }, diff --git a/src/frontend/src/components/AccordionComponent/index.tsx b/src/frontend/src/components/AccordionComponent/index.tsx index c1174269a..825a2c19d 100644 --- a/src/frontend/src/components/AccordionComponent/index.tsx +++ b/src/frontend/src/components/AccordionComponent/index.tsx @@ -15,9 +15,21 @@ import { export default function AccordionComponent({ trigger, children, - open = false, + open = [], }: AccordionComponentType) { - const [value, setValue] = useState(!open ? "" : trigger); + const [value, setValue] = useState(open.length == 0 ? "" : getOpenAccordion()); + + function getOpenAccordion(){ + let value = ""; + open.forEach(el => { + if(el == trigger){ + value = trigger; + } + }) + + return value; + } + function handleClick() { value == "" ? setValue(trigger) : setValue(""); } diff --git a/src/frontend/src/constants.tsx b/src/frontend/src/constants.tsx index 4aee27d83..9bfb4bcd5 100644 --- a/src/frontend/src/constants.tsx +++ b/src/frontend/src/constants.tsx @@ -71,7 +71,7 @@ FLOW_ID = "${flowId}" # You can tweak the flow by adding a tweaks dictionary # e.g {"OpenAI-XXXXX": {"model_name": "gpt-4"}} TWEAKS = ${ - tweak && tweak.length > 0 ? JSON.stringify(tweak, null, 2) : JSON.stringify(tweaks, null, 2) + tweak && tweak.length > 0 ? JSON.stringify(tweak, null, 2).replace(/\\/g, '') : JSON.stringify(tweaks, null, 2) } def run_flow(message: str, flow_id: str, tweaks: dict = None) -> dict: @@ -111,7 +111,7 @@ export const getCurlCode = (flow: FlowType, tweak?): string => { }/api/v1/process/${flowId} \\ -H 'Content-Type: application/json' \\ -d '{"inputs": {"input": message}, "tweaks": ${ - tweak && tweak.length > 0 ? JSON.stringify(tweak, null, 2) : JSON.stringify(tweaks, null, 2) + tweak && tweak.length > 0 ? JSON.stringify(tweak, null, 2).replace(/\\/g, '') : JSON.stringify(tweaks, null, 2) }}'`; }; /** @@ -124,7 +124,7 @@ export const getPythonCode = (flow: FlowType, tweak?): string => { const tweaks = buildTweaks(flow); return `from langflow import load_flow_from_json TWEAKS = ${ - tweak && tweak.length > 0 ? JSON.stringify(tweak, null, 2) : JSON.stringify(tweaks, null, 2) + tweak && tweak.length > 0 ? JSON.stringify(tweak, null, 2).replace(/\\/g, '') : JSON.stringify(tweaks, null, 2) } flow = load_flow_from_json("${flowName}.json", tweaks=TWEAKS) # Now you can use it like any chain diff --git a/src/frontend/src/modals/ApiModal/index.tsx b/src/frontend/src/modals/ApiModal/index.tsx index 1000a52d6..6f0014f33 100644 --- a/src/frontend/src/modals/ApiModal/index.tsx +++ b/src/frontend/src/modals/ApiModal/index.tsx @@ -58,7 +58,7 @@ export default function ApiModal({ flow }: { flow: FlowType }) { const [activeTab, setActiveTab] = useState("0"); const [isCopied, setIsCopied] = useState(false); const [enabled, setEnabled] = useState(null); - const [openAccordion, setOpenAccordion] = useState(false); + const [openAccordion, setOpenAccordion] = useState([]); const tweak = useRef([]); const tweaksList = useRef([]); const { setTweak, getTweak } = useContext(TabsContext); @@ -87,8 +87,11 @@ export default function ApiModal({ flow }: { flow: FlowType }) { useEffect(() => { if (closeEdit !== "") { setActiveTab("3"); - setOpenAccordion(true); tweak.current = getTweak; + openAccordions(); + } + else{ + startTweaks(); } }, [closeEdit]); @@ -100,6 +103,11 @@ export default function ApiModal({ flow }: { flow: FlowType }) { useEffect(() => { filterNodes(); }, []); + + function startTweaks() { + tweak.current.push(buildTweaks(flow)); + } + function filterNodes() { let arrNodesWithValues = []; @@ -176,25 +184,13 @@ export default function ApiModal({ flow }: { flow: FlowType }) { if (existingTweak) { existingTweak[tw][template["name"]] = changes; - if (template.list === true) { - if (changes.length === 0) { - if (existingTweak[tw] && existingTweak[tw][template["name"]]) { - delete existingTweak[tw][template["name"]]; - } - } - } - if (existingTweak[tw][template["name"]] == template.value) { tweak.current.forEach((element) => { - if (element[tw] && element[tw][template["name"]]) { - delete element[tw][template["name"]]; - } if (element[tw] && Object.keys(element[tw])?.length === 0) { tweak.current = tweak.current.filter((obj) => { const prop = obj[Object.keys(obj)[0]].prop; return prop !== undefined && prop !== null && prop !== ""; }); - delete element[tw]; } }); } @@ -205,6 +201,7 @@ export default function ApiModal({ flow }: { flow: FlowType }) { }, }; tweak.current.push(newTweak); + } const pythonApiCode = getPythonApiCode(flow, tweak.current); @@ -232,17 +229,16 @@ export default function ApiModal({ flow }: { flow: FlowType }) { if (getTweak.length > 0) { for (const obj of getTweak) { - // Obtém a chave do objeto interno - const key = Object.keys(obj)[0]; - // Obtém o valor do objeto interno - const value = obj[key]; - if (key == node["id"]) { - Object.keys(value).forEach((key) => { - if (key == template["name"]) { - returnValue = value[key]; - } - }); - } + Object.keys(obj).forEach(key =>{ + const value = obj[key]; + if (key == node["id"]) { + Object.keys(value).forEach((key) => { + if (key == template["name"]) { + returnValue = value[key]; + } + }); + } + }) } } else { return value ?? ""; @@ -250,6 +246,18 @@ export default function ApiModal({ flow }: { flow: FlowType }) { return returnValue; } + function openAccordions(){ + let accordionsToOpen = []; + tweak.current.forEach((el) => { + Object.keys(el).forEach((key) => { + if (Object.keys(el[key]).length > 0) { + accordionsToOpen.push(key) + setOpenAccordion(accordionsToOpen); + } + }); + }); + } + return ( @@ -270,9 +278,8 @@ export default function ApiModal({ flow }: { flow: FlowType }) { className="w-full h-full overflow-hidden text-center bg-muted rounded-md border" onValueChange={(value) => { setActiveTab(value); - - if (tweak.current.length > 0) { - setOpenAccordion(true); + if(value === "3"){ + openAccordions() } }} > diff --git a/src/frontend/src/types/components/index.ts b/src/frontend/src/types/components/index.ts index 4c936cabe..347554682 100644 --- a/src/frontend/src/types/components/index.ts +++ b/src/frontend/src/types/components/index.ts @@ -121,6 +121,6 @@ export type RadialProgressType = { export type AccordionComponentType = { children?: ReactElement; - open?: boolean; + open?: string[]; trigger?: string; }; \ No newline at end of file From f1e2bbb69c26a3f563a01b597c1535e0db20dcad Mon Sep 17 00:00:00 2001 From: Gabriel Luiz Freitas Almeida Date: Thu, 29 Jun 2023 10:54:27 -0300 Subject: [PATCH 092/169] =?UTF-8?q?=F0=9F=90=9B=20fix(chat.py):=20change?= =?UTF-8?q?=20BuildStatus.IN=5FPROGRESS=20to=20BuildStatus.STARTED=20for?= =?UTF-8?q?=20better=20clarity=20=F0=9F=90=9B=20fix(chat.py):=20fix=20inco?= =?UTF-8?q?rrect=20key=20used=20to=20retrieve=20graph=5Fdata=20from=20flow?= =?UTF-8?q?=5Fdata=5Fstore=20The=20BuildStatus.IN=5FPROGRESS=20constant=20?= =?UTF-8?q?is=20changed=20to=20BuildStatus.STARTED=20to=20provide=20a=20mo?= =?UTF-8?q?re=20accurate=20representation=20of=20the=20flow=20status.=20Ad?= =?UTF-8?q?ditionally,=20the=20incorrect=20key=20"data"=20is=20replaced=20?= =?UTF-8?q?with=20"graph=5Fdata"=20when=20retrieving=20the=20graph=20data?= =?UTF-8?q?=20from=20the=20flow=5Fdata=5Fstore=20dictionary.?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/backend/langflow/api/v1/chat.py | 5 +++-- src/backend/langflow/api/v1/schemas.py | 1 + 2 files changed, 4 insertions(+), 2 deletions(-) diff --git a/src/backend/langflow/api/v1/chat.py b/src/backend/langflow/api/v1/chat.py index fd0232189..25be65dbb 100644 --- a/src/backend/langflow/api/v1/chat.py +++ b/src/backend/langflow/api/v1/chat.py @@ -47,7 +47,7 @@ async def init_build(graph_data: dict, flow_id: str): logger.debug(f"Deleted flow {flow_id} from cache") flow_data_store[flow_id] = { "graph_data": graph_data, - "status": BuildStatus.IN_PROGRESS, + "status": BuildStatus.STARTED, } return InitResponse(flowId=flow_id) @@ -91,7 +91,7 @@ async def stream_build(flow_id: str): yield str(StreamData(event="error", data={"error": error_message})) return - graph_data = flow_data_store[flow_id].get("data") + graph_data = flow_data_store[flow_id].get("graph_data") if not graph_data: error_message = "No data provided" @@ -109,6 +109,7 @@ async def stream_build(flow_id: str): return number_of_nodes = len(graph.nodes) + flow_data_store[flow_id]["status"] = BuildStatus.IN_PROGRESS for i, vertex in enumerate(graph.generator_build(), 1): try: log_dict = { diff --git a/src/backend/langflow/api/v1/schemas.py b/src/backend/langflow/api/v1/schemas.py index 2cf62a504..f5f1f9ccf 100644 --- a/src/backend/langflow/api/v1/schemas.py +++ b/src/backend/langflow/api/v1/schemas.py @@ -11,6 +11,7 @@ class BuildStatus(Enum): SUCCESS = "success" FAILURE = "failure" + STARTED = "started" IN_PROGRESS = "in_progress" From f1de9a554da3f2f46be85ae55fb0cde08be78e30 Mon Sep 17 00:00:00 2001 From: Gabriel Luiz Freitas Almeida Date: Thu, 29 Jun 2023 11:15:51 -0300 Subject: [PATCH 093/169] =?UTF-8?q?=F0=9F=94=80=20refactor(constants.py):?= =?UTF-8?q?=20import=20vertex=20types=20from=20langflow.graph.vertex.types?= =?UTF-8?q?=20as=20types=20for=20improved=20readability=20and=20maintainab?= =?UTF-8?q?ility?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit The import statements for vertex types in the constants.py file have been refactored to import from langflow.graph.vertex.types as types. This change improves the readability and maintainability of the code by making it clear where the vertex types are coming from. --- src/backend/langflow/graph/graph/constants.py | 42 +++++++------------ 1 file changed, 15 insertions(+), 27 deletions(-) diff --git a/src/backend/langflow/graph/graph/constants.py b/src/backend/langflow/graph/graph/constants.py index 3398f253f..9474e311e 100644 --- a/src/backend/langflow/graph/graph/constants.py +++ b/src/backend/langflow/graph/graph/constants.py @@ -1,18 +1,5 @@ from langflow.graph.vertex.base import Vertex -from langflow.graph.vertex.types import ( - AgentVertex, - ChainVertex, - DocumentLoaderVertex, - EmbeddingVertex, - LLMVertex, - MemoryVertex, - PromptVertex, - TextSplitterVertex, - ToolVertex, - ToolkitVertex, - VectorStoreVertex, - WrapperVertex, -) +from langflow.graph.vertex import types from langflow.interface.agents.base import agent_creator from langflow.interface.chains.base import chain_creator from langflow.interface.document_loaders.base import documentloader_creator @@ -25,22 +12,23 @@ from langflow.interface.toolkits.base import toolkits_creator from langflow.interface.tools.base import tool_creator from langflow.interface.vector_store.base import vectorstore_creator from langflow.interface.wrappers.base import wrapper_creator - +from langflow.interface.retrievers.base import retriever_creator from typing import Dict, Type VERTEX_TYPE_MAP: Dict[str, Type[Vertex]] = { - **{t: PromptVertex for t in prompt_creator.to_list()}, - **{t: AgentVertex for t in agent_creator.to_list()}, - **{t: ChainVertex for t in chain_creator.to_list()}, - **{t: ToolVertex for t in tool_creator.to_list()}, - **{t: ToolkitVertex for t in toolkits_creator.to_list()}, - **{t: WrapperVertex for t in wrapper_creator.to_list()}, - **{t: LLMVertex for t in llm_creator.to_list()}, - **{t: MemoryVertex for t in memory_creator.to_list()}, - **{t: EmbeddingVertex for t in embedding_creator.to_list()}, - **{t: VectorStoreVertex for t in vectorstore_creator.to_list()}, - **{t: DocumentLoaderVertex for t in documentloader_creator.to_list()}, - **{t: TextSplitterVertex for t in textsplitter_creator.to_list()}, + **{t: types.PromptVertex for t in prompt_creator.to_list()}, + **{t: types.AgentVertex for t in agent_creator.to_list()}, + **{t: types.ChainVertex for t in chain_creator.to_list()}, + **{t: types.ToolVertex for t in tool_creator.to_list()}, + **{t: types.ToolkitVertex for t in toolkits_creator.to_list()}, + **{t: types.WrapperVertex for t in wrapper_creator.to_list()}, + **{t: types.LLMVertex for t in llm_creator.to_list()}, + **{t: types.MemoryVertex for t in memory_creator.to_list()}, + **{t: types.EmbeddingVertex for t in embedding_creator.to_list()}, + **{t: types.VectorStoreVertex for t in vectorstore_creator.to_list()}, + **{t: types.DocumentLoaderVertex for t in documentloader_creator.to_list()}, + **{t: types.TextSplitterVertex for t in textsplitter_creator.to_list()}, + **{t: types.RetrieverVertex for t in retriever_creator.to_list()}, } From 6ef5e56c5cedbfe8455ee1e0f4ba60bd8dfa433d Mon Sep 17 00:00:00 2001 From: Gabriel Luiz Freitas Almeida Date: Thu, 29 Jun 2023 11:16:05 -0300 Subject: [PATCH 094/169] =?UTF-8?q?=E2=9C=A8=20feat(graph):=20add=20Retrie?= =?UTF-8?q?verVertex=20to=20the=20list=20of=20available=20vertex=20types?= =?UTF-8?q?=20The=20RetrieverVertex=20class=20is=20added=20to=20the=20list?= =?UTF-8?q?=20of=20available=20vertex=20types=20in=20the=20langflow.graph.?= =?UTF-8?q?vertex.types=20module.=20This=20allows=20for=20the=20creation?= =?UTF-8?q?=20of=20vertices=20that=20represent=20retrievers=20in=20the=20g?= =?UTF-8?q?raph.?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/backend/langflow/graph/__init__.py | 2 ++ src/backend/langflow/graph/vertex/types.py | 5 +++++ 2 files changed, 7 insertions(+) diff --git a/src/backend/langflow/graph/__init__.py b/src/backend/langflow/graph/__init__.py index a68e844ee..e63b9dcc0 100644 --- a/src/backend/langflow/graph/__init__.py +++ b/src/backend/langflow/graph/__init__.py @@ -14,6 +14,7 @@ from langflow.graph.vertex.types import ( ToolkitVertex, VectorStoreVertex, WrapperVertex, + RetrieverVertex, ) __all__ = [ @@ -32,4 +33,5 @@ __all__ = [ "ToolkitVertex", "VectorStoreVertex", "WrapperVertex", + "RetrieverVertex", ] diff --git a/src/backend/langflow/graph/vertex/types.py b/src/backend/langflow/graph/vertex/types.py index b6a8f9a91..846b79bc0 100644 --- a/src/backend/langflow/graph/vertex/types.py +++ b/src/backend/langflow/graph/vertex/types.py @@ -112,6 +112,11 @@ class MemoryVertex(Vertex): super().__init__(data, base_type="memory") +class RetrieverVertex(Vertex): + def __init__(self, data: Dict): + super().__init__(data, base_type="retrievers") + + class TextSplitterVertex(Vertex): def __init__(self, data: Dict): super().__init__(data, base_type="textsplitters") From 6b893237d067de0e73ca4848e93cd7cbc8184399 Mon Sep 17 00:00:00 2001 From: Gabriel Luiz Freitas Almeida Date: Thu, 29 Jun 2023 11:17:30 -0300 Subject: [PATCH 095/169] =?UTF-8?q?=F0=9F=90=9B=20fix(utils.py):=20add=20i?= =?UTF-8?q?mport=5Fretriever=20function=20to=20import=20retriever=20module?= =?UTF-8?q?=20=E2=9C=A8=20feat(utils.py):=20add=20support=20for=20importin?= =?UTF-8?q?g=20retriever=20module=20based=20on=20retriever=20name=20The=20?= =?UTF-8?q?`import=5Fretriever`=20function=20is=20added=20to=20the=20`util?= =?UTF-8?q?s.py`=20module=20to=20allow=20importing=20the=20retriever=20mod?= =?UTF-8?q?ule=20based=20on=20the=20retriever=20name.=20This=20function=20?= =?UTF-8?q?uses=20the=20`import=5Fmodule`=20function=20from=20the=20`impor?= =?UTF-8?q?tlib`=20module=20to=20dynamically=20import=20the=20retriever=20?= =?UTF-8?q?module=20from=20the=20`langchain.retrievers`=20package.=20This?= =?UTF-8?q?=20enhances=20the=20modularity=20and=20extensibility=20of=20the?= =?UTF-8?q?=20codebase=20by=20providing=20a=20convenient=20way=20to=20impo?= =?UTF-8?q?rt=20retrievers=20based=20on=20their=20names.?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/backend/langflow/interface/importing/utils.py | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/src/backend/langflow/interface/importing/utils.py b/src/backend/langflow/interface/importing/utils.py index f65376d48..7ef916ca9 100644 --- a/src/backend/langflow/interface/importing/utils.py +++ b/src/backend/langflow/interface/importing/utils.py @@ -44,6 +44,7 @@ def import_by_type(_type: str, name: str) -> Any: "documentloaders": import_documentloader, "textsplitters": import_textsplitter, "utilities": import_utility, + "retrievers": import_retriever, } if _type == "llms": key = "chat" if "chat" in name.lower() else "llm" @@ -59,6 +60,11 @@ def import_chat_llm(llm: str) -> BaseChatModel: return import_class(f"langchain.chat_models.{llm}") +def import_retriever(retriever: str) -> Any: + """Import retriever from retriever name""" + return import_module(f"from langchain.retrievers import {retriever}") + + def import_memory(memory: str) -> Any: """Import memory from memory name""" return import_module(f"from langchain.memory import {memory}") From 72b6681f5a798cb15629842d86dba638face030b Mon Sep 17 00:00:00 2001 From: Gabriel Luiz Freitas Almeida Date: Thu, 29 Jun 2023 11:17:59 -0300 Subject: [PATCH 096/169] =?UTF-8?q?=F0=9F=94=A7=20chore(loading.py):=20add?= =?UTF-8?q?=20support=20for=20instantiating=20retrievers=20in=20the=20init?= =?UTF-8?q?ialization=20process=20=F0=9F=9A=80=20feat(loading.py):=20imple?= =?UTF-8?q?ment=20the=20ability=20to=20instantiate=20retrievers=20based=20?= =?UTF-8?q?on=20node=20type=20and=20class=20object=20The=20`instantiate=5F?= =?UTF-8?q?based=5Fon=5Ftype`=20function=20now=20includes=20a=20new=20cond?= =?UTF-8?q?ition=20to=20handle=20the=20instantiation=20of=20retrievers.=20?= =?UTF-8?q?The=20`instantiate=5Fretriever`=20function=20is=20introduced=20?= =?UTF-8?q?to=20handle=20the=20specific=20logic=20for=20creating=20retriev?= =?UTF-8?q?ers.=20This=20change=20allows=20for=20the=20dynamic=20creation?= =?UTF-8?q?=20of=20retrievers=20based=20on=20the=20provided=20node=20type?= =?UTF-8?q?=20and=20class=20object.?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../langflow/interface/initialize/loading.py | 14 ++++++++++++++ 1 file changed, 14 insertions(+) diff --git a/src/backend/langflow/interface/initialize/loading.py b/src/backend/langflow/interface/initialize/loading.py index ea9af8d63..65461f141 100644 --- a/src/backend/langflow/interface/initialize/loading.py +++ b/src/backend/langflow/interface/initialize/loading.py @@ -15,6 +15,7 @@ from langflow.interface.custom_lists import CUSTOM_NODES from langflow.interface.importing.utils import get_function, import_by_type from langflow.interface.toolkits.base import toolkits_creator from langflow.interface.chains.base import chain_creator +from langflow.interface.retrievers.base import retriever_creator from langflow.interface.utils import load_file_into_dict from langflow.utils import validate from langchain.chains.base import Chain @@ -79,10 +80,23 @@ def instantiate_based_on_type(class_object, base_type, node_type, params): return instantiate_chains(node_type, class_object, params) elif base_type == "llms": return instantiate_llm(node_type, class_object, params) + elif base_type == "retrievers": + return instantiate_retriever(node_type, class_object, params) else: return class_object(**params) +def instantiate_retriever(node_type, class_object, params): + if "retriever" in params and hasattr(params["retriever"], "as_retriever"): + params["retriever"] = params["retriever"].as_retriever() + if node_type in retriever_creator.from_method_nodes: + method = retriever_creator.from_method_nodes[node_type] + if class_method := getattr(class_object, method, None): + return class_method(**params) + raise ValueError(f"Method {method} not found in {class_object}") + return class_object(**params) + + def instantiate_llm(node_type, class_object, params: Dict): return class_object(**params) From 8cc04971208f3665973b792745352ff002abfbc2 Mon Sep 17 00:00:00 2001 From: Gabriel Luiz Freitas Almeida Date: Thu, 29 Jun 2023 11:18:11 -0300 Subject: [PATCH 097/169] =?UTF-8?q?=F0=9F=94=80=20refactor(base.py):=20add?= =?UTF-8?q?=20from=5Fmethod=5Fnodes=20dictionary=20to=20RetrieverCreator?= =?UTF-8?q?=20class=20The=20`from=5Fmethod=5Fnodes`=20dictionary=20is=20ad?= =?UTF-8?q?ded=20to=20the=20`RetrieverCreator`=20class=20in=20order=20to?= =?UTF-8?q?=20map=20the=20"MultiQueryRetriever"=20node=20to=20the=20"from?= =?UTF-8?q?=5Fllm"=20method.=20This=20refactor=20improves=20the=20readabil?= =?UTF-8?q?ity=20and=20maintainability=20of=20the=20code=20by=20explicitly?= =?UTF-8?q?=20defining=20the=20mapping=20between=20nodes=20and=20methods.?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/backend/langflow/interface/retrievers/base.py | 2 ++ 1 file changed, 2 insertions(+) diff --git a/src/backend/langflow/interface/retrievers/base.py b/src/backend/langflow/interface/retrievers/base.py index 3eb38861e..16f49191e 100644 --- a/src/backend/langflow/interface/retrievers/base.py +++ b/src/backend/langflow/interface/retrievers/base.py @@ -13,6 +13,8 @@ from langflow.utils.util import build_template_from_method class RetrieverCreator(LangChainTypeCreator): type_name: str = "retrievers" + from_method_nodes = {"MultiQueryRetriever": "from_llm"} + @property def frontend_node_class(self) -> Type[RetrieverFrontendNode]: return RetrieverFrontendNode From 549a8dedc552e8a5d2da81aefc65960d04ec8e6a Mon Sep 17 00:00:00 2001 From: Gabriel Luiz Freitas Almeida Date: Thu, 29 Jun 2023 11:18:19 -0300 Subject: [PATCH 098/169] =?UTF-8?q?=F0=9F=94=A7=20chore(llms.py):=20add=20?= =?UTF-8?q?method=20to=20add=20extra=20base=20classes=20to=20improve=20ext?= =?UTF-8?q?ensibility=20The=20`add=5Fextra=5Fbase=5Fclasses`=20method=20is?= =?UTF-8?q?=20added=20to=20the=20`LLMFrontendNode`=20class.=20This=20metho?= =?UTF-8?q?d=20checks=20if=20the=20"BaseLLM"=20class=20is=20already=20pres?= =?UTF-8?q?ent=20in=20the=20`base=5Fclasses`=20list=20and=20appends=20it?= =?UTF-8?q?=20if=20not.=20This=20change=20allows=20for=20easier=20extensib?= =?UTF-8?q?ility=20by=20providing=20a=20way=20to=20add=20additional=20base?= =?UTF-8?q?=20classes=20to=20the=20`LLMFrontendNode`=20class.?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/backend/langflow/template/frontend_node/llms.py | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/src/backend/langflow/template/frontend_node/llms.py b/src/backend/langflow/template/frontend_node/llms.py index 703dbacc6..a2a4cb9bb 100644 --- a/src/backend/langflow/template/frontend_node/llms.py +++ b/src/backend/langflow/template/frontend_node/llms.py @@ -21,6 +21,10 @@ class LLMFrontendNode(FrontendNode): if field.name == "openai_api_base": field.info = OPENAI_API_BASE_INFO + def add_extra_base_classes(self) -> None: + if "BaseLLM" not in self.base_classes: + self.base_classes.append("BaseLLM") + @staticmethod def format_azure_field(field: TemplateField): if field.name == "model_name": From 3ced33b6781b93c1d290ce0048f9e0ef802fc008 Mon Sep 17 00:00:00 2001 From: Gabriel Luiz Freitas Almeida Date: Thu, 29 Jun 2023 13:07:04 -0300 Subject: [PATCH 099/169] =?UTF-8?q?=F0=9F=94=A7=20chore(base.py):=20add=20?= =?UTF-8?q?method=20to=20remove=20unwanted=20base=20classes=20from=20the?= =?UTF-8?q?=20list=20of=20base=20classes=20=F0=9F=90=9B=20fix(base.py):=20?= =?UTF-8?q?call=20the=20method=20to=20remove=20unwanted=20base=20classes?= =?UTF-8?q?=20before=20converting=20the=20frontend=20node=20to=20a=20dict?= =?UTF-8?q?=20The=20`process=5Fbase=5Fclasses`=20method=20is=20added=20to?= =?UTF-8?q?=20the=20`FrontendNode`=20class=20to=20remove=20unwanted=20base?= =?UTF-8?q?=20classes=20from=20the=20list=20of=20base=20classes.=20This=20?= =?UTF-8?q?method=20iterates=20over=20the=20base=20classes=20and=20filters?= =?UTF-8?q?=20out=20any=20classes=20that=20are=20present=20in=20the=20`CLA?= =?UTF-8?q?SSES=5FTO=5FREMOVE`=20list.=20The=20method=20is=20then=20called?= =?UTF-8?q?=20before=20converting=20the=20frontend=20node=20to=20a=20dicti?= =?UTF-8?q?onary=20representation=20in=20the=20`to=5Fdict`=20method=20to?= =?UTF-8?q?=20ensure=20that=20the=20unwanted=20base=20classes=20are=20not?= =?UTF-8?q?=20included=20in=20the=20final=20output.?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/backend/langflow/template/frontend_node/base.py | 11 +++++++++++ 1 file changed, 11 insertions(+) diff --git a/src/backend/langflow/template/frontend_node/base.py b/src/backend/langflow/template/frontend_node/base.py index 0c0c1e06a..de8c78112 100644 --- a/src/backend/langflow/template/frontend_node/base.py +++ b/src/backend/langflow/template/frontend_node/base.py @@ -9,6 +9,8 @@ from langflow.template.template.base import Template from langflow.utils import constants from langflow.template.frontend_node.formatter import field_formatters +CLASSES_TO_REMOVE = ["Serializable", "BaseModel"] + class FieldFormatters(BaseModel): formatters = { @@ -47,6 +49,14 @@ class FrontendNode(BaseModel): documentation: str = "" field_formatters: FieldFormatters = Field(default_factory=FieldFormatters) + def process_base_classes(self) -> None: + """Removes unwanted base classes from the list of base classes.""" + self.base_classes = [ + base_class + for base_class in self.base_classes + if base_class not in CLASSES_TO_REMOVE + ] + # field formatters is an instance attribute but it is not used in the class # so we need to create a method to get it @staticmethod @@ -59,6 +69,7 @@ class FrontendNode(BaseModel): def to_dict(self) -> dict: """Returns a dict representation of the frontend node.""" + self.process_base_classes() return { self.name: { "template": self.template.to_dict(self.format_field), From 7c777bf69206a5aaaa395307d9ba3e8087ca8b42 Mon Sep 17 00:00:00 2001 From: Cristhian Zanforlin Lousa Date: Thu, 29 Jun 2023 14:17:55 -0300 Subject: [PATCH 100/169] =?UTF-8?q?=F0=9F=90=9B=20fix(ApiModal/index.tsx):?= =?UTF-8?q?=20fix=20linting=20issues=20and=20improve=20code=20readability?= =?UTF-8?q?=20=E2=9C=A8=20feat(ApiModal/index.tsx):=20add=20support=20for?= =?UTF-8?q?=20displaying=20tweaks=20code=20in=20a=20separate=20tab=20if=20?= =?UTF-8?q?there=20are=20any=20tweaks=20present?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/frontend/package-lock.json | 3 +- src/frontend/src/modals/ApiModal/index.tsx | 115 ++++++++++----------- 2 files changed, 57 insertions(+), 61 deletions(-) diff --git a/src/frontend/package-lock.json b/src/frontend/package-lock.json index a4128b48e..b751823c3 100644 --- a/src/frontend/package-lock.json +++ b/src/frontend/package-lock.json @@ -3563,7 +3563,7 @@ "version": "16.18.12", "resolved": "https://registry.npmjs.org/@types/node/-/node-16.18.12.tgz", "integrity": "sha512-vzLe5NaNMjIE3mcddFVGlAXN1LEWueUsMsOJWaT6wWMJGyljHAWHznqfnKUQWGzu7TLPrGvWdNAsvQYW+C0xtw==", - "dev": true + "devOptional": true }, "node_modules/@types/parse-json": { "version": "4.0.0", @@ -5633,7 +5633,6 @@ "version": "2.3.2", "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.2.tgz", "integrity": "sha512-xiqMQR4xAeHTuB9uWm+fFRcIOgKBMiOBP+eXiyT7jsgVCq1bkVygt00oASowB7EdtpOHaaPgKt812P9ab+DDKA==", - "dev": true, "hasInstallScript": true, "optional": true, "os": [ diff --git a/src/frontend/src/modals/ApiModal/index.tsx b/src/frontend/src/modals/ApiModal/index.tsx index 6f0014f33..2377c212b 100644 --- a/src/frontend/src/modals/ApiModal/index.tsx +++ b/src/frontend/src/modals/ApiModal/index.tsx @@ -75,6 +75,55 @@ export default function ApiModal({ flow }: { flow: FlowType }) { }, 2000); }); }; + const pythonApiCode = getPythonApiCode(flow, tweak.current); + const curl_code = getCurlCode(flow, tweak.current); + const pythonCode = getPythonCode(flow, tweak.current); + const tweaksCode = buildTweaks(flow); + const tabs = [ + { + name: "cURL", + mode: "bash", + image: "https://curl.se/logo/curl-symbol-transparent.png", + code: curl_code, + }, + { + name: "Python API", + mode: "python", + image: + "https://images.squarespace-cdn.com/content/v1/5df3d8c5d2be5962e4f87890/1628015119369-OY4TV3XJJ53ECO0W2OLQ/Python+API+Training+Logo.png?format=1000w", + code: pythonApiCode, + }, + { + name: "Python Code", + mode: "python", + image: "https://cdn-icons-png.flaticon.com/512/5968/5968350.png", + code: pythonCode, + }, + ]; + + useEffect(() => { + if (closeEdit !== "") { + setActiveTab("3"); + tweak.current = getTweak; + openAccordions(); + } else { + startTweaks(); + } + }, [closeEdit]); + + useEffect(() => { + filterNodes(); + }, []); + + if (Object.keys(tweaksCode).length > 0) { + tabs.push({ + name: "Tweaks", + mode: "python", + image: "https://cdn-icons-png.flaticon.com/512/5968/5968350.png", + code: pythonCode, + }); + } + function setModalOpen(x: boolean) { setOpen(x); if (x === false) { @@ -84,26 +133,6 @@ export default function ApiModal({ flow }: { flow: FlowType }) { } } - useEffect(() => { - if (closeEdit !== "") { - setActiveTab("3"); - tweak.current = getTweak; - openAccordions(); - } - else{ - startTweaks(); - } - }, [closeEdit]); - - const pythonApiCode = getPythonApiCode(flow, tweak.current); - const curl_code = getCurlCode(flow, tweak.current); - const pythonCode = getPythonCode(flow, tweak.current); - const tweaksCode = buildTweaks(flow); - - useEffect(() => { - filterNodes(); - }, []); - function startTweaks() { tweak.current.push(buildTweaks(flow)); } @@ -135,37 +164,6 @@ export default function ApiModal({ flow }: { flow: FlowType }) { }); } - const tabs = [ - { - name: "cURL", - mode: "bash", - image: "https://curl.se/logo/curl-symbol-transparent.png", - code: curl_code, - }, - { - name: "Python API", - mode: "python", - image: - "https://images.squarespace-cdn.com/content/v1/5df3d8c5d2be5962e4f87890/1628015119369-OY4TV3XJJ53ECO0W2OLQ/Python+API+Training+Logo.png?format=1000w", - code: pythonApiCode, - }, - { - name: "Python Code", - mode: "python", - image: "https://cdn-icons-png.flaticon.com/512/5968/5968350.png", - code: pythonCode, - }, - ]; - - if (Object.keys(tweaksCode).length > 0) { - tabs.push({ - name: "Tweaks", - mode: "python", - image: "https://cdn-icons-png.flaticon.com/512/5968/5968350.png", - code: pythonCode, - }); - } - function buildTweakObject(tw, changes, template) { if (template.type === "float") { changes = parseFloat(changes); @@ -201,7 +199,6 @@ export default function ApiModal({ flow }: { flow: FlowType }) { }, }; tweak.current.push(newTweak); - } const pythonApiCode = getPythonApiCode(flow, tweak.current); @@ -229,7 +226,7 @@ export default function ApiModal({ flow }: { flow: FlowType }) { if (getTweak.length > 0) { for (const obj of getTweak) { - Object.keys(obj).forEach(key =>{ + Object.keys(obj).forEach((key) => { const value = obj[key]; if (key == node["id"]) { Object.keys(value).forEach((key) => { @@ -238,7 +235,7 @@ export default function ApiModal({ flow }: { flow: FlowType }) { } }); } - }) + }); } } else { return value ?? ""; @@ -246,16 +243,16 @@ export default function ApiModal({ flow }: { flow: FlowType }) { return returnValue; } - function openAccordions(){ + function openAccordions() { let accordionsToOpen = []; tweak.current.forEach((el) => { Object.keys(el).forEach((key) => { if (Object.keys(el[key]).length > 0) { - accordionsToOpen.push(key) + accordionsToOpen.push(key); setOpenAccordion(accordionsToOpen); } }); - }); + }); } return ( @@ -278,8 +275,8 @@ export default function ApiModal({ flow }: { flow: FlowType }) { className="w-full h-full overflow-hidden text-center bg-muted rounded-md border" onValueChange={(value) => { setActiveTab(value); - if(value === "3"){ - openAccordions() + if (value === "3") { + openAccordions(); } }} > From 473bde940cdff292cfec289a21bffed506b501ca Mon Sep 17 00:00:00 2001 From: Gabriel Luiz Freitas Almeida Date: Thu, 29 Jun 2023 15:17:23 -0300 Subject: [PATCH 101/169] =?UTF-8?q?=F0=9F=90=9B=20fix(loading.py):=20add?= =?UTF-8?q?=20error=20handling=20for=20missing=20'cursor'=20attribute=20in?= =?UTF-8?q?=20instantiate=5Fmemory=20function=20The=20instantiate=5Fmemory?= =?UTF-8?q?=20function=20now=20includes=20error=20handling=20for=20a=20spe?= =?UTF-8?q?cific=20AttributeError=20that=20occurs=20when=20the=20object=20?= =?UTF-8?q?does=20not=20have=20a=20'cursor'=20attribute.=20If=20this=20err?= =?UTF-8?q?or=20occurs,=20an=20AttributeError=20is=20raised=20with=20a=20s?= =?UTF-8?q?pecific=20error=20message=20indicating=20a=20failure=20to=20bui?= =?UTF-8?q?ld=20a=20connection=20to=20the=20database.=20This=20change=20im?= =?UTF-8?q?proves=20the=20error=20handling=20and=20provides=20more=20infor?= =?UTF-8?q?mative=20error=20messages=20for=20debugging=20purposes.?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../langflow/interface/initialize/loading.py | 15 +++++++++++++++ 1 file changed, 15 insertions(+) diff --git a/src/backend/langflow/interface/initialize/loading.py b/src/backend/langflow/interface/initialize/loading.py index 65461f141..8503290b1 100644 --- a/src/backend/langflow/interface/initialize/loading.py +++ b/src/backend/langflow/interface/initialize/loading.py @@ -82,10 +82,25 @@ def instantiate_based_on_type(class_object, base_type, node_type, params): return instantiate_llm(node_type, class_object, params) elif base_type == "retrievers": return instantiate_retriever(node_type, class_object, params) + elif base_type == "memory": + return instantiate_memory(node_type, class_object, params) else: return class_object(**params) +def instantiate_memory(node_type, class_object, params): + try: + return class_object(**params) + # I want to catch a specific attribute error that happens + # when the object does not have a cursor attribute + except AttributeError as exc: + if "object has no attribute 'cursor'" in str(exc): + raise AttributeError( + f"Failed to build connection to database. Please check your connection string and try again. Error: {exc}" + ) from exc + raise exc + + def instantiate_retriever(node_type, class_object, params): if "retriever" in params and hasattr(params["retriever"], "as_retriever"): params["retriever"] = params["retriever"].as_retriever() From 9e44720ac87684c09406ae7b6ac864edb38ac630 Mon Sep 17 00:00:00 2001 From: Gabriel Luiz Freitas Almeida Date: Thu, 29 Jun 2023 17:38:58 -0300 Subject: [PATCH 102/169] =?UTF-8?q?=F0=9F=94=A7=20chore(config.yaml):=20co?= =?UTF-8?q?mment=20out=20unused=20integrations=20in=20memories=20and=20ret?= =?UTF-8?q?rievers=20sections=20The=20unused=20integrations=20in=20the=20m?= =?UTF-8?q?emories=20and=20retrievers=20sections=20have=20been=20commented?= =?UTF-8?q?=20out=20to=20improve=20code=20readability=20and=20remove=20unn?= =?UTF-8?q?ecessary=20clutter.=20These=20integrations=20are=20not=20curren?= =?UTF-8?q?tly=20being=20used=20in=20the=20application=20and=20can=20be=20?= =?UTF-8?q?safely=20ignored.?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/backend/langflow/config.yaml | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) diff --git a/src/backend/langflow/config.yaml b/src/backend/langflow/config.yaml index 4bb93680f..bc673947e 100644 --- a/src/backend/langflow/config.yaml +++ b/src/backend/langflow/config.yaml @@ -120,8 +120,11 @@ llms: HuggingFaceHub: documentation: "https://python.langchain.com/docs/modules/model_io/models/llms/integrations/huggingface_hub" memories: + # https://github.com/supabase-community/supabase-py/issues/482 + # ZepChatMessageHistory: + # documentation: "https://python.langchain.com/docs/modules/memory/integrations/zep_memory" PostgresChatMessageHistory: - documentation: "https://python.langchain.com/docs/modules/memory/how_to/agent_with_memory_in_db" + documentation: "https://python.langchain.com/docs/modules/memory/integrations/postgres_chat_message_history" ConversationBufferMemory: documentation: "https://python.langchain.com/docs/modules/memory/how_to/buffer" ConversationSummaryMemory: @@ -233,6 +236,9 @@ utilities: retrievers: MultiQueryRetriever: documentation: "https://python.langchain.com/docs/modules/data_connection/retrievers/how_to/MultiQueryRetriever" + # https://github.com/supabase-community/supabase-py/issues/482 + # ZepRetriever: + # documentation: "https://python.langchain.com/docs/modules/data_connection/retrievers/integrations/zep_memorystore" vectorstores: Chroma: documentation: "https://python.langchain.com/docs/modules/data_connection/vectorstores/integrations/chroma" From 26c42cac05c679ff031ff4e90fc2136742a776c8 Mon Sep 17 00:00:00 2001 From: Gabriel Luiz Freitas Almeida Date: Thu, 29 Jun 2023 17:39:12 -0300 Subject: [PATCH 103/169] =?UTF-8?q?=F0=9F=94=A7=20chore(util.py):=20exclud?= =?UTF-8?q?e=20"self"=20parameter=20from=20template=20building=20The=20"se?= =?UTF-8?q?lf"=20parameter=20is=20now=20excluded=20from=20the=20template?= =?UTF-8?q?=20building=20process.=20This=20change=20improves=20the=20accur?= =?UTF-8?q?acy=20of=20the=20generated=20template=20by=20removing=20unneces?= =?UTF-8?q?sary=20information.?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/backend/langflow/utils/util.py | 1 + 1 file changed, 1 insertion(+) diff --git a/src/backend/langflow/utils/util.py b/src/backend/langflow/utils/util.py index 02a9520b4..486f6c189 100644 --- a/src/backend/langflow/utils/util.py +++ b/src/backend/langflow/utils/util.py @@ -165,6 +165,7 @@ def build_template_from_method( "required": param.default == param.empty, } for name, param in params.items() + if name != "self" }, } From e24ad0513b8bc0ede894565da34b5c1e21be8b90 Mon Sep 17 00:00:00 2001 From: Gabriel Luiz Freitas Almeida Date: Thu, 29 Jun 2023 17:39:25 -0300 Subject: [PATCH 104/169] =?UTF-8?q?=F0=9F=94=A7=20chore(memories.py):=20se?= =?UTF-8?q?t=20'url'=20field=20to=20be=20shown=20in=20the=20frontend=20The?= =?UTF-8?q?=20'url'=20field=20in=20the=20MemoryFrontendNode=20class=20is?= =?UTF-8?q?=20now=20set=20to=20be=20shown=20in=20the=20frontend.=20This=20?= =?UTF-8?q?change=20allows=20the=20'url'=20field=20to=20be=20visible=20and?= =?UTF-8?q?=20accessible=20to=20users=20in=20the=20frontend=20interface.?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/backend/langflow/template/frontend_node/memories.py | 2 ++ 1 file changed, 2 insertions(+) diff --git a/src/backend/langflow/template/frontend_node/memories.py b/src/backend/langflow/template/frontend_node/memories.py index 936bdb8f4..6d9368823 100644 --- a/src/backend/langflow/template/frontend_node/memories.py +++ b/src/backend/langflow/template/frontend_node/memories.py @@ -75,6 +75,8 @@ class MemoryFrontendNode(FrontendNode): field.show = True field.advanced = False field.required = False + if field.name == "url": + field.show = True class PostgresChatMessageHistoryFrontendNode(MemoryFrontendNode): From 77cc23bf5fa5f9e731acfc1501405ba2be16746e Mon Sep 17 00:00:00 2001 From: Gabriel Luiz Freitas Almeida Date: Thu, 29 Jun 2023 17:39:36 -0300 Subject: [PATCH 105/169] =?UTF-8?q?=F0=9F=90=9B=20fix(base.py):=20fix=20me?= =?UTF-8?q?thod=20name=20in=20build=5Ftemplate=5Ffrom=5Fmethod=20call=20fo?= =?UTF-8?q?r=20MultiQueryRetriever=20=E2=9C=A8=20feat(base.py):=20add=20su?= =?UTF-8?q?pport=20for=20ZepRetriever=20in=20from=5Fmethod=5Fnodes=20dicti?= =?UTF-8?q?onary=20The=20build=5Ftemplate=5Ffrom=5Fmethod=20call=20for=20t?= =?UTF-8?q?he=20MultiQueryRetriever=20in=20the=20get=5Fsignature=20method?= =?UTF-8?q?=20was=20using=20the=20incorrect=20method=20name=20"from=5Fllm"?= =?UTF-8?q?.=20It=20has=20been=20fixed=20to=20use=20the=20correct=20method?= =?UTF-8?q?=20name=20"from=5Fmethod=5Fnodes".=20Additionally,=20support=20?= =?UTF-8?q?for=20the=20ZepRetriever=20has=20been=20added=20to=20the=20from?= =?UTF-8?q?=5Fmethod=5Fnodes=20dictionary=20to=20allow=20for=20its=20usage?= =?UTF-8?q?=20in=20the=20RetrieverCreator=20class.?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../langflow/interface/retrievers/base.py | 17 ++++++++++++----- 1 file changed, 12 insertions(+), 5 deletions(-) diff --git a/src/backend/langflow/interface/retrievers/base.py b/src/backend/langflow/interface/retrievers/base.py index 16f49191e..dc6056656 100644 --- a/src/backend/langflow/interface/retrievers/base.py +++ b/src/backend/langflow/interface/retrievers/base.py @@ -7,13 +7,13 @@ from langflow.interface.importing.utils import import_class from langflow.settings import settings from langflow.template.frontend_node.retrievers import RetrieverFrontendNode from langflow.utils.logger import logger -from langflow.utils.util import build_template_from_method +from langflow.utils.util import build_template_from_method, build_template_from_class class RetrieverCreator(LangChainTypeCreator): type_name: str = "retrievers" - from_method_nodes = {"MultiQueryRetriever": "from_llm"} + from_method_nodes = {"MultiQueryRetriever": "from_llm", "ZepRetriever": "__init__"} @property def frontend_node_class(self) -> Type[RetrieverFrontendNode]: @@ -31,9 +31,16 @@ class RetrieverCreator(LangChainTypeCreator): def get_signature(self, name: str) -> Optional[Dict]: """Get the signature of an embedding.""" try: - return build_template_from_method( - name, type_to_cls_dict=self.type_to_loader_dict, method_name="from_llm" - ) + if name in self.from_method_nodes: + return build_template_from_method( + name, + type_to_cls_dict=self.type_to_loader_dict, + method_name=self.from_method_nodes[name], + ) + else: + return build_template_from_class( + name, type_to_cls_dict=self.type_to_loader_dict + ) except ValueError as exc: raise ValueError(f"Retriever {name} not found") from exc except AttributeError as exc: From 7eeacfbb31b1fe0086503e7f1fe40e2e2ac5e076 Mon Sep 17 00:00:00 2001 From: Gabriel Luiz Freitas Almeida Date: Thu, 29 Jun 2023 17:39:46 -0300 Subject: [PATCH 106/169] =?UTF-8?q?=F0=9F=90=9B=20fix(base.py):=20add=20su?= =?UTF-8?q?pport=20for=20creating=20MemoryFrontendNode=20from=20a=20method?= =?UTF-8?q?=20=E2=9C=A8=20feat(base.py):=20add=20support=20for=20creating?= =?UTF-8?q?=20MemoryFrontendNode=20from=20a=20specific=20method=20in=20Zep?= =?UTF-8?q?ChatMessageHistory=20class=20The=20`MemoryCreator`=20class=20no?= =?UTF-8?q?w=20supports=20creating=20`MemoryFrontendNode`=20from=20a=20spe?= =?UTF-8?q?cific=20method=20in=20the=20`ZepChatMessageHistory`=20class.=20?= =?UTF-8?q?This=20is=20achieved=20by=20adding=20the=20`from=5Fmethod=5Fnod?= =?UTF-8?q?es`=20dictionary=20with=20the=20method=20name=20as=20the=20key?= =?UTF-8?q?=20and=20the=20class=20name=20as=20the=20value.=20The=20`build?= =?UTF-8?q?=5Ftemplate=5Ffrom=5Fmethod`=20function=20is=20used=20to=20crea?= =?UTF-8?q?te=20the=20`MemoryFrontendNode`=20from=20the=20specified=20meth?= =?UTF-8?q?od.=20This=20enhancement=20allows=20for=20more=20flexibility=20?= =?UTF-8?q?in=20creating=20`MemoryFrontendNode`=20instances.?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/backend/langflow/interface/memories/base.py | 10 +++++++++- 1 file changed, 9 insertions(+), 1 deletion(-) diff --git a/src/backend/langflow/interface/memories/base.py b/src/backend/langflow/interface/memories/base.py index a211517f5..4d7f8d5aa 100644 --- a/src/backend/langflow/interface/memories/base.py +++ b/src/backend/langflow/interface/memories/base.py @@ -6,13 +6,15 @@ from langflow.settings import settings from langflow.template.frontend_node.base import FrontendNode from langflow.template.frontend_node.memories import MemoryFrontendNode from langflow.utils.logger import logger -from langflow.utils.util import build_template_from_class +from langflow.utils.util import build_template_from_class, build_template_from_method from langflow.custom.customs import get_custom_nodes class MemoryCreator(LangChainTypeCreator): type_name: str = "memories" + from_method_nodes = {"ZepChatMessageHistory": "__init__"} + @property def frontend_node_class(self) -> Type[FrontendNode]: """The class type of the FrontendNode created in frontend_node.""" @@ -29,6 +31,12 @@ class MemoryCreator(LangChainTypeCreator): try: if name in get_custom_nodes(self.type_name).keys(): return get_custom_nodes(self.type_name)[name] + elif name in self.from_method_nodes: + return build_template_from_method( + name, + type_to_cls_dict=memory_type_to_cls_dict, + method_name=self.from_method_nodes[name], + ) return build_template_from_class(name, memory_type_to_cls_dict) except ValueError as exc: raise ValueError("Memory not found") from exc From f81a835001e9d0e56680d8803b5df52adce609a4 Mon Sep 17 00:00:00 2001 From: Gabriel Luiz Freitas Almeida Date: Thu, 29 Jun 2023 18:19:22 -0300 Subject: [PATCH 107/169] =?UTF-8?q?=F0=9F=90=9B=20fix(process.py):=20add?= =?UTF-8?q?=20error=20handling=20for=20unknown=20langchain=5Fobject=20type?= =?UTF-8?q?s=20When=20processing=20the=20data=20graph,=20if=20the=20langch?= =?UTF-8?q?ain=5Fobject=20is=20of=20an=20unknown=20type,=20a=20ValueError?= =?UTF-8?q?=20is=20now=20raised.=20This=20provides=20better=20error=20hand?= =?UTF-8?q?ling=20and=20helps=20identify=20any=20unexpected=20langchain=5F?= =?UTF-8?q?object=20types=20that=20may=20be=20encountered=20during=20proce?= =?UTF-8?q?ssing.?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/backend/langflow/processing/process.py | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/src/backend/langflow/processing/process.py b/src/backend/langflow/processing/process.py index abf7a00b8..e36cbfd8b 100644 --- a/src/backend/langflow/processing/process.py +++ b/src/backend/langflow/processing/process.py @@ -107,6 +107,10 @@ def process_graph_cached(data_graph: Dict[str, Any], inputs: Optional[dict] = No elif isinstance(langchain_object, VectorStore): class_name = langchain_object.__class__.__name__ result = {"message": f"Processed {class_name} successfully"} + else: + raise ValueError( + f"Unknown langchain_object type: {type(langchain_object).__name__}" + ) return result From c834d91efd49272d80a0365354085571a50533fd Mon Sep 17 00:00:00 2001 From: Gabriel Luiz Freitas Almeida Date: Thu, 29 Jun 2023 18:37:33 -0300 Subject: [PATCH 108/169] =?UTF-8?q?=F0=9F=90=9B=20fix(util.py):=20exclude?= =?UTF-8?q?=20"kwargs"=20and=20"args"=20parameters=20from=20the=20generate?= =?UTF-8?q?d=20template=20dictionary=20The=20"kwargs"=20and=20"args"=20par?= =?UTF-8?q?ameters=20are=20now=20excluded=20from=20the=20generated=20templ?= =?UTF-8?q?ate=20dictionary.=20This=20ensures=20that=20only=20the=20releva?= =?UTF-8?q?nt=20parameters=20are=20included=20in=20the=20template,=20impro?= =?UTF-8?q?ving=20the=20accuracy=20and=20usefulness=20of=20the=20generated?= =?UTF-8?q?=20template.?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/backend/langflow/utils/util.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/backend/langflow/utils/util.py b/src/backend/langflow/utils/util.py index 486f6c189..4769563bd 100644 --- a/src/backend/langflow/utils/util.py +++ b/src/backend/langflow/utils/util.py @@ -165,7 +165,7 @@ def build_template_from_method( "required": param.default == param.empty, } for name, param in params.items() - if name != "self" + if name not in ["self", "kwargs", "args"] }, } From 6fa295b8a8f7bc17d3f8bd054b6380b2fde4ceec Mon Sep 17 00:00:00 2001 From: Gabriel Luiz Freitas Almeida Date: Thu, 29 Jun 2023 18:37:52 -0300 Subject: [PATCH 109/169] =?UTF-8?q?=F0=9F=90=9B=20fix(memories.py):=20fix?= =?UTF-8?q?=20condition=20to=20add=20extra=20fields=20in=20MemoryFrontendN?= =?UTF-8?q?ode=20class=20=E2=9C=A8=20feat(memories.py):=20add=20show=20att?= =?UTF-8?q?ribute=20to=20entity=5Fstore=20field=20in=20MemoryFrontendNode?= =?UTF-8?q?=20class=20The=20condition=20to=20add=20extra=20fields=20in=20t?= =?UTF-8?q?he=20MemoryFrontendNode=20class=20has=20been=20fixed=20to=20cor?= =?UTF-8?q?rectly=20check=20if=20any=20of=20the=20base=20classes=20are=20i?= =?UTF-8?q?n=20a=20list=20of=20base=20message=20classes.=20Additionally,?= =?UTF-8?q?=20the=20show=20attribute=20has=20been=20added=20to=20the=20ent?= =?UTF-8?q?ity=5Fstore=20field=20in=20the=20MemoryFrontendNode=20class=20t?= =?UTF-8?q?o=20control=20its=20visibility.?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/backend/langflow/template/frontend_node/memories.py | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/src/backend/langflow/template/frontend_node/memories.py b/src/backend/langflow/template/frontend_node/memories.py index 6d9368823..37177c72e 100644 --- a/src/backend/langflow/template/frontend_node/memories.py +++ b/src/backend/langflow/template/frontend_node/memories.py @@ -11,7 +11,8 @@ class MemoryFrontendNode(FrontendNode): def add_extra_fields(self) -> None: # chat history should have another way to add common field? # prevent adding incorect field in ChatMessageHistory - if "BaseChatMessageHistory" in self.base_classes: + base_message_classes = ["BaseEntityStore", "BaseChatMessageHistory"] + if any(base_class in self.base_classes for base_class in base_message_classes): return # add return_messages field @@ -77,6 +78,10 @@ class MemoryFrontendNode(FrontendNode): field.required = False if field.name == "url": field.show = True + if field.name == "entity_store": + field.show = True + if name == "SQLiteEntityStore": + field.show = True class PostgresChatMessageHistoryFrontendNode(MemoryFrontendNode): From 4761eda9a046a45f8dbabfb2e430f8e6edfc3448 Mon Sep 17 00:00:00 2001 From: Gabriel Luiz Freitas Almeida Date: Thu, 29 Jun 2023 18:38:08 -0300 Subject: [PATCH 110/169] =?UTF-8?q?=F0=9F=94=80=20chore(base.py):=20add=20?= =?UTF-8?q?'SQLiteEntityStore'=20to=20'from=5Fmethod=5Fnodes'=20dictionary?= =?UTF-8?q?=20The=20'from=5Fmethod=5Fnodes'=20dictionary=20in=20the=20'Mem?= =?UTF-8?q?oryCreator'=20class=20in=20'base.py'=20has=20been=20updated=20t?= =?UTF-8?q?o=20include=20the=20'SQLiteEntityStore'=20class=20and=20its=20'?= =?UTF-8?q?=5F=5Finit=5F=5F'=20method.=20This=20change=20allows=20the=20'S?= =?UTF-8?q?QLiteEntityStore'=20class=20to=20be=20used=20as=20a=20memory=20?= =?UTF-8?q?node=20in=20the=20LangFlow=20application.?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/backend/langflow/interface/memories/base.py | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/src/backend/langflow/interface/memories/base.py b/src/backend/langflow/interface/memories/base.py index 4d7f8d5aa..0f97a02fe 100644 --- a/src/backend/langflow/interface/memories/base.py +++ b/src/backend/langflow/interface/memories/base.py @@ -13,7 +13,10 @@ from langflow.custom.customs import get_custom_nodes class MemoryCreator(LangChainTypeCreator): type_name: str = "memories" - from_method_nodes = {"ZepChatMessageHistory": "__init__"} + from_method_nodes = { + "ZepChatMessageHistory": "__init__", + "SQLiteEntityStore": "__init__", + } @property def frontend_node_class(self) -> Type[FrontendNode]: From 08c7bb523097e613dbc84e0d9278e25701f6a915 Mon Sep 17 00:00:00 2001 From: Gabriel Luiz Freitas Almeida Date: Thu, 29 Jun 2023 18:38:36 -0300 Subject: [PATCH 111/169] =?UTF-8?q?=F0=9F=90=9B=20fix(loading.py):=20catch?= =?UTF-8?q?=20additional=20exception=20when=20object=20has=20no=20'conn'?= =?UTF-8?q?=20field=20to=20improve=20error=20handling=20The=20code=20now?= =?UTF-8?q?=20catches=20an=20additional=20exception=20when=20the=20object?= =?UTF-8?q?=20does=20not=20have=20a=20'conn'=20field.=20This=20improves=20?= =?UTF-8?q?the=20error=20handling=20by=20providing=20a=20more=20specific?= =?UTF-8?q?=20error=20message=20when=20building=20a=20connection=20to=20th?= =?UTF-8?q?e=20database=20fails.?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/backend/langflow/interface/initialize/loading.py | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/src/backend/langflow/interface/initialize/loading.py b/src/backend/langflow/interface/initialize/loading.py index 8503290b1..046ca0df6 100644 --- a/src/backend/langflow/interface/initialize/loading.py +++ b/src/backend/langflow/interface/initialize/loading.py @@ -93,8 +93,10 @@ def instantiate_memory(node_type, class_object, params): return class_object(**params) # I want to catch a specific attribute error that happens # when the object does not have a cursor attribute - except AttributeError as exc: - if "object has no attribute 'cursor'" in str(exc): + except Exception as exc: + if "object has no attribute 'cursor'" in str( + exc + ) or 'object has no field "conn"' in str(exc): raise AttributeError( f"Failed to build connection to database. Please check your connection string and try again. Error: {exc}" ) from exc From 2b33334de6699f996547ab457c2c0c4cdc2f061a Mon Sep 17 00:00:00 2001 From: Gabriel Luiz Freitas Almeida Date: Thu, 29 Jun 2023 18:41:23 -0300 Subject: [PATCH 112/169] =?UTF-8?q?=F0=9F=94=92=20chore(poetry.lock):=20up?= =?UTF-8?q?date=20google-api-python-client=20version=20to=202.91.0=20?= =?UTF-8?q?=F0=9F=94=92=20chore(poetry.lock):=20update=20joblib=20version?= =?UTF-8?q?=20to=201.3.1=20The=20versions=20of=20the=20anthropic,=20google?= =?UTF-8?q?-api-python-client,=20and=20joblib=20packages=20have=20been=20u?= =?UTF-8?q?pdated=20to=20their=20latest=20versions.=20This=20ensures=20tha?= =?UTF-8?q?t=20the=20application=20is=20using=20the=20most=20recent=20bug?= =?UTF-8?q?=20fixes,=20improvements,=20and=20features=20provided=20by=20th?= =?UTF-8?q?ese=20packages.?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- poetry.lock | 20 ++++++++++---------- 1 file changed, 10 insertions(+), 10 deletions(-) diff --git a/poetry.lock b/poetry.lock index c1d7dda7e..a443d85b0 100644 --- a/poetry.lock +++ b/poetry.lock @@ -150,14 +150,14 @@ files = [ [[package]] name = "anthropic" -version = "0.3.0" +version = "0.3.1" description = "Client library for the anthropic API" category = "main" optional = false python-versions = ">=3.7,<4.0" files = [ - {file = "anthropic-0.3.0-py3-none-any.whl", hash = "sha256:13d1d5eb6c835dfa79922eef66589d602c09294105a2951bc7f4284a0581090c"}, - {file = "anthropic-0.3.0.tar.gz", hash = "sha256:e239046e9276486391152f147c81d990b226facd4434ad968585912ffff4e031"}, + {file = "anthropic-0.3.1-py3-none-any.whl", hash = "sha256:bbb534e81018aa756fc4cc79b76b802871c99743a309aa3278f955999aa62d08"}, + {file = "anthropic-0.3.1.tar.gz", hash = "sha256:6714ae9192721278189bc619364b52bf42fd00d35f22172b9f8e4090382399ed"}, ] [package.dependencies] @@ -1606,14 +1606,14 @@ grpcio-gcp = ["grpcio-gcp (>=0.2.2,<1.0.dev0)"] [[package]] name = "google-api-python-client" -version = "2.90.0" +version = "2.91.0" description = "Google API Client Library for Python" category = "main" optional = false python-versions = ">=3.7" files = [ - {file = "google-api-python-client-2.90.0.tar.gz", hash = "sha256:cbcb3ba8be37c6806676a49df16ac412077e5e5dc7fa967941eff977b31fba03"}, - {file = "google_api_python_client-2.90.0-py2.py3-none-any.whl", hash = "sha256:4a41ffb7797d4f28e44635fb1e7076240b741c6493e7c3233c0e4421cec7c913"}, + {file = "google-api-python-client-2.91.0.tar.gz", hash = "sha256:d9385ad6e7f95eecd40f7c81e3abfe4b6ad3a84f2c16bcdb66fb7b8dd814ed56"}, + {file = "google_api_python_client-2.91.0-py2.py3-none-any.whl", hash = "sha256:6959d21d4b20c0f65c69662ca7b6a8a02fc08f3e7f72d70b28ae3e6e3a5f9ab2"}, ] [package.dependencies] @@ -2584,14 +2584,14 @@ i18n = ["Babel (>=2.7)"] [[package]] name = "joblib" -version = "1.3.0" +version = "1.3.1" description = "Lightweight pipelining with Python functions" category = "main" optional = false python-versions = ">=3.7" files = [ - {file = "joblib-1.3.0-py3-none-any.whl", hash = "sha256:172d56d4c43dd6bcd953bea213018c4084cf754963bbf54b8dae40faea716b98"}, - {file = "joblib-1.3.0.tar.gz", hash = "sha256:0b12a65dc76c530dbd790dd92881f75c40932b4254a7c8e608a868df408ca0a3"}, + {file = "joblib-1.3.1-py3-none-any.whl", hash = "sha256:89cf0529520e01b3de7ac7b74a8102c90d16d54c64b5dd98cafcd14307fdf915"}, + {file = "joblib-1.3.1.tar.gz", hash = "sha256:1f937906df65329ba98013dc9692fe22a4c5e4a648112de500508b18a21b41e3"}, ] [[package]] @@ -7500,4 +7500,4 @@ deploy = ["langchain-serve"] [metadata] lock-version = "2.0" python-versions = ">=3.9,<3.12" -content-hash = "3875f61e1228dfac1574076a6c3755703463fa6ed1fe737d064a171be94259d4" +content-hash = "e3d0c8e7e89bf23d24b13e187f49a7d1b2dd273cd823f2adff33762190f79bb8" From fdb998688a6603a9ad404ee9652e9085542933f8 Mon Sep 17 00:00:00 2001 From: Cristhian Zanforlin Lousa Date: Thu, 29 Jun 2023 18:42:09 -0300 Subject: [PATCH 113/169] =?UTF-8?q?=F0=9F=90=9B=20fix(codeAreaComponent):?= =?UTF-8?q?=20update=20initial=20state=20of=20myValue=20to=20handle=20non-?= =?UTF-8?q?string=20values=20properly?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 🐛 fix(constants.tsx): refactor getCurlCode and getPythonCode to use buildTweakObject function for generating tweak object 🐛 fix(ApiModal): update logic for opening accordions based on tweak.current length and closeEdit value --- .../components/codeAreaComponent/index.tsx | 4 +-- src/frontend/src/constants.tsx | 25 ++++++++++++++++--- src/frontend/src/modals/ApiModal/index.tsx | 23 ++++++++++------- 3 files changed, 38 insertions(+), 14 deletions(-) diff --git a/src/frontend/src/components/codeAreaComponent/index.tsx b/src/frontend/src/components/codeAreaComponent/index.tsx index 6fec7cd27..ff786ea99 100644 --- a/src/frontend/src/components/codeAreaComponent/index.tsx +++ b/src/frontend/src/components/codeAreaComponent/index.tsx @@ -12,7 +12,7 @@ export default function CodeAreaComponent({ disabled, editNode = false, }: TextAreaComponentType) { - const [myValue, setMyValue] = useState(value); + const [myValue, setMyValue] = useState(typeof value == "string" ? value : JSON.stringify(value)); const { openPopUp } = useContext(PopUpContext); useEffect(() => { if (disabled) { @@ -22,7 +22,7 @@ export default function CodeAreaComponent({ }, [disabled, onChange]); useEffect(() => { - setMyValue(value); + setMyValue(typeof value == "string" ? value : JSON.stringify(value)); }, [value]); return ( diff --git a/src/frontend/src/constants.tsx b/src/frontend/src/constants.tsx index 9bfb4bcd5..a20e5c6c1 100644 --- a/src/frontend/src/constants.tsx +++ b/src/frontend/src/constants.tsx @@ -71,7 +71,7 @@ FLOW_ID = "${flowId}" # You can tweak the flow by adding a tweaks dictionary # e.g {"OpenAI-XXXXX": {"model_name": "gpt-4"}} TWEAKS = ${ - tweak && tweak.length > 0 ? JSON.stringify(tweak, null, 2).replace(/\\/g, '') : JSON.stringify(tweaks, null, 2) + tweak && tweak.length > 0 ? buildTweakObject(tweak): JSON.stringify(tweaks, null, 2) } def run_flow(message: str, flow_id: str, tweaks: dict = None) -> dict: @@ -111,7 +111,7 @@ export const getCurlCode = (flow: FlowType, tweak?): string => { }/api/v1/process/${flowId} \\ -H 'Content-Type: application/json' \\ -d '{"inputs": {"input": message}, "tweaks": ${ - tweak && tweak.length > 0 ? JSON.stringify(tweak, null, 2).replace(/\\/g, '') : JSON.stringify(tweaks, null, 2) + tweak && tweak.length > 0 ? buildTweakObject(tweak) : JSON.stringify(tweaks, null, 2) }}'`; }; /** @@ -124,13 +124,32 @@ export const getPythonCode = (flow: FlowType, tweak?): string => { const tweaks = buildTweaks(flow); return `from langflow import load_flow_from_json TWEAKS = ${ - tweak && tweak.length > 0 ? JSON.stringify(tweak, null, 2).replace(/\\/g, '') : JSON.stringify(tweaks, null, 2) + tweak && tweak.length > 0 ? buildTweakObject(tweak) : JSON.stringify(tweaks, null, 2) } flow = load_flow_from_json("${flowName}.json", tweaks=TWEAKS) # Now you can use it like any chain flow("Hey, have you heard of LangFlow?")`; }; +function buildTweakObject(tweak){ + tweak.forEach(el => { + Object.keys(el).forEach(key => { + for (let kp in el[key]) { + try{ + el[key][kp] = JSON.parse(el[key][kp]); + console.log(el[key][kp]); + } + catch{} + } + }) + }); + + const tweakString = JSON.stringify(tweak, null, 2); + console.log(tweakString); + + return tweakString; +} + /** * The base text for subtitle of Import Dialog * @constant diff --git a/src/frontend/src/modals/ApiModal/index.tsx b/src/frontend/src/modals/ApiModal/index.tsx index 2377c212b..545a26d01 100644 --- a/src/frontend/src/modals/ApiModal/index.tsx +++ b/src/frontend/src/modals/ApiModal/index.tsx @@ -103,9 +103,14 @@ export default function ApiModal({ flow }: { flow: FlowType }) { useEffect(() => { if (closeEdit !== "") { - setActiveTab("3"); tweak.current = getTweak; - openAccordions(); + if(tweak.current.length > 0){ + setActiveTab("3"); + openAccordions(); + } + else{ + startTweaks(); + } } else { startTweaks(); } @@ -245,14 +250,14 @@ export default function ApiModal({ flow }: { flow: FlowType }) { function openAccordions() { let accordionsToOpen = []; - tweak.current.forEach((el) => { - Object.keys(el).forEach((key) => { - if (Object.keys(el[key]).length > 0) { - accordionsToOpen.push(key); - setOpenAccordion(accordionsToOpen); - } + tweak.current.forEach((el) => { + Object.keys(el).forEach((key) => { + if (Object.keys(el[key]).length > 0) { + accordionsToOpen.push(key); + setOpenAccordion(accordionsToOpen); + } + }); }); - }); } return ( From 82c469d3c29e24fe9c8e40127a46c271479f8714 Mon Sep 17 00:00:00 2001 From: Cristhian Zanforlin Lousa Date: Thu, 29 Jun 2023 18:42:40 -0300 Subject: [PATCH 114/169] =?UTF-8?q?=F0=9F=94=A5=20refactor(constants.tsx):?= =?UTF-8?q?=20remove=20console.log=20statements=20for=20better=20code=20cl?= =?UTF-8?q?eanliness=20and=20performance?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/frontend/src/constants.tsx | 3 --- 1 file changed, 3 deletions(-) diff --git a/src/frontend/src/constants.tsx b/src/frontend/src/constants.tsx index a20e5c6c1..b4a275d17 100644 --- a/src/frontend/src/constants.tsx +++ b/src/frontend/src/constants.tsx @@ -137,7 +137,6 @@ function buildTweakObject(tweak){ for (let kp in el[key]) { try{ el[key][kp] = JSON.parse(el[key][kp]); - console.log(el[key][kp]); } catch{} } @@ -145,8 +144,6 @@ function buildTweakObject(tweak){ }); const tweakString = JSON.stringify(tweak, null, 2); - console.log(tweakString); - return tweakString; } From 4f9466288101fb9017f72c55bc6138d173881979 Mon Sep 17 00:00:00 2001 From: Gabriel Luiz Freitas Almeida Date: Thu, 29 Jun 2023 18:43:24 -0300 Subject: [PATCH 115/169] =?UTF-8?q?=F0=9F=93=9D=20docs(config.yaml):=20add?= =?UTF-8?q?=20documentation=20for=20ConversationEntityMemory=20integration?= =?UTF-8?q?=20The=20ConversationEntityMemory=20integration=20is=20now=20do?= =?UTF-8?q?cumented=20in=20the=20config.yaml=20file.=20This=20provides=20a?= =?UTF-8?q?=20link=20to=20the=20documentation=20for=20using=20the=20Conver?= =?UTF-8?q?sationEntityMemory=20module=20with=20SQLite=20as=20the=20underl?= =?UTF-8?q?ying=20storage.=20This=20change=20improves=20the=20clarity=20an?= =?UTF-8?q?d=20accessibility=20of=20the=20documentation=20for=20this=20int?= =?UTF-8?q?egration.?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/backend/langflow/config.yaml | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/src/backend/langflow/config.yaml b/src/backend/langflow/config.yaml index bc673947e..8d60876fa 100644 --- a/src/backend/langflow/config.yaml +++ b/src/backend/langflow/config.yaml @@ -123,6 +123,11 @@ memories: # https://github.com/supabase-community/supabase-py/issues/482 # ZepChatMessageHistory: # documentation: "https://python.langchain.com/docs/modules/memory/integrations/zep_memory" + ConversationEntityMemory: + documentation: "https://python.langchain.com/docs/modules/memory/integrations/entity_memory_with_sqlite" + # https://github.com/hwchase17/langchain/issues/6091 + # SQLiteEntityStore: + # documentation: "https://python.langchain.com/docs/modules/memory/integrations/entity_memory_with_sqlite" PostgresChatMessageHistory: documentation: "https://python.langchain.com/docs/modules/memory/integrations/postgres_chat_message_history" ConversationBufferMemory: From eb53798c4121ddf6bc628ed636fe36d30d18f763 Mon Sep 17 00:00:00 2001 From: Gabriel Luiz Freitas Almeida Date: Thu, 29 Jun 2023 18:43:37 -0300 Subject: [PATCH 116/169] =?UTF-8?q?=F0=9F=90=9B=20fix(utils.ts):=20update?= =?UTF-8?q?=20color=20code=20for=20"retrievers"=20in=20nodeColors=20object?= =?UTF-8?q?=20The=20color=20code=20for=20the=20"retrievers"=20category=20i?= =?UTF-8?q?n=20the=20nodeColors=20object=20has=20been=20updated=20from=20"?= =?UTF-8?q?#F5B85A"=20to=20"#e6b25a".=20This=20change=20was=20made=20to=20?= =?UTF-8?q?ensure=20consistency=20and=20improve=20the=20visual=20represent?= =?UTF-8?q?ation=20of=20the=20"retrievers"=20category.?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/frontend/src/utils.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/frontend/src/utils.ts b/src/frontend/src/utils.ts index d8198ec3d..b50cad2bd 100644 --- a/src/frontend/src/utils.ts +++ b/src/frontend/src/utils.ts @@ -122,7 +122,7 @@ export const nodeColors: { [char: string]: string } = { toolkits: "#DB2C2C", wrappers: "#E6277A", utilities: "#31A3CC", - retrievers: "#F5B85A", + retrievers: "#e6b25a", unknown: "#9CA3AF", }; From 879390488ea141b63a762036b6fab3e32803b2b2 Mon Sep 17 00:00:00 2001 From: Gabriel Luiz Freitas Almeida Date: Thu, 29 Jun 2023 19:06:50 -0300 Subject: [PATCH 117/169] =?UTF-8?q?=F0=9F=94=96=20chore(pyproject.toml):?= =?UTF-8?q?=20update=20package=20version=20to=200.2.7=20The=20package=20ve?= =?UTF-8?q?rsion=20has=20been=20updated=20from=200.2.6=20to=200.2.7.=20Thi?= =?UTF-8?q?s=20change=20is=20made=20to=20reflect=20the=20latest=20changes?= =?UTF-8?q?=20and=20improvements=20in=20the=20package.?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- pyproject.toml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pyproject.toml b/pyproject.toml index 9d549a405..dfcb53cd3 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -1,6 +1,6 @@ [tool.poetry] name = "langflow" -version = "0.2.6" +version = "0.2.7" description = "A Python package with a built-in web application" authors = ["Logspace "] maintainers = [ From b188400517c6124f439fe649d432dc8109b2bff4 Mon Sep 17 00:00:00 2001 From: Gabriel Luiz Freitas Almeida Date: Thu, 29 Jun 2023 19:36:04 -0300 Subject: [PATCH 118/169] =?UTF-8?q?=F0=9F=90=9B=20fix(loading.py):=20impro?= =?UTF-8?q?ve=20error=20message=20formatting=20when=20failing=20to=20build?= =?UTF-8?q?=20connection=20to=20database=20=F0=9F=90=9B=20fix(base.py):=20?= =?UTF-8?q?add=20optional=20'name'=20parameter=20to=20the=20format=20metho?= =?UTF-8?q?d=20in=20FieldFormatter=20In=20loading.py,=20the=20error=20mess?= =?UTF-8?q?age=20when=20failing=20to=20build=20a=20connection=20to=20the?= =?UTF-8?q?=20database=20is=20now=20formatted=20in=20a=20more=20readable?= =?UTF-8?q?=20way.=20This=20improves=20the=20clarity=20of=20the=20error=20?= =?UTF-8?q?message=20and=20makes=20it=20easier=20to=20identify=20the=20cau?= =?UTF-8?q?se=20of=20the=20issue.?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit In base.py, the format method in FieldFormatter now accepts an optional 'name' parameter. This allows for more flexibility when formatting the field and provides the ability to include the field name in the formatting process if needed. --- src/backend/langflow/interface/initialize/loading.py | 5 ++++- .../langflow/template/frontend_node/formatter/base.py | 3 ++- 2 files changed, 6 insertions(+), 2 deletions(-) diff --git a/src/backend/langflow/interface/initialize/loading.py b/src/backend/langflow/interface/initialize/loading.py index 046ca0df6..08d17d9fa 100644 --- a/src/backend/langflow/interface/initialize/loading.py +++ b/src/backend/langflow/interface/initialize/loading.py @@ -98,7 +98,10 @@ def instantiate_memory(node_type, class_object, params): exc ) or 'object has no field "conn"' in str(exc): raise AttributeError( - f"Failed to build connection to database. Please check your connection string and try again. Error: {exc}" + ( + "Failed to build connection to database." + f" Please check your connection string and try again. Error: {exc}" + ) ) from exc raise exc diff --git a/src/backend/langflow/template/frontend_node/formatter/base.py b/src/backend/langflow/template/frontend_node/formatter/base.py index 653480e03..67e906593 100644 --- a/src/backend/langflow/template/frontend_node/formatter/base.py +++ b/src/backend/langflow/template/frontend_node/formatter/base.py @@ -1,9 +1,10 @@ from abc import ABC, abstractmethod +from typing import Optional from langflow.template.field.base import TemplateField class FieldFormatter(ABC): @abstractmethod - def format(self, field: TemplateField): + def format(self, field: TemplateField, name: Optional[str]) -> None: pass From 60032d614626a8d416411f54ab6f9c0c78ca3182 Mon Sep 17 00:00:00 2001 From: Gabriel Luiz Freitas Almeida Date: Thu, 29 Jun 2023 19:36:22 -0300 Subject: [PATCH 119/169] =?UTF-8?q?=F0=9F=90=9B=20fix(AccordionComponent):?= =?UTF-8?q?=20fix=20formatting=20and=20add=20missing=20semicolons=20to=20i?= =?UTF-8?q?mprove=20code=20readability=20and=20maintainability=20?= =?UTF-8?q?=F0=9F=90=9B=20fix(codeAreaComponent):=20fix=20formatting=20and?= =?UTF-8?q?=20add=20missing=20semicolons=20to=20improve=20code=20readabili?= =?UTF-8?q?ty=20and=20maintainability=20=F0=9F=90=9B=20fix(dropdownCompone?= =?UTF-8?q?nt):=20fix=20formatting=20and=20add=20missing=20semicolons=20to?= =?UTF-8?q?=20improve=20code=20readability=20and=20maintainability=20?= =?UTF-8?q?=F0=9F=90=9B=20fix(floatComponent):=20fix=20formatting=20and=20?= =?UTF-8?q?add=20missing=20semicolons=20to=20improve=20code=20readability?= =?UTF-8?q?=20and=20maintainability=20=F0=9F=90=9B=20fix(inputFileComponen?= =?UTF-8?q?t):=20fix=20formatting=20and=20add=20missing=20semicolons=20to?= =?UTF-8?q?=20improve=20code=20readability=20and=20maintainability=20?= =?UTF-8?q?=F0=9F=90=9B=20fix(inputListComponent):=20fix=20formatting=20an?= =?UTF-8?q?d=20add=20missing=20semicolons=20to=20improve=20code=20readabil?= =?UTF-8?q?ity=20and=20maintainability=20=F0=9F=90=9B=20fix(intComponent):?= =?UTF-8?q?=20fix=20formatting=20and=20add=20missing=20semicolons=20to=20i?= =?UTF-8?q?mprove=20code=20readability=20and=20maintainability=20?= =?UTF-8?q?=F0=9F=90=9B=20fix(promptComponent):=20fix=20formatting=20and?= =?UTF-8?q?=20add=20missing=20semicolons=20to=20improve=20code=20readabili?= =?UTF-8?q?ty=20and=20maintainability=20=F0=9F=90=9B=20fix(textAreaCompone?= =?UTF-8?q?nt):=20fix=20formatting=20and=20add=20missing=20semicolons=20to?= =?UTF-8?q?=20improve=20code=20readability=20and=20maintainability=20?= =?UTF-8?q?=F0=9F=90=9B=20fix(ui/accordion.tsx):=20fix=20formatting=20and?= =?UTF-8?q?=20add=20missing=20semicolons=20to=20improve=20code=20readabili?= =?UTF-8?q?ty=20and=20maintainability?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit The changes were made to fix formatting issues and add missing semicolons in the code. This improves code readability and maintainability, making it easier for developers to understand and work with the code. 🐛 fix(constants.tsx): fix formatting and indentation issues in the buildTweakObject function 🐛 fix(popUpContext.tsx): remove unnecessary empty line 🐛 fix(tabsContext.tsx): remove unnecessary empty line 🐛 fix(ApiModal/index.tsx): fix formatting and indentation issues 🐛 fix(codeAreaModal/index.tsx): fix formatting and indentation issues 🐛 fix(types/components/index.ts): remove unnecessary empty line The changes in constants.tsx fix formatting and indentation issues in the buildTweakObject function to improve code readability. The changes in popUpContext.tsx, tabsContext.tsx, ApiModal/index.tsx, codeAreaModal/index.tsx, and types/components/index.ts fix formatting and indentation issues to ensure consistent code style. --- .../components/AccordionComponent/index.tsx | 14 +++++----- .../components/codeAreaComponent/index.tsx | 7 +++-- .../components/dropdownComponent/index.tsx | 12 ++++----- .../src/components/floatComponent/index.tsx | 3 ++- .../components/inputFileComponent/index.tsx | 3 ++- .../components/inputListComponent/index.tsx | 7 ++--- .../src/components/intComponent/index.tsx | 3 ++- .../src/components/promptComponent/index.tsx | 3 ++- .../components/textAreaComponent/index.tsx | 3 ++- src/frontend/src/components/ui/accordion.tsx | 27 +++++++++---------- src/frontend/src/constants.tsx | 27 +++++++++++-------- src/frontend/src/contexts/popUpContext.tsx | 6 ++--- src/frontend/src/contexts/tabsContext.tsx | 2 +- src/frontend/src/modals/ApiModal/index.tsx | 19 +++++++------ .../src/modals/codeAreaModal/index.tsx | 2 +- src/frontend/src/types/components/index.ts | 3 +-- 16 files changed, 76 insertions(+), 65 deletions(-) diff --git a/src/frontend/src/components/AccordionComponent/index.tsx b/src/frontend/src/components/AccordionComponent/index.tsx index 825a2c19d..f03a2ad5f 100644 --- a/src/frontend/src/components/AccordionComponent/index.tsx +++ b/src/frontend/src/components/AccordionComponent/index.tsx @@ -17,15 +17,17 @@ export default function AccordionComponent({ children, open = [], }: AccordionComponentType) { - const [value, setValue] = useState(open.length == 0 ? "" : getOpenAccordion()); + const [value, setValue] = useState( + open.length == 0 ? "" : getOpenAccordion() + ); - function getOpenAccordion(){ + function getOpenAccordion() { let value = ""; - open.forEach(el => { - if(el == trigger){ + open.forEach((el) => { + if (el == trigger) { value = trigger; - } - }) + } + }); return value; } diff --git a/src/frontend/src/components/codeAreaComponent/index.tsx b/src/frontend/src/components/codeAreaComponent/index.tsx index ff786ea99..b42f1489b 100644 --- a/src/frontend/src/components/codeAreaComponent/index.tsx +++ b/src/frontend/src/components/codeAreaComponent/index.tsx @@ -12,7 +12,9 @@ export default function CodeAreaComponent({ disabled, editNode = false, }: TextAreaComponentType) { - const [myValue, setMyValue] = useState(typeof value == "string" ? value : JSON.stringify(value)); + const [myValue, setMyValue] = useState( + typeof value == "string" ? value : JSON.stringify(value) + ); const { openPopUp } = useContext(PopUpContext); useEffect(() => { if (disabled) { @@ -47,7 +49,8 @@ export default function CodeAreaComponent({ className={ editNode ? "truncate cursor-pointer placeholder:text-center text-gray-500 block w-full pt-0.5 pb-0.5 form-input dark:bg-gray-900 dark:text-gray-300 dark:border-gray-600 rounded-md border-gray-300 border-1 shadow-sm sm:text-sm" + - INPUT_STYLE + (disabled ? " bg-gray-200 " : "") + INPUT_STYLE + + (disabled ? " bg-gray-200 " : "") : "truncate block w-full text-gray-500 px-3 py-2 rounded-md border border-gray-300 dark:border-gray-700 shadow-sm sm:text-sm" + INPUT_STYLE + (disabled ? " bg-gray-200" : "") diff --git a/src/frontend/src/components/dropdownComponent/index.tsx b/src/frontend/src/components/dropdownComponent/index.tsx index d1292525d..fab9cad93 100644 --- a/src/frontend/src/components/dropdownComponent/index.tsx +++ b/src/frontend/src/components/dropdownComponent/index.tsx @@ -13,7 +13,7 @@ export default function Dropdown({ onSelect, editNode = false, numberOfOptions = 0, - apiModal = false + apiModal = false, }: DropDownComponentType) { const { closePopUp } = useContext(PopUpContext); @@ -67,14 +67,12 @@ export default function Dropdown({ leaveTo="opacity-0" > {options.map((option, id) => ( , @@ -17,8 +16,8 @@ const AccordionItem = React.forwardRef< className={cn("border-b", className)} {...props} /> -)) -AccordionItem.displayName = "AccordionItem" +)); +AccordionItem.displayName = "AccordionItem"; const AccordionTrigger = React.forwardRef< React.ElementRef, @@ -37,8 +36,8 @@ const AccordionTrigger = React.forwardRef< -)) -AccordionTrigger.displayName = AccordionPrimitive.Trigger.displayName +)); +AccordionTrigger.displayName = AccordionPrimitive.Trigger.displayName; const AccordionContent = React.forwardRef< React.ElementRef, @@ -54,7 +53,7 @@ const AccordionContent = React.forwardRef< >
{children}
-)) -AccordionContent.displayName = AccordionPrimitive.Content.displayName +)); +AccordionContent.displayName = AccordionPrimitive.Content.displayName; -export { Accordion, AccordionItem, AccordionTrigger, AccordionContent } +export { Accordion, AccordionItem, AccordionTrigger, AccordionContent }; diff --git a/src/frontend/src/constants.tsx b/src/frontend/src/constants.tsx index b4a275d17..49eb583b7 100644 --- a/src/frontend/src/constants.tsx +++ b/src/frontend/src/constants.tsx @@ -71,7 +71,9 @@ FLOW_ID = "${flowId}" # You can tweak the flow by adding a tweaks dictionary # e.g {"OpenAI-XXXXX": {"model_name": "gpt-4"}} TWEAKS = ${ - tweak && tweak.length > 0 ? buildTweakObject(tweak): JSON.stringify(tweaks, null, 2) + tweak && tweak.length > 0 + ? buildTweakObject(tweak) + : JSON.stringify(tweaks, null, 2) } def run_flow(message: str, flow_id: str, tweaks: dict = None) -> dict: @@ -111,7 +113,9 @@ export const getCurlCode = (flow: FlowType, tweak?): string => { }/api/v1/process/${flowId} \\ -H 'Content-Type: application/json' \\ -d '{"inputs": {"input": message}, "tweaks": ${ - tweak && tweak.length > 0 ? buildTweakObject(tweak) : JSON.stringify(tweaks, null, 2) + tweak && tweak.length > 0 + ? buildTweakObject(tweak) + : JSON.stringify(tweaks, null, 2) }}'`; }; /** @@ -124,25 +128,26 @@ export const getPythonCode = (flow: FlowType, tweak?): string => { const tweaks = buildTweaks(flow); return `from langflow import load_flow_from_json TWEAKS = ${ - tweak && tweak.length > 0 ? buildTweakObject(tweak) : JSON.stringify(tweaks, null, 2) + tweak && tweak.length > 0 + ? buildTweakObject(tweak) + : JSON.stringify(tweaks, null, 2) } flow = load_flow_from_json("${flowName}.json", tweaks=TWEAKS) # Now you can use it like any chain flow("Hey, have you heard of LangFlow?")`; }; -function buildTweakObject(tweak){ - tweak.forEach(el => { - Object.keys(el).forEach(key => { +function buildTweakObject(tweak) { + tweak.forEach((el) => { + Object.keys(el).forEach((key) => { for (let kp in el[key]) { - try{ + try { el[key][kp] = JSON.parse(el[key][kp]); - } - catch{} + } catch {} } - }) + }); }); - + const tweakString = JSON.stringify(tweak, null, 2); return tweakString; } diff --git a/src/frontend/src/contexts/popUpContext.tsx b/src/frontend/src/contexts/popUpContext.tsx index a59eb0f9f..d46f51f00 100644 --- a/src/frontend/src/contexts/popUpContext.tsx +++ b/src/frontend/src/contexts/popUpContext.tsx @@ -13,7 +13,6 @@ interface PopUpProviderProps { children: React.ReactNode; } - const PopUpProvider = ({ children }: PopUpProviderProps) => { const [popUpElements, setPopUpElements] = useState([]); @@ -27,9 +26,10 @@ const PopUpProvider = ({ children }: PopUpProviderProps) => { const [closeEdit, setCloseEdit] = useState(""); - return ( - + {children} {popUpElements[0]} diff --git a/src/frontend/src/contexts/tabsContext.tsx b/src/frontend/src/contexts/tabsContext.tsx index 5ce455273..3b20ded95 100644 --- a/src/frontend/src/contexts/tabsContext.tsx +++ b/src/frontend/src/contexts/tabsContext.tsx @@ -648,7 +648,7 @@ export function TabsProvider({ children }: { children: ReactNode }) { setTabsState, paste, getTweak, - setTweak + setTweak, }} > {children} diff --git a/src/frontend/src/modals/ApiModal/index.tsx b/src/frontend/src/modals/ApiModal/index.tsx index 545a26d01..5acd42ec0 100644 --- a/src/frontend/src/modals/ApiModal/index.tsx +++ b/src/frontend/src/modals/ApiModal/index.tsx @@ -104,11 +104,10 @@ export default function ApiModal({ flow }: { flow: FlowType }) { useEffect(() => { if (closeEdit !== "") { tweak.current = getTweak; - if(tweak.current.length > 0){ + if (tweak.current.length > 0) { setActiveTab("3"); openAccordions(); - } - else{ + } else { startTweaks(); } } else { @@ -250,14 +249,14 @@ export default function ApiModal({ flow }: { flow: FlowType }) { function openAccordions() { let accordionsToOpen = []; - tweak.current.forEach((el) => { - Object.keys(el).forEach((key) => { - if (Object.keys(el[key]).length > 0) { - accordionsToOpen.push(key); - setOpenAccordion(accordionsToOpen); - } - }); + tweak.current.forEach((el) => { + Object.keys(el).forEach((key) => { + if (Object.keys(el[key]).length > 0) { + accordionsToOpen.push(key); + setOpenAccordion(accordionsToOpen); + } }); + }); } return ( diff --git a/src/frontend/src/modals/codeAreaModal/index.tsx b/src/frontend/src/modals/codeAreaModal/index.tsx index ec6d3d07c..bc814a9ab 100644 --- a/src/frontend/src/modals/codeAreaModal/index.tsx +++ b/src/frontend/src/modals/codeAreaModal/index.tsx @@ -34,7 +34,7 @@ export default function CodeAreaModal({ const [code, setCode] = useState(value); const { dark } = useContext(darkContext); const { setErrorData, setSuccessData } = useContext(alertContext); - const { closePopUp,setCloseEdit } = useContext(PopUpContext); + const { closePopUp, setCloseEdit } = useContext(PopUpContext); const ref = useRef(); function setModalOpen(x: boolean) { setOpen(x); diff --git a/src/frontend/src/types/components/index.ts b/src/frontend/src/types/components/index.ts index 4437f48e3..598f2af41 100644 --- a/src/frontend/src/types/components/index.ts +++ b/src/frontend/src/types/components/index.ts @@ -44,7 +44,6 @@ export type InputListComponentType = { disabled: boolean; editNode?: boolean; onAddInput?: (value?: string[]) => void; - }; export type TextAreaComponentType = { @@ -114,7 +113,7 @@ export type RadialProgressType = { color?: string; }; -export type AccordionComponentType = { +export type AccordionComponentType = { children?: ReactElement; open?: string[]; trigger?: string; From 9fe13ca52da28982789ee309d098d1669f4e7ed8 Mon Sep 17 00:00:00 2001 From: Gabriel Luiz Freitas Almeida Date: Thu, 29 Jun 2023 19:46:08 -0300 Subject: [PATCH 120/169] =?UTF-8?q?=F0=9F=94=80=20chore(test=5Fllms=5Ftemp?= =?UTF-8?q?late.py):=20rename=20base=20class=20from=20"Serializable"=20to?= =?UTF-8?q?=20"BaseLLM"=20for=20clarity=20and=20consistency=20The=20base?= =?UTF-8?q?=20class=20"Serializable"=20has=20been=20renamed=20to=20"BaseLL?= =?UTF-8?q?M"=20to=20provide=20a=20more=20descriptive=20and=20consistent?= =?UTF-8?q?=20name=20for=20the=20class.=20This=20change=20improves=20clari?= =?UTF-8?q?ty=20and=20maintainability=20of=20the=20code.?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- tests/test_llms_template.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tests/test_llms_template.py b/tests/test_llms_template.py index 859b722e1..7679ba9c0 100644 --- a/tests/test_llms_template.py +++ b/tests/test_llms_template.py @@ -516,7 +516,7 @@ def test_chat_open_ai(client: TestClient): == "Wrapper around OpenAI Chat large language models." # noqa E501 ) assert set(model["base_classes"]) == { - "Serializable", + "BaseLLM", "BaseChatModel", "ChatOpenAI", "BaseLanguageModel", From ca32bc3ab544dbf79b724ddb0d220d73f8ff7952 Mon Sep 17 00:00:00 2001 From: Gabriel Luiz Freitas Almeida Date: Thu, 29 Jun 2023 19:46:33 -0300 Subject: [PATCH 121/169] =?UTF-8?q?=F0=9F=93=A6=20chore(poetry.lock):=20up?= =?UTF-8?q?date=20strenum=20package=20version=20to=200.4.15=20The=20strenu?= =?UTF-8?q?m=20package=20has=20been=20updated=20from=20version=200.4.12=20?= =?UTF-8?q?to=20version=200.4.15.=20This=20update=20may=20include=20bug=20?= =?UTF-8?q?fixes,=20performance=20improvements,=20or=20new=20features.?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- poetry.lock | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/poetry.lock b/poetry.lock index a443d85b0..e8bf033b7 100644 --- a/poetry.lock +++ b/poetry.lock @@ -6171,14 +6171,14 @@ typing-extensions = ">=4.2.0,<5.0.0" [[package]] name = "strenum" -version = "0.4.12" +version = "0.4.15" description = "An Enum that inherits from str." category = "main" optional = false python-versions = "*" files = [ - {file = "StrEnum-0.4.12-py3-none-any.whl", hash = "sha256:d75cdebe07e2537989a925089a248673a34e8a6e9d8fe6846fd04b1aa2e1f44f"}, - {file = "StrEnum-0.4.12.tar.gz", hash = "sha256:75e234fea070aabae9b03b63385880e286defdcdf6fb2933cde4f964f7763544"}, + {file = "StrEnum-0.4.15-py3-none-any.whl", hash = "sha256:a30cda4af7cc6b5bf52c8055bc4bf4b2b6b14a93b574626da33df53cf7740659"}, + {file = "StrEnum-0.4.15.tar.gz", hash = "sha256:878fb5ab705442070e4dd1929bb5e2249511c0bcf2b0eeacf3bcd80875c82eff"}, ] [package.extras] @@ -7500,4 +7500,4 @@ deploy = ["langchain-serve"] [metadata] lock-version = "2.0" python-versions = ">=3.9,<3.12" -content-hash = "e3d0c8e7e89bf23d24b13e187f49a7d1b2dd273cd823f2adff33762190f79bb8" +content-hash = "3875f61e1228dfac1574076a6c3755703463fa6ed1fe737d064a171be94259d4" From 606779f2164f6dbb9d9d29de618b875cb1f6b23c Mon Sep 17 00:00:00 2001 From: Gabriel Luiz Freitas Almeida Date: Thu, 29 Jun 2023 20:43:52 -0300 Subject: [PATCH 122/169] =?UTF-8?q?=F0=9F=94=96=20chore(pyproject.toml):?= =?UTF-8?q?=20update=20package=20version=20to=200.2.7=20The=20package=20ve?= =?UTF-8?q?rsion=20has=20been=20updated=20from=200.2.6=20to=200.2.7.=20Thi?= =?UTF-8?q?s=20change=20is=20made=20to=20reflect=20the=20latest=20changes?= =?UTF-8?q?=20and=20improvements=20in=20the=20package.?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- pyproject.toml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pyproject.toml b/pyproject.toml index 764948765..e606cf828 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -1,6 +1,6 @@ [tool.poetry] name = "langflow" -version = "0.2.6" +version = "0.2.7" description = "A Python package with a built-in web application" authors = ["Logspace "] maintainers = [ From 4d72c92e4cb01bb46f4f4fc7a4c7df0cba03ae51 Mon Sep 17 00:00:00 2001 From: Gabriel Luiz Freitas Almeida Date: Fri, 30 Jun 2023 09:00:18 -0300 Subject: [PATCH 123/169] =?UTF-8?q?=F0=9F=94=A7=20chore(llms.py):=20add=20?= =?UTF-8?q?extra=20fields=20for=20VertexAI=20template=20and=20modify=20fie?= =?UTF-8?q?ld=20type=20for=20"credentials"=20=F0=9F=93=9D=20chore(llms.py)?= =?UTF-8?q?:=20improve=20field=20configuration=20for=20VertexAI=20template?= =?UTF-8?q?=20and=20modify=20field=20type=20for=20"credentials"=20The=20`a?= =?UTF-8?q?dd=5Fextra=5Ffields`=20method=20is=20modified=20to=20add=20an?= =?UTF-8?q?=20additional=20field=20called=20"credentials"=20for=20the=20Ve?= =?UTF-8?q?rtexAI=20template.=20The=20field=20is=20of=20type=20"file"=20an?= =?UTF-8?q?d=20is=20required.=20It=20allows=20the=20user=20to=20upload=20a?= =?UTF-8?q?=20JSON=20file=20as=20credentials.=20The=20`format=5Fopenai=5Ff?= =?UTF-8?q?ield`=20method=20is=20also=20updated=20to=20handle=20the=20new?= =?UTF-8?q?=20"credentials"=20field.?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../langflow/template/frontend_node/llms.py | 18 ++++++++++++++++++ 1 file changed, 18 insertions(+) diff --git a/src/backend/langflow/template/frontend_node/llms.py b/src/backend/langflow/template/frontend_node/llms.py index 65bffc303..a1b1af3f3 100644 --- a/src/backend/langflow/template/frontend_node/llms.py +++ b/src/backend/langflow/template/frontend_node/llms.py @@ -6,6 +6,21 @@ from langflow.template.frontend_node.constants import OPENAI_API_BASE_INFO class LLMFrontendNode(FrontendNode): + def add_extra_fields(self) -> None: + if self.template.type_name == "VertexAI": + # Add credentials field which should of type file. + self.template.add_field( + TemplateField( + field_type="file", + required=True, + show=True, + name="credentials", + value="", + suffixes=[".json"], + fileTypes=["json"], + ) + ) + @staticmethod def format_openai_field(field: TemplateField): if "openai" in field.name.lower(): @@ -81,6 +96,9 @@ class LLMFrontendNode(FrontendNode): "model_file", "model_type", "deployment_name", + "credentials", ]: field.advanced = False field.show = True + if field.name == "credentials": + field.field_type = "file" From e8de0c60ef3520869941b8e46c33907c7e93f6ef Mon Sep 17 00:00:00 2001 From: Gabriel Luiz Freitas Almeida Date: Fri, 30 Jun 2023 09:23:17 -0300 Subject: [PATCH 124/169] =?UTF-8?q?=F0=9F=94=92=20chore(pyproject.toml):?= =?UTF-8?q?=20update=20python=20dependency=20version=20to=20>=3D3.9,<3.11?= =?UTF-8?q?=20to=20ensure=20compatibility=20=E2=AC=86=EF=B8=8F=20feat(pypr?= =?UTF-8?q?oject.toml):=20add=20google-cloud-aiplatform=20dependency=20to?= =?UTF-8?q?=20enable=20integration=20with=20Google=20Cloud=20AI=20Platform?= =?UTF-8?q?=20The=20python=20dependency=20version=20has=20been=20updated?= =?UTF-8?q?=20to=20>=3D3.9,<3.11=20to=20ensure=20compatibility=20with=20th?= =?UTF-8?q?e=20project.=20Additionally,=20the=20google-cloud-aiplatform=20?= =?UTF-8?q?dependency=20has=20been=20added=20to=20enable=20integration=20w?= =?UTF-8?q?ith=20Google=20Cloud=20AI=20Platform=20services.?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- poetry.lock | 467 ++++++++++++++++++++++++++++++++++++++++++------- pyproject.toml | 3 +- 2 files changed, 406 insertions(+), 64 deletions(-) diff --git a/poetry.lock b/poetry.lock index a000e3d77..f05d5dd05 100644 --- a/poetry.lock +++ b/poetry.lock @@ -1536,6 +1536,8 @@ files = [ [package.dependencies] google-auth = ">=2.14.1,<3.0.dev0" googleapis-common-protos = ">=1.56.2,<2.0.dev0" +grpcio = {version = ">=1.33.2,<2.0dev", optional = true, markers = "extra == \"grpc\""} +grpcio-status = {version = ">=1.33.2,<2.0.dev0", optional = true, markers = "extra == \"grpc\""} protobuf = ">=3.19.5,<3.20.0 || >3.20.0,<3.20.1 || >3.20.1,<4.21.0 || >4.21.0,<4.21.1 || >4.21.1,<4.21.2 || >4.21.2,<4.21.3 || >4.21.3,<4.21.4 || >4.21.4,<4.21.5 || >4.21.5,<5.0.0.dev0" requests = ">=2.18.0,<3.0.0.dev0" @@ -1546,14 +1548,14 @@ grpcio-gcp = ["grpcio-gcp (>=0.2.2,<1.0.dev0)"] [[package]] name = "google-api-python-client" -version = "2.90.0" +version = "2.91.0" description = "Google API Client Library for Python" category = "main" optional = false python-versions = ">=3.7" files = [ - {file = "google-api-python-client-2.90.0.tar.gz", hash = "sha256:cbcb3ba8be37c6806676a49df16ac412077e5e5dc7fa967941eff977b31fba03"}, - {file = "google_api_python_client-2.90.0-py2.py3-none-any.whl", hash = "sha256:4a41ffb7797d4f28e44635fb1e7076240b741c6493e7c3233c0e4421cec7c913"}, + {file = "google-api-python-client-2.91.0.tar.gz", hash = "sha256:d9385ad6e7f95eecd40f7c81e3abfe4b6ad3a84f2c16bcdb66fb7b8dd814ed56"}, + {file = "google_api_python_client-2.91.0-py2.py3-none-any.whl", hash = "sha256:6959d21d4b20c0f65c69662ca7b6a8a02fc08f3e7f72d70b28ae3e6e3a5f9ab2"}, ] [package.dependencies] @@ -1606,6 +1608,236 @@ google-auth = "*" httplib2 = ">=0.15.0" six = "*" +[[package]] +name = "google-cloud-aiplatform" +version = "1.26.1" +description = "Vertex AI API client library" +category = "main" +optional = false +python-versions = ">=3.7" +files = [ + {file = "google-cloud-aiplatform-1.26.1.tar.gz", hash = "sha256:51c3cfff2d294e0002c7a9ce1a9d189fba61227d8c235d09aa76e253b6b90a10"}, + {file = "google_cloud_aiplatform-1.26.1-py2.py3-none-any.whl", hash = "sha256:649ed28b7634b8c68fad2e6465b0f428a107eb35937e2eafa755972258afe4c3"}, +] + +[package.dependencies] +google-api-core = {version = ">=1.32.0,<2.0.0 || >=2.8.0,<3.0.0dev", extras = ["grpc"]} +google-cloud-bigquery = ">=1.15.0,<4.0.0dev" +google-cloud-resource-manager = ">=1.3.3,<3.0.0dev" +google-cloud-storage = ">=1.32.0,<3.0.0dev" +packaging = ">=14.3" +proto-plus = ">=1.22.0,<2.0.0dev" +protobuf = ">=3.19.5,<3.20.0 || >3.20.0,<3.20.1 || >3.20.1,<4.21.0 || >4.21.0,<4.21.1 || >4.21.1,<4.21.2 || >4.21.2,<4.21.3 || >4.21.3,<4.21.4 || >4.21.4,<4.21.5 || >4.21.5,<5.0.0dev" +shapely = "<2.0.0" + +[package.extras] +autologging = ["mlflow (>=1.27.0,<=2.1.1)"] +cloud-profiler = ["tensorboard-plugin-profile (>=2.4.0,<3.0.0dev)", "tensorflow (>=2.4.0,<3.0.0dev)", "werkzeug (>=2.0.0,<2.1.0dev)"] +datasets = ["pyarrow (>=3.0.0,<8.0dev)"] +endpoint = ["requests (>=2.28.1)"] +full = ["docker (>=5.0.3)", "explainable-ai-sdk (>=1.0.0)", "fastapi (>=0.71.0,<0.76.0)", "google-cloud-bigquery-storage", "google-vizier (==0.0.4)", "lit-nlp (==0.4.0)", "mlflow (>=1.27.0,<=2.1.1)", "numpy (>=1.15.0)", "pandas (>=1.0.0)", "pyarrow (>=3.0.0,<8.0dev)", "pyarrow (>=6.0.1)", "pyyaml (>=5.3,<6)", "requests (>=2.28.1)", "starlette (>=0.17.1)", "tensorflow (>=2.3.0,<3.0.0dev)", "urllib3 (>=1.21.1,<1.27)", "uvicorn[standard] (>=0.16.0)"] +lit = ["explainable-ai-sdk (>=1.0.0)", "lit-nlp (==0.4.0)", "pandas (>=1.0.0)", "tensorflow (>=2.3.0,<3.0.0dev)"] +metadata = ["numpy (>=1.15.0)", "pandas (>=1.0.0)"] +pipelines = ["pyyaml (>=5.3,<6)"] +prediction = ["docker (>=5.0.3)", "fastapi (>=0.71.0,<0.76.0)", "starlette (>=0.17.1)", "uvicorn[standard] (>=0.16.0)"] +private-endpoints = ["requests (>=2.28.1)", "urllib3 (>=1.21.1,<1.27)"] +tensorboard = ["tensorflow (>=2.3.0,<3.0.0dev)"] +testing = ["docker (>=5.0.3)", "explainable-ai-sdk (>=1.0.0)", "fastapi (>=0.71.0,<0.76.0)", "google-cloud-bigquery-storage", "google-vizier (==0.0.4)", "grpcio-testing", "ipython", "kfp", "lit-nlp (==0.4.0)", "mlflow (>=1.27.0,<=2.1.1)", "numpy (>=1.15.0)", "pandas (>=1.0.0)", "pyarrow (>=3.0.0,<8.0dev)", "pyarrow (>=6.0.1)", "pytest-asyncio", "pytest-xdist", "pyyaml (>=5.3,<6)", "requests (>=2.28.1)", "scikit-learn", "starlette (>=0.17.1)", "tensorboard-plugin-profile (>=2.4.0,<3.0.0dev)", "tensorflow (>=2.3.0,<3.0.0dev)", "tensorflow (>=2.4.0,<3.0.0dev)", "urllib3 (>=1.21.1,<1.27)", "uvicorn[standard] (>=0.16.0)", "werkzeug (>=2.0.0,<2.1.0dev)", "xgboost"] +vizier = ["google-vizier (==0.0.4)"] +xai = ["tensorflow (>=2.3.0,<3.0.0dev)"] + +[[package]] +name = "google-cloud-bigquery" +version = "3.11.3" +description = "Google BigQuery API client library" +category = "main" +optional = false +python-versions = ">=3.7" +files = [ + {file = "google-cloud-bigquery-3.11.3.tar.gz", hash = "sha256:d4585be9e76c984ec83ef290ebeff17562d2c9f2f4f84d3015d9b7b27b499a9d"}, + {file = "google_cloud_bigquery-3.11.3-py2.py3-none-any.whl", hash = "sha256:266ba1ddd213b2454c1e4a92ae647813b783128078eb48dda4c0b443c5057e29"}, +] + +[package.dependencies] +google-api-core = {version = ">=1.31.5,<2.0.0 || >2.3.0,<3.0.0dev", extras = ["grpc"]} +google-cloud-core = ">=1.6.0,<3.0.0dev" +google-resumable-media = ">=0.6.0,<3.0dev" +grpcio = ">=1.47.0,<2.0dev" +packaging = ">=20.0.0" +proto-plus = ">=1.15.0,<2.0.0dev" +protobuf = ">=3.19.5,<3.20.0 || >3.20.0,<3.20.1 || >3.20.1,<4.21.0 || >4.21.0,<4.21.1 || >4.21.1,<4.21.2 || >4.21.2,<4.21.3 || >4.21.3,<4.21.4 || >4.21.4,<4.21.5 || >4.21.5,<5.0.0dev" +python-dateutil = ">=2.7.2,<3.0dev" +requests = ">=2.21.0,<3.0.0dev" + +[package.extras] +all = ["Shapely (>=1.8.4,<2.0dev)", "db-dtypes (>=0.3.0,<2.0.0dev)", "geopandas (>=0.9.0,<1.0dev)", "google-cloud-bigquery-storage (>=2.6.0,<3.0.0dev)", "grpcio (>=1.47.0,<2.0dev)", "grpcio (>=1.49.1,<2.0dev)", "ipykernel (>=6.0.0)", "ipython (>=7.23.1,!=8.1.0)", "ipywidgets (>=7.7.0)", "opentelemetry-api (>=1.1.0)", "opentelemetry-instrumentation (>=0.20b0)", "opentelemetry-sdk (>=1.1.0)", "pandas (>=1.1.0)", "pyarrow (>=3.0.0)", "tqdm (>=4.7.4,<5.0.0dev)"] +bqstorage = ["google-cloud-bigquery-storage (>=2.6.0,<3.0.0dev)", "grpcio (>=1.47.0,<2.0dev)", "grpcio (>=1.49.1,<2.0dev)", "pyarrow (>=3.0.0)"] +geopandas = ["Shapely (>=1.8.4,<2.0dev)", "geopandas (>=0.9.0,<1.0dev)"] +ipython = ["ipykernel (>=6.0.0)", "ipython (>=7.23.1,!=8.1.0)"] +ipywidgets = ["ipykernel (>=6.0.0)", "ipywidgets (>=7.7.0)"] +opentelemetry = ["opentelemetry-api (>=1.1.0)", "opentelemetry-instrumentation (>=0.20b0)", "opentelemetry-sdk (>=1.1.0)"] +pandas = ["db-dtypes (>=0.3.0,<2.0.0dev)", "pandas (>=1.1.0)", "pyarrow (>=3.0.0)"] +tqdm = ["tqdm (>=4.7.4,<5.0.0dev)"] + +[[package]] +name = "google-cloud-core" +version = "2.3.2" +description = "Google Cloud API client core library" +category = "main" +optional = false +python-versions = ">=3.7" +files = [ + {file = "google-cloud-core-2.3.2.tar.gz", hash = "sha256:b9529ee7047fd8d4bf4a2182de619154240df17fbe60ead399078c1ae152af9a"}, + {file = "google_cloud_core-2.3.2-py2.py3-none-any.whl", hash = "sha256:8417acf6466be2fa85123441696c4badda48db314c607cf1e5d543fa8bdc22fe"}, +] + +[package.dependencies] +google-api-core = ">=1.31.6,<2.0.0 || >2.3.0,<3.0.0dev" +google-auth = ">=1.25.0,<3.0dev" + +[package.extras] +grpc = ["grpcio (>=1.38.0,<2.0dev)"] + +[[package]] +name = "google-cloud-resource-manager" +version = "1.10.1" +description = "Google Cloud Resource Manager API client library" +category = "main" +optional = false +python-versions = ">=3.7" +files = [ + {file = "google-cloud-resource-manager-1.10.1.tar.gz", hash = "sha256:c974fb6f9810476cf7b63ea89394c1a8df47f7f2dc2303e728bb74b500bcde67"}, + {file = "google_cloud_resource_manager-1.10.1-py2.py3-none-any.whl", hash = "sha256:41a2204532f084c707fde0bc1a9bc95c7e0b739d7072dd0b8a25106667a56184"}, +] + +[package.dependencies] +google-api-core = {version = ">=1.34.0,<2.0.0 || >=2.11.0,<3.0.0dev", extras = ["grpc"]} +grpc-google-iam-v1 = ">=0.12.4,<1.0.0dev" +proto-plus = ">=1.22.0,<2.0.0dev" +protobuf = ">=3.19.5,<3.20.0 || >3.20.0,<3.20.1 || >3.20.1,<4.21.0 || >4.21.0,<4.21.1 || >4.21.1,<4.21.2 || >4.21.2,<4.21.3 || >4.21.3,<4.21.4 || >4.21.4,<4.21.5 || >4.21.5,<5.0.0dev" + +[[package]] +name = "google-cloud-storage" +version = "2.10.0" +description = "Google Cloud Storage API client library" +category = "main" +optional = false +python-versions = ">=3.7" +files = [ + {file = "google-cloud-storage-2.10.0.tar.gz", hash = "sha256:934b31ead5f3994e5360f9ff5750982c5b6b11604dc072bc452c25965e076dc7"}, + {file = "google_cloud_storage-2.10.0-py2.py3-none-any.whl", hash = "sha256:9433cf28801671de1c80434238fb1e7e4a1ba3087470e90f70c928ea77c2b9d7"}, +] + +[package.dependencies] +google-api-core = ">=1.31.5,<2.0.0 || >2.3.0,<3.0.0dev" +google-auth = ">=1.25.0,<3.0dev" +google-cloud-core = ">=2.3.0,<3.0dev" +google-resumable-media = ">=2.3.2" +requests = ">=2.18.0,<3.0.0dev" + +[package.extras] +protobuf = ["protobuf (<5.0.0dev)"] + +[[package]] +name = "google-crc32c" +version = "1.5.0" +description = "A python wrapper of the C library 'Google CRC32C'" +category = "main" +optional = false +python-versions = ">=3.7" +files = [ + {file = "google-crc32c-1.5.0.tar.gz", hash = "sha256:89284716bc6a5a415d4eaa11b1726d2d60a0cd12aadf5439828353662ede9dd7"}, + {file = "google_crc32c-1.5.0-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:596d1f98fc70232fcb6590c439f43b350cb762fb5d61ce7b0e9db4539654cc13"}, + {file = "google_crc32c-1.5.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:be82c3c8cfb15b30f36768797a640e800513793d6ae1724aaaafe5bf86f8f346"}, + {file = "google_crc32c-1.5.0-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:461665ff58895f508e2866824a47bdee72497b091c730071f2b7575d5762ab65"}, + {file = "google_crc32c-1.5.0-cp310-cp310-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:e2096eddb4e7c7bdae4bd69ad364e55e07b8316653234a56552d9c988bd2d61b"}, + {file = "google_crc32c-1.5.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:116a7c3c616dd14a3de8c64a965828b197e5f2d121fedd2f8c5585c547e87b02"}, + {file = "google_crc32c-1.5.0-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:5829b792bf5822fd0a6f6eb34c5f81dd074f01d570ed7f36aa101d6fc7a0a6e4"}, + {file = "google_crc32c-1.5.0-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:64e52e2b3970bd891309c113b54cf0e4384762c934d5ae56e283f9a0afcd953e"}, + {file = "google_crc32c-1.5.0-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:02ebb8bf46c13e36998aeaad1de9b48f4caf545e91d14041270d9dca767b780c"}, + {file = "google_crc32c-1.5.0-cp310-cp310-win32.whl", hash = "sha256:2e920d506ec85eb4ba50cd4228c2bec05642894d4c73c59b3a2fe20346bd00ee"}, + {file = "google_crc32c-1.5.0-cp310-cp310-win_amd64.whl", hash = "sha256:07eb3c611ce363c51a933bf6bd7f8e3878a51d124acfc89452a75120bc436289"}, + {file = "google_crc32c-1.5.0-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:cae0274952c079886567f3f4f685bcaf5708f0a23a5f5216fdab71f81a6c0273"}, + {file = "google_crc32c-1.5.0-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:1034d91442ead5a95b5aaef90dbfaca8633b0247d1e41621d1e9f9db88c36298"}, + {file = "google_crc32c-1.5.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:7c42c70cd1d362284289c6273adda4c6af8039a8ae12dc451dcd61cdabb8ab57"}, + {file = "google_crc32c-1.5.0-cp311-cp311-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:8485b340a6a9e76c62a7dce3c98e5f102c9219f4cfbf896a00cf48caf078d438"}, + {file = "google_crc32c-1.5.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:77e2fd3057c9d78e225fa0a2160f96b64a824de17840351b26825b0848022906"}, + {file = "google_crc32c-1.5.0-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:f583edb943cf2e09c60441b910d6a20b4d9d626c75a36c8fcac01a6c96c01183"}, + {file = "google_crc32c-1.5.0-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:a1fd716e7a01f8e717490fbe2e431d2905ab8aa598b9b12f8d10abebb36b04dd"}, + {file = "google_crc32c-1.5.0-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:72218785ce41b9cfd2fc1d6a017dc1ff7acfc4c17d01053265c41a2c0cc39b8c"}, + {file = "google_crc32c-1.5.0-cp311-cp311-win32.whl", hash = "sha256:66741ef4ee08ea0b2cc3c86916ab66b6aef03768525627fd6a1b34968b4e3709"}, + {file = "google_crc32c-1.5.0-cp311-cp311-win_amd64.whl", hash = "sha256:ba1eb1843304b1e5537e1fca632fa894d6f6deca8d6389636ee5b4797affb968"}, + {file = "google_crc32c-1.5.0-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:98cb4d057f285bd80d8778ebc4fde6b4d509ac3f331758fb1528b733215443ae"}, + {file = "google_crc32c-1.5.0-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:fd8536e902db7e365f49e7d9029283403974ccf29b13fc7028b97e2295b33556"}, + {file = "google_crc32c-1.5.0-cp37-cp37m-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:19e0a019d2c4dcc5e598cd4a4bc7b008546b0358bd322537c74ad47a5386884f"}, + {file = "google_crc32c-1.5.0-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:02c65b9817512edc6a4ae7c7e987fea799d2e0ee40c53ec573a692bee24de876"}, + {file = "google_crc32c-1.5.0-cp37-cp37m-manylinux_2_5_x86_64.manylinux1_x86_64.whl", hash = "sha256:6ac08d24c1f16bd2bf5eca8eaf8304812f44af5cfe5062006ec676e7e1d50afc"}, + {file = "google_crc32c-1.5.0-cp37-cp37m-musllinux_1_1_aarch64.whl", hash = "sha256:3359fc442a743e870f4588fcf5dcbc1bf929df1fad8fb9905cd94e5edb02e84c"}, + {file = "google_crc32c-1.5.0-cp37-cp37m-musllinux_1_1_i686.whl", hash = "sha256:1e986b206dae4476f41bcec1faa057851f3889503a70e1bdb2378d406223994a"}, + {file = "google_crc32c-1.5.0-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:de06adc872bcd8c2a4e0dc51250e9e65ef2ca91be023b9d13ebd67c2ba552e1e"}, + {file = "google_crc32c-1.5.0-cp37-cp37m-win32.whl", hash = "sha256:d3515f198eaa2f0ed49f8819d5732d70698c3fa37384146079b3799b97667a94"}, + {file = "google_crc32c-1.5.0-cp37-cp37m-win_amd64.whl", hash = "sha256:67b741654b851abafb7bc625b6d1cdd520a379074e64b6a128e3b688c3c04740"}, + {file = "google_crc32c-1.5.0-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:c02ec1c5856179f171e032a31d6f8bf84e5a75c45c33b2e20a3de353b266ebd8"}, + {file = "google_crc32c-1.5.0-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:edfedb64740750e1a3b16152620220f51d58ff1b4abceb339ca92e934775c27a"}, + {file = "google_crc32c-1.5.0-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:84e6e8cd997930fc66d5bb4fde61e2b62ba19d62b7abd7a69920406f9ecca946"}, + {file = "google_crc32c-1.5.0-cp38-cp38-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:024894d9d3cfbc5943f8f230e23950cd4906b2fe004c72e29b209420a1e6b05a"}, + {file = "google_crc32c-1.5.0-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:998679bf62b7fb599d2878aa3ed06b9ce688b8974893e7223c60db155f26bd8d"}, + {file = "google_crc32c-1.5.0-cp38-cp38-manylinux_2_5_x86_64.manylinux1_x86_64.whl", hash = "sha256:83c681c526a3439b5cf94f7420471705bbf96262f49a6fe546a6db5f687a3d4a"}, + {file = "google_crc32c-1.5.0-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:4c6fdd4fccbec90cc8a01fc00773fcd5fa28db683c116ee3cb35cd5da9ef6c37"}, + {file = "google_crc32c-1.5.0-cp38-cp38-musllinux_1_1_i686.whl", hash = "sha256:5ae44e10a8e3407dbe138984f21e536583f2bba1be9491239f942c2464ac0894"}, + {file = "google_crc32c-1.5.0-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:37933ec6e693e51a5b07505bd05de57eee12f3e8c32b07da7e73669398e6630a"}, + {file = "google_crc32c-1.5.0-cp38-cp38-win32.whl", hash = "sha256:fe70e325aa68fa4b5edf7d1a4b6f691eb04bbccac0ace68e34820d283b5f80d4"}, + {file = "google_crc32c-1.5.0-cp38-cp38-win_amd64.whl", hash = "sha256:74dea7751d98034887dbd821b7aae3e1d36eda111d6ca36c206c44478035709c"}, + {file = "google_crc32c-1.5.0-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:c6c777a480337ac14f38564ac88ae82d4cd238bf293f0a22295b66eb89ffced7"}, + {file = "google_crc32c-1.5.0-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:759ce4851a4bb15ecabae28f4d2e18983c244eddd767f560165563bf9aefbc8d"}, + {file = "google_crc32c-1.5.0-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:f13cae8cc389a440def0c8c52057f37359014ccbc9dc1f0827936bcd367c6100"}, + {file = "google_crc32c-1.5.0-cp39-cp39-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:e560628513ed34759456a416bf86b54b2476c59144a9138165c9a1575801d0d9"}, + {file = "google_crc32c-1.5.0-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:e1674e4307fa3024fc897ca774e9c7562c957af85df55efe2988ed9056dc4e57"}, + {file = "google_crc32c-1.5.0-cp39-cp39-manylinux_2_5_x86_64.manylinux1_x86_64.whl", hash = "sha256:278d2ed7c16cfc075c91378c4f47924c0625f5fc84b2d50d921b18b7975bd210"}, + {file = "google_crc32c-1.5.0-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:d5280312b9af0976231f9e317c20e4a61cd2f9629b7bfea6a693d1878a264ebd"}, + {file = "google_crc32c-1.5.0-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:8b87e1a59c38f275c0e3676fc2ab6d59eccecfd460be267ac360cc31f7bcde96"}, + {file = "google_crc32c-1.5.0-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:7c074fece789b5034b9b1404a1f8208fc2d4c6ce9decdd16e8220c5a793e6f61"}, + {file = "google_crc32c-1.5.0-cp39-cp39-win32.whl", hash = "sha256:7f57f14606cd1dd0f0de396e1e53824c371e9544a822648cd76c034d209b559c"}, + {file = "google_crc32c-1.5.0-cp39-cp39-win_amd64.whl", hash = "sha256:a2355cba1f4ad8b6988a4ca3feed5bff33f6af2d7f134852cf279c2aebfde541"}, + {file = "google_crc32c-1.5.0-pp37-pypy37_pp73-macosx_10_9_x86_64.whl", hash = "sha256:f314013e7dcd5cf45ab1945d92e713eec788166262ae8deb2cfacd53def27325"}, + {file = "google_crc32c-1.5.0-pp37-pypy37_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:3b747a674c20a67343cb61d43fdd9207ce5da6a99f629c6e2541aa0e89215bcd"}, + {file = "google_crc32c-1.5.0-pp37-pypy37_pp73-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:8f24ed114432de109aa9fd317278518a5af2d31ac2ea6b952b2f7782b43da091"}, + {file = "google_crc32c-1.5.0-pp37-pypy37_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:b8667b48e7a7ef66afba2c81e1094ef526388d35b873966d8a9a447974ed9178"}, + {file = "google_crc32c-1.5.0-pp37-pypy37_pp73-win_amd64.whl", hash = "sha256:1c7abdac90433b09bad6c43a43af253e688c9cfc1c86d332aed13f9a7c7f65e2"}, + {file = "google_crc32c-1.5.0-pp38-pypy38_pp73-macosx_10_9_x86_64.whl", hash = "sha256:6f998db4e71b645350b9ac28a2167e6632c239963ca9da411523bb439c5c514d"}, + {file = "google_crc32c-1.5.0-pp38-pypy38_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:9c99616c853bb585301df6de07ca2cadad344fd1ada6d62bb30aec05219c45d2"}, + {file = "google_crc32c-1.5.0-pp38-pypy38_pp73-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:2ad40e31093a4af319dadf503b2467ccdc8f67c72e4bcba97f8c10cb078207b5"}, + {file = "google_crc32c-1.5.0-pp38-pypy38_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:cd67cf24a553339d5062eff51013780a00d6f97a39ca062781d06b3a73b15462"}, + {file = "google_crc32c-1.5.0-pp38-pypy38_pp73-win_amd64.whl", hash = "sha256:398af5e3ba9cf768787eef45c803ff9614cc3e22a5b2f7d7ae116df8b11e3314"}, + {file = "google_crc32c-1.5.0-pp39-pypy39_pp73-macosx_10_9_x86_64.whl", hash = "sha256:b1f8133c9a275df5613a451e73f36c2aea4fe13c5c8997e22cf355ebd7bd0728"}, + {file = "google_crc32c-1.5.0-pp39-pypy39_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:9ba053c5f50430a3fcfd36f75aff9caeba0440b2d076afdb79a318d6ca245f88"}, + {file = "google_crc32c-1.5.0-pp39-pypy39_pp73-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:272d3892a1e1a2dbc39cc5cde96834c236d5327e2122d3aaa19f6614531bb6eb"}, + {file = "google_crc32c-1.5.0-pp39-pypy39_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:635f5d4dd18758a1fbd1049a8e8d2fee4ffed124462d837d1a02a0e009c3ab31"}, + {file = "google_crc32c-1.5.0-pp39-pypy39_pp73-win_amd64.whl", hash = "sha256:c672d99a345849301784604bfeaeba4db0c7aae50b95be04dd651fd2a7310b93"}, +] + +[package.extras] +testing = ["pytest"] + +[[package]] +name = "google-resumable-media" +version = "2.5.0" +description = "Utilities for Google Media Downloads and Resumable Uploads" +category = "main" +optional = false +python-versions = ">= 3.7" +files = [ + {file = "google-resumable-media-2.5.0.tar.gz", hash = "sha256:218931e8e2b2a73a58eb354a288e03a0fd5fb1c4583261ac6e4c078666468c93"}, + {file = "google_resumable_media-2.5.0-py2.py3-none-any.whl", hash = "sha256:da1bd943e2e114a56d85d6848497ebf9be6a14d3db23e9fc57581e7c3e8170ec"}, +] + +[package.dependencies] +google-crc32c = ">=1.0,<2.0dev" + +[package.extras] +aiohttp = ["aiohttp (>=3.6.2,<4.0.0dev)"] +requests = ["requests (>=2.18.0,<3.0.0dev)"] + [[package]] name = "google-search-results" version = "2.4.2" @@ -1633,6 +1865,7 @@ files = [ ] [package.dependencies] +grpcio = {version = ">=1.44.0,<2.0.0.dev0", optional = true, markers = "extra == \"grpc\""} protobuf = ">=3.19.5,<3.20.0 || >3.20.0,<3.20.1 || >3.20.1,<4.21.1 || >4.21.1,<4.21.2 || >4.21.2,<4.21.3 || >4.21.3,<4.21.4 || >4.21.4,<4.21.5 || >4.21.5,<5.0.0.dev0" [package.extras] @@ -1728,6 +1961,23 @@ files = [ docs = ["Sphinx", "docutils (<0.18)"] test = ["objgraph", "psutil"] +[[package]] +name = "grpc-google-iam-v1" +version = "0.12.6" +description = "IAM API client library" +category = "main" +optional = false +python-versions = ">=3.7" +files = [ + {file = "grpc-google-iam-v1-0.12.6.tar.gz", hash = "sha256:2bc4b8fdf22115a65d751c9317329322602c39b7c86a289c9b72d228d960ef5f"}, + {file = "grpc_google_iam_v1-0.12.6-py2.py3-none-any.whl", hash = "sha256:5c10f3d8dc2d88678ab1a9b0cb5482735c5efee71e6c0cd59f872eef22913f5c"}, +] + +[package.dependencies] +googleapis-common-protos = {version = ">=1.56.0,<2.0.0dev", extras = ["grpc"]} +grpcio = ">=1.44.0,<2.0.0dev" +protobuf = ">=3.19.5,<3.20.0 || >3.20.0,<3.20.1 || >3.20.1,<4.21.1 || >4.21.1,<4.21.2 || >4.21.2,<4.21.3 || >4.21.3,<4.21.4 || >4.21.4,<4.21.5 || >4.21.5,<5.0.0dev" + [[package]] name = "grpcio" version = "1.47.5" @@ -1822,6 +2072,23 @@ files = [ grpcio = ">=1.47.5" protobuf = ">=3.12.0" +[[package]] +name = "grpcio-status" +version = "1.47.5" +description = "Status proto mapping for gRPC" +category = "main" +optional = false +python-versions = ">=3.6" +files = [ + {file = "grpcio-status-1.47.5.tar.gz", hash = "sha256:671bb4c0819697a699c12a8785a78d6847eafb6a83b2437bbae13989b04e5c25"}, + {file = "grpcio_status-1.47.5-py3-none-any.whl", hash = "sha256:24549a84fa37ca5de1e0f6be96b4c2c3623b1e2b7359aa16b3de5aa0563795f1"}, +] + +[package.dependencies] +googleapis-common-protos = ">=1.5.5" +grpcio = ">=1.47.5" +protobuf = ">=3.12.0" + [[package]] name = "grpcio-tools" version = "1.47.5" @@ -2523,14 +2790,14 @@ i18n = ["Babel (>=2.7)"] [[package]] name = "joblib" -version = "1.3.0" +version = "1.3.1" description = "Lightweight pipelining with Python functions" category = "main" optional = false python-versions = ">=3.7" files = [ - {file = "joblib-1.3.0-py3-none-any.whl", hash = "sha256:172d56d4c43dd6bcd953bea213018c4084cf754963bbf54b8dae40faea716b98"}, - {file = "joblib-1.3.0.tar.gz", hash = "sha256:0b12a65dc76c530dbd790dd92881f75c40932b4254a7c8e608a868df408ca0a3"}, + {file = "joblib-1.3.1-py3-none-any.whl", hash = "sha256:89cf0529520e01b3de7ac7b74a8102c90d16d54c64b5dd98cafcd14307fdf915"}, + {file = "joblib-1.3.1.tar.gz", hash = "sha256:1f937906df65329ba98013dc9692fe22a4c5e4a648112de500508b18a21b41e3"}, ] [[package]] @@ -2644,13 +2911,13 @@ text-helpers = ["chardet (>=5.1.0,<6.0.0)"] [[package]] name = "langchain-serve" -version = "0.0.47" +version = "0.0.49" description = "Langchain Serve - serve your langchain apps on Jina AI Cloud." category = "main" optional = true python-versions = "*" files = [ - {file = "langchain-serve-0.0.47.tar.gz", hash = "sha256:2b7827ddaffa4fe6eb8fa988fc8b9be827ded702340f1644f065200b89fdc3a9"}, + {file = "langchain-serve-0.0.49.tar.gz", hash = "sha256:5dc30276e709e59838c28508228ad2185e264c8877ea70194fa5d2acd44e966d"}, ] [package.dependencies] @@ -3892,7 +4159,6 @@ files = [ numpy = [ {version = ">=1.20.3", markers = "python_version < \"3.10\""}, {version = ">=1.21.0", markers = "python_version >= \"3.10\""}, - {version = ">=1.23.2", markers = "python_version >= \"3.11\""}, ] python-dateutil = ">=2.8.1" pytz = ">=2020.1" @@ -4216,6 +4482,24 @@ files = [ [package.dependencies] wcwidth = "*" +[[package]] +name = "proto-plus" +version = "1.22.3" +description = "Beautiful, Pythonic protocol buffers." +category = "main" +optional = false +python-versions = ">=3.6" +files = [ + {file = "proto-plus-1.22.3.tar.gz", hash = "sha256:fdcd09713cbd42480740d2fe29c990f7fbd885a67efc328aa8be6ee3e9f76a6b"}, + {file = "proto_plus-1.22.3-py3-none-any.whl", hash = "sha256:a49cd903bc0b6ab41f76bf65510439d56ca76f868adf0274e738bfdd096894df"}, +] + +[package.dependencies] +protobuf = ">=3.19.0,<5.0.0dev" + +[package.extras] +testing = ["google-api-core[grpc] (>=1.31.5)"] + [[package]] name = "protobuf" version = "3.20.3" @@ -5403,74 +5687,74 @@ files = [ [[package]] name = "scikit-learn" -version = "1.2.2" +version = "1.3.0" description = "A set of python modules for machine learning and data mining" category = "main" optional = false python-versions = ">=3.8" files = [ - {file = "scikit-learn-1.2.2.tar.gz", hash = "sha256:8429aea30ec24e7a8c7ed8a3fa6213adf3814a6efbea09e16e0a0c71e1a1a3d7"}, - {file = "scikit_learn-1.2.2-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:99cc01184e347de485bf253d19fcb3b1a3fb0ee4cea5ee3c43ec0cc429b6d29f"}, - {file = "scikit_learn-1.2.2-cp310-cp310-macosx_12_0_arm64.whl", hash = "sha256:e6e574db9914afcb4e11ade84fab084536a895ca60aadea3041e85b8ac963edb"}, - {file = "scikit_learn-1.2.2-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:6fe83b676f407f00afa388dd1fdd49e5c6612e551ed84f3b1b182858f09e987d"}, - {file = "scikit_learn-1.2.2-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:2e2642baa0ad1e8f8188917423dd73994bf25429f8893ddbe115be3ca3183584"}, - {file = "scikit_learn-1.2.2-cp310-cp310-win_amd64.whl", hash = "sha256:ad66c3848c0a1ec13464b2a95d0a484fd5b02ce74268eaa7e0c697b904f31d6c"}, - {file = "scikit_learn-1.2.2-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:dfeaf8be72117eb61a164ea6fc8afb6dfe08c6f90365bde2dc16456e4bc8e45f"}, - {file = "scikit_learn-1.2.2-cp311-cp311-macosx_12_0_arm64.whl", hash = "sha256:fe0aa1a7029ed3e1dcbf4a5bc675aa3b1bc468d9012ecf6c6f081251ca47f590"}, - {file = "scikit_learn-1.2.2-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:065e9673e24e0dc5113e2dd2b4ca30c9d8aa2fa90f4c0597241c93b63130d233"}, - {file = "scikit_learn-1.2.2-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:bf036ea7ef66115e0d49655f16febfa547886deba20149555a41d28f56fd6d3c"}, - {file = "scikit_learn-1.2.2-cp311-cp311-win_amd64.whl", hash = "sha256:8b0670d4224a3c2d596fd572fb4fa673b2a0ccfb07152688ebd2ea0b8c61025c"}, - {file = "scikit_learn-1.2.2-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:9c710ff9f9936ba8a3b74a455ccf0dcf59b230caa1e9ba0223773c490cab1e51"}, - {file = "scikit_learn-1.2.2-cp38-cp38-macosx_12_0_arm64.whl", hash = "sha256:2dd3ffd3950e3d6c0c0ef9033a9b9b32d910c61bd06cb8206303fb4514b88a49"}, - {file = "scikit_learn-1.2.2-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:44b47a305190c28dd8dd73fc9445f802b6ea716669cfc22ab1eb97b335d238b1"}, - {file = "scikit_learn-1.2.2-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:953236889928d104c2ef14027539f5f2609a47ebf716b8cbe4437e85dce42744"}, - {file = "scikit_learn-1.2.2-cp38-cp38-win_amd64.whl", hash = "sha256:7f69313884e8eb311460cc2f28676d5e400bd929841a2c8eb8742ae78ebf7c20"}, - {file = "scikit_learn-1.2.2-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:8156db41e1c39c69aa2d8599ab7577af53e9e5e7a57b0504e116cc73c39138dd"}, - {file = "scikit_learn-1.2.2-cp39-cp39-macosx_12_0_arm64.whl", hash = "sha256:fe175ee1dab589d2e1033657c5b6bec92a8a3b69103e3dd361b58014729975c3"}, - {file = "scikit_learn-1.2.2-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:7d5312d9674bed14f73773d2acf15a3272639b981e60b72c9b190a0cffed5bad"}, - {file = "scikit_learn-1.2.2-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:ea061bf0283bf9a9f36ea3c5d3231ba2176221bbd430abd2603b1c3b2ed85c89"}, - {file = "scikit_learn-1.2.2-cp39-cp39-win_amd64.whl", hash = "sha256:6477eed40dbce190f9f9e9d0d37e020815825b300121307942ec2110302b66a3"}, + {file = "scikit-learn-1.3.0.tar.gz", hash = "sha256:8be549886f5eda46436b6e555b0e4873b4f10aa21c07df45c4bc1735afbccd7a"}, + {file = "scikit_learn-1.3.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:981287869e576d42c682cf7ca96af0c6ac544ed9316328fd0d9292795c742cf5"}, + {file = "scikit_learn-1.3.0-cp310-cp310-macosx_12_0_arm64.whl", hash = "sha256:436aaaae2c916ad16631142488e4c82f4296af2404f480e031d866863425d2a2"}, + {file = "scikit_learn-1.3.0-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:c7e28d8fa47a0b30ae1bd7a079519dd852764e31708a7804da6cb6f8b36e3630"}, + {file = "scikit_learn-1.3.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:ae80c08834a473d08a204d966982a62e11c976228d306a2648c575e3ead12111"}, + {file = "scikit_learn-1.3.0-cp310-cp310-win_amd64.whl", hash = "sha256:552fd1b6ee22900cf1780d7386a554bb96949e9a359999177cf30211e6b20df6"}, + {file = "scikit_learn-1.3.0-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:79970a6d759eb00a62266a31e2637d07d2d28446fca8079cf9afa7c07b0427f8"}, + {file = "scikit_learn-1.3.0-cp311-cp311-macosx_12_0_arm64.whl", hash = "sha256:850a00b559e636b23901aabbe79b73dc604b4e4248ba9e2d6e72f95063765603"}, + {file = "scikit_learn-1.3.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:ee04835fb016e8062ee9fe9074aef9b82e430504e420bff51e3e5fffe72750ca"}, + {file = "scikit_learn-1.3.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:9d953531f5d9f00c90c34fa3b7d7cfb43ecff4c605dac9e4255a20b114a27369"}, + {file = "scikit_learn-1.3.0-cp311-cp311-win_amd64.whl", hash = "sha256:151ac2bf65ccf363664a689b8beafc9e6aae36263db114b4ca06fbbbf827444a"}, + {file = "scikit_learn-1.3.0-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:6a885a9edc9c0a341cab27ec4f8a6c58b35f3d449c9d2503a6fd23e06bbd4f6a"}, + {file = "scikit_learn-1.3.0-cp38-cp38-macosx_12_0_arm64.whl", hash = "sha256:9877af9c6d1b15486e18a94101b742e9d0d2f343d35a634e337411ddb57783f3"}, + {file = "scikit_learn-1.3.0-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:c470f53cea065ff3d588050955c492793bb50c19a92923490d18fcb637f6383a"}, + {file = "scikit_learn-1.3.0-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:fd6e2d7389542eae01077a1ee0318c4fec20c66c957f45c7aac0c6eb0fe3c612"}, + {file = "scikit_learn-1.3.0-cp38-cp38-win_amd64.whl", hash = "sha256:3a11936adbc379a6061ea32fa03338d4ca7248d86dd507c81e13af428a5bc1db"}, + {file = "scikit_learn-1.3.0-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:998d38fcec96584deee1e79cd127469b3ad6fefd1ea6c2dfc54e8db367eb396b"}, + {file = "scikit_learn-1.3.0-cp39-cp39-macosx_12_0_arm64.whl", hash = "sha256:ded35e810438a527e17623ac6deae3b360134345b7c598175ab7741720d7ffa7"}, + {file = "scikit_learn-1.3.0-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:0e8102d5036e28d08ab47166b48c8d5e5810704daecf3a476a4282d562be9a28"}, + {file = "scikit_learn-1.3.0-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:7617164951c422747e7c32be4afa15d75ad8044f42e7d70d3e2e0429a50e6718"}, + {file = "scikit_learn-1.3.0-cp39-cp39-win_amd64.whl", hash = "sha256:1d54fb9e6038284548072df22fd34777e434153f7ffac72c8596f2d6987110dd"}, ] [package.dependencies] joblib = ">=1.1.1" numpy = ">=1.17.3" -scipy = ">=1.3.2" +scipy = ">=1.5.0" threadpoolctl = ">=2.0.0" [package.extras] benchmark = ["matplotlib (>=3.1.3)", "memory-profiler (>=0.57.0)", "pandas (>=1.0.5)"] -docs = ["Pillow (>=7.1.2)", "matplotlib (>=3.1.3)", "memory-profiler (>=0.57.0)", "numpydoc (>=1.2.0)", "pandas (>=1.0.5)", "plotly (>=5.10.0)", "pooch (>=1.6.0)", "scikit-image (>=0.16.2)", "seaborn (>=0.9.0)", "sphinx (>=4.0.1)", "sphinx-gallery (>=0.7.0)", "sphinx-prompt (>=1.3.0)", "sphinxext-opengraph (>=0.4.2)"] -examples = ["matplotlib (>=3.1.3)", "pandas (>=1.0.5)", "plotly (>=5.10.0)", "pooch (>=1.6.0)", "scikit-image (>=0.16.2)", "seaborn (>=0.9.0)"] -tests = ["black (>=22.3.0)", "flake8 (>=3.8.2)", "matplotlib (>=3.1.3)", "mypy (>=0.961)", "numpydoc (>=1.2.0)", "pandas (>=1.0.5)", "pooch (>=1.6.0)", "pyamg (>=4.0.0)", "pytest (>=5.3.1)", "pytest-cov (>=2.9.0)", "scikit-image (>=0.16.2)"] +docs = ["Pillow (>=7.1.2)", "matplotlib (>=3.1.3)", "memory-profiler (>=0.57.0)", "numpydoc (>=1.2.0)", "pandas (>=1.0.5)", "plotly (>=5.14.0)", "pooch (>=1.6.0)", "scikit-image (>=0.16.2)", "seaborn (>=0.9.0)", "sphinx (>=6.0.0)", "sphinx-copybutton (>=0.5.2)", "sphinx-gallery (>=0.10.1)", "sphinx-prompt (>=1.3.0)", "sphinxext-opengraph (>=0.4.2)"] +examples = ["matplotlib (>=3.1.3)", "pandas (>=1.0.5)", "plotly (>=5.14.0)", "pooch (>=1.6.0)", "scikit-image (>=0.16.2)", "seaborn (>=0.9.0)"] +tests = ["black (>=23.3.0)", "matplotlib (>=3.1.3)", "mypy (>=1.3)", "numpydoc (>=1.2.0)", "pandas (>=1.0.5)", "pooch (>=1.6.0)", "pyamg (>=4.0.0)", "pytest (>=7.1.2)", "pytest-cov (>=2.9.0)", "ruff (>=0.0.272)", "scikit-image (>=0.16.2)"] [[package]] name = "scipy" -version = "1.11.0" +version = "1.11.1" description = "Fundamental algorithms for scientific computing in Python" category = "main" optional = false python-versions = "<3.13,>=3.9" files = [ - {file = "scipy-1.11.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:2e4f14c11fbf825319dbd7f467639a241e7c956c34edb1e036ec7bb6271e4f7b"}, - {file = "scipy-1.11.0-cp310-cp310-macosx_12_0_arm64.whl", hash = "sha256:b269ed44e2e2e43611f2ae95ba551fd98abbdc1a7ea8268f72f75876982368c4"}, - {file = "scipy-1.11.0-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:2c29bae479b17d85208dfdfc67e50d5944ee23211f236728aadde9b0b7c1c33e"}, - {file = "scipy-1.11.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:a53f9cebcfda6158c241c35a559407a4ef6b8cb0863eb4144958fe0a0b7c3dae"}, - {file = "scipy-1.11.0-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:ebf4b2ea26d50312731ddba2406389c5ddcbff9d777cf3277ea11decc81e5dfb"}, - {file = "scipy-1.11.0-cp310-cp310-win_amd64.whl", hash = "sha256:894ced9a2cdb050ff5e392f274617af46dca896d5c9112fa4a2019929554d321"}, - {file = "scipy-1.11.0-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:7a92bd3cd4acad2e0e0b360176d5ec68b100983c8145add8a8233acddf4e5fcc"}, - {file = "scipy-1.11.0-cp311-cp311-macosx_12_0_arm64.whl", hash = "sha256:586608ea35206257d4e0ce6f154a6cfef71723b2c1f6d40de5e0b0e8a81cd2ff"}, - {file = "scipy-1.11.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:d8e631c3c49c24f30828580b8126fe3be5cca5409dad5b797418a5b8965eeafa"}, - {file = "scipy-1.11.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:ccc70892ea674f93183c5c4139557b611e42f644dd755da4b19ca974ab770672"}, - {file = "scipy-1.11.0-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:80015b8928f91bd40377b2b1010ba2e09b03680cbfc291208740494aeb8debf2"}, - {file = "scipy-1.11.0-cp311-cp311-win_amd64.whl", hash = "sha256:6302c7cba5bf99c901653ff158746625526cc438f058bce41514d7469b79b2c3"}, - {file = "scipy-1.11.0-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:c61ea63124da6a3cff38126426912cc86420898b4902a9bc5e5b6524547a6dcb"}, - {file = "scipy-1.11.0-cp39-cp39-macosx_12_0_arm64.whl", hash = "sha256:684d44607eacd5dd367c7a9e76e922523fa9c0a7f2379a4d0fc4d70d751464cc"}, - {file = "scipy-1.11.0-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:f0c9c160d117fe71cd2a12ef21cce8e0475ade2fd97c761ef327b9839089bd16"}, - {file = "scipy-1.11.0-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:83867a63515c4e3fce3272d81200dda614d70f4c3a22f047d84021bfe83d7929"}, - {file = "scipy-1.11.0-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:6666a1e31b2123a077f0dc7ab1053e36479cfd457fb9f5c367e7198505c6607a"}, - {file = "scipy-1.11.0-cp39-cp39-win_amd64.whl", hash = "sha256:fad4006248513528e0c496de295a9f4d2b65086cc0e388f748e7dbf49fa12760"}, - {file = "scipy-1.11.0.tar.gz", hash = "sha256:f9b0248cb9d08eead44cde47cbf6339f1e9aa0dfde28f5fb27950743e317bd5d"}, + {file = "scipy-1.11.1-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:aec8c62fbe52914f9cf28d846cf0401dd80ab80788bbab909434eb336ed07c04"}, + {file = "scipy-1.11.1-cp310-cp310-macosx_12_0_arm64.whl", hash = "sha256:3b9963798df1d8a52db41a6fc0e6fa65b1c60e85d73da27ae8bb754de4792481"}, + {file = "scipy-1.11.1-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:3e8eb42db36526b130dfbc417609498a6192381abc1975b91e3eb238e0b41c1a"}, + {file = "scipy-1.11.1-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:366a6a937110d80dca4f63b3f5b00cc89d36f678b2d124a01067b154e692bab1"}, + {file = "scipy-1.11.1-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:08d957ca82d3535b3b9ba6c8ff355d78fe975271874e2af267cb5add5bd78625"}, + {file = "scipy-1.11.1-cp310-cp310-win_amd64.whl", hash = "sha256:e866514bc2d660608447b6ba95c8900d591f2865c07cca0aa4f7ff3c4ca70f30"}, + {file = "scipy-1.11.1-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:ba94eeef3c9caa4cea7b402a35bb02a5714ee1ee77eb98aca1eed4543beb0f4c"}, + {file = "scipy-1.11.1-cp311-cp311-macosx_12_0_arm64.whl", hash = "sha256:512fdc18c65f76dadaca139348e525646d440220d8d05f6d21965b8d4466bccd"}, + {file = "scipy-1.11.1-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:cce154372f0ebe88556ed06d7b196e9c2e0c13080ecb58d0f35062dc7cc28b47"}, + {file = "scipy-1.11.1-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:b4bb943010203465ac81efa392e4645265077b4d9e99b66cf3ed33ae12254173"}, + {file = "scipy-1.11.1-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:249cfa465c379c9bb2c20123001e151ff5e29b351cbb7f9c91587260602c58d0"}, + {file = "scipy-1.11.1-cp311-cp311-win_amd64.whl", hash = "sha256:ffb28e3fa31b9c376d0fb1f74c1f13911c8c154a760312fbee87a21eb21efe31"}, + {file = "scipy-1.11.1-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:39154437654260a52871dfde852adf1b93b1d1bc5dc0ffa70068f16ec0be2624"}, + {file = "scipy-1.11.1-cp39-cp39-macosx_12_0_arm64.whl", hash = "sha256:b588311875c58d1acd4ef17c983b9f1ab5391755a47c3d70b6bd503a45bfaf71"}, + {file = "scipy-1.11.1-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:d51565560565a0307ed06fa0ec4c6f21ff094947d4844d6068ed04400c72d0c3"}, + {file = "scipy-1.11.1-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:b41a0f322b4eb51b078cb3441e950ad661ede490c3aca66edef66f4b37ab1877"}, + {file = "scipy-1.11.1-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:396fae3f8c12ad14c5f3eb40499fd06a6fef8393a6baa352a652ecd51e74e029"}, + {file = "scipy-1.11.1-cp39-cp39-win_amd64.whl", hash = "sha256:be8c962a821957fdde8c4044efdab7a140c13294997a407eaee777acf63cbf0c"}, + {file = "scipy-1.11.1.tar.gz", hash = "sha256:fb5b492fa035334fd249f0973cc79ecad8b09c604b42a127a677b45a9a3d4289"}, ] [package.dependencies] @@ -5604,6 +5888,63 @@ docs = ["furo", "jaraco.packaging (>=9)", "jaraco.tidelift (>=1.4)", "pygments-g testing = ["build[virtualenv]", "filelock (>=3.4.0)", "flake8-2020", "ini2toml[lite] (>=0.9)", "jaraco.envs (>=2.2)", "jaraco.path (>=3.2.0)", "pip (>=19.1)", "pip-run (>=8.8)", "pytest (>=6)", "pytest-black (>=0.3.7)", "pytest-checkdocs (>=2.4)", "pytest-cov", "pytest-enabler (>=1.3)", "pytest-mypy (>=0.9.1)", "pytest-perf", "pytest-ruff", "pytest-timeout", "pytest-xdist", "tomli-w (>=1.0.0)", "virtualenv (>=13.0.0)", "wheel"] testing-integration = ["build[virtualenv]", "filelock (>=3.4.0)", "jaraco.envs (>=2.2)", "jaraco.path (>=3.2.0)", "pytest", "pytest-enabler", "pytest-xdist", "tomli", "virtualenv (>=13.0.0)", "wheel"] +[[package]] +name = "shapely" +version = "1.8.5.post1" +description = "Geometric objects, predicates, and operations" +category = "main" +optional = false +python-versions = ">=3.6" +files = [ + {file = "Shapely-1.8.5.post1-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:d048f93e42ba578b82758c15d8ae037d08e69d91d9872bca5a1895b118f4e2b0"}, + {file = "Shapely-1.8.5.post1-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:99ab0ddc05e44acabdbe657c599fdb9b2d82e86c5493bdae216c0c4018a82dee"}, + {file = "Shapely-1.8.5.post1-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:99a2f0da0109e81e0c101a2b4cd8412f73f5f299e7b5b2deaf64cd2a100ac118"}, + {file = "Shapely-1.8.5.post1-cp310-cp310-manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:6fe855e7d45685926b6ba00aaeb5eba5862611f7465775dacd527e081a8ced6d"}, + {file = "Shapely-1.8.5.post1-cp310-cp310-manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:ec14ceca36f67cb48b34d02d7f65a9acae15cd72b48e303531893ba4a960f3ea"}, + {file = "Shapely-1.8.5.post1-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:d8a2b2a65fa7f97115c1cd989fe9d6f39281ca2a8a014f1d4904c1a6e34d7f25"}, + {file = "Shapely-1.8.5.post1-cp310-cp310-win32.whl", hash = "sha256:21776184516a16bf82a0c3d6d6a312b3cd15a4cabafc61ee01cf2714a82e8396"}, + {file = "Shapely-1.8.5.post1-cp310-cp310-win_amd64.whl", hash = "sha256:a354199219c8d836f280b88f2c5102c81bb044ccea45bd361dc38a79f3873714"}, + {file = "Shapely-1.8.5.post1-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:783bad5f48e2708a0e2f695a34ed382e4162c795cb2f0368b39528ac1d6db7ed"}, + {file = "Shapely-1.8.5.post1-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:a23ef3882d6aa203dd3623a3d55d698f59bfbd9f8a3bfed52c2da05a7f0f8640"}, + {file = "Shapely-1.8.5.post1-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:ab38f7b5196ace05725e407cb8cab9ff66edb8e6f7bb36a398e8f73f52a7aaa2"}, + {file = "Shapely-1.8.5.post1-cp311-cp311-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:8d086591f744be483b34628b391d741e46f2645fe37594319e0a673cc2c26bcf"}, + {file = "Shapely-1.8.5.post1-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:4728666fff8cccc65a07448cae72c75a8773fea061c3f4f139c44adc429b18c3"}, + {file = "Shapely-1.8.5.post1-cp311-cp311-win32.whl", hash = "sha256:84010db15eb364a52b74ea8804ef92a6a930dfc1981d17a369444b6ddec66efd"}, + {file = "Shapely-1.8.5.post1-cp311-cp311-win_amd64.whl", hash = "sha256:48dcfffb9e225c0481120f4bdf622131c8c95f342b00b158cdbe220edbbe20b6"}, + {file = "Shapely-1.8.5.post1-cp36-cp36m-macosx_10_9_x86_64.whl", hash = "sha256:2fd15397638df291c427a53d641d3e6fd60458128029c8c4f487190473a69a91"}, + {file = "Shapely-1.8.5.post1-cp36-cp36m-manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:a74631e511153366c6dbe3229fa93f877e3c87ea8369cd00f1d38c76b0ed9ace"}, + {file = "Shapely-1.8.5.post1-cp36-cp36m-manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:66bdac74fbd1d3458fa787191a90fa0ae610f09e2a5ec398c36f968cc0ed743f"}, + {file = "Shapely-1.8.5.post1-cp36-cp36m-win32.whl", hash = "sha256:6d388c0c1bd878ed1af4583695690aa52234b02ed35f93a1c8486ff52a555838"}, + {file = "Shapely-1.8.5.post1-cp36-cp36m-win_amd64.whl", hash = "sha256:be9423d5a3577ac2e92c7e758bd8a2b205f5e51a012177a590bc46fc51eb4834"}, + {file = "Shapely-1.8.5.post1-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:5d7f85c2d35d39ff53c9216bc76b7641c52326f7e09aaad1789a3611a0f812f2"}, + {file = "Shapely-1.8.5.post1-cp37-cp37m-manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:adcf8a11b98af9375e32bff91de184f33a68dc48b9cb9becad4f132fa25cfa3c"}, + {file = "Shapely-1.8.5.post1-cp37-cp37m-manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:753ed0e21ab108bd4282405b9b659f2e985e8502b1a72b978eaa51d3496dee19"}, + {file = "Shapely-1.8.5.post1-cp37-cp37m-win32.whl", hash = "sha256:65b21243d8f6bcd421210daf1fabb9de84de2c04353c5b026173b88d17c1a581"}, + {file = "Shapely-1.8.5.post1-cp37-cp37m-win_amd64.whl", hash = "sha256:370b574c78dc5af3a198a6da5d9b3d7c04654bd2ef7e80e80a3a0992dfb2d9cd"}, + {file = "Shapely-1.8.5.post1-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:532a55ee2a6c52d23d6f7d1567c8f0473635f3b270262c44e1b0c88096827e22"}, + {file = "Shapely-1.8.5.post1-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:3480657460e939f45a7d359ef0e172a081f249312557fe9aa78c4fd3a362d993"}, + {file = "Shapely-1.8.5.post1-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:b65f5d530ba91e49ffc7c589255e878d2506a8b96ffce69d3b7c4500a9a9eaf8"}, + {file = "Shapely-1.8.5.post1-cp38-cp38-manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:147066da0be41b147a61f8eb805dea3b13709dbc873a431ccd7306e24d712bc0"}, + {file = "Shapely-1.8.5.post1-cp38-cp38-manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:c2822111ddc5bcfb116e6c663e403579d0fe3f147d2a97426011a191c43a7458"}, + {file = "Shapely-1.8.5.post1-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:4b47bb6f9369e8bf3e6dbd33e6a25a47ee02b2874792a529fe04a49bf8bc0df6"}, + {file = "Shapely-1.8.5.post1-cp38-cp38-win32.whl", hash = "sha256:2e0a8c2e55f1be1312b51c92b06462ea89e6bb703fab4b114e7a846d941cfc40"}, + {file = "Shapely-1.8.5.post1-cp38-cp38-win_amd64.whl", hash = "sha256:0d885cb0cf670c1c834df3f371de8726efdf711f18e2a75da5cfa82843a7ab65"}, + {file = "Shapely-1.8.5.post1-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:0b4ee3132ee90f07d63db3aea316c4c065ed7a26231458dda0874414a09d6ba3"}, + {file = "Shapely-1.8.5.post1-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:02dd5d7dc6e46515d88874134dc8fcdc65826bca93c3eecee59d1910c42c1b17"}, + {file = "Shapely-1.8.5.post1-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:c6a9a4a31cd6e86d0fbe8473ceed83d4fe760b19d949fb557ef668defafea0f6"}, + {file = "Shapely-1.8.5.post1-cp39-cp39-manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:38f0fbbcb8ca20c16451c966c1f527cc43968e121c8a048af19ed3e339a921cd"}, + {file = "Shapely-1.8.5.post1-cp39-cp39-manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:78fb9d929b8ee15cfd424b6c10879ce1907f24e05fb83310fc47d2cd27088e40"}, + {file = "Shapely-1.8.5.post1-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:89164e7a9776a19e29f01369a98529321994e2e4d852b92b7e01d4d9804c55bf"}, + {file = "Shapely-1.8.5.post1-cp39-cp39-win32.whl", hash = "sha256:8e59817b0fe63d34baedaabba8c393c0090f061917d18fc0bcc2f621937a8f73"}, + {file = "Shapely-1.8.5.post1-cp39-cp39-win_amd64.whl", hash = "sha256:e9c30b311de2513555ab02464ebb76115d242842b29c412f5a9aa0cac57be9f6"}, + {file = "Shapely-1.8.5.post1.tar.gz", hash = "sha256:ef3be705c3eac282a28058e6c6e5503419b250f482320df2172abcbea642c831"}, +] + +[package.extras] +all = ["numpy", "pytest", "pytest-cov"] +test = ["pytest", "pytest-cov"] +vectorized = ["numpy"] + [[package]] name = "six" version = "1.16.0" @@ -5855,14 +6196,14 @@ typing-extensions = ">=4.2.0,<5.0.0" [[package]] name = "strenum" -version = "0.4.10" +version = "0.4.15" description = "An Enum that inherits from str." category = "main" optional = false python-versions = "*" files = [ - {file = "StrEnum-0.4.10-py3-none-any.whl", hash = "sha256:aebf04bba8e5af435937c452d69a86798b6f8d5ca5f20ba18561dbfad571ccdd"}, - {file = "StrEnum-0.4.10.tar.gz", hash = "sha256:898cc0ebb5054ee07400341ac1d75fdfee489d76d6df3fbc1c2eaf95971e3916"}, + {file = "StrEnum-0.4.15-py3-none-any.whl", hash = "sha256:a30cda4af7cc6b5bf52c8055bc4bf4b2b6b14a93b574626da33df53cf7740659"}, + {file = "StrEnum-0.4.15.tar.gz", hash = "sha256:878fb5ab705442070e4dd1929bb5e2249511c0bcf2b0eeacf3bcd80875c82eff"}, ] [package.extras] @@ -6383,14 +6724,14 @@ files = [ [[package]] name = "types-pillow" -version = "9.5.0.4" +version = "9.5.0.5" description = "Typing stubs for Pillow" category = "dev" optional = false python-versions = "*" files = [ - {file = "types-Pillow-9.5.0.4.tar.gz", hash = "sha256:f1b6af47abd151847ee25911ffeba784899bc7dc7f9eba8ca6a5aac522b012ef"}, - {file = "types_Pillow-9.5.0.4-py3-none-any.whl", hash = "sha256:69427d9fa4320ff6e30f00fb9c0dd71185dc0a16de4757774220104759483466"}, + {file = "types-Pillow-9.5.0.5.tar.gz", hash = "sha256:de9877aa1e6226b6479459ca84df02fd7e999b970c79cfee3b8298840336e77c"}, + {file = "types_Pillow-9.5.0.5-py3-none-any.whl", hash = "sha256:2b17f95c5c16e4962e4032bdb95494766a85569fa278ee21e5fcbbd318e9ccd2"}, ] [[package]] @@ -7115,5 +7456,5 @@ deploy = ["langchain-serve"] [metadata] lock-version = "2.0" -python-versions = ">=3.9,<3.12" -content-hash = "678e32f48c532893c302fda95dcb038add66aaf3e5fe9886d8ba19fa386a4d2e" +python-versions = ">=3.9,<3.11" +content-hash = "05123a3be530e823c711f5274f62e611b6740c4a44b100307202f97e7c6f92d4" diff --git a/pyproject.toml b/pyproject.toml index dfcb53cd3..1de6393bf 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -22,7 +22,7 @@ include = ["src/backend/langflow/*", "src/backend/langflow/**/*"] langflow = "langflow.__main__:main" [tool.poetry.dependencies] -python = ">=3.9,<3.12" +python = ">=3.9,<3.11" fastapi = "^0.98.0" uvicorn = "^0.22.0" beautifulsoup4 = "^4.11.2" @@ -70,6 +70,7 @@ pinecone-client = "^2.2.2" supabase = "^1.0.3" pymongo = "^4.4.0" certifi = "^2023.5.7" +google-cloud-aiplatform = "^1.26.1" [tool.poetry.dev-dependencies] From bbf4c387406a855c9681e8f2bc047e60e824d60e Mon Sep 17 00:00:00 2001 From: Gabriel Luiz Freitas Almeida Date: Fri, 30 Jun 2023 09:35:33 -0300 Subject: [PATCH 125/169] =?UTF-8?q?=F0=9F=94=80=20refactor(llms.py):=20sim?= =?UTF-8?q?plify=20condition=20for=20showing=20fields=20in=20the=20VertexA?= =?UTF-8?q?I=20class=20The=20condition=20for=20showing=20fields=20in=20the?= =?UTF-8?q?=20VertexAI=20class=20has=20been=20simplified=20to=20exclude=20?= =?UTF-8?q?specific=20field=20names.=20This=20improves=20readability=20and?= =?UTF-8?q?=20maintainability=20of=20the=20code.?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/backend/langflow/template/frontend_node/llms.py | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/src/backend/langflow/template/frontend_node/llms.py b/src/backend/langflow/template/frontend_node/llms.py index a1b1af3f3..c1080ea2d 100644 --- a/src/backend/langflow/template/frontend_node/llms.py +++ b/src/backend/langflow/template/frontend_node/llms.py @@ -102,3 +102,11 @@ class LLMFrontendNode(FrontendNode): field.show = True if field.name == "credentials": field.field_type = "file" + if name == "VertexAI" and field.name not in [ + "callbacks", + "client", + "stop", + "tags", + "cache", + ]: + field.show = True From 3bdc35d238d2297268a989e69943c16fa11feef2 Mon Sep 17 00:00:00 2001 From: Gabriel Luiz Freitas Almeida Date: Fri, 30 Jun 2023 10:09:29 -0300 Subject: [PATCH 126/169] =?UTF-8?q?=F0=9F=94=A7=20chore(llm.py):=20add=20f?= =?UTF-8?q?unction=20to=20initialize=20VertexAI=20credentials=20?= =?UTF-8?q?=F0=9F=94=A7=20chore(loading.py):=20call=20initialize=5Fvertexa?= =?UTF-8?q?i=20function=20when=20node=5Ftype=20is=20"VertexAI"=20The=20`ll?= =?UTF-8?q?m.py`=20file=20now=20includes=20a=20new=20function=20`initializ?= =?UTF-8?q?e=5Fvertexai`=20that=20initializes=20the=20VertexAI=20credentia?= =?UTF-8?q?ls=20if=20a=20`credentials`=20parameter=20is=20provided.=20This?= =?UTF-8?q?=20allows=20for=20the=20usage=20of=20VertexAI=20credentials=20i?= =?UTF-8?q?n=20the=20application.=20In=20`loading.py`,=20the=20`initialize?= =?UTF-8?q?=5Fvertexai`=20function=20is=20called=20when=20the=20`node=5Fty?= =?UTF-8?q?pe`=20is=20"VertexAI",=20ensuring=20that=20the=20VertexAI=20cre?= =?UTF-8?q?dentials=20are=20properly=20initialized=20for=20that=20specific?= =?UTF-8?q?=20node=20type.?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/backend/langflow/interface/initialize/llm.py | 9 +++++++++ src/backend/langflow/interface/initialize/loading.py | 3 +++ 2 files changed, 12 insertions(+) create mode 100644 src/backend/langflow/interface/initialize/llm.py diff --git a/src/backend/langflow/interface/initialize/llm.py b/src/backend/langflow/interface/initialize/llm.py new file mode 100644 index 000000000..2b9fa3b2e --- /dev/null +++ b/src/backend/langflow/interface/initialize/llm.py @@ -0,0 +1,9 @@ +def initialize_vertexai(class_object, params): + if credentials_path := params.get("credentials"): + from google.oauth2 import service_account + + credentials_object = service_account.Credentials.from_service_account_file( + filename=credentials_path + ) + params["credentials"] = credentials_object + return class_object(**params) diff --git a/src/backend/langflow/interface/initialize/loading.py b/src/backend/langflow/interface/initialize/loading.py index 3ddb64c24..c90713a08 100644 --- a/src/backend/langflow/interface/initialize/loading.py +++ b/src/backend/langflow/interface/initialize/loading.py @@ -6,6 +6,7 @@ from langchain.agents import agent as agent_module from langchain.agents.agent import AgentExecutor from langchain.agents.agent_toolkits.base import BaseToolkit from langchain.agents.tools import BaseTool +from langflow.interface.initialize.llm import initialize_vertexai from langflow.interface.initialize.vector_store import vecstore_initializer @@ -89,6 +90,8 @@ def instantiate_llm(node_type, class_object, params: Dict): # if "openai_api_base" in params and "jina" in params["openai_api_base"]: # False if condition is True ChatConfig.streaming = "jina" not in params.get("openai_api_base", "") + if node_type == "VertexAI": + return initialize_vertexai(class_object=class_object, params=params) return class_object(**params) From e01fe86caa056d8177f0666918e11c01619a60e3 Mon Sep 17 00:00:00 2001 From: Gabriel Luiz Freitas Almeida Date: Fri, 30 Jun 2023 10:09:56 -0300 Subject: [PATCH 127/169] =?UTF-8?q?=F0=9F=90=9B=20fix(base.py):=20simplify?= =?UTF-8?q?=20the=20logic=20to=20find=20the=20matched=5Ftype=20in=20the=20?= =?UTF-8?q?Edge=20class=20The=20logic=20to=20find=20the=20matched=5Ftype?= =?UTF-8?q?=20in=20the=20Edge=20class=20has=20been=20simplified=20by=20rem?= =?UTF-8?q?oving=20unnecessary=20nested=20loops=20and=20using=20a=20single?= =?UTF-8?q?=20generator=20expression.=20This=20improves=20the=20readabilit?= =?UTF-8?q?y=20and=20efficiency=20of=20the=20code.?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/backend/langflow/graph/edge/base.py | 7 +------ 1 file changed, 1 insertion(+), 6 deletions(-) diff --git a/src/backend/langflow/graph/edge/base.py b/src/backend/langflow/graph/edge/base.py index 08f084a5c..88a177e40 100644 --- a/src/backend/langflow/graph/edge/base.py +++ b/src/backend/langflow/graph/edge/base.py @@ -27,12 +27,7 @@ class Edge: # Get what type of input the target node is expecting self.matched_type = next( - ( - output - for output in self.source_types - for target_req in self.target_reqs - if output in target_req - ), + (output for output in self.source_types if output in self.target_reqs), None, ) no_matched_type = self.matched_type is None From 06aea7da88c577f3c2194dbc0d06750d029adda7 Mon Sep 17 00:00:00 2001 From: Gabriel Luiz Freitas Almeida Date: Fri, 30 Jun 2023 11:09:13 -0300 Subject: [PATCH 128/169] =?UTF-8?q?=F0=9F=94=80=20chore(custom=5Flists.py)?= =?UTF-8?q?:=20reformat=20import=20statements=20for=20better=20readability?= =?UTF-8?q?=20and=20maintainability=20=F0=9F=94=80=20chore(custom=5Flists.?= =?UTF-8?q?py):=20add=20ChatVertexAI=20to=20the=20import=20statements=20fo?= =?UTF-8?q?r=20better=20modularity=20and=20extensibility=20=F0=9F=94=80=20?= =?UTF-8?q?chore(custom=5Flists.py):=20add=20ChatVertexAI=20to=20the=20llm?= =?UTF-8?q?=5Ftype=5Fto=5Fcls=5Fdict=20for=20better=20compatibility=20and?= =?UTF-8?q?=20flexibility=20=F0=9F=94=80=20chore(llms.py):=20change=20requ?= =?UTF-8?q?ired=20field=20for=20credentials=20to=20be=20optional=20for=20b?= =?UTF-8?q?etter=20user=20experience=20=F0=9F=94=80=20chore(llms.py):=20ad?= =?UTF-8?q?d=20advanced=20and=20show=20fields=20for=20specific=20fields=20?= =?UTF-8?q?related=20to=20VertexAI=20for=20better=20configurability?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit The import statements in `custom_lists.py` have been reformatted to improve readability and maintainability. The `ChatVertexAI` class has been added to the import statements to enhance modularity and extensibility. The `ChatVertexAI` class has been added to the `llm_type_to_cls_dict` dictionary in `custom_lists.py` to improve compatibility and flexibility. In `llms.py`, the `required` field for the `credentials` field has been changed to be optional for a better user experience. The `advanced` and `show` fields have been added to specific fields related to VertexAI in `llms.py` to provide better configurability. --- .../langflow/interface/custom_lists.py | 9 +++-- .../langflow/template/frontend_node/llms.py | 34 +++++++++++++++++-- 2 files changed, 39 insertions(+), 4 deletions(-) diff --git a/src/backend/langflow/interface/custom_lists.py b/src/backend/langflow/interface/custom_lists.py index 2f7f69f14..5a22d989f 100644 --- a/src/backend/langflow/interface/custom_lists.py +++ b/src/backend/langflow/interface/custom_lists.py @@ -10,8 +10,12 @@ from langchain import ( text_splitter, ) from langchain.agents import agent_toolkits -from langchain.chat_models import AzureChatOpenAI, ChatOpenAI -from langchain.chat_models import ChatAnthropic +from langchain.chat_models import ( + AzureChatOpenAI, + ChatOpenAI, + ChatVertexAI, + ChatAnthropic, +) from langflow.interface.importing.utils import import_class from langflow.interface.agents.custom import CUSTOM_AGENTS @@ -22,6 +26,7 @@ llm_type_to_cls_dict = llms.type_to_cls_dict llm_type_to_cls_dict["anthropic-chat"] = ChatAnthropic # type: ignore llm_type_to_cls_dict["azure-chat"] = AzureChatOpenAI # type: ignore llm_type_to_cls_dict["openai-chat"] = ChatOpenAI # type: ignore +llm_type_to_cls_dict["vertexai-chat"] = ChatVertexAI # type: ignore # Toolkits diff --git a/src/backend/langflow/template/frontend_node/llms.py b/src/backend/langflow/template/frontend_node/llms.py index c1080ea2d..7d2ab219d 100644 --- a/src/backend/langflow/template/frontend_node/llms.py +++ b/src/backend/langflow/template/frontend_node/llms.py @@ -7,12 +7,12 @@ from langflow.template.frontend_node.constants import OPENAI_API_BASE_INFO class LLMFrontendNode(FrontendNode): def add_extra_fields(self) -> None: - if self.template.type_name == "VertexAI": + if "VertexAI" in self.template.type_name: # Add credentials field which should of type file. self.template.add_field( TemplateField( field_type="file", - required=True, + required=False, show=True, name="credentials", value="", @@ -21,6 +21,34 @@ class LLMFrontendNode(FrontendNode): ) ) + @staticmethod + def format_vertex_field(field: TemplateField, name: str): + if "VertexAI" in name: + advanced_fields = [ + "tuned_model_name", + "verbose", + "top_p", + "top_k", + "max_output_tokens", + ] + if field.name in advanced_fields: + field.advanced = True + show_fields = [ + "tuned_model_name", + "verbose", + "project", + "location", + "credentials", + "max_output_tokens", + "model_name", + "temperature", + "top_p", + "top_k", + ] + + if field.name in show_fields: + field.show = True + @staticmethod def format_openai_field(field: TemplateField): if "openai" in field.name.lower(): @@ -61,6 +89,8 @@ class LLMFrontendNode(FrontendNode): LLMFrontendNode.format_azure_field(field) if name and "llama" in name.lower(): LLMFrontendNode.format_llama_field(field) + if name and "vertex" in name.lower(): + LLMFrontendNode.format_vertex_field(field, name) SHOW_FIELDS = ["repo_id"] if field.name in SHOW_FIELDS: field.show = True From 156b3cc5c2bae3d49a9261af70c371748f1220f4 Mon Sep 17 00:00:00 2001 From: Gabriel Luiz Freitas Almeida Date: Fri, 30 Jun 2023 11:10:52 -0300 Subject: [PATCH 129/169] =?UTF-8?q?=F0=9F=94=A7=20chore(config.yaml):=20co?= =?UTF-8?q?mment=20out=20ChatVertexAI=20integration=20due=20to=20a=20bug?= =?UTF-8?q?=20causing=20AttributeError=20The=20ChatVertexAI=20integration?= =?UTF-8?q?=20is=20temporarily=20commented=20out=20due=20to=20a=20bug=20th?= =?UTF-8?q?at=20causes=20an=20AttributeError.=20This=20bug=20needs=20to=20?= =?UTF-8?q?be=20resolved=20before=20the=20integration=20can=20be=20activat?= =?UTF-8?q?ed=20again.?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/backend/langflow/config.yaml | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/src/backend/langflow/config.yaml b/src/backend/langflow/config.yaml index a67242487..d492d16ed 100644 --- a/src/backend/langflow/config.yaml +++ b/src/backend/langflow/config.yaml @@ -121,6 +121,13 @@ llms: documentation: "https://python.langchain.com/docs/modules/model_io/models/llms/integrations/huggingface_hub" VertexAI: documentation: "https://python.langchain.com/docs/modules/model_io/models/llms/integrations/google_vertex_ai_palm" + ### + # There's a bug in this component deactivating until we get it sorted: _language_models.py", line 804, in send_message + # is_blocked=safety_attributes.get("blocked", False), + # AttributeError: 'list' object has no attribute 'get' + # ChatVertexAI: + # documentation: "https://python.langchain.com/docs/modules/model_io/models/chat/integrations/google_vertex_ai_palm" + ### memories: ConversationBufferMemory: documentation: "https://python.langchain.com/docs/modules/memory/how_to/buffer" From 168a1b9e0f3db422a0dbbf7f81c4943f1ccfee30 Mon Sep 17 00:00:00 2001 From: Cristhian Zanforlin Lousa Date: Fri, 30 Jun 2023 13:49:49 -0300 Subject: [PATCH 130/169] merging branch release into dev --- poetry.lock | 827 +++++++++++++----- pyproject.toml | 29 +- src/backend/langflow/__main__.py | 40 +- src/backend/langflow/api/v1/chat.py | 48 +- src/backend/langflow/api/v1/endpoints.py | 4 +- src/backend/langflow/api/v1/schemas.py | 10 + src/backend/langflow/chat/config.py | 2 + src/backend/langflow/config.yaml | 379 +++++--- src/backend/langflow/custom/customs.py | 3 + src/backend/langflow/graph/__init__.py | 2 + src/backend/langflow/graph/graph/constants.py | 42 +- src/backend/langflow/graph/vertex/types.py | 5 + src/backend/langflow/interface/base.py | 20 +- .../langflow/interface/importing/utils.py | 6 + .../langflow/interface/initialize/loading.py | 118 ++- src/backend/langflow/interface/listing.py | 2 + .../langflow/interface/memories/base.py | 16 +- .../langflow/interface/retrievers/__init__.py | 0 .../langflow/interface/retrievers/base.py | 58 ++ src/backend/langflow/interface/types.py | 5 + src/backend/langflow/interface/utils.py | 6 +- src/backend/langflow/main.py | 40 + src/backend/langflow/processing/process.py | 4 + src/backend/langflow/settings.py | 53 +- src/backend/langflow/template/field/base.py | 1 + .../langflow/template/frontend_node/base.py | 83 +- .../langflow/template/frontend_node/chains.py | 4 + .../template/frontend_node/constants.py | 26 + .../frontend_node/formatter/__init__.py | 0 .../template/frontend_node/formatter/base.py | 10 + .../formatter/field_formatters.py | 162 ++++ .../langflow/template/frontend_node/llms.py | 18 + .../template/frontend_node/memories.py | 55 ++ .../template/frontend_node/retrievers.py | 15 + .../template/frontend_node/textsplitters.py | 19 + .../template/frontend_node/vectorstores.py | 2 +- src/backend/langflow/utils/util.py | 4 + src/frontend/package-lock.json | 294 ++++++- src/frontend/package.json | 6 +- .../components/parameterComponent/index.tsx | 31 +- .../src/CustomNodes/GenericNode/index.tsx | 15 +- .../components/AccordionComponent/index.tsx | 56 ++ .../components/ShadTooltipComponent/index.tsx | 20 +- .../chatComponent/chatMessage/index.tsx | 9 +- .../components/codeAreaComponent/index.tsx | 6 +- .../components/dropdownComponent/index.tsx | 19 +- .../src/components/floatComponent/index.tsx | 4 +- .../components/inputFileComponent/index.tsx | 4 +- .../components/inputListComponent/index.tsx | 13 +- .../src/components/intComponent/index.tsx | 4 +- .../src/components/promptComponent/index.tsx | 2 +- src/frontend/src/components/ui/accordion.tsx | 59 ++ src/frontend/src/constants.tsx | 43 +- src/frontend/src/contexts/popUpContext.tsx | 8 +- src/frontend/src/contexts/tabsContext.tsx | 17 +- src/frontend/src/controllers/API/index.ts | 2 +- src/frontend/src/modals/ApiModal/index.tsx | 668 +++++++++++++- src/frontend/src/modals/NodeModal/index.tsx | 5 +- .../modals/chatModal/chatMessage/index.tsx | 16 +- .../src/modals/codeAreaModal/index.tsx | 3 +- .../src/modals/genericModal/index.tsx | 3 +- src/frontend/src/modals/promptModal/index.tsx | 3 +- .../src/modals/textAreaModal/index.tsx | 3 +- .../extraSidebarComponent/index.tsx | 9 +- .../components/nodeToolbarComponent/index.tsx | 82 +- src/frontend/src/types/api/index.ts | 1 + src/frontend/src/types/components/index.ts | 25 +- src/frontend/src/types/tabs/index.ts | 2 + src/frontend/src/utils.ts | 88 +- src/frontend/tailwind.config.js | 14 + tests/test_agents_template.py | 10 + tests/test_chains_template.py | 21 + tests/test_llms_template.py | 31 +- tests/test_prompts_template.py | 88 +- tests/test_websocket.py | 2 +- 75 files changed, 2956 insertions(+), 848 deletions(-) create mode 100644 src/backend/langflow/chat/config.py create mode 100644 src/backend/langflow/interface/retrievers/__init__.py create mode 100644 src/backend/langflow/interface/retrievers/base.py create mode 100644 src/backend/langflow/template/frontend_node/formatter/__init__.py create mode 100644 src/backend/langflow/template/frontend_node/formatter/base.py create mode 100644 src/backend/langflow/template/frontend_node/formatter/field_formatters.py create mode 100644 src/backend/langflow/template/frontend_node/retrievers.py create mode 100644 src/frontend/src/components/AccordionComponent/index.tsx create mode 100644 src/frontend/src/components/ui/accordion.tsx diff --git a/poetry.lock b/poetry.lock index b13392910..e8bf033b7 100644 --- a/poetry.lock +++ b/poetry.lock @@ -150,24 +150,23 @@ files = [ [[package]] name = "anthropic" -version = "0.2.10" -description = "Library for accessing the anthropic API" +version = "0.3.1" +description = "Client library for the anthropic API" category = "main" optional = false -python-versions = ">=3.8" +python-versions = ">=3.7,<4.0" files = [ - {file = "anthropic-0.2.10-py3-none-any.whl", hash = "sha256:a007496207fd186b0bcb9592b00ca130069d2a427f3d6f602a61dbbd1ac6316e"}, - {file = "anthropic-0.2.10.tar.gz", hash = "sha256:e4da061a86d8ffb86072c0b0feaf219a3a4f7dfddd4224df9ba769e469498c19"}, + {file = "anthropic-0.3.1-py3-none-any.whl", hash = "sha256:bbb534e81018aa756fc4cc79b76b802871c99743a309aa3278f955999aa62d08"}, + {file = "anthropic-0.3.1.tar.gz", hash = "sha256:6714ae9192721278189bc619364b52bf42fd00d35f22172b9f8e4090382399ed"}, ] [package.dependencies] -aiohttp = "*" -httpx = "*" -requests = "*" -tokenizers = "*" - -[package.extras] -dev = ["black (>=22.3.0)", "pytest"] +anyio = ">=3.5.0" +distro = ">=1.7.0" +httpx = ">=0.23.0" +pydantic = ">=1.9.0" +tokenizers = ">=0.13.0" +typing-extensions = ">=4.1.1" [[package]] name = "anyio" @@ -770,19 +769,20 @@ sqlalchemy = ["sqlalchemy (>1.3.21,<2.0)"] [[package]] name = "cohere" -version = "4.9.0" +version = "4.11.2" description = "" category = "main" optional = false python-versions = ">=3.7,<4.0" files = [ - {file = "cohere-4.9.0-py3-none-any.whl", hash = "sha256:d29affeb26e882518b0a28ee85aabb8bfbe65576228de04ec2a9aa375f582729"}, - {file = "cohere-4.9.0.tar.gz", hash = "sha256:e1df3dc7e3e0e47652532c6bc87e8eb8c30688c7de1d7417e56cb45d2fbea1b6"}, + {file = "cohere-4.11.2-py3-none-any.whl", hash = "sha256:c5032f4a2aafbcfdf1cacd5b49121c8cc4804fbd121d4a7ac0dfea499398ea28"}, + {file = "cohere-4.11.2.tar.gz", hash = "sha256:4d3e663a306e6fcb87c41cded2195257ebc6992d361a70417f6616f045c4ec47"}, ] [package.dependencies] aiohttp = ">=3.0,<4.0" backoff = ">=2.0,<3.0" +importlib_metadata = ">=6.0,<7.0" requests = ">=2.0,<3.0" [[package]] @@ -1079,6 +1079,18 @@ files = [ [package.extras] graph = ["objgraph (>=1.7.2)"] +[[package]] +name = "distro" +version = "1.8.0" +description = "Distro - an OS platform information API" +category = "main" +optional = false +python-versions = ">=3.6" +files = [ + {file = "distro-1.8.0-py3-none-any.whl", hash = "sha256:99522ca3e365cac527b44bde033f64c6945d90eb9f769703caaec52b09bbd3ff"}, + {file = "distro-1.8.0.tar.gz", hash = "sha256:02e111d1dc6a50abb8eed6bf31c3e48ed8b0830d1ea2a1b78c61765c2513fdd8"}, +] + [[package]] name = "dnspython" version = "2.3.0" @@ -1395,6 +1407,18 @@ files = [ docs = ["furo (>=2023.5.20)", "sphinx (>=7.0.1)", "sphinx-autodoc-typehints (>=1.23,!=1.23.4)"] testing = ["covdefaults (>=2.3)", "coverage (>=7.2.7)", "diff-cover (>=7.5)", "pytest (>=7.3.1)", "pytest-cov (>=4.1)", "pytest-mock (>=3.10)", "pytest-timeout (>=2.1)"] +[[package]] +name = "filetype" +version = "1.2.0" +description = "Infer file type and MIME type of any file/buffer. No external dependencies." +category = "main" +optional = false +python-versions = "*" +files = [ + {file = "filetype-1.2.0-py2.py3-none-any.whl", hash = "sha256:7ce71b6880181241cf7ac8697a2f1eb6a8bd9b429f7ad6d27b8db9ba5f1c2d25"}, + {file = "filetype-1.2.0.tar.gz", hash = "sha256:66b56cd6474bf41d8c54660347d37afcc3f7d1970648de365c102ef77548aadb"}, +] + [[package]] name = "flatbuffers" version = "23.5.26" @@ -1491,6 +1515,42 @@ files = [ {file = "frozenlist-1.3.3.tar.gz", hash = "sha256:58bcc55721e8a90b88332d6cd441261ebb22342e238296bb330968952fbb3a6a"}, ] +[[package]] +name = "fsspec" +version = "2023.6.0" +description = "File-system specification" +category = "main" +optional = false +python-versions = ">=3.8" +files = [ + {file = "fsspec-2023.6.0-py3-none-any.whl", hash = "sha256:1cbad1faef3e391fba6dc005ae9b5bdcbf43005c9167ce78c915549c352c869a"}, + {file = "fsspec-2023.6.0.tar.gz", hash = "sha256:d0b2f935446169753e7a5c5c55681c54ea91996cc67be93c39a154fb3a2742af"}, +] + +[package.extras] +abfs = ["adlfs"] +adl = ["adlfs"] +arrow = ["pyarrow (>=1)"] +dask = ["dask", "distributed"] +devel = ["pytest", "pytest-cov"] +dropbox = ["dropbox", "dropboxdrivefs", "requests"] +full = ["adlfs", "aiohttp (!=4.0.0a0,!=4.0.0a1)", "dask", "distributed", "dropbox", "dropboxdrivefs", "fusepy", "gcsfs", "libarchive-c", "ocifs", "panel", "paramiko", "pyarrow (>=1)", "pygit2", "requests", "s3fs", "smbprotocol", "tqdm"] +fuse = ["fusepy"] +gcs = ["gcsfs"] +git = ["pygit2"] +github = ["requests"] +gs = ["gcsfs"] +gui = ["panel"] +hdfs = ["pyarrow (>=1)"] +http = ["aiohttp (!=4.0.0a0,!=4.0.0a1)", "requests"] +libarchive = ["libarchive-c"] +oci = ["ocifs"] +s3 = ["s3fs"] +sftp = ["paramiko"] +smb = ["smbprotocol"] +ssh = ["paramiko"] +tqdm = ["tqdm"] + [[package]] name = "gitdb" version = "4.0.10" @@ -1546,14 +1606,14 @@ grpcio-gcp = ["grpcio-gcp (>=0.2.2,<1.0.dev0)"] [[package]] name = "google-api-python-client" -version = "2.90.0" +version = "2.91.0" description = "Google API Client Library for Python" category = "main" optional = false python-versions = ">=3.7" files = [ - {file = "google-api-python-client-2.90.0.tar.gz", hash = "sha256:cbcb3ba8be37c6806676a49df16ac412077e5e5dc7fa967941eff977b31fba03"}, - {file = "google_api_python_client-2.90.0-py2.py3-none-any.whl", hash = "sha256:4a41ffb7797d4f28e44635fb1e7076240b741c6493e7c3233c0e4421cec7c913"}, + {file = "google-api-python-client-2.91.0.tar.gz", hash = "sha256:d9385ad6e7f95eecd40f7c81e3abfe4b6ad3a84f2c16bcdb66fb7b8dd814ed56"}, + {file = "google_api_python_client-2.91.0-py2.py3-none-any.whl", hash = "sha256:6959d21d4b20c0f65c69662ca7b6a8a02fc08f3e7f72d70b28ae3e6e3a5f9ab2"}, ] [package.dependencies] @@ -1565,14 +1625,14 @@ uritemplate = ">=3.0.1,<5" [[package]] name = "google-auth" -version = "2.20.0" +version = "2.21.0" description = "Google Authentication Library" category = "main" optional = false python-versions = ">=3.6" files = [ - {file = "google-auth-2.20.0.tar.gz", hash = "sha256:030af34138909ccde0fbce611afc178f1d65d32fbff281f25738b1fe1c6f3eaa"}, - {file = "google_auth-2.20.0-py2.py3-none-any.whl", hash = "sha256:23b7b0950fcda519bfb6692bf0d5289d2ea49fc143717cc7188458ec620e63fa"}, + {file = "google-auth-2.21.0.tar.gz", hash = "sha256:b28e8048e57727e7cf0e5bd8e7276b212aef476654a09511354aa82753b45c66"}, + {file = "google_auth-2.21.0-py2.py3-none-any.whl", hash = "sha256:da3f18d074fa0f5a7061d99b9af8cee3aa6189c987af7c1b07d94566b6b11268"}, ] [package.dependencies] @@ -2076,18 +2136,19 @@ socks = ["socksio (>=1.0.0,<2.0.0)"] [[package]] name = "huggingface-hub" -version = "0.13.4" +version = "0.15.1" description = "Client library to download and publish models, datasets and other repos on the huggingface.co hub" category = "main" optional = false python-versions = ">=3.7.0" files = [ - {file = "huggingface_hub-0.13.4-py3-none-any.whl", hash = "sha256:4d3d40593de6673d624a4baaaf249b9bf5165bfcafd1ad58de361931f0b4fda5"}, - {file = "huggingface_hub-0.13.4.tar.gz", hash = "sha256:db83d9c2f76aed8cf49893ffadd6be24e82074da2f64b1d36b8ba40eb255e115"}, + {file = "huggingface_hub-0.15.1-py3-none-any.whl", hash = "sha256:05b0fb0abbf1f625dfee864648ac3049fe225ac4371c7bafaca0c2d3a2f83445"}, + {file = "huggingface_hub-0.15.1.tar.gz", hash = "sha256:a61b7d1a7769fe10119e730277c72ab99d95c48d86a3d6da3e9f3d0f632a4081"}, ] [package.dependencies] filelock = "*" +fsspec = "*" packaging = ">=20.9" pyyaml = ">=5.1" requests = "*" @@ -2095,13 +2156,13 @@ tqdm = ">=4.42.1" typing-extensions = ">=3.7.4.3" [package.extras] -all = ["InquirerPy (==0.3.4)", "Jinja2", "Pillow", "black (>=23.1,<24.0)", "jedi", "mypy (==0.982)", "pytest", "pytest-cov", "pytest-env", "pytest-xdist", "ruff (>=0.0.241)", "soundfile", "types-PyYAML", "types-requests", "types-simplejson", "types-toml", "types-tqdm", "types-urllib3"] +all = ["InquirerPy (==0.3.4)", "Jinja2", "Pillow", "black (>=23.1,<24.0)", "gradio", "jedi", "mypy (==0.982)", "numpy", "pytest", "pytest-cov", "pytest-env", "pytest-vcr", "pytest-xdist", "ruff (>=0.0.241)", "soundfile", "types-PyYAML", "types-requests", "types-simplejson", "types-toml", "types-tqdm", "types-urllib3", "urllib3 (<2.0)"] cli = ["InquirerPy (==0.3.4)"] -dev = ["InquirerPy (==0.3.4)", "Jinja2", "Pillow", "black (>=23.1,<24.0)", "jedi", "mypy (==0.982)", "pytest", "pytest-cov", "pytest-env", "pytest-xdist", "ruff (>=0.0.241)", "soundfile", "types-PyYAML", "types-requests", "types-simplejson", "types-toml", "types-tqdm", "types-urllib3"] +dev = ["InquirerPy (==0.3.4)", "Jinja2", "Pillow", "black (>=23.1,<24.0)", "gradio", "jedi", "mypy (==0.982)", "numpy", "pytest", "pytest-cov", "pytest-env", "pytest-vcr", "pytest-xdist", "ruff (>=0.0.241)", "soundfile", "types-PyYAML", "types-requests", "types-simplejson", "types-toml", "types-tqdm", "types-urllib3", "urllib3 (<2.0)"] fastai = ["fastai (>=2.4)", "fastcore (>=1.3.27)", "toml"] quality = ["black (>=23.1,<24.0)", "mypy (==0.982)", "ruff (>=0.0.241)"] tensorflow = ["graphviz", "pydot", "tensorflow"] -testing = ["InquirerPy (==0.3.4)", "Jinja2", "Pillow", "jedi", "pytest", "pytest-cov", "pytest-env", "pytest-xdist", "soundfile"] +testing = ["InquirerPy (==0.3.4)", "Jinja2", "Pillow", "gradio", "jedi", "numpy", "pytest", "pytest-cov", "pytest-env", "pytest-vcr", "pytest-xdist", "soundfile", "urllib3 (<2.0)"] torch = ["torch"] typing = ["types-PyYAML", "types-requests", "types-simplejson", "types-toml", "types-tqdm", "types-urllib3"] @@ -2146,21 +2207,21 @@ files = [ [[package]] name = "importlib-metadata" -version = "4.13.0" +version = "6.0.1" description = "Read metadata from Python packages" category = "main" optional = false python-versions = ">=3.7" files = [ - {file = "importlib_metadata-4.13.0-py3-none-any.whl", hash = "sha256:8a8a81bcf996e74fee46f0d16bd3eaa382a7eb20fd82445c3ad11f4090334116"}, - {file = "importlib_metadata-4.13.0.tar.gz", hash = "sha256:dd0173e8f150d6815e098fd354f6414b0f079af4644ddfe90c71e2fc6174346d"}, + {file = "importlib_metadata-6.0.1-py3-none-any.whl", hash = "sha256:1543daade821c89b1c4a55986c326f36e54f2e6ca3bad96be4563d0acb74dcd4"}, + {file = "importlib_metadata-6.0.1.tar.gz", hash = "sha256:950127d57e35a806d520817d3e92eec3f19fdae9f0cd99da77a407c5aabefba3"}, ] [package.dependencies] zipp = ">=0.5" [package.extras] -docs = ["furo", "jaraco.packaging (>=9)", "jaraco.tidelift (>=1.4)", "rst.linker (>=1.9)", "sphinx (>=3.5)"] +docs = ["furo", "jaraco.packaging (>=9)", "jaraco.tidelift (>=1.4)", "rst.linker (>=1.9)", "sphinx (>=3.5)", "sphinx-lint"] perf = ["ipython"] testing = ["flake8 (<5)", "flufl.flake8", "importlib-resources (>=1.3)", "packaging", "pyfakefs", "pytest (>=6)", "pytest-black (>=0.3.7)", "pytest-checkdocs (>=2.4)", "pytest-cov", "pytest-enabler (>=1.3)", "pytest-flake8", "pytest-mypy (>=0.9.1)", "pytest-perf (>=0.9.2)"] @@ -2523,14 +2584,14 @@ i18n = ["Babel (>=2.7)"] [[package]] name = "joblib" -version = "1.2.0" +version = "1.3.1" description = "Lightweight pipelining with Python functions" category = "main" optional = false python-versions = ">=3.7" files = [ - {file = "joblib-1.2.0-py3-none-any.whl", hash = "sha256:091138ed78f800342968c523bdde947e7a305b8594b910a0fea2ab83c3c6d385"}, - {file = "joblib-1.2.0.tar.gz", hash = "sha256:e1cee4a79e4af22881164f218d4311f60074197fb707e082e803b61f6d137018"}, + {file = "joblib-1.3.1-py3-none-any.whl", hash = "sha256:89cf0529520e01b3de7ac7b74a8102c90d16d54c64b5dd98cafcd14307fdf915"}, + {file = "joblib-1.3.1.tar.gz", hash = "sha256:1f937906df65329ba98013dc9692fe22a4c5e4a648112de500508b18a21b41e3"}, ] [[package]] @@ -2604,14 +2665,14 @@ testing = ["pytest (>=6)", "pytest-black (>=0.3.7)", "pytest-checkdocs (>=2.4)", [[package]] name = "langchain" -version = "0.0.215" +version = "0.0.219" description = "Building applications with LLMs through composability" category = "main" optional = false python-versions = ">=3.8.1,<4.0" files = [ - {file = "langchain-0.0.215-py3-none-any.whl", hash = "sha256:af9587c2eb317a6e33123f8a4ee8ccd8685cfab62359ea4fec52c962d9646acf"}, - {file = "langchain-0.0.215.tar.gz", hash = "sha256:a6b261f3be941eeac2d9b37fbf8996fa4279ef724f064e8c90813046126da85b"}, + {file = "langchain-0.0.219-py3-none-any.whl", hash = "sha256:1f08a00e622f1c75087d6013f34e82be3f8dd1859266eb583a0fd7bc045090cf"}, + {file = "langchain-0.0.219.tar.gz", hash = "sha256:842f8212939e5ac4005906d2215574ffb3e34d2fe28f5bc0f46eb3b28fb29c5d"}, ] [package.dependencies] @@ -2629,13 +2690,14 @@ SQLAlchemy = ">=1.4,<3" tenacity = ">=8.1.0,<9.0.0" [package.extras] -all = ["O365 (>=2.0.26,<3.0.0)", "aleph-alpha-client (>=2.15.0,<3.0.0)", "anthropic (>=0.2.6,<0.3.0)", "arxiv (>=1.4,<2.0)", "atlassian-python-api (>=3.36.0,<4.0.0)", "awadb (>=0.3.3,<0.4.0)", "azure-ai-formrecognizer (>=3.2.1,<4.0.0)", "azure-ai-vision (>=0.11.1b1,<0.12.0)", "azure-cognitiveservices-speech (>=1.28.0,<2.0.0)", "azure-cosmos (>=4.4.0b1,<5.0.0)", "azure-identity (>=1.12.0,<2.0.0)", "beautifulsoup4 (>=4,<5)", "clarifai (==9.1.0)", "clickhouse-connect (>=0.5.14,<0.6.0)", "cohere (>=3,<4)", "deeplake (>=3.6.2,<4.0.0)", "docarray[hnswlib] (>=0.32.0,<0.33.0)", "duckduckgo-search (>=3.8.3,<4.0.0)", "elasticsearch (>=8,<9)", "faiss-cpu (>=1,<2)", "google-api-python-client (==2.70.0)", "google-auth (>=2.18.1,<3.0.0)", "google-search-results (>=2,<3)", "gptcache (>=0.1.7)", "html2text (>=2020.1.16,<2021.0.0)", "huggingface_hub (>=0,<1)", "jina (>=3.14,<4.0)", "jinja2 (>=3,<4)", "jq (>=1.4.1,<2.0.0)", "lancedb (>=0.1,<0.2)", "langkit (>=0.0.1.dev3,<0.1.0)", "lark (>=1.1.5,<2.0.0)", "lxml (>=4.9.2,<5.0.0)", "manifest-ml (>=0.0.1,<0.0.2)", "momento (>=1.5.0,<2.0.0)", "nebula3-python (>=3.4.0,<4.0.0)", "neo4j (>=5.8.1,<6.0.0)", "networkx (>=2.6.3,<3.0.0)", "nlpcloud (>=1,<2)", "nltk (>=3,<4)", "nomic (>=1.0.43,<2.0.0)", "openai (>=0,<1)", "openlm (>=0.0.5,<0.0.6)", "opensearch-py (>=2.0.0,<3.0.0)", "pdfminer-six (>=20221105,<20221106)", "pexpect (>=4.8.0,<5.0.0)", "pgvector (>=0.1.6,<0.2.0)", "pinecone-client (>=2,<3)", "pinecone-text (>=0.4.2,<0.5.0)", "psycopg2-binary (>=2.9.5,<3.0.0)", "pymongo (>=4.3.3,<5.0.0)", "pyowm (>=3.3.0,<4.0.0)", "pypdf (>=3.4.0,<4.0.0)", "pytesseract (>=0.3.10,<0.4.0)", "pyvespa (>=0.33.0,<0.34.0)", "qdrant-client (>=1.1.2,<2.0.0)", "redis (>=4,<5)", "requests-toolbelt (>=1.0.0,<2.0.0)", "sentence-transformers (>=2,<3)", "singlestoredb (>=0.7.1,<0.8.0)", "spacy (>=3,<4)", "steamship (>=2.16.9,<3.0.0)", "tensorflow-text (>=2.11.0,<3.0.0)", "tigrisdb (>=1.0.0b6,<2.0.0)", "tiktoken (>=0.3.2,<0.4.0)", "torch (>=1,<3)", "transformers (>=4,<5)", "weaviate-client (>=3,<4)", "wikipedia (>=1,<2)", "wolframalpha (==5.0.0)"] +all = ["O365 (>=2.0.26,<3.0.0)", "aleph-alpha-client (>=2.15.0,<3.0.0)", "anthropic (>=0.2.6,<0.3.0)", "arxiv (>=1.4,<2.0)", "atlassian-python-api (>=3.36.0,<4.0.0)", "awadb (>=0.3.3,<0.4.0)", "azure-ai-formrecognizer (>=3.2.1,<4.0.0)", "azure-ai-vision (>=0.11.1b1,<0.12.0)", "azure-cognitiveservices-speech (>=1.28.0,<2.0.0)", "azure-cosmos (>=4.4.0b1,<5.0.0)", "azure-identity (>=1.12.0,<2.0.0)", "beautifulsoup4 (>=4,<5)", "clarifai (==9.1.0)", "clickhouse-connect (>=0.5.14,<0.6.0)", "cohere (>=3,<4)", "deeplake (>=3.6.2,<4.0.0)", "docarray[hnswlib] (>=0.32.0,<0.33.0)", "duckduckgo-search (>=3.8.3,<4.0.0)", "elasticsearch (>=8,<9)", "esprima (>=4.0.1,<5.0.0)", "faiss-cpu (>=1,<2)", "google-api-python-client (==2.70.0)", "google-auth (>=2.18.1,<3.0.0)", "google-search-results (>=2,<3)", "gptcache (>=0.1.7)", "html2text (>=2020.1.16,<2021.0.0)", "huggingface_hub (>=0,<1)", "jina (>=3.14,<4.0)", "jinja2 (>=3,<4)", "jq (>=1.4.1,<2.0.0)", "lancedb (>=0.1,<0.2)", "langkit (>=0.0.1.dev3,<0.1.0)", "lark (>=1.1.5,<2.0.0)", "lxml (>=4.9.2,<5.0.0)", "manifest-ml (>=0.0.1,<0.0.2)", "momento (>=1.5.0,<2.0.0)", "nebula3-python (>=3.4.0,<4.0.0)", "neo4j (>=5.8.1,<6.0.0)", "networkx (>=2.6.3,<3.0.0)", "nlpcloud (>=1,<2)", "nltk (>=3,<4)", "nomic (>=1.0.43,<2.0.0)", "octoai-sdk (>=0.1.1,<0.2.0)", "openai (>=0,<1)", "openlm (>=0.0.5,<0.0.6)", "opensearch-py (>=2.0.0,<3.0.0)", "pdfminer-six (>=20221105,<20221106)", "pexpect (>=4.8.0,<5.0.0)", "pgvector (>=0.1.6,<0.2.0)", "pinecone-client (>=2,<3)", "pinecone-text (>=0.4.2,<0.5.0)", "psycopg2-binary (>=2.9.5,<3.0.0)", "pymongo (>=4.3.3,<5.0.0)", "pyowm (>=3.3.0,<4.0.0)", "pypdf (>=3.4.0,<4.0.0)", "pytesseract (>=0.3.10,<0.4.0)", "pyvespa (>=0.33.0,<0.34.0)", "qdrant-client (>=1.1.2,<2.0.0)", "redis (>=4,<5)", "requests-toolbelt (>=1.0.0,<2.0.0)", "sentence-transformers (>=2,<3)", "singlestoredb (>=0.7.1,<0.8.0)", "spacy (>=3,<4)", "steamship (>=2.16.9,<3.0.0)", "tensorflow-text (>=2.11.0,<3.0.0)", "tigrisdb (>=1.0.0b6,<2.0.0)", "tiktoken (>=0.3.2,<0.4.0)", "torch (>=1,<3)", "transformers (>=4,<5)", "weaviate-client (>=3,<4)", "wikipedia (>=1,<2)", "wolframalpha (==5.0.0)"] azure = ["azure-ai-formrecognizer (>=3.2.1,<4.0.0)", "azure-ai-vision (>=0.11.1b1,<0.12.0)", "azure-cognitiveservices-speech (>=1.28.0,<2.0.0)", "azure-core (>=1.26.4,<2.0.0)", "azure-cosmos (>=4.4.0b1,<5.0.0)", "azure-identity (>=1.12.0,<2.0.0)", "azure-search-documents (==11.4.0a20230509004)", "openai (>=0,<1)"] clarifai = ["clarifai (==9.1.0)"] cohere = ["cohere (>=3,<4)"] docarray = ["docarray[hnswlib] (>=0.32.0,<0.33.0)"] embeddings = ["sentence-transformers (>=2,<3)"] -extended-testing = ["atlassian-python-api (>=3.36.0,<4.0.0)", "beautifulsoup4 (>=4,<5)", "bibtexparser (>=1.4.0,<2.0.0)", "chardet (>=5.1.0,<6.0.0)", "gql (>=3.4.1,<4.0.0)", "html2text (>=2020.1.16,<2021.0.0)", "jq (>=1.4.1,<2.0.0)", "lxml (>=4.9.2,<5.0.0)", "openai (>=0,<1)", "pandas (>=2.0.1,<3.0.0)", "pdfminer-six (>=20221105,<20221106)", "pgvector (>=0.1.6,<0.2.0)", "psychicapi (>=0.5,<0.6)", "py-trello (>=0.19.0,<0.20.0)", "pymupdf (>=1.22.3,<2.0.0)", "pypdf (>=3.4.0,<4.0.0)", "pypdfium2 (>=4.10.0,<5.0.0)", "pyspark (>=3.4.0,<4.0.0)", "requests-toolbelt (>=1.0.0,<2.0.0)", "scikit-learn (>=1.2.2,<2.0.0)", "streamlit (>=1.18.0,<2.0.0)", "telethon (>=1.28.5,<2.0.0)", "tqdm (>=4.48.0)", "zep-python (>=0.31)"] +extended-testing = ["atlassian-python-api (>=3.36.0,<4.0.0)", "beautifulsoup4 (>=4,<5)", "bibtexparser (>=1.4.0,<2.0.0)", "chardet (>=5.1.0,<6.0.0)", "esprima (>=4.0.1,<5.0.0)", "gql (>=3.4.1,<4.0.0)", "html2text (>=2020.1.16,<2021.0.0)", "jq (>=1.4.1,<2.0.0)", "lxml (>=4.9.2,<5.0.0)", "openai (>=0,<1)", "pandas (>=2.0.1,<3.0.0)", "pdfminer-six (>=20221105,<20221106)", "pgvector (>=0.1.6,<0.2.0)", "psychicapi (>=0.8.0,<0.9.0)", "py-trello (>=0.19.0,<0.20.0)", "pymupdf (>=1.22.3,<2.0.0)", "pypdf (>=3.4.0,<4.0.0)", "pypdfium2 (>=4.10.0,<5.0.0)", "pyspark (>=3.4.0,<4.0.0)", "requests-toolbelt (>=1.0.0,<2.0.0)", "scikit-learn (>=1.2.2,<2.0.0)", "streamlit (>=1.18.0,<2.0.0)", "telethon (>=1.28.5,<2.0.0)", "tqdm (>=4.48.0)", "zep-python (>=0.31)"] +javascript = ["esprima (>=4.0.1,<5.0.0)"] llms = ["anthropic (>=0.2.6,<0.3.0)", "clarifai (==9.1.0)", "cohere (>=3,<4)", "huggingface_hub (>=0,<1)", "manifest-ml (>=0.0.1,<0.0.2)", "nlpcloud (>=1,<2)", "openai (>=0,<1)", "openllm (>=0.1.6)", "openlm (>=0.0.5,<0.0.6)", "torch (>=1,<3)", "transformers (>=4,<5)"] openai = ["openai (>=0,<1)", "tiktoken (>=0.3.2,<0.4.0)"] qdrant = ["qdrant-client (>=1.1.2,<2.0.0)"] @@ -2643,13 +2705,13 @@ text-helpers = ["chardet (>=5.1.0,<6.0.0)"] [[package]] name = "langchain-serve" -version = "0.0.47" +version = "0.0.48" description = "Langchain Serve - serve your langchain apps on Jina AI Cloud." category = "main" optional = true python-versions = "*" files = [ - {file = "langchain-serve-0.0.47.tar.gz", hash = "sha256:2b7827ddaffa4fe6eb8fa988fc8b9be827ded702340f1644f065200b89fdc3a9"}, + {file = "langchain-serve-0.0.48.tar.gz", hash = "sha256:4644eb7a6aa733edcd809a0becf49a2899c285a5adb0bab454f91bbb8e0be39b"}, ] [package.dependencies] @@ -2684,6 +2746,27 @@ pydantic = ">=1,<2" requests = ">=2,<3" tenacity = ">=8.1.0,<9.0.0" +[[package]] +name = "linkify-it-py" +version = "2.0.2" +description = "Links recognition library with FULL unicode support." +category = "main" +optional = true +python-versions = ">=3.7" +files = [ + {file = "linkify-it-py-2.0.2.tar.gz", hash = "sha256:19f3060727842c254c808e99d465c80c49d2c7306788140987a1a7a29b0d6ad2"}, + {file = "linkify_it_py-2.0.2-py3-none-any.whl", hash = "sha256:a3a24428f6c96f27370d7fe61d2ac0be09017be5190d68d8658233171f1b6541"}, +] + +[package.dependencies] +uc-micro-py = "*" + +[package.extras] +benchmark = ["pytest", "pytest-benchmark"] +dev = ["black", "flake8", "isort", "pre-commit", "pyproject-flake8"] +doc = ["myst-parser", "sphinx", "sphinx-book-theme"] +test = ["coverage", "pytest", "pytest-cov"] + [[package]] name = "llama-cpp-python" version = "0.1.55" @@ -2880,17 +2963,19 @@ testing = ["coverage", "pyyaml"] [[package]] name = "markdown-it-py" -version = "3.0.0" +version = "2.2.0" description = "Python port of markdown-it. Markdown parsing, done right!" category = "main" optional = false -python-versions = ">=3.8" +python-versions = ">=3.7" files = [ - {file = "markdown-it-py-3.0.0.tar.gz", hash = "sha256:e3f60a94fa066dc52ec76661e37c851cb232d92f9886b15cb560aaada2df8feb"}, - {file = "markdown_it_py-3.0.0-py3-none-any.whl", hash = "sha256:355216845c60bd96232cd8d8c40e8f9765cc86f46880e43a8fd22dc1a1a8cab1"}, + {file = "markdown-it-py-2.2.0.tar.gz", hash = "sha256:7c9a5e412688bc771c67432cbfebcdd686c93ce6484913dccf06cb5a0bea35a1"}, + {file = "markdown_it_py-2.2.0-py3-none-any.whl", hash = "sha256:5a35f8d1870171d9acc47b99612dc146129b631baf04970128b568f190d0cc30"}, ] [package.dependencies] +linkify-it-py = {version = ">=1,<3", optional = true, markers = "extra == \"linkify\""} +mdit-py-plugins = {version = "*", optional = true, markers = "extra == \"plugins\""} mdurl = ">=0.1,<1.0" [package.extras] @@ -2900,7 +2985,7 @@ compare = ["commonmark (>=0.9,<1.0)", "markdown (>=3.4,<4.0)", "mistletoe (>=1.0 linkify = ["linkify-it-py (>=1,<3)"] plugins = ["mdit-py-plugins"] profiling = ["gprof2dot"] -rtd = ["jupyter_sphinx", "mdit-py-plugins", "myst-parser", "pyyaml", "sphinx", "sphinx-copybutton", "sphinx-design", "sphinx_book_theme"] +rtd = ["attrs", "myst-parser", "pyyaml", "sphinx", "sphinx-copybutton", "sphinx-design", "sphinx_book_theme"] testing = ["coverage", "pytest", "pytest-cov", "pytest-regressions"] [[package]] @@ -3014,6 +3099,26 @@ files = [ [package.dependencies] traitlets = "*" +[[package]] +name = "mdit-py-plugins" +version = "0.4.0" +description = "Collection of plugins for markdown-it-py" +category = "main" +optional = true +python-versions = ">=3.8" +files = [ + {file = "mdit_py_plugins-0.4.0-py3-none-any.whl", hash = "sha256:b51b3bb70691f57f974e257e367107857a93b36f322a9e6d44ca5bf28ec2def9"}, + {file = "mdit_py_plugins-0.4.0.tar.gz", hash = "sha256:d8ab27e9aed6c38aa716819fedfde15ca275715955f8a185a8e1cf90fb1d2c1b"}, +] + +[package.dependencies] +markdown-it-py = ">=1.0.0,<4.0.0" + +[package.extras] +code-style = ["pre-commit"] +rtd = ["myst-parser", "sphinx-book-theme"] +testing = ["coverage", "pytest", "pytest-cov", "pytest-regressions"] + [[package]] name = "mdurl" version = "0.1.2" @@ -3256,18 +3361,6 @@ files = [ {file = "mypy_extensions-1.0.0.tar.gz", hash = "sha256:75dbf8955dc00442a438fc4d0666508a9a97b6bd41aa2f0ffe9d2f2725af0782"}, ] -[[package]] -name = "nanoid" -version = "2.0.0" -description = "A tiny, secure, URL-friendly, unique string ID generator for Python" -category = "main" -optional = true -python-versions = "*" -files = [ - {file = "nanoid-2.0.0-py3-none-any.whl", hash = "sha256:90aefa650e328cffb0893bbd4c236cfd44c48bc1f2d0b525ecc53c3187b653bb"}, - {file = "nanoid-2.0.0.tar.gz", hash = "sha256:5a80cad5e9c6e9ae3a41fa2fb34ae189f7cb420b2a5d8f82bd9d23466e4efa68"}, -] - [[package]] name = "nest-asyncio" version = "1.5.6" @@ -3511,77 +3604,97 @@ et-xmlfile = "*" [[package]] name = "opentelemetry-api" -version = "1.16.0" +version = "1.18.0" description = "OpenTelemetry Python API" category = "main" optional = false python-versions = ">=3.7" files = [ - {file = "opentelemetry_api-1.16.0-py3-none-any.whl", hash = "sha256:79e8f0cf88dbdd36b6abf175d2092af1efcaa2e71552d0d2b3b181a9707bf4bc"}, - {file = "opentelemetry_api-1.16.0.tar.gz", hash = "sha256:4b0e895a3b1f5e1908043ebe492d33e33f9ccdbe6d02d3994c2f8721a63ddddb"}, + {file = "opentelemetry_api-1.18.0-py3-none-any.whl", hash = "sha256:d05bcc94ec239fd76fd90d784c5e3ad081a8a1ac2ffc8a2c83a49ace052d1492"}, + {file = "opentelemetry_api-1.18.0.tar.gz", hash = "sha256:2bbf29739fcef268c419e3bf1735566c2e7f81026c14bcc78b62a0b97f8ecf2f"}, ] [package.dependencies] deprecated = ">=1.2.6" +importlib-metadata = ">=6.0.0,<6.1.0" setuptools = ">=16.0" [[package]] name = "opentelemetry-exporter-otlp" -version = "1.16.0" +version = "1.18.0" description = "OpenTelemetry Collector Exporters" category = "main" optional = false python-versions = ">=3.7" files = [ - {file = "opentelemetry_exporter_otlp-1.16.0-py3-none-any.whl", hash = "sha256:e1a91a267afb7ae0196cb25ed0bc0a991ff5d9f3d6b3a7ff7c0bce57be2d72d5"}, - {file = "opentelemetry_exporter_otlp-1.16.0.tar.gz", hash = "sha256:5d76b4a44aa5c11e93b9280eaf93ae497557cf01046485ec1c7bfb2c492dabc4"}, + {file = "opentelemetry_exporter_otlp-1.18.0-py3-none-any.whl", hash = "sha256:2b8d18aa3f8fa360df2fe6c274132cf38939a02f8aa621d6ed060a920aa9e4c6"}, + {file = "opentelemetry_exporter_otlp-1.18.0.tar.gz", hash = "sha256:cafcf7f28debbcc22e06d52cdc4f65a118f17b730dabe8f9d4b87587e95b1481"}, ] [package.dependencies] -opentelemetry-exporter-otlp-proto-grpc = "1.16.0" -opentelemetry-exporter-otlp-proto-http = "1.16.0" +opentelemetry-exporter-otlp-proto-grpc = "1.18.0" +opentelemetry-exporter-otlp-proto-http = "1.18.0" + +[[package]] +name = "opentelemetry-exporter-otlp-proto-common" +version = "1.18.0" +description = "OpenTelemetry Protobuf encoding" +category = "main" +optional = false +python-versions = ">=3.7" +files = [ + {file = "opentelemetry_exporter_otlp_proto_common-1.18.0-py3-none-any.whl", hash = "sha256:276073ccc8c6e6570fe05ca8ca0de77d662bc89bc614ec8bfbc855112f7e25e3"}, + {file = "opentelemetry_exporter_otlp_proto_common-1.18.0.tar.gz", hash = "sha256:4d9883d6929aabe75e485950bbe8b149a14d95e50b1570426832daa6913b0871"}, +] + +[package.dependencies] +opentelemetry-proto = "1.18.0" [[package]] name = "opentelemetry-exporter-otlp-proto-grpc" -version = "1.16.0" +version = "1.18.0" description = "OpenTelemetry Collector Protobuf over gRPC Exporter" category = "main" optional = false python-versions = ">=3.7" files = [ - {file = "opentelemetry_exporter_otlp_proto_grpc-1.16.0-py3-none-any.whl", hash = "sha256:ace2cedc43bc30e1b2475b14f72acf1a1528716965209d31fb0a72c59f0f4fe4"}, - {file = "opentelemetry_exporter_otlp_proto_grpc-1.16.0.tar.gz", hash = "sha256:0853ea1e566c1fab5633e7f7bca2a650ba445b04ba02f93173920b0f5c561f63"}, + {file = "opentelemetry_exporter_otlp_proto_grpc-1.18.0-py3-none-any.whl", hash = "sha256:c773bc9df2c9d6464f0d5936963399b2fc440f0616c1277f29512d540ad7e0a2"}, + {file = "opentelemetry_exporter_otlp_proto_grpc-1.18.0.tar.gz", hash = "sha256:8eddfde4267da876871e62f1b58369986bdb7e47e43032c498f1ea807d7191c4"}, ] [package.dependencies] backoff = {version = ">=1.10.0,<3.0.0", markers = "python_version >= \"3.7\""} +deprecated = ">=1.2.6" googleapis-common-protos = ">=1.52,<2.0" grpcio = ">=1.0.0,<2.0.0" opentelemetry-api = ">=1.15,<2.0" -opentelemetry-proto = "1.16.0" -opentelemetry-sdk = ">=1.16.0,<1.17.0" +opentelemetry-exporter-otlp-proto-common = "1.18.0" +opentelemetry-proto = "1.18.0" +opentelemetry-sdk = ">=1.18.0,<1.19.0" [package.extras] test = ["pytest-grpc"] [[package]] name = "opentelemetry-exporter-otlp-proto-http" -version = "1.16.0" +version = "1.18.0" description = "OpenTelemetry Collector Protobuf over HTTP Exporter" category = "main" optional = false python-versions = ">=3.7" files = [ - {file = "opentelemetry_exporter_otlp_proto_http-1.16.0-py3-none-any.whl", hash = "sha256:f27cabd0e071fb8cc258bcaaad51b0c228fef1156bf6e6b1f9ae738881d9bf51"}, - {file = "opentelemetry_exporter_otlp_proto_http-1.16.0.tar.gz", hash = "sha256:d7f14ae8b41b3606ee3e4ab12d42cb48610d8419f1d8b92c7d3ff5813c7a10d7"}, + {file = "opentelemetry_exporter_otlp_proto_http-1.18.0-py3-none-any.whl", hash = "sha256:c22110705473f1c61bd4d74ded3b8bd3fac66ffbe7d9ba376267d8539919ed90"}, + {file = "opentelemetry_exporter_otlp_proto_http-1.18.0.tar.gz", hash = "sha256:d9a2118558decf9e9a2d6573ad9d33876f3a44d7dc43f10d38a900d5a6f867d6"}, ] [package.dependencies] backoff = {version = ">=1.10.0,<3.0.0", markers = "python_version >= \"3.7\""} +deprecated = ">=1.2.6" googleapis-common-protos = ">=1.52,<2.0" opentelemetry-api = ">=1.15,<2.0" -opentelemetry-proto = "1.16.0" -opentelemetry-sdk = ">=1.16.0,<1.17.0" +opentelemetry-exporter-otlp-proto-common = "1.18.0" +opentelemetry-proto = "1.18.0" +opentelemetry-sdk = ">=1.18.0,<1.19.0" requests = ">=2.7,<3.0" [package.extras] @@ -3606,14 +3719,14 @@ prometheus-client = ">=0.5.0,<1.0.0" [[package]] name = "opentelemetry-instrumentation" -version = "0.37b0" +version = "0.39b0" description = "Instrumentation Tools & Auto Instrumentation for OpenTelemetry Python" category = "main" optional = false python-versions = ">=3.7" files = [ - {file = "opentelemetry_instrumentation-0.37b0-py3-none-any.whl", hash = "sha256:0dbd4d869608667b9dfaf39914312c5979370d5fc5faa36678f5e25fa54f045b"}, - {file = "opentelemetry_instrumentation-0.37b0.tar.gz", hash = "sha256:2a172a7ef8d35332f24a97caf6b7b62fe418a48cf841ae2bcdaed338fea37b41"}, + {file = "opentelemetry_instrumentation-0.39b0-py3-none-any.whl", hash = "sha256:fcfd74413159fe797e343104f7e85a3f8146713634debcac10a057ac7f1eb011"}, + {file = "opentelemetry_instrumentation-0.39b0.tar.gz", hash = "sha256:2a6d1f386aa769dc763e6f2c6b483f50c4024f1bc76a78b57f05ae05970ce5f4"}, ] [package.dependencies] @@ -3623,21 +3736,21 @@ wrapt = ">=1.0.0,<2.0.0" [[package]] name = "opentelemetry-instrumentation-aiohttp-client" -version = "0.37b0" +version = "0.39b0" description = "OpenTelemetry aiohttp client instrumentation" category = "main" optional = false python-versions = ">=3.7" files = [ - {file = "opentelemetry_instrumentation_aiohttp_client-0.37b0-py3-none-any.whl", hash = "sha256:d047c711dff98e35b31ed5b6c801fc59ee5f79cb3d2a6217761a366894d73269"}, - {file = "opentelemetry_instrumentation_aiohttp_client-0.37b0.tar.gz", hash = "sha256:eb21d618aa810ad72764d02b5a6da3d578116ddcb5213c84feba721f0dff7060"}, + {file = "opentelemetry_instrumentation_aiohttp_client-0.39b0-py3-none-any.whl", hash = "sha256:315adf314f35532677b7ae2abd9a663ec86df7183594605592f0e89e599d86ca"}, + {file = "opentelemetry_instrumentation_aiohttp_client-0.39b0.tar.gz", hash = "sha256:20fd66f4aa757728e48efae1351d9eed98d6e352595933f47ca042df9d83fc78"}, ] [package.dependencies] opentelemetry-api = ">=1.12,<2.0" -opentelemetry-instrumentation = "0.37b0" -opentelemetry-semantic-conventions = "0.37b0" -opentelemetry-util-http = "0.37b0" +opentelemetry-instrumentation = "0.39b0" +opentelemetry-semantic-conventions = "0.39b0" +opentelemetry-util-http = "0.39b0" wrapt = ">=1.0.0,<2.0.0" [package.extras] @@ -3646,83 +3759,83 @@ test = ["opentelemetry-instrumentation-aiohttp-client[instruments]"] [[package]] name = "opentelemetry-instrumentation-asgi" -version = "0.37b0" +version = "0.39b0" description = "ASGI instrumentation for OpenTelemetry" category = "main" optional = false python-versions = ">=3.7" files = [ - {file = "opentelemetry_instrumentation_asgi-0.37b0-py3-none-any.whl", hash = "sha256:71ded26c8425b2f44573a2a1ef0b41941436e0b4d1e91067d84ef6ebc1bba49f"}, - {file = "opentelemetry_instrumentation_asgi-0.37b0.tar.gz", hash = "sha256:b8557d8823a04e083aae18f285a4c2ed75746acf9f2e63e44778f2aa8942af02"}, + {file = "opentelemetry_instrumentation_asgi-0.39b0-py3-none-any.whl", hash = "sha256:cb9cbf56e32be12b0e5e70c21cf27999f10920afc73110457f4e4b0ec4078c5f"}, + {file = "opentelemetry_instrumentation_asgi-0.39b0.tar.gz", hash = "sha256:28b76aa6b9fe41fcfa52214c2e554a79cc371927d13c40b22e7a02aff35760eb"}, ] [package.dependencies] asgiref = ">=3.0,<4.0" opentelemetry-api = ">=1.12,<2.0" -opentelemetry-instrumentation = "0.37b0" -opentelemetry-semantic-conventions = "0.37b0" -opentelemetry-util-http = "0.37b0" +opentelemetry-instrumentation = "0.39b0" +opentelemetry-semantic-conventions = "0.39b0" +opentelemetry-util-http = "0.39b0" [package.extras] instruments = ["asgiref (>=3.0,<4.0)"] -test = ["opentelemetry-instrumentation-asgi[instruments]", "opentelemetry-test-utils (==0.37b0)"] +test = ["opentelemetry-instrumentation-asgi[instruments]", "opentelemetry-test-utils (==0.39b0)"] [[package]] name = "opentelemetry-instrumentation-fastapi" -version = "0.37b0" +version = "0.39b0" description = "OpenTelemetry FastAPI Instrumentation" category = "main" optional = false python-versions = ">=3.7" files = [ - {file = "opentelemetry_instrumentation_fastapi-0.37b0-py3-none-any.whl", hash = "sha256:dc983910d9c582addb934f051848158cf0155f4ccca83b5cc10904991c4d429c"}, - {file = "opentelemetry_instrumentation_fastapi-0.37b0.tar.gz", hash = "sha256:84e50dc92b3ae65f4e18d0cad6538db267690361a55644553a5f3b32f64e2de9"}, + {file = "opentelemetry_instrumentation_fastapi-0.39b0-py3-none-any.whl", hash = "sha256:33223b46393ef63229d35c4e0903e900674d3dfc65ada49fbfd51db8742295cb"}, + {file = "opentelemetry_instrumentation_fastapi-0.39b0.tar.gz", hash = "sha256:02d4d583a0a62efc9a94d489f1a736ca2905fb6f7d445ac686608de51d7e375b"}, ] [package.dependencies] opentelemetry-api = ">=1.12,<2.0" -opentelemetry-instrumentation = "0.37b0" -opentelemetry-instrumentation-asgi = "0.37b0" -opentelemetry-semantic-conventions = "0.37b0" -opentelemetry-util-http = "0.37b0" +opentelemetry-instrumentation = "0.39b0" +opentelemetry-instrumentation-asgi = "0.39b0" +opentelemetry-semantic-conventions = "0.39b0" +opentelemetry-util-http = "0.39b0" [package.extras] -instruments = ["fastapi (<=0.90.1)"] -test = ["httpx (>=0.22,<1.0)", "opentelemetry-instrumentation-fastapi[instruments]", "opentelemetry-test-utils (==0.37b0)", "requests (>=2.23,<3.0)"] +instruments = ["fastapi (>=0.58,<1.0)"] +test = ["httpx (>=0.22,<1.0)", "opentelemetry-instrumentation-fastapi[instruments]", "opentelemetry-test-utils (==0.39b0)", "requests (>=2.23,<3.0)"] [[package]] name = "opentelemetry-instrumentation-grpc" -version = "0.37b0" +version = "0.39b0" description = "OpenTelemetry gRPC instrumentation" category = "main" optional = false python-versions = ">=3.7" files = [ - {file = "opentelemetry_instrumentation_grpc-0.37b0-py3-none-any.whl", hash = "sha256:a40ceb2b744b182b9956dd365f9978b2ec24ad01a3ee3945ae000ff5119215d8"}, - {file = "opentelemetry_instrumentation_grpc-0.37b0.tar.gz", hash = "sha256:80d6d3084e0402849a2f5a1fc9bbbcc6821c3dc12b05834765bf4882aa36fe67"}, + {file = "opentelemetry_instrumentation_grpc-0.39b0-py3-none-any.whl", hash = "sha256:1ab7a1e4a43efd8e827d1666065253fdc4dca76ca7bcf43417fe7523999e3145"}, + {file = "opentelemetry_instrumentation_grpc-0.39b0.tar.gz", hash = "sha256:766ea59ff2677301e5354d2113a635c20e462611ecd4b5fb764121759d945bb2"}, ] [package.dependencies] opentelemetry-api = ">=1.12,<2.0" -opentelemetry-instrumentation = "0.37b0" +opentelemetry-instrumentation = "0.39b0" opentelemetry-sdk = ">=1.12,<2.0" -opentelemetry-semantic-conventions = "0.37b0" +opentelemetry-semantic-conventions = "0.39b0" wrapt = ">=1.0.0,<2.0.0" [package.extras] instruments = ["grpcio (>=1.27,<2.0)"] -test = ["opentelemetry-instrumentation-grpc[instruments]", "opentelemetry-sdk (>=1.12,<2.0)", "opentelemetry-test-utils (==0.37b0)", "protobuf (>=3.13,<4.0)"] +test = ["opentelemetry-instrumentation-grpc[instruments]", "opentelemetry-sdk (>=1.12,<2.0)", "opentelemetry-test-utils (==0.39b0)", "protobuf (>=3.13,<4.0)"] [[package]] name = "opentelemetry-proto" -version = "1.16.0" +version = "1.18.0" description = "OpenTelemetry Python Proto" category = "main" optional = false python-versions = ">=3.7" files = [ - {file = "opentelemetry_proto-1.16.0-py3-none-any.whl", hash = "sha256:160326d300faf43c3f72c4a916516ee5b63289ceb9828294b698ef943697cbd5"}, - {file = "opentelemetry_proto-1.16.0.tar.gz", hash = "sha256:e58832dfec64621972a9836f8ae163fb3063946eb02bdf43fae0f76f8cf46d0a"}, + {file = "opentelemetry_proto-1.18.0-py3-none-any.whl", hash = "sha256:34d1c49283f0246a58761d9322d5a79702a09afda0bb181bb6378ed26862e446"}, + {file = "opentelemetry_proto-1.18.0.tar.gz", hash = "sha256:4f38d01049c3926b9fd09833574bfb5e172d84c8ca85e2ab7f4b5a198d75aeef"}, ] [package.dependencies] @@ -3730,44 +3843,44 @@ protobuf = ">=3.19,<5.0" [[package]] name = "opentelemetry-sdk" -version = "1.16.0" +version = "1.18.0" description = "OpenTelemetry Python SDK" category = "main" optional = false python-versions = ">=3.7" files = [ - {file = "opentelemetry_sdk-1.16.0-py3-none-any.whl", hash = "sha256:15f03915eec4839f885a5e6ed959cde59b8690c8c012d07c95b4b138c98dc43f"}, - {file = "opentelemetry_sdk-1.16.0.tar.gz", hash = "sha256:4d3bb91e9e209dbeea773b5565d901da4f76a29bf9dbc1c9500be3cabb239a4e"}, + {file = "opentelemetry_sdk-1.18.0-py3-none-any.whl", hash = "sha256:a097cc1e0db6ff33b4d250a9350dc17975d24a22aa667fca2866e60c51306723"}, + {file = "opentelemetry_sdk-1.18.0.tar.gz", hash = "sha256:cd3230930a2ab288b1df149d261e9cd2bd48dee54ad18465a777831cb6779e90"}, ] [package.dependencies] -opentelemetry-api = "1.16.0" -opentelemetry-semantic-conventions = "0.37b0" +opentelemetry-api = "1.18.0" +opentelemetry-semantic-conventions = "0.39b0" setuptools = ">=16.0" typing-extensions = ">=3.7.4" [[package]] name = "opentelemetry-semantic-conventions" -version = "0.37b0" +version = "0.39b0" description = "OpenTelemetry Semantic Conventions" category = "main" optional = false python-versions = ">=3.7" files = [ - {file = "opentelemetry_semantic_conventions-0.37b0-py3-none-any.whl", hash = "sha256:462982278a42dab01f68641cd89f8460fe1f93e87c68a012a76fb426dcdba5ee"}, - {file = "opentelemetry_semantic_conventions-0.37b0.tar.gz", hash = "sha256:087ce2e248e42f3ffe4d9fa2303111de72bb93baa06a0f4655980bc1557c4228"}, + {file = "opentelemetry_semantic_conventions-0.39b0-py3-none-any.whl", hash = "sha256:0dd7a9dc0dfde2335f643705bba8f7c44182c797bc208b7601f0b8e8211cfd5c"}, + {file = "opentelemetry_semantic_conventions-0.39b0.tar.gz", hash = "sha256:06a9f198574e0dab6ebc072b59d89092cf9f115638a8a02157586769b6b7a69a"}, ] [[package]] name = "opentelemetry-util-http" -version = "0.37b0" +version = "0.39b0" description = "Web util for OpenTelemetry" category = "main" optional = false python-versions = ">=3.7" files = [ - {file = "opentelemetry_util_http-0.37b0-py3-none-any.whl", hash = "sha256:6d3ddba5429918dc3a3e250858a819dad617a4a415f16b6ca6531065501f342a"}, - {file = "opentelemetry_util_http-0.37b0.tar.gz", hash = "sha256:591a5332db31bb6056ef2741c435e38ad4979d3c595b20b4c4dd62cbf1693524"}, + {file = "opentelemetry_util_http-0.39b0-py3-none-any.whl", hash = "sha256:587c3f8931b8a1e910a04fd736e8ff1386fe25c09dc92dc85104679112221483"}, + {file = "opentelemetry_util_http-0.39b0.tar.gz", hash = "sha256:1a78e53e97c8f0b05216dbe4d93836ae5f5f94ba877003e56d065f089373f0ce"}, ] [[package]] @@ -3852,39 +3965,37 @@ files = [ [[package]] name = "pandas" -version = "1.5.3" +version = "2.0.3" description = "Powerful data structures for data analysis, time series, and statistics" category = "main" optional = false python-versions = ">=3.8" files = [ - {file = "pandas-1.5.3-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:3749077d86e3a2f0ed51367f30bf5b82e131cc0f14260c4d3e499186fccc4406"}, - {file = "pandas-1.5.3-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:972d8a45395f2a2d26733eb8d0f629b2f90bebe8e8eddbb8829b180c09639572"}, - {file = "pandas-1.5.3-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:50869a35cbb0f2e0cd5ec04b191e7b12ed688874bd05dd777c19b28cbea90996"}, - {file = "pandas-1.5.3-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:c3ac844a0fe00bfaeb2c9b51ab1424e5c8744f89860b138434a363b1f620f354"}, - {file = "pandas-1.5.3-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:7a0a56cef15fd1586726dace5616db75ebcfec9179a3a55e78f72c5639fa2a23"}, - {file = "pandas-1.5.3-cp310-cp310-win_amd64.whl", hash = "sha256:478ff646ca42b20376e4ed3fa2e8d7341e8a63105586efe54fa2508ee087f328"}, - {file = "pandas-1.5.3-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:6973549c01ca91ec96199e940495219c887ea815b2083722821f1d7abfa2b4dc"}, - {file = "pandas-1.5.3-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:c39a8da13cede5adcd3be1182883aea1c925476f4e84b2807a46e2775306305d"}, - {file = "pandas-1.5.3-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:f76d097d12c82a535fda9dfe5e8dd4127952b45fea9b0276cb30cca5ea313fbc"}, - {file = "pandas-1.5.3-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:e474390e60ed609cec869b0da796ad94f420bb057d86784191eefc62b65819ae"}, - {file = "pandas-1.5.3-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:5f2b952406a1588ad4cad5b3f55f520e82e902388a6d5a4a91baa8d38d23c7f6"}, - {file = "pandas-1.5.3-cp311-cp311-win_amd64.whl", hash = "sha256:bc4c368f42b551bf72fac35c5128963a171b40dce866fb066540eeaf46faa003"}, - {file = "pandas-1.5.3-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:14e45300521902689a81f3f41386dc86f19b8ba8dd5ac5a3c7010ef8d2932813"}, - {file = "pandas-1.5.3-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:9842b6f4b8479e41968eced654487258ed81df7d1c9b7b870ceea24ed9459b31"}, - {file = "pandas-1.5.3-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:26d9c71772c7afb9d5046e6e9cf42d83dd147b5cf5bcb9d97252077118543792"}, - {file = "pandas-1.5.3-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:5fbcb19d6fceb9e946b3e23258757c7b225ba450990d9ed63ccceeb8cae609f7"}, - {file = "pandas-1.5.3-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:565fa34a5434d38e9d250af3c12ff931abaf88050551d9fbcdfafca50d62babf"}, - {file = "pandas-1.5.3-cp38-cp38-win32.whl", hash = "sha256:87bd9c03da1ac870a6d2c8902a0e1fd4267ca00f13bc494c9e5a9020920e1d51"}, - {file = "pandas-1.5.3-cp38-cp38-win_amd64.whl", hash = "sha256:41179ce559943d83a9b4bbacb736b04c928b095b5f25dd2b7389eda08f46f373"}, - {file = "pandas-1.5.3-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:c74a62747864ed568f5a82a49a23a8d7fe171d0c69038b38cedf0976831296fa"}, - {file = "pandas-1.5.3-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:c4c00e0b0597c8e4f59e8d461f797e5d70b4d025880516a8261b2817c47759ee"}, - {file = "pandas-1.5.3-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:a50d9a4336a9621cab7b8eb3fb11adb82de58f9b91d84c2cd526576b881a0c5a"}, - {file = "pandas-1.5.3-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:dd05f7783b3274aa206a1af06f0ceed3f9b412cf665b7247eacd83be41cf7bf0"}, - {file = "pandas-1.5.3-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:9f69c4029613de47816b1bb30ff5ac778686688751a5e9c99ad8c7031f6508e5"}, - {file = "pandas-1.5.3-cp39-cp39-win32.whl", hash = "sha256:7cec0bee9f294e5de5bbfc14d0573f65526071029d036b753ee6507d2a21480a"}, - {file = "pandas-1.5.3-cp39-cp39-win_amd64.whl", hash = "sha256:dfd681c5dc216037e0b0a2c821f5ed99ba9f03ebcf119c7dac0e9a7b960b9ec9"}, - {file = "pandas-1.5.3.tar.gz", hash = "sha256:74a3fd7e5a7ec052f183273dc7b0acd3a863edf7520f5d3a1765c04ffdb3b0b1"}, + {file = "pandas-2.0.3-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:e4c7c9f27a4185304c7caf96dc7d91bc60bc162221152de697c98eb0b2648dd8"}, + {file = "pandas-2.0.3-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:f167beed68918d62bffb6ec64f2e1d8a7d297a038f86d4aed056b9493fca407f"}, + {file = "pandas-2.0.3-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:ce0c6f76a0f1ba361551f3e6dceaff06bde7514a374aa43e33b588ec10420183"}, + {file = "pandas-2.0.3-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:ba619e410a21d8c387a1ea6e8a0e49bb42216474436245718d7f2e88a2f8d7c0"}, + {file = "pandas-2.0.3-cp310-cp310-win32.whl", hash = "sha256:3ef285093b4fe5058eefd756100a367f27029913760773c8bf1d2d8bebe5d210"}, + {file = "pandas-2.0.3-cp310-cp310-win_amd64.whl", hash = "sha256:9ee1a69328d5c36c98d8e74db06f4ad518a1840e8ccb94a4ba86920986bb617e"}, + {file = "pandas-2.0.3-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:b084b91d8d66ab19f5bb3256cbd5ea661848338301940e17f4492b2ce0801fe8"}, + {file = "pandas-2.0.3-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:37673e3bdf1551b95bf5d4ce372b37770f9529743d2498032439371fc7b7eb26"}, + {file = "pandas-2.0.3-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:b9cb1e14fdb546396b7e1b923ffaeeac24e4cedd14266c3497216dd4448e4f2d"}, + {file = "pandas-2.0.3-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:d9cd88488cceb7635aebb84809d087468eb33551097d600c6dad13602029c2df"}, + {file = "pandas-2.0.3-cp311-cp311-win32.whl", hash = "sha256:694888a81198786f0e164ee3a581df7d505024fbb1f15202fc7db88a71d84ebd"}, + {file = "pandas-2.0.3-cp311-cp311-win_amd64.whl", hash = "sha256:6a21ab5c89dcbd57f78d0ae16630b090eec626360085a4148693def5452d8a6b"}, + {file = "pandas-2.0.3-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:9e4da0d45e7f34c069fe4d522359df7d23badf83abc1d1cef398895822d11061"}, + {file = "pandas-2.0.3-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:32fca2ee1b0d93dd71d979726b12b61faa06aeb93cf77468776287f41ff8fdc5"}, + {file = "pandas-2.0.3-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:258d3624b3ae734490e4d63c430256e716f488c4fcb7c8e9bde2d3aa46c29089"}, + {file = "pandas-2.0.3-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:9eae3dc34fa1aa7772dd3fc60270d13ced7346fcbcfee017d3132ec625e23bb0"}, + {file = "pandas-2.0.3-cp38-cp38-win32.whl", hash = "sha256:f3421a7afb1a43f7e38e82e844e2bca9a6d793d66c1a7f9f0ff39a795bbc5e02"}, + {file = "pandas-2.0.3-cp38-cp38-win_amd64.whl", hash = "sha256:69d7f3884c95da3a31ef82b7618af5710dba95bb885ffab339aad925c3e8ce78"}, + {file = "pandas-2.0.3-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:5247fb1ba347c1261cbbf0fcfba4a3121fbb4029d95d9ef4dc45406620b25c8b"}, + {file = "pandas-2.0.3-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:81af086f4543c9d8bb128328b5d32e9986e0c84d3ee673a2ac6fb57fd14f755e"}, + {file = "pandas-2.0.3-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:1994c789bf12a7c5098277fb43836ce090f1073858c10f9220998ac74f37c69b"}, + {file = "pandas-2.0.3-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:5ec591c48e29226bcbb316e0c1e9423622bc7a4eaf1ef7c3c9fa1a3981f89641"}, + {file = "pandas-2.0.3-cp39-cp39-win32.whl", hash = "sha256:04dbdbaf2e4d46ca8da896e1805bc04eb85caa9a82e259e8eed00254d5e0c682"}, + {file = "pandas-2.0.3-cp39-cp39-win_amd64.whl", hash = "sha256:1168574b036cd8b93abc746171c9b4f1b83467438a5e45909fed645cf8692dbc"}, + {file = "pandas-2.0.3.tar.gz", hash = "sha256:c02f372a88e0d17f36d3093a644c73cfc1788e876a7c4bcb4020a77512e2043c"}, ] [package.dependencies] @@ -3893,11 +4004,32 @@ numpy = [ {version = ">=1.21.0", markers = "python_version >= \"3.10\""}, {version = ">=1.23.2", markers = "python_version >= \"3.11\""}, ] -python-dateutil = ">=2.8.1" +python-dateutil = ">=2.8.2" pytz = ">=2020.1" +tzdata = ">=2022.1" [package.extras] -test = ["hypothesis (>=5.5.3)", "pytest (>=6.0)", "pytest-xdist (>=1.31)"] +all = ["PyQt5 (>=5.15.1)", "SQLAlchemy (>=1.4.16)", "beautifulsoup4 (>=4.9.3)", "bottleneck (>=1.3.2)", "brotlipy (>=0.7.0)", "fastparquet (>=0.6.3)", "fsspec (>=2021.07.0)", "gcsfs (>=2021.07.0)", "html5lib (>=1.1)", "hypothesis (>=6.34.2)", "jinja2 (>=3.0.0)", "lxml (>=4.6.3)", "matplotlib (>=3.6.1)", "numba (>=0.53.1)", "numexpr (>=2.7.3)", "odfpy (>=1.4.1)", "openpyxl (>=3.0.7)", "pandas-gbq (>=0.15.0)", "psycopg2 (>=2.8.6)", "pyarrow (>=7.0.0)", "pymysql (>=1.0.2)", "pyreadstat (>=1.1.2)", "pytest (>=7.3.2)", "pytest-asyncio (>=0.17.0)", "pytest-xdist (>=2.2.0)", "python-snappy (>=0.6.0)", "pyxlsb (>=1.0.8)", "qtpy (>=2.2.0)", "s3fs (>=2021.08.0)", "scipy (>=1.7.1)", "tables (>=3.6.1)", "tabulate (>=0.8.9)", "xarray (>=0.21.0)", "xlrd (>=2.0.1)", "xlsxwriter (>=1.4.3)", "zstandard (>=0.15.2)"] +aws = ["s3fs (>=2021.08.0)"] +clipboard = ["PyQt5 (>=5.15.1)", "qtpy (>=2.2.0)"] +compression = ["brotlipy (>=0.7.0)", "python-snappy (>=0.6.0)", "zstandard (>=0.15.2)"] +computation = ["scipy (>=1.7.1)", "xarray (>=0.21.0)"] +excel = ["odfpy (>=1.4.1)", "openpyxl (>=3.0.7)", "pyxlsb (>=1.0.8)", "xlrd (>=2.0.1)", "xlsxwriter (>=1.4.3)"] +feather = ["pyarrow (>=7.0.0)"] +fss = ["fsspec (>=2021.07.0)"] +gcp = ["gcsfs (>=2021.07.0)", "pandas-gbq (>=0.15.0)"] +hdf5 = ["tables (>=3.6.1)"] +html = ["beautifulsoup4 (>=4.9.3)", "html5lib (>=1.1)", "lxml (>=4.6.3)"] +mysql = ["SQLAlchemy (>=1.4.16)", "pymysql (>=1.0.2)"] +output-formatting = ["jinja2 (>=3.0.0)", "tabulate (>=0.8.9)"] +parquet = ["pyarrow (>=7.0.0)"] +performance = ["bottleneck (>=1.3.2)", "numba (>=0.53.1)", "numexpr (>=2.7.1)"] +plot = ["matplotlib (>=3.6.1)"] +postgresql = ["SQLAlchemy (>=1.4.16)", "psycopg2 (>=2.8.6)"] +spss = ["pyreadstat (>=1.1.2)"] +sql-other = ["SQLAlchemy (>=1.4.16)"] +test = ["hypothesis (>=6.34.2)", "pytest (>=7.3.2)", "pytest-asyncio (>=0.17.0)", "pytest-xdist (>=2.2.0)"] +xml = ["lxml (>=4.6.3)"] [[package]] name = "pandas-stubs" @@ -3943,6 +4075,42 @@ files = [ {file = "pathspec-0.11.1.tar.gz", hash = "sha256:2798de800fa92780e33acca925945e9a19a133b715067cf165b8866c15a31687"}, ] +[[package]] +name = "pdf2image" +version = "1.16.3" +description = "A wrapper around the pdftoppm and pdftocairo command line tools to convert PDF to a PIL Image list." +category = "main" +optional = false +python-versions = "*" +files = [ + {file = "pdf2image-1.16.3-py3-none-any.whl", hash = "sha256:b6154164af3677211c22cbb38b2bd778b43aca02758e962fe1e231f6d3b0e380"}, + {file = "pdf2image-1.16.3.tar.gz", hash = "sha256:74208810c2cef4d9e347769b8e62a52303982ddb4f2dfd744c7ab4b940ae287e"}, +] + +[package.dependencies] +pillow = "*" + +[[package]] +name = "pdfminer-six" +version = "20221105" +description = "PDF parser and analyzer" +category = "main" +optional = false +python-versions = ">=3.6" +files = [ + {file = "pdfminer.six-20221105-py3-none-any.whl", hash = "sha256:1eaddd712d5b2732f8ac8486824533514f8ba12a0787b3d5fe1e686cd826532d"}, + {file = "pdfminer.six-20221105.tar.gz", hash = "sha256:8448ab7b939d18b64820478ecac5394f482d7a79f5f7eaa7703c6c959c175e1d"}, +] + +[package.dependencies] +charset-normalizer = ">=2.0.0" +cryptography = ">=36.0.0" + +[package.extras] +dev = ["black", "mypy (==0.931)", "nox", "pytest"] +docs = ["sphinx", "sphinx-argparse"] +image = ["Pillow"] + [[package]] name = "pexpect" version = "4.8.0" @@ -4274,6 +4442,94 @@ files = [ [package.extras] test = ["enum34", "ipaddress", "mock", "pywin32", "wmi"] +[[package]] +name = "psycopg" +version = "3.1.9" +description = "PostgreSQL database adapter for Python" +category = "main" +optional = false +python-versions = ">=3.7" +files = [ + {file = "psycopg-3.1.9-py3-none-any.whl", hash = "sha256:fbbac339274d8733ee70ba9822297af3e8871790a26e967b5ea53e30a4b74dcc"}, + {file = "psycopg-3.1.9.tar.gz", hash = "sha256:ab400f207a8c120bafdd8077916d8f6c0106e809401378708485b016508c30c9"}, +] + +[package.dependencies] +typing-extensions = ">=4.1" +tzdata = {version = "*", markers = "sys_platform == \"win32\""} + +[package.extras] +binary = ["psycopg-binary (==3.1.9)"] +c = ["psycopg-c (==3.1.9)"] +dev = ["black (>=23.1.0)", "dnspython (>=2.1)", "flake8 (>=4.0)", "mypy (>=1.2)", "types-setuptools (>=57.4)", "wheel (>=0.37)"] +docs = ["Sphinx (>=5.0)", "furo (==2022.6.21)", "sphinx-autobuild (>=2021.3.14)", "sphinx-autodoc-typehints (>=1.12)"] +pool = ["psycopg-pool"] +test = ["anyio (>=3.6.2)", "mypy (>=1.2)", "pproxy (>=2.7)", "pytest (>=6.2.5)", "pytest-cov (>=3.0)", "pytest-randomly (>=3.5)"] + +[[package]] +name = "psycopg-binary" +version = "3.1.9" +description = "PostgreSQL database adapter for Python -- C optimisation distribution" +category = "main" +optional = false +python-versions = ">=3.7" +files = [ + {file = "psycopg_binary-3.1.9-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:284038cbe3f5a0f3de417af9b5eaa2a9524a3a06211523cf245111c71b566506"}, + {file = "psycopg_binary-3.1.9-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:d2cea4bb0b19245c83486868d7c66f73238c4caa266b5b3c3d664d10dab2ab56"}, + {file = "psycopg_binary-3.1.9-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:dfe5c5c31f59ccb1d1f473466baa93d800138186286e80e251f930e49c80d208"}, + {file = "psycopg_binary-3.1.9-cp310-cp310-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:82704a899d57c29beba5399d41eab5ef5c238b810d7e25e2d1916d2b34c4b1a3"}, + {file = "psycopg_binary-3.1.9-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:eab449e39db1c429cac79b7aa27e6827aad4995f32137e922db7254f43fed7b5"}, + {file = "psycopg_binary-3.1.9-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:87e0c97733b11eeca3d24e56df70f3f9d792b2abd46f48be2fb2348ffc3e7e39"}, + {file = "psycopg_binary-3.1.9-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:81e34d6df54329424944d5ca91b1cc77df6b8a9130cb5480680d56f53d4e485c"}, + {file = "psycopg_binary-3.1.9-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:e2f463079d99568a343ed0b766150b30627e9ed41de99fd82e945e7e2bec764a"}, + {file = "psycopg_binary-3.1.9-cp310-cp310-musllinux_1_1_ppc64le.whl", hash = "sha256:f2cbdef6568da21c39dfd45c2074e85eabbd00e1b721832ba94980f01f582dd4"}, + {file = "psycopg_binary-3.1.9-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:53afb0cc2ebe74651f339e22d05ec082a0f44939715d9138d357852f074fcf55"}, + {file = "psycopg_binary-3.1.9-cp310-cp310-win_amd64.whl", hash = "sha256:09167f106e7685591b4cdf58eff0191fb7435d586f384133a0dd30df646cf409"}, + {file = "psycopg_binary-3.1.9-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:a8aaa47c1791fc05c0229ec1003dd49e13238fba9434e1fc3b879632f749c3c4"}, + {file = "psycopg_binary-3.1.9-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:3d91ee0d33ac7b42d0488a9be2516efa2ec00901b81d69566ff34a7a94b66c0b"}, + {file = "psycopg_binary-3.1.9-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:f5e36504373e5bcdc954b1da1c6fe66379007fe1e329790e8fb72b879a01e097"}, + {file = "psycopg_binary-3.1.9-cp311-cp311-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:4c1def6c2d28e257325b3b208cf1966343b498282a0f4d390fda7b7e0577da64"}, + {file = "psycopg_binary-3.1.9-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:055537a9c20efe9bf17cb72bd879602eda71de6f737ebafa1953e017c6a37fbe"}, + {file = "psycopg_binary-3.1.9-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:5b164355d023a91b23dcc4bb3112bc7d6e9b9c938fb5abcb6e54457d2da1f317"}, + {file = "psycopg_binary-3.1.9-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:03b08545ce1c627f4d5e6384eda2946660c4ba6ceb0a09ae47de07419f725669"}, + {file = "psycopg_binary-3.1.9-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:1e31bac3d2d41e6446b20b591f638943328c958f4d1ce13d6f1c5db97c3a8dee"}, + {file = "psycopg_binary-3.1.9-cp311-cp311-musllinux_1_1_ppc64le.whl", hash = "sha256:a274c63c8fb9d419509bed2ef72befc1fd04243972e17e7f5afc5725cb13a560"}, + {file = "psycopg_binary-3.1.9-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:98d9d156b9ada08c271a79662fc5fcc1731b4d7c1f651ef5843d818d35f15ba0"}, + {file = "psycopg_binary-3.1.9-cp311-cp311-win_amd64.whl", hash = "sha256:c3a13aa022853891cadbc7256a9804e5989def760115c82334bddf0d19783b0b"}, + {file = "psycopg_binary-3.1.9-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:b1a321ef3579a8de0545ade6ff1edfde0c88b8847d58c5615c03751c76054796"}, + {file = "psycopg_binary-3.1.9-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:5833bda4c14f24c6a8ac08d3c5712acaa4f35aab31f9ccd2265e9e9a7d0151c8"}, + {file = "psycopg_binary-3.1.9-cp37-cp37m-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:a207d5a7f4212443b7452851c9ccd88df9c6d4d58fa2cea2ead4dd9cb328e578"}, + {file = "psycopg_binary-3.1.9-cp37-cp37m-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:07414daa86662f7657e9fabe49af85a32a975e92e6568337887d9c9ffedc224f"}, + {file = "psycopg_binary-3.1.9-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:17c5d4936c746f5125c6ef9eb43655e27d4d0c9ffe34c3073878b43c3192511d"}, + {file = "psycopg_binary-3.1.9-cp37-cp37m-musllinux_1_1_aarch64.whl", hash = "sha256:5cdc13c8ec1437240801e43d07e27ff6479ac9dd8583ecf647345bfd2e8390e4"}, + {file = "psycopg_binary-3.1.9-cp37-cp37m-musllinux_1_1_i686.whl", hash = "sha256:3836bdaf030a5648bd5f5b452e4b068b265e28f9199060c5b70dbf4a218cde6e"}, + {file = "psycopg_binary-3.1.9-cp37-cp37m-musllinux_1_1_ppc64le.whl", hash = "sha256:96725d9691a84a21eb3e81c884a2e043054e33e176801a57a05e9ac38d142c6e"}, + {file = "psycopg_binary-3.1.9-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:dade344aa90bb0b57d1cfc13304ed83ab9a36614b8ddd671381b2de72fe1483d"}, + {file = "psycopg_binary-3.1.9-cp37-cp37m-win_amd64.whl", hash = "sha256:db866cc557d9761036771d666d17fa4176c537af7e6098f42a6bf8f64217935f"}, + {file = "psycopg_binary-3.1.9-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:3b62545cc64dd69ea0ae5ffe18d7c97e03660ab8244aa8c5172668a21c41daa0"}, + {file = "psycopg_binary-3.1.9-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:058ab0d79be0b229338f0e61fec6f475077518cba63c22c593645a69f01c3e23"}, + {file = "psycopg_binary-3.1.9-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:2340ca2531f69e5ebd9d18987362ba57ed6ab6a271511d8026814a46a2a87b59"}, + {file = "psycopg_binary-3.1.9-cp38-cp38-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:3b816ce0e27a2a8786d34b61d3e36e01029245025879d64b88554326b794a4f0"}, + {file = "psycopg_binary-3.1.9-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:7b36fe4314a784fbe45c9fd71c902b9bf57341aff9b97c0cbd22f8409a271e2f"}, + {file = "psycopg_binary-3.1.9-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:b246fed629482b06f938b23e9281c4af592329daa3ec2cd4a6841ccbfdeb4d68"}, + {file = "psycopg_binary-3.1.9-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:90787ac05b932c0fc678cbf470ccea9c385b8077583f0490136b4569ed3fb652"}, + {file = "psycopg_binary-3.1.9-cp38-cp38-musllinux_1_1_i686.whl", hash = "sha256:9c114f678e8f4a96530fa79cfd84f65f26358ecfc6cca70cfa2d5e3ae5ef217a"}, + {file = "psycopg_binary-3.1.9-cp38-cp38-musllinux_1_1_ppc64le.whl", hash = "sha256:3a82e77400d1ef6c5bbcf3e600e8bdfacf1a554512f96c090c43ceca3d1ce3b6"}, + {file = "psycopg_binary-3.1.9-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:c7d990f14a37345ca05a5192cd5ac938c9cbedca9c929872af6ae311158feb0e"}, + {file = "psycopg_binary-3.1.9-cp38-cp38-win_amd64.whl", hash = "sha256:e0ca74fd85718723bb9f08e0c6898e901a0c365aef20b3c3a4ef8709125d6210"}, + {file = "psycopg_binary-3.1.9-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:ce8f4dea5934aa6c4933e559c74bef4beb3413f51fbcf17f306ce890216ac33a"}, + {file = "psycopg_binary-3.1.9-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:f41a9e0de4db194c053bcc7c00c35422a4d19d92a8187e8065b1c560626efe35"}, + {file = "psycopg_binary-3.1.9-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:2f94a7985135e084e122b143956c6f589d17aef743ecd0a434a3d3a222631d5a"}, + {file = "psycopg_binary-3.1.9-cp39-cp39-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:3bb86d58b90faefdc0bbedf08fdea4cc2afcb1cfa4340f027d458bfd01d8b812"}, + {file = "psycopg_binary-3.1.9-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:6c696dc84f9ff155761df15779181d8e4af7746b98908e130add8259912e4bb7"}, + {file = "psycopg_binary-3.1.9-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:4213953da44324850c8f789301cf665f46fb94301ba403301e7af58546c3a428"}, + {file = "psycopg_binary-3.1.9-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:25e3ce947aaaa1bd9f1920fca76d7281660646304f9ea5bc036b201dd8790655"}, + {file = "psycopg_binary-3.1.9-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:9c75be2a9b986139e3ff6bc0a2852081ac00811040f9b82d3aa539821311122e"}, + {file = "psycopg_binary-3.1.9-cp39-cp39-musllinux_1_1_ppc64le.whl", hash = "sha256:63e8d1dbe253657c70dbfa9c59423f4654d82698fc5ed6868b8dc0765abe20b6"}, + {file = "psycopg_binary-3.1.9-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:f4da4ca9b2365fc1d3fc741c3bbd3efccd892ce813444b884c8911a1acf1c932"}, + {file = "psycopg_binary-3.1.9-cp39-cp39-win_amd64.whl", hash = "sha256:c0b8d6bbeff1dba760a208d8bc205a05b745e6cee02b839f969f72cf56a8b80d"}, +] + [[package]] name = "psycopg2-binary" version = "2.9.6" @@ -4690,14 +4946,14 @@ diagrams = ["jinja2", "railroad-diagrams"] [[package]] name = "pypdf" -version = "3.11.0" +version = "3.11.1" description = "A pure-python PDF library capable of splitting, merging, cropping, and transforming PDF files" category = "main" optional = false python-versions = ">=3.6" files = [ - {file = "pypdf-3.11.0-py3-none-any.whl", hash = "sha256:4f1fd2c1ee05e381e05447152d9e993016666647578fcdd7cf15739d13536861"}, - {file = "pypdf-3.11.0.tar.gz", hash = "sha256:2f5b9b28763234427cd6e525795e583aae7e36a79bdadd48ba8ab5277c12182a"}, + {file = "pypdf-3.11.1-py3-none-any.whl", hash = "sha256:2afc8914355a784fb184f60ae82fe10f9b992aa0733b705f0746966e470f98bd"}, + {file = "pypdf-3.11.1.tar.gz", hash = "sha256:198c4d0231525d0b730cbbd11a5fc7d9a2e410dfc8ae2928c8de000b7ef149c5"}, ] [package.dependencies] @@ -4977,14 +5233,14 @@ files = [ [[package]] name = "pywin32-ctypes" -version = "0.2.1" +version = "0.2.2" description = "A (partial) reimplementation of pywin32 using ctypes/cffi" category = "main" optional = false python-versions = ">=3.6" files = [ - {file = "pywin32-ctypes-0.2.1.tar.gz", hash = "sha256:934a2def1e5cbc472b2b6bf80680c0f03cd87df65dfd58bfd1846969de095b03"}, - {file = "pywin32_ctypes-0.2.1-py3-none-any.whl", hash = "sha256:b9a53ef754c894a525469933ab2a447c74ec1ea6b9d2ef446f40ec50d3dcec9f"}, + {file = "pywin32-ctypes-0.2.2.tar.gz", hash = "sha256:3426e063bdd5fd4df74a14fa3cf80a0b42845a87e1d1e81f6549f9daec593a60"}, + {file = "pywin32_ctypes-0.2.2-py3-none-any.whl", hash = "sha256:bf490a1a709baf35d688fe0ecf980ed4de11d2b3e37b51e5442587a75d9957e7"}, ] [[package]] @@ -5400,6 +5656,67 @@ files = [ {file = "ruff-0.0.254.tar.gz", hash = "sha256:0eb66c9520151d3bd950ea43b3a088618a8e4e10a5014a72687881e6f3606312"}, ] +[[package]] +name = "safetensors" +version = "0.3.1" +description = "Fast and Safe Tensor serialization" +category = "main" +optional = false +python-versions = "*" +files = [ + {file = "safetensors-0.3.1-cp310-cp310-macosx_10_11_x86_64.whl", hash = "sha256:2ae9b7dd268b4bae6624729dac86deb82104820e9786429b0583e5168db2f770"}, + {file = "safetensors-0.3.1-cp310-cp310-macosx_12_0_arm64.whl", hash = "sha256:08c85c1934682f1e2cd904d38433b53cd2a98245a7cc31f5689f9322a2320bbf"}, + {file = "safetensors-0.3.1-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:ba625c7af9e1c5d0d91cb83d2fba97d29ea69d4db2015d9714d24c7f6d488e15"}, + {file = "safetensors-0.3.1-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:b57d5890c619ec10d9f1b6426b8690d0c9c2868a90dc52f13fae6f6407ac141f"}, + {file = "safetensors-0.3.1-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:5c9f562ea696d50b95cadbeb1716dc476714a87792ffe374280c0835312cbfe2"}, + {file = "safetensors-0.3.1-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:5c115951b3a865ece8d98ee43882f2fd0a999c0200d6e6fec24134715ebe3b57"}, + {file = "safetensors-0.3.1-cp310-cp310-win32.whl", hash = "sha256:118f8f7503ea312fc7af27e934088a1b589fb1eff5a7dea2cd1de6c71ee33391"}, + {file = "safetensors-0.3.1-cp310-cp310-win_amd64.whl", hash = "sha256:54846eaae25fded28a7bebbb66be563cad221b4c80daee39e2f55df5e5e0266f"}, + {file = "safetensors-0.3.1-cp311-cp311-macosx_10_11_universal2.whl", hash = "sha256:5af82e10946c4822506db0f29269f43147e889054704dde994d4e22f0c37377b"}, + {file = "safetensors-0.3.1-cp311-cp311-macosx_12_0_arm64.whl", hash = "sha256:626c86dd1d930963c8ea7f953a3787ae85322551e3a5203ac731d6e6f3e18f44"}, + {file = "safetensors-0.3.1-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:12e30677e6af1f4cc4f2832546e91dbb3b0aa7d575bfa473d2899d524e1ace08"}, + {file = "safetensors-0.3.1-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:d534b80bc8d39945bb902f34b0454773971fe9e5e1f2142af451759d7e52b356"}, + {file = "safetensors-0.3.1-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:ddd0ddd502cf219666e7d30f23f196cb87e829439b52b39f3e7da7918c3416df"}, + {file = "safetensors-0.3.1-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:997a2cc14023713f423e6d16536d55cb16a3d72850f142e05f82f0d4c76d383b"}, + {file = "safetensors-0.3.1-cp311-cp311-win32.whl", hash = "sha256:6ae9ca63d9e22f71ec40550207bd284a60a6b4916ae6ca12c85a8d86bf49e0c3"}, + {file = "safetensors-0.3.1-cp311-cp311-win_amd64.whl", hash = "sha256:62aa7421ca455418423e35029524489480adda53e3f702453580180ecfebe476"}, + {file = "safetensors-0.3.1-cp37-cp37m-macosx_10_11_x86_64.whl", hash = "sha256:6d54b3ed367b6898baab75dfd057c24f36ec64d3938ffff2af981d56bfba2f42"}, + {file = "safetensors-0.3.1-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:262423aeda91117010f8c607889066028f680fbb667f50cfe6eae96f22f9d150"}, + {file = "safetensors-0.3.1-cp37-cp37m-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:10efe2513a8327fd628cea13167089588acc23093ba132aecfc536eb9a4560fe"}, + {file = "safetensors-0.3.1-cp37-cp37m-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:689b3d6a7ebce70ee9438267ee55ea89b575c19923876645e927d08757b552fe"}, + {file = "safetensors-0.3.1-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:14cd9a87bc73ce06903e9f8ee8b05b056af6f3c9f37a6bd74997a16ed36ff5f4"}, + {file = "safetensors-0.3.1-cp37-cp37m-win32.whl", hash = "sha256:a77cb39624480d5f143c1cc272184f65a296f573d61629eff5d495d2e0541d3e"}, + {file = "safetensors-0.3.1-cp37-cp37m-win_amd64.whl", hash = "sha256:9eff3190bfbbb52eef729911345c643f875ca4dbb374aa6c559675cfd0ab73db"}, + {file = "safetensors-0.3.1-cp38-cp38-macosx_10_11_x86_64.whl", hash = "sha256:05cbfef76e4daa14796db1bbb52072d4b72a44050c368b2b1f6fd3e610669a89"}, + {file = "safetensors-0.3.1-cp38-cp38-macosx_12_0_arm64.whl", hash = "sha256:c49061461f4a81e5ec3415070a3f135530834c89cbd6a7db7cd49e3cb9d9864b"}, + {file = "safetensors-0.3.1-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:22cf7e73ca42974f098ce0cf4dd8918983700b6b07a4c6827d50c8daefca776e"}, + {file = "safetensors-0.3.1-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:04f909442d6223ff0016cd2e1b2a95ef8039b92a558014627363a2e267213f62"}, + {file = "safetensors-0.3.1-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:2c573c5a0d5d45791ae8c179e26d74aff86e719056591aa7edb3ca7be55bc961"}, + {file = "safetensors-0.3.1-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:6994043b12e717cf2a6ba69077ac41f0d3675b2819734f07f61819e854c622c7"}, + {file = "safetensors-0.3.1-cp38-cp38-win32.whl", hash = "sha256:158ede81694180a0dbba59422bc304a78c054b305df993c0c6e39c6330fa9348"}, + {file = "safetensors-0.3.1-cp38-cp38-win_amd64.whl", hash = "sha256:afdc725beff7121ea8d39a7339f5a6abcb01daa189ea56290b67fe262d56e20f"}, + {file = "safetensors-0.3.1-cp39-cp39-macosx_10_11_x86_64.whl", hash = "sha256:cba910fcc9e5e64d32d62b837388721165e9c7e45d23bc3a38ad57694b77f40d"}, + {file = "safetensors-0.3.1-cp39-cp39-macosx_12_0_arm64.whl", hash = "sha256:a4f7dbfe7285573cdaddd85ef6fa84ebbed995d3703ab72d71257944e384612f"}, + {file = "safetensors-0.3.1-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:54aed0802f9eaa83ca7b1cbb986bfb90b8e2c67b6a4bcfe245627e17dad565d4"}, + {file = "safetensors-0.3.1-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:34b75a766f3cfc99fd4c33e329b76deae63f5f388e455d863a5d6e99472fca8e"}, + {file = "safetensors-0.3.1-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:1a0f31904f35dc14919a145b2d7a2d8842a43a18a629affe678233c4ea90b4af"}, + {file = "safetensors-0.3.1-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:dcf527ecc5f58907fd9031510378105487f318cc91ecdc5aee3c7cc8f46030a8"}, + {file = "safetensors-0.3.1-cp39-cp39-win32.whl", hash = "sha256:e2f083112cf97aa9611e2a05cc170a2795eccec5f6ff837f4565f950670a9d83"}, + {file = "safetensors-0.3.1-cp39-cp39-win_amd64.whl", hash = "sha256:5f4f614b8e8161cd8a9ca19c765d176a82b122fa3d3387b77862145bfe9b4e93"}, + {file = "safetensors-0.3.1.tar.gz", hash = "sha256:571da56ff8d0bec8ae54923b621cda98d36dcef10feb36fd492c4d0c2cd0e869"}, +] + +[package.extras] +all = ["black (==22.3)", "click (==8.0.4)", "flake8 (>=3.8.3)", "flax (>=0.6.3)", "h5py (>=3.7.0)", "huggingface-hub (>=0.12.1)", "isort (>=5.5.4)", "jax (>=0.3.25)", "jaxlib (>=0.3.25)", "numpy (>=1.21.6)", "paddlepaddle (>=2.4.1)", "pytest (>=7.2.0)", "pytest-benchmark (>=4.0.0)", "setuptools-rust (>=1.5.2)", "tensorflow (>=2.11.0)", "torch (>=1.10)"] +dev = ["black (==22.3)", "click (==8.0.4)", "flake8 (>=3.8.3)", "flax (>=0.6.3)", "h5py (>=3.7.0)", "huggingface-hub (>=0.12.1)", "isort (>=5.5.4)", "jax (>=0.3.25)", "jaxlib (>=0.3.25)", "numpy (>=1.21.6)", "paddlepaddle (>=2.4.1)", "pytest (>=7.2.0)", "pytest-benchmark (>=4.0.0)", "setuptools-rust (>=1.5.2)", "tensorflow (>=2.11.0)", "torch (>=1.10)"] +jax = ["flax (>=0.6.3)", "jax (>=0.3.25)", "jaxlib (>=0.3.25)"] +numpy = ["numpy (>=1.21.6)"] +paddlepaddle = ["paddlepaddle (>=2.4.1)"] +quality = ["black (==22.3)", "click (==8.0.4)", "flake8 (>=3.8.3)", "isort (>=5.5.4)"] +tensorflow = ["tensorflow (>=2.11.0)"] +testing = ["h5py (>=3.7.0)", "huggingface-hub (>=0.12.1)", "numpy (>=1.21.6)", "pytest (>=7.2.0)", "pytest-benchmark (>=4.0.0)", "setuptools-rust (>=1.5.2)"] +torch = ["torch (>=1.10)"] + [[package]] name = "scikit-learn" version = "1.2.2" @@ -5445,31 +5762,31 @@ tests = ["black (>=22.3.0)", "flake8 (>=3.8.2)", "matplotlib (>=3.1.3)", "mypy ( [[package]] name = "scipy" -version = "1.11.0" +version = "1.11.1" description = "Fundamental algorithms for scientific computing in Python" category = "main" optional = false python-versions = "<3.13,>=3.9" files = [ - {file = "scipy-1.11.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:2e4f14c11fbf825319dbd7f467639a241e7c956c34edb1e036ec7bb6271e4f7b"}, - {file = "scipy-1.11.0-cp310-cp310-macosx_12_0_arm64.whl", hash = "sha256:b269ed44e2e2e43611f2ae95ba551fd98abbdc1a7ea8268f72f75876982368c4"}, - {file = "scipy-1.11.0-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:2c29bae479b17d85208dfdfc67e50d5944ee23211f236728aadde9b0b7c1c33e"}, - {file = "scipy-1.11.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:a53f9cebcfda6158c241c35a559407a4ef6b8cb0863eb4144958fe0a0b7c3dae"}, - {file = "scipy-1.11.0-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:ebf4b2ea26d50312731ddba2406389c5ddcbff9d777cf3277ea11decc81e5dfb"}, - {file = "scipy-1.11.0-cp310-cp310-win_amd64.whl", hash = "sha256:894ced9a2cdb050ff5e392f274617af46dca896d5c9112fa4a2019929554d321"}, - {file = "scipy-1.11.0-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:7a92bd3cd4acad2e0e0b360176d5ec68b100983c8145add8a8233acddf4e5fcc"}, - {file = "scipy-1.11.0-cp311-cp311-macosx_12_0_arm64.whl", hash = "sha256:586608ea35206257d4e0ce6f154a6cfef71723b2c1f6d40de5e0b0e8a81cd2ff"}, - {file = "scipy-1.11.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:d8e631c3c49c24f30828580b8126fe3be5cca5409dad5b797418a5b8965eeafa"}, - {file = "scipy-1.11.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:ccc70892ea674f93183c5c4139557b611e42f644dd755da4b19ca974ab770672"}, - {file = "scipy-1.11.0-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:80015b8928f91bd40377b2b1010ba2e09b03680cbfc291208740494aeb8debf2"}, - {file = "scipy-1.11.0-cp311-cp311-win_amd64.whl", hash = "sha256:6302c7cba5bf99c901653ff158746625526cc438f058bce41514d7469b79b2c3"}, - {file = "scipy-1.11.0-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:c61ea63124da6a3cff38126426912cc86420898b4902a9bc5e5b6524547a6dcb"}, - {file = "scipy-1.11.0-cp39-cp39-macosx_12_0_arm64.whl", hash = "sha256:684d44607eacd5dd367c7a9e76e922523fa9c0a7f2379a4d0fc4d70d751464cc"}, - {file = "scipy-1.11.0-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:f0c9c160d117fe71cd2a12ef21cce8e0475ade2fd97c761ef327b9839089bd16"}, - {file = "scipy-1.11.0-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:83867a63515c4e3fce3272d81200dda614d70f4c3a22f047d84021bfe83d7929"}, - {file = "scipy-1.11.0-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:6666a1e31b2123a077f0dc7ab1053e36479cfd457fb9f5c367e7198505c6607a"}, - {file = "scipy-1.11.0-cp39-cp39-win_amd64.whl", hash = "sha256:fad4006248513528e0c496de295a9f4d2b65086cc0e388f748e7dbf49fa12760"}, - {file = "scipy-1.11.0.tar.gz", hash = "sha256:f9b0248cb9d08eead44cde47cbf6339f1e9aa0dfde28f5fb27950743e317bd5d"}, + {file = "scipy-1.11.1-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:aec8c62fbe52914f9cf28d846cf0401dd80ab80788bbab909434eb336ed07c04"}, + {file = "scipy-1.11.1-cp310-cp310-macosx_12_0_arm64.whl", hash = "sha256:3b9963798df1d8a52db41a6fc0e6fa65b1c60e85d73da27ae8bb754de4792481"}, + {file = "scipy-1.11.1-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:3e8eb42db36526b130dfbc417609498a6192381abc1975b91e3eb238e0b41c1a"}, + {file = "scipy-1.11.1-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:366a6a937110d80dca4f63b3f5b00cc89d36f678b2d124a01067b154e692bab1"}, + {file = "scipy-1.11.1-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:08d957ca82d3535b3b9ba6c8ff355d78fe975271874e2af267cb5add5bd78625"}, + {file = "scipy-1.11.1-cp310-cp310-win_amd64.whl", hash = "sha256:e866514bc2d660608447b6ba95c8900d591f2865c07cca0aa4f7ff3c4ca70f30"}, + {file = "scipy-1.11.1-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:ba94eeef3c9caa4cea7b402a35bb02a5714ee1ee77eb98aca1eed4543beb0f4c"}, + {file = "scipy-1.11.1-cp311-cp311-macosx_12_0_arm64.whl", hash = "sha256:512fdc18c65f76dadaca139348e525646d440220d8d05f6d21965b8d4466bccd"}, + {file = "scipy-1.11.1-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:cce154372f0ebe88556ed06d7b196e9c2e0c13080ecb58d0f35062dc7cc28b47"}, + {file = "scipy-1.11.1-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:b4bb943010203465ac81efa392e4645265077b4d9e99b66cf3ed33ae12254173"}, + {file = "scipy-1.11.1-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:249cfa465c379c9bb2c20123001e151ff5e29b351cbb7f9c91587260602c58d0"}, + {file = "scipy-1.11.1-cp311-cp311-win_amd64.whl", hash = "sha256:ffb28e3fa31b9c376d0fb1f74c1f13911c8c154a760312fbee87a21eb21efe31"}, + {file = "scipy-1.11.1-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:39154437654260a52871dfde852adf1b93b1d1bc5dc0ffa70068f16ec0be2624"}, + {file = "scipy-1.11.1-cp39-cp39-macosx_12_0_arm64.whl", hash = "sha256:b588311875c58d1acd4ef17c983b9f1ab5391755a47c3d70b6bd503a45bfaf71"}, + {file = "scipy-1.11.1-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:d51565560565a0307ed06fa0ec4c6f21ff094947d4844d6068ed04400c72d0c3"}, + {file = "scipy-1.11.1-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:b41a0f322b4eb51b078cb3441e950ad661ede490c3aca66edef66f4b37ab1877"}, + {file = "scipy-1.11.1-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:396fae3f8c12ad14c5f3eb40499fd06a6fef8393a6baa352a652ecd51e74e029"}, + {file = "scipy-1.11.1-cp39-cp39-win_amd64.whl", hash = "sha256:be8c962a821957fdde8c4044efdab7a140c13294997a407eaee777acf63cbf0c"}, + {file = "scipy-1.11.1.tar.gz", hash = "sha256:fb5b492fa035334fd249f0973cc79ecad8b09c604b42a127a677b45a9a3d4289"}, ] [package.dependencies] @@ -5854,14 +6171,14 @@ typing-extensions = ">=4.2.0,<5.0.0" [[package]] name = "strenum" -version = "0.4.10" +version = "0.4.15" description = "An Enum that inherits from str." category = "main" optional = false python-versions = "*" files = [ - {file = "StrEnum-0.4.10-py3-none-any.whl", hash = "sha256:aebf04bba8e5af435937c452d69a86798b6f8d5ca5f20ba18561dbfad571ccdd"}, - {file = "StrEnum-0.4.10.tar.gz", hash = "sha256:898cc0ebb5054ee07400341ac1d75fdfee489d76d6df3fbc1c2eaf95971e3916"}, + {file = "StrEnum-0.4.15-py3-none-any.whl", hash = "sha256:a30cda4af7cc6b5bf52c8055bc4bf4b2b6b14a93b574626da33df53cf7740659"}, + {file = "StrEnum-0.4.15.tar.gz", hash = "sha256:878fb5ab705442070e4dd1929bb5e2249511c0bcf2b0eeacf3bcd80875c82eff"}, ] [package.extras] @@ -5920,6 +6237,21 @@ files = [ [package.dependencies] mpmath = ">=0.19" +[[package]] +name = "tabulate" +version = "0.9.0" +description = "Pretty-print tabular data" +category = "main" +optional = false +python-versions = ">=3.7" +files = [ + {file = "tabulate-0.9.0-py3-none-any.whl", hash = "sha256:024ca478df22e9340661486f85298cff5f6dcdba14f3813e8830015b9ed1948f"}, + {file = "tabulate-0.9.0.tar.gz", hash = "sha256:0095b12bf5966de529c0feb1fa08671671b3368eec77d7ef7ab114be2c068b3c"}, +] + +[package.extras] +widechars = ["wcwidth"] + [[package]] name = "tenacity" version = "8.2.2" @@ -5937,21 +6269,21 @@ doc = ["reno", "sphinx", "tornado (>=4.5)"] [[package]] name = "textual" -version = "0.10.1" +version = "0.28.1" description = "Modern Text User Interface framework" category = "main" optional = true python-versions = ">=3.7,<4.0" files = [ - {file = "textual-0.10.1-py3-none-any.whl", hash = "sha256:dd9a5b38a74cf42364a0f247e8f57e3ded7d69d44a63ee664af333f986c48e81"}, - {file = "textual-0.10.1.tar.gz", hash = "sha256:928cfeec37c60b212963f484e806b25380afdddb5a2aecd888ce8c9b46f93553"}, + {file = "textual-0.28.1-py3-none-any.whl", hash = "sha256:cb6f6230fea390178f8e727d2f9e542337a655549ea44331e22336da799a900f"}, + {file = "textual-0.28.1.tar.gz", hash = "sha256:f63a873d810b5d01f7318d8eb8f706d530550f3a90a6892628d17d47ecefcd41"}, ] [package.dependencies] -importlib-metadata = ">=4.11.3,<5.0.0" -nanoid = ">=2.0.0" -rich = ">12.6.0" -typing-extensions = {version = ">=4.0.0,<5.0.0", markers = "python_version < \"3.10\""} +importlib-metadata = ">=4.11.3" +markdown-it-py = {version = ">=2.1.0,<3.0.0", extras = ["linkify", "plugins"]} +rich = ">=13.3.3" +typing-extensions = ">=4.4.0,<5.0.0" [package.extras] dev = ["aiohttp (>=3.8.1)", "click (>=8.1.2)", "msgpack (>=1.0.3)"] @@ -6244,45 +6576,47 @@ test = ["argcomplete (>=2.0)", "pre-commit", "pytest", "pytest-mock"] [[package]] name = "transformers" -version = "4.29.0" +version = "4.30.2" description = "State-of-the-art Machine Learning for JAX, PyTorch and TensorFlow" category = "main" optional = false python-versions = ">=3.7.0" files = [ - {file = "transformers-4.29.0-py3-none-any.whl", hash = "sha256:51f89cbdd515dffac38c002277511d004e1a12a284ab852a4d5641430a409d1f"}, - {file = "transformers-4.29.0.tar.gz", hash = "sha256:b5dff9ce3708dc6639d892435fa69c51dee5c89870f888fa59ef0fc3baa3d8c7"}, + {file = "transformers-4.30.2-py3-none-any.whl", hash = "sha256:c332e3a3097f9ed89ce556b403251235931c00237b8bc2d7adaa19d226c13f1d"}, + {file = "transformers-4.30.2.tar.gz", hash = "sha256:f4a8aac4e1baffab4033f4a345b0d7dc7957d12a4f1ba969afea08205a513045"}, ] [package.dependencies] filelock = "*" -huggingface-hub = ">=0.11.0,<1.0" +huggingface-hub = ">=0.14.1,<1.0" numpy = ">=1.17" packaging = ">=20.0" pyyaml = ">=5.1" regex = "!=2019.12.17" requests = "*" +safetensors = ">=0.3.1" tokenizers = ">=0.11.1,<0.11.3 || >0.11.3,<0.14" tqdm = ">=4.27" [package.extras] -accelerate = ["accelerate (>=0.19.0)"] -all = ["Pillow", "accelerate (>=0.19.0)", "av (==9.2.0)", "codecarbon (==1.2.0)", "decord (==0.6.0)", "flax (>=0.4.1,<=0.6.9)", "jax (>=0.2.8,!=0.3.2,<=0.3.6)", "jaxlib (>=0.1.65,<=0.3.6)", "kenlm", "keras-nlp (>=0.3.1)", "librosa", "numba (<0.57.0)", "onnxconverter-common", "optax (>=0.0.8,<=0.1.4)", "optuna", "phonemizer", "protobuf (<=3.20.2)", "pyctcdecode (>=0.4.0)", "ray[tune]", "sentencepiece (>=0.1.91,!=0.1.92)", "sigopt", "tensorflow (>=2.4,<2.13)", "tensorflow-text (<2.13)", "tf2onnx", "timm", "tokenizers (>=0.11.1,!=0.11.3,<0.14)", "torch (>=1.9,!=1.12.0)", "torchaudio", "torchvision"] -audio = ["kenlm", "librosa", "numba (<0.57.0)", "phonemizer", "pyctcdecode (>=0.4.0)"] +accelerate = ["accelerate (>=0.20.2)"] +agents = ["Pillow", "accelerate (>=0.20.2)", "datasets (!=2.5.0)", "diffusers", "opencv-python", "sentencepiece (>=0.1.91,!=0.1.92)", "torch (>=1.9,!=1.12.0)"] +all = ["Pillow", "accelerate (>=0.20.2)", "av (==9.2.0)", "codecarbon (==1.2.0)", "decord (==0.6.0)", "flax (>=0.4.1,<=0.6.9)", "jax (>=0.2.8,!=0.3.2,<=0.3.6)", "jaxlib (>=0.1.65,<=0.3.6)", "kenlm", "keras-nlp (>=0.3.1)", "librosa", "onnxconverter-common", "optax (>=0.0.8,<=0.1.4)", "optuna", "phonemizer", "protobuf (<=3.20.3)", "pyctcdecode (>=0.4.0)", "ray[tune]", "sentencepiece (>=0.1.91,!=0.1.92)", "sigopt", "tensorflow (>=2.4,<2.13)", "tensorflow-text (<2.13)", "tf2onnx", "timm", "tokenizers (>=0.11.1,!=0.11.3,<0.14)", "torch (>=1.9,!=1.12.0)", "torchaudio", "torchvision"] +audio = ["kenlm", "librosa", "phonemizer", "pyctcdecode (>=0.4.0)"] codecarbon = ["codecarbon (==1.2.0)"] -deepspeed = ["accelerate (>=0.19.0)", "deepspeed (>=0.8.3)"] -deepspeed-testing = ["GitPython (<3.1.19)", "accelerate (>=0.19.0)", "beautifulsoup4", "black (>=23.1,<24.0)", "cookiecutter (==1.7.3)", "datasets (!=2.5.0)", "deepspeed (>=0.8.3)", "dill (<0.3.5)", "evaluate (>=0.2.0)", "faiss-cpu", "hf-doc-builder (>=0.3.0)", "nltk", "optuna", "parameterized", "protobuf (<=3.20.2)", "psutil", "pytest", "pytest-timeout", "pytest-xdist", "rjieba", "rouge-score (!=0.0.7,!=0.0.8,!=0.1,!=0.1.1)", "sacrebleu (>=1.4.12,<2.0.0)", "sacremoses", "safetensors (>=0.2.1)", "sentencepiece (>=0.1.91,!=0.1.92)", "timeout-decorator"] -dev = ["GitPython (<3.1.19)", "Pillow", "accelerate (>=0.19.0)", "av (==9.2.0)", "beautifulsoup4", "black (>=23.1,<24.0)", "codecarbon (==1.2.0)", "cookiecutter (==1.7.3)", "datasets (!=2.5.0)", "decord (==0.6.0)", "dill (<0.3.5)", "evaluate (>=0.2.0)", "faiss-cpu", "flax (>=0.4.1,<=0.6.9)", "fugashi (>=1.0)", "hf-doc-builder", "hf-doc-builder (>=0.3.0)", "ipadic (>=1.0.0,<2.0)", "isort (>=5.5.4)", "jax (>=0.2.8,!=0.3.2,<=0.3.6)", "jaxlib (>=0.1.65,<=0.3.6)", "kenlm", "keras-nlp (>=0.3.1)", "librosa", "nltk", "numba (<0.57.0)", "onnxconverter-common", "optax (>=0.0.8,<=0.1.4)", "optuna", "parameterized", "phonemizer", "protobuf (<=3.20.2)", "psutil", "pyctcdecode (>=0.4.0)", "pytest", "pytest-timeout", "pytest-xdist", "ray[tune]", "rhoknp (>=1.1.0)", "rjieba", "rouge-score (!=0.0.7,!=0.0.8,!=0.1,!=0.1.1)", "ruff (>=0.0.241,<=0.0.259)", "sacrebleu (>=1.4.12,<2.0.0)", "sacremoses", "safetensors (>=0.2.1)", "scikit-learn", "sentencepiece (>=0.1.91,!=0.1.92)", "sigopt", "sudachidict-core (>=20220729)", "sudachipy (>=0.6.6)", "tensorflow (>=2.4,<2.13)", "tensorflow-text (<2.13)", "tf2onnx", "timeout-decorator", "timm", "tokenizers (>=0.11.1,!=0.11.3,<0.14)", "torch (>=1.9,!=1.12.0)", "torchaudio", "torchvision", "unidic (>=1.0.2)", "unidic-lite (>=1.0.7)", "urllib3 (<2.0.0)"] -dev-tensorflow = ["GitPython (<3.1.19)", "Pillow", "beautifulsoup4", "black (>=23.1,<24.0)", "cookiecutter (==1.7.3)", "datasets (!=2.5.0)", "dill (<0.3.5)", "evaluate (>=0.2.0)", "faiss-cpu", "hf-doc-builder", "hf-doc-builder (>=0.3.0)", "isort (>=5.5.4)", "kenlm", "keras-nlp (>=0.3.1)", "librosa", "nltk", "numba (<0.57.0)", "onnxconverter-common", "onnxruntime (>=1.4.0)", "onnxruntime-tools (>=1.4.2)", "parameterized", "phonemizer", "protobuf (<=3.20.2)", "psutil", "pyctcdecode (>=0.4.0)", "pytest", "pytest-timeout", "pytest-xdist", "rjieba", "rouge-score (!=0.0.7,!=0.0.8,!=0.1,!=0.1.1)", "ruff (>=0.0.241,<=0.0.259)", "sacrebleu (>=1.4.12,<2.0.0)", "sacremoses", "safetensors (>=0.2.1)", "scikit-learn", "sentencepiece (>=0.1.91,!=0.1.92)", "tensorflow (>=2.4,<2.13)", "tensorflow-text (<2.13)", "tf2onnx", "timeout-decorator", "tokenizers (>=0.11.1,!=0.11.3,<0.14)", "urllib3 (<2.0.0)"] -dev-torch = ["GitPython (<3.1.19)", "Pillow", "accelerate (>=0.19.0)", "beautifulsoup4", "black (>=23.1,<24.0)", "codecarbon (==1.2.0)", "cookiecutter (==1.7.3)", "datasets (!=2.5.0)", "dill (<0.3.5)", "evaluate (>=0.2.0)", "faiss-cpu", "fugashi (>=1.0)", "hf-doc-builder", "hf-doc-builder (>=0.3.0)", "ipadic (>=1.0.0,<2.0)", "isort (>=5.5.4)", "kenlm", "librosa", "nltk", "numba (<0.57.0)", "onnxruntime (>=1.4.0)", "onnxruntime-tools (>=1.4.2)", "optuna", "parameterized", "phonemizer", "protobuf (<=3.20.2)", "psutil", "pyctcdecode (>=0.4.0)", "pytest", "pytest-timeout", "pytest-xdist", "ray[tune]", "rhoknp (>=1.1.0)", "rjieba", "rouge-score (!=0.0.7,!=0.0.8,!=0.1,!=0.1.1)", "ruff (>=0.0.241,<=0.0.259)", "sacrebleu (>=1.4.12,<2.0.0)", "sacremoses", "safetensors (>=0.2.1)", "scikit-learn", "sentencepiece (>=0.1.91,!=0.1.92)", "sigopt", "sudachidict-core (>=20220729)", "sudachipy (>=0.6.6)", "timeout-decorator", "timm", "tokenizers (>=0.11.1,!=0.11.3,<0.14)", "torch (>=1.9,!=1.12.0)", "torchaudio", "torchvision", "unidic (>=1.0.2)", "unidic-lite (>=1.0.7)", "urllib3 (<2.0.0)"] -docs = ["Pillow", "accelerate (>=0.19.0)", "av (==9.2.0)", "codecarbon (==1.2.0)", "decord (==0.6.0)", "flax (>=0.4.1,<=0.6.9)", "hf-doc-builder", "jax (>=0.2.8,!=0.3.2,<=0.3.6)", "jaxlib (>=0.1.65,<=0.3.6)", "kenlm", "keras-nlp (>=0.3.1)", "librosa", "numba (<0.57.0)", "onnxconverter-common", "optax (>=0.0.8,<=0.1.4)", "optuna", "phonemizer", "protobuf (<=3.20.2)", "pyctcdecode (>=0.4.0)", "ray[tune]", "sentencepiece (>=0.1.91,!=0.1.92)", "sigopt", "tensorflow (>=2.4,<2.13)", "tensorflow-text (<2.13)", "tf2onnx", "timm", "tokenizers (>=0.11.1,!=0.11.3,<0.14)", "torch (>=1.9,!=1.12.0)", "torchaudio", "torchvision"] +deepspeed = ["accelerate (>=0.20.2)", "deepspeed (>=0.8.3)"] +deepspeed-testing = ["GitPython (<3.1.19)", "accelerate (>=0.20.2)", "beautifulsoup4", "black (>=23.1,<24.0)", "cookiecutter (==1.7.3)", "datasets (!=2.5.0)", "deepspeed (>=0.8.3)", "dill (<0.3.5)", "evaluate (>=0.2.0)", "faiss-cpu", "hf-doc-builder (>=0.3.0)", "nltk", "optuna", "parameterized", "protobuf (<=3.20.3)", "psutil", "pytest (>=7.2.0)", "pytest-timeout", "pytest-xdist", "rjieba", "rouge-score (!=0.0.7,!=0.0.8,!=0.1,!=0.1.1)", "sacrebleu (>=1.4.12,<2.0.0)", "sacremoses", "sentencepiece (>=0.1.91,!=0.1.92)", "timeout-decorator"] +dev = ["GitPython (<3.1.19)", "Pillow", "accelerate (>=0.20.2)", "av (==9.2.0)", "beautifulsoup4", "black (>=23.1,<24.0)", "codecarbon (==1.2.0)", "cookiecutter (==1.7.3)", "datasets (!=2.5.0)", "decord (==0.6.0)", "dill (<0.3.5)", "evaluate (>=0.2.0)", "faiss-cpu", "flax (>=0.4.1,<=0.6.9)", "fugashi (>=1.0)", "hf-doc-builder", "hf-doc-builder (>=0.3.0)", "ipadic (>=1.0.0,<2.0)", "isort (>=5.5.4)", "jax (>=0.2.8,!=0.3.2,<=0.3.6)", "jaxlib (>=0.1.65,<=0.3.6)", "kenlm", "keras-nlp (>=0.3.1)", "librosa", "nltk", "onnxconverter-common", "optax (>=0.0.8,<=0.1.4)", "optuna", "parameterized", "phonemizer", "protobuf (<=3.20.3)", "psutil", "pyctcdecode (>=0.4.0)", "pytest (>=7.2.0)", "pytest-timeout", "pytest-xdist", "ray[tune]", "rhoknp (>=1.1.0,<1.3.1)", "rjieba", "rouge-score (!=0.0.7,!=0.0.8,!=0.1,!=0.1.1)", "ruff (>=0.0.241,<=0.0.259)", "sacrebleu (>=1.4.12,<2.0.0)", "sacremoses", "scikit-learn", "sentencepiece (>=0.1.91,!=0.1.92)", "sigopt", "sudachidict-core (>=20220729)", "sudachipy (>=0.6.6)", "tensorflow (>=2.4,<2.13)", "tensorflow-text (<2.13)", "tf2onnx", "timeout-decorator", "timm", "tokenizers (>=0.11.1,!=0.11.3,<0.14)", "torch (>=1.9,!=1.12.0)", "torchaudio", "torchvision", "unidic (>=1.0.2)", "unidic-lite (>=1.0.7)", "urllib3 (<2.0.0)"] +dev-tensorflow = ["GitPython (<3.1.19)", "Pillow", "beautifulsoup4", "black (>=23.1,<24.0)", "cookiecutter (==1.7.3)", "datasets (!=2.5.0)", "dill (<0.3.5)", "evaluate (>=0.2.0)", "faiss-cpu", "hf-doc-builder", "hf-doc-builder (>=0.3.0)", "isort (>=5.5.4)", "kenlm", "keras-nlp (>=0.3.1)", "librosa", "nltk", "onnxconverter-common", "onnxruntime (>=1.4.0)", "onnxruntime-tools (>=1.4.2)", "parameterized", "phonemizer", "protobuf (<=3.20.3)", "psutil", "pyctcdecode (>=0.4.0)", "pytest (>=7.2.0)", "pytest-timeout", "pytest-xdist", "rjieba", "rouge-score (!=0.0.7,!=0.0.8,!=0.1,!=0.1.1)", "ruff (>=0.0.241,<=0.0.259)", "sacrebleu (>=1.4.12,<2.0.0)", "sacremoses", "scikit-learn", "sentencepiece (>=0.1.91,!=0.1.92)", "tensorflow (>=2.4,<2.13)", "tensorflow-text (<2.13)", "tf2onnx", "timeout-decorator", "tokenizers (>=0.11.1,!=0.11.3,<0.14)", "urllib3 (<2.0.0)"] +dev-torch = ["GitPython (<3.1.19)", "Pillow", "accelerate (>=0.20.2)", "beautifulsoup4", "black (>=23.1,<24.0)", "codecarbon (==1.2.0)", "cookiecutter (==1.7.3)", "datasets (!=2.5.0)", "dill (<0.3.5)", "evaluate (>=0.2.0)", "faiss-cpu", "fugashi (>=1.0)", "hf-doc-builder", "hf-doc-builder (>=0.3.0)", "ipadic (>=1.0.0,<2.0)", "isort (>=5.5.4)", "kenlm", "librosa", "nltk", "onnxruntime (>=1.4.0)", "onnxruntime-tools (>=1.4.2)", "optuna", "parameterized", "phonemizer", "protobuf (<=3.20.3)", "psutil", "pyctcdecode (>=0.4.0)", "pytest (>=7.2.0)", "pytest-timeout", "pytest-xdist", "ray[tune]", "rhoknp (>=1.1.0,<1.3.1)", "rjieba", "rouge-score (!=0.0.7,!=0.0.8,!=0.1,!=0.1.1)", "ruff (>=0.0.241,<=0.0.259)", "sacrebleu (>=1.4.12,<2.0.0)", "sacremoses", "scikit-learn", "sentencepiece (>=0.1.91,!=0.1.92)", "sigopt", "sudachidict-core (>=20220729)", "sudachipy (>=0.6.6)", "timeout-decorator", "timm", "tokenizers (>=0.11.1,!=0.11.3,<0.14)", "torch (>=1.9,!=1.12.0)", "torchaudio", "torchvision", "unidic (>=1.0.2)", "unidic-lite (>=1.0.7)", "urllib3 (<2.0.0)"] +docs = ["Pillow", "accelerate (>=0.20.2)", "av (==9.2.0)", "codecarbon (==1.2.0)", "decord (==0.6.0)", "flax (>=0.4.1,<=0.6.9)", "hf-doc-builder", "jax (>=0.2.8,!=0.3.2,<=0.3.6)", "jaxlib (>=0.1.65,<=0.3.6)", "kenlm", "keras-nlp (>=0.3.1)", "librosa", "onnxconverter-common", "optax (>=0.0.8,<=0.1.4)", "optuna", "phonemizer", "protobuf (<=3.20.3)", "pyctcdecode (>=0.4.0)", "ray[tune]", "sentencepiece (>=0.1.91,!=0.1.92)", "sigopt", "tensorflow (>=2.4,<2.13)", "tensorflow-text (<2.13)", "tf2onnx", "timm", "tokenizers (>=0.11.1,!=0.11.3,<0.14)", "torch (>=1.9,!=1.12.0)", "torchaudio", "torchvision"] docs-specific = ["hf-doc-builder"] fairscale = ["fairscale (>0.3)"] flax = ["flax (>=0.4.1,<=0.6.9)", "jax (>=0.2.8,!=0.3.2,<=0.3.6)", "jaxlib (>=0.1.65,<=0.3.6)", "optax (>=0.0.8,<=0.1.4)"] -flax-speech = ["kenlm", "librosa", "numba (<0.57.0)", "phonemizer", "pyctcdecode (>=0.4.0)"] +flax-speech = ["kenlm", "librosa", "phonemizer", "pyctcdecode (>=0.4.0)"] ftfy = ["ftfy"] integrations = ["optuna", "ray[tune]", "sigopt"] -ja = ["fugashi (>=1.0)", "ipadic (>=1.0.0,<2.0)", "rhoknp (>=1.1.0)", "sudachidict-core (>=20220729)", "sudachipy (>=0.6.6)", "unidic (>=1.0.2)", "unidic-lite (>=1.0.7)"] +ja = ["fugashi (>=1.0)", "ipadic (>=1.0.0,<2.0)", "rhoknp (>=1.1.0,<1.3.1)", "sudachidict-core (>=20220729)", "sudachipy (>=0.6.6)", "unidic (>=1.0.2)", "unidic-lite (>=1.0.7)"] modelcreation = ["cookiecutter (==1.7.3)"] natten = ["natten (>=0.14.6)"] onnx = ["onnxconverter-common", "onnxruntime (>=1.4.0)", "onnxruntime-tools (>=1.4.2)", "tf2onnx"] @@ -6292,21 +6626,21 @@ quality = ["GitPython (<3.1.19)", "black (>=23.1,<24.0)", "datasets (!=2.5.0)", ray = ["ray[tune]"] retrieval = ["datasets (!=2.5.0)", "faiss-cpu"] sagemaker = ["sagemaker (>=2.31.0)"] -sentencepiece = ["protobuf (<=3.20.2)", "sentencepiece (>=0.1.91,!=0.1.92)"] +sentencepiece = ["protobuf (<=3.20.3)", "sentencepiece (>=0.1.91,!=0.1.92)"] serving = ["fastapi", "pydantic", "starlette", "uvicorn"] sigopt = ["sigopt"] sklearn = ["scikit-learn"] -speech = ["kenlm", "librosa", "numba (<0.57.0)", "phonemizer", "pyctcdecode (>=0.4.0)", "torchaudio"] -testing = ["GitPython (<3.1.19)", "beautifulsoup4", "black (>=23.1,<24.0)", "cookiecutter (==1.7.3)", "datasets (!=2.5.0)", "dill (<0.3.5)", "evaluate (>=0.2.0)", "faiss-cpu", "hf-doc-builder (>=0.3.0)", "nltk", "parameterized", "protobuf (<=3.20.2)", "psutil", "pytest", "pytest-timeout", "pytest-xdist", "rjieba", "rouge-score (!=0.0.7,!=0.0.8,!=0.1,!=0.1.1)", "sacrebleu (>=1.4.12,<2.0.0)", "sacremoses", "safetensors (>=0.2.1)", "timeout-decorator"] +speech = ["kenlm", "librosa", "phonemizer", "pyctcdecode (>=0.4.0)", "torchaudio"] +testing = ["GitPython (<3.1.19)", "beautifulsoup4", "black (>=23.1,<24.0)", "cookiecutter (==1.7.3)", "datasets (!=2.5.0)", "dill (<0.3.5)", "evaluate (>=0.2.0)", "faiss-cpu", "hf-doc-builder (>=0.3.0)", "nltk", "parameterized", "protobuf (<=3.20.3)", "psutil", "pytest (>=7.2.0)", "pytest-timeout", "pytest-xdist", "rjieba", "rouge-score (!=0.0.7,!=0.0.8,!=0.1,!=0.1.1)", "sacrebleu (>=1.4.12,<2.0.0)", "sacremoses", "timeout-decorator"] tf = ["keras-nlp (>=0.3.1)", "onnxconverter-common", "tensorflow (>=2.4,<2.13)", "tensorflow-text (<2.13)", "tf2onnx"] tf-cpu = ["keras-nlp (>=0.3.1)", "onnxconverter-common", "tensorflow-cpu (>=2.4,<2.13)", "tensorflow-text (<2.13)", "tf2onnx"] -tf-speech = ["kenlm", "librosa", "numba (<0.57.0)", "phonemizer", "pyctcdecode (>=0.4.0)"] +tf-speech = ["kenlm", "librosa", "phonemizer", "pyctcdecode (>=0.4.0)"] timm = ["timm"] tokenizers = ["tokenizers (>=0.11.1,!=0.11.3,<0.14)"] -torch = ["accelerate (>=0.19.0)", "torch (>=1.9,!=1.12.0)"] -torch-speech = ["kenlm", "librosa", "numba (<0.57.0)", "phonemizer", "pyctcdecode (>=0.4.0)", "torchaudio"] +torch = ["accelerate (>=0.20.2)", "torch (>=1.9,!=1.12.0)"] +torch-speech = ["kenlm", "librosa", "phonemizer", "pyctcdecode (>=0.4.0)", "torchaudio"] torch-vision = ["Pillow", "torchvision"] -torchhub = ["filelock", "huggingface-hub (>=0.11.0,<1.0)", "importlib-metadata", "numpy (>=1.17)", "packaging (>=20.0)", "protobuf (<=3.20.2)", "regex (!=2019.12.17)", "requests", "sentencepiece (>=0.1.91,!=0.1.92)", "tokenizers (>=0.11.1,!=0.11.3,<0.14)", "torch (>=1.9,!=1.12.0)", "tqdm (>=4.27)"] +torchhub = ["filelock", "huggingface-hub (>=0.14.1,<1.0)", "importlib-metadata", "numpy (>=1.17)", "packaging (>=20.0)", "protobuf (<=3.20.3)", "regex (!=2019.12.17)", "requests", "sentencepiece (>=0.1.91,!=0.1.92)", "tokenizers (>=0.11.1,!=0.11.3,<0.14)", "torch (>=1.9,!=1.12.0)", "tqdm (>=4.27)"] video = ["av (==9.2.0)", "decord (==0.6.0)"] vision = ["Pillow"] @@ -6382,14 +6716,14 @@ files = [ [[package]] name = "types-pillow" -version = "9.5.0.4" +version = "9.5.0.5" description = "Typing stubs for Pillow" category = "dev" optional = false python-versions = "*" files = [ - {file = "types-Pillow-9.5.0.4.tar.gz", hash = "sha256:f1b6af47abd151847ee25911ffeba784899bc7dc7f9eba8ca6a5aac522b012ef"}, - {file = "types_Pillow-9.5.0.4-py3-none-any.whl", hash = "sha256:69427d9fa4320ff6e30f00fb9c0dd71185dc0a16de4757774220104759483466"}, + {file = "types-Pillow-9.5.0.5.tar.gz", hash = "sha256:de9877aa1e6226b6479459ca84df02fd7e999b970c79cfee3b8298840336e77c"}, + {file = "types_Pillow-9.5.0.5-py3-none-any.whl", hash = "sha256:2b17f95c5c16e4962e4032bdb95494766a85569fa278ee21e5fcbbd318e9ccd2"}, ] [[package]] @@ -6408,7 +6742,7 @@ files = [ name = "types-pyyaml" version = "6.0.12.10" description = "Typing stubs for PyYAML" -category = "main" +category = "dev" optional = false python-versions = "*" files = [ @@ -6471,41 +6805,75 @@ files = [ mypy-extensions = ">=0.3.0" typing-extensions = ">=3.7.4" +[[package]] +name = "tzdata" +version = "2023.3" +description = "Provider of IANA time zone data" +category = "main" +optional = false +python-versions = ">=2" +files = [ + {file = "tzdata-2023.3-py2.py3-none-any.whl", hash = "sha256:7e65763eef3120314099b6939b5546db7adce1e7d6f2e179e3df563c70511eda"}, + {file = "tzdata-2023.3.tar.gz", hash = "sha256:11ef1e08e54acb0d4f95bdb1be05da659673de4acbd21bf9c69e94cc5e907a3a"}, +] + +[[package]] +name = "uc-micro-py" +version = "1.0.2" +description = "Micro subset of unicode data files for linkify-it-py projects." +category = "main" +optional = true +python-versions = ">=3.7" +files = [ + {file = "uc-micro-py-1.0.2.tar.gz", hash = "sha256:30ae2ac9c49f39ac6dce743bd187fcd2b574b16ca095fa74cd9396795c954c54"}, + {file = "uc_micro_py-1.0.2-py3-none-any.whl", hash = "sha256:8c9110c309db9d9e87302e2f4ad2c3152770930d88ab385cd544e7a7e75f3de0"}, +] + +[package.extras] +test = ["coverage", "pytest", "pytest-cov"] + [[package]] name = "unstructured" -version = "0.5.13" +version = "0.7.10" description = "A library that prepares raw documents for downstream ML tasks." category = "main" optional = false python-versions = ">=3.7.0" files = [ - {file = "unstructured-0.5.13-py3-none-any.whl", hash = "sha256:44ddc2848f1009fd64ced91a9b52d0e9dd15dee837f34a898ecd95863236b880"}, - {file = "unstructured-0.5.13.tar.gz", hash = "sha256:b25443a47353297bda5eec64615215111e07c2507771cf8ad5471d04ac9026b1"}, + {file = "unstructured-0.7.10-py3-none-any.whl", hash = "sha256:d36ae0b59bcf95751b4304a6f44864ec3187f584cf80ee66a68e99537e0e4a0d"}, + {file = "unstructured-0.7.10.tar.gz", hash = "sha256:93d65dd746151703c6873d69156d2a4bc9f9f1507044cdd617b1645373528d74"}, ] [package.dependencies] argilla = "*" -certifi = ">=2022.12.07" +chardet = "*" +filetype = "*" lxml = "*" markdown = "*" msg-parser = "*" nltk = "*" openpyxl = "*" pandas = "*" +pdf2image = "*" +"pdfminer.six" = "*" pillow = "*" pypandoc = "*" python-docx = "*" python-magic = "*" python-pptx = "*" requests = "*" +tabulate = "*" +xlrd = "*" [package.extras] azure = ["adlfs", "fsspec"] -github = ["pygithub (==1.57.0)"] +discord = ["discord-py"] +gcs = ["fsspec", "gcsfs"] +github = ["pygithub (==1.58.2)"] gitlab = ["python-gitlab"] -google-drive = ["google-api-python-client", "protobuf (<3.21)"] +google-drive = ["google-api-python-client"] huggingface = ["langdetect", "sacremoses", "sentencepiece", "torch", "transformers"] -local-inference = ["unstructured-inference (==0.3.2)"] +local-inference = ["unstructured-inference (==0.5.1)"] reddit = ["praw"] s3 = ["fsspec", "s3fs"] slack = ["slack-sdk"] @@ -6934,6 +7302,23 @@ files = [ {file = "wrapt-1.15.0.tar.gz", hash = "sha256:d06730c6aed78cee4126234cf2d071e01b44b915e725a6cb439a879ec9754a3a"}, ] +[[package]] +name = "xlrd" +version = "2.0.1" +description = "Library for developers to extract data from Microsoft Excel (tm) .xls spreadsheet files" +category = "main" +optional = false +python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*, !=3.4.*, !=3.5.*" +files = [ + {file = "xlrd-2.0.1-py2.py3-none-any.whl", hash = "sha256:6a33ee89877bd9abc1158129f6e94be74e2679636b8a205b43b85206c3f0bbdd"}, + {file = "xlrd-2.0.1.tar.gz", hash = "sha256:f72f148f54442c6b056bf931dbc34f986fd0c3b0b6b5a58d013c9aef274d0c88"}, +] + +[package.extras] +build = ["twine", "wheel"] +docs = ["sphinx"] +test = ["pytest", "pytest-cov"] + [[package]] name = "xlsxwriter" version = "3.1.2" @@ -7115,4 +7500,4 @@ deploy = ["langchain-serve"] [metadata] lock-version = "2.0" python-versions = ">=3.9,<3.12" -content-hash = "2f8373e1c80ce345f39ed9247fd4759ae94b5c754c4e850d3aa72183556eb92b" +content-hash = "3875f61e1228dfac1574076a6c3755703463fa6ed1fe737d064a171be94259d4" diff --git a/pyproject.toml b/pyproject.toml index da75b0207..e606cf828 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -1,6 +1,6 @@ [tool.poetry] name = "langflow" -version = "0.2.2" +version = "0.2.7" description = "A Python package with a built-in web application" authors = ["Logspace "] maintainers = [ @@ -25,22 +25,21 @@ langflow = "langflow.__main__:main" python = ">=3.9,<3.12" fastapi = "^0.98.0" uvicorn = "^0.22.0" -beautifulsoup4 = "^4.11.2" +beautifulsoup4 = "^4.12.2" google-search-results = "^2.4.1" google-api-python-client = "^2.79.0" typer = "^0.9.0" gunicorn = "^20.1.0" -langchain = "^0.0.215" +langchain = "^0.0.219" openai = "^0.27.8" -types-pyyaml = "^6.0.12.8" -pandas = "^1.5.3" +pandas = "^2.0.0" chromadb = "^0.3.21" -huggingface-hub = "^0.13.3" +huggingface-hub = "^0.15.0" rich = "^13.4.2" llama-cpp-python = "~0.1.0" networkx = "^3.1" -unstructured = "^0.5.11" -pypdf = "^3.7.1" +unstructured = "^0.7.0" +pypdf = "^3.11.0" lxml = "^4.9.2" pysrt = "^1.1.2" fake-useragent = "^1.1.3" @@ -49,18 +48,18 @@ psycopg2-binary = "^2.9.6" pyarrow = "^12.0.0" tiktoken = "~0.4.0" wikipedia = "^1.4.0" -langchain-serve = { version = ">0.0.39", optional = true } -qdrant-client = "^1.2.0" +langchain-serve = { version = ">0.0.47", optional = true } +qdrant-client = "^1.3.0" websockets = "^10.3" weaviate-client = "^3.21.0" jina = "3.15.2" sentence-transformers = "^2.2.2" -ctransformers = "^0.2.2" -cohere = "^4.6.0" +ctransformers = "^0.2.10" +cohere = "^4.11.0" python-multipart = "^0.0.6" sqlmodel = "^0.0.8" faiss-cpu = "^1.7.4" -anthropic = "^0.2.10" +anthropic = "^0.3.0" orjson = "^3.9.1" multiprocess = "^0.70.14" cachetools = "^5.3.1" @@ -70,7 +69,8 @@ pinecone-client = "^2.2.2" supabase = "^1.0.3" pymongo = "^4.4.0" certifi = "^2023.5.7" - +psycopg = "^3.1.9" +psycopg-binary = "^3.1.9" [tool.poetry.dev-dependencies] black = "^23.1.0" @@ -85,6 +85,7 @@ pytest-cov = "^4.0.0" pandas-stubs = "^2.0.0.230412" types-pillow = "^9.5.0.2" types-appdirs = "^1.4.3.5" +types-pyyaml = "^6.0.12.8" [tool.poetry.extras] diff --git a/src/backend/langflow/__main__.py b/src/backend/langflow/__main__.py index a3841ec93..9980a5d2f 100644 --- a/src/backend/langflow/__main__.py +++ b/src/backend/langflow/__main__.py @@ -1,6 +1,5 @@ import sys import time -from fastapi import FastAPI import httpx from multiprocess import Process, cpu_count # type: ignore import platform @@ -11,9 +10,7 @@ from rich.panel import Panel from rich import box from rich import print as rprint import typer -from fastapi.staticfiles import StaticFiles -from fastapi.responses import FileResponse -from langflow.main import create_app +from langflow.main import setup_app from langflow.settings import settings from langflow.utils.logger import configure, logger import webbrowser @@ -144,15 +141,9 @@ def serve( remove_api_keys=remove_api_keys, cache=cache, ) - # get the directory of the current file - if not path: - frontend_path = Path(__file__).parent - static_files_dir = frontend_path / "frontend" - else: - static_files_dir = Path(path) - - app = create_app() - setup_static_files(app, static_files_dir) + # create path object if path is provided + static_files_dir: Optional[Path] = Path(path) if path else None + app = setup_app(static_files_dir=static_files_dir) # check if port is being used if is_port_in_use(port, host): port = get_free_port(port) @@ -200,29 +191,6 @@ def run_on_windows(host, port, log_level, options, app): run_langflow(host, port, log_level, options, app) -def setup_static_files(app: FastAPI, static_files_dir: Path): - """ - Setup the static files directory. - - Args: - app (FastAPI): FastAPI app. - path (str): Path to the static files directory. - """ - app.mount( - "/", - StaticFiles(directory=static_files_dir, html=True), - name="static", - ) - - @app.exception_handler(404) - async def custom_404_handler(request, __): - path = static_files_dir / "index.html" - - if not path.exists(): - raise RuntimeError(f"File at path {path} does not exist.") - return FileResponse(path) - - def is_port_in_use(port, host="localhost"): """ Check if a port is in use. diff --git a/src/backend/langflow/api/v1/chat.py b/src/backend/langflow/api/v1/chat.py index be9d6802c..25be65dbb 100644 --- a/src/backend/langflow/api/v1/chat.py +++ b/src/backend/langflow/api/v1/chat.py @@ -1,12 +1,6 @@ -from fastapi import ( - APIRouter, - HTTPException, - WebSocket, - WebSocketException, - status, -) +from fastapi import APIRouter, HTTPException, WebSocket, WebSocketException, status from fastapi.responses import StreamingResponse -from langflow.api.v1.schemas import BuiltResponse, InitResponse, StreamData +from langflow.api.v1.schemas import BuildStatus, BuiltResponse, InitResponse, StreamData from langflow.chat.manager import ChatManager from langflow.graph.graph.base import Graph @@ -32,15 +26,29 @@ async def chat(client_id: str, websocket: WebSocket): await websocket.close(code=status.WS_1011_INTERNAL_ERROR, reason=str(exc)) -@router.post("/build/init", response_model=InitResponse, status_code=201) -async def init_build(graph_data: dict): +@router.post("/build/init/{flow_id}", response_model=InitResponse, status_code=201) +async def init_build(graph_data: dict, flow_id: str): """Initialize the build by storing graph data and returning a unique session ID.""" try: - flow_id = graph_data.get("id") if flow_id is None: raise ValueError("No ID provided") - flow_data_store[flow_id] = graph_data + # Check if already building + if ( + flow_id in flow_data_store + and flow_data_store[flow_id]["status"] == BuildStatus.IN_PROGRESS + ): + return InitResponse(flowId=flow_id) + + # Delete from cache if already exists + if flow_id in chat_manager.in_memory_cache: + with chat_manager.in_memory_cache._lock: + chat_manager.in_memory_cache.delete(flow_id) + logger.debug(f"Deleted flow {flow_id} from cache") + flow_data_store[flow_id] = { + "graph_data": graph_data, + "status": BuildStatus.STARTED, + } return InitResponse(flowId=flow_id) except Exception as exc: @@ -52,8 +60,9 @@ async def init_build(graph_data: dict): async def build_status(flow_id: str): """Check the flow_id is in the flow_data_store.""" try: - built = flow_id in flow_data_store and not isinstance( - flow_data_store[flow_id], dict + built = ( + flow_id in flow_data_store + and flow_data_store[flow_id]["status"] == BuildStatus.SUCCESS ) return BuiltResponse( @@ -77,7 +86,12 @@ async def stream_build(flow_id: str): yield str(StreamData(event="error", data={"error": error_message})) return - graph_data = flow_data_store[flow_id].get("data") + if flow_data_store[flow_id].get("status") == BuildStatus.IN_PROGRESS: + error_message = "Already building" + yield str(StreamData(event="error", data={"error": error_message})) + return + + graph_data = flow_data_store[flow_id].get("graph_data") if not graph_data: error_message = "No data provided" @@ -95,6 +109,7 @@ async def stream_build(flow_id: str): return number_of_nodes = len(graph.nodes) + flow_data_store[flow_id]["status"] = BuildStatus.IN_PROGRESS for i, vertex in enumerate(graph.generator_build(), 1): try: log_dict = { @@ -110,6 +125,7 @@ async def stream_build(flow_id: str): except Exception as exc: params = str(exc) valid = False + flow_data_store[flow_id]["status"] = BuildStatus.FAILURE response = { "valid": valid, @@ -121,8 +137,10 @@ async def stream_build(flow_id: str): yield str(StreamData(event="message", data=response)) chat_manager.set_cache(flow_id, graph.build()) + flow_data_store[flow_id]["status"] = BuildStatus.SUCCESS except Exception as exc: logger.error("Error while building the flow: %s", exc) + flow_data_store[flow_id]["status"] = BuildStatus.FAILURE yield str(StreamData(event="error", data={"error": str(exc)})) finally: yield str(StreamData(event="message", data=final_response)) diff --git a/src/backend/langflow/api/v1/endpoints.py b/src/backend/langflow/api/v1/endpoints.py index f18e3056d..13cba6c2c 100644 --- a/src/backend/langflow/api/v1/endpoints.py +++ b/src/backend/langflow/api/v1/endpoints.py @@ -11,7 +11,7 @@ from langflow.api.v1.schemas import ( UploadFileResponse, ) -from langflow.interface.types import build_langchain_types_dict +from langflow.interface.types import langchain_types_dict from langflow.database.base import get_session from sqlmodel import Session @@ -21,7 +21,7 @@ router = APIRouter(tags=["Base"]) @router.get("/all") def get_all(): - return build_langchain_types_dict() + return langchain_types_dict # For backwards compatibility we will keep the old endpoint diff --git a/src/backend/langflow/api/v1/schemas.py b/src/backend/langflow/api/v1/schemas.py index ed5bf8b3b..f5f1f9ccf 100644 --- a/src/backend/langflow/api/v1/schemas.py +++ b/src/backend/langflow/api/v1/schemas.py @@ -1,3 +1,4 @@ +from enum import Enum from pathlib import Path from typing import Any, Dict, List, Optional, Union from langflow.database.models.flow import FlowCreate, FlowRead @@ -5,6 +6,15 @@ from pydantic import BaseModel, Field, validator import json +class BuildStatus(Enum): + """Status of the build.""" + + SUCCESS = "success" + FAILURE = "failure" + STARTED = "started" + IN_PROGRESS = "in_progress" + + class GraphData(BaseModel): """Data inside the exported flow.""" diff --git a/src/backend/langflow/chat/config.py b/src/backend/langflow/chat/config.py new file mode 100644 index 000000000..274f4d5bd --- /dev/null +++ b/src/backend/langflow/chat/config.py @@ -0,0 +1,2 @@ +class ChatConfig: + streaming: bool = True diff --git a/src/backend/langflow/config.yaml b/src/backend/langflow/config.yaml index d8cd4a325..8d60876fa 100644 --- a/src/backend/langflow/config.yaml +++ b/src/backend/langflow/config.yaml @@ -1,141 +1,264 @@ ---- agents: - - ZeroShotAgent - - JsonAgent - - CSVAgent - - AgentInitializer - - VectorStoreAgent - - VectorStoreRouterAgent - - SQLAgent + ZeroShotAgent: + documentation: "https://python.langchain.com/docs/modules/agents/how_to/custom_mrkl_agent" + JsonAgent: + documentation: "https://python.langchain.com/docs/modules/agents/toolkits/openapi" + CSVAgent: + documentation: "https://python.langchain.com/docs/modules/agents/toolkits/csv" + AgentInitializer: + documentation: "https://python.langchain.com/docs/modules/agents/agent_types/" + VectorStoreAgent: + documentation: "" + VectorStoreRouterAgent: + documentation: "" + SQLAgent: + documentation: "" chains: - - LLMChain - - LLMMathChain - - LLMCheckerChain - - ConversationChain - - SeriesCharacterChain - - MidJourneyPromptChain - - TimeTravelGuideChain - - SQLDatabaseChain - - RetrievalQA - - RetrievalQAWithSourcesChain - - ConversationalRetrievalChain - - CombineDocsChain + LLMChain: + documentation: "https://python.langchain.com/docs/modules/chains/foundational/llm_chain" + LLMMathChain: + documentation: "https://python.langchain.com/docs/modules/chains/additional/llm_math" + LLMCheckerChain: + documentation: "https://python.langchain.com/docs/modules/chains/additional/llm_checker" + ConversationChain: + documentation: "" + SeriesCharacterChain: + documentation: "" + MidJourneyPromptChain: + documentation: "" + TimeTravelGuideChain: + documentation: "" + SQLDatabaseChain: + documentation: "" + RetrievalQA: + documentation: "https://python.langchain.com/docs/modules/chains/popular/vector_db_qa" + RetrievalQAWithSourcesChain: + documentation: "" + ConversationalRetrievalChain: + documentation: "https://python.langchain.com/docs/modules/chains/popular/chat_vector_db" + CombineDocsChain: + documentation: "" documentloaders: - - AirbyteJSONLoader - - CoNLLULoader - - CSVLoader - - UnstructuredEmailLoader - - EverNoteLoader - - FacebookChatLoader - - GutenbergLoader - - BSHTMLLoader - - UnstructuredHTMLLoader - # - UnstructuredImageLoader # Issue with Python 3.11 (https://github.com/Unstructured-IO/unstructured-inference/issues/83) - - UnstructuredMarkdownLoader - - PyPDFLoader - - UnstructuredPowerPointLoader - - SRTLoader - - TelegramChatLoader - - TextLoader - - UnstructuredWordDocumentLoader - - WebBaseLoader - - AZLyricsLoader - - CollegeConfidentialLoader - - HNLoader - - IFixitLoader - - IMSDbLoader - - GitbookLoader - - ReadTheDocsLoader - - SlackDirectoryLoader - - NotionDirectoryLoader - - DirectoryLoader - - GitLoader + AirbyteJSONLoader: + documentation: "https://python.langchain.com/docs/modules/data_connection/document_loaders/integrations/airbyte_json" + CoNLLULoader: + documentation: "https://python.langchain.com/docs/modules/data_connection/document_loaders/integrations/conll-u" + CSVLoader: + documentation: "https://python.langchain.com/docs/modules/data_connection/document_loaders/integrations/csv" + UnstructuredEmailLoader: + documentation: "https://python.langchain.com/docs/modules/data_connection/document_loaders/integrations/email" + EverNoteLoader: + documentation: "https://python.langchain.com/docs/modules/data_connection/document_loaders/integrations/evernote" + FacebookChatLoader: + documentation: "https://python.langchain.com/docs/modules/data_connection/document_loaders/integrations/facebook_chat" + GutenbergLoader: + documentation: "https://python.langchain.com/docs/modules/data_connection/document_loaders/integrations/gutenberg" + BSHTMLLoader: + documentation: "https://python.langchain.com/docs/modules/data_connection/document_loaders/how_to/html" + UnstructuredHTMLLoader: + documentation: "https://python.langchain.com/docs/modules/data_connection/document_loaders/how_to/html" + UnstructuredMarkdownLoader: + documentation: "https://python.langchain.com/docs/modules/data_connection/document_loaders/how_to/markdown" + PyPDFLoader: + documentation: "https://python.langchain.com/docs/modules/data_connection/document_loaders/how_to/pdf" + UnstructuredPowerPointLoader: + documentation: "https://python.langchain.com/docs/modules/data_connection/document_loaders/integrations/microsoft_powerpoint" + SRTLoader: + documentation: "https://python.langchain.com/docs/modules/data_connection/document_loaders/integrations/subtitle" + TelegramChatLoader: + documentation: "https://python.langchain.com/docs/modules/data_connection/document_loaders/integrations/telegram" + TextLoader: + documentation: "https://python.langchain.com/docs/modules/data_connection/document_loaders/" + UnstructuredWordDocumentLoader: + documentation: "https://python.langchain.com/docs/modules/data_connection/document_loaders/integrations/microsoft_word" + WebBaseLoader: + documentation: "https://python.langchain.com/docs/modules/data_connection/document_loaders/integrations/web_base" + AZLyricsLoader: + documentation: "https://python.langchain.com/docs/modules/data_connection/document_loaders/integrations/azlyrics" + CollegeConfidentialLoader: + documentation: "https://python.langchain.com/docs/modules/data_connection/document_loaders/integrations/college_confidential" + HNLoader: + documentation: "https://python.langchain.com/docs/modules/data_connection/document_loaders/integrations/hacker_news" + IFixitLoader: + documentation: "https://python.langchain.com/docs/modules/data_connection/document_loaders/integrations/ifixit" + IMSDbLoader: + documentation: "https://python.langchain.com/docs/modules/data_connection/document_loaders/integrations/imsdb" + GitbookLoader: + documentation: "https://python.langchain.com/docs/modules/data_connection/document_loaders/integrations/gitbook" + ReadTheDocsLoader: + documentation: "https://python.langchain.com/docs/modules/data_connection/document_loaders/integrations/readthedocs_documentation" + SlackDirectoryLoader: + documentation: "https://python.langchain.com/docs/modules/data_connection/document_loaders/integrations/slack" + NotionDirectoryLoader: + documentation: "https://python.langchain.com/docs/modules/data_connection/document_loaders/integrations/notion" + DirectoryLoader: + documentation: "https://python.langchain.com/docs/modules/data_connection/document_loaders/how_to/file_directory" + GitLoader: + documentation: "https://python.langchain.com/docs/modules/data_connection/document_loaders/integrations/git" embeddings: - - OpenAIEmbeddings - - HuggingFaceEmbeddings - - CohereEmbeddings + OpenAIEmbeddings: + documentation: "https://python.langchain.com/docs/modules/data_connection/text_embedding/integrations/openai" + HuggingFaceEmbeddings: + documentation: "https://python.langchain.com/docs/modules/data_connection/text_embedding/integrations/sentence_transformers" + CohereEmbeddings: + documentation: "https://python.langchain.com/docs/modules/data_connection/text_embedding/integrations/cohere" llms: - - OpenAI - # - AzureOpenAI - # - AzureChatOpenAI - - ChatOpenAI - - LlamaCpp - - CTransformers - - Cohere - - Anthropic - - ChatAnthropic - - HuggingFaceHub + OpenAI: + documentation: "https://python.langchain.com/docs/modules/model_io/models/llms/integrations/openai" + ChatOpenAI: + documentation: "https://python.langchain.com/docs/modules/model_io/models/chat/integrations/openai" + LlamaCpp: + documentation: "https://python.langchain.com/docs/modules/model_io/models/llms/integrations/llamacpp" + CTransformers: + documentation: "https://python.langchain.com/docs/modules/model_io/models/llms/integrations/ctransformers" + Cohere: + documentation: "https://python.langchain.com/docs/modules/model_io/models/llms/integrations/cohere" + Anthropic: + documentation: "" + ChatAnthropic: + documentation: "https://python.langchain.com/docs/modules/model_io/models/chat/integrations/anthropic" + HuggingFaceHub: + documentation: "https://python.langchain.com/docs/modules/model_io/models/llms/integrations/huggingface_hub" memories: - - ConversationBufferMemory - - ConversationSummaryMemory - - ConversationKGMemory + # https://github.com/supabase-community/supabase-py/issues/482 + # ZepChatMessageHistory: + # documentation: "https://python.langchain.com/docs/modules/memory/integrations/zep_memory" + ConversationEntityMemory: + documentation: "https://python.langchain.com/docs/modules/memory/integrations/entity_memory_with_sqlite" + # https://github.com/hwchase17/langchain/issues/6091 + # SQLiteEntityStore: + # documentation: "https://python.langchain.com/docs/modules/memory/integrations/entity_memory_with_sqlite" + PostgresChatMessageHistory: + documentation: "https://python.langchain.com/docs/modules/memory/integrations/postgres_chat_message_history" + ConversationBufferMemory: + documentation: "https://python.langchain.com/docs/modules/memory/how_to/buffer" + ConversationSummaryMemory: + documentation: "https://python.langchain.com/docs/modules/memory/how_to/summary" + ConversationKGMemory: + documentation: "https://python.langchain.com/docs/modules/memory/how_to/kg" + ConversationBufferWindowMemory: + documentation: "https://python.langchain.com/docs/modules/memory/how_to/buffer_window" + VectorStoreRetrieverMemory: + documentation: "https://python.langchain.com/docs/modules/memory/how_to/vectorstore_retriever_memory" + prompts: - - PromptTemplate - - FewShotPromptTemplate - - ZeroShotPrompt + PromptTemplate: + documentation: "https://python.langchain.com/docs/modules/model_io/prompts/prompt_templates/" + ZeroShotPrompt: + documentation: "https://python.langchain.com/docs/modules/agents/how_to/custom_mrkl_agent" textsplitters: - - CharacterTextSplitter - - RecursiveCharacterTextSplitter - # - LatexTextSplitter - # - PythonCodeTextSplitter + CharacterTextSplitter: + documentation: "https://python.langchain.com/docs/modules/data_connection/document_transformers/text_splitters/character_text_splitter" + RecursiveCharacterTextSplitter: + documentation: "https://python.langchain.com/docs/modules/data_connection/document_transformers/text_splitters/recursive_text_splitter" toolkits: - - OpenAPIToolkit - - JsonToolkit - - VectorStoreInfo - - VectorStoreRouterToolkit - - VectorStoreToolkit + OpenAPIToolkit: + documentation: "" + JsonToolkit: + documentation: "" + VectorStoreInfo: + documentation: "" + VectorStoreRouterToolkit: + documentation: "" + VectorStoreToolkit: + documentation: "" tools: - - Search - - PAL-MATH - - Calculator - - Serper Search - - Tool - - PythonFunctionTool - - PythonFunction - - JsonSpec - - News API - - TMDB API - - Podcast API - - QuerySQLDataBaseTool - - InfoSQLDatabaseTool - - ListSQLDatabaseTool - # - QueryCheckerTool - - BingSearchRun - - GoogleSearchRun - - GoogleSearchResults - - GoogleSerperRun - - JsonListKeysTool - - JsonGetValueTool - - PythonREPLTool - - PythonAstREPLTool - - RequestsGetTool - - RequestsPostTool - - RequestsPatchTool - - RequestsPutTool - - RequestsDeleteTool - - WikipediaQueryRun - - WolframAlphaQueryRun + Search: + documentation: "" + PAL-MATH: + documentation: "" + Calculator: + documentation: "" + Serper Search: + documentation: "" + Tool: + documentation: "" + PythonFunctionTool: + documentation: "" + PythonFunction: + documentation: "" + JsonSpec: + documentation: "" + News API: + documentation: "" + TMDB API: + documentation: "" + Podcast API: + documentation: "" + QuerySQLDataBaseTool: + documentation: "" + InfoSQLDatabaseTool: + documentation: "" + ListSQLDatabaseTool: + documentation: "" + BingSearchRun: + documentation: "" + GoogleSearchRun: + documentation: "" + GoogleSearchResults: + documentation: "" + GoogleSerperRun: + documentation: "" + JsonListKeysTool: + documentation: "" + JsonGetValueTool: + documentation: "" + PythonREPLTool: + documentation: "" + PythonAstREPLTool: + documentation: "" + RequestsGetTool: + documentation: "" + RequestsPostTool: + documentation: "" + RequestsPatchTool: + documentation: "" + RequestsPutTool: + documentation: "" + RequestsDeleteTool: + documentation: "" + WikipediaQueryRun: + documentation: "" + WolframAlphaQueryRun: + documentation: "" utilities: - - BingSearchAPIWrapper - - GoogleSearchAPIWrapper - - GoogleSerperAPIWrapper - - SearxResults - - SearxSearchWrapper - - SerpAPIWrapper - - WikipediaAPIWrapper - - WolframAlphaAPIWrapper - # - ZapierNLAWrapper - - SQLDatabase + BingSearchAPIWrapper: + documentation: "" + GoogleSearchAPIWrapper: + documentation: "" + GoogleSerperAPIWrapper: + documentation: "" + SearxResults: + documentation: "" + SearxSearchWrapper: + documentation: "" + SerpAPIWrapper: + documentation: "" + WikipediaAPIWrapper: + documentation: "" + WolframAlphaAPIWrapper: + documentation: "" +retrievers: + MultiQueryRetriever: + documentation: "https://python.langchain.com/docs/modules/data_connection/retrievers/how_to/MultiQueryRetriever" + # https://github.com/supabase-community/supabase-py/issues/482 + # ZepRetriever: + # documentation: "https://python.langchain.com/docs/modules/data_connection/retrievers/integrations/zep_memorystore" vectorstores: - - Chroma - - Qdrant - - Weaviate - - FAISS - - Pinecone - - SupabaseVectorStore - - MongoDBAtlasVectorSearch + Chroma: + documentation: "https://python.langchain.com/docs/modules/data_connection/vectorstores/integrations/chroma" + Qdrant: + documentation: "https://python.langchain.com/docs/modules/data_connection/vectorstores/integrations/qdrant" + Weaviate: + documentation: "https://python.langchain.com/docs/modules/data_connection/vectorstores/integrations/weaviate" + FAISS: + documentation: "https://python.langchain.com/docs/modules/data_connection/vectorstores/integrations/faiss" + Pinecone: + documentation: "https://python.langchain.com/docs/modules/data_connection/vectorstores/integrations/pinecone" + SupabaseVectorStore: + documentation: "https://python.langchain.com/docs/modules/data_connection/vectorstores/integrations/supabase" + MongoDBAtlasVectorSearch: + documentation: "https://python.langchain.com/docs/modules/data_connection/vectorstores/integrations/mongodb_atlas_vector_search" wrappers: - - RequestsWrapper - # - ChatPromptTemplate - # - SystemMessagePromptTemplate - # - HumanMessagePromptTemplate + RequestsWrapper: + documentation: "" diff --git a/src/backend/langflow/custom/customs.py b/src/backend/langflow/custom/customs.py index fb6c1da16..0f1e44308 100644 --- a/src/backend/langflow/custom/customs.py +++ b/src/backend/langflow/custom/customs.py @@ -21,6 +21,9 @@ CUSTOM_NODES = { "utilities": { "SQLDatabase": frontend_node.agents.SQLDatabaseNode(), }, + "memories": { + "PostgresChatMessageHistory": frontend_node.memories.PostgresChatMessageHistoryFrontendNode(), + }, "chains": { "SeriesCharacterChain": frontend_node.chains.SeriesCharacterChainNode(), "TimeTravelGuideChain": frontend_node.chains.TimeTravelGuideChainNode(), diff --git a/src/backend/langflow/graph/__init__.py b/src/backend/langflow/graph/__init__.py index a68e844ee..e63b9dcc0 100644 --- a/src/backend/langflow/graph/__init__.py +++ b/src/backend/langflow/graph/__init__.py @@ -14,6 +14,7 @@ from langflow.graph.vertex.types import ( ToolkitVertex, VectorStoreVertex, WrapperVertex, + RetrieverVertex, ) __all__ = [ @@ -32,4 +33,5 @@ __all__ = [ "ToolkitVertex", "VectorStoreVertex", "WrapperVertex", + "RetrieverVertex", ] diff --git a/src/backend/langflow/graph/graph/constants.py b/src/backend/langflow/graph/graph/constants.py index 3398f253f..9474e311e 100644 --- a/src/backend/langflow/graph/graph/constants.py +++ b/src/backend/langflow/graph/graph/constants.py @@ -1,18 +1,5 @@ from langflow.graph.vertex.base import Vertex -from langflow.graph.vertex.types import ( - AgentVertex, - ChainVertex, - DocumentLoaderVertex, - EmbeddingVertex, - LLMVertex, - MemoryVertex, - PromptVertex, - TextSplitterVertex, - ToolVertex, - ToolkitVertex, - VectorStoreVertex, - WrapperVertex, -) +from langflow.graph.vertex import types from langflow.interface.agents.base import agent_creator from langflow.interface.chains.base import chain_creator from langflow.interface.document_loaders.base import documentloader_creator @@ -25,22 +12,23 @@ from langflow.interface.toolkits.base import toolkits_creator from langflow.interface.tools.base import tool_creator from langflow.interface.vector_store.base import vectorstore_creator from langflow.interface.wrappers.base import wrapper_creator - +from langflow.interface.retrievers.base import retriever_creator from typing import Dict, Type VERTEX_TYPE_MAP: Dict[str, Type[Vertex]] = { - **{t: PromptVertex for t in prompt_creator.to_list()}, - **{t: AgentVertex for t in agent_creator.to_list()}, - **{t: ChainVertex for t in chain_creator.to_list()}, - **{t: ToolVertex for t in tool_creator.to_list()}, - **{t: ToolkitVertex for t in toolkits_creator.to_list()}, - **{t: WrapperVertex for t in wrapper_creator.to_list()}, - **{t: LLMVertex for t in llm_creator.to_list()}, - **{t: MemoryVertex for t in memory_creator.to_list()}, - **{t: EmbeddingVertex for t in embedding_creator.to_list()}, - **{t: VectorStoreVertex for t in vectorstore_creator.to_list()}, - **{t: DocumentLoaderVertex for t in documentloader_creator.to_list()}, - **{t: TextSplitterVertex for t in textsplitter_creator.to_list()}, + **{t: types.PromptVertex for t in prompt_creator.to_list()}, + **{t: types.AgentVertex for t in agent_creator.to_list()}, + **{t: types.ChainVertex for t in chain_creator.to_list()}, + **{t: types.ToolVertex for t in tool_creator.to_list()}, + **{t: types.ToolkitVertex for t in toolkits_creator.to_list()}, + **{t: types.WrapperVertex for t in wrapper_creator.to_list()}, + **{t: types.LLMVertex for t in llm_creator.to_list()}, + **{t: types.MemoryVertex for t in memory_creator.to_list()}, + **{t: types.EmbeddingVertex for t in embedding_creator.to_list()}, + **{t: types.VectorStoreVertex for t in vectorstore_creator.to_list()}, + **{t: types.DocumentLoaderVertex for t in documentloader_creator.to_list()}, + **{t: types.TextSplitterVertex for t in textsplitter_creator.to_list()}, + **{t: types.RetrieverVertex for t in retriever_creator.to_list()}, } diff --git a/src/backend/langflow/graph/vertex/types.py b/src/backend/langflow/graph/vertex/types.py index b6a8f9a91..846b79bc0 100644 --- a/src/backend/langflow/graph/vertex/types.py +++ b/src/backend/langflow/graph/vertex/types.py @@ -112,6 +112,11 @@ class MemoryVertex(Vertex): super().__init__(data, base_type="memory") +class RetrieverVertex(Vertex): + def __init__(self, data: Dict): + super().__init__(data, base_type="retrievers") + + class TextSplitterVertex(Vertex): def __init__(self, data: Dict): super().__init__(data, base_type="textsplitters") diff --git a/src/backend/langflow/interface/base.py b/src/backend/langflow/interface/base.py index df0c2c50c..6e1522dd2 100644 --- a/src/backend/langflow/interface/base.py +++ b/src/backend/langflow/interface/base.py @@ -8,6 +8,7 @@ from langflow.template.field.base import TemplateField from langflow.template.frontend_node.base import FrontendNode from langflow.template.template.base import Template from langflow.utils.logger import logger +from langflow.settings import settings # Assuming necessary imports for Field, Template, and FrontendNode classes @@ -15,12 +16,29 @@ from langflow.utils.logger import logger class LangChainTypeCreator(BaseModel, ABC): type_name: str type_dict: Optional[Dict] = None + name_docs_dict: Optional[Dict[str, str]] = None @property def frontend_node_class(self) -> Type[FrontendNode]: """The class type of the FrontendNode created in frontend_node.""" return FrontendNode + @property + def docs_map(self) -> Dict[str, str]: + """A dict with the name of the component as key and the documentation link as value.""" + if self.name_docs_dict is None: + try: + type_settings = getattr(settings, self.type_name) + self.name_docs_dict = { + name: value_dict["documentation"] + for name, value_dict in type_settings.items() + } + except AttributeError as exc: + logger.error(exc) + + self.name_docs_dict = {} + return self.name_docs_dict + @property @abstractmethod def type_to_loader_dict(self) -> Dict: @@ -83,7 +101,7 @@ class LangChainTypeCreator(BaseModel, ABC): signature.add_extra_fields() signature.add_extra_base_classes() - + signature.set_documentation(self.docs_map.get(name, "")) return signature diff --git a/src/backend/langflow/interface/importing/utils.py b/src/backend/langflow/interface/importing/utils.py index f65376d48..7ef916ca9 100644 --- a/src/backend/langflow/interface/importing/utils.py +++ b/src/backend/langflow/interface/importing/utils.py @@ -44,6 +44,7 @@ def import_by_type(_type: str, name: str) -> Any: "documentloaders": import_documentloader, "textsplitters": import_textsplitter, "utilities": import_utility, + "retrievers": import_retriever, } if _type == "llms": key = "chat" if "chat" in name.lower() else "llm" @@ -59,6 +60,11 @@ def import_chat_llm(llm: str) -> BaseChatModel: return import_class(f"langchain.chat_models.{llm}") +def import_retriever(retriever: str) -> Any: + """Import retriever from retriever name""" + return import_module(f"from langchain.retrievers import {retriever}") + + def import_memory(memory: str) -> Any: """Import memory from memory name""" return import_module(f"from langchain.memory import {memory}") diff --git a/src/backend/langflow/interface/initialize/loading.py b/src/backend/langflow/interface/initialize/loading.py index 88b981f9d..08d17d9fa 100644 --- a/src/backend/langflow/interface/initialize/loading.py +++ b/src/backend/langflow/interface/initialize/loading.py @@ -1,11 +1,12 @@ import json -from typing import Any, Callable, Dict, Sequence +from typing import Any, Callable, Dict, Sequence, Type from langchain.agents import ZeroShotAgent from langchain.agents import agent as agent_module from langchain.agents.agent import AgentExecutor from langchain.agents.agent_toolkits.base import BaseToolkit from langchain.agents.tools import BaseTool + from langflow.interface.initialize.vector_store import vecstore_initializer from pydantic import ValidationError @@ -14,8 +15,13 @@ from langflow.interface.custom_lists import CUSTOM_NODES from langflow.interface.importing.utils import get_function, import_by_type from langflow.interface.toolkits.base import toolkits_creator from langflow.interface.chains.base import chain_creator +from langflow.interface.retrievers.base import retriever_creator from langflow.interface.utils import load_file_into_dict from langflow.utils import validate +from langchain.chains.base import Chain +from langchain.vectorstores.base import VectorStore +from langchain.document_loaders.base import BaseLoader +from langchain.prompts.base import BasePromptTemplate def instantiate_class(node_type: str, base_type: str, params: Dict) -> Any: @@ -43,8 +49,8 @@ def convert_params_to_sets(params): def convert_kwargs(params): # if *kwargs are passed as a string, convert to dict - # first find any key that has kwargs in it - kwargs_keys = [key for key in params.keys() if "kwargs" in key] + # first find any key that has kwargs or config in it + kwargs_keys = [key for key in params.keys() if "kwargs" in key or "config" in key] for key in kwargs_keys: if isinstance(params[key], str): params[key] = json.loads(params[key]) @@ -72,11 +78,50 @@ def instantiate_based_on_type(class_object, base_type, node_type, params): return instantiate_utility(node_type, class_object, params) elif base_type == "chains": return instantiate_chains(node_type, class_object, params) + elif base_type == "llms": + return instantiate_llm(node_type, class_object, params) + elif base_type == "retrievers": + return instantiate_retriever(node_type, class_object, params) + elif base_type == "memory": + return instantiate_memory(node_type, class_object, params) else: return class_object(**params) -def instantiate_chains(node_type, class_object, params): +def instantiate_memory(node_type, class_object, params): + try: + return class_object(**params) + # I want to catch a specific attribute error that happens + # when the object does not have a cursor attribute + except Exception as exc: + if "object has no attribute 'cursor'" in str( + exc + ) or 'object has no field "conn"' in str(exc): + raise AttributeError( + ( + "Failed to build connection to database." + f" Please check your connection string and try again. Error: {exc}" + ) + ) from exc + raise exc + + +def instantiate_retriever(node_type, class_object, params): + if "retriever" in params and hasattr(params["retriever"], "as_retriever"): + params["retriever"] = params["retriever"].as_retriever() + if node_type in retriever_creator.from_method_nodes: + method = retriever_creator.from_method_nodes[node_type] + if class_method := getattr(class_object, method, None): + return class_method(**params) + raise ValueError(f"Method {method} not found in {class_object}") + return class_object(**params) + + +def instantiate_llm(node_type, class_object, params: Dict): + return class_object(**params) + + +def instantiate_chains(node_type, class_object: Type[Chain], params: Dict): if "retriever" in params and hasattr(params["retriever"], "as_retriever"): params["retriever"] = params["retriever"].as_retriever() if node_type in chain_creator.from_method_nodes: @@ -88,11 +133,11 @@ def instantiate_chains(node_type, class_object, params): return class_object(**params) -def instantiate_agent(class_object, params): +def instantiate_agent(class_object: Type[agent_module.Agent], params: Dict): return load_agent_executor(class_object, params) -def instantiate_prompt(node_type, class_object, params): +def instantiate_prompt(node_type, class_object: Type[BasePromptTemplate], params: Dict): if node_type == "ZeroShotPrompt": if "tools" not in params: params["tools"] = [] @@ -100,7 +145,7 @@ def instantiate_prompt(node_type, class_object, params): return class_object(**params) -def instantiate_tool(node_type, class_object, params): +def instantiate_tool(node_type, class_object: Type[BaseTool], params: Dict): if node_type == "JsonSpec": params["dict_"] = load_file_into_dict(params.pop("path")) return class_object(**params) @@ -118,7 +163,7 @@ def instantiate_tool(node_type, class_object, params): return class_object(**params) -def instantiate_toolkit(node_type, class_object, params): +def instantiate_toolkit(node_type, class_object: Type[BaseToolkit], params: Dict): loaded_toolkit = class_object(**params) # Commenting this out for now to use toolkits as normal tools # if toolkits_creator.has_create_function(node_type): @@ -128,7 +173,7 @@ def instantiate_toolkit(node_type, class_object, params): return loaded_toolkit -def instantiate_embedding(class_object, params): +def instantiate_embedding(class_object, params: Dict): params.pop("model", None) params.pop("headers", None) try: @@ -142,7 +187,7 @@ def instantiate_embedding(class_object, params): return class_object(**params) -def instantiate_vectorstore(class_object, params): +def instantiate_vectorstore(class_object: Type[VectorStore], params: Dict): search_kwargs = params.pop("search_kwargs", {}) if initializer := vecstore_initializer.get(class_object.__name__): vecstore = initializer(class_object, params) @@ -158,7 +203,7 @@ def instantiate_vectorstore(class_object, params): return vecstore -def instantiate_documentloader(class_object, params): +def instantiate_documentloader(class_object: Type[BaseLoader], params: Dict): if "file_filter" in params: # file_filter will be a string but we need a function # that will be used to filter the files using file_filter @@ -171,35 +216,55 @@ def instantiate_documentloader(class_object, params): extension.strip() in x for extension in extensions ) metadata = params.pop("metadata", None) + if metadata and isinstance(metadata, str): + try: + metadata = json.loads(metadata) + except json.JSONDecodeError as exc: + raise ValueError( + "The metadata you provided is not a valid JSON string." + ) from exc docs = class_object(**params).load() + # Now if metadata is an empty dict, we will not add it to the documents if metadata: - if isinstance(metadata, str): - try: - metadata = json.loads(metadata) - except json.JSONDecodeError as exc: - raise ValueError( - "The metadata you provided is not a valid JSON string." - ) from exc - for doc in docs: - doc.metadata = metadata + # If the document already has metadata, we will not overwrite it + if not doc.metadata: + doc.metadata = metadata + else: + doc.metadata.update(metadata) return docs -def instantiate_textsplitter(class_object, params): +def instantiate_textsplitter( + class_object, + params: Dict, +): try: documents = params.pop("documents") - except KeyError as e: + except KeyError as exc: raise ValueError( "The source you provided did not load correctly or was empty." "Try changing the chunk_size of the Text Splitter." - ) from e - text_splitter = class_object(**params) + ) from exc + + if ( + "separator_type" in params and params["separator_type"] == "Text" + ) or "separator_type" not in params: + params.pop("separator_type", None) + text_splitter = class_object(**params) + else: + from langchain.text_splitter import Language + + language = params.pop("separator_type", None) + params["language"] = Language(language) + params.pop("separators", None) + + text_splitter = class_object.from_language(**params) return text_splitter.split_documents(documents) -def instantiate_utility(node_type, class_object, params): +def instantiate_utility(node_type, class_object, params: Dict): if node_type == "SQLDatabase": return class_object.from_uri(params.pop("uri")) return class_object(**params) @@ -225,6 +290,8 @@ def load_agent_executor(agent_class: type[agent_module.Agent], params, **kwargs) """Load agent executor from agent class, tools and chain""" allowed_tools: Sequence[BaseTool] = params.get("allowed_tools", []) llm_chain = params["llm_chain"] + # agent has hidden args for memory. might need to be support + # memory = params["memory"] # if allowed_tools is not a list or set, make it a list if not isinstance(allowed_tools, (list, set)) and isinstance( allowed_tools, BaseTool @@ -237,6 +304,7 @@ def load_agent_executor(agent_class: type[agent_module.Agent], params, **kwargs) return AgentExecutor.from_agent_and_tools( agent=agent, tools=allowed_tools, + # memory=memory, **kwargs, ) diff --git a/src/backend/langflow/interface/listing.py b/src/backend/langflow/interface/listing.py index 3d73105c2..1e1421d32 100644 --- a/src/backend/langflow/interface/listing.py +++ b/src/backend/langflow/interface/listing.py @@ -11,6 +11,7 @@ from langflow.interface.tools.base import tool_creator from langflow.interface.utilities.base import utility_creator from langflow.interface.vector_store.base import vectorstore_creator from langflow.interface.wrappers.base import wrapper_creator +from langflow.interface.retrievers.base import retriever_creator def get_type_dict(): @@ -28,6 +29,7 @@ def get_type_dict(): "embeddings": embedding_creator.to_list(), "textSplitters": textsplitter_creator.to_list(), "utilities": utility_creator.to_list(), + "retrievers": retriever_creator.to_list(), } diff --git a/src/backend/langflow/interface/memories/base.py b/src/backend/langflow/interface/memories/base.py index f0d8f88f5..0f97a02fe 100644 --- a/src/backend/langflow/interface/memories/base.py +++ b/src/backend/langflow/interface/memories/base.py @@ -6,12 +6,18 @@ from langflow.settings import settings from langflow.template.frontend_node.base import FrontendNode from langflow.template.frontend_node.memories import MemoryFrontendNode from langflow.utils.logger import logger -from langflow.utils.util import build_template_from_class +from langflow.utils.util import build_template_from_class, build_template_from_method +from langflow.custom.customs import get_custom_nodes class MemoryCreator(LangChainTypeCreator): type_name: str = "memories" + from_method_nodes = { + "ZepChatMessageHistory": "__init__", + "SQLiteEntityStore": "__init__", + } + @property def frontend_node_class(self) -> Type[FrontendNode]: """The class type of the FrontendNode created in frontend_node.""" @@ -26,6 +32,14 @@ class MemoryCreator(LangChainTypeCreator): def get_signature(self, name: str) -> Optional[Dict]: """Get the signature of a memory.""" try: + if name in get_custom_nodes(self.type_name).keys(): + return get_custom_nodes(self.type_name)[name] + elif name in self.from_method_nodes: + return build_template_from_method( + name, + type_to_cls_dict=memory_type_to_cls_dict, + method_name=self.from_method_nodes[name], + ) return build_template_from_class(name, memory_type_to_cls_dict) except ValueError as exc: raise ValueError("Memory not found") from exc diff --git a/src/backend/langflow/interface/retrievers/__init__.py b/src/backend/langflow/interface/retrievers/__init__.py new file mode 100644 index 000000000..e69de29bb diff --git a/src/backend/langflow/interface/retrievers/base.py b/src/backend/langflow/interface/retrievers/base.py new file mode 100644 index 000000000..dc6056656 --- /dev/null +++ b/src/backend/langflow/interface/retrievers/base.py @@ -0,0 +1,58 @@ +from typing import Any, Dict, List, Optional, Type + +from langchain import retrievers + +from langflow.interface.base import LangChainTypeCreator +from langflow.interface.importing.utils import import_class +from langflow.settings import settings +from langflow.template.frontend_node.retrievers import RetrieverFrontendNode +from langflow.utils.logger import logger +from langflow.utils.util import build_template_from_method, build_template_from_class + + +class RetrieverCreator(LangChainTypeCreator): + type_name: str = "retrievers" + + from_method_nodes = {"MultiQueryRetriever": "from_llm", "ZepRetriever": "__init__"} + + @property + def frontend_node_class(self) -> Type[RetrieverFrontendNode]: + return RetrieverFrontendNode + + @property + def type_to_loader_dict(self) -> Dict: + if self.type_dict is None: + self.type_dict: dict[str, Any] = { + retriever_name: import_class(f"langchain.retrievers.{retriever_name}") + for retriever_name in retrievers.__all__ + } + return self.type_dict + + def get_signature(self, name: str) -> Optional[Dict]: + """Get the signature of an embedding.""" + try: + if name in self.from_method_nodes: + return build_template_from_method( + name, + type_to_cls_dict=self.type_to_loader_dict, + method_name=self.from_method_nodes[name], + ) + else: + return build_template_from_class( + name, type_to_cls_dict=self.type_to_loader_dict + ) + except ValueError as exc: + raise ValueError(f"Retriever {name} not found") from exc + except AttributeError as exc: + logger.error(f"Retriever {name} not loaded: {exc}") + return None + + def to_list(self) -> List[str]: + return [ + retriever + for retriever in self.type_to_loader_dict.keys() + if retriever in settings.retrievers or settings.dev + ] + + +retriever_creator = RetrieverCreator() diff --git a/src/backend/langflow/interface/types.py b/src/backend/langflow/interface/types.py index 085537756..6b1ecb3e2 100644 --- a/src/backend/langflow/interface/types.py +++ b/src/backend/langflow/interface/types.py @@ -11,6 +11,7 @@ from langflow.interface.tools.base import tool_creator from langflow.interface.utilities.base import utility_creator from langflow.interface.vector_store.base import vectorstore_creator from langflow.interface.wrappers.base import wrapper_creator +from langflow.interface.retrievers.base import retriever_creator def get_type_list(): @@ -44,6 +45,7 @@ def build_langchain_types_dict(): # sourcery skip: dict-assign-update-to-union documentloader_creator, textsplitter_creator, utility_creator, + retriever_creator, ] all_types = {} @@ -52,3 +54,6 @@ def build_langchain_types_dict(): # sourcery skip: dict-assign-update-to-union if created_types[creator.type_name].values(): all_types.update(created_types) return all_types + + +langchain_types_dict = build_langchain_types_dict() diff --git a/src/backend/langflow/interface/utils.py b/src/backend/langflow/interface/utils.py index 8d45aa1b1..ff89e92bf 100644 --- a/src/backend/langflow/interface/utils.py +++ b/src/backend/langflow/interface/utils.py @@ -4,10 +4,12 @@ import os from io import BytesIO import re + import yaml from langchain.base_language import BaseLanguageModel from PIL.Image import Image from langflow.utils.logger import logger +from langflow.chat.config import ChatConfig def load_file_into_dict(file_path: str) -> dict: @@ -49,9 +51,9 @@ def try_setting_streaming_options(langchain_object, websocket): if isinstance(llm, BaseLanguageModel): if hasattr(llm, "streaming") and isinstance(llm.streaming, bool): - llm.streaming = True + llm.streaming = ChatConfig.streaming elif hasattr(llm, "stream") and isinstance(llm.stream, bool): - llm.stream = True + llm.stream = ChatConfig.streaming return langchain_object diff --git a/src/backend/langflow/main.py b/src/backend/langflow/main.py index 2a1293f2e..e937931d6 100644 --- a/src/backend/langflow/main.py +++ b/src/backend/langflow/main.py @@ -1,5 +1,9 @@ +from pathlib import Path +from typing import Optional from fastapi import FastAPI from fastapi.middleware.cors import CORSMiddleware +from fastapi.responses import FileResponse +from fastapi.staticfiles import StaticFiles from langflow.api import router from langflow.database.base import create_db_and_tables @@ -33,6 +37,42 @@ def create_app(): return app +def setup_static_files(app: FastAPI, static_files_dir: Path): + """ + Setup the static files directory. + Args: + app (FastAPI): FastAPI app. + path (str): Path to the static files directory. + """ + app.mount( + "/", + StaticFiles(directory=static_files_dir, html=True), + name="static", + ) + + @app.exception_handler(404) + async def custom_404_handler(request, __): + path = static_files_dir / "index.html" + + if not path.exists(): + raise RuntimeError(f"File at path {path} does not exist.") + return FileResponse(path) + + +# app = create_app() +# setup_static_files(app, static_files_dir) +def setup_app(static_files_dir: Optional[Path]) -> FastAPI: + """Setup the FastAPI app.""" + # get the directory of the current file + if not static_files_dir: + frontend_path = Path(__file__).parent + static_files_dir = frontend_path / "frontend" + + app = create_app() + setup_static_files(app, static_files_dir) + return app + + app = create_app() diff --git a/src/backend/langflow/processing/process.py b/src/backend/langflow/processing/process.py index abf7a00b8..e36cbfd8b 100644 --- a/src/backend/langflow/processing/process.py +++ b/src/backend/langflow/processing/process.py @@ -107,6 +107,10 @@ def process_graph_cached(data_graph: Dict[str, Any], inputs: Optional[dict] = No elif isinstance(langchain_object, VectorStore): class_name = langchain_object.__class__.__name__ result = {"message": f"Processed {class_name} successfully"} + else: + raise ValueError( + f"Unknown langchain_object type: {type(langchain_object).__name__}" + ) return result diff --git a/src/backend/langflow/settings.py b/src/backend/langflow/settings.py index e3644e84c..d2de4f671 100644 --- a/src/backend/langflow/settings.py +++ b/src/backend/langflow/settings.py @@ -1,24 +1,24 @@ import os -from typing import List import yaml from pydantic import BaseSettings, root_validator class Settings(BaseSettings): - chains: List[str] = [] - agents: List[str] = [] - prompts: List[str] = [] - llms: List[str] = [] - tools: List[str] = [] - memories: List[str] = [] - embeddings: List[str] = [] - vectorstores: List[str] = [] - documentloaders: List[str] = [] - wrappers: List[str] = [] - toolkits: List[str] = [] - textsplitters: List[str] = [] - utilities: List[str] = [] + chains: dict = {} + agents: dict = {} + prompts: dict = {} + llms: dict = {} + tools: dict = {} + memories: dict = {} + embeddings: dict = {} + vectorstores: dict = {} + documentloaders: dict = {} + wrappers: dict = {} + retrievers: dict = {} + toolkits: dict = {} + textsplitters: dict = {} + utilities: dict = {} dev: bool = False database_url: str = "sqlite:///./langflow.db" cache: str = "InMemoryCache" @@ -38,16 +38,21 @@ class Settings(BaseSettings): def update_from_yaml(self, file_path: str, dev: bool = False): new_settings = load_settings_from_yaml(file_path) - self.chains = new_settings.chains or [] - self.agents = new_settings.agents or [] - self.prompts = new_settings.prompts or [] - self.llms = new_settings.llms or [] - self.tools = new_settings.tools or [] - self.memories = new_settings.memories or [] - self.wrappers = new_settings.wrappers or [] - self.toolkits = new_settings.toolkits or [] - self.textsplitters = new_settings.textsplitters or [] - self.utilities = new_settings.utilities or [] + self.chains = new_settings.chains or {} + self.agents = new_settings.agents or {} + self.prompts = new_settings.prompts or {} + self.llms = new_settings.llms or {} + self.tools = new_settings.tools or {} + self.memories = new_settings.memories or {} + self.wrappers = new_settings.wrappers or {} + self.toolkits = new_settings.toolkits or {} + self.textsplitters = new_settings.textsplitters or {} + self.utilities = new_settings.utilities or {} + self.embeddings = new_settings.embeddings or {} + self.vectorstores = new_settings.vectorstores or {} + self.documentloaders = new_settings.documentloaders or {} + self.retrievers = new_settings.retrievers or {} + self.dev = dev def update_settings(self, **kwargs): diff --git a/src/backend/langflow/template/field/base.py b/src/backend/langflow/template/field/base.py index a9c18ff63..fdfdca562 100644 --- a/src/backend/langflow/template/field/base.py +++ b/src/backend/langflow/template/field/base.py @@ -21,6 +21,7 @@ class TemplateFieldCreator(BaseModel, ABC): name: str = "" display_name: Optional[str] = None advanced: bool = False + info: Optional[str] = "" def to_dict(self): result = self.dict() diff --git a/src/backend/langflow/template/frontend_node/base.py b/src/backend/langflow/template/frontend_node/base.py index 4801da086..de8c78112 100644 --- a/src/backend/langflow/template/frontend_node/base.py +++ b/src/backend/langflow/template/frontend_node/base.py @@ -1,12 +1,43 @@ import re from typing import List, Optional -from pydantic import BaseModel +from pydantic import BaseModel, Field from langflow.template.frontend_node.constants import FORCE_SHOW_FIELDS from langflow.template.field.base import TemplateField from langflow.template.template.base import Template from langflow.utils import constants +from langflow.template.frontend_node.formatter import field_formatters + +CLASSES_TO_REMOVE = ["Serializable", "BaseModel"] + + +class FieldFormatters(BaseModel): + formatters = { + "openai_api_key": field_formatters.OpenAIAPIKeyFormatter(), + } + base_formatters = { + "kwargs": field_formatters.KwargsFormatter(), + "optional": field_formatters.RemoveOptionalFormatter(), + "list": field_formatters.ListTypeFormatter(), + "dict": field_formatters.DictTypeFormatter(), + "union": field_formatters.UnionTypeFormatter(), + "multiline": field_formatters.MultilineFieldFormatter(), + "show": field_formatters.ShowFieldFormatter(), + "password": field_formatters.PasswordFieldFormatter(), + "default": field_formatters.DefaultValueFormatter(), + "headers": field_formatters.HeadersDefaultValueFormatter(), + "dict_code_file": field_formatters.DictCodeFileFormatter(), + "model_fields": field_formatters.ModelSpecificFieldFormatter(), + } + + def format(self, field: TemplateField, name: Optional[str] = None) -> None: + for key, formatter in self.base_formatters.items(): + formatter.format(field, name) + + for key, formatter in self.formatters.items(): + if key == field.name: + formatter.format(field, name) class FrontendNode(BaseModel): @@ -15,14 +46,37 @@ class FrontendNode(BaseModel): base_classes: List[str] name: str = "" display_name: str = "" + documentation: str = "" + field_formatters: FieldFormatters = Field(default_factory=FieldFormatters) + + def process_base_classes(self) -> None: + """Removes unwanted base classes from the list of base classes.""" + self.base_classes = [ + base_class + for base_class in self.base_classes + if base_class not in CLASSES_TO_REMOVE + ] + + # field formatters is an instance attribute but it is not used in the class + # so we need to create a method to get it + @staticmethod + def get_field_formatters() -> FieldFormatters: + return FieldFormatters() + + def set_documentation(self, documentation: str) -> None: + """Sets the documentation of the frontend node.""" + self.documentation = documentation def to_dict(self) -> dict: + """Returns a dict representation of the frontend node.""" + self.process_base_classes() return { self.name: { "template": self.template.to_dict(self.format_field), "description": self.description, "base_classes": self.base_classes, "display_name": self.display_name or self.name, + "documentation": self.documentation, }, } @@ -35,33 +89,8 @@ class FrontendNode(BaseModel): @staticmethod def format_field(field: TemplateField, name: Optional[str] = None) -> None: """Formats a given field based on its attributes and value.""" - SPECIAL_FIELD_HANDLERS = { - "allowed_tools": lambda field: "Tool", - "max_value_length": lambda field: "int", - } - key = field.name - value = field.to_dict() - _type = value["type"] - - _type = FrontendNode.remove_optional(_type) - _type, is_list = FrontendNode.check_for_list_type(_type) - field.is_list = is_list or field.is_list - _type = FrontendNode.replace_mapping_with_dict(_type) - _type = FrontendNode.handle_union_type(_type) - - field.field_type = FrontendNode.handle_special_field( - field, key, _type, SPECIAL_FIELD_HANDLERS - ) - field.field_type = FrontendNode.handle_dict_type(field, _type) - field.show = FrontendNode.should_show_field(key, field.required) - field.password = FrontendNode.should_be_password(key, field.show) - field.multiline = FrontendNode.should_be_multiline(key) - - FrontendNode.replace_default_value(field, value) - FrontendNode.handle_specific_field_values(field, key, name) - FrontendNode.handle_kwargs_field(field) - FrontendNode.handle_api_key_field(field, key) + FrontendNode.get_field_formatters().format(field, name) @staticmethod def remove_optional(_type: str) -> str: diff --git a/src/backend/langflow/template/frontend_node/chains.py b/src/backend/langflow/template/frontend_node/chains.py index f29aa2065..ce8c1c62c 100644 --- a/src/backend/langflow/template/frontend_node/chains.py +++ b/src/backend/langflow/template/frontend_node/chains.py @@ -49,6 +49,10 @@ class ChainFrontendNode(FrontendNode): def format_field(field: TemplateField, name: Optional[str] = None) -> None: FrontendNode.format_field(field, name) + if "name" == "RetrievalQA" and field.name == "memory": + field.show = False + field.required = False + field.advanced = False if "key" in field.name: field.password = False diff --git a/src/backend/langflow/template/frontend_node/constants.py b/src/backend/langflow/template/frontend_node/constants.py index 20b8a0c61..90cdbf280 100644 --- a/src/backend/langflow/template/frontend_node/constants.py +++ b/src/backend/langflow/template/frontend_node/constants.py @@ -32,3 +32,29 @@ You are a good listener and you can talk about anything. HUMAN_PROMPT = "{input}" QA_CHAIN_TYPES = ["stuff", "map_reduce", "map_rerank", "refine"] + +CTRANSFORMERS_DEFAULT_CONFIG = { + "top_k": 40, + "top_p": 0.95, + "temperature": 0.8, + "repetition_penalty": 1.1, + "last_n_tokens": 64, + "seed": -1, + "max_new_tokens": 256, + "stop": None, + "stream": False, + "reset": True, + "batch_size": 8, + "threads": -1, + "context_length": -1, + "gpu_layers": 0, +} + +# This variable is used to tell the user +# that it can be changed to use other APIs +# like Prem and LocalAI +OPENAI_API_BASE_INFO = """ +The base URL of the OpenAI API. Defaults to https://api.openai.com/v1. + +You can change this to use other APIs like JinaChat, LocalAI and Prem. +""" diff --git a/src/backend/langflow/template/frontend_node/formatter/__init__.py b/src/backend/langflow/template/frontend_node/formatter/__init__.py new file mode 100644 index 000000000..e69de29bb diff --git a/src/backend/langflow/template/frontend_node/formatter/base.py b/src/backend/langflow/template/frontend_node/formatter/base.py new file mode 100644 index 000000000..67e906593 --- /dev/null +++ b/src/backend/langflow/template/frontend_node/formatter/base.py @@ -0,0 +1,10 @@ +from abc import ABC, abstractmethod +from typing import Optional + +from langflow.template.field.base import TemplateField + + +class FieldFormatter(ABC): + @abstractmethod + def format(self, field: TemplateField, name: Optional[str]) -> None: + pass diff --git a/src/backend/langflow/template/frontend_node/formatter/field_formatters.py b/src/backend/langflow/template/frontend_node/formatter/field_formatters.py new file mode 100644 index 000000000..7987b134a --- /dev/null +++ b/src/backend/langflow/template/frontend_node/formatter/field_formatters.py @@ -0,0 +1,162 @@ +from typing import Optional +from langflow.template.field.base import TemplateField +from langflow.template.frontend_node.constants import FORCE_SHOW_FIELDS +from langflow.template.frontend_node.formatter.base import FieldFormatter +import re + +from langflow.utils.constants import ( + ANTHROPIC_MODELS, + CHAT_OPENAI_MODELS, + OPENAI_MODELS, +) + + +class OpenAIAPIKeyFormatter(FieldFormatter): + def format(self, field: TemplateField, name: Optional[str] = None) -> None: + if "api_key" in field.name and "OpenAI" in str(name): + field.display_name = "OpenAI API Key" + field.required = False + if field.value is None: + field.value = "" + + +class ModelSpecificFieldFormatter(FieldFormatter): + MODEL_DICT = { + "OpenAI": OPENAI_MODELS, + "ChatOpenAI": CHAT_OPENAI_MODELS, + "Anthropic": ANTHROPIC_MODELS, + "ChatAnthropic": ANTHROPIC_MODELS, + } + + def format(self, field: TemplateField, name: Optional[str] = None) -> None: + if name in self.MODEL_DICT and field.name == "model_name": + field.options = self.MODEL_DICT[name] + field.is_list = True + + +class KwargsFormatter(FieldFormatter): + def format(self, field: TemplateField, name: Optional[str] = None) -> None: + if "kwargs" in field.name.lower(): + field.advanced = True + field.required = False + field.show = False + + +class APIKeyFormatter(FieldFormatter): + def format(self, field: TemplateField, name: Optional[str] = None) -> None: + if "api" in field.name.lower() and "key" in field.name.lower(): + field.required = False + field.advanced = False + + field.display_name = field.name.replace("_", " ").title() + field.display_name = field.display_name.replace("Api", "API") + + +class RemoveOptionalFormatter(FieldFormatter): + def format(self, field: TemplateField, name: Optional[str] = None) -> None: + _type = field.field_type + field.field_type = re.sub(r"Optional\[(.*)\]", r"\1", _type) + + +class ListTypeFormatter(FieldFormatter): + def format(self, field: TemplateField, name: Optional[str] = None) -> None: + _type = field.field_type + is_list = "List" in _type or "Sequence" in _type + if is_list: + _type = re.sub(r"(List|Sequence)\[(.*)\]", r"\2", _type) + field.is_list = True + field.field_type = _type + + +class DictTypeFormatter(FieldFormatter): + def format(self, field: TemplateField, name: Optional[str] = None) -> None: + _type = field.field_type + _type = _type.replace("Mapping", "dict") + field.field_type = _type + + +class UnionTypeFormatter(FieldFormatter): + def format(self, field: TemplateField, name: Optional[str] = None) -> None: + _type = field.field_type + if "Union" in _type: + _type = _type.replace("Union[", "")[:-1] + _type = _type.split(",")[0] + _type = _type.replace("]", "").replace("[", "") + field.field_type = _type + + +class SpecialFieldFormatter(FieldFormatter): + SPECIAL_FIELD_HANDLERS = { + "allowed_tools": lambda field: "Tool", + "max_value_length": lambda field: "int", + } + + def format(self, field: TemplateField, name: Optional[str] = None) -> None: + handler = self.SPECIAL_FIELD_HANDLERS.get(field.name) + field.field_type = handler(field) if handler else field.field_type + + +class ShowFieldFormatter(FieldFormatter): + def format(self, field: TemplateField, name: Optional[str] = None) -> None: + key = field.name + required = field.required + field.show = ( + (required and key not in ["input_variables"]) + or key in FORCE_SHOW_FIELDS + or "api" in key + or ("key" in key and "input" not in key and "output" not in key) + ) + + +class PasswordFieldFormatter(FieldFormatter): + def format(self, field: TemplateField, name: Optional[str] = None) -> None: + key = field.name + show = field.show + if ( + any(text in key.lower() for text in {"password", "token", "api", "key"}) + and show + ): + field.password = True + + +class MultilineFieldFormatter(FieldFormatter): + def format(self, field: TemplateField, name: Optional[str] = None) -> None: + key = field.name + if key in { + "suffix", + "prefix", + "template", + "examples", + "code", + "headers", + "description", + }: + field.multiline = True + + +class DefaultValueFormatter(FieldFormatter): + def format(self, field: TemplateField, name: Optional[str] = None) -> None: + value = field.to_dict() + if "default" in value: + field.value = value["default"] + + +class HeadersDefaultValueFormatter(FieldFormatter): + def format(self, field: TemplateField, name: Optional[str] = None) -> None: + key = field.name + if key == "headers": + field.value = """{'Authorization': 'Bearer '}""" + + +class DictCodeFileFormatter(FieldFormatter): + def format(self, field: TemplateField, name: Optional[str] = None) -> None: + key = field.name + value = field.to_dict() + _type = value["type"] + if "dict" in _type.lower(): + if key == "dict_": + field.field_type = "file" + field.suffixes = [".json", ".yaml", ".yml"] + field.file_types = ["json", "yaml", "yml"] + else: + field.field_type = "code" diff --git a/src/backend/langflow/template/frontend_node/llms.py b/src/backend/langflow/template/frontend_node/llms.py index 272e42c7f..a2a4cb9bb 100644 --- a/src/backend/langflow/template/frontend_node/llms.py +++ b/src/backend/langflow/template/frontend_node/llms.py @@ -1,7 +1,10 @@ +import json from typing import Optional from langflow.template.field.base import TemplateField from langflow.template.frontend_node.base import FrontendNode +from langflow.template.frontend_node.constants import CTRANSFORMERS_DEFAULT_CONFIG +from langflow.template.frontend_node.constants import OPENAI_API_BASE_INFO class LLMFrontendNode(FrontendNode): @@ -15,6 +18,13 @@ class LLMFrontendNode(FrontendNode): if "key" not in field.name.lower() and "token" not in field.name.lower(): field.password = False + if field.name == "openai_api_base": + field.info = OPENAI_API_BASE_INFO + + def add_extra_base_classes(self) -> None: + if "BaseLLM" not in self.base_classes: + self.base_classes.append("BaseLLM") + @staticmethod def format_azure_field(field: TemplateField): if field.name == "model_name": @@ -31,6 +41,13 @@ class LLMFrontendNode(FrontendNode): field.show = True field.advanced = not field.required + @staticmethod + def format_ctransformers_field(field: TemplateField): + if field.name == "config": + field.show = True + field.advanced = True + field.value = json.dumps(CTRANSFORMERS_DEFAULT_CONFIG, indent=2) + @staticmethod def format_field(field: TemplateField, name: Optional[str] = None) -> None: display_names_dict = { @@ -38,6 +55,7 @@ class LLMFrontendNode(FrontendNode): } FrontendNode.format_field(field, name) LLMFrontendNode.format_openai_field(field) + LLMFrontendNode.format_ctransformers_field(field) if name and "azure" in name.lower(): LLMFrontendNode.format_azure_field(field) if name and "llama" in name.lower(): diff --git a/src/backend/langflow/template/frontend_node/memories.py b/src/backend/langflow/template/frontend_node/memories.py index 4b312c926..37177c72e 100644 --- a/src/backend/langflow/template/frontend_node/memories.py +++ b/src/backend/langflow/template/frontend_node/memories.py @@ -2,11 +2,19 @@ from typing import Optional from langflow.template.field.base import TemplateField from langflow.template.frontend_node.base import FrontendNode +from langflow.template.template.base import Template +from langchain.memory.chat_message_histories.postgres import DEFAULT_CONNECTION_STRING class MemoryFrontendNode(FrontendNode): #! Needs testing def add_extra_fields(self) -> None: + # chat history should have another way to add common field? + # prevent adding incorect field in ChatMessageHistory + base_message_classes = ["BaseEntityStore", "BaseChatMessageHistory"] + if any(base_class in self.base_classes for base_class in base_message_classes): + return + # add return_messages field self.template.add_field( TemplateField( @@ -64,3 +72,50 @@ class MemoryFrontendNode(FrontendNode): field.value = "" if field.name == "memory_key": field.value = "chat_history" + if field.name == "chat_memory": + field.show = True + field.advanced = False + field.required = False + if field.name == "url": + field.show = True + if field.name == "entity_store": + field.show = True + if name == "SQLiteEntityStore": + field.show = True + + +class PostgresChatMessageHistoryFrontendNode(MemoryFrontendNode): + name: str = "PostgresChatMessageHistory" + template: Template = Template( + type_name="PostgresChatMessageHistory", + fields=[ + TemplateField( + field_type="str", + required=True, + placeholder="", + is_list=False, + show=True, + multiline=False, + name="session_id", + ), + TemplateField( + field_type="str", + required=True, + show=True, + name="connection_string", + value=DEFAULT_CONNECTION_STRING, + ), + TemplateField( + field_type="str", + required=True, + placeholder="", + is_list=False, + show=True, + multiline=False, + value="message_store", + name="table_name", + ), + ], + ) + description: str = "Memory store with Postgres" + base_classes: list[str] = ["PostgresChatMessageHistory", "BaseChatMessageHistory"] diff --git a/src/backend/langflow/template/frontend_node/retrievers.py b/src/backend/langflow/template/frontend_node/retrievers.py new file mode 100644 index 000000000..b482c8b84 --- /dev/null +++ b/src/backend/langflow/template/frontend_node/retrievers.py @@ -0,0 +1,15 @@ +from typing import Optional + +from langflow.template.field.base import TemplateField +from langflow.template.frontend_node.base import FrontendNode + + +class RetrieverFrontendNode(FrontendNode): + @staticmethod + def format_field(field: TemplateField, name: Optional[str] = None) -> None: + FrontendNode.format_field(field, name) + # Define common field attributes + field.show = True + if field.name == "parser_key": + field.display_name = "Parser Key" + field.password = False diff --git a/src/backend/langflow/template/frontend_node/textsplitters.py b/src/backend/langflow/template/frontend_node/textsplitters.py index 03880379d..65a2be6f6 100644 --- a/src/backend/langflow/template/frontend_node/textsplitters.py +++ b/src/backend/langflow/template/frontend_node/textsplitters.py @@ -1,5 +1,6 @@ from langflow.template.field.base import TemplateField from langflow.template.frontend_node.base import FrontendNode +from langchain.text_splitter import Language class TextSplittersFrontendNode(FrontendNode): @@ -17,6 +18,24 @@ class TextSplittersFrontendNode(FrontendNode): name = "separator" elif self.template.type_name == "RecursiveCharacterTextSplitter": name = "separators" + # Add a field for type of separator + # which will have Text or any value from the + # Language enum + options = [x.value for x in Language] + ["Text"] + options.sort() + self.template.add_field( + TemplateField( + field_type="str", + required=True, + show=True, + name="separator_type", + advanced=False, + is_list=True, + options=options, + value="Text", + display_name="Separator Type", + ) + ) self.template.add_field( TemplateField( field_type="str", diff --git a/src/backend/langflow/template/frontend_node/vectorstores.py b/src/backend/langflow/template/frontend_node/vectorstores.py index 01b6bfe53..58cfcdc34 100644 --- a/src/backend/langflow/template/frontend_node/vectorstores.py +++ b/src/backend/langflow/template/frontend_node/vectorstores.py @@ -200,7 +200,7 @@ class VectorStoreFrontendNode(FrontendNode): self.template.add_field(field) def add_extra_base_classes(self) -> None: - self.base_classes.append("BaseRetriever") + self.base_classes.extend(("BaseRetriever", "VectorStoreRetriever")) @staticmethod def format_field(field: TemplateField, name: Optional[str] = None) -> None: diff --git a/src/backend/langflow/utils/util.py b/src/backend/langflow/utils/util.py index 7fcf1f4d4..4769563bd 100644 --- a/src/backend/langflow/utils/util.py +++ b/src/backend/langflow/utils/util.py @@ -165,6 +165,7 @@ def build_template_from_method( "required": param.default == param.empty, } for name, param in params.items() + if name not in ["self", "kwargs", "args"] }, } @@ -233,6 +234,9 @@ def format_dict(d, name: Optional[str] = None): _type = value["type"] + if not isinstance(_type, str): + _type = _type.__name__ + # Remove 'Optional' wrapper if "Optional" in _type: _type = _type.replace("Optional[", "")[:-1] diff --git a/src/frontend/package-lock.json b/src/frontend/package-lock.json index 673f56f10..da752486c 100644 --- a/src/frontend/package-lock.json +++ b/src/frontend/package-lock.json @@ -13,9 +13,11 @@ "@headlessui/react": "^1.7.10", "@heroicons/react": "^2.0.15", "@mui/material": "^5.11.9", + "@radix-ui/react-accordion": "^1.1.2", "@radix-ui/react-checkbox": "^1.0.4", "@radix-ui/react-dialog": "^1.0.4", "@radix-ui/react-dropdown-menu": "^2.0.5", + "@radix-ui/react-icons": "^1.3.0", "@radix-ui/react-label": "^2.0.2", "@radix-ui/react-menubar": "^1.0.3", "@radix-ui/react-progress": "^1.0.3", @@ -27,6 +29,7 @@ "@tabler/icons-react": "^2.18.0", "@tailwindcss/forms": "^0.5.3", "@tailwindcss/line-clamp": "^0.4.4", + "accordion": "^3.0.2", "ace-builds": "^1.16.0", "add": "^2.0.6", "ansi-to-html": "^0.7.2", @@ -34,6 +37,7 @@ "base64-js": "^1.5.1", "class-variance-authority": "^0.6.0", "clsx": "^1.2.1", + "dompurify": "^3.0.3", "esbuild": "^0.17.18", "lodash": "^4.17.21", "lucide-react": "^0.233.0", @@ -53,7 +57,7 @@ "rehype-mathjax": "^4.0.2", "remark-gfm": "^3.0.1", "remark-math": "^5.1.1", - "shadcn-ui": "^0.1.3", + "shadcn-ui": "^0.2.2", "short-unique-id": "^4.4.4", "switch": "^0.0.0", "table": "^6.8.1", @@ -114,6 +118,20 @@ "node": ">=6.0.0" } }, + "node_modules/@antfu/ni": { + "version": "0.21.4", + "resolved": "https://registry.npmjs.org/@antfu/ni/-/ni-0.21.4.tgz", + "integrity": "sha512-O0Uv9LbLDSoEg26fnMDdDRiPwFJnQSoD4WnrflDwKCJm8Cx/0mV4cGxwBLXan5mGIrpK4Dd7vizf4rQm0QCEAA==", + "bin": { + "na": "bin/na.mjs", + "nci": "bin/nci.mjs", + "ni": "bin/ni.mjs", + "nlx": "bin/nlx.mjs", + "nr": "bin/nr.mjs", + "nu": "bin/nu.mjs", + "nun": "bin/nun.mjs" + } + }, "node_modules/@babel/code-frame": { "version": "7.21.4", "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.21.4.tgz", @@ -1212,15 +1230,15 @@ "integrity": "sha512-I7K1Uu0MBPzaFKg4nI5Q7Vs2t+3gWWW648spaF+Rg7pI9ds18Ugn+lvg4SHczUdKlHI5LWBXyqfS8+DufyBsgQ==" }, "node_modules/@mui/system": { - "version": "5.13.5", - "resolved": "https://registry.npmjs.org/@mui/system/-/system-5.13.5.tgz", - "integrity": "sha512-n0gzUxoZ2ZHZgnExkh2Htvo9uW2oakofgPRQrDoa/GQOWyRD0NH9MDszBwOb6AAoXZb+OV5TE7I4LeZ/dzgHYA==", + "version": "5.13.6", + "resolved": "https://registry.npmjs.org/@mui/system/-/system-5.13.6.tgz", + "integrity": "sha512-G3Xr28uLqU3DyF6r2LQkHGw/ku4P0AHzlKVe7FGXOPl7X1u+hoe2xxj8Vdiq/69II/mh9OP21i38yBWgWb7WgQ==", "dependencies": { - "@babel/runtime": "^7.21.0", + "@babel/runtime": "^7.22.5", "@mui/private-theming": "^5.13.1", "@mui/styled-engine": "^5.13.2", "@mui/types": "^7.2.4", - "@mui/utils": "^5.13.1", + "@mui/utils": "^5.13.6", "clsx": "^1.2.1", "csstype": "^3.1.2", "prop-types": "^15.8.1" @@ -1280,11 +1298,11 @@ } }, "node_modules/@mui/utils": { - "version": "5.13.1", - "resolved": "https://registry.npmjs.org/@mui/utils/-/utils-5.13.1.tgz", - "integrity": "sha512-6lXdWwmlUbEU2jUI8blw38Kt+3ly7xkmV9ljzY4Q20WhsJMWiNry9CX8M+TaP/HbtuyR8XKsdMgQW7h7MM3n3A==", + "version": "5.13.6", + "resolved": "https://registry.npmjs.org/@mui/utils/-/utils-5.13.6.tgz", + "integrity": "sha512-ggNlxl5NPSbp+kNcQLmSig6WVB0Id+4gOxhx644987v4fsji+CSXc+MFYLocFB/x4oHtzCUlSzbVHlJfP/fXoQ==", "dependencies": { - "@babel/runtime": "^7.21.0", + "@babel/runtime": "^7.22.5", "@types/prop-types": "^15.7.5", "@types/react-is": "^18.2.0", "prop-types": "^15.8.1", @@ -1366,6 +1384,37 @@ "@babel/runtime": "^7.13.10" } }, + "node_modules/@radix-ui/react-accordion": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/@radix-ui/react-accordion/-/react-accordion-1.1.2.tgz", + "integrity": "sha512-fDG7jcoNKVjSK6yfmuAs0EnPDro0WMXIhMtXdTBWqEioVW206ku+4Lw07e+13lUkFkpoEQ2PdeMIAGpdqEAmDg==", + "dependencies": { + "@babel/runtime": "^7.13.10", + "@radix-ui/primitive": "1.0.1", + "@radix-ui/react-collapsible": "1.0.3", + "@radix-ui/react-collection": "1.0.3", + "@radix-ui/react-compose-refs": "1.0.1", + "@radix-ui/react-context": "1.0.1", + "@radix-ui/react-direction": "1.0.1", + "@radix-ui/react-id": "1.0.1", + "@radix-ui/react-primitive": "1.0.3", + "@radix-ui/react-use-controllable-state": "1.0.1" + }, + "peerDependencies": { + "@types/react": "*", + "@types/react-dom": "*", + "react": "^16.8 || ^17.0 || ^18.0", + "react-dom": "^16.8 || ^17.0 || ^18.0" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + }, + "@types/react-dom": { + "optional": true + } + } + }, "node_modules/@radix-ui/react-arrow": { "version": "1.0.3", "resolved": "https://registry.npmjs.org/@radix-ui/react-arrow/-/react-arrow-1.0.3.tgz", @@ -1419,6 +1468,36 @@ } } }, + "node_modules/@radix-ui/react-collapsible": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/@radix-ui/react-collapsible/-/react-collapsible-1.0.3.tgz", + "integrity": "sha512-UBmVDkmR6IvDsloHVN+3rtx4Mi5TFvylYXpluuv0f37dtaz3H99bp8No0LGXRigVpl3UAT4l9j6bIchh42S/Gg==", + "dependencies": { + "@babel/runtime": "^7.13.10", + "@radix-ui/primitive": "1.0.1", + "@radix-ui/react-compose-refs": "1.0.1", + "@radix-ui/react-context": "1.0.1", + "@radix-ui/react-id": "1.0.1", + "@radix-ui/react-presence": "1.0.1", + "@radix-ui/react-primitive": "1.0.3", + "@radix-ui/react-use-controllable-state": "1.0.1", + "@radix-ui/react-use-layout-effect": "1.0.1" + }, + "peerDependencies": { + "@types/react": "*", + "@types/react-dom": "*", + "react": "^16.8 || ^17.0 || ^18.0", + "react-dom": "^16.8 || ^17.0 || ^18.0" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + }, + "@types/react-dom": { + "optional": true + } + } + }, "node_modules/@radix-ui/react-collection": { "version": "1.0.3", "resolved": "https://registry.npmjs.org/@radix-ui/react-collection/-/react-collection-1.0.3.tgz", @@ -1630,6 +1709,14 @@ } } }, + "node_modules/@radix-ui/react-icons": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/@radix-ui/react-icons/-/react-icons-1.3.0.tgz", + "integrity": "sha512-jQxj/0LKgp+j9BiTXz3O3sgs26RNet2iLWmsPyRz2SIcR4q/4SbazXfnYwbAr+vLYKSfc7qxzyGQA1HLlYiuNw==", + "peerDependencies": { + "react": "^16.x || ^17.x || ^18.x" + } + }, "node_modules/@radix-ui/react-id": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/@radix-ui/react-id/-/react-id-1.0.1.tgz", @@ -3106,6 +3193,39 @@ "node": ">= 10" } }, + "node_modules/@ts-morph/common": { + "version": "0.19.0", + "resolved": "https://registry.npmjs.org/@ts-morph/common/-/common-0.19.0.tgz", + "integrity": "sha512-Unz/WHmd4pGax91rdIKWi51wnVUW11QttMEPpBiBgIewnc9UQIX7UDLxr5vRlqeByXCwhkF6VabSsI0raWcyAQ==", + "dependencies": { + "fast-glob": "^3.2.12", + "minimatch": "^7.4.3", + "mkdirp": "^2.1.6", + "path-browserify": "^1.0.1" + } + }, + "node_modules/@ts-morph/common/node_modules/brace-expansion": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.1.tgz", + "integrity": "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==", + "dependencies": { + "balanced-match": "^1.0.0" + } + }, + "node_modules/@ts-morph/common/node_modules/minimatch": { + "version": "7.4.6", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-7.4.6.tgz", + "integrity": "sha512-sBz8G/YjVniEz6lKPNpKxXwazJe4c19fEfV2GDMX6AjFz+MX9uDWIZW8XreVhkFW3fkIdTv/gxWr/Kks5FFAVw==", + "dependencies": { + "brace-expansion": "^2.0.1" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, "node_modules/@types/aria-query": { "version": "5.0.1", "resolved": "https://registry.npmjs.org/@types/aria-query/-/aria-query-5.0.1.tgz", @@ -3547,6 +3667,11 @@ "resolved": "https://registry.npmjs.org/abab/-/abab-2.0.6.tgz", "integrity": "sha512-j2afSsaIENvHZN2B8GOpF566vZ5WVk5opAiMTvWgaQT8DkbOqsTfvNAvHoRGU2zzP8cPoqys+xHTRDWW8L+/BA==" }, + "node_modules/accordion": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/accordion/-/accordion-3.0.2.tgz", + "integrity": "sha512-jbQfFaw+57OBwPt7qSNHuW+RA8smmRwkWRS1Ozh6K/QxUspBgBV/LpdSzlY7vee8TomS6j3D33B9rIeH1qMwsA==" + }, "node_modules/ace-builds": { "version": "1.16.0", "resolved": "https://registry.npmjs.org/ace-builds/-/ace-builds-1.16.0.tgz", @@ -3714,9 +3839,9 @@ } }, "node_modules/aria-query": { - "version": "5.2.1", - "resolved": "https://registry.npmjs.org/aria-query/-/aria-query-5.2.1.tgz", - "integrity": "sha512-7uFg4b+lETFgdaJyETnILsXgnnzVnkHcgRbwbPwevm5x/LmUlt3MjczMRe1zg824iBgXZNRPTBftNYyRSKLp2g==", + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/aria-query/-/aria-query-5.3.0.tgz", + "integrity": "sha512-b0P0sZPKtyu8HkeRAfCq0IfURZK+SuwMjY1UXGBU27wpAiTwQAIlq56IbIO+ytk/JjS1fMR14ee5WBBfKi5J6A==", "dev": true, "dependencies": { "dequal": "^2.0.3" @@ -4491,6 +4616,11 @@ "node": ">=6" } }, + "node_modules/code-block-writer": { + "version": "12.0.0", + "resolved": "https://registry.npmjs.org/code-block-writer/-/code-block-writer-12.0.0.tgz", + "integrity": "sha512-q4dMFMlXtKR3XNBHyMHt/3pwYNA69EDk00lloMOaaUMKPUXBw6lpXtbu3MMVG6/uOihGnRDOlkyqsONEUj60+w==" + }, "node_modules/color-convert": { "version": "1.9.3", "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", @@ -5009,10 +5139,15 @@ "node": ">=12" } }, + "node_modules/dompurify": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/dompurify/-/dompurify-3.0.3.tgz", + "integrity": "sha512-axQ9zieHLnAnHh0sfAamKYiqXMJAVwu+LM/alQ7WDagoWessyWvMSFyW65CqF3owufNu8HBcE4cM2Vflu7YWcQ==" + }, "node_modules/electron-to-chromium": { - "version": "1.4.438", - "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.4.438.tgz", - "integrity": "sha512-x94U0FhphEsHsOloCvlsujHCvoir0ZQ73ZAs/QN4PLx98uNvyEU79F75rq1db75Bx/atvuh7KPeuxelh+xfYJw==" + "version": "1.4.440", + "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.4.440.tgz", + "integrity": "sha512-r6dCgNpRhPwiWlxbHzZQ/d9swfPaEJGi8ekqRBwQYaR3WmA5VkqQfBWSDDjuJU1ntO+W9tHx8OHV/96Q8e0dVw==" }, "node_modules/emoji-regex": { "version": "8.0.0", @@ -6745,9 +6880,9 @@ } }, "node_modules/katex": { - "version": "0.16.7", - "resolved": "https://registry.npmjs.org/katex/-/katex-0.16.7.tgz", - "integrity": "sha512-Xk9C6oGKRwJTfqfIbtr0Kes9OSv6IFsuhFGc7tW4urlpMJtuh+7YhzU6YEG9n8gmWKcMAFzkp7nr+r69kV0zrA==", + "version": "0.16.8", + "resolved": "https://registry.npmjs.org/katex/-/katex-0.16.8.tgz", + "integrity": "sha512-ftuDnJbcbOckGY11OO+zg3OofESlbR5DRl2cmN8HeWeeFIV7wTXvAOx8kEjZjobhA+9wh2fbKeO6cdcA9Mnovg==", "funding": [ "https://opencollective.com/katex", "https://github.com/sponsors/katex" @@ -6863,9 +6998,9 @@ } }, "node_modules/log-symbols/node_modules/chalk": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-5.2.0.tgz", - "integrity": "sha512-ree3Gqw/nazQAPuJJEy+avdl7QfZMcUvmHIKgEZkGL+xOBzRvup5Hxo6LHuMceSxOabuJLJm5Yp/92R9eMmMvA==", + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-5.3.0.tgz", + "integrity": "sha512-dLitG79d+GV1Nb/VYcCDFivJeK1hiukt9QjRNVOsUtTy1rR1YJsmpGGTZ3qJos+uw7WmWF4wUwBd9jxjocFC2w==", "engines": { "node": "^12.17.0 || ^14.13 || >=16.0.0" }, @@ -7838,11 +7973,33 @@ "node": "*" } }, + "node_modules/minimist": { + "version": "1.2.8", + "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.8.tgz", + "integrity": "sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA==", + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, "node_modules/mj-context-menu": { "version": "0.6.1", "resolved": "https://registry.npmjs.org/mj-context-menu/-/mj-context-menu-0.6.1.tgz", "integrity": "sha512-7NO5s6n10TIV96d4g2uDpG7ZDpIhMh0QNfGdJw/W47JswFcosz457wqz/b5sAKvl12sxINGFCn80NZHKwxQEXA==" }, + "node_modules/mkdirp": { + "version": "2.1.6", + "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-2.1.6.tgz", + "integrity": "sha512-+hEnITedc8LAtIP9u3HJDFIdcLV2vXP33sqLLIzkv1Db1zO/1OxbvYf0Y1OC/S/Qo5dxHXepofhmxL02PsKe+A==", + "bin": { + "mkdirp": "dist/cjs/src/bin.js" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, "node_modules/mri": { "version": "1.2.0", "resolved": "https://registry.npmjs.org/mri/-/mri-1.2.0.tgz", @@ -8111,9 +8268,9 @@ } }, "node_modules/ora/node_modules/chalk": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-5.2.0.tgz", - "integrity": "sha512-ree3Gqw/nazQAPuJJEy+avdl7QfZMcUvmHIKgEZkGL+xOBzRvup5Hxo6LHuMceSxOabuJLJm5Yp/92R9eMmMvA==", + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-5.3.0.tgz", + "integrity": "sha512-dLitG79d+GV1Nb/VYcCDFivJeK1hiukt9QjRNVOsUtTy1rR1YJsmpGGTZ3qJos+uw7WmWF4wUwBd9jxjocFC2w==", "engines": { "node": "^12.17.0 || ^14.13 || >=16.0.0" }, @@ -8210,6 +8367,11 @@ "resolved": "https://registry.npmjs.org/parse5/-/parse5-6.0.1.tgz", "integrity": "sha512-Ofn/CTFzRGTTxwpNEs9PP93gXShHcTq255nzRYSKe8AkVpZY7e1fpmTfOyoIvjP5HG7Z2ZM7VS9PPhQGW2pOpw==" }, + "node_modules/path-browserify": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/path-browserify/-/path-browserify-1.0.1.tgz", + "integrity": "sha512-b7uo2UCUOYZcnF/3ID0lulOJi/bafxa1xPe7ZPsammBSpjSWQkjNxlt635YGS2MiR9GjvuXCtz2emr3jbsz98g==" + }, "node_modules/path-is-absolute": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", @@ -9286,23 +9448,40 @@ } }, "node_modules/shadcn-ui": { - "version": "0.1.3", - "resolved": "https://registry.npmjs.org/shadcn-ui/-/shadcn-ui-0.1.3.tgz", - "integrity": "sha512-f6Wa4ZIxsigfOonC3yyJkPb2JXJnuGFyUn1fJJrDUHvIJOydUukcdQsZg7Lp6F6llkmfRjra1dZOo0KpSfdjuQ==", + "version": "0.2.2", + "resolved": "https://registry.npmjs.org/shadcn-ui/-/shadcn-ui-0.2.2.tgz", + "integrity": "sha512-T76EeZymSB45Yz63gkYOv9P0Ke+UA9IZenysx+975nyNzXxU7HRBgfwuHiMcrcubtOLrzRVedTLX3lcOMqDeRQ==", "dependencies": { + "@antfu/ni": "^0.21.4", "chalk": "5.2.0", "commander": "^10.0.0", + "cosmiconfig": "^8.1.3", + "diff": "^5.1.0", "execa": "^7.0.0", "fs-extra": "^11.1.0", + "https-proxy-agent": "^6.2.0", "node-fetch": "^3.3.0", "ora": "^6.1.2", "prompts": "^2.4.2", + "ts-morph": "^18.0.0", + "tsconfig-paths": "^4.2.0", "zod": "^3.20.2" }, "bin": { "shadcn-ui": "dist/index.js" } }, + "node_modules/shadcn-ui/node_modules/agent-base": { + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-7.1.0.tgz", + "integrity": "sha512-o/zjMZRhJxny7OyEF+Op8X+efiELC7k7yOjMzgfzVqOzXqkBkWI79YoTdOtsuWd5BWhAGAuOY/Xa6xpiaWXiNg==", + "dependencies": { + "debug": "^4.3.4" + }, + "engines": { + "node": ">= 14" + } + }, "node_modules/shadcn-ui/node_modules/chalk": { "version": "5.2.0", "resolved": "https://registry.npmjs.org/chalk/-/chalk-5.2.0.tgz", @@ -9322,6 +9501,35 @@ "node": ">=14" } }, + "node_modules/shadcn-ui/node_modules/cosmiconfig": { + "version": "8.2.0", + "resolved": "https://registry.npmjs.org/cosmiconfig/-/cosmiconfig-8.2.0.tgz", + "integrity": "sha512-3rTMnFJA1tCOPwRxtgF4wd7Ab2qvDbL8jX+3smjIbS4HlZBagTlpERbdN7iAbWlrfxE3M8c27kTwTawQ7st+OQ==", + "dependencies": { + "import-fresh": "^3.2.1", + "js-yaml": "^4.1.0", + "parse-json": "^5.0.0", + "path-type": "^4.0.0" + }, + "engines": { + "node": ">=14" + }, + "funding": { + "url": "https://github.com/sponsors/d-fischer" + } + }, + "node_modules/shadcn-ui/node_modules/https-proxy-agent": { + "version": "6.2.1", + "resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-6.2.1.tgz", + "integrity": "sha512-ONsE3+yfZF2caH5+bJlcddtWqNI3Gvs5A38+ngvljxaBiRXRswym2c7yf8UAeFpRFKjFNHIFEHqR/OLAWJzyiA==", + "dependencies": { + "agent-base": "^7.0.2", + "debug": "4" + }, + "engines": { + "node": ">= 14" + } + }, "node_modules/shebang-command": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz", @@ -9575,6 +9783,14 @@ "url": "https://github.com/chalk/ansi-regex?sponsor=1" } }, + "node_modules/strip-bom": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-3.0.0.tgz", + "integrity": "sha512-vavAMRXOgBVNF6nyEEmL3DBK19iRpDcoIwW+swQ+CbGiu7lju6t+JklA1MHweoWtadgt4ISVUsXLyDq34ddcwA==", + "engines": { + "node": ">=4" + } + }, "node_modules/strip-eof": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/strip-eof/-/strip-eof-1.0.0.tgz", @@ -9950,6 +10166,28 @@ "resolved": "https://registry.npmjs.org/ts-interface-checker/-/ts-interface-checker-0.1.13.tgz", "integrity": "sha512-Y/arvbn+rrz3JCKl9C4kVNfTfSm2/mEp5FSz5EsZSANGPSlQrpRI5M4PKF+mJnE52jOO90PnPSc3Ur3bTQw0gA==" }, + "node_modules/ts-morph": { + "version": "18.0.0", + "resolved": "https://registry.npmjs.org/ts-morph/-/ts-morph-18.0.0.tgz", + "integrity": "sha512-Kg5u0mk19PIIe4islUI/HWRvm9bC1lHejK4S0oh1zaZ77TMZAEmQC0sHQYiu2RgCQFZKXz1fMVi/7nOOeirznA==", + "dependencies": { + "@ts-morph/common": "~0.19.0", + "code-block-writer": "^12.0.0" + } + }, + "node_modules/tsconfig-paths": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/tsconfig-paths/-/tsconfig-paths-4.2.0.tgz", + "integrity": "sha512-NoZ4roiN7LnbKn9QqE1amc9DJfzvZXxF4xDavcOWt1BPkdx+m+0gJuPM+S0vCe7zTJMYUP0R8pO2XMr+Y8oLIg==", + "dependencies": { + "json5": "^2.2.2", + "minimist": "^1.2.6", + "strip-bom": "^3.0.0" + }, + "engines": { + "node": ">=6" + } + }, "node_modules/tslib": { "version": "2.5.3", "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.5.3.tgz", diff --git a/src/frontend/package.json b/src/frontend/package.json index 95e826736..1b6808c00 100644 --- a/src/frontend/package.json +++ b/src/frontend/package.json @@ -8,9 +8,11 @@ "@headlessui/react": "^1.7.10", "@heroicons/react": "^2.0.15", "@mui/material": "^5.11.9", + "@radix-ui/react-accordion": "^1.1.2", "@radix-ui/react-checkbox": "^1.0.4", "@radix-ui/react-dialog": "^1.0.4", "@radix-ui/react-dropdown-menu": "^2.0.5", + "@radix-ui/react-icons": "^1.3.0", "@radix-ui/react-label": "^2.0.2", "@radix-ui/react-menubar": "^1.0.3", "@radix-ui/react-progress": "^1.0.3", @@ -22,6 +24,7 @@ "@tabler/icons-react": "^2.18.0", "@tailwindcss/forms": "^0.5.3", "@tailwindcss/line-clamp": "^0.4.4", + "accordion": "^3.0.2", "ace-builds": "^1.16.0", "add": "^2.0.6", "ansi-to-html": "^0.7.2", @@ -29,6 +32,7 @@ "base64-js": "^1.5.1", "class-variance-authority": "^0.6.0", "clsx": "^1.2.1", + "dompurify": "^3.0.3", "esbuild": "^0.17.18", "lodash": "^4.17.21", "lucide-react": "^0.233.0", @@ -48,7 +52,7 @@ "rehype-mathjax": "^4.0.2", "remark-gfm": "^3.0.1", "remark-math": "^5.1.1", - "shadcn-ui": "^0.1.3", + "shadcn-ui": "^0.2.2", "short-unique-id": "^4.4.4", "switch": "^0.0.0", "table": "^6.8.1", diff --git a/src/frontend/src/CustomNodes/GenericNode/components/parameterComponent/index.tsx b/src/frontend/src/CustomNodes/GenericNode/components/parameterComponent/index.tsx index 7e5b8e315..f002492a6 100644 --- a/src/frontend/src/CustomNodes/GenericNode/components/parameterComponent/index.tsx +++ b/src/frontend/src/CustomNodes/GenericNode/components/parameterComponent/index.tsx @@ -25,6 +25,7 @@ import { nodeColors } from "../../../../utils"; import ShadTooltip from "../../../../components/ShadTooltipComponent"; import { PopUpContext } from "../../../../contexts/popUpContext"; import ToggleShadComponent from "../../../../components/toggleShadComponent"; +import { Info } from "lucide-react"; export default function ParameterComponent({ left, @@ -36,9 +37,11 @@ export default function ParameterComponent({ type, name = "", required = false, + info = "", }: ParameterComponentType) { const ref = useRef(null); const refHtml = useRef(null); + const infoHtml = useRef(null); const updateNodeInternals = useUpdateNodeInternals(); const [position, setPosition] = useState(0); const { closePopUp } = useContext(PopUpContext); @@ -79,6 +82,18 @@ export default function ParameterComponent({ }); }; + useEffect(() => { + infoHtml.current = ( +
+ {info.split("\n").map((line, i) => ( +

+ {line} +

+ ))} +
+ ); + }, [info]); + useEffect(() => { const groupedObj = groupByFamily(myData, tooltipTitle); @@ -126,9 +141,22 @@ export default function ParameterComponent({ className="w-full flex flex-wrap justify-between items-center bg-muted mt-1 px-5 py-2" > <> -
+
{title} {required ? " *" : ""} +
+ {info !== "" && ( + + + + )} +
{left && (type === "str" || @@ -144,7 +172,6 @@ export default function ParameterComponent({ delayDuration={0} content={refHtml.current} side={left ? "left" : "right"} - open={refHtml?.current?.length > 0} > { // if (reactFlowInstance) { @@ -215,6 +205,7 @@ export default function GenericNode({ ? toTitleCase(data.node.template[t].name) : toTitleCase(t) } + info={data.node.template[t].info} name={t} tooltipTitle={data.node.template[t].type} required={data.node.template[t].required} diff --git a/src/frontend/src/components/AccordionComponent/index.tsx b/src/frontend/src/components/AccordionComponent/index.tsx new file mode 100644 index 000000000..f03a2ad5f --- /dev/null +++ b/src/frontend/src/components/AccordionComponent/index.tsx @@ -0,0 +1,56 @@ +import { ReactElement, useContext, useEffect, useRef, useState } from "react"; +import { + AccordionComponentType, + ProgressBarType, +} from "../../types/components"; +import { Progress } from "../../components/ui/progress"; +import { setInterval } from "timers/promises"; +import { + Accordion, + AccordionContent, + AccordionItem, + AccordionTrigger, +} from "../../components/ui/accordion"; + +export default function AccordionComponent({ + trigger, + children, + open = [], +}: AccordionComponentType) { + const [value, setValue] = useState( + open.length == 0 ? "" : getOpenAccordion() + ); + + function getOpenAccordion() { + let value = ""; + open.forEach((el) => { + if (el == trigger) { + value = trigger; + } + }); + + return value; + } + + function handleClick() { + value == "" ? setValue(trigger) : setValue(""); + } + + return ( + <> + + + { + handleClick(); + }} + className="ml-3" + > + {trigger} + + {children} + + + + ); +} diff --git a/src/frontend/src/components/ShadTooltipComponent/index.tsx b/src/frontend/src/components/ShadTooltipComponent/index.tsx index 44ffac075..aa31b534b 100644 --- a/src/frontend/src/components/ShadTooltipComponent/index.tsx +++ b/src/frontend/src/components/ShadTooltipComponent/index.tsx @@ -1,3 +1,4 @@ +import { ShadTooltipProps } from "../../types/components"; import { Tooltip, TooltipContent, @@ -5,18 +6,19 @@ import { TooltipTrigger, } from "../ui/tooltip"; -const ShadTooltip = (props) => { +const ShadTooltip = ({ + delayDuration = 500, + side, + content, + children, +}: ShadTooltipProps) => { return ( - - {props.children} + + {children} - - {props.content} + + {content} diff --git a/src/frontend/src/components/chatComponent/chatMessage/index.tsx b/src/frontend/src/components/chatComponent/chatMessage/index.tsx index 68b04d4e8..51840cf0c 100644 --- a/src/frontend/src/components/chatComponent/chatMessage/index.tsx +++ b/src/frontend/src/components/chatComponent/chatMessage/index.tsx @@ -2,9 +2,9 @@ import { useState } from "react"; import { ChatMessageType } from "../../../types/chat"; import { nodeColors } from "../../../utils"; import Convert from "ansi-to-html"; -const convert = new Convert({ newline: true }); import { MessageCircle } from "lucide-react"; - +import DOMPurify from "dompurify"; +const convert = new Convert({ newline: true }); export default function ChatMessage({ chat }: { chat: ChatMessageType }) { const [hidden, setHidden] = useState(true); return ( @@ -23,13 +23,14 @@ export default function ChatMessage({ chat }: { chat: ChatMessageType }) {
)} + {chat.thought && chat.thought !== "" && !hidden && (
setHidden((prev) => !prev)} style={{ backgroundColor: nodeColors["thought"] }} - className=" text-start inline-block w-full pb-3 pt-3 px-5 cursor-pointer" + className="text-start inline-block w-full pb-3 pt-3 px-5 cursor-pointer" dangerouslySetInnerHTML={{ - __html: convert.toHtml(chat.thought), + __html: DOMPurify.sanitize(convert.toHtml(chat.thought)), }} >
)} diff --git a/src/frontend/src/components/codeAreaComponent/index.tsx b/src/frontend/src/components/codeAreaComponent/index.tsx index 1c998a20d..615fbd90d 100644 --- a/src/frontend/src/components/codeAreaComponent/index.tsx +++ b/src/frontend/src/components/codeAreaComponent/index.tsx @@ -12,7 +12,9 @@ export default function CodeAreaComponent({ disabled, editNode = false, }: TextAreaComponentType) { - const [myValue, setMyValue] = useState(value); + const [myValue, setMyValue] = useState( + typeof value == "string" ? value : JSON.stringify(value) + ); const { openPopUp } = useContext(PopUpContext); useEffect(() => { if (disabled) { @@ -22,7 +24,7 @@ export default function CodeAreaComponent({ }, [disabled, onChange]); useEffect(() => { - setMyValue(value); + setMyValue(typeof value == "string" ? value : JSON.stringify(value)); }, [value]); return ( diff --git a/src/frontend/src/components/dropdownComponent/index.tsx b/src/frontend/src/components/dropdownComponent/index.tsx index 1539d6a02..047e69b32 100644 --- a/src/frontend/src/components/dropdownComponent/index.tsx +++ b/src/frontend/src/components/dropdownComponent/index.tsx @@ -1,9 +1,11 @@ import { Listbox, Transition } from "@headlessui/react"; -import { Fragment, useEffect, useState } from "react"; +import { Fragment, useContext, useEffect, useState } from "react"; import { DropDownComponentType } from "../../types/components"; import { classNames } from "../../utils"; import { INPUT_STYLE } from "../../constants"; import { ChevronsUpDown, Check } from "lucide-react"; +import { PopUpContext } from "../../contexts/popUpContext"; +import { TabsContext } from "../../contexts/tabsContext"; export default function Dropdown({ value, @@ -11,13 +13,17 @@ export default function Dropdown({ onSelect, editNode = false, numberOfOptions = 0, + apiModal = false, }: DropDownComponentType) { + const { closePopUp } = useContext(PopUpContext); + let [internalValue, setInternalValue] = useState( value === "" || !value ? "Choose an option" : value ); + useEffect(() => { setInternalValue(value === "" || !value ? "Choose an option" : value); - }, [value]); + }, [closePopUp]); return ( <> @@ -63,11 +69,12 @@ export default function Dropdown({ leaveTo="opacity-0" > {options.map((option, id) => ( { setMyValue(value); - }, [value]); + }, [closePopUp]); return (
-
+
- + - + - + - {nodeLength > 0 && ( - - - - )} + } + }} + > + + + - {/* - + + + {/* + + From 1689eb0be4daa49c8adbe79323d5f8cb60252616 Mon Sep 17 00:00:00 2001 From: Gabriel Luiz Freitas Almeida Date: Fri, 30 Jun 2023 15:40:36 -0300 Subject: [PATCH 132/169] =?UTF-8?q?=F0=9F=94=A7=20fix(llm.py):=20ignore=20?= =?UTF-8?q?type=20error=20for=20service=5Faccount=20import=20=F0=9F=94=A7?= =?UTF-8?q?=20fix(loading.py):=20remove=20empty=20lines=20The=20type=20err?= =?UTF-8?q?or=20for=20the=20service=5Faccount=20import=20in=20llm.py=20is?= =?UTF-8?q?=20ignored=20to=20prevent=20a=20linting=20error.=20In=20loading?= =?UTF-8?q?.py,=20empty=20lines=20were=20removed=20for=20code=20cleanlines?= =?UTF-8?q?s.?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/backend/langflow/interface/initialize/llm.py | 2 +- src/backend/langflow/interface/initialize/loading.py | 4 +--- 2 files changed, 2 insertions(+), 4 deletions(-) diff --git a/src/backend/langflow/interface/initialize/llm.py b/src/backend/langflow/interface/initialize/llm.py index 2b9fa3b2e..eaed04b77 100644 --- a/src/backend/langflow/interface/initialize/llm.py +++ b/src/backend/langflow/interface/initialize/llm.py @@ -1,6 +1,6 @@ def initialize_vertexai(class_object, params): if credentials_path := params.get("credentials"): - from google.oauth2 import service_account + from google.oauth2 import service_account # type: ignore credentials_object = service_account.Credentials.from_service_account_file( filename=credentials_path diff --git a/src/backend/langflow/interface/initialize/loading.py b/src/backend/langflow/interface/initialize/loading.py index b5a901068..a48ae28ec 100644 --- a/src/backend/langflow/interface/initialize/loading.py +++ b/src/backend/langflow/interface/initialize/loading.py @@ -96,6 +96,7 @@ def instantiate_llm(node_type, class_object, params: Dict): if node_type == "VertexAI": return initialize_vertexai(class_object=class_object, params=params) + def instantiate_memory(node_type, class_object, params): try: return class_object(**params) @@ -125,9 +126,6 @@ def instantiate_retriever(node_type, class_object, params): return class_object(**params) - - - def instantiate_chains(node_type, class_object: Type[Chain], params: Dict): if "retriever" in params and hasattr(params["retriever"], "as_retriever"): params["retriever"] = params["retriever"].as_retriever() From 66b4bce52585fffad3e7ee7d17051c48fc9bb97e Mon Sep 17 00:00:00 2001 From: anovazzi1 Date: Fri, 30 Jun 2023 16:21:40 -0300 Subject: [PATCH 133/169] fix(App.tsx): prevent duplicate alerts from being added to the alertsList fix(alertContext.tsx): set the error, notice, and success data states before opening the respective alerts feat(chatModal/index.tsx): add error handling for websocket connection and check backend health before reconnecting --- src/frontend/src/App.tsx | 11 +++++++++- src/frontend/src/contexts/alertContext.tsx | 13 ++++++------ src/frontend/src/modals/chatModal/index.tsx | 23 +++++++++++---------- 3 files changed, 28 insertions(+), 19 deletions(-) diff --git a/src/frontend/src/App.tsx b/src/frontend/src/App.tsx index 259c40fad..3ef728925 100644 --- a/src/frontend/src/App.tsx +++ b/src/frontend/src/App.tsx @@ -51,6 +51,9 @@ export default function App() { useEffect(() => { // If there is an error alert open with data, add it to the alertsList if (errorOpen && errorData) { + if(alertsList.length > 0 && JSON.stringify(alertsList[alertsList.length - 1].data)===JSON.stringify(errorData)){ + return; + } setErrorOpen(false); setAlertsList((old) => { let newAlertsList = [ @@ -62,6 +65,9 @@ export default function App() { } // If there is a notice alert open with data, add it to the alertsList else if (noticeOpen && noticeData) { + if(alertsList.length > 0 && JSON.stringify(alertsList[alertsList.length - 1].data)===JSON.stringify(noticeData)){ + return; + } setNoticeOpen(false); setAlertsList((old) => { let newAlertsList = [ @@ -73,6 +79,9 @@ export default function App() { } // If there is a success alert open with data, add it to the alertsList else if (successOpen && successData) { + if(alertsList.length > 0 && JSON.stringify(alertsList[alertsList.length - 1].data)===JSON.stringify(successData)){ + return; + } setSuccessOpen(false); setAlertsList((old) => { let newAlertsList = [ @@ -152,4 +161,4 @@ export default function App() {
); -} +} \ No newline at end of file diff --git a/src/frontend/src/contexts/alertContext.tsx b/src/frontend/src/contexts/alertContext.tsx index ed31c03a9..62ae2e396 100644 --- a/src/frontend/src/contexts/alertContext.tsx +++ b/src/frontend/src/contexts/alertContext.tsx @@ -78,9 +78,9 @@ export function AlertProvider({ children }: { children: ReactNode }) { * @param newState An object containing the new error data, including title and optional list of error messages */ function setErrorData(newState: { title: string; list?: Array }) { - setErrorDataState(newState); - setErrorOpen(true); if (newState.title && newState.title !== "") { + setErrorDataState(newState); + setErrorOpen(true); setNotificationCenter(true); pushNotificationList({ type: "error", @@ -95,9 +95,9 @@ export function AlertProvider({ children }: { children: ReactNode }) { * @param newState An object containing the title of the notice and optionally a link. */ function setNoticeData(newState: { title: string; link?: string }) { - setNoticeDataState(newState); - setNoticeOpen(true); if (newState.title && newState.title !== "") { + setNoticeDataState(newState); + setNoticeOpen(true); // Add new notice to notification center setNotificationCenter(true); pushNotificationList({ @@ -113,11 +113,10 @@ export function AlertProvider({ children }: { children: ReactNode }) { * @param newState - A state object with a "title" property to set in the success data state. */ function setSuccessData(newState: { title: string }) { - setSuccessDataState(newState); // update the success data state with the provided new state - setSuccessOpen(true); // open the success alert - // If the new state has a "title" property, add a new success notification to the list if (newState.title && newState.title !== "") { + setSuccessDataState(newState); // update the success data state with the provided new state + setSuccessOpen(true); // open the success alert setNotificationCenter(true); // show the notification center pushNotificationList({ // add the new notification to the list diff --git a/src/frontend/src/modals/chatModal/index.tsx b/src/frontend/src/modals/chatModal/index.tsx index 6b1744857..c39ea0294 100644 --- a/src/frontend/src/modals/chatModal/index.tsx +++ b/src/frontend/src/modals/chatModal/index.tsx @@ -11,6 +11,7 @@ import { ChatMessageType } from "../../types/chat"; import ChatInput from "./chatInput"; import _ from "lodash"; +import { getHealth } from "../../controllers/API"; export default function ChatModal({ flow, @@ -204,25 +205,25 @@ export default function ChatModal({ handleOnClose(event); }; newWs.onerror = (ev) => { - console.log(ev, "error"); - if (flow.id === "") { - connectWS(); - } else { + getHealth().then((res) => { + if (res.status === 200) { + connectWS(); + } + }).catch((err) => { setErrorData({ - title: "There was an error on web connection, please: ", + // message when the backend failed + title: "The backend is not responding. Please try again later.", + // possible solution list list: [ - "Refresh the page", - "Use a new flow tab", - "Check if the backend is up", + "Check your internet connection.", + "Check if the backend is running." ], }); - } + }) }; ws.current = newWs; } catch (error) { - if (flow.id === "") { connectWS(); - } console.log(error); } } From d46aeb2efa03418c62e826da4ead6a01ffcde4ea Mon Sep 17 00:00:00 2001 From: anovazzi1 Date: Fri, 30 Jun 2023 16:27:45 -0300 Subject: [PATCH 134/169] fix(chat.py): accept websocket connection before closing it with an error code and reason --- src/backend/langflow/api/v1/chat.py | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/backend/langflow/api/v1/chat.py b/src/backend/langflow/api/v1/chat.py index 25be65dbb..500e1d0bc 100644 --- a/src/backend/langflow/api/v1/chat.py +++ b/src/backend/langflow/api/v1/chat.py @@ -19,8 +19,9 @@ async def chat(client_id: str, websocket: WebSocket): if client_id in chat_manager.in_memory_cache: await chat_manager.handle_websocket(client_id, websocket) else: + await websocket.accept() message = "Please, build the flow before sending messages" - await websocket.close(code=status.WS_1008_POLICY_VIOLATION, reason=message) + await websocket.close(code=status.WS_1011_INTERNAL_ERROR, reason=message) except WebSocketException as exc: logger.error(exc) await websocket.close(code=status.WS_1011_INTERNAL_ERROR, reason=str(exc)) From 55b17543aecd403ea2765181eb6164c9c0736e45 Mon Sep 17 00:00:00 2001 From: Gabriel Luiz Freitas Almeida Date: Fri, 30 Jun 2023 16:40:58 -0300 Subject: [PATCH 135/169] =?UTF-8?q?=E2=9C=A8=20feat(icons):=20add=20Vertex?= =?UTF-8?q?AIIcon=20component=20and=20update=20nodeIconsLucide=20to=20incl?= =?UTF-8?q?ude=20VertexAI=20and=20ChatVertexAI=20icons=20The=20VertexAIIco?= =?UTF-8?q?n=20component=20is=20added=20to=20the=20icons=20directory,=20al?= =?UTF-8?q?lowing=20the=20usage=20of=20the=20Vertex=20AI=20icon=20in=20the?= =?UTF-8?q?=20application.=20The=20nodeIconsLucide=20object=20in=20the=20u?= =?UTF-8?q?tils.ts=20file=20is=20updated=20to=20include=20the=20VertexAI?= =?UTF-8?q?=20and=20ChatVertexAI=20icons,=20enabling=20their=20usage=20in?= =?UTF-8?q?=20the=20application.=20This=20addition=20enhances=20the=20visu?= =?UTF-8?q?al=20representation=20of=20the=20application=20by=20providing?= =?UTF-8?q?=20new=20icons=20related=20to=20Vertex=20AI=20functionality.?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/frontend/src/icons/VertexAI/index.tsx | 9 +++++++++ src/frontend/src/icons/VertexAI/vertex_ai.svg | 1 + src/frontend/src/utils.ts | 7 +++++++ 3 files changed, 17 insertions(+) create mode 100644 src/frontend/src/icons/VertexAI/index.tsx create mode 100644 src/frontend/src/icons/VertexAI/vertex_ai.svg diff --git a/src/frontend/src/icons/VertexAI/index.tsx b/src/frontend/src/icons/VertexAI/index.tsx new file mode 100644 index 000000000..a5115da7e --- /dev/null +++ b/src/frontend/src/icons/VertexAI/index.tsx @@ -0,0 +1,9 @@ +import React, { forwardRef } from "react"; +import { ReactComponent as VertexAISVG } from "./vertex_ai.svg"; + +export const VertexAIIcon = forwardRef< + SVGSVGElement, + React.PropsWithChildren<{}> +>((props, ref) => { + return ; +}); diff --git a/src/frontend/src/icons/VertexAI/vertex_ai.svg b/src/frontend/src/icons/VertexAI/vertex_ai.svg new file mode 100644 index 000000000..9da1d8d8b --- /dev/null +++ b/src/frontend/src/icons/VertexAI/vertex_ai.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/frontend/src/utils.ts b/src/frontend/src/utils.ts index b50cad2bd..ff1d93d93 100644 --- a/src/frontend/src/utils.ts +++ b/src/frontend/src/utils.ts @@ -47,6 +47,7 @@ import { } from "lucide-react"; import { SupabaseIcon } from "./icons/supabase"; import { MongoDBIcon } from "./icons/MongoDB"; +import { VertexAIIcon } from "./icons/VertexAI"; export function classNames(...classes: Array) { return classes.filter(Boolean).join(" "); @@ -241,6 +242,12 @@ export const nodeIconsLucide: { SupabaseVectorStore: SupabaseIcon as React.ForwardRefExoticComponent< ComponentType> >, + VertexAI: VertexAIIcon as React.ForwardRefExoticComponent< + ComponentType> + >, + ChatVertexAI: VertexAIIcon as React.ForwardRefExoticComponent< + ComponentType> + >, agents: Rocket as React.ForwardRefExoticComponent< ComponentType> >, From e9b44ac781a54a8cb9fc34f35cc6bf40009117f3 Mon Sep 17 00:00:00 2001 From: anovazzi1 Date: Fri, 30 Jun 2023 16:42:33 -0300 Subject: [PATCH 136/169] fix(chat.py): add comment explaining the behavior of accepting and immediately closing the connection if the flow is not built yet --- src/backend/langflow/api/v1/chat.py | 2 ++ 1 file changed, 2 insertions(+) diff --git a/src/backend/langflow/api/v1/chat.py b/src/backend/langflow/api/v1/chat.py index 500e1d0bc..bf1b52058 100644 --- a/src/backend/langflow/api/v1/chat.py +++ b/src/backend/langflow/api/v1/chat.py @@ -19,6 +19,8 @@ async def chat(client_id: str, websocket: WebSocket): if client_id in chat_manager.in_memory_cache: await chat_manager.handle_websocket(client_id, websocket) else: + # We accept the connection but close it immediately + # if the flow is not built yet await websocket.accept() message = "Please, build the flow before sending messages" await websocket.close(code=status.WS_1011_INTERNAL_ERROR, reason=message) From 8f66ea7088094d18531c680b26f410dece227c5e Mon Sep 17 00:00:00 2001 From: Gabriel Luiz Freitas Almeida Date: Fri, 30 Jun 2023 16:47:59 -0300 Subject: [PATCH 137/169] =?UTF-8?q?=F0=9F=90=9B=20fix(loading.py):=20add?= =?UTF-8?q?=20missing=20return=20statement=20to=20instantiate=5Fllm=20func?= =?UTF-8?q?tion=20The=20missing=20return=20statement=20caused=20the=20func?= =?UTF-8?q?tion=20to=20not=20return=20any=20value=20when=20the=20node=5Fty?= =?UTF-8?q?pe=20is=20not=20"VertexAI".=20Adding=20the=20return=20statement?= =?UTF-8?q?=20ensures=20that=20the=20function=20returns=20the=20instantiat?= =?UTF-8?q?ed=20class=20object=20with=20the=20provided=20parameters=20in?= =?UTF-8?q?=20all=20cases.?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/backend/langflow/interface/initialize/loading.py | 1 + 1 file changed, 1 insertion(+) diff --git a/src/backend/langflow/interface/initialize/loading.py b/src/backend/langflow/interface/initialize/loading.py index a48ae28ec..f214ab74b 100644 --- a/src/backend/langflow/interface/initialize/loading.py +++ b/src/backend/langflow/interface/initialize/loading.py @@ -95,6 +95,7 @@ def instantiate_llm(node_type, class_object, params: Dict): # False if condition is True if node_type == "VertexAI": return initialize_vertexai(class_object=class_object, params=params) + return class_object(**params) def instantiate_memory(node_type, class_object, params): From 7e2e9809f25bee4c5383cd5b50254315d54ab478 Mon Sep 17 00:00:00 2001 From: Gabriel Luiz Freitas Almeida Date: Fri, 30 Jun 2023 17:05:02 -0300 Subject: [PATCH 138/169] =?UTF-8?q?=F0=9F=94=96=20chore(pyproject.toml):?= =?UTF-8?q?=20update=20package=20version=20to=200.2.8=20The=20package=20ve?= =?UTF-8?q?rsion=20has=20been=20updated=20from=200.2.7=20to=200.2.8.=20Thi?= =?UTF-8?q?s=20change=20is=20made=20to=20reflect=20the=20latest=20changes?= =?UTF-8?q?=20and=20improvements=20in=20the=20package.?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- pyproject.toml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pyproject.toml b/pyproject.toml index a65b33a7c..81212f002 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -1,6 +1,6 @@ [tool.poetry] name = "langflow" -version = "0.2.7" +version = "0.2.8" description = "A Python package with a built-in web application" authors = ["Logspace "] maintainers = [ From 8088565768f70f9e9e13cf89b275f6c353b901b4 Mon Sep 17 00:00:00 2001 From: Gabriel Luiz Freitas Almeida Date: Fri, 30 Jun 2023 17:05:51 -0300 Subject: [PATCH 139/169] =?UTF-8?q?=F0=9F=94=A5=20refactor(test=5Fchains?= =?UTF-8?q?=5Ftemplate.py):=20remove=20unused=20import=20of=20Serializable?= =?UTF-8?q?=20The=20import=20of=20the=20Serializable=20class=20is=20no=20l?= =?UTF-8?q?onger=20needed=20in=20the=20test=5Fchains=5Ftemplate.py=20file,?= =?UTF-8?q?=20so=20it=20has=20been=20removed=20to=20improve=20code=20clean?= =?UTF-8?q?liness=20and=20remove=20unnecessary=20dependencies.?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- tests/test_chains_template.py | 4 ---- 1 file changed, 4 deletions(-) diff --git a/tests/test_chains_template.py b/tests/test_chains_template.py index 63e236018..1c28f6536 100644 --- a/tests/test_chains_template.py +++ b/tests/test_chains_template.py @@ -23,7 +23,6 @@ def test_conversation_chain(client: TestClient): "ConversationChain", "LLMChain", "Chain", - "Serializable", "function", } @@ -108,7 +107,6 @@ def test_llm_chain(client: TestClient): # Test the base classes, template, memory, verbose, llm, input_key, output_key, and _type objects assert set(chain["base_classes"]) == { - "Serializable", "function", "LLMChain", "Chain", @@ -176,7 +174,6 @@ def test_llm_checker_chain(client: TestClient): # Test the base classes, template, memory, verbose, llm, input_key, output_key, and _type objects assert set(chain["base_classes"]) == { - "Serializable", "function", "LLMCheckerChain", "Chain", @@ -211,7 +208,6 @@ def test_llm_math_chain(client: TestClient): # Test the base classes, template, memory, verbose, llm, input_key, output_key, and _type objects assert set(chain["base_classes"]) == { "function", - "Serializable", "LLMMathChain", "Chain", } From c544591f33b0ed6cf64ad23154f7c72edf56065d Mon Sep 17 00:00:00 2001 From: anovazzi1 Date: Fri, 30 Jun 2023 17:12:39 -0300 Subject: [PATCH 140/169] fix(GenericNode/index.tsx): fix CSS class name for validation status to use "bg-status-green" instead of "bg-status-red" to reflect correct status color --- src/frontend/src/CustomNodes/GenericNode/index.tsx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/frontend/src/CustomNodes/GenericNode/index.tsx b/src/frontend/src/CustomNodes/GenericNode/index.tsx index 2f019e481..d8676b86c 100644 --- a/src/frontend/src/CustomNodes/GenericNode/index.tsx +++ b/src/frontend/src/CustomNodes/GenericNode/index.tsx @@ -134,7 +134,7 @@ export default function GenericNode({
-
+
{notificationList.length !== 0 ? ( notificationList.map((alertItem, index) => ( )) ) : ( -
+
No new notifications
)} diff --git a/src/frontend/src/alerts/error/index.tsx b/src/frontend/src/alerts/error/index.tsx index 872fa69bd..31980dc6b 100644 --- a/src/frontend/src/alerts/error/index.tsx +++ b/src/frontend/src/alerts/error/index.tsx @@ -39,7 +39,7 @@ export default function ErrorAlert({ removeAlert(id); }, 500); }} - className="rounded-md w-96 mt-6 shadow-xl bg-error-background p-4 cursor-pointer" + className="mt-6 w-96 cursor-pointer rounded-md bg-error-background p-4 shadow-xl" >
diff --git a/src/frontend/src/alerts/notice/index.tsx b/src/frontend/src/alerts/notice/index.tsx index 4d0747919..9af51a531 100644 --- a/src/frontend/src/alerts/notice/index.tsx +++ b/src/frontend/src/alerts/notice/index.tsx @@ -36,7 +36,7 @@ export default function NoticeAlert({ setShow(false); removeAlert(id); }} - className="rounded-md w-96 mt-6 shadow-xl bg-info-background p-4" + className="mt-6 w-96 rounded-md bg-info-background p-4 shadow-xl" >
@@ -44,7 +44,7 @@ export default function NoticeAlert({

{title}

-

+

{link !== "" ? (

diff --git a/src/frontend/src/components/CrashErrorComponent/index.tsx b/src/frontend/src/components/CrashErrorComponent/index.tsx index 8bd32af92..fd7d22c36 100644 --- a/src/frontend/src/components/CrashErrorComponent/index.tsx +++ b/src/frontend/src/components/CrashErrorComponent/index.tsx @@ -1,11 +1,11 @@ export default function CrashErrorComponent({ error, resetErrorBoundary }) { return ( -
-
-

+
+
+

Oops! An unknown error has occurred.

-

+

Please click the 'Reset Application' button to restore the application's state. If the error persists, please create an issue on our GitHub page. We apologize for any inconvenience this may have @@ -14,7 +14,7 @@ export default function CrashErrorComponent({ error, resetErrorBoundary }) {

@@ -22,7 +22,7 @@ export default function CrashErrorComponent({ error, resetErrorBoundary }) { href="https://github.com/logspace-ai/langflow/issues/new" target="_blank" rel="noopener noreferrer" - className="bg-status-red hover:bg-error-foreground text-background font-bold py-2 px-4 rounded" + className="rounded bg-status-red px-4 py-2 font-bold text-background hover:bg-error-foreground" > Create Issue diff --git a/src/frontend/src/components/EditFlowSettingsComponent/index.tsx b/src/frontend/src/components/EditFlowSettingsComponent/index.tsx index 7aa225056..7ce5f4f26 100644 --- a/src/frontend/src/components/EditFlowSettingsComponent/index.tsx +++ b/src/frontend/src/components/EditFlowSettingsComponent/index.tsx @@ -47,7 +47,7 @@ export const EditFlowSettings: React.FC = ({
Name{" "} {isMaxLength && ( - + Character limit reached )} @@ -71,7 +71,7 @@ export const EditFlowSettings: React.FC = ({ onChange={handleDescriptionChange} value={description ?? ""} placeholder="Flow description" - className="max-h-[100px] mt-2 font-normal" + className="mt-2 max-h-[100px] font-normal" rows={3} /> diff --git a/src/frontend/src/components/ExtraSidebarComponent/index.tsx b/src/frontend/src/components/ExtraSidebarComponent/index.tsx index 913b6b8eb..6bc95cde7 100644 --- a/src/frontend/src/components/ExtraSidebarComponent/index.tsx +++ b/src/frontend/src/components/ExtraSidebarComponent/index.tsx @@ -18,10 +18,10 @@ export default function ExtraSidebar() {