diff --git a/.github/workflows/pre-release.yml b/.github/workflows/pre-release.yml index 58bdd219e..0c0001a08 100644 --- a/.github/workflows/pre-release.yml +++ b/.github/workflows/pre-release.yml @@ -11,7 +11,7 @@ on: workflow_dispatch: env: - POETRY_VERSION: "1.5.1" + POETRY_VERSION: "1.8.2" jobs: if_release: @@ -20,7 +20,7 @@ jobs: steps: - uses: actions/checkout@v4 - name: Install poetry - run: pipx install poetry==$POETRY_VERSION + run: pipx install poetry==$POETRY_VERSION && poetry self add poetry-monorepo-dependency-plugin - name: Set up Python 3.10 uses: actions/setup-python@v5 with: diff --git a/.github/workflows/release.yml b/.github/workflows/release.yml index 21d8d27eb..b373b859b 100644 --- a/.github/workflows/release.yml +++ b/.github/workflows/release.yml @@ -10,7 +10,7 @@ on: - "pyproject.toml" env: - POETRY_VERSION: "1.5.1" + POETRY_VERSION: "1.8.2" jobs: if_release: @@ -19,7 +19,7 @@ jobs: steps: - uses: actions/checkout@v4 - name: Install poetry - run: pipx install poetry==$POETRY_VERSION + run: pipx install poetry==$POETRY_VERSION && poetry self add poetry-monorepo-dependency-plugin - name: Set up Python 3.10 uses: actions/setup-python@v5 with: diff --git a/Makefile b/Makefile index 4de68111b..3bc82805d 100644 --- a/Makefile +++ b/Makefile @@ -2,6 +2,10 @@ all: help +setup_poetry: + pipx install poetry + poetry self add poetry-monorepo-dependency-plugin + init: @echo 'Installing backend dependencies' make install_backend @@ -28,7 +32,7 @@ format: lint: make install_backend - poetry run mypy src/backend/langflow + poetry run mypy src/backend poetry run ruff . --fix install_frontend: @@ -69,6 +73,7 @@ frontendc: install_backend: poetry install --extras deploy + poetry run pip install -e src/backend/base/. backend: make install_backend @@ -82,24 +87,35 @@ else endif build_and_run: - echo 'Removing dist folder' + @echo 'Removing dist folder' rm -rf dist - make build && poetry run pip install dist/*.tar.gz && poetry run langflow run + rm -rf src/backend/base/dist + make build + poetry run pip install dist/*.tar.gz && pip install src/backend/base/dist/*.tar.gz + poetry run langflow run build_and_install: - echo 'Removing dist folder' + @echo 'Removing dist folder' rm -rf dist - make build && poetry run pip install dist/*.tar.gz + rm -rf src/backend/base/dist + make build && poetry run pip install dist/*.tar.gz && pip install src/backend/base/dist/*.tar.gz build_frontend: cd src/frontend && CI='' npm run build - cp -r src/frontend/build src/backend/langflow/frontend + cp -r src/frontend/build src/backend/base/langflow/frontend build: + make build_langflow_base + make build_langflow + +build_langflow: + poetry build-rewrite-path-deps --version-pinning-strategy=semver + +build_langflow_base: make install_frontend make build_frontend - poetry build --format sdist - rm -rf src/backend/langflow/frontend + cd src/backend/base && poetry build-rewrite-path-deps --version-pinning-strategy=semver + rm -rf src/backend/base/langflow/frontend dev: make install_frontend @@ -111,10 +127,18 @@ else docker compose $(if $(debug),-f docker-compose.debug.yml) up endif -publish: - make build +publish_base: + make build_langflow_base + cd src/backend/base && poetry publish + +publish_langflow: + make build_langflow poetry publish +publish: + make publish_base + make publish_langflow + help: @echo '----' @echo 'format - run code formatters' diff --git a/docs/docs/examples/flow-runner.mdx b/docs/docs/examples/flow-runner.mdx index e20dc39f7..641d814e5 100644 --- a/docs/docs/examples/flow-runner.mdx +++ b/docs/docs/examples/flow-runner.mdx @@ -35,7 +35,7 @@ We will cover how to: Example Code ```python -from langflow import CustomComponent +from langflow.custom import CustomComponent from langchain.schema import Document class FlowRunner(CustomComponent): @@ -75,7 +75,7 @@ class FlowRunner(CustomComponent): ```python -from langflow import CustomComponent +from langflow.custom import CustomComponent class MyComponent(CustomComponent): @@ -95,7 +95,7 @@ The typical structure of a Custom Component is composed of _`display_name`_ and --- ```python -from langflow import CustomComponent +from langflow.custom import CustomComponent # focus @@ -118,7 +118,7 @@ Let's start by defining our component's _`display_name`_ and _`description`_. --- ```python -from langflow import CustomComponent +from langflow.custom import CustomComponent # focus from langchain.schema import Document @@ -140,7 +140,7 @@ Second, we will import _`Document`_ from the [_langchain.schema_](https://docs.l --- ```python -from langflow import CustomComponent +from langflow.custom import CustomComponent # focus from langchain.schema import Document @@ -167,7 +167,7 @@ Now, let's add the [parameters](focus://11[20:55]) and the [return type](focus:/ --- ```python focus=13:14 -from langflow import CustomComponent +from langflow.custom import CustomComponent from langchain.schema import Document @@ -189,7 +189,7 @@ We can now start writing the _`build`_ method. Let's list available flows in "My --- ```python focus=15:18 -from langflow import CustomComponent +from langflow.custom import CustomComponent from langchain.schema import Document @@ -222,7 +222,7 @@ And retrieve a flow that matches the selected name (we'll make a dropdown input --- ```python -from langflow import CustomComponent +from langflow.custom import CustomComponent from langchain.schema import Document @@ -250,7 +250,7 @@ You can load this flow using _`get_flow`_ and set a _`tweaks`_ dictionary to cus --- ```python -from langflow import CustomComponent +from langflow.custom import CustomComponent from langchain.schema import Document @@ -287,7 +287,7 @@ The content of a document can be extracted using the _`page_content`_ attribute, --- ```python focus=9:16 -from langflow import CustomComponent +from langflow.custom import CustomComponent from langchain.schema import Document @@ -365,4 +365,6 @@ Done! This is what our script and custom component looks like: }} /> - +import ZoomableImage from "/src/theme/ZoomableImage.js"; +import Admonition from "@theme/Admonition"; + diff --git a/docs/docs/guidelines/custom-component.mdx b/docs/docs/guidelines/custom-component.mdx index 99106d400..65e505d2e 100644 --- a/docs/docs/guidelines/custom-component.mdx +++ b/docs/docs/guidelines/custom-component.mdx @@ -30,7 +30,7 @@ Here is an example: ```python -from langflow import CustomComponent +from langflow.custom import CustomComponent from langchain.schema import Document class DocumentProcessor(CustomComponent): @@ -92,7 +92,7 @@ The Python script for every Custom Component should follow a set of rules. Let's The script must contain a **single class** that inherits from _`CustomComponent`_. ```python -from langflow import CustomComponent +from langflow.custom import CustomComponent from langchain.schema import Document class MyComponent(CustomComponent): @@ -113,7 +113,7 @@ class MyComponent(CustomComponent): This class requires a _`build`_ method used to run the component and define its fields. ```python -from langflow import CustomComponent +from langflow.custom import CustomComponent from langchain.schema import Document class MyComponent(CustomComponent): @@ -134,7 +134,7 @@ class MyComponent(CustomComponent): The [Return Type Annotation](https://docs.python.org/3/library/typing.html) of the _`build`_ method defines the component type (e.g., Chain, BaseLLM, or basic Python types). Check out all supported types in the [component reference](../components/custom). ```python -from langflow import CustomComponent +from langflow.custom import CustomComponent from langchain.schema import Document class MyComponent(CustomComponent): @@ -153,7 +153,7 @@ class MyComponent(CustomComponent): --- ```python -from langflow import CustomComponent +from langflow.custom import CustomComponent from langchain.schema import Document class MyComponent(CustomComponent): @@ -179,7 +179,7 @@ Check out the [component reference](../components/custom) for more details on th --- ```python -from langflow import CustomComponent +from langflow.custom import CustomComponent from langchain.schema import Document class MyComponent(CustomComponent): @@ -204,7 +204,7 @@ Let's create a custom component that processes a document (_`langchain.schema.Do To start, let's choose a name for our component by adding a _`display_name`_ attribute. This name will appear on the canvas. The name of the class is not relevant, but let's call it _`DocumentProcessor`_. ```python -from langflow import CustomComponent +from langflow.custom import CustomComponent from langchain.schema import Document # focus @@ -227,7 +227,7 @@ class DocumentProcessor(CustomComponent): We can also write a description for it using a _`description`_ attribute. ```python -from langflow import CustomComponent +from langflow.custom import CustomComponent from langchain.schema import Document class DocumentProcessor(CustomComponent): @@ -244,7 +244,7 @@ class DocumentProcessor(CustomComponent): --- ```python -from langflow import CustomComponent +from langflow.custom import CustomComponent from langchain.schema import Document class DocumentProcessor(CustomComponent): @@ -287,7 +287,7 @@ The _`build_config`_ method is here defined to customize the component fields. - _`display_name`_ is the name of the field to be displayed. ```python -from langflow import CustomComponent +from langflow.custom import CustomComponent from langchain.schema import Document class DocumentProcessor(CustomComponent): @@ -406,4 +406,6 @@ Langflow will attempt to load all of the components found in the specified direc Once your custom components have been loaded successfully, they will appear in Langflow's sidebar. From there, you can add them to your Langflow canvas for use. However, please note that components with errors will not be available for addition to the canvas. Always ensure your code is error-free before attempting to load components. -Remember, creating custom components allows you to extend the functionality of Langflow to better suit your unique needs. Happy coding! +Remember, creating custom components allows you to extend the functionality of Langflow to better suit your unique needs. Happy coding!import ZoomableImage from "/src/theme/ZoomableImage.js"; +import Admonition from "@theme/Admonition"; + diff --git a/docs/docs/guidelines/features.mdx b/docs/docs/guidelines/features.mdx index 19837430d..04feba779 100644 --- a/docs/docs/guidelines/features.mdx +++ b/docs/docs/guidelines/features.mdx @@ -49,7 +49,7 @@ The Code button shows snippets to use your flow as a Python object or an API. Through the Langflow package, you can load a flow from a JSON file and use it as a LangChain object. ```py -from langflow import load_flow_from_json +from langflow.load import load_flow_from_json flow = load_flow_from_json("path/to/flow.json") # Now you can use it like any chain @@ -66,4 +66,9 @@ The example below shows a Python script making a POST request to a local API end style={{ marginBottom: "20px", display: "flex", justifyContent: "center" }} > - +import ThemedImage from "@theme/ThemedImage"; +import useBaseUrl from "@docusaurus/useBaseUrl"; +import ZoomableImage from "/src/theme/ZoomableImage.js"; +import ReactPlayer from "react-player"; +import Admonition from "@theme/Admonition"; + diff --git a/docs/static/json_files/SearchApi_Tool.json b/docs/static/json_files/SearchApi_Tool.json index 304f191f1..8179d7c07 100644 --- a/docs/static/json_files/SearchApi_Tool.json +++ b/docs/static/json_files/SearchApi_Tool.json @@ -1 +1,1747 @@ -{"id":"7fc56f82-3493-4742-9c85-82b144127aff","data":{"nodes":[{"id":"ChatOpenAI-4Mfuz","type":"genericNode","position":{"x":-2243.8068684913856,"y":-2026.350019258601},"data":{"type":"ChatOpenAI","node":{"template":{"callbacks":{"type":"langchain_core.callbacks.base.BaseCallbackHandler","required":false,"placeholder":"","list":true,"show":false,"multiline":false,"fileTypes":[],"password":false,"name":"callbacks","advanced":false,"dynamic":false,"info":""},"async_client":{"type":"Any","required":false,"placeholder":"","list":false,"show":false,"multiline":false,"fileTypes":[],"password":false,"name":"async_client","advanced":false,"dynamic":false,"info":""},"cache":{"type":"bool","required":false,"placeholder":"","list":false,"show":false,"multiline":false,"fileTypes":[],"password":false,"name":"cache","advanced":false,"dynamic":false,"info":""},"client":{"type":"Any","required":false,"placeholder":"","list":false,"show":false,"multiline":false,"fileTypes":[],"password":false,"name":"client","advanced":false,"dynamic":false,"info":""},"default_headers":{"type":"dict","required":false,"placeholder":"","list":false,"show":false,"multiline":false,"fileTypes":[],"password":false,"name":"default_headers","advanced":false,"dynamic":false,"info":""},"default_query":{"type":"dict","required":false,"placeholder":"","list":false,"show":false,"multiline":false,"fileTypes":[],"password":false,"name":"default_query","advanced":false,"dynamic":false,"info":""},"http_client":{"type":"Any","required":false,"placeholder":"","list":false,"show":false,"multiline":false,"fileTypes":[],"password":false,"name":"http_client","advanced":false,"dynamic":false,"info":""},"max_retries":{"type":"int","required":false,"placeholder":"","list":false,"show":false,"multiline":false,"value":2,"fileTypes":[],"password":false,"name":"max_retries","advanced":false,"dynamic":false,"info":""},"max_tokens":{"type":"int","required":false,"placeholder":"","list":false,"show":true,"multiline":false,"fileTypes":[],"password":true,"name":"max_tokens","advanced":false,"dynamic":false,"info":"","value":""},"metadata":{"type":"dict","required":false,"placeholder":"","list":false,"show":false,"multiline":false,"fileTypes":[],"password":false,"name":"metadata","advanced":false,"dynamic":false,"info":""},"model_kwargs":{"type":"dict","required":false,"placeholder":"","list":false,"show":true,"multiline":false,"fileTypes":[],"password":false,"name":"model_kwargs","advanced":true,"dynamic":false,"info":""},"model_name":{"type":"str","required":false,"placeholder":"","list":true,"show":true,"multiline":false,"value":"gpt-3.5-turbo-16k","fileTypes":[],"password":false,"options":["gpt-4-1106-preview","gpt-4-vision-preview","gpt-4","gpt-4-32k","gpt-3.5-turbo","gpt-3.5-turbo-16k"],"name":"model_name","advanced":false,"dynamic":false,"info":""},"n":{"type":"int","required":false,"placeholder":"","list":false,"show":false,"multiline":false,"value":1,"fileTypes":[],"password":false,"name":"n","advanced":false,"dynamic":false,"info":""},"name":{"type":"str","required":false,"placeholder":"","list":false,"show":false,"multiline":false,"fileTypes":[],"password":false,"name":"name","advanced":false,"dynamic":false,"info":""},"openai_api_base":{"type":"str","required":false,"placeholder":"","list":false,"show":true,"multiline":false,"fileTypes":[],"password":false,"name":"openai_api_base","display_name":"OpenAI API Base","advanced":false,"dynamic":false,"info":"\nThe base URL of the OpenAI API. Defaults to https://api.openai.com/v1.\n\nYou can change this to use other APIs like JinaChat, LocalAI and Prem.\n"},"openai_api_key":{"type":"str","required":false,"placeholder":"","list":false,"show":true,"multiline":false,"value":"","fileTypes":[],"password":true,"name":"openai_api_key","display_name":"OpenAI API Key","advanced":false,"dynamic":false,"info":""},"openai_organization":{"type":"str","required":false,"placeholder":"","list":false,"show":false,"multiline":false,"fileTypes":[],"password":false,"name":"openai_organization","display_name":"OpenAI Organization","advanced":false,"dynamic":false,"info":""},"openai_proxy":{"type":"str","required":false,"placeholder":"","list":false,"show":false,"multiline":false,"fileTypes":[],"password":false,"name":"openai_proxy","display_name":"OpenAI Proxy","advanced":false,"dynamic":false,"info":""},"request_timeout":{"type":"float","required":false,"placeholder":"","list":false,"show":false,"multiline":false,"fileTypes":[],"password":false,"name":"request_timeout","advanced":false,"dynamic":false,"info":"","rangeSpec":{"min":-1,"max":1,"step":0.1}},"streaming":{"type":"bool","required":false,"placeholder":"","list":false,"show":false,"multiline":false,"value":false,"fileTypes":[],"password":false,"name":"streaming","advanced":false,"dynamic":false,"info":""},"tags":{"type":"str","required":false,"placeholder":"","list":true,"show":false,"multiline":false,"fileTypes":[],"password":false,"name":"tags","advanced":false,"dynamic":false,"info":""},"temperature":{"type":"float","required":false,"placeholder":"","list":false,"show":true,"multiline":false,"value":"0.5","fileTypes":[],"password":false,"name":"temperature","advanced":false,"dynamic":false,"info":"","rangeSpec":{"min":-1,"max":1,"step":0.1}},"tiktoken_model_name":{"type":"str","required":false,"placeholder":"","list":false,"show":false,"multiline":false,"fileTypes":[],"password":false,"name":"tiktoken_model_name","advanced":false,"dynamic":false,"info":""},"verbose":{"type":"bool","required":false,"placeholder":"","list":false,"show":false,"multiline":false,"value":false,"fileTypes":[],"password":false,"name":"verbose","advanced":false,"dynamic":false,"info":""},"_type":"ChatOpenAI"},"description":"[*Deprecated*] `OpenAI` Chat large language models API.","base_classes":["BaseLanguageModel","BaseChatModel","ChatOpenAI","BaseLLM"],"display_name":"ChatOpenAI","documentation":"https://python.langchain.com/docs/modules/model_io/models/chat/integrations/openai","custom_fields":{},"output_types":[],"field_formatters":{},"beta":false},"id":"ChatOpenAI-4Mfuz"},"selected":false,"width":384,"height":649,"positionAbsolute":{"x":-2243.8068684913856,"y":-2026.350019258601},"dragging":false},{"id":"CharacterTextSplitter-WVMFU","type":"genericNode","position":{"x":-2661.4749778477553,"y":-1608.9437055023366},"data":{"type":"CharacterTextSplitter","node":{"template":{"documents":{"type":"Document","required":true,"placeholder":"","list":true,"show":true,"multiline":false,"value":"","fileTypes":[],"file_path":"","password":false,"name":"documents","advanced":false,"dynamic":false,"info":""},"chunk_overlap":{"type":"int","required":true,"placeholder":"","list":false,"show":true,"multiline":false,"value":200,"fileTypes":[],"file_path":"","password":false,"name":"chunk_overlap","display_name":"Chunk Overlap","advanced":false,"dynamic":false,"info":""},"chunk_size":{"type":"int","required":true,"placeholder":"","list":false,"show":true,"multiline":false,"value":"2000","fileTypes":[],"file_path":"","password":false,"name":"chunk_size","display_name":"Chunk Size","advanced":false,"dynamic":false,"info":""},"separator":{"type":"str","required":true,"placeholder":"","list":false,"show":true,"multiline":false,"value":"\"","fileTypes":[],"file_path":"","password":false,"name":"separator","display_name":"Separator","advanced":false,"dynamic":false,"info":""},"_type":"CharacterTextSplitter"},"description":"Splitting text that looks at characters.","base_classes":["Document"],"display_name":"CharacterTextSplitter","documentation":"https://python.langchain.com/docs/modules/data_connection/document_transformers/text_splitters/character_text_splitter","custom_fields":{},"output_types":["Document"],"field_formatters":{},"beta":false},"id":"CharacterTextSplitter-WVMFU"},"selected":false,"width":384,"height":501,"positionAbsolute":{"x":-2661.4749778477553,"y":-1608.9437055023366},"dragging":false},{"id":"Chroma-OtYDg","type":"genericNode","position":{"x":-2194.2051907050227,"y":-1370.1637632208287},"data":{"type":"Chroma","node":{"template":{"documents":{"type":"Document","required":false,"placeholder":"","list":true,"show":true,"multiline":false,"fileTypes":[],"file_path":"","password":false,"name":"documents","display_name":"Documents","advanced":false,"dynamic":false,"info":""},"embedding":{"type":"Embeddings","required":true,"placeholder":"","list":false,"show":true,"multiline":false,"fileTypes":[],"file_path":"","password":false,"name":"embedding","display_name":"Embedding","advanced":false,"dynamic":false,"info":""},"chroma_server_cors_allow_origins":{"type":"str","required":false,"placeholder":"","list":false,"show":true,"multiline":false,"fileTypes":[],"file_path":"","password":false,"name":"chroma_server_cors_allow_origins","display_name":"Server CORS Allow Origins","advanced":true,"dynamic":false,"info":""},"chroma_server_grpc_port":{"type":"int","required":false,"placeholder":"","list":false,"show":true,"multiline":false,"fileTypes":[],"file_path":"","password":false,"name":"chroma_server_grpc_port","display_name":"Server gRPC Port","advanced":true,"dynamic":false,"info":""},"chroma_server_host":{"type":"str","required":false,"placeholder":"","list":false,"show":true,"multiline":false,"fileTypes":[],"file_path":"","password":false,"name":"chroma_server_host","display_name":"Server Host","advanced":true,"dynamic":false,"info":""},"chroma_server_port":{"type":"int","required":false,"placeholder":"","list":false,"show":true,"multiline":false,"fileTypes":[],"file_path":"","password":false,"name":"chroma_server_port","display_name":"Server Port","advanced":true,"dynamic":false,"info":""},"chroma_server_ssl_enabled":{"type":"bool","required":true,"placeholder":"","list":false,"show":true,"multiline":false,"value":false,"fileTypes":[],"file_path":"","password":false,"name":"chroma_server_ssl_enabled","display_name":"Server SSL Enabled","advanced":true,"dynamic":false,"info":""},"code":{"type":"code","required":true,"placeholder":"","list":false,"show":true,"multiline":true,"value":"from typing import List, Optional, Union\n\nimport chromadb # type: ignore\nfrom langchain.embeddings.base import Embeddings\nfrom langchain.schema import BaseRetriever, Document\nfrom langchain.vectorstores import Chroma\nfrom langchain.vectorstores.base import VectorStore\n\nfrom langflow import CustomComponent\n\n\nclass ChromaComponent(CustomComponent):\n \"\"\"\n A custom component for implementing a Vector Store using Chroma.\n \"\"\"\n\n display_name: str = \"Chroma\"\n description: str = \"Implementation of Vector Store using Chroma\"\n documentation = \"https://python.langchain.com/docs/integrations/vectorstores/chroma\"\n beta: bool = True\n\n def build_config(self):\n \"\"\"\n Builds the configuration for the component.\n\n Returns:\n - dict: A dictionary containing the configuration options for the component.\n \"\"\"\n return {\n \"collection_name\": {\"display_name\": \"Collection Name\", \"value\": \"langflow\"},\n \"persist\": {\"display_name\": \"Persist\"},\n \"persist_directory\": {\"display_name\": \"Persist Directory\"},\n \"code\": {\"show\": False, \"display_name\": \"Code\"},\n \"documents\": {\"display_name\": \"Documents\", \"is_list\": True},\n \"embedding\": {\"display_name\": \"Embedding\"},\n \"chroma_server_cors_allow_origins\": {\n \"display_name\": \"Server CORS Allow Origins\",\n \"advanced\": True,\n },\n \"chroma_server_host\": {\"display_name\": \"Server Host\", \"advanced\": True},\n \"chroma_server_port\": {\"display_name\": \"Server Port\", \"advanced\": True},\n \"chroma_server_grpc_port\": {\n \"display_name\": \"Server gRPC Port\",\n \"advanced\": True,\n },\n \"chroma_server_ssl_enabled\": {\n \"display_name\": \"Server SSL Enabled\",\n \"advanced\": True,\n },\n }\n\n def build(\n self,\n collection_name: str,\n persist: bool,\n embedding: Embeddings,\n chroma_server_ssl_enabled: bool,\n persist_directory: Optional[str] = None,\n documents: Optional[List[Document]] = None,\n chroma_server_cors_allow_origins: Optional[str] = None,\n chroma_server_host: Optional[str] = None,\n chroma_server_port: Optional[int] = None,\n chroma_server_grpc_port: Optional[int] = None,\n ) -> Union[VectorStore, BaseRetriever]:\n \"\"\"\n Builds the Vector Store or BaseRetriever object.\n\n Args:\n - collection_name (str): The name of the collection.\n - persist_directory (Optional[str]): The directory to persist the Vector Store to.\n - chroma_server_ssl_enabled (bool): Whether to enable SSL for the Chroma server.\n - persist (bool): Whether to persist the Vector Store or not.\n - embedding (Optional[Embeddings]): The embeddings to use for the Vector Store.\n - documents (Optional[Document]): The documents to use for the Vector Store.\n - chroma_server_cors_allow_origins (Optional[str]): The CORS allow origins for the Chroma server.\n - chroma_server_host (Optional[str]): The host for the Chroma server.\n - chroma_server_port (Optional[int]): The port for the Chroma server.\n - chroma_server_grpc_port (Optional[int]): The gRPC port for the Chroma server.\n\n Returns:\n - Union[VectorStore, BaseRetriever]: The Vector Store or BaseRetriever object.\n \"\"\"\n\n # Chroma settings\n chroma_settings = None\n\n if chroma_server_host is not None:\n chroma_settings = chromadb.config.Settings(\n chroma_server_cors_allow_origins=chroma_server_cors_allow_origins or None,\n chroma_server_host=chroma_server_host,\n chroma_server_port=chroma_server_port or None,\n chroma_server_grpc_port=chroma_server_grpc_port or None,\n chroma_server_ssl_enabled=chroma_server_ssl_enabled,\n )\n\n # If documents, then we need to create a Chroma instance using .from_documents\n if documents is not None and embedding is not None:\n if len(documents) == 0:\n raise ValueError(\"If documents are provided, there must be at least one document.\")\n return Chroma.from_documents(\n documents=documents, # type: ignore\n persist_directory=persist_directory if persist else None,\n collection_name=collection_name,\n embedding=embedding,\n client_settings=chroma_settings,\n )\n\n return Chroma(persist_directory=persist_directory, client_settings=chroma_settings)\n","fileTypes":[],"file_path":"","password":false,"name":"code","advanced":false,"dynamic":true,"info":""},"collection_name":{"type":"str","required":true,"placeholder":"","list":false,"show":true,"multiline":false,"value":"video","fileTypes":[],"file_path":"","password":false,"name":"collection_name","display_name":"Collection Name","advanced":false,"dynamic":false,"info":""},"persist":{"type":"bool","required":true,"placeholder":"","list":false,"show":true,"multiline":false,"value":false,"fileTypes":[],"file_path":"","password":false,"name":"persist","display_name":"Persist","advanced":false,"dynamic":false,"info":""},"persist_directory":{"type":"str","required":false,"placeholder":"","list":false,"show":true,"multiline":false,"fileTypes":[],"file_path":"","password":false,"name":"persist_directory","display_name":"Persist Directory","advanced":false,"dynamic":false,"info":""},"_type":"CustomComponent"},"description":"Implementation of Vector Store using Chroma","base_classes":["VectorStore","BaseRetriever"],"display_name":"Chroma","documentation":"https://python.langchain.com/docs/integrations/vectorstores/chroma","custom_fields":{"chroma_server_cors_allow_origins":null,"chroma_server_grpc_port":null,"chroma_server_host":null,"chroma_server_port":null,"chroma_server_ssl_enabled":null,"collection_name":null,"documents":null,"embedding":null,"persist":null,"persist_directory":null},"output_types":["Chroma"],"field_formatters":{},"beta":true},"id":"Chroma-OtYDg"},"selected":false,"width":384,"height":625,"positionAbsolute":{"x":-2194.2051907050227,"y":-1370.1637632208287},"dragging":false},{"id":"OpenAIEmbeddings-9yqtI","type":"genericNode","position":{"x":-2653.011009324626,"y":-1103.8414515074774},"data":{"type":"OpenAIEmbeddings","node":{"template":{"allowed_special":{"type":"str","required":false,"placeholder":"","list":true,"show":true,"multiline":false,"value":[],"fileTypes":[],"password":false,"name":"allowed_special","advanced":true,"dynamic":false,"info":""},"async_client":{"type":"Any","required":false,"placeholder":"","list":false,"show":true,"multiline":false,"fileTypes":[],"password":false,"name":"async_client","advanced":true,"dynamic":false,"info":""},"chunk_size":{"type":"int","required":false,"placeholder":"","list":false,"show":true,"multiline":false,"value":1000,"fileTypes":[],"password":false,"name":"chunk_size","advanced":true,"dynamic":false,"info":""},"client":{"type":"Any","required":false,"placeholder":"","list":false,"show":true,"multiline":false,"fileTypes":[],"password":false,"name":"client","advanced":true,"dynamic":false,"info":""},"default_headers":{"type":"dict","required":false,"placeholder":"","list":false,"show":true,"multiline":false,"fileTypes":[],"password":false,"name":"default_headers","advanced":true,"dynamic":false,"info":""},"default_query":{"type":"dict","required":false,"placeholder":"","list":false,"show":true,"multiline":false,"fileTypes":[],"password":false,"name":"default_query","advanced":true,"dynamic":false,"info":""},"deployment":{"type":"str","required":false,"placeholder":"","list":false,"show":true,"multiline":false,"value":"text-embedding-ada-002","fileTypes":[],"password":false,"name":"deployment","advanced":true,"dynamic":false,"info":""},"disallowed_special":{"type":"str","required":false,"placeholder":"","list":true,"show":true,"multiline":false,"value":"all","fileTypes":[],"password":false,"name":"disallowed_special","advanced":true,"dynamic":false,"info":""},"embedding_ctx_length":{"type":"int","required":false,"placeholder":"","list":false,"show":true,"multiline":false,"value":8191,"fileTypes":[],"password":false,"name":"embedding_ctx_length","advanced":true,"dynamic":false,"info":""},"headers":{"type":"Any","required":false,"placeholder":"","list":false,"show":false,"multiline":true,"value":"{\"Authorization\": \"Bearer \"}","fileTypes":[],"password":false,"name":"headers","advanced":true,"dynamic":false,"info":""},"http_client":{"type":"Any","required":false,"placeholder":"","list":false,"show":true,"multiline":false,"fileTypes":[],"password":false,"name":"http_client","advanced":true,"dynamic":false,"info":""},"max_retries":{"type":"int","required":false,"placeholder":"","list":false,"show":true,"multiline":false,"value":2,"fileTypes":[],"password":false,"name":"max_retries","advanced":true,"dynamic":false,"info":""},"model":{"type":"str","required":false,"placeholder":"","list":false,"show":true,"multiline":false,"value":"text-embedding-ada-002","fileTypes":[],"password":false,"name":"model","advanced":true,"dynamic":false,"info":""},"model_kwargs":{"type":"dict","required":false,"placeholder":"","list":false,"show":true,"multiline":false,"fileTypes":[],"password":false,"name":"model_kwargs","advanced":true,"dynamic":false,"info":""},"openai_api_base":{"type":"str","required":false,"placeholder":"","list":false,"show":true,"multiline":false,"fileTypes":[],"password":true,"name":"openai_api_base","display_name":"OpenAI API Base","advanced":true,"dynamic":false,"info":"","value":""},"openai_api_key":{"type":"str","required":false,"placeholder":"","list":false,"show":true,"multiline":false,"value":"","fileTypes":[],"password":true,"name":"openai_api_key","display_name":"OpenAI API Key","advanced":false,"dynamic":false,"info":""},"openai_api_type":{"type":"str","required":false,"placeholder":"","list":false,"show":true,"multiline":false,"fileTypes":[],"password":true,"name":"openai_api_type","display_name":"OpenAI API Type","advanced":true,"dynamic":false,"info":"","value":""},"openai_api_version":{"type":"str","required":false,"placeholder":"","list":false,"show":true,"multiline":false,"fileTypes":[],"password":true,"name":"openai_api_version","display_name":"OpenAI API Version","advanced":true,"dynamic":false,"info":"","value":""},"openai_organization":{"type":"str","required":false,"placeholder":"","list":false,"show":true,"multiline":false,"fileTypes":[],"password":false,"name":"openai_organization","display_name":"OpenAI Organization","advanced":true,"dynamic":false,"info":""},"openai_proxy":{"type":"str","required":false,"placeholder":"","list":false,"show":true,"multiline":false,"fileTypes":[],"password":false,"name":"openai_proxy","display_name":"OpenAI Proxy","advanced":true,"dynamic":false,"info":""},"request_timeout":{"type":"float","required":false,"placeholder":"","list":false,"show":true,"multiline":false,"fileTypes":[],"password":false,"name":"request_timeout","advanced":true,"dynamic":false,"info":"","rangeSpec":{"min":-1,"max":1,"step":0.1}},"retry_max_seconds":{"type":"int","required":false,"placeholder":"","list":false,"show":true,"multiline":false,"value":20,"fileTypes":[],"password":false,"name":"retry_max_seconds","advanced":true,"dynamic":false,"info":""},"retry_min_seconds":{"type":"int","required":false,"placeholder":"","list":false,"show":true,"multiline":false,"value":4,"fileTypes":[],"password":false,"name":"retry_min_seconds","advanced":true,"dynamic":false,"info":""},"show_progress_bar":{"type":"bool","required":false,"placeholder":"","list":false,"show":true,"multiline":false,"value":false,"fileTypes":[],"password":false,"name":"show_progress_bar","advanced":true,"dynamic":false,"info":""},"skip_empty":{"type":"bool","required":false,"placeholder":"","list":false,"show":true,"multiline":false,"value":false,"fileTypes":[],"password":false,"name":"skip_empty","advanced":true,"dynamic":false,"info":""},"tiktoken_enabled":{"type":"bool","required":false,"placeholder":"","list":false,"show":true,"multiline":false,"value":"","fileTypes":[],"password":true,"name":"tiktoken_enabled","advanced":false,"dynamic":false,"info":""},"tiktoken_model_name":{"type":"str","required":false,"placeholder":"","list":false,"show":true,"multiline":false,"fileTypes":[],"password":true,"name":"tiktoken_model_name","advanced":false,"dynamic":false,"info":"","value":""},"_type":"OpenAIEmbeddings"},"description":"[*Deprecated*] OpenAI embedding models.","base_classes":["Embeddings","OpenAIEmbeddings"],"display_name":"OpenAIEmbeddings","documentation":"https://python.langchain.com/docs/modules/data_connection/text_embedding/integrations/openai","custom_fields":{},"output_types":[],"field_formatters":{},"beta":false},"id":"OpenAIEmbeddings-9yqtI"},"selected":false,"width":384,"height":443,"positionAbsolute":{"x":-2653.011009324626,"y":-1103.8414515074774},"dragging":false},{"id":"RetrievalQA-DpylI","type":"genericNode","position":{"x":-1757.239471200792,"y":-1258.2132589352987},"data":{"type":"RetrievalQA","node":{"template":{"callbacks":{"type":"langchain_core.callbacks.base.BaseCallbackHandler","required":false,"placeholder":"","list":true,"show":false,"multiline":false,"fileTypes":[],"password":false,"name":"callbacks","advanced":false,"dynamic":false,"info":""},"combine_documents_chain":{"type":"BaseCombineDocumentsChain","required":true,"placeholder":"","list":false,"show":true,"multiline":false,"fileTypes":[],"password":false,"name":"combine_documents_chain","advanced":false,"dynamic":false,"info":""},"memory":{"type":"BaseMemory","required":false,"placeholder":"","list":false,"show":true,"multiline":false,"fileTypes":[],"password":false,"name":"memory","advanced":false,"dynamic":false,"info":""},"retriever":{"type":"BaseRetriever","required":true,"placeholder":"","list":false,"show":true,"multiline":false,"fileTypes":[],"password":false,"name":"retriever","advanced":false,"dynamic":false,"info":""},"input_key":{"type":"str","required":true,"placeholder":"","list":false,"show":true,"multiline":false,"value":"query","fileTypes":[],"password":false,"name":"input_key","advanced":true,"dynamic":false,"info":""},"metadata":{"type":"dict","required":false,"placeholder":"","list":false,"show":false,"multiline":false,"fileTypes":[],"password":false,"name":"metadata","advanced":false,"dynamic":false,"info":""},"name":{"type":"str","required":false,"placeholder":"","list":false,"show":false,"multiline":false,"fileTypes":[],"password":false,"name":"name","advanced":false,"dynamic":false,"info":""},"output_key":{"type":"str","required":true,"placeholder":"","list":false,"show":true,"multiline":false,"value":"result","fileTypes":[],"password":false,"name":"output_key","advanced":true,"dynamic":false,"info":""},"return_source_documents":{"type":"bool","required":false,"placeholder":"","list":false,"show":true,"multiline":false,"value":true,"fileTypes":[],"password":false,"name":"return_source_documents","advanced":true,"dynamic":false,"info":""},"tags":{"type":"str","required":false,"placeholder":"","list":true,"show":false,"multiline":false,"fileTypes":[],"password":false,"name":"tags","advanced":false,"dynamic":false,"info":""},"verbose":{"type":"bool","required":false,"placeholder":"","list":false,"show":false,"multiline":false,"fileTypes":[],"password":false,"name":"verbose","advanced":true,"dynamic":false,"info":""},"_type":"RetrievalQA"},"description":"Chain for question-answering against an index.","base_classes":["Chain","RetrievalQA","BaseRetrievalQA","Callable"],"display_name":"RetrievalQA","documentation":"https://python.langchain.com/docs/modules/chains/popular/vector_db_qa","custom_fields":{},"output_types":[],"field_formatters":{},"beta":false},"id":"RetrievalQA-DpylI"},"selected":false,"width":384,"height":339,"positionAbsolute":{"x":-1757.239471200792,"y":-1258.2132589352987},"dragging":true},{"id":"CombineDocsChain-afKOq","type":"genericNode","position":{"x":-1775.9040057312934,"y":-1644.0423777157919},"data":{"type":"CombineDocsChain","node":{"template":{"llm":{"type":"BaseLanguageModel","required":true,"placeholder":"","list":false,"show":true,"multiline":false,"value":"","fileTypes":[],"file_path":"","password":false,"name":"llm","display_name":"LLM","advanced":false,"dynamic":false,"info":""},"chain_type":{"type":"str","required":true,"placeholder":"","list":true,"show":true,"multiline":false,"value":"refine","fileTypes":[],"file_path":"","password":false,"options":["stuff","map_reduce","map_rerank","refine"],"name":"chain_type","advanced":false,"dynamic":false,"info":""},"_type":"load_qa_chain"},"description":"Load question answering chain.","base_classes":["BaseCombineDocumentsChain","Callable"],"display_name":"CombineDocsChain","documentation":"","custom_fields":{},"output_types":[],"field_formatters":{},"beta":false},"id":"CombineDocsChain-afKOq"},"selected":false,"width":384,"height":333,"dragging":false,"positionAbsolute":{"x":-1775.9040057312934,"y":-1644.0423777157919}},{"id":"SearchApi-kZmEj","type":"genericNode","position":{"x":-3074.364183247263,"y":-1782.5742787937606},"data":{"type":"SearchApi","node":{"template":{"api_key":{"type":"str","required":true,"placeholder":"","list":false,"show":true,"multiline":false,"fileTypes":[],"file_path":"","password":true,"name":"api_key","display_name":"API Key","advanced":false,"dynamic":false,"info":"The API key to use SearchApi.","value":""},"code":{"type":"code","required":true,"placeholder":"","list":false,"show":true,"multiline":true,"value":"from langflow import CustomComponent\nfrom langchain.schema import Document\nfrom langflow.services.database.models.base import orjson_dumps\nfrom langchain_community.utilities.searchapi import SearchApiAPIWrapper\nfrom typing import Optional\n\n\nclass SearchApi(CustomComponent):\n display_name: str = \"SearchApi\"\n description: str = \"Real-time search engines API.\"\n output_types: list[str] = [\"Document\"]\n documentation: str = \"https://www.searchapi.io/docs/google\"\n field_config = {\n \"engine\": {\n \"display_name\": \"Engine\",\n \"field_type\": \"str\",\n \"info\": \"The search engine to use.\",\n },\n \"params\": {\n \"display_name\": \"Parameters\",\n \"info\": \"The parameters to send with the request.\",\n },\n \"code\": {\"show\": False},\n \"api_key\": {\n \"display_name\": \"API Key\",\n \"field_type\": \"str\",\n \"required\": True, \n \"password\": True,\n \"info\": \"The API key to use SearchApi.\",\n },\n }\n\n def build(\n self,\n engine: str,\n api_key: str,\n params: Optional[dict] = None,\n ) -> Document:\n if params is None:\n params = {}\n\n search_api_wrapper = SearchApiAPIWrapper(engine=engine, searchapi_api_key=api_key)\n\n query = params.pop(\"query\", \"default query\") \n results = search_api_wrapper.results(query, **params)\n\n result = orjson_dumps(results, indent_2=False)\n \n document = Document(page_content=result) \n\n return document","fileTypes":[],"file_path":"","password":false,"name":"code","advanced":false,"dynamic":true,"info":""},"engine":{"type":"str","required":true,"placeholder":"","list":false,"show":true,"multiline":false,"fileTypes":[],"file_path":"","password":false,"name":"engine","display_name":"Engine","advanced":false,"dynamic":false,"info":"The search engine to use.","value":"youtube_transcripts"},"params":{"type":"dict","required":false,"placeholder":"","list":false,"show":true,"multiline":false,"fileTypes":[],"file_path":"","password":false,"name":"params","display_name":"Parameters","advanced":false,"dynamic":false,"info":"The parameters to send with the request.","value":[{"video_id":"krsBRQbOPQ4"}]},"_type":"CustomComponent"},"description":"Real-time search engines API.","base_classes":["Document"],"display_name":"SearchApi","documentation":"https://www.searchapi.io/docs/google","custom_fields":{"api_key":null,"engine":null,"params":null},"output_types":["SearchApi"],"field_formatters":{},"beta":true},"id":"SearchApi-kZmEj"},"selected":false,"width":384,"height":539,"dragging":false,"positionAbsolute":{"x":-3074.364183247263,"y":-1782.5742787937606}}],"edges":[{"source":"CharacterTextSplitter-WVMFU","sourceHandle":"{œbaseClassesœ:[œDocumentœ],œdataTypeœ:œCharacterTextSplitterœ,œidœ:œCharacterTextSplitter-WVMFUœ}","target":"Chroma-OtYDg","targetHandle":"{œfieldNameœ:œdocumentsœ,œidœ:œChroma-OtYDgœ,œinputTypesœ:null,œtypeœ:œDocumentœ}","data":{"targetHandle":{"fieldName":"documents","id":"Chroma-OtYDg","inputTypes":null,"type":"Document"},"sourceHandle":{"baseClasses":["Document"],"dataType":"CharacterTextSplitter","id":"CharacterTextSplitter-WVMFU"}},"style":{"stroke":"#555"},"className":"stroke-gray-900 stroke-connection","animated":false,"id":"reactflow__edge-CharacterTextSplitter-WVMFU{œbaseClassesœ:[œDocumentœ],œdataTypeœ:œCharacterTextSplitterœ,œidœ:œCharacterTextSplitter-WVMFUœ}-Chroma-OtYDg{œfieldNameœ:œdocumentsœ,œidœ:œChroma-OtYDgœ,œinputTypesœ:null,œtypeœ:œDocumentœ}"},{"source":"OpenAIEmbeddings-9yqtI","sourceHandle":"{œbaseClassesœ:[œEmbeddingsœ,œOpenAIEmbeddingsœ],œdataTypeœ:œOpenAIEmbeddingsœ,œidœ:œOpenAIEmbeddings-9yqtIœ}","target":"Chroma-OtYDg","targetHandle":"{œfieldNameœ:œembeddingœ,œidœ:œChroma-OtYDgœ,œinputTypesœ:null,œtypeœ:œEmbeddingsœ}","data":{"targetHandle":{"fieldName":"embedding","id":"Chroma-OtYDg","inputTypes":null,"type":"Embeddings"},"sourceHandle":{"baseClasses":["Embeddings","OpenAIEmbeddings"],"dataType":"OpenAIEmbeddings","id":"OpenAIEmbeddings-9yqtI"}},"style":{"stroke":"#555"},"className":"stroke-gray-900 stroke-connection","animated":false,"id":"reactflow__edge-OpenAIEmbeddings-9yqtI{œbaseClassesœ:[œEmbeddingsœ,œOpenAIEmbeddingsœ],œdataTypeœ:œOpenAIEmbeddingsœ,œidœ:œOpenAIEmbeddings-9yqtIœ}-Chroma-OtYDg{œfieldNameœ:œembeddingœ,œidœ:œChroma-OtYDgœ,œinputTypesœ:null,œtypeœ:œEmbeddingsœ}"},{"source":"Chroma-OtYDg","sourceHandle":"{œbaseClassesœ:[œVectorStoreœ,œBaseRetrieverœ],œdataTypeœ:œChromaœ,œidœ:œChroma-OtYDgœ}","target":"RetrievalQA-DpylI","targetHandle":"{œfieldNameœ:œretrieverœ,œidœ:œRetrievalQA-DpylIœ,œinputTypesœ:null,œtypeœ:œBaseRetrieverœ}","data":{"targetHandle":{"fieldName":"retriever","id":"RetrievalQA-DpylI","inputTypes":null,"type":"BaseRetriever"},"sourceHandle":{"baseClasses":["VectorStore","BaseRetriever"],"dataType":"Chroma","id":"Chroma-OtYDg"}},"style":{"stroke":"#555"},"className":"stroke-gray-900 stroke-connection","animated":false,"id":"reactflow__edge-Chroma-OtYDg{œbaseClassesœ:[œVectorStoreœ,œBaseRetrieverœ],œdataTypeœ:œChromaœ,œidœ:œChroma-OtYDgœ}-RetrievalQA-DpylI{œfieldNameœ:œretrieverœ,œidœ:œRetrievalQA-DpylIœ,œinputTypesœ:null,œtypeœ:œBaseRetrieverœ}"},{"source":"ChatOpenAI-4Mfuz","sourceHandle":"{œbaseClassesœ:[œBaseLanguageModelœ,œBaseChatModelœ,œChatOpenAIœ,œBaseLLMœ],œdataTypeœ:œChatOpenAIœ,œidœ:œChatOpenAI-4Mfuzœ}","target":"CombineDocsChain-afKOq","targetHandle":"{œfieldNameœ:œllmœ,œidœ:œCombineDocsChain-afKOqœ,œinputTypesœ:null,œtypeœ:œBaseLanguageModelœ}","data":{"targetHandle":{"fieldName":"llm","id":"CombineDocsChain-afKOq","inputTypes":null,"type":"BaseLanguageModel"},"sourceHandle":{"baseClasses":["BaseLanguageModel","BaseChatModel","ChatOpenAI","BaseLLM"],"dataType":"ChatOpenAI","id":"ChatOpenAI-4Mfuz"}},"style":{"stroke":"#555"},"className":"stroke-gray-900 stroke-connection","animated":false,"id":"reactflow__edge-ChatOpenAI-4Mfuz{œbaseClassesœ:[œBaseLanguageModelœ,œBaseChatModelœ,œChatOpenAIœ,œBaseLLMœ],œdataTypeœ:œChatOpenAIœ,œidœ:œChatOpenAI-4Mfuzœ}-CombineDocsChain-afKOq{œfieldNameœ:œllmœ,œidœ:œCombineDocsChain-afKOqœ,œinputTypesœ:null,œtypeœ:œBaseLanguageModelœ}"},{"source":"CombineDocsChain-afKOq","sourceHandle":"{œbaseClassesœ:[œBaseCombineDocumentsChainœ,œCallableœ],œdataTypeœ:œCombineDocsChainœ,œidœ:œCombineDocsChain-afKOqœ}","target":"RetrievalQA-DpylI","targetHandle":"{œfieldNameœ:œcombine_documents_chainœ,œidœ:œRetrievalQA-DpylIœ,œinputTypesœ:null,œtypeœ:œBaseCombineDocumentsChainœ}","data":{"targetHandle":{"fieldName":"combine_documents_chain","id":"RetrievalQA-DpylI","inputTypes":null,"type":"BaseCombineDocumentsChain"},"sourceHandle":{"baseClasses":["BaseCombineDocumentsChain","Callable"],"dataType":"CombineDocsChain","id":"CombineDocsChain-afKOq"}},"style":{"stroke":"#555"},"className":"stroke-gray-900 stroke-connection","animated":false,"id":"reactflow__edge-CombineDocsChain-afKOq{œbaseClassesœ:[œBaseCombineDocumentsChainœ,œCallableœ],œdataTypeœ:œCombineDocsChainœ,œidœ:œCombineDocsChain-afKOqœ}-RetrievalQA-DpylI{œfieldNameœ:œcombine_documents_chainœ,œidœ:œRetrievalQA-DpylIœ,œinputTypesœ:null,œtypeœ:œBaseCombineDocumentsChainœ}"},{"source":"SearchApi-kZmEj","sourceHandle":"{œbaseClassesœ:[œDocumentœ],œdataTypeœ:œSearchApiœ,œidœ:œSearchApi-kZmEjœ}","target":"CharacterTextSplitter-WVMFU","targetHandle":"{œfieldNameœ:œdocumentsœ,œidœ:œCharacterTextSplitter-WVMFUœ,œinputTypesœ:null,œtypeœ:œDocumentœ}","data":{"targetHandle":{"fieldName":"documents","id":"CharacterTextSplitter-WVMFU","inputTypes":null,"type":"Document"},"sourceHandle":{"baseClasses":["Document"],"dataType":"SearchApi","id":"SearchApi-kZmEj"}},"style":{"stroke":"#555"},"className":"stroke-gray-900 stroke-connection","animated":false,"id":"reactflow__edge-SearchApi-kZmEj{œbaseClassesœ:[œDocumentœ],œdataTypeœ:œSearchApiœ,œidœ:œSearchApi-kZmEjœ}-CharacterTextSplitter-WVMFU{œfieldNameœ:œdocumentsœ,œidœ:œCharacterTextSplitter-WVMFUœ,œinputTypesœ:null,œtypeœ:œDocumentœ}"}],"viewport":{"x":2046.3642433866817,"y":1270.2852546488134,"zoom":0.6177254407441625}},"description":"Real-time Google Search engine q&a.","name":"SearchApi Tool","last_tested_version":"0.6.5a9","is_component":false} \ No newline at end of file +{ + "id": "7fc56f82-3493-4742-9c85-82b144127aff", + "data": { + "nodes": [ + { + "id": "ChatOpenAI-4Mfuz", + "type": "genericNode", + "position": { + "x": -2243.8068684913856, + "y": -2026.350019258601 + }, + "data": { + "type": "ChatOpenAI", + "node": { + "template": { + "callbacks": { + "type": "langchain_core.callbacks.base.BaseCallbackHandler", + "required": false, + "placeholder": "", + "list": true, + "show": false, + "multiline": false, + "fileTypes": [], + "password": false, + "name": "callbacks", + "advanced": false, + "dynamic": false, + "info": "" + }, + "async_client": { + "type": "Any", + "required": false, + "placeholder": "", + "list": false, + "show": false, + "multiline": false, + "fileTypes": [], + "password": false, + "name": "async_client", + "advanced": false, + "dynamic": false, + "info": "" + }, + "cache": { + "type": "bool", + "required": false, + "placeholder": "", + "list": false, + "show": false, + "multiline": false, + "fileTypes": [], + "password": false, + "name": "cache", + "advanced": false, + "dynamic": false, + "info": "" + }, + "client": { + "type": "Any", + "required": false, + "placeholder": "", + "list": false, + "show": false, + "multiline": false, + "fileTypes": [], + "password": false, + "name": "client", + "advanced": false, + "dynamic": false, + "info": "" + }, + "default_headers": { + "type": "dict", + "required": false, + "placeholder": "", + "list": false, + "show": false, + "multiline": false, + "fileTypes": [], + "password": false, + "name": "default_headers", + "advanced": false, + "dynamic": false, + "info": "" + }, + "default_query": { + "type": "dict", + "required": false, + "placeholder": "", + "list": false, + "show": false, + "multiline": false, + "fileTypes": [], + "password": false, + "name": "default_query", + "advanced": false, + "dynamic": false, + "info": "" + }, + "http_client": { + "type": "Any", + "required": false, + "placeholder": "", + "list": false, + "show": false, + "multiline": false, + "fileTypes": [], + "password": false, + "name": "http_client", + "advanced": false, + "dynamic": false, + "info": "" + }, + "max_retries": { + "type": "int", + "required": false, + "placeholder": "", + "list": false, + "show": false, + "multiline": false, + "value": 2, + "fileTypes": [], + "password": false, + "name": "max_retries", + "advanced": false, + "dynamic": false, + "info": "" + }, + "max_tokens": { + "type": "int", + "required": false, + "placeholder": "", + "list": false, + "show": true, + "multiline": false, + "fileTypes": [], + "password": true, + "name": "max_tokens", + "advanced": false, + "dynamic": false, + "info": "", + "value": "" + }, + "metadata": { + "type": "dict", + "required": false, + "placeholder": "", + "list": false, + "show": false, + "multiline": false, + "fileTypes": [], + "password": false, + "name": "metadata", + "advanced": false, + "dynamic": false, + "info": "" + }, + "model_kwargs": { + "type": "dict", + "required": false, + "placeholder": "", + "list": false, + "show": true, + "multiline": false, + "fileTypes": [], + "password": false, + "name": "model_kwargs", + "advanced": true, + "dynamic": false, + "info": "" + }, + "model_name": { + "type": "str", + "required": false, + "placeholder": "", + "list": true, + "show": true, + "multiline": false, + "value": "gpt-3.5-turbo-16k", + "fileTypes": [], + "password": false, + "options": [ + "gpt-4-1106-preview", + "gpt-4-vision-preview", + "gpt-4", + "gpt-4-32k", + "gpt-3.5-turbo", + "gpt-3.5-turbo-16k" + ], + "name": "model_name", + "advanced": false, + "dynamic": false, + "info": "" + }, + "n": { + "type": "int", + "required": false, + "placeholder": "", + "list": false, + "show": false, + "multiline": false, + "value": 1, + "fileTypes": [], + "password": false, + "name": "n", + "advanced": false, + "dynamic": false, + "info": "" + }, + "name": { + "type": "str", + "required": false, + "placeholder": "", + "list": false, + "show": false, + "multiline": false, + "fileTypes": [], + "password": false, + "name": "name", + "advanced": false, + "dynamic": false, + "info": "" + }, + "openai_api_base": { + "type": "str", + "required": false, + "placeholder": "", + "list": false, + "show": true, + "multiline": false, + "fileTypes": [], + "password": false, + "name": "openai_api_base", + "display_name": "OpenAI API Base", + "advanced": false, + "dynamic": false, + "info": "\nThe base URL of the OpenAI API. Defaults to https://api.openai.com/v1.\n\nYou can change this to use other APIs like JinaChat, LocalAI and Prem.\n" + }, + "openai_api_key": { + "type": "str", + "required": false, + "placeholder": "", + "list": false, + "show": true, + "multiline": false, + "value": "", + "fileTypes": [], + "password": true, + "name": "openai_api_key", + "display_name": "OpenAI API Key", + "advanced": false, + "dynamic": false, + "info": "" + }, + "openai_organization": { + "type": "str", + "required": false, + "placeholder": "", + "list": false, + "show": false, + "multiline": false, + "fileTypes": [], + "password": false, + "name": "openai_organization", + "display_name": "OpenAI Organization", + "advanced": false, + "dynamic": false, + "info": "" + }, + "openai_proxy": { + "type": "str", + "required": false, + "placeholder": "", + "list": false, + "show": false, + "multiline": false, + "fileTypes": [], + "password": false, + "name": "openai_proxy", + "display_name": "OpenAI Proxy", + "advanced": false, + "dynamic": false, + "info": "" + }, + "request_timeout": { + "type": "float", + "required": false, + "placeholder": "", + "list": false, + "show": false, + "multiline": false, + "fileTypes": [], + "password": false, + "name": "request_timeout", + "advanced": false, + "dynamic": false, + "info": "", + "rangeSpec": { + "min": -1, + "max": 1, + "step": 0.1 + } + }, + "streaming": { + "type": "bool", + "required": false, + "placeholder": "", + "list": false, + "show": false, + "multiline": false, + "value": false, + "fileTypes": [], + "password": false, + "name": "streaming", + "advanced": false, + "dynamic": false, + "info": "" + }, + "tags": { + "type": "str", + "required": false, + "placeholder": "", + "list": true, + "show": false, + "multiline": false, + "fileTypes": [], + "password": false, + "name": "tags", + "advanced": false, + "dynamic": false, + "info": "" + }, + "temperature": { + "type": "float", + "required": false, + "placeholder": "", + "list": false, + "show": true, + "multiline": false, + "value": "0.5", + "fileTypes": [], + "password": false, + "name": "temperature", + "advanced": false, + "dynamic": false, + "info": "", + "rangeSpec": { + "min": -1, + "max": 1, + "step": 0.1 + } + }, + "tiktoken_model_name": { + "type": "str", + "required": false, + "placeholder": "", + "list": false, + "show": false, + "multiline": false, + "fileTypes": [], + "password": false, + "name": "tiktoken_model_name", + "advanced": false, + "dynamic": false, + "info": "" + }, + "verbose": { + "type": "bool", + "required": false, + "placeholder": "", + "list": false, + "show": false, + "multiline": false, + "value": false, + "fileTypes": [], + "password": false, + "name": "verbose", + "advanced": false, + "dynamic": false, + "info": "" + }, + "_type": "ChatOpenAI" + }, + "description": "[*Deprecated*] `OpenAI` Chat large language models API.", + "base_classes": [ + "BaseLanguageModel", + "BaseChatModel", + "ChatOpenAI", + "BaseLLM" + ], + "display_name": "ChatOpenAI", + "documentation": "https://python.langchain.com/docs/modules/model_io/models/chat/integrations/openai", + "custom_fields": {}, + "output_types": [], + "field_formatters": {}, + "beta": false + }, + "id": "ChatOpenAI-4Mfuz" + }, + "selected": false, + "width": 384, + "height": 649, + "positionAbsolute": { + "x": -2243.8068684913856, + "y": -2026.350019258601 + }, + "dragging": false + }, + { + "id": "CharacterTextSplitter-WVMFU", + "type": "genericNode", + "position": { + "x": -2661.4749778477553, + "y": -1608.9437055023366 + }, + "data": { + "type": "CharacterTextSplitter", + "node": { + "template": { + "documents": { + "type": "Document", + "required": true, + "placeholder": "", + "list": true, + "show": true, + "multiline": false, + "value": "", + "fileTypes": [], + "file_path": "", + "password": false, + "name": "documents", + "advanced": false, + "dynamic": false, + "info": "" + }, + "chunk_overlap": { + "type": "int", + "required": true, + "placeholder": "", + "list": false, + "show": true, + "multiline": false, + "value": 200, + "fileTypes": [], + "file_path": "", + "password": false, + "name": "chunk_overlap", + "display_name": "Chunk Overlap", + "advanced": false, + "dynamic": false, + "info": "" + }, + "chunk_size": { + "type": "int", + "required": true, + "placeholder": "", + "list": false, + "show": true, + "multiline": false, + "value": "2000", + "fileTypes": [], + "file_path": "", + "password": false, + "name": "chunk_size", + "display_name": "Chunk Size", + "advanced": false, + "dynamic": false, + "info": "" + }, + "separator": { + "type": "str", + "required": true, + "placeholder": "", + "list": false, + "show": true, + "multiline": false, + "value": "\"", + "fileTypes": [], + "file_path": "", + "password": false, + "name": "separator", + "display_name": "Separator", + "advanced": false, + "dynamic": false, + "info": "" + }, + "_type": "CharacterTextSplitter" + }, + "description": "Splitting text that looks at characters.", + "base_classes": [ + "Document" + ], + "display_name": "CharacterTextSplitter", + "documentation": "https://python.langchain.com/docs/modules/data_connection/document_transformers/text_splitters/character_text_splitter", + "custom_fields": {}, + "output_types": [ + "Document" + ], + "field_formatters": {}, + "beta": false + }, + "id": "CharacterTextSplitter-WVMFU" + }, + "selected": false, + "width": 384, + "height": 501, + "positionAbsolute": { + "x": -2661.4749778477553, + "y": -1608.9437055023366 + }, + "dragging": false + }, + { + "id": "Chroma-OtYDg", + "type": "genericNode", + "position": { + "x": -2194.2051907050227, + "y": -1370.1637632208287 + }, + "data": { + "type": "Chroma", + "node": { + "template": { + "documents": { + "type": "Document", + "required": false, + "placeholder": "", + "list": true, + "show": true, + "multiline": false, + "fileTypes": [], + "file_path": "", + "password": false, + "name": "documents", + "display_name": "Documents", + "advanced": false, + "dynamic": false, + "info": "" + }, + "embedding": { + "type": "Embeddings", + "required": true, + "placeholder": "", + "list": false, + "show": true, + "multiline": false, + "fileTypes": [], + "file_path": "", + "password": false, + "name": "embedding", + "display_name": "Embedding", + "advanced": false, + "dynamic": false, + "info": "" + }, + "chroma_server_cors_allow_origins": { + "type": "str", + "required": false, + "placeholder": "", + "list": false, + "show": true, + "multiline": false, + "fileTypes": [], + "file_path": "", + "password": false, + "name": "chroma_server_cors_allow_origins", + "display_name": "Server CORS Allow Origins", + "advanced": true, + "dynamic": false, + "info": "" + }, + "chroma_server_grpc_port": { + "type": "int", + "required": false, + "placeholder": "", + "list": false, + "show": true, + "multiline": false, + "fileTypes": [], + "file_path": "", + "password": false, + "name": "chroma_server_grpc_port", + "display_name": "Server gRPC Port", + "advanced": true, + "dynamic": false, + "info": "" + }, + "chroma_server_host": { + "type": "str", + "required": false, + "placeholder": "", + "list": false, + "show": true, + "multiline": false, + "fileTypes": [], + "file_path": "", + "password": false, + "name": "chroma_server_host", + "display_name": "Server Host", + "advanced": true, + "dynamic": false, + "info": "" + }, + "chroma_server_port": { + "type": "int", + "required": false, + "placeholder": "", + "list": false, + "show": true, + "multiline": false, + "fileTypes": [], + "file_path": "", + "password": false, + "name": "chroma_server_port", + "display_name": "Server Port", + "advanced": true, + "dynamic": false, + "info": "" + }, + "chroma_server_ssl_enabled": { + "type": "bool", + "required": true, + "placeholder": "", + "list": false, + "show": true, + "multiline": false, + "value": false, + "fileTypes": [], + "file_path": "", + "password": false, + "name": "chroma_server_ssl_enabled", + "display_name": "Server SSL Enabled", + "advanced": true, + "dynamic": false, + "info": "" + }, + "code": { + "type": "code", + "required": true, + "placeholder": "", + "list": false, + "show": true, + "multiline": true, + "value": "from typing import List, Optional, Union\n\nimport chromadb # type: ignore\nfrom langchain.embeddings.base import Embeddings\nfrom langchain.schema import BaseRetriever, Document\nfrom langchain.vectorstores import Chroma\nfrom langchain.vectorstores.base import VectorStore\n\nfrom langflow.custom import CustomComponent\n\n\nclass ChromaComponent(CustomComponent):\n \"\"\"\n A custom component for implementing a Vector Store using Chroma.\n \"\"\"\n\n display_name: str = \"Chroma\"\n description: str = \"Implementation of Vector Store using Chroma\"\n documentation = \"https://python.langchain.com/docs/integrations/vectorstores/chroma\"\n beta: bool = True\n\n def build_config(self):\n \"\"\"\n Builds the configuration for the component.\n\n Returns:\n - dict: A dictionary containing the configuration options for the component.\n \"\"\"\n return {\n \"collection_name\": {\"display_name\": \"Collection Name\", \"value\": \"langflow\"},\n \"persist\": {\"display_name\": \"Persist\"},\n \"persist_directory\": {\"display_name\": \"Persist Directory\"},\n \"code\": {\"show\": False, \"display_name\": \"Code\"},\n \"documents\": {\"display_name\": \"Documents\", \"is_list\": True},\n \"embedding\": {\"display_name\": \"Embedding\"},\n \"chroma_server_cors_allow_origins\": {\n \"display_name\": \"Server CORS Allow Origins\",\n \"advanced\": True,\n },\n \"chroma_server_host\": {\"display_name\": \"Server Host\", \"advanced\": True},\n \"chroma_server_port\": {\"display_name\": \"Server Port\", \"advanced\": True},\n \"chroma_server_grpc_port\": {\n \"display_name\": \"Server gRPC Port\",\n \"advanced\": True,\n },\n \"chroma_server_ssl_enabled\": {\n \"display_name\": \"Server SSL Enabled\",\n \"advanced\": True,\n },\n }\n\n def build(\n self,\n collection_name: str,\n persist: bool,\n embedding: Embeddings,\n chroma_server_ssl_enabled: bool,\n persist_directory: Optional[str] = None,\n documents: Optional[List[Document]] = None,\n chroma_server_cors_allow_origins: Optional[str] = None,\n chroma_server_host: Optional[str] = None,\n chroma_server_port: Optional[int] = None,\n chroma_server_grpc_port: Optional[int] = None,\n ) -> Union[VectorStore, BaseRetriever]:\n \"\"\"\n Builds the Vector Store or BaseRetriever object.\n\n Args:\n - collection_name (str): The name of the collection.\n - persist_directory (Optional[str]): The directory to persist the Vector Store to.\n - chroma_server_ssl_enabled (bool): Whether to enable SSL for the Chroma server.\n - persist (bool): Whether to persist the Vector Store or not.\n - embedding (Optional[Embeddings]): The embeddings to use for the Vector Store.\n - documents (Optional[Document]): The documents to use for the Vector Store.\n - chroma_server_cors_allow_origins (Optional[str]): The CORS allow origins for the Chroma server.\n - chroma_server_host (Optional[str]): The host for the Chroma server.\n - chroma_server_port (Optional[int]): The port for the Chroma server.\n - chroma_server_grpc_port (Optional[int]): The gRPC port for the Chroma server.\n\n Returns:\n - Union[VectorStore, BaseRetriever]: The Vector Store or BaseRetriever object.\n \"\"\"\n\n # Chroma settings\n chroma_settings = None\n\n if chroma_server_host is not None:\n chroma_settings = chromadb.config.Settings(\n chroma_server_cors_allow_origins=chroma_server_cors_allow_origins or None,\n chroma_server_host=chroma_server_host,\n chroma_server_port=chroma_server_port or None,\n chroma_server_grpc_port=chroma_server_grpc_port or None,\n chroma_server_ssl_enabled=chroma_server_ssl_enabled,\n )\n\n # If documents, then we need to create a Chroma instance using .from_documents\n if documents is not None and embedding is not None:\n if len(documents) == 0:\n raise ValueError(\"If documents are provided, there must be at least one document.\")\n return Chroma.from_documents(\n documents=documents, # type: ignore\n persist_directory=persist_directory if persist else None,\n collection_name=collection_name,\n embedding=embedding,\n client_settings=chroma_settings,\n )\n\n return Chroma(persist_directory=persist_directory, client_settings=chroma_settings)\n", + "fileTypes": [], + "file_path": "", + "password": false, + "name": "code", + "advanced": false, + "dynamic": true, + "info": "" + }, + "collection_name": { + "type": "str", + "required": true, + "placeholder": "", + "list": false, + "show": true, + "multiline": false, + "value": "video", + "fileTypes": [], + "file_path": "", + "password": false, + "name": "collection_name", + "display_name": "Collection Name", + "advanced": false, + "dynamic": false, + "info": "" + }, + "persist": { + "type": "bool", + "required": true, + "placeholder": "", + "list": false, + "show": true, + "multiline": false, + "value": false, + "fileTypes": [], + "file_path": "", + "password": false, + "name": "persist", + "display_name": "Persist", + "advanced": false, + "dynamic": false, + "info": "" + }, + "persist_directory": { + "type": "str", + "required": false, + "placeholder": "", + "list": false, + "show": true, + "multiline": false, + "fileTypes": [], + "file_path": "", + "password": false, + "name": "persist_directory", + "display_name": "Persist Directory", + "advanced": false, + "dynamic": false, + "info": "" + }, + "_type": "CustomComponent" + }, + "description": "Implementation of Vector Store using Chroma", + "base_classes": [ + "VectorStore", + "BaseRetriever" + ], + "display_name": "Chroma", + "documentation": "https://python.langchain.com/docs/integrations/vectorstores/chroma", + "custom_fields": { + "chroma_server_cors_allow_origins": null, + "chroma_server_grpc_port": null, + "chroma_server_host": null, + "chroma_server_port": null, + "chroma_server_ssl_enabled": null, + "collection_name": null, + "documents": null, + "embedding": null, + "persist": null, + "persist_directory": null + }, + "output_types": [ + "Chroma" + ], + "field_formatters": {}, + "beta": true + }, + "id": "Chroma-OtYDg" + }, + "selected": false, + "width": 384, + "height": 625, + "positionAbsolute": { + "x": -2194.2051907050227, + "y": -1370.1637632208287 + }, + "dragging": false + }, + { + "id": "OpenAIEmbeddings-9yqtI", + "type": "genericNode", + "position": { + "x": -2653.011009324626, + "y": -1103.8414515074774 + }, + "data": { + "type": "OpenAIEmbeddings", + "node": { + "template": { + "allowed_special": { + "type": "str", + "required": false, + "placeholder": "", + "list": true, + "show": true, + "multiline": false, + "value": [], + "fileTypes": [], + "password": false, + "name": "allowed_special", + "advanced": true, + "dynamic": false, + "info": "" + }, + "async_client": { + "type": "Any", + "required": false, + "placeholder": "", + "list": false, + "show": true, + "multiline": false, + "fileTypes": [], + "password": false, + "name": "async_client", + "advanced": true, + "dynamic": false, + "info": "" + }, + "chunk_size": { + "type": "int", + "required": false, + "placeholder": "", + "list": false, + "show": true, + "multiline": false, + "value": 1000, + "fileTypes": [], + "password": false, + "name": "chunk_size", + "advanced": true, + "dynamic": false, + "info": "" + }, + "client": { + "type": "Any", + "required": false, + "placeholder": "", + "list": false, + "show": true, + "multiline": false, + "fileTypes": [], + "password": false, + "name": "client", + "advanced": true, + "dynamic": false, + "info": "" + }, + "default_headers": { + "type": "dict", + "required": false, + "placeholder": "", + "list": false, + "show": true, + "multiline": false, + "fileTypes": [], + "password": false, + "name": "default_headers", + "advanced": true, + "dynamic": false, + "info": "" + }, + "default_query": { + "type": "dict", + "required": false, + "placeholder": "", + "list": false, + "show": true, + "multiline": false, + "fileTypes": [], + "password": false, + "name": "default_query", + "advanced": true, + "dynamic": false, + "info": "" + }, + "deployment": { + "type": "str", + "required": false, + "placeholder": "", + "list": false, + "show": true, + "multiline": false, + "value": "text-embedding-ada-002", + "fileTypes": [], + "password": false, + "name": "deployment", + "advanced": true, + "dynamic": false, + "info": "" + }, + "disallowed_special": { + "type": "str", + "required": false, + "placeholder": "", + "list": true, + "show": true, + "multiline": false, + "value": "all", + "fileTypes": [], + "password": false, + "name": "disallowed_special", + "advanced": true, + "dynamic": false, + "info": "" + }, + "embedding_ctx_length": { + "type": "int", + "required": false, + "placeholder": "", + "list": false, + "show": true, + "multiline": false, + "value": 8191, + "fileTypes": [], + "password": false, + "name": "embedding_ctx_length", + "advanced": true, + "dynamic": false, + "info": "" + }, + "headers": { + "type": "Any", + "required": false, + "placeholder": "", + "list": false, + "show": false, + "multiline": true, + "value": "{\"Authorization\": \"Bearer \"}", + "fileTypes": [], + "password": false, + "name": "headers", + "advanced": true, + "dynamic": false, + "info": "" + }, + "http_client": { + "type": "Any", + "required": false, + "placeholder": "", + "list": false, + "show": true, + "multiline": false, + "fileTypes": [], + "password": false, + "name": "http_client", + "advanced": true, + "dynamic": false, + "info": "" + }, + "max_retries": { + "type": "int", + "required": false, + "placeholder": "", + "list": false, + "show": true, + "multiline": false, + "value": 2, + "fileTypes": [], + "password": false, + "name": "max_retries", + "advanced": true, + "dynamic": false, + "info": "" + }, + "model": { + "type": "str", + "required": false, + "placeholder": "", + "list": false, + "show": true, + "multiline": false, + "value": "text-embedding-ada-002", + "fileTypes": [], + "password": false, + "name": "model", + "advanced": true, + "dynamic": false, + "info": "" + }, + "model_kwargs": { + "type": "dict", + "required": false, + "placeholder": "", + "list": false, + "show": true, + "multiline": false, + "fileTypes": [], + "password": false, + "name": "model_kwargs", + "advanced": true, + "dynamic": false, + "info": "" + }, + "openai_api_base": { + "type": "str", + "required": false, + "placeholder": "", + "list": false, + "show": true, + "multiline": false, + "fileTypes": [], + "password": true, + "name": "openai_api_base", + "display_name": "OpenAI API Base", + "advanced": true, + "dynamic": false, + "info": "", + "value": "" + }, + "openai_api_key": { + "type": "str", + "required": false, + "placeholder": "", + "list": false, + "show": true, + "multiline": false, + "value": "", + "fileTypes": [], + "password": true, + "name": "openai_api_key", + "display_name": "OpenAI API Key", + "advanced": false, + "dynamic": false, + "info": "" + }, + "openai_api_type": { + "type": "str", + "required": false, + "placeholder": "", + "list": false, + "show": true, + "multiline": false, + "fileTypes": [], + "password": true, + "name": "openai_api_type", + "display_name": "OpenAI API Type", + "advanced": true, + "dynamic": false, + "info": "", + "value": "" + }, + "openai_api_version": { + "type": "str", + "required": false, + "placeholder": "", + "list": false, + "show": true, + "multiline": false, + "fileTypes": [], + "password": true, + "name": "openai_api_version", + "display_name": "OpenAI API Version", + "advanced": true, + "dynamic": false, + "info": "", + "value": "" + }, + "openai_organization": { + "type": "str", + "required": false, + "placeholder": "", + "list": false, + "show": true, + "multiline": false, + "fileTypes": [], + "password": false, + "name": "openai_organization", + "display_name": "OpenAI Organization", + "advanced": true, + "dynamic": false, + "info": "" + }, + "openai_proxy": { + "type": "str", + "required": false, + "placeholder": "", + "list": false, + "show": true, + "multiline": false, + "fileTypes": [], + "password": false, + "name": "openai_proxy", + "display_name": "OpenAI Proxy", + "advanced": true, + "dynamic": false, + "info": "" + }, + "request_timeout": { + "type": "float", + "required": false, + "placeholder": "", + "list": false, + "show": true, + "multiline": false, + "fileTypes": [], + "password": false, + "name": "request_timeout", + "advanced": true, + "dynamic": false, + "info": "", + "rangeSpec": { + "min": -1, + "max": 1, + "step": 0.1 + } + }, + "retry_max_seconds": { + "type": "int", + "required": false, + "placeholder": "", + "list": false, + "show": true, + "multiline": false, + "value": 20, + "fileTypes": [], + "password": false, + "name": "retry_max_seconds", + "advanced": true, + "dynamic": false, + "info": "" + }, + "retry_min_seconds": { + "type": "int", + "required": false, + "placeholder": "", + "list": false, + "show": true, + "multiline": false, + "value": 4, + "fileTypes": [], + "password": false, + "name": "retry_min_seconds", + "advanced": true, + "dynamic": false, + "info": "" + }, + "show_progress_bar": { + "type": "bool", + "required": false, + "placeholder": "", + "list": false, + "show": true, + "multiline": false, + "value": false, + "fileTypes": [], + "password": false, + "name": "show_progress_bar", + "advanced": true, + "dynamic": false, + "info": "" + }, + "skip_empty": { + "type": "bool", + "required": false, + "placeholder": "", + "list": false, + "show": true, + "multiline": false, + "value": false, + "fileTypes": [], + "password": false, + "name": "skip_empty", + "advanced": true, + "dynamic": false, + "info": "" + }, + "tiktoken_enabled": { + "type": "bool", + "required": false, + "placeholder": "", + "list": false, + "show": true, + "multiline": false, + "value": "", + "fileTypes": [], + "password": true, + "name": "tiktoken_enabled", + "advanced": false, + "dynamic": false, + "info": "" + }, + "tiktoken_model_name": { + "type": "str", + "required": false, + "placeholder": "", + "list": false, + "show": true, + "multiline": false, + "fileTypes": [], + "password": true, + "name": "tiktoken_model_name", + "advanced": false, + "dynamic": false, + "info": "", + "value": "" + }, + "_type": "OpenAIEmbeddings" + }, + "description": "[*Deprecated*] OpenAI embedding models.", + "base_classes": [ + "Embeddings", + "OpenAIEmbeddings" + ], + "display_name": "OpenAIEmbeddings", + "documentation": "https://python.langchain.com/docs/modules/data_connection/text_embedding/integrations/openai", + "custom_fields": {}, + "output_types": [], + "field_formatters": {}, + "beta": false + }, + "id": "OpenAIEmbeddings-9yqtI" + }, + "selected": false, + "width": 384, + "height": 443, + "positionAbsolute": { + "x": -2653.011009324626, + "y": -1103.8414515074774 + }, + "dragging": false + }, + { + "id": "RetrievalQA-DpylI", + "type": "genericNode", + "position": { + "x": -1757.239471200792, + "y": -1258.2132589352987 + }, + "data": { + "type": "RetrievalQA", + "node": { + "template": { + "callbacks": { + "type": "langchain_core.callbacks.base.BaseCallbackHandler", + "required": false, + "placeholder": "", + "list": true, + "show": false, + "multiline": false, + "fileTypes": [], + "password": false, + "name": "callbacks", + "advanced": false, + "dynamic": false, + "info": "" + }, + "combine_documents_chain": { + "type": "BaseCombineDocumentsChain", + "required": true, + "placeholder": "", + "list": false, + "show": true, + "multiline": false, + "fileTypes": [], + "password": false, + "name": "combine_documents_chain", + "advanced": false, + "dynamic": false, + "info": "" + }, + "memory": { + "type": "BaseMemory", + "required": false, + "placeholder": "", + "list": false, + "show": true, + "multiline": false, + "fileTypes": [], + "password": false, + "name": "memory", + "advanced": false, + "dynamic": false, + "info": "" + }, + "retriever": { + "type": "BaseRetriever", + "required": true, + "placeholder": "", + "list": false, + "show": true, + "multiline": false, + "fileTypes": [], + "password": false, + "name": "retriever", + "advanced": false, + "dynamic": false, + "info": "" + }, + "input_key": { + "type": "str", + "required": true, + "placeholder": "", + "list": false, + "show": true, + "multiline": false, + "value": "query", + "fileTypes": [], + "password": false, + "name": "input_key", + "advanced": true, + "dynamic": false, + "info": "" + }, + "metadata": { + "type": "dict", + "required": false, + "placeholder": "", + "list": false, + "show": false, + "multiline": false, + "fileTypes": [], + "password": false, + "name": "metadata", + "advanced": false, + "dynamic": false, + "info": "" + }, + "name": { + "type": "str", + "required": false, + "placeholder": "", + "list": false, + "show": false, + "multiline": false, + "fileTypes": [], + "password": false, + "name": "name", + "advanced": false, + "dynamic": false, + "info": "" + }, + "output_key": { + "type": "str", + "required": true, + "placeholder": "", + "list": false, + "show": true, + "multiline": false, + "value": "result", + "fileTypes": [], + "password": false, + "name": "output_key", + "advanced": true, + "dynamic": false, + "info": "" + }, + "return_source_documents": { + "type": "bool", + "required": false, + "placeholder": "", + "list": false, + "show": true, + "multiline": false, + "value": true, + "fileTypes": [], + "password": false, + "name": "return_source_documents", + "advanced": true, + "dynamic": false, + "info": "" + }, + "tags": { + "type": "str", + "required": false, + "placeholder": "", + "list": true, + "show": false, + "multiline": false, + "fileTypes": [], + "password": false, + "name": "tags", + "advanced": false, + "dynamic": false, + "info": "" + }, + "verbose": { + "type": "bool", + "required": false, + "placeholder": "", + "list": false, + "show": false, + "multiline": false, + "fileTypes": [], + "password": false, + "name": "verbose", + "advanced": true, + "dynamic": false, + "info": "" + }, + "_type": "RetrievalQA" + }, + "description": "Chain for question-answering against an index.", + "base_classes": [ + "Chain", + "RetrievalQA", + "BaseRetrievalQA", + "Callable" + ], + "display_name": "RetrievalQA", + "documentation": "https://python.langchain.com/docs/modules/chains/popular/vector_db_qa", + "custom_fields": {}, + "output_types": [], + "field_formatters": {}, + "beta": false + }, + "id": "RetrievalQA-DpylI" + }, + "selected": false, + "width": 384, + "height": 339, + "positionAbsolute": { + "x": -1757.239471200792, + "y": -1258.2132589352987 + }, + "dragging": true + }, + { + "id": "CombineDocsChain-afKOq", + "type": "genericNode", + "position": { + "x": -1775.9040057312934, + "y": -1644.0423777157919 + }, + "data": { + "type": "CombineDocsChain", + "node": { + "template": { + "llm": { + "type": "BaseLanguageModel", + "required": true, + "placeholder": "", + "list": false, + "show": true, + "multiline": false, + "value": "", + "fileTypes": [], + "file_path": "", + "password": false, + "name": "llm", + "display_name": "LLM", + "advanced": false, + "dynamic": false, + "info": "" + }, + "chain_type": { + "type": "str", + "required": true, + "placeholder": "", + "list": true, + "show": true, + "multiline": false, + "value": "refine", + "fileTypes": [], + "file_path": "", + "password": false, + "options": [ + "stuff", + "map_reduce", + "map_rerank", + "refine" + ], + "name": "chain_type", + "advanced": false, + "dynamic": false, + "info": "" + }, + "_type": "load_qa_chain" + }, + "description": "Load question answering chain.", + "base_classes": [ + "BaseCombineDocumentsChain", + "Callable" + ], + "display_name": "CombineDocsChain", + "documentation": "", + "custom_fields": {}, + "output_types": [], + "field_formatters": {}, + "beta": false + }, + "id": "CombineDocsChain-afKOq" + }, + "selected": false, + "width": 384, + "height": 333, + "dragging": false, + "positionAbsolute": { + "x": -1775.9040057312934, + "y": -1644.0423777157919 + } + }, + { + "id": "SearchApi-kZmEj", + "type": "genericNode", + "position": { + "x": -3074.364183247263, + "y": -1782.5742787937606 + }, + "data": { + "type": "SearchApi", + "node": { + "template": { + "api_key": { + "type": "str", + "required": true, + "placeholder": "", + "list": false, + "show": true, + "multiline": false, + "fileTypes": [], + "file_path": "", + "password": true, + "name": "api_key", + "display_name": "API Key", + "advanced": false, + "dynamic": false, + "info": "The API key to use SearchApi.", + "value": "" + }, + "code": { + "type": "code", + "required": true, + "placeholder": "", + "list": false, + "show": true, + "multiline": true, + "value": "from langflow.custom import CustomComponent\nfrom langchain.schema import Document\nfrom langflow.services.database.models.base import orjson_dumps\nfrom langchain_community.utilities.searchapi import SearchApiAPIWrapper\nfrom typing import Optional\n\n\nclass SearchApi(CustomComponent):\n display_name: str = \"SearchApi\"\n description: str = \"Real-time search engines API.\"\n output_types: list[str] = [\"Document\"]\n documentation: str = \"https://www.searchapi.io/docs/google\"\n field_config = {\n \"engine\": {\n \"display_name\": \"Engine\",\n \"field_type\": \"str\",\n \"info\": \"The search engine to use.\",\n },\n \"params\": {\n \"display_name\": \"Parameters\",\n \"info\": \"The parameters to send with the request.\",\n },\n \"code\": {\"show\": False},\n \"api_key\": {\n \"display_name\": \"API Key\",\n \"field_type\": \"str\",\n \"required\": True, \n \"password\": True,\n \"info\": \"The API key to use SearchApi.\",\n },\n }\n\n def build(\n self,\n engine: str,\n api_key: str,\n params: Optional[dict] = None,\n ) -> Document:\n if params is None:\n params = {}\n\n search_api_wrapper = SearchApiAPIWrapper(engine=engine, searchapi_api_key=api_key)\n\n query = params.pop(\"query\", \"default query\") \n results = search_api_wrapper.results(query, **params)\n\n result = orjson_dumps(results, indent_2=False)\n \n document = Document(page_content=result) \n\n return document", + "fileTypes": [], + "file_path": "", + "password": false, + "name": "code", + "advanced": false, + "dynamic": true, + "info": "" + }, + "engine": { + "type": "str", + "required": true, + "placeholder": "", + "list": false, + "show": true, + "multiline": false, + "fileTypes": [], + "file_path": "", + "password": false, + "name": "engine", + "display_name": "Engine", + "advanced": false, + "dynamic": false, + "info": "The search engine to use.", + "value": "youtube_transcripts" + }, + "params": { + "type": "dict", + "required": false, + "placeholder": "", + "list": false, + "show": true, + "multiline": false, + "fileTypes": [], + "file_path": "", + "password": false, + "name": "params", + "display_name": "Parameters", + "advanced": false, + "dynamic": false, + "info": "The parameters to send with the request.", + "value": [ + { + "video_id": "krsBRQbOPQ4" + } + ] + }, + "_type": "CustomComponent" + }, + "description": "Real-time search engines API.", + "base_classes": [ + "Document" + ], + "display_name": "SearchApi", + "documentation": "https://www.searchapi.io/docs/google", + "custom_fields": { + "api_key": null, + "engine": null, + "params": null + }, + "output_types": [ + "SearchApi" + ], + "field_formatters": {}, + "beta": true + }, + "id": "SearchApi-kZmEj" + }, + "selected": false, + "width": 384, + "height": 539, + "dragging": false, + "positionAbsolute": { + "x": -3074.364183247263, + "y": -1782.5742787937606 + } + } + ], + "edges": [ + { + "source": "CharacterTextSplitter-WVMFU", + "sourceHandle": "{œbaseClassesœ:[œDocumentœ],œdataTypeœ:œCharacterTextSplitterœ,œidœ:œCharacterTextSplitter-WVMFUœ}", + "target": "Chroma-OtYDg", + "targetHandle": "{œfieldNameœ:œdocumentsœ,œidœ:œChroma-OtYDgœ,œinputTypesœ:null,œtypeœ:œDocumentœ}", + "data": { + "targetHandle": { + "fieldName": "documents", + "id": "Chroma-OtYDg", + "inputTypes": null, + "type": "Document" + }, + "sourceHandle": { + "baseClasses": [ + "Document" + ], + "dataType": "CharacterTextSplitter", + "id": "CharacterTextSplitter-WVMFU" + } + }, + "style": { + "stroke": "#555" + }, + "className": "stroke-gray-900 stroke-connection", + "animated": false, + "id": "reactflow__edge-CharacterTextSplitter-WVMFU{œbaseClassesœ:[œDocumentœ],œdataTypeœ:œCharacterTextSplitterœ,œidœ:œCharacterTextSplitter-WVMFUœ}-Chroma-OtYDg{œfieldNameœ:œdocumentsœ,œidœ:œChroma-OtYDgœ,œinputTypesœ:null,œtypeœ:œDocumentœ}" + }, + { + "source": "OpenAIEmbeddings-9yqtI", + "sourceHandle": "{œbaseClassesœ:[œEmbeddingsœ,œOpenAIEmbeddingsœ],œdataTypeœ:œOpenAIEmbeddingsœ,œidœ:œOpenAIEmbeddings-9yqtIœ}", + "target": "Chroma-OtYDg", + "targetHandle": "{œfieldNameœ:œembeddingœ,œidœ:œChroma-OtYDgœ,œinputTypesœ:null,œtypeœ:œEmbeddingsœ}", + "data": { + "targetHandle": { + "fieldName": "embedding", + "id": "Chroma-OtYDg", + "inputTypes": null, + "type": "Embeddings" + }, + "sourceHandle": { + "baseClasses": [ + "Embeddings", + "OpenAIEmbeddings" + ], + "dataType": "OpenAIEmbeddings", + "id": "OpenAIEmbeddings-9yqtI" + } + }, + "style": { + "stroke": "#555" + }, + "className": "stroke-gray-900 stroke-connection", + "animated": false, + "id": "reactflow__edge-OpenAIEmbeddings-9yqtI{œbaseClassesœ:[œEmbeddingsœ,œOpenAIEmbeddingsœ],œdataTypeœ:œOpenAIEmbeddingsœ,œidœ:œOpenAIEmbeddings-9yqtIœ}-Chroma-OtYDg{œfieldNameœ:œembeddingœ,œidœ:œChroma-OtYDgœ,œinputTypesœ:null,œtypeœ:œEmbeddingsœ}" + }, + { + "source": "Chroma-OtYDg", + "sourceHandle": "{œbaseClassesœ:[œVectorStoreœ,œBaseRetrieverœ],œdataTypeœ:œChromaœ,œidœ:œChroma-OtYDgœ}", + "target": "RetrievalQA-DpylI", + "targetHandle": "{œfieldNameœ:œretrieverœ,œidœ:œRetrievalQA-DpylIœ,œinputTypesœ:null,œtypeœ:œBaseRetrieverœ}", + "data": { + "targetHandle": { + "fieldName": "retriever", + "id": "RetrievalQA-DpylI", + "inputTypes": null, + "type": "BaseRetriever" + }, + "sourceHandle": { + "baseClasses": [ + "VectorStore", + "BaseRetriever" + ], + "dataType": "Chroma", + "id": "Chroma-OtYDg" + } + }, + "style": { + "stroke": "#555" + }, + "className": "stroke-gray-900 stroke-connection", + "animated": false, + "id": "reactflow__edge-Chroma-OtYDg{œbaseClassesœ:[œVectorStoreœ,œBaseRetrieverœ],œdataTypeœ:œChromaœ,œidœ:œChroma-OtYDgœ}-RetrievalQA-DpylI{œfieldNameœ:œretrieverœ,œidœ:œRetrievalQA-DpylIœ,œinputTypesœ:null,œtypeœ:œBaseRetrieverœ}" + }, + { + "source": "ChatOpenAI-4Mfuz", + "sourceHandle": "{œbaseClassesœ:[œBaseLanguageModelœ,œBaseChatModelœ,œChatOpenAIœ,œBaseLLMœ],œdataTypeœ:œChatOpenAIœ,œidœ:œChatOpenAI-4Mfuzœ}", + "target": "CombineDocsChain-afKOq", + "targetHandle": "{œfieldNameœ:œllmœ,œidœ:œCombineDocsChain-afKOqœ,œinputTypesœ:null,œtypeœ:œBaseLanguageModelœ}", + "data": { + "targetHandle": { + "fieldName": "llm", + "id": "CombineDocsChain-afKOq", + "inputTypes": null, + "type": "BaseLanguageModel" + }, + "sourceHandle": { + "baseClasses": [ + "BaseLanguageModel", + "BaseChatModel", + "ChatOpenAI", + "BaseLLM" + ], + "dataType": "ChatOpenAI", + "id": "ChatOpenAI-4Mfuz" + } + }, + "style": { + "stroke": "#555" + }, + "className": "stroke-gray-900 stroke-connection", + "animated": false, + "id": "reactflow__edge-ChatOpenAI-4Mfuz{œbaseClassesœ:[œBaseLanguageModelœ,œBaseChatModelœ,œChatOpenAIœ,œBaseLLMœ],œdataTypeœ:œChatOpenAIœ,œidœ:œChatOpenAI-4Mfuzœ}-CombineDocsChain-afKOq{œfieldNameœ:œllmœ,œidœ:œCombineDocsChain-afKOqœ,œinputTypesœ:null,œtypeœ:œBaseLanguageModelœ}" + }, + { + "source": "CombineDocsChain-afKOq", + "sourceHandle": "{œbaseClassesœ:[œBaseCombineDocumentsChainœ,œCallableœ],œdataTypeœ:œCombineDocsChainœ,œidœ:œCombineDocsChain-afKOqœ}", + "target": "RetrievalQA-DpylI", + "targetHandle": "{œfieldNameœ:œcombine_documents_chainœ,œidœ:œRetrievalQA-DpylIœ,œinputTypesœ:null,œtypeœ:œBaseCombineDocumentsChainœ}", + "data": { + "targetHandle": { + "fieldName": "combine_documents_chain", + "id": "RetrievalQA-DpylI", + "inputTypes": null, + "type": "BaseCombineDocumentsChain" + }, + "sourceHandle": { + "baseClasses": [ + "BaseCombineDocumentsChain", + "Callable" + ], + "dataType": "CombineDocsChain", + "id": "CombineDocsChain-afKOq" + } + }, + "style": { + "stroke": "#555" + }, + "className": "stroke-gray-900 stroke-connection", + "animated": false, + "id": "reactflow__edge-CombineDocsChain-afKOq{œbaseClassesœ:[œBaseCombineDocumentsChainœ,œCallableœ],œdataTypeœ:œCombineDocsChainœ,œidœ:œCombineDocsChain-afKOqœ}-RetrievalQA-DpylI{œfieldNameœ:œcombine_documents_chainœ,œidœ:œRetrievalQA-DpylIœ,œinputTypesœ:null,œtypeœ:œBaseCombineDocumentsChainœ}" + }, + { + "source": "SearchApi-kZmEj", + "sourceHandle": "{œbaseClassesœ:[œDocumentœ],œdataTypeœ:œSearchApiœ,œidœ:œSearchApi-kZmEjœ}", + "target": "CharacterTextSplitter-WVMFU", + "targetHandle": "{œfieldNameœ:œdocumentsœ,œidœ:œCharacterTextSplitter-WVMFUœ,œinputTypesœ:null,œtypeœ:œDocumentœ}", + "data": { + "targetHandle": { + "fieldName": "documents", + "id": "CharacterTextSplitter-WVMFU", + "inputTypes": null, + "type": "Document" + }, + "sourceHandle": { + "baseClasses": [ + "Document" + ], + "dataType": "SearchApi", + "id": "SearchApi-kZmEj" + } + }, + "style": { + "stroke": "#555" + }, + "className": "stroke-gray-900 stroke-connection", + "animated": false, + "id": "reactflow__edge-SearchApi-kZmEj{œbaseClassesœ:[œDocumentœ],œdataTypeœ:œSearchApiœ,œidœ:œSearchApi-kZmEjœ}-CharacterTextSplitter-WVMFU{œfieldNameœ:œdocumentsœ,œidœ:œCharacterTextSplitter-WVMFUœ,œinputTypesœ:null,œtypeœ:œDocumentœ}" + } + ], + "viewport": { + "x": 2046.3642433866817, + "y": 1270.2852546488134, + "zoom": 0.6177254407441625 + } + }, + "description": "Real-time Google Search engine q&a.", + "name": "SearchApi Tool", + "last_tested_version": "0.6.5a9", + "is_component": false +} \ No newline at end of file diff --git a/poetry.lock b/poetry.lock index cd1c50bb8..a23c1f8b6 100644 --- a/poetry.lock +++ b/poetry.lock @@ -3868,6 +3868,51 @@ files = [ [package.dependencies] six = "*" +[[package]] +name = "langflow-base" +version = "0.0.11" +description = "A Python package with a built-in web application" +optional = false +python-versions = ">=3.9,<3.12" +files = [] +develop = true + +[package.dependencies] +alembic = "^1.13.0" +bcrypt = "4.0.1" +cachetools = "^5.3.1" +docstring-parser = "^0.15" +fastapi = "^0.109.0" +gunicorn = "^21.2.0" +httpx = "^0.24.0" +langchain = "~0.1.0" +langchain-experimental = "*" +loguru = "^0.7.1" +multiprocess = "^0.70.14" +orjson = "3.9.15" +pandas = "2.2.0" +passlib = "^1.7.4" +pillow = "^10.2.0" +platformdirs = "^4.2.0" +pydantic = "^2.5.0" +pydantic-settings = "^2.1.0" +python-jose = "^3.3.0" +python-multipart = "^0.0.7" +rich = "^13.7.0" +sqlmodel = "^0.0.14" +typer = "^0.9.0" +uvicorn = "^0.27.0" +websockets = "^10.3" + +[package.extras] +all = [] +deploy = [] +local = [] + +[package.source] +type = "directory" +url = "src/backend/base" + [[package]] name = "langfuse" version = "2.21.1" @@ -7011,24 +7056,6 @@ tomli = {version = ">=1", markers = "python_version < \"3.11\""} [package.extras] testing = ["argcomplete", "attrs (>=19.2)", "hypothesis (>=3.56)", "mock", "pygments (>=2.7.2)", "requests", "setuptools", "xmlschema"] -[[package]] -name = "pytest-asyncio" -version = "0.23.6" -description = "Pytest support for asyncio" -optional = false -python-versions = ">=3.8" -files = [ - {file = "pytest-asyncio-0.23.6.tar.gz", hash = "sha256:ffe523a89c1c222598c76856e76852b787504ddb72dd5d9b6617ffa8aa2cde5f"}, - {file = "pytest_asyncio-0.23.6-py3-none-any.whl", hash = "sha256:68516fdd1018ac57b846c9846b954f0393b26f094764a28c955eabb0536a4e8a"}, -] - -[package.dependencies] -pytest = ">=7.0.0,<9" - -[package.extras] -docs = ["sphinx (>=5.3)", "sphinx-rtd-theme (>=1.0)"] -testing = ["coverage (>=6.2)", "hypothesis (>=5.7.1)"] - [[package]] name = "pytest-cov" version = "4.1.0" @@ -7632,19 +7659,19 @@ full = ["numpy"] [[package]] name = "realtime" -version = "1.0.2" +version = "1.0.0" description = "" optional = false python-versions = ">=3.8,<4.0" files = [ - {file = "realtime-1.0.2-py3-none-any.whl", hash = "sha256:8f8375199fd917cd0ded818702321f91b208ab72794ade0a33cee9d55ae30f11"}, - {file = "realtime-1.0.2.tar.gz", hash = "sha256:776170a4329edc869b91e104c554cda02c8bf8e052cbb93c377e22482870959c"}, + {file = "realtime-1.0.0-py3-none-any.whl", hash = "sha256:ceab9e292211ab08b5792ac52b3fa25398440031d5b369bd5799b8125056e2d8"}, + {file = "realtime-1.0.0.tar.gz", hash = "sha256:14e540c4a0cc2736ae83e0cbd7efbbfb8b736df1681df2b9141556cb4848502d"}, ] [package.dependencies] python-dateutil = ">=2.8.1,<3.0.0" typing-extensions = ">=4.2.0,<5.0.0" -websockets = ">=11.0,<12.0" +websockets = ">=10.3,<11.0" [[package]] name = "red-black-tree-mod" @@ -9595,81 +9622,80 @@ test = ["websockets"] [[package]] name = "websockets" -version = "11.0.3" +version = "10.4" description = "An implementation of the WebSocket Protocol (RFC 6455 & 7692)" optional = false python-versions = ">=3.7" files = [ - {file = "websockets-11.0.3-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:3ccc8a0c387629aec40f2fc9fdcb4b9d5431954f934da3eaf16cdc94f67dbfac"}, - {file = "websockets-11.0.3-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:d67ac60a307f760c6e65dad586f556dde58e683fab03323221a4e530ead6f74d"}, - {file = "websockets-11.0.3-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:84d27a4832cc1a0ee07cdcf2b0629a8a72db73f4cf6de6f0904f6661227f256f"}, - {file = "websockets-11.0.3-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:ffd7dcaf744f25f82190856bc26ed81721508fc5cbf2a330751e135ff1283564"}, - {file = "websockets-11.0.3-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:7622a89d696fc87af8e8d280d9b421db5133ef5b29d3f7a1ce9f1a7bf7fcfa11"}, - {file = "websockets-11.0.3-cp310-cp310-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:bceab846bac555aff6427d060f2fcfff71042dba6f5fca7dc4f75cac815e57ca"}, - {file = "websockets-11.0.3-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:54c6e5b3d3a8936a4ab6870d46bdd6ec500ad62bde9e44462c32d18f1e9a8e54"}, - {file = "websockets-11.0.3-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:41f696ba95cd92dc047e46b41b26dd24518384749ed0d99bea0a941ca87404c4"}, - {file = "websockets-11.0.3-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:86d2a77fd490ae3ff6fae1c6ceaecad063d3cc2320b44377efdde79880e11526"}, - {file = "websockets-11.0.3-cp310-cp310-win32.whl", hash = "sha256:2d903ad4419f5b472de90cd2d40384573b25da71e33519a67797de17ef849b69"}, - {file = "websockets-11.0.3-cp310-cp310-win_amd64.whl", hash = "sha256:1d2256283fa4b7f4c7d7d3e84dc2ece74d341bce57d5b9bf385df109c2a1a82f"}, - {file = "websockets-11.0.3-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:e848f46a58b9fcf3d06061d17be388caf70ea5b8cc3466251963c8345e13f7eb"}, - {file = "websockets-11.0.3-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:aa5003845cdd21ac0dc6c9bf661c5beddd01116f6eb9eb3c8e272353d45b3288"}, - {file = "websockets-11.0.3-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:b58cbf0697721120866820b89f93659abc31c1e876bf20d0b3d03cef14faf84d"}, - {file = "websockets-11.0.3-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:660e2d9068d2bedc0912af508f30bbeb505bbbf9774d98def45f68278cea20d3"}, - {file = "websockets-11.0.3-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:c1f0524f203e3bd35149f12157438f406eff2e4fb30f71221c8a5eceb3617b6b"}, - {file = "websockets-11.0.3-cp311-cp311-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:def07915168ac8f7853812cc593c71185a16216e9e4fa886358a17ed0fd9fcf6"}, - {file = "websockets-11.0.3-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:b30c6590146e53149f04e85a6e4fcae068df4289e31e4aee1fdf56a0dead8f97"}, - {file = "websockets-11.0.3-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:619d9f06372b3a42bc29d0cd0354c9bb9fb39c2cbc1a9c5025b4538738dbffaf"}, - {file = "websockets-11.0.3-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:01f5567d9cf6f502d655151645d4e8b72b453413d3819d2b6f1185abc23e82dd"}, - {file = "websockets-11.0.3-cp311-cp311-win32.whl", hash = "sha256:e1459677e5d12be8bbc7584c35b992eea142911a6236a3278b9b5ce3326f282c"}, - {file = "websockets-11.0.3-cp311-cp311-win_amd64.whl", hash = "sha256:e7837cb169eca3b3ae94cc5787c4fed99eef74c0ab9506756eea335e0d6f3ed8"}, - {file = "websockets-11.0.3-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:9f59a3c656fef341a99e3d63189852be7084c0e54b75734cde571182c087b152"}, - {file = "websockets-11.0.3-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:2529338a6ff0eb0b50c7be33dc3d0e456381157a31eefc561771ee431134a97f"}, - {file = "websockets-11.0.3-cp37-cp37m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:34fd59a4ac42dff6d4681d8843217137f6bc85ed29722f2f7222bd619d15e95b"}, - {file = "websockets-11.0.3-cp37-cp37m-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:332d126167ddddec94597c2365537baf9ff62dfcc9db4266f263d455f2f031cb"}, - {file = "websockets-11.0.3-cp37-cp37m-musllinux_1_1_aarch64.whl", hash = "sha256:6505c1b31274723ccaf5f515c1824a4ad2f0d191cec942666b3d0f3aa4cb4007"}, - {file = "websockets-11.0.3-cp37-cp37m-musllinux_1_1_i686.whl", hash = "sha256:f467ba0050b7de85016b43f5a22b46383ef004c4f672148a8abf32bc999a87f0"}, - {file = "websockets-11.0.3-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:9d9acd80072abcc98bd2c86c3c9cd4ac2347b5a5a0cae7ed5c0ee5675f86d9af"}, - {file = "websockets-11.0.3-cp37-cp37m-win32.whl", hash = "sha256:e590228200fcfc7e9109509e4d9125eace2042fd52b595dd22bbc34bb282307f"}, - {file = "websockets-11.0.3-cp37-cp37m-win_amd64.whl", hash = "sha256:b16fff62b45eccb9c7abb18e60e7e446998093cdcb50fed33134b9b6878836de"}, - {file = "websockets-11.0.3-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:fb06eea71a00a7af0ae6aefbb932fb8a7df3cb390cc217d51a9ad7343de1b8d0"}, - {file = "websockets-11.0.3-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:8a34e13a62a59c871064dfd8ffb150867e54291e46d4a7cf11d02c94a5275bae"}, - {file = "websockets-11.0.3-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:4841ed00f1026dfbced6fca7d963c4e7043aa832648671b5138008dc5a8f6d99"}, - {file = "websockets-11.0.3-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:1a073fc9ab1c8aff37c99f11f1641e16da517770e31a37265d2755282a5d28aa"}, - {file = "websockets-11.0.3-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:68b977f21ce443d6d378dbd5ca38621755f2063d6fdb3335bda981d552cfff86"}, - {file = "websockets-11.0.3-cp38-cp38-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:e1a99a7a71631f0efe727c10edfba09ea6bee4166a6f9c19aafb6c0b5917d09c"}, - {file = "websockets-11.0.3-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:bee9fcb41db2a23bed96c6b6ead6489702c12334ea20a297aa095ce6d31370d0"}, - {file = "websockets-11.0.3-cp38-cp38-musllinux_1_1_i686.whl", hash = "sha256:4b253869ea05a5a073ebfdcb5cb3b0266a57c3764cf6fe114e4cd90f4bfa5f5e"}, - {file = "websockets-11.0.3-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:1553cb82942b2a74dd9b15a018dce645d4e68674de2ca31ff13ebc2d9f283788"}, - {file = "websockets-11.0.3-cp38-cp38-win32.whl", hash = "sha256:f61bdb1df43dc9c131791fbc2355535f9024b9a04398d3bd0684fc16ab07df74"}, - {file = "websockets-11.0.3-cp38-cp38-win_amd64.whl", hash = "sha256:03aae4edc0b1c68498f41a6772d80ac7c1e33c06c6ffa2ac1c27a07653e79d6f"}, - {file = "websockets-11.0.3-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:777354ee16f02f643a4c7f2b3eff8027a33c9861edc691a2003531f5da4f6bc8"}, - {file = "websockets-11.0.3-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:8c82f11964f010053e13daafdc7154ce7385ecc538989a354ccc7067fd7028fd"}, - {file = "websockets-11.0.3-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:3580dd9c1ad0701169e4d6fc41e878ffe05e6bdcaf3c412f9d559389d0c9e016"}, - {file = "websockets-11.0.3-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:6f1a3f10f836fab6ca6efa97bb952300b20ae56b409414ca85bff2ad241d2a61"}, - {file = "websockets-11.0.3-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:df41b9bc27c2c25b486bae7cf42fccdc52ff181c8c387bfd026624a491c2671b"}, - {file = "websockets-11.0.3-cp39-cp39-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:279e5de4671e79a9ac877427f4ac4ce93751b8823f276b681d04b2156713b9dd"}, - {file = "websockets-11.0.3-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:1fdf26fa8a6a592f8f9235285b8affa72748dc12e964a5518c6c5e8f916716f7"}, - {file = "websockets-11.0.3-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:69269f3a0b472e91125b503d3c0b3566bda26da0a3261c49f0027eb6075086d1"}, - {file = "websockets-11.0.3-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:97b52894d948d2f6ea480171a27122d77af14ced35f62e5c892ca2fae9344311"}, - {file = "websockets-11.0.3-cp39-cp39-win32.whl", hash = "sha256:c7f3cb904cce8e1be667c7e6fef4516b98d1a6a0635a58a57528d577ac18a128"}, - {file = "websockets-11.0.3-cp39-cp39-win_amd64.whl", hash = "sha256:c792ea4eabc0159535608fc5658a74d1a81020eb35195dd63214dcf07556f67e"}, - {file = "websockets-11.0.3-pp37-pypy37_pp73-macosx_10_9_x86_64.whl", hash = "sha256:f2e58f2c36cc52d41f2659e4c0cbf7353e28c8c9e63e30d8c6d3494dc9fdedcf"}, - {file = "websockets-11.0.3-pp37-pypy37_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:de36fe9c02995c7e6ae6efe2e205816f5f00c22fd1fbf343d4d18c3d5ceac2f5"}, - {file = "websockets-11.0.3-pp37-pypy37_pp73-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:0ac56b661e60edd453585f4bd68eb6a29ae25b5184fd5ba51e97652580458998"}, - {file = "websockets-11.0.3-pp37-pypy37_pp73-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:e052b8467dd07d4943936009f46ae5ce7b908ddcac3fda581656b1b19c083d9b"}, - {file = "websockets-11.0.3-pp37-pypy37_pp73-win_amd64.whl", hash = "sha256:42cc5452a54a8e46a032521d7365da775823e21bfba2895fb7b77633cce031bb"}, - {file = "websockets-11.0.3-pp38-pypy38_pp73-macosx_10_9_x86_64.whl", hash = "sha256:e6316827e3e79b7b8e7d8e3b08f4e331af91a48e794d5d8b099928b6f0b85f20"}, - {file = "websockets-11.0.3-pp38-pypy38_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:8531fdcad636d82c517b26a448dcfe62f720e1922b33c81ce695d0edb91eb931"}, - {file = "websockets-11.0.3-pp38-pypy38_pp73-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:c114e8da9b475739dde229fd3bc6b05a6537a88a578358bc8eb29b4030fac9c9"}, - {file = "websockets-11.0.3-pp38-pypy38_pp73-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:e063b1865974611313a3849d43f2c3f5368093691349cf3c7c8f8f75ad7cb280"}, - {file = "websockets-11.0.3-pp38-pypy38_pp73-win_amd64.whl", hash = "sha256:92b2065d642bf8c0a82d59e59053dd2fdde64d4ed44efe4870fa816c1232647b"}, - {file = "websockets-11.0.3-pp39-pypy39_pp73-macosx_10_9_x86_64.whl", hash = "sha256:0ee68fe502f9031f19d495dae2c268830df2760c0524cbac5d759921ba8c8e82"}, - {file = "websockets-11.0.3-pp39-pypy39_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:dcacf2c7a6c3a84e720d1bb2b543c675bf6c40e460300b628bab1b1efc7c034c"}, - {file = "websockets-11.0.3-pp39-pypy39_pp73-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:b67c6f5e5a401fc56394f191f00f9b3811fe843ee93f4a70df3c389d1adf857d"}, - {file = "websockets-11.0.3-pp39-pypy39_pp73-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:1d5023a4b6a5b183dc838808087033ec5df77580485fc533e7dab2567851b0a4"}, - {file = "websockets-11.0.3-pp39-pypy39_pp73-win_amd64.whl", hash = "sha256:ed058398f55163a79bb9f06a90ef9ccc063b204bb346c4de78efc5d15abfe602"}, - {file = "websockets-11.0.3-py3-none-any.whl", hash = "sha256:6681ba9e7f8f3b19440921e99efbb40fc89f26cd71bf539e45d8c8a25c976dc6"}, - {file = "websockets-11.0.3.tar.gz", hash = "sha256:88fc51d9a26b10fc331be344f1781224a375b78488fc343620184e95a4b27016"}, + {file = "websockets-10.4-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:d58804e996d7d2307173d56c297cf7bc132c52df27a3efaac5e8d43e36c21c48"}, + {file = "websockets-10.4-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:bc0b82d728fe21a0d03e65f81980abbbcb13b5387f733a1a870672c5be26edab"}, + {file = "websockets-10.4-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:ba089c499e1f4155d2a3c2a05d2878a3428cf321c848f2b5a45ce55f0d7d310c"}, + {file = "websockets-10.4-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:33d69ca7612f0ddff3316b0c7b33ca180d464ecac2d115805c044bf0a3b0d032"}, + {file = "websockets-10.4-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:62e627f6b6d4aed919a2052efc408da7a545c606268d5ab5bfab4432734b82b4"}, + {file = "websockets-10.4-cp310-cp310-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:38ea7b82bfcae927eeffc55d2ffa31665dc7fec7b8dc654506b8e5a518eb4d50"}, + {file = "websockets-10.4-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:e0cb5cc6ece6ffa75baccfd5c02cffe776f3f5c8bf486811f9d3ea3453676ce8"}, + {file = "websockets-10.4-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:ae5e95cfb53ab1da62185e23b3130e11d64431179debac6dc3c6acf08760e9b1"}, + {file = "websockets-10.4-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:7c584f366f46ba667cfa66020344886cf47088e79c9b9d39c84ce9ea98aaa331"}, + {file = "websockets-10.4-cp310-cp310-win32.whl", hash = "sha256:b029fb2032ae4724d8ae8d4f6b363f2cc39e4c7b12454df8df7f0f563ed3e61a"}, + {file = "websockets-10.4-cp310-cp310-win_amd64.whl", hash = "sha256:8dc96f64ae43dde92530775e9cb169979f414dcf5cff670455d81a6823b42089"}, + {file = "websockets-10.4-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:47a2964021f2110116cc1125b3e6d87ab5ad16dea161949e7244ec583b905bb4"}, + {file = "websockets-10.4-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:e789376b52c295c4946403bd0efecf27ab98f05319df4583d3c48e43c7342c2f"}, + {file = "websockets-10.4-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:7d3f0b61c45c3fa9a349cf484962c559a8a1d80dae6977276df8fd1fa5e3cb8c"}, + {file = "websockets-10.4-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:f55b5905705725af31ccef50e55391621532cd64fbf0bc6f4bac935f0fccec46"}, + {file = "websockets-10.4-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:00c870522cdb69cd625b93f002961ffb0c095394f06ba8c48f17eef7c1541f96"}, + {file = "websockets-10.4-cp311-cp311-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:8f38706e0b15d3c20ef6259fd4bc1700cd133b06c3c1bb108ffe3f8947be15fa"}, + {file = "websockets-10.4-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:f2c38d588887a609191d30e902df2a32711f708abfd85d318ca9b367258cfd0c"}, + {file = "websockets-10.4-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:fe10ddc59b304cb19a1bdf5bd0a7719cbbc9fbdd57ac80ed436b709fcf889106"}, + {file = "websockets-10.4-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:90fcf8929836d4a0e964d799a58823547df5a5e9afa83081761630553be731f9"}, + {file = "websockets-10.4-cp311-cp311-win32.whl", hash = "sha256:b9968694c5f467bf67ef97ae7ad4d56d14be2751000c1207d31bf3bb8860bae8"}, + {file = "websockets-10.4-cp311-cp311-win_amd64.whl", hash = "sha256:a7a240d7a74bf8d5cb3bfe6be7f21697a28ec4b1a437607bae08ac7acf5b4882"}, + {file = "websockets-10.4-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:74de2b894b47f1d21cbd0b37a5e2b2392ad95d17ae983e64727e18eb281fe7cb"}, + {file = "websockets-10.4-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:e3a686ecb4aa0d64ae60c9c9f1a7d5d46cab9bfb5d91a2d303d00e2cd4c4c5cc"}, + {file = "websockets-10.4-cp37-cp37m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:b0d15c968ea7a65211e084f523151dbf8ae44634de03c801b8bd070b74e85033"}, + {file = "websockets-10.4-cp37-cp37m-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:00213676a2e46b6ebf6045bc11d0f529d9120baa6f58d122b4021ad92adabd41"}, + {file = "websockets-10.4-cp37-cp37m-musllinux_1_1_aarch64.whl", hash = "sha256:e23173580d740bf8822fd0379e4bf30aa1d5a92a4f252d34e893070c081050df"}, + {file = "websockets-10.4-cp37-cp37m-musllinux_1_1_i686.whl", hash = "sha256:dd500e0a5e11969cdd3320935ca2ff1e936f2358f9c2e61f100a1660933320ea"}, + {file = "websockets-10.4-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:4239b6027e3d66a89446908ff3027d2737afc1a375f8fd3eea630a4842ec9a0c"}, + {file = "websockets-10.4-cp37-cp37m-win32.whl", hash = "sha256:8a5cc00546e0a701da4639aa0bbcb0ae2bb678c87f46da01ac2d789e1f2d2038"}, + {file = "websockets-10.4-cp37-cp37m-win_amd64.whl", hash = "sha256:a9f9a735deaf9a0cadc2d8c50d1a5bcdbae8b6e539c6e08237bc4082d7c13f28"}, + {file = "websockets-10.4-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:5c1289596042fad2cdceb05e1ebf7aadf9995c928e0da2b7a4e99494953b1b94"}, + {file = "websockets-10.4-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:0cff816f51fb33c26d6e2b16b5c7d48eaa31dae5488ace6aae468b361f422b63"}, + {file = "websockets-10.4-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:dd9becd5fe29773d140d68d607d66a38f60e31b86df75332703757ee645b6faf"}, + {file = "websockets-10.4-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:45ec8e75b7dbc9539cbfafa570742fe4f676eb8b0d3694b67dabe2f2ceed8aa6"}, + {file = "websockets-10.4-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:4f72e5cd0f18f262f5da20efa9e241699e0cf3a766317a17392550c9ad7b37d8"}, + {file = "websockets-10.4-cp38-cp38-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:185929b4808b36a79c65b7865783b87b6841e852ef5407a2fb0c03381092fa3b"}, + {file = "websockets-10.4-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:7d27a7e34c313b3a7f91adcd05134315002aaf8540d7b4f90336beafaea6217c"}, + {file = "websockets-10.4-cp38-cp38-musllinux_1_1_i686.whl", hash = "sha256:884be66c76a444c59f801ac13f40c76f176f1bfa815ef5b8ed44321e74f1600b"}, + {file = "websockets-10.4-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:931c039af54fc195fe6ad536fde4b0de04da9d5916e78e55405436348cfb0e56"}, + {file = "websockets-10.4-cp38-cp38-win32.whl", hash = "sha256:db3c336f9eda2532ec0fd8ea49fef7a8df8f6c804cdf4f39e5c5c0d4a4ad9a7a"}, + {file = "websockets-10.4-cp38-cp38-win_amd64.whl", hash = "sha256:48c08473563323f9c9debac781ecf66f94ad5a3680a38fe84dee5388cf5acaf6"}, + {file = "websockets-10.4-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:40e826de3085721dabc7cf9bfd41682dadc02286d8cf149b3ad05bff89311e4f"}, + {file = "websockets-10.4-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:56029457f219ade1f2fc12a6504ea61e14ee227a815531f9738e41203a429112"}, + {file = "websockets-10.4-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:f5fc088b7a32f244c519a048c170f14cf2251b849ef0e20cbbb0fdf0fdaf556f"}, + {file = "websockets-10.4-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:2fc8709c00704194213d45e455adc106ff9e87658297f72d544220e32029cd3d"}, + {file = "websockets-10.4-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:0154f7691e4fe6c2b2bc275b5701e8b158dae92a1ab229e2b940efe11905dff4"}, + {file = "websockets-10.4-cp39-cp39-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:4c6d2264f485f0b53adf22697ac11e261ce84805c232ed5dbe6b1bcb84b00ff0"}, + {file = "websockets-10.4-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:9bc42e8402dc5e9905fb8b9649f57efcb2056693b7e88faa8fb029256ba9c68c"}, + {file = "websockets-10.4-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:edc344de4dac1d89300a053ac973299e82d3db56330f3494905643bb68801269"}, + {file = "websockets-10.4-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:84bc2a7d075f32f6ed98652db3a680a17a4edb21ca7f80fe42e38753a58ee02b"}, + {file = "websockets-10.4-cp39-cp39-win32.whl", hash = "sha256:c94ae4faf2d09f7c81847c63843f84fe47bf6253c9d60b20f25edfd30fb12588"}, + {file = "websockets-10.4-cp39-cp39-win_amd64.whl", hash = "sha256:bbccd847aa0c3a69b5f691a84d2341a4f8a629c6922558f2a70611305f902d74"}, + {file = "websockets-10.4-pp37-pypy37_pp73-macosx_10_9_x86_64.whl", hash = "sha256:82ff5e1cae4e855147fd57a2863376ed7454134c2bf49ec604dfe71e446e2193"}, + {file = "websockets-10.4-pp37-pypy37_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:d210abe51b5da0ffdbf7b43eed0cfdff8a55a1ab17abbec4301c9ff077dd0342"}, + {file = "websockets-10.4-pp37-pypy37_pp73-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:942de28af58f352a6f588bc72490ae0f4ccd6dfc2bd3de5945b882a078e4e179"}, + {file = "websockets-10.4-pp37-pypy37_pp73-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:c9b27d6c1c6cd53dc93614967e9ce00ae7f864a2d9f99fe5ed86706e1ecbf485"}, + {file = "websockets-10.4-pp37-pypy37_pp73-win_amd64.whl", hash = "sha256:3d3cac3e32b2c8414f4f87c1b2ab686fa6284a980ba283617404377cd448f631"}, + {file = "websockets-10.4-pp38-pypy38_pp73-macosx_10_9_x86_64.whl", hash = "sha256:da39dd03d130162deb63da51f6e66ed73032ae62e74aaccc4236e30edccddbb0"}, + {file = "websockets-10.4-pp38-pypy38_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:389f8dbb5c489e305fb113ca1b6bdcdaa130923f77485db5b189de343a179393"}, + {file = "websockets-10.4-pp38-pypy38_pp73-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:09a1814bb15eff7069e51fed0826df0bc0702652b5cb8f87697d469d79c23576"}, + {file = "websockets-10.4-pp38-pypy38_pp73-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:ff64a1d38d156d429404aaa84b27305e957fd10c30e5880d1765c9480bea490f"}, + {file = "websockets-10.4-pp38-pypy38_pp73-win_amd64.whl", hash = "sha256:b343f521b047493dc4022dd338fc6db9d9282658862756b4f6fd0e996c1380e1"}, + {file = "websockets-10.4-pp39-pypy39_pp73-macosx_10_9_x86_64.whl", hash = "sha256:932af322458da7e4e35df32f050389e13d3d96b09d274b22a7aa1808f292fee4"}, + {file = "websockets-10.4-pp39-pypy39_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:d6a4162139374a49eb18ef5b2f4da1dd95c994588f5033d64e0bbfda4b6b6fcf"}, + {file = "websockets-10.4-pp39-pypy39_pp73-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:c57e4c1349fbe0e446c9fa7b19ed2f8a4417233b6984277cce392819123142d3"}, + {file = "websockets-10.4-pp39-pypy39_pp73-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:b627c266f295de9dea86bd1112ed3d5fafb69a348af30a2422e16590a8ecba13"}, + {file = "websockets-10.4-pp39-pypy39_pp73-win_amd64.whl", hash = "sha256:05a7233089f8bd355e8cbe127c2e8ca0b4ea55467861906b80d2ebc7db4d6b72"}, + {file = "websockets-10.4.tar.gz", hash = "sha256:eef610b23933c54d5d921c92578ae5f89813438fded840c2e9809d378dc765d3"}, ] [[package]] @@ -10149,4 +10175,8 @@ local = ["ctransformers", "llama-cpp-python", "sentence-transformers"] [metadata] lock-version = "2.0" python-versions = ">=3.10,<3.12" +<<<<<<< HEAD +content-hash = "5c98ec89f0dbbf60bc4bbcb3d9ea4b84176b8af34b54dd3c77c817ba132b49a1" +======= content-hash = "304eb96cfcbfb376af189b8eae989c0ce36b47555db476bd33d488c2217f484e" +>>>>>>> origin/zustand/io/migration diff --git a/pyproject.toml b/pyproject.toml index 82d7e2d21..507f5076f 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -24,30 +24,24 @@ documentation = "https://docs.langflow.org" [tool.poetry.scripts] langflow = "langflow.__main__:main" +[tool.poetry-monorepo-dependency-plugin] +enable = true + [tool.poetry.dependencies] - - python = ">=3.10,<3.12" +langflow-base = { path = "./src/backend/base", develop = true } duckdb = "^0.9.2" -fastapi = "^0.109.0" -uvicorn = "^0.27.0" beautifulsoup4 = "^4.12.2" google-search-results = "^2.4.1" google-api-python-client = "^2.118.0" -typer = "^0.9.0" -gunicorn = "^21.2.0" -langchain = "~0.1.0" openai = "^1.12.0" -pandas = "2.2.0" chromadb = "^0.4.23" huggingface-hub = { version = "^0.20.0", extras = ["inference"] } -rich = "^13.7.0" llama-cpp-python = { version = "~0.2.0", optional = true } networkx = "^3.1" pypdf = "^4.0.0" pysrt = "^1.1.2" fake-useragent = "^1.4.0" -docstring-parser = "^0.15" psycopg2-binary = "^2.9.6" pyarrow = "^14.0.0" wikipedia = "^1.4.0" @@ -56,15 +50,9 @@ weaviate-client = "*" sentence-transformers = { version = "^2.3.1", optional = true } ctransformers = { version = "^0.2.10", optional = true } cohere = "^4.47.0" -python-multipart = "^0.0.7" -sqlmodel = "^0.0.14" faiss-cpu = "^1.7.4" anthropic = "^0.21.0" -orjson = "3.9.15" -multiprocess = "^0.70.14" -cachetools = "^5.3.1" types-cachetools = "^5.3.0.5" -platformdirs = "^4.2.0" pinecone-client = "^3.0.3" pymongo = "^4.6.0" supabase = "^2.3.0" @@ -72,22 +60,15 @@ certifi = "^2023.11.17" psycopg = "^3.1.9" psycopg-binary = "^3.1.9" fastavro = "^1.8.0" -langchain-experimental = "*" celery = { extras = ["redis"], version = "^5.3.6", optional = true } redis = { version = "^5.0.1", optional = true } flower = { version = "^2.0.0", optional = true } -alembic = "^1.13.0" -passlib = "^1.7.4" -bcrypt = "4.0.1" -python-jose = "^3.3.0" metaphor-python = "^0.1.11" pydantic = "^2.5.0" pydantic-settings = "^2.1.0" zep-python = "*" pywin32 = { version = "^306", markers = "sys_platform == 'win32'" } -loguru = "^0.7.1" langfuse = "^2.9.0" -pillow = "^10.2.0" metal-sdk = "^2.5.0" markupsafe = "^2.1.3" extract-msg = "^0.47.0" @@ -118,7 +99,6 @@ python-docx = "^1.1.0" langchain-astradb = "^0.1.0" [tool.poetry.group.dev.dependencies] -pytest-asyncio = "^0.23.1" types-redis = "^4.6.0.5" ipykernel = "^6.29.0" mypy = "^1.8.0" diff --git a/src/backend/langflow/base/__init__.py b/src/backend/base/README.md similarity index 100% rename from src/backend/langflow/base/__init__.py rename to src/backend/base/README.md diff --git a/src/backend/base/langflow/__main__.py b/src/backend/base/langflow/__main__.py new file mode 100644 index 000000000..4b2260958 --- /dev/null +++ b/src/backend/base/langflow/__main__.py @@ -0,0 +1,348 @@ +import platform +import socket +import sys +import time +import webbrowser +from pathlib import Path +from typing import Optional + +import httpx +import typer +from dotenv import load_dotenv +from multiprocess import Process, cpu_count # type: ignore +from rich import box +from rich import print as rprint +from rich.console import Console +from rich.panel import Panel +from rich.table import Table + +from langflow.main import setup_app +from langflow.services.database.utils import session_getter +from langflow.services.deps import get_db_service, get_settings_service +from langflow.services.utils import initialize_services, initialize_settings_service +from langflow.utils.logger import configure, logger + +console = Console() + +app = typer.Typer(no_args_is_help=True) + + +def get_number_of_workers(workers=None): + if workers == -1 or workers is None: + workers = (cpu_count() * 2) + 1 + logger.debug(f"Number of workers: {workers}") + return workers + + +def display_results(results): + """ + Display the results of the migration. + """ + for table_results in results: + table = Table(title=f"Migration {table_results.table_name}") + table.add_column("Name") + table.add_column("Type") + table.add_column("Status") + + for result in table_results.results: + status = "Success" if result.success else "Failure" + color = "green" if result.success else "red" + table.add_row(result.name, result.type, f"[{color}]{status}[/{color}]") + + console.print(table) + console.print() # Print a new line + + +def set_var_for_macos_issue(): + # OBJC_DISABLE_INITIALIZE_FORK_SAFETY=YES + # we need to set this var is we are running on MacOS + # otherwise we get an error when running gunicorn + + if platform.system() in ["Darwin"]: + import os + + os.environ["OBJC_DISABLE_INITIALIZE_FORK_SAFETY"] = "YES" + # https://stackoverflow.com/questions/75747888/uwsgi-segmentation-fault-with-flask-python-app-behind-nginx-after-running-for-2 # noqa + os.environ["no_proxy"] = "*" # to avoid error with gunicorn + logger.debug("Set OBJC_DISABLE_INITIALIZE_FORK_SAFETY to YES to avoid error") + + +def update_settings( + config: str, + cache: Optional[str] = None, + dev: bool = False, + remove_api_keys: bool = False, + components_path: Optional[Path] = None, + store: bool = True, +): + """Update the settings from a config file.""" + + # Check for database_url in the environment variables + initialize_settings_service() + settings_service = get_settings_service() + if config: + logger.debug(f"Loading settings from {config}") + settings_service.settings.update_from_yaml(config, dev=dev) + if remove_api_keys: + logger.debug(f"Setting remove_api_keys to {remove_api_keys}") + settings_service.settings.update_settings(REMOVE_API_KEYS=remove_api_keys) + if cache: + logger.debug(f"Setting cache to {cache}") + settings_service.settings.update_settings(CACHE=cache) + if components_path: + logger.debug(f"Adding component path {components_path}") + settings_service.settings.update_settings(COMPONENTS_PATH=components_path) + if not store: + logger.debug("Setting store to False") + settings_service.settings.update_settings(STORE=False) + + +@app.command() +def run( + host: str = typer.Option("127.0.0.1", help="Host to bind the server to.", envvar="LANGFLOW_HOST"), + workers: int = typer.Option(1, help="Number of worker processes.", envvar="LANGFLOW_WORKERS"), + timeout: int = typer.Option(300, help="Worker timeout in seconds."), + port: int = typer.Option(7860, help="Port to listen on.", envvar="LANGFLOW_PORT"), + components_path: Optional[Path] = typer.Option( + Path(__file__).parent / "components", + help="Path to the directory containing custom components.", + envvar="LANGFLOW_COMPONENTS_PATH", + ), + config: str = typer.Option(Path(__file__).parent / "config.yaml", help="Path to the configuration file."), + # .env file param + env_file: Path = typer.Option(None, help="Path to the .env file containing environment variables."), + log_level: str = typer.Option("critical", help="Logging level.", envvar="LANGFLOW_LOG_LEVEL"), + log_file: Path = typer.Option("logs/langflow.log", help="Path to the log file.", envvar="LANGFLOW_LOG_FILE"), + cache: Optional[str] = typer.Option( + envvar="LANGFLOW_LANGCHAIN_CACHE", + help="Type of cache to use. (InMemoryCache, SQLiteCache)", + default=None, + ), + dev: bool = typer.Option(False, help="Run in development mode (may contain bugs)"), + path: str = typer.Option( + None, + help="Path to the frontend directory containing build files. This is for development purposes only.", + envvar="LANGFLOW_FRONTEND_PATH", + ), + open_browser: bool = typer.Option( + True, + help="Open the browser after starting the server.", + envvar="LANGFLOW_OPEN_BROWSER", + ), + remove_api_keys: bool = typer.Option( + False, + help="Remove API keys from the projects saved in the database.", + envvar="LANGFLOW_REMOVE_API_KEYS", + ), + backend_only: bool = typer.Option( + False, + help="Run only the backend server without the frontend.", + envvar="LANGFLOW_BACKEND_ONLY", + ), + store: bool = typer.Option( + True, + help="Enables the store features.", + envvar="LANGFLOW_STORE", + ), +): + """ + Run the Langflow. + """ + + set_var_for_macos_issue() + # override env variables with .env file + + if env_file: + load_dotenv(env_file, override=True) + + configure(log_level=log_level, log_file=log_file) + update_settings( + config, + dev=dev, + remove_api_keys=remove_api_keys, + cache=cache, + components_path=components_path, + store=store, + ) + # 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, backend_only=backend_only) + # check if port is being used + if is_port_in_use(port, host): + port = get_free_port(port) + + options = { + "bind": f"{host}:{port}", + "workers": get_number_of_workers(workers), + "timeout": timeout, + } + + # Define an env variable to know if we are just testing the server + if "pytest" in sys.modules: + return + + if platform.system() in ["Windows"]: + # Run using uvicorn on MacOS and Windows + # Windows doesn't support gunicorn + # MacOS requires an env variable to be set to use gunicorn + run_on_windows(host, port, log_level, options, app) + else: + # Run using gunicorn on Linux + run_on_mac_or_linux(host, port, log_level, options, app, open_browser) + + +def run_on_mac_or_linux(host, port, log_level, options, app, open_browser=True): + webapp_process = Process(target=run_langflow, args=(host, port, log_level, options, app)) + webapp_process.start() + status_code = 0 + while status_code != 200: + try: + status_code = httpx.get(f"http://{host}:{port}/health").status_code + + except Exception: + time.sleep(1) + + print_banner(host, port) + if open_browser: + webbrowser.open(f"http://{host}:{port}") + + +def run_on_windows(host, port, log_level, options, app): + """ + Run the Langflow server on Windows. + """ + print_banner(host, port) + run_langflow(host, port, log_level, options, app) + + +def is_port_in_use(port, host="localhost"): + """ + Check if a port is in use. + + Args: + port (int): The port number to check. + host (str): The host to check the port on. Defaults to 'localhost'. + + Returns: + bool: True if the port is in use, False otherwise. + """ + with socket.socket(socket.AF_INET, socket.SOCK_STREAM) as s: + return s.connect_ex((host, port)) == 0 + + +def get_free_port(port): + """ + Given a used port, find a free port. + + Args: + port (int): The port number to check. + + Returns: + int: A free port number. + """ + while is_port_in_use(port): + port += 1 + return port + + +def print_banner(host, port): + # console = Console() + + word = "Langflow" + colors = ["#3300cc"] + + styled_word = "" + + for i, char in enumerate(word): + color = colors[i % len(colors)] + styled_word += f"[{color}]{char}[/]" + + # Title with emojis and gradient text + title = ( + f"[bold]Welcome to :chains: {styled_word} [/bold]\n\n" + f"Access [link=http://{host}:{port}]http://{host}:{port}[/link]" + ) + info_text = ( + "Collaborate, and contribute at our " + "[bold][link=https://github.com/logspace-ai/langflow]GitHub Repo[/link][/bold] :rocket:" + ) + + # Create a panel with the title and the info text, and a border around it + panel = Panel(f"{title}\n{info_text}", box=box.ROUNDED, border_style="blue", expand=False) + + # Print the banner with a separator line before and after + rprint(panel) + + +def run_langflow(host, port, log_level, options, app): + """ + Run Langflow server on localhost + """ + try: + if platform.system() in ["Windows"]: + # Run using uvicorn on MacOS and Windows + # Windows doesn't support gunicorn + # MacOS requires an env variable to be set to use gunicorn + import uvicorn + + uvicorn.run(app, host=host, port=port, log_level=log_level) + else: + from langflow.server import LangflowApplication + + LangflowApplication(app, options).run() + except KeyboardInterrupt: + pass + except Exception as e: + logger.exception(e) + sys.exit(1) + + +@app.command() +def superuser( + username: str = typer.Option(..., prompt=True, help="Username for the superuser."), + password: str = typer.Option(..., prompt=True, hide_input=True, help="Password for the superuser."), + log_level: str = typer.Option("critical", help="Logging level.", envvar="LANGFLOW_LOG_LEVEL"), +): + """ + Create a superuser. + """ + configure(log_level=log_level) + initialize_services() + db_service = get_db_service() + with session_getter(db_service) as session: + from langflow.services.auth.utils import create_super_user + + if create_super_user(db=session, username=username, password=password): + # Verify that the superuser was created + from langflow.services.database.models.user.model import User + + user: User = session.query(User).filter(User.username == username).first() + if user is None or not user.is_superuser: + typer.echo("Superuser creation failed.") + return + + typer.echo("Superuser created successfully.") + + else: + typer.echo("Superuser creation failed.") + + +@app.command() +def migration(test: bool = typer.Option(True, help="Run migrations in test mode.")): + """ + Run or test migrations. + """ + initialize_services() + db_service = get_db_service() + if not test: + db_service.run_migrations() + results = db_service.run_migrations_test() + display_results(results) + + +def main(): + app() + + +if __name__ == "__main__": + main() diff --git a/src/backend/langflow/alembic.ini b/src/backend/base/langflow/alembic.ini similarity index 100% rename from src/backend/langflow/alembic.ini rename to src/backend/base/langflow/alembic.ini diff --git a/src/backend/langflow/alembic/README b/src/backend/base/langflow/alembic/README similarity index 100% rename from src/backend/langflow/alembic/README rename to src/backend/base/langflow/alembic/README diff --git a/src/backend/langflow/alembic/env.py b/src/backend/base/langflow/alembic/env.py similarity index 86% rename from src/backend/langflow/alembic/env.py rename to src/backend/base/langflow/alembic/env.py index 52bd5a09d..495cbb061 100644 --- a/src/backend/langflow/alembic/env.py +++ b/src/backend/base/langflow/alembic/env.py @@ -66,14 +66,10 @@ def run_migrations_online() -> None: try: from langflow.services.database.factory import DatabaseServiceFactory from langflow.services.deps import get_db_service - from langflow.services.manager import (initialize_settings_service, - service_manager) - from langflow.services.schema import ServiceType + from langflow.services.manager import initialize_settings_service, service_manager initialize_settings_service() - service_manager.register_factory( - DatabaseServiceFactory() - ) + service_manager.register_factory(DatabaseServiceFactory()) connectable = get_db_service().engine except Exception as e: logger.error(f"Error getting database engine: {e}") @@ -87,9 +83,7 @@ def run_migrations_online() -> None: poolclass=pool.NullPool, ) with connectable.connect() as connection: - context.configure( - connection=connection, target_metadata=target_metadata, render_as_batch=True - ) + context.configure(connection=connection, target_metadata=target_metadata, render_as_batch=True) with context.begin_transaction(): context.run_migrations() diff --git a/src/backend/langflow/helpers/__init__.py b/src/backend/base/langflow/alembic/helpers/__init__.py similarity index 100% rename from src/backend/langflow/helpers/__init__.py rename to src/backend/base/langflow/alembic/helpers/__init__.py diff --git a/src/backend/langflow/helpers/flow.py b/src/backend/base/langflow/alembic/helpers/flow.py similarity index 100% rename from src/backend/langflow/helpers/flow.py rename to src/backend/base/langflow/alembic/helpers/flow.py diff --git a/src/backend/langflow/helpers/record.py b/src/backend/base/langflow/alembic/helpers/record.py similarity index 100% rename from src/backend/langflow/helpers/record.py rename to src/backend/base/langflow/alembic/helpers/record.py diff --git a/src/backend/langflow/alembic/script.py.mako b/src/backend/base/langflow/alembic/script.py.mako similarity index 100% rename from src/backend/langflow/alembic/script.py.mako rename to src/backend/base/langflow/alembic/script.py.mako diff --git a/src/backend/langflow/alembic/versions/006b3990db50_add_unique_constraints.py b/src/backend/base/langflow/alembic/versions/006b3990db50_add_unique_constraints.py similarity index 84% rename from src/backend/langflow/alembic/versions/006b3990db50_add_unique_constraints.py rename to src/backend/base/langflow/alembic/versions/006b3990db50_add_unique_constraints.py index e5958ab73..09a0ffa12 100644 --- a/src/backend/langflow/alembic/versions/006b3990db50_add_unique_constraints.py +++ b/src/backend/base/langflow/alembic/versions/006b3990db50_add_unique_constraints.py @@ -26,20 +26,13 @@ def upgrade() -> None: flow_constraints = inspector.get_unique_constraints("flow") user_constraints = inspector.get_unique_constraints("user") try: - if not any( - constraint["name"] == "uq_apikey_id" for constraint in api_key_constraints - ): + if not any(constraint["name"] == "uq_apikey_id" for constraint in api_key_constraints): with op.batch_alter_table("apikey", schema=None) as batch_op: - batch_op.create_unique_constraint("uq_apikey_id", ["id"]) - if not any( - constraint["name"] == "uq_flow_id" for constraint in flow_constraints - ): + if not any(constraint["name"] == "uq_flow_id" for constraint in flow_constraints): with op.batch_alter_table("flow", schema=None) as batch_op: batch_op.create_unique_constraint("uq_flow_id", ["id"]) - if not any( - constraint["name"] == "uq_user_id" for constraint in user_constraints - ): + if not any(constraint["name"] == "uq_user_id" for constraint in user_constraints): with op.batch_alter_table("user", schema=None) as batch_op: batch_op.create_unique_constraint("uq_user_id", ["id"]) except Exception as e: @@ -57,16 +50,13 @@ def downgrade() -> None: flow_constraints = inspector.get_unique_constraints("flow") user_constraints = inspector.get_unique_constraints("user") try: - if any( - constraint["name"] == "uq_apikey_id" for constraint in api_key_constraints - ): + if any(constraint["name"] == "uq_apikey_id" for constraint in api_key_constraints): with op.batch_alter_table("user", schema=None) as batch_op: batch_op.drop_constraint("uq_user_id", type_="unique") if any(constraint["name"] == "uq_flow_id" for constraint in flow_constraints): with op.batch_alter_table("flow", schema=None) as batch_op: batch_op.drop_constraint("uq_flow_id", type_="unique") if any(constraint["name"] == "uq_user_id" for constraint in user_constraints): - with op.batch_alter_table("apikey", schema=None) as batch_op: batch_op.drop_constraint("uq_apikey_id", type_="unique") except Exception as e: diff --git a/src/backend/langflow/alembic/versions/0b8757876a7c_.py b/src/backend/base/langflow/alembic/versions/0b8757876a7c_.py similarity index 100% rename from src/backend/langflow/alembic/versions/0b8757876a7c_.py rename to src/backend/base/langflow/alembic/versions/0b8757876a7c_.py diff --git a/src/backend/langflow/alembic/versions/1ef9c4f3765d_.py b/src/backend/base/langflow/alembic/versions/1ef9c4f3765d_.py similarity index 83% rename from src/backend/langflow/alembic/versions/1ef9c4f3765d_.py rename to src/backend/base/langflow/alembic/versions/1ef9c4f3765d_.py index df92f1f02..db78e33bd 100644 --- a/src/backend/langflow/alembic/versions/1ef9c4f3765d_.py +++ b/src/backend/base/langflow/alembic/versions/1ef9c4f3765d_.py @@ -24,10 +24,8 @@ def upgrade() -> None: # ### commands auto generated by Alembic - please adjust! ### try: with op.batch_alter_table("apikey", schema=None) as batch_op: - batch_op.alter_column( - "name", existing_type=sqlmodel.sql.sqltypes.AutoString(), nullable=True - ) - except Exception as e: + batch_op.alter_column("name", existing_type=sqlmodel.sql.sqltypes.AutoString(), nullable=True) + except Exception: pass # ### end Alembic commands ### @@ -37,6 +35,6 @@ def downgrade() -> None: try: with op.batch_alter_table("apikey", schema=None) as batch_op: batch_op.alter_column("name", existing_type=sa.VARCHAR(), nullable=False) - except Exception as e: + except Exception: pass # ### end Alembic commands ### diff --git a/src/backend/langflow/alembic/versions/260dbcc8b680_adds_tables.py b/src/backend/base/langflow/alembic/versions/260dbcc8b680_adds_tables.py similarity index 82% rename from src/backend/langflow/alembic/versions/260dbcc8b680_adds_tables.py rename to src/backend/base/langflow/alembic/versions/260dbcc8b680_adds_tables.py index 0f3e71312..01db957fe 100644 --- a/src/backend/langflow/alembic/versions/260dbcc8b680_adds_tables.py +++ b/src/backend/base/langflow/alembic/versions/260dbcc8b680_adds_tables.py @@ -31,23 +31,16 @@ def upgrade() -> None: # and other related indices if "flowstyle" in existing_tables: op.drop_table("flowstyle") - if "ix_flowstyle_flow_id" in [ - index["name"] for index in inspector.get_indexes("flowstyle") - ]: - op.drop_index( - "ix_flowstyle_flow_id", table_name="flowstyle", if_exists=True - ) + if "ix_flowstyle_flow_id" in [index["name"] for index in inspector.get_indexes("flowstyle")]: + op.drop_index("ix_flowstyle_flow_id", table_name="flowstyle", if_exists=True) existing_indices_flow = [] existing_fks_flow = [] if "flow" in existing_tables: - existing_indices_flow = [ - index["name"] for index in inspector.get_indexes("flow") - ] + existing_indices_flow = [index["name"] for index in inspector.get_indexes("flow")] # Existing foreign keys for the 'flow' table, if it exists existing_fks_flow = [ - fk["referred_table"] + "." + fk["referred_columns"][0] - for fk in inspector.get_foreign_keys("flow") + fk["referred_table"] + "." + fk["referred_columns"][0] for fk in inspector.get_foreign_keys("flow") ] # Now check if the columns user_id exists in the 'flow' table # If it does not exist, we need to create the foreign key @@ -67,9 +60,7 @@ def upgrade() -> None: sa.UniqueConstraint("id", name="uq_user_id"), ) with op.batch_alter_table("user", schema=None) as batch_op: - batch_op.create_index( - batch_op.f("ix_user_username"), ["username"], unique=True - ) + batch_op.create_index(batch_op.f("ix_user_username"), ["username"], unique=True) if "apikey" not in existing_tables: op.create_table( @@ -82,20 +73,14 @@ def upgrade() -> None: sa.Column("id", sqlmodel.sql.sqltypes.GUID(), nullable=False), sa.Column("api_key", sqlmodel.sql.sqltypes.AutoString(), nullable=False), sa.Column("user_id", sqlmodel.sql.sqltypes.GUID(), nullable=False), - sa.ForeignKeyConstraint( - ["user_id"], ["user.id"], name="fk_apikey_user_id_user" - ), + sa.ForeignKeyConstraint(["user_id"], ["user.id"], name="fk_apikey_user_id_user"), sa.PrimaryKeyConstraint("id", name="pk_apikey"), sa.UniqueConstraint("id", name="uq_apikey_id"), ) with op.batch_alter_table("apikey", schema=None) as batch_op: - batch_op.create_index( - batch_op.f("ix_apikey_api_key"), ["api_key"], unique=True - ) + batch_op.create_index(batch_op.f("ix_apikey_api_key"), ["api_key"], unique=True) batch_op.create_index(batch_op.f("ix_apikey_name"), ["name"], unique=False) - batch_op.create_index( - batch_op.f("ix_apikey_user_id"), ["user_id"], unique=False - ) + batch_op.create_index(batch_op.f("ix_apikey_user_id"), ["user_id"], unique=False) if "flow" not in existing_tables: op.create_table( "flow", @@ -104,9 +89,7 @@ def upgrade() -> None: sa.Column("description", sqlmodel.sql.sqltypes.AutoString(), nullable=True), sa.Column("id", sqlmodel.sql.sqltypes.GUID(), nullable=False), sa.Column("user_id", sqlmodel.sql.sqltypes.GUID(), nullable=False), - sa.ForeignKeyConstraint( - ["user_id"], ["user.id"], name="fk_flow_user_id_user" - ), + sa.ForeignKeyConstraint(["user_id"], ["user.id"], name="fk_flow_user_id_user"), sa.PrimaryKeyConstraint("id", name="pk_flow"), sa.UniqueConstraint("id", name="uq_flow_id"), ) @@ -129,16 +112,12 @@ def upgrade() -> None: if "user.id" not in existing_fks_flow: batch_op.create_foreign_key("fk_flow_user_id", "user", ["user_id"], ["id"]) if "ix_flow_description" not in existing_indices_flow: - batch_op.create_index( - batch_op.f("ix_flow_description"), ["description"], unique=False - ) + batch_op.create_index(batch_op.f("ix_flow_description"), ["description"], unique=False) if "ix_flow_name" not in existing_indices_flow: batch_op.create_index(batch_op.f("ix_flow_name"), ["name"], unique=False) with op.batch_alter_table("flow", schema=None) as batch_op: if "ix_flow_user_id" not in existing_indices_flow: - batch_op.create_index( - batch_op.f("ix_flow_user_id"), ["user_id"], unique=False - ) + batch_op.create_index(batch_op.f("ix_flow_user_id"), ["user_id"], unique=False) # ### end Alembic commands ### diff --git a/src/backend/langflow/alembic/versions/2ac71eb9c3ae_adds_credential_table.py b/src/backend/base/langflow/alembic/versions/2ac71eb9c3ae_adds_credential_table.py similarity index 92% rename from src/backend/langflow/alembic/versions/2ac71eb9c3ae_adds_credential_table.py rename to src/backend/base/langflow/alembic/versions/2ac71eb9c3ae_adds_credential_table.py index ce2d2cd76..2250a8b8c 100644 --- a/src/backend/langflow/alembic/versions/2ac71eb9c3ae_adds_credential_table.py +++ b/src/backend/base/langflow/alembic/versions/2ac71eb9c3ae_adds_credential_table.py @@ -31,9 +31,7 @@ def upgrade() -> None: "credential", sa.Column("name", sqlmodel.sql.sqltypes.AutoString(), nullable=True), sa.Column("value", sqlmodel.sql.sqltypes.AutoString(), nullable=True), - sa.Column( - "provider", sqlmodel.sql.sqltypes.AutoString(), nullable=True - ), + sa.Column("provider", sqlmodel.sql.sqltypes.AutoString(), nullable=True), sa.Column("user_id", sqlmodel.sql.sqltypes.GUID(), nullable=False), sa.Column("id", sqlmodel.sql.sqltypes.GUID(), nullable=False), sa.Column("created_at", sa.DateTime(), nullable=False), diff --git a/src/backend/langflow/alembic/versions/63b9c451fd30_add_icon_and_icon_bg_color_to_flow.py b/src/backend/base/langflow/alembic/versions/63b9c451fd30_add_icon_and_icon_bg_color_to_flow.py similarity index 78% rename from src/backend/langflow/alembic/versions/63b9c451fd30_add_icon_and_icon_bg_color_to_flow.py rename to src/backend/base/langflow/alembic/versions/63b9c451fd30_add_icon_and_icon_bg_color_to_flow.py index 3deb66346..c6d6893e3 100644 --- a/src/backend/langflow/alembic/versions/63b9c451fd30_add_icon_and_icon_bg_color_to_flow.py +++ b/src/backend/base/langflow/alembic/versions/63b9c451fd30_add_icon_and_icon_bg_color_to_flow.py @@ -23,20 +23,14 @@ depends_on: Union[str, Sequence[str], None] = None def upgrade() -> None: conn = op.get_bind() inspector = Inspector.from_engine(conn) # type: ignore - table_names = inspector.get_table_names() + table_names = inspector.get_table_names() # noqa column_names = [column["name"] for column in inspector.get_columns("flow")] # ### commands auto generated by Alembic - please adjust! ### with op.batch_alter_table("flow", schema=None) as batch_op: if "icon" not in column_names: - batch_op.add_column( - sa.Column("icon", sqlmodel.sql.sqltypes.AutoString(), nullable=True) - ) + batch_op.add_column(sa.Column("icon", sqlmodel.sql.sqltypes.AutoString(), nullable=True)) if "icon_bg_color" not in column_names: - batch_op.add_column( - sa.Column( - "icon_bg_color", sqlmodel.sql.sqltypes.AutoString(), nullable=True - ) - ) + batch_op.add_column(sa.Column("icon_bg_color", sqlmodel.sql.sqltypes.AutoString(), nullable=True)) # ### end Alembic commands ### @@ -44,7 +38,7 @@ def upgrade() -> None: def downgrade() -> None: conn = op.get_bind() inspector = Inspector.from_engine(conn) # type: ignore - table_names = inspector.get_table_names() + table_names = inspector.get_table_names() # noqa column_names = [column["name"] for column in inspector.get_columns("flow")] # ### commands auto generated by Alembic - please adjust! ### with op.batch_alter_table("flow", schema=None) as batch_op: diff --git a/src/backend/langflow/alembic/versions/67cc006d50bf_add_profile_image_column.py b/src/backend/base/langflow/alembic/versions/67cc006d50bf_add_profile_image_column.py similarity index 100% rename from src/backend/langflow/alembic/versions/67cc006d50bf_add_profile_image_column.py rename to src/backend/base/langflow/alembic/versions/67cc006d50bf_add_profile_image_column.py diff --git a/src/backend/langflow/alembic/versions/7843803a87b5_store_updates.py b/src/backend/base/langflow/alembic/versions/7843803a87b5_store_updates.py similarity index 82% rename from src/backend/langflow/alembic/versions/7843803a87b5_store_updates.py rename to src/backend/base/langflow/alembic/versions/7843803a87b5_store_updates.py index b1565cd0f..d2a576410 100644 --- a/src/backend/langflow/alembic/versions/7843803a87b5_store_updates.py +++ b/src/backend/base/langflow/alembic/versions/7843803a87b5_store_updates.py @@ -29,18 +29,14 @@ def upgrade() -> None: try: if "is_component" not in flow_columns: with op.batch_alter_table("flow", schema=None) as batch_op: - batch_op.add_column( - sa.Column("is_component", sa.Boolean(), nullable=True) - ) - except Exception as e: + batch_op.add_column(sa.Column("is_component", sa.Boolean(), nullable=True)) + except Exception: pass try: if "store_api_key" not in user_columns: with op.batch_alter_table("user", schema=None) as batch_op: - batch_op.add_column( - sa.Column("store_api_key", sqlmodel.AutoString(), nullable=True) - ) - except Exception as e: + batch_op.add_column(sa.Column("store_api_key", sqlmodel.AutoString(), nullable=True)) + except Exception: pass # ### end Alembic commands ### diff --git a/src/backend/langflow/alembic/versions/7d2162acc8b2_adds_updated_at_and_folder_cols.py b/src/backend/base/langflow/alembic/versions/7d2162acc8b2_adds_updated_at_and_folder_cols.py similarity index 80% rename from src/backend/langflow/alembic/versions/7d2162acc8b2_adds_updated_at_and_folder_cols.py rename to src/backend/base/langflow/alembic/versions/7d2162acc8b2_adds_updated_at_and_folder_cols.py index 5ed929568..b46400899 100644 --- a/src/backend/langflow/alembic/versions/7d2162acc8b2_adds_updated_at_and_folder_cols.py +++ b/src/backend/base/langflow/alembic/versions/7d2162acc8b2_adds_updated_at_and_folder_cols.py @@ -30,9 +30,7 @@ def upgrade() -> None: try: if "name" in api_key_columns: with op.batch_alter_table("apikey", schema=None) as batch_op: - batch_op.alter_column( - "name", existing_type=sa.VARCHAR(), nullable=False - ) + batch_op.alter_column("name", existing_type=sa.VARCHAR(), nullable=False) except Exception as e: print(e) @@ -40,15 +38,9 @@ def upgrade() -> None: try: with op.batch_alter_table("flow", schema=None) as batch_op: if "updated_at" not in flow_columns: - batch_op.add_column( - sa.Column("updated_at", sa.DateTime(), nullable=True) - ) + batch_op.add_column(sa.Column("updated_at", sa.DateTime(), nullable=True)) if "folder" not in flow_columns: - batch_op.add_column( - sa.Column( - "folder", sqlmodel.sql.sqltypes.AutoString(), nullable=True - ) - ) + batch_op.add_column(sa.Column("folder", sqlmodel.sql.sqltypes.AutoString(), nullable=True)) except Exception as e: print(e) @@ -68,7 +60,6 @@ def downgrade() -> None: pass try: - with op.batch_alter_table("apikey", schema=None) as batch_op: batch_op.alter_column("name", existing_type=sa.VARCHAR(), nullable=True) except Exception as e: diff --git a/src/backend/langflow/alembic/versions/b2fa308044b5_add_unique_constraints.py b/src/backend/base/langflow/alembic/versions/b2fa308044b5_add_unique_constraints.py similarity index 81% rename from src/backend/langflow/alembic/versions/b2fa308044b5_add_unique_constraints.py rename to src/backend/base/langflow/alembic/versions/b2fa308044b5_add_unique_constraints.py index bb3c0c7cd..ed5317bf5 100644 --- a/src/backend/langflow/alembic/versions/b2fa308044b5_add_unique_constraints.py +++ b/src/backend/base/langflow/alembic/versions/b2fa308044b5_add_unique_constraints.py @@ -32,33 +32,19 @@ def upgrade() -> None: with op.batch_alter_table("flow", schema=None) as batch_op: flow_columns = [column["name"] for column in inspector.get_columns("flow")] if "is_component" not in flow_columns: - batch_op.add_column( - sa.Column("is_component", sa.Boolean(), nullable=True) - ) + batch_op.add_column(sa.Column("is_component", sa.Boolean(), nullable=True)) if "updated_at" not in flow_columns: - batch_op.add_column( - sa.Column("updated_at", sa.DateTime(), nullable=True) - ) + batch_op.add_column(sa.Column("updated_at", sa.DateTime(), nullable=True)) if "folder" not in flow_columns: - batch_op.add_column( - sa.Column( - "folder", sqlmodel.sql.sqltypes.AutoString(), nullable=True - ) - ) + batch_op.add_column(sa.Column("folder", sqlmodel.sql.sqltypes.AutoString(), nullable=True)) if "user_id" not in flow_columns: - batch_op.add_column( - sa.Column("user_id", sqlmodel.sql.sqltypes.GUID(), nullable=True) - ) + batch_op.add_column(sa.Column("user_id", sqlmodel.sql.sqltypes.GUID(), nullable=True)) indices = inspector.get_indexes("flow") indices_names = [index["name"] for index in indices] if "ix_flow_user_id" not in indices_names: - batch_op.create_index( - batch_op.f("ix_flow_user_id"), ["user_id"], unique=False - ) + batch_op.create_index(batch_op.f("ix_flow_user_id"), ["user_id"], unique=False) if "fk_flow_user_id_user" not in indices_names: - batch_op.create_foreign_key( - "fk_flow_user_id_user", "user", ["user_id"], ["id"] - ) + batch_op.create_foreign_key("fk_flow_user_id_user", "user", ["user_id"], ["id"]) except Exception: pass diff --git a/src/backend/langflow/alembic/versions/bc2f01c40e4a_new_fixes.py b/src/backend/base/langflow/alembic/versions/bc2f01c40e4a_new_fixes.py similarity index 82% rename from src/backend/langflow/alembic/versions/bc2f01c40e4a_new_fixes.py rename to src/backend/base/langflow/alembic/versions/bc2f01c40e4a_new_fixes.py index cfbf74f06..e0fa1add8 100644 --- a/src/backend/langflow/alembic/versions/bc2f01c40e4a_new_fixes.py +++ b/src/backend/base/langflow/alembic/versions/bc2f01c40e4a_new_fixes.py @@ -33,21 +33,13 @@ def upgrade() -> None: if "updated_at" not in flow_columns: batch_op.add_column(sa.Column("updated_at", sa.DateTime(), nullable=True)) if "folder" not in flow_columns: - batch_op.add_column( - sa.Column("folder", sqlmodel.sql.sqltypes.AutoString(), nullable=True) - ) + batch_op.add_column(sa.Column("folder", sqlmodel.sql.sqltypes.AutoString(), nullable=True)) if "user_id" not in flow_columns: - batch_op.add_column( - sa.Column("user_id", sqlmodel.sql.sqltypes.GUID(), nullable=True) - ) + batch_op.add_column(sa.Column("user_id", sqlmodel.sql.sqltypes.GUID(), nullable=True)) if "ix_flow_user_id" not in flow_indexes: - batch_op.create_index( - batch_op.f("ix_flow_user_id"), ["user_id"], unique=False - ) + batch_op.create_index(batch_op.f("ix_flow_user_id"), ["user_id"], unique=False) if "flow_user_id_fkey" not in flow_fks: - batch_op.create_foreign_key( - "flow_user_id_fkey", "user", ["user_id"], ["id"] - ) + batch_op.create_foreign_key("flow_user_id_fkey", "user", ["user_id"], ["id"]) def downgrade() -> None: diff --git a/src/backend/langflow/alembic/versions/eb5866d51fd2_change_columns_to_be_nullable.py b/src/backend/base/langflow/alembic/versions/eb5866d51fd2_change_columns_to_be_nullable.py similarity index 94% rename from src/backend/langflow/alembic/versions/eb5866d51fd2_change_columns_to_be_nullable.py rename to src/backend/base/langflow/alembic/versions/eb5866d51fd2_change_columns_to_be_nullable.py index 4da04c325..acb09cd5f 100644 --- a/src/backend/langflow/alembic/versions/eb5866d51fd2_change_columns_to_be_nullable.py +++ b/src/backend/base/langflow/alembic/versions/eb5866d51fd2_change_columns_to_be_nullable.py @@ -19,7 +19,7 @@ depends_on: Union[str, Sequence[str], None] = None def upgrade() -> None: # ### commands auto generated by Alembic - please adjust! ### - connection = op.get_bind() + connection = op.get_bind() # noqa pass # ### end Alembic commands ### diff --git a/src/backend/langflow/alembic/versions/f5ee9749d1a6_user_id_can_be_null_in_flow.py b/src/backend/base/langflow/alembic/versions/f5ee9749d1a6_user_id_can_be_null_in_flow.py similarity index 79% rename from src/backend/langflow/alembic/versions/f5ee9749d1a6_user_id_can_be_null_in_flow.py rename to src/backend/base/langflow/alembic/versions/f5ee9749d1a6_user_id_can_be_null_in_flow.py index 494de22ac..842c55857 100644 --- a/src/backend/langflow/alembic/versions/f5ee9749d1a6_user_id_can_be_null_in_flow.py +++ b/src/backend/base/langflow/alembic/versions/f5ee9749d1a6_user_id_can_be_null_in_flow.py @@ -22,9 +22,7 @@ def upgrade() -> None: # ### commands auto generated by Alembic - please adjust! ### try: with op.batch_alter_table("flow", schema=None) as batch_op: - batch_op.alter_column( - "user_id", existing_type=sa.CHAR(length=32), nullable=True - ) + batch_op.alter_column("user_id", existing_type=sa.CHAR(length=32), nullable=True) except Exception as e: print(e) pass @@ -36,9 +34,7 @@ def downgrade() -> None: # ### commands auto generated by Alembic - please adjust! ### try: with op.batch_alter_table("flow", schema=None) as batch_op: - batch_op.alter_column( - "user_id", existing_type=sa.CHAR(length=32), nullable=False - ) + batch_op.alter_column("user_id", existing_type=sa.CHAR(length=32), nullable=False) except Exception as e: print(e) pass diff --git a/src/backend/langflow/alembic/versions/fd531f8868b1_fix_credential_table.py b/src/backend/base/langflow/alembic/versions/fd531f8868b1_fix_credential_table.py similarity index 93% rename from src/backend/langflow/alembic/versions/fd531f8868b1_fix_credential_table.py rename to src/backend/base/langflow/alembic/versions/fd531f8868b1_fix_credential_table.py index 77e6acd75..de69b491d 100644 --- a/src/backend/langflow/alembic/versions/fd531f8868b1_fix_credential_table.py +++ b/src/backend/base/langflow/alembic/versions/fd531f8868b1_fix_credential_table.py @@ -31,9 +31,7 @@ def upgrade() -> None: try: if "credential" in tables and "fk_credential_user_id" not in foreign_keys_names: with op.batch_alter_table("credential", schema=None) as batch_op: - batch_op.create_foreign_key( - "fk_credential_user_id", "user", ["user_id"], ["id"] - ) + batch_op.create_foreign_key("fk_credential_user_id", "user", ["user_id"], ["id"]) except Exception as e: print(e) pass diff --git a/src/backend/langflow/api/__init__.py b/src/backend/base/langflow/api/__init__.py similarity index 100% rename from src/backend/langflow/api/__init__.py rename to src/backend/base/langflow/api/__init__.py diff --git a/src/backend/langflow/api/router.py b/src/backend/base/langflow/api/router.py similarity index 100% rename from src/backend/langflow/api/router.py rename to src/backend/base/langflow/api/router.py diff --git a/src/backend/langflow/api/utils.py b/src/backend/base/langflow/api/utils.py similarity index 100% rename from src/backend/langflow/api/utils.py rename to src/backend/base/langflow/api/utils.py diff --git a/src/backend/langflow/api/v1/__init__.py b/src/backend/base/langflow/api/v1/__init__.py similarity index 100% rename from src/backend/langflow/api/v1/__init__.py rename to src/backend/base/langflow/api/v1/__init__.py diff --git a/src/backend/langflow/api/v1/api_key.py b/src/backend/base/langflow/api/v1/api_key.py similarity index 89% rename from src/backend/langflow/api/v1/api_key.py rename to src/backend/base/langflow/api/v1/api_key.py index 48cf7d1ca..77466960d 100644 --- a/src/backend/langflow/api/v1/api_key.py +++ b/src/backend/base/langflow/api/v1/api_key.py @@ -8,20 +8,10 @@ from langflow.api.v1.schemas import ApiKeyCreateRequest, ApiKeysResponse from langflow.services.auth import utils as auth_utils # Assuming you have these methods in your service layer -from langflow.services.database.models.api_key.crud import ( - create_api_key, - delete_api_key, - get_api_keys, -) -from langflow.services.database.models.api_key.model import ( - ApiKeyCreate, - UnmaskedApiKeyRead, -) +from langflow.services.database.models.api_key.crud import create_api_key, delete_api_key, get_api_keys +from langflow.services.database.models.api_key.model import ApiKeyCreate, UnmaskedApiKeyRead from langflow.services.database.models.user.model import User -from langflow.services.deps import ( - get_session, - get_settings_service, -) +from langflow.services.deps import get_session, get_settings_service if TYPE_CHECKING: pass diff --git a/src/backend/langflow/api/v1/base.py b/src/backend/base/langflow/api/v1/base.py similarity index 100% rename from src/backend/langflow/api/v1/base.py rename to src/backend/base/langflow/api/v1/base.py diff --git a/src/backend/langflow/api/v1/callback.py b/src/backend/base/langflow/api/v1/callback.py similarity index 100% rename from src/backend/langflow/api/v1/callback.py rename to src/backend/base/langflow/api/v1/callback.py diff --git a/src/backend/langflow/api/v1/chat.py b/src/backend/base/langflow/api/v1/chat.py similarity index 100% rename from src/backend/langflow/api/v1/chat.py rename to src/backend/base/langflow/api/v1/chat.py diff --git a/src/backend/langflow/api/v1/credential.py b/src/backend/base/langflow/api/v1/credential.py similarity index 100% rename from src/backend/langflow/api/v1/credential.py rename to src/backend/base/langflow/api/v1/credential.py diff --git a/src/backend/langflow/api/v1/endpoints.py b/src/backend/base/langflow/api/v1/endpoints.py similarity index 99% rename from src/backend/langflow/api/v1/endpoints.py rename to src/backend/base/langflow/api/v1/endpoints.py index 627562408..7886321f7 100644 --- a/src/backend/langflow/api/v1/endpoints.py +++ b/src/backend/base/langflow/api/v1/endpoints.py @@ -239,7 +239,7 @@ async def create_upload_file( # get endpoint to return version of langflow @router.get("/version") def get_version(): - from langflow import __version__ + from langflow.version import __version__ return {"version": __version__} diff --git a/src/backend/langflow/api/v1/files.py b/src/backend/base/langflow/api/v1/files.py similarity index 99% rename from src/backend/langflow/api/v1/files.py rename to src/backend/base/langflow/api/v1/files.py index aea014d9d..435aea826 100644 --- a/src/backend/langflow/api/v1/files.py +++ b/src/backend/base/langflow/api/v1/files.py @@ -4,6 +4,8 @@ from io import BytesIO from fastapi import APIRouter, Depends, HTTPException, UploadFile from fastapi.responses import StreamingResponse + + from langflow.api.v1.schemas import UploadFileResponse from langflow.services.auth.utils import get_current_active_user from langflow.services.database.models.flow import Flow diff --git a/src/backend/langflow/api/v1/flows.py b/src/backend/base/langflow/api/v1/flows.py similarity index 98% rename from src/backend/langflow/api/v1/flows.py rename to src/backend/base/langflow/api/v1/flows.py index 149206fd0..bd055f120 100644 --- a/src/backend/langflow/api/v1/flows.py +++ b/src/backend/base/langflow/api/v1/flows.py @@ -12,12 +12,7 @@ from langflow.api.utils import remove_api_keys, validate_is_component from langflow.api.v1.schemas import FlowListCreate, FlowListRead from langflow.initial_setup.setup import STARTER_FOLDER_NAME from langflow.services.auth.utils import get_current_active_user -from langflow.services.database.models.flow import ( - Flow, - FlowCreate, - FlowRead, - FlowUpdate, -) +from langflow.services.database.models.flow import Flow, FlowCreate, FlowRead, FlowUpdate from langflow.services.database.models.user.model import User from langflow.services.deps import get_session, get_settings_service from langflow.services.settings.service import SettingsService diff --git a/src/backend/langflow/api/v1/login.py b/src/backend/base/langflow/api/v1/login.py similarity index 100% rename from src/backend/langflow/api/v1/login.py rename to src/backend/base/langflow/api/v1/login.py diff --git a/src/backend/langflow/api/v1/monitor.py b/src/backend/base/langflow/api/v1/monitor.py similarity index 99% rename from src/backend/langflow/api/v1/monitor.py rename to src/backend/base/langflow/api/v1/monitor.py index 0b962191e..dbefd1c3b 100644 --- a/src/backend/langflow/api/v1/monitor.py +++ b/src/backend/base/langflow/api/v1/monitor.py @@ -1,6 +1,8 @@ from typing import Optional from fastapi import APIRouter, Depends, HTTPException, Query + + from langflow.services.deps import get_monitor_service from langflow.services.monitor.schema import VertexBuildMapModel from langflow.services.monitor.service import MonitorService diff --git a/src/backend/langflow/api/v1/schemas.py b/src/backend/base/langflow/api/v1/schemas.py similarity index 100% rename from src/backend/langflow/api/v1/schemas.py rename to src/backend/base/langflow/api/v1/schemas.py diff --git a/src/backend/langflow/api/v1/store.py b/src/backend/base/langflow/api/v1/store.py similarity index 100% rename from src/backend/langflow/api/v1/store.py rename to src/backend/base/langflow/api/v1/store.py diff --git a/src/backend/langflow/api/v1/users.py b/src/backend/base/langflow/api/v1/users.py similarity index 100% rename from src/backend/langflow/api/v1/users.py rename to src/backend/base/langflow/api/v1/users.py diff --git a/src/backend/langflow/api/v1/validate.py b/src/backend/base/langflow/api/v1/validate.py similarity index 95% rename from src/backend/langflow/api/v1/validate.py rename to src/backend/base/langflow/api/v1/validate.py index 72d24b3bf..97841bca6 100644 --- a/src/backend/langflow/api/v1/validate.py +++ b/src/backend/base/langflow/api/v1/validate.py @@ -3,12 +3,7 @@ from collections import defaultdict from fastapi import APIRouter, HTTPException from loguru import logger -from langflow.api.v1.base import ( - Code, - CodeValidationResponse, - PromptValidationResponse, - ValidatePromptRequest, -) +from langflow.api.v1.base import Code, CodeValidationResponse, PromptValidationResponse, ValidatePromptRequest from langflow.base.prompts.utils import ( add_new_variables_to_template, get_old_custom_fields, diff --git a/src/backend/langflow/base/agents/__init__.py b/src/backend/base/langflow/base/__init__.py similarity index 100% rename from src/backend/langflow/base/agents/__init__.py rename to src/backend/base/langflow/base/__init__.py diff --git a/src/backend/langflow/base/data/__init__.py b/src/backend/base/langflow/base/agents/__init__.py similarity index 100% rename from src/backend/langflow/base/data/__init__.py rename to src/backend/base/langflow/base/agents/__init__.py diff --git a/src/backend/langflow/base/agents/agent.py b/src/backend/base/langflow/base/agents/agent.py similarity index 97% rename from src/backend/langflow/base/agents/agent.py rename to src/backend/base/langflow/base/agents/agent.py index 8dac73e61..029ab4913 100644 --- a/src/backend/langflow/base/agents/agent.py +++ b/src/backend/base/langflow/base/agents/agent.py @@ -1,9 +1,8 @@ from typing import List, Union from langchain.agents import AgentExecutor, BaseMultiActionAgent, BaseSingleActionAgent - -from langflow import CustomComponent from langflow.field_typing import BaseMemory, Text, Tool +from langflow.interface.custom.custom_component import CustomComponent class LCAgentComponent(CustomComponent): diff --git a/src/backend/langflow/base/io/__init__.py b/src/backend/base/langflow/base/data/__init__.py similarity index 100% rename from src/backend/langflow/base/io/__init__.py rename to src/backend/base/langflow/base/data/__init__.py diff --git a/src/backend/langflow/base/data/utils.py b/src/backend/base/langflow/base/data/utils.py similarity index 100% rename from src/backend/langflow/base/data/utils.py rename to src/backend/base/langflow/base/data/utils.py diff --git a/src/backend/langflow/base/prompts/__init__.py b/src/backend/base/langflow/base/io/__init__.py similarity index 100% rename from src/backend/langflow/base/prompts/__init__.py rename to src/backend/base/langflow/base/io/__init__.py diff --git a/src/backend/langflow/base/io/chat.py b/src/backend/base/langflow/base/io/chat.py similarity index 98% rename from src/backend/langflow/base/io/chat.py rename to src/backend/base/langflow/base/io/chat.py index 3411f603e..9aa75498f 100644 --- a/src/backend/langflow/base/io/chat.py +++ b/src/backend/base/langflow/base/io/chat.py @@ -1,8 +1,8 @@ import warnings from typing import Optional, Union -from langflow import CustomComponent from langflow.field_typing import Text +from langflow.interface.custom.custom_component import CustomComponent from langflow.memory import add_messages from langflow.schema import Record diff --git a/src/backend/langflow/base/io/text.py b/src/backend/base/langflow/base/io/text.py similarity index 87% rename from src/backend/langflow/base/io/text.py rename to src/backend/base/langflow/base/io/text.py index 8c6620781..919acf5d5 100644 --- a/src/backend/langflow/base/io/text.py +++ b/src/backend/base/langflow/base/io/text.py @@ -1,7 +1,7 @@ from typing import Optional -from langflow import CustomComponent from langflow.field_typing import Text +from langflow.interface.custom.custom_component import CustomComponent class TextComponent(CustomComponent): diff --git a/src/backend/langflow/base/models/__init__.py b/src/backend/base/langflow/base/models/__init__.py similarity index 100% rename from src/backend/langflow/base/models/__init__.py rename to src/backend/base/langflow/base/models/__init__.py diff --git a/src/backend/langflow/base/models/model.py b/src/backend/base/langflow/base/models/model.py similarity index 95% rename from src/backend/langflow/base/models/model.py rename to src/backend/base/langflow/base/models/model.py index e2ab4b6cf..331cb67a1 100644 --- a/src/backend/langflow/base/models/model.py +++ b/src/backend/base/langflow/base/models/model.py @@ -4,7 +4,7 @@ from langchain_core.language_models.chat_models import BaseChatModel from langchain_core.language_models.llms import LLM from langchain_core.messages import HumanMessage, SystemMessage -from langflow import CustomComponent +from langflow.interface.custom.custom_component import CustomComponent class LCModelComponent(CustomComponent): diff --git a/src/backend/langflow/components/documentloaders/__init__.py b/src/backend/base/langflow/base/prompts/__init__.py similarity index 100% rename from src/backend/langflow/components/documentloaders/__init__.py rename to src/backend/base/langflow/base/prompts/__init__.py diff --git a/src/backend/langflow/base/prompts/utils.py b/src/backend/base/langflow/base/prompts/utils.py similarity index 100% rename from src/backend/langflow/base/prompts/utils.py rename to src/backend/base/langflow/base/prompts/utils.py diff --git a/src/backend/langflow/components/__init__.py b/src/backend/base/langflow/components/__init__.py similarity index 100% rename from src/backend/langflow/components/__init__.py rename to src/backend/base/langflow/components/__init__.py diff --git a/src/backend/langflow/components/agents/AgentInitializer.py b/src/backend/base/langflow/components/agents/AgentInitializer.py similarity index 96% rename from src/backend/langflow/components/agents/AgentInitializer.py rename to src/backend/base/langflow/components/agents/AgentInitializer.py index 3d936df8a..d1f09d5cf 100644 --- a/src/backend/langflow/components/agents/AgentInitializer.py +++ b/src/backend/base/langflow/components/agents/AgentInitializer.py @@ -1,8 +1,9 @@ from typing import Callable, List, Optional, Union from langchain.agents import AgentExecutor, AgentType, initialize_agent, types -from langflow import CustomComponent + from langflow.field_typing import BaseChatMemory, BaseLanguageModel, Tool +from langflow.interface.custom.custom_component import CustomComponent class AgentInitializerComponent(CustomComponent): diff --git a/src/backend/langflow/components/agents/CSVAgent.py b/src/backend/base/langflow/components/agents/CSVAgent.py similarity index 96% rename from src/backend/langflow/components/agents/CSVAgent.py rename to src/backend/base/langflow/components/agents/CSVAgent.py index cc5cc8241..57774568f 100644 --- a/src/backend/langflow/components/agents/CSVAgent.py +++ b/src/backend/base/langflow/components/agents/CSVAgent.py @@ -1,6 +1,6 @@ from langchain_experimental.agents.agent_toolkits.csv.base import create_csv_agent -from langflow import CustomComponent +from langflow.custom import CustomComponent from langflow.field_typing import AgentExecutor, BaseLanguageModel diff --git a/src/backend/langflow/components/agents/JsonAgent.py b/src/backend/base/langflow/components/agents/JsonAgent.py similarity index 90% rename from src/backend/langflow/components/agents/JsonAgent.py rename to src/backend/base/langflow/components/agents/JsonAgent.py index 0197b9210..5fa342417 100644 --- a/src/backend/langflow/components/agents/JsonAgent.py +++ b/src/backend/base/langflow/components/agents/JsonAgent.py @@ -1,9 +1,10 @@ -from langflow import CustomComponent from langchain.agents import AgentExecutor, create_json_agent +from langchain_community.agent_toolkits.json.toolkit import JsonToolkit + from langflow.field_typing import ( BaseLanguageModel, ) -from langchain_community.agent_toolkits.json.toolkit import JsonToolkit +from langflow.interface.custom.custom_component import CustomComponent class JsonAgentComponent(CustomComponent): diff --git a/src/backend/langflow/components/agents/OpenAIConversationalAgent.py b/src/backend/base/langflow/components/agents/OpenAIConversationalAgent.py similarity index 97% rename from src/backend/langflow/components/agents/OpenAIConversationalAgent.py rename to src/backend/base/langflow/components/agents/OpenAIConversationalAgent.py index c0d128ca6..7c66353d4 100644 --- a/src/backend/langflow/components/agents/OpenAIConversationalAgent.py +++ b/src/backend/base/langflow/components/agents/OpenAIConversationalAgent.py @@ -9,8 +9,9 @@ from langchain.prompts.chat import MessagesPlaceholder from langchain.schema.memory import BaseMemory from langchain.tools import Tool from langchain_community.chat_models import ChatOpenAI -from langflow import CustomComponent + from langflow.field_typing.range_spec import RangeSpec +from langflow.interface.custom.custom_component import CustomComponent class ConversationalAgent(CustomComponent): diff --git a/src/backend/langflow/components/agents/SQLAgent.py b/src/backend/base/langflow/components/agents/SQLAgent.py similarity index 90% rename from src/backend/langflow/components/agents/SQLAgent.py rename to src/backend/base/langflow/components/agents/SQLAgent.py index 42b1b48f3..68f65d18f 100644 --- a/src/backend/langflow/components/agents/SQLAgent.py +++ b/src/backend/base/langflow/components/agents/SQLAgent.py @@ -1,10 +1,12 @@ -from langflow import CustomComponent -from typing import Union, Callable +from typing import Callable, Union + from langchain.agents import AgentExecutor -from langflow.field_typing import BaseLanguageModel -from langchain_community.agent_toolkits.sql.base import create_sql_agent from langchain.sql_database import SQLDatabase from langchain_community.agent_toolkits import SQLDatabaseToolkit +from langchain_community.agent_toolkits.sql.base import create_sql_agent + +from langflow.field_typing import BaseLanguageModel +from langflow.interface.custom.custom_component import CustomComponent class SQLAgentComponent(CustomComponent): diff --git a/src/backend/langflow/components/agents/VectorStoreAgent.py b/src/backend/base/langflow/components/agents/VectorStoreAgent.py similarity index 87% rename from src/backend/langflow/components/agents/VectorStoreAgent.py rename to src/backend/base/langflow/components/agents/VectorStoreAgent.py index b70ea4d59..095f9da41 100644 --- a/src/backend/langflow/components/agents/VectorStoreAgent.py +++ b/src/backend/base/langflow/components/agents/VectorStoreAgent.py @@ -1,8 +1,10 @@ -from langflow import CustomComponent +from typing import Callable, Union + from langchain.agents import AgentExecutor, create_vectorstore_agent from langchain.agents.agent_toolkits.vectorstore.toolkit import VectorStoreToolkit -from typing import Union, Callable + from langflow.field_typing import BaseLanguageModel +from langflow.interface.custom.custom_component import CustomComponent class VectorStoreAgentComponent(CustomComponent): diff --git a/src/backend/langflow/components/agents/VectorStoreRouterAgent.py b/src/backend/base/langflow/components/agents/VectorStoreRouterAgent.py similarity index 91% rename from src/backend/langflow/components/agents/VectorStoreRouterAgent.py rename to src/backend/base/langflow/components/agents/VectorStoreRouterAgent.py index 3174d9513..514a9767c 100644 --- a/src/backend/langflow/components/agents/VectorStoreRouterAgent.py +++ b/src/backend/base/langflow/components/agents/VectorStoreRouterAgent.py @@ -1,9 +1,11 @@ -from langflow import CustomComponent -from langchain_core.language_models.base import BaseLanguageModel -from langchain.agents.agent_toolkits.vectorstore.toolkit import VectorStoreRouterToolkit -from langchain.agents import create_vectorstore_router_agent from typing import Callable +from langchain.agents import create_vectorstore_router_agent +from langchain.agents.agent_toolkits.vectorstore.toolkit import VectorStoreRouterToolkit +from langchain_core.language_models.base import BaseLanguageModel + +from langflow.interface.custom.custom_component import CustomComponent + class VectorStoreRouterAgentComponent(CustomComponent): display_name = "VectorStoreRouterAgent" diff --git a/src/backend/langflow/components/agents/XMLAgent.py b/src/backend/base/langflow/components/agents/XMLAgent.py similarity index 100% rename from src/backend/langflow/components/agents/XMLAgent.py rename to src/backend/base/langflow/components/agents/XMLAgent.py diff --git a/src/backend/langflow/components/agents/__init__.py b/src/backend/base/langflow/components/agents/__init__.py similarity index 100% rename from src/backend/langflow/components/agents/__init__.py rename to src/backend/base/langflow/components/agents/__init__.py diff --git a/src/backend/langflow/components/chains/ConversationChain.py b/src/backend/base/langflow/components/chains/ConversationChain.py similarity index 95% rename from src/backend/langflow/components/chains/ConversationChain.py rename to src/backend/base/langflow/components/chains/ConversationChain.py index a6d66d8ab..2b8dd09a3 100644 --- a/src/backend/langflow/components/chains/ConversationChain.py +++ b/src/backend/base/langflow/components/chains/ConversationChain.py @@ -2,8 +2,8 @@ from typing import Optional from langchain.chains import ConversationChain -from langflow import CustomComponent from langflow.field_typing import BaseLanguageModel, BaseMemory, Text +from langflow.interface.custom.custom_component import CustomComponent class ConversationChainComponent(CustomComponent): diff --git a/src/backend/langflow/components/chains/LLMChain.py b/src/backend/base/langflow/components/chains/LLMChain.py similarity index 83% rename from src/backend/langflow/components/chains/LLMChain.py rename to src/backend/base/langflow/components/chains/LLMChain.py index 0354082c9..9c2b3eae2 100644 --- a/src/backend/langflow/components/chains/LLMChain.py +++ b/src/backend/base/langflow/components/chains/LLMChain.py @@ -2,13 +2,8 @@ from typing import Optional from langchain.chains import LLMChain -from langflow import CustomComponent -from langflow.field_typing import ( - BaseLanguageModel, - BaseMemory, - BasePromptTemplate, - Text, -) +from langflow.field_typing import BaseLanguageModel, BaseMemory, BasePromptTemplate, Text +from langflow.interface.custom.custom_component import CustomComponent class LLMChainComponent(CustomComponent): diff --git a/src/backend/langflow/components/chains/LLMCheckerChain.py b/src/backend/base/langflow/components/chains/LLMCheckerChain.py similarity index 92% rename from src/backend/langflow/components/chains/LLMCheckerChain.py rename to src/backend/base/langflow/components/chains/LLMCheckerChain.py index ee869caef..04e6fe67d 100644 --- a/src/backend/langflow/components/chains/LLMCheckerChain.py +++ b/src/backend/base/langflow/components/chains/LLMCheckerChain.py @@ -1,7 +1,7 @@ from langchain.chains import LLMCheckerChain -from langflow import CustomComponent from langflow.field_typing import BaseLanguageModel, Text +from langflow.interface.custom.custom_component import CustomComponent class LLMCheckerChainComponent(CustomComponent): diff --git a/src/backend/langflow/components/chains/LLMMathChain.py b/src/backend/base/langflow/components/chains/LLMMathChain.py similarity index 95% rename from src/backend/langflow/components/chains/LLMMathChain.py rename to src/backend/base/langflow/components/chains/LLMMathChain.py index 26453b597..0b7374da6 100644 --- a/src/backend/langflow/components/chains/LLMMathChain.py +++ b/src/backend/base/langflow/components/chains/LLMMathChain.py @@ -2,8 +2,8 @@ from typing import Optional from langchain.chains import LLMChain, LLMMathChain -from langflow import CustomComponent from langflow.field_typing import BaseLanguageModel, BaseMemory, Text +from langflow.interface.custom.custom_component import CustomComponent class LLMMathChainComponent(CustomComponent): diff --git a/src/backend/langflow/components/chains/RetrievalQA.py b/src/backend/base/langflow/components/chains/RetrievalQA.py similarity index 97% rename from src/backend/langflow/components/chains/RetrievalQA.py rename to src/backend/base/langflow/components/chains/RetrievalQA.py index 453b66d32..4ac514ec5 100644 --- a/src/backend/langflow/components/chains/RetrievalQA.py +++ b/src/backend/base/langflow/components/chains/RetrievalQA.py @@ -4,8 +4,8 @@ from langchain.chains.combine_documents.base import BaseCombineDocumentsChain from langchain.chains.retrieval_qa.base import RetrievalQA from langchain_core.documents import Document -from langflow import CustomComponent from langflow.field_typing import BaseMemory, BaseRetriever, Text +from langflow.interface.custom.custom_component import CustomComponent class RetrievalQAComponent(CustomComponent): diff --git a/src/backend/langflow/components/chains/RetrievalQAWithSourcesChain.py b/src/backend/base/langflow/components/chains/RetrievalQAWithSourcesChain.py similarity index 97% rename from src/backend/langflow/components/chains/RetrievalQAWithSourcesChain.py rename to src/backend/base/langflow/components/chains/RetrievalQAWithSourcesChain.py index 48f918a19..0c98a16ec 100644 --- a/src/backend/langflow/components/chains/RetrievalQAWithSourcesChain.py +++ b/src/backend/base/langflow/components/chains/RetrievalQAWithSourcesChain.py @@ -3,8 +3,8 @@ from typing import Optional from langchain.chains import RetrievalQAWithSourcesChain from langchain_core.documents import Document -from langflow import CustomComponent from langflow.field_typing import BaseLanguageModel, BaseMemory, BaseRetriever, Text +from langflow.interface.custom.custom_component import CustomComponent class RetrievalQAWithSourcesChainComponent(CustomComponent): diff --git a/src/backend/langflow/components/chains/SQLGenerator.py b/src/backend/base/langflow/components/chains/SQLGenerator.py similarity index 96% rename from src/backend/langflow/components/chains/SQLGenerator.py rename to src/backend/base/langflow/components/chains/SQLGenerator.py index d96db7a7f..3b111ba71 100644 --- a/src/backend/langflow/components/chains/SQLGenerator.py +++ b/src/backend/base/langflow/components/chains/SQLGenerator.py @@ -5,8 +5,8 @@ from langchain_community.utilities.sql_database import SQLDatabase from langchain_core.prompts import PromptTemplate from langchain_core.runnables import Runnable -from langflow import CustomComponent from langflow.field_typing import BaseLanguageModel, Text +from langflow.interface.custom.custom_component import CustomComponent class SQLGeneratorComponent(CustomComponent): diff --git a/src/backend/langflow/components/chains/__init__.py b/src/backend/base/langflow/components/chains/__init__.py similarity index 100% rename from src/backend/langflow/components/chains/__init__.py rename to src/backend/base/langflow/components/chains/__init__.py diff --git a/src/backend/langflow/components/data/APIRequest.py b/src/backend/base/langflow/components/data/APIRequest.py similarity index 98% rename from src/backend/langflow/components/data/APIRequest.py rename to src/backend/base/langflow/components/data/APIRequest.py index 75dbe69a5..4844e8f2d 100644 --- a/src/backend/langflow/components/data/APIRequest.py +++ b/src/backend/base/langflow/components/data/APIRequest.py @@ -4,7 +4,7 @@ from typing import List, Optional import httpx -from langflow import CustomComponent +from langflow.interface.custom.custom_component import CustomComponent from langflow.schema import Record diff --git a/src/backend/langflow/components/data/Directory.py b/src/backend/base/langflow/components/data/Directory.py similarity index 92% rename from src/backend/langflow/components/data/Directory.py rename to src/backend/base/langflow/components/data/Directory.py index d0428009d..fdca207a5 100644 --- a/src/backend/langflow/components/data/Directory.py +++ b/src/backend/base/langflow/components/data/Directory.py @@ -1,11 +1,7 @@ from typing import Any, Dict, List, Optional -from langflow import CustomComponent -from langflow.base.data.utils import ( - parallel_load_records, - parse_text_file_to_record, - retrieve_file_paths, -) +from langflow.base.data.utils import parallel_load_records, parse_text_file_to_record, retrieve_file_paths +from langflow.interface.custom.custom_component import CustomComponent from langflow.schema import Record diff --git a/src/backend/langflow/components/data/File.py b/src/backend/base/langflow/components/data/File.py similarity index 95% rename from src/backend/langflow/components/data/File.py rename to src/backend/base/langflow/components/data/File.py index 5d0b2ee56..4ffed5300 100644 --- a/src/backend/langflow/components/data/File.py +++ b/src/backend/base/langflow/components/data/File.py @@ -1,7 +1,7 @@ from typing import Any, Dict, List -from langflow import CustomComponent from langflow.base.data.utils import TEXT_FILE_TYPES, parse_text_file_to_record +from langflow.interface.custom.custom_component import CustomComponent from langflow.schema import Record diff --git a/src/backend/langflow/components/data/FileLoader.py b/src/backend/base/langflow/components/data/FileLoader.py similarity index 98% rename from src/backend/langflow/components/data/FileLoader.py rename to src/backend/base/langflow/components/data/FileLoader.py index 11406f2c2..56432617e 100644 --- a/src/backend/langflow/components/data/FileLoader.py +++ b/src/backend/base/langflow/components/data/FileLoader.py @@ -1,6 +1,6 @@ from typing import List -from langflow import CustomComponent +from langflow.interface.custom.custom_component import CustomComponent from langflow.schema import Record from langflow.utils.constants import LOADERS_INFO diff --git a/src/backend/langflow/components/data/URL.py b/src/backend/base/langflow/components/data/URL.py similarity index 89% rename from src/backend/langflow/components/data/URL.py rename to src/backend/base/langflow/components/data/URL.py index 2db18e7db..a7397051d 100644 --- a/src/backend/langflow/components/data/URL.py +++ b/src/backend/base/langflow/components/data/URL.py @@ -2,7 +2,7 @@ from typing import Any, Dict from langchain_community.document_loaders.web_base import WebBaseLoader -from langflow import CustomComponent +from langflow.interface.custom.custom_component import CustomComponent from langflow.schema import Record diff --git a/src/backend/langflow/components/data/__init__.py b/src/backend/base/langflow/components/data/__init__.py similarity index 100% rename from src/backend/langflow/components/data/__init__.py rename to src/backend/base/langflow/components/data/__init__.py diff --git a/src/backend/langflow/components/memories/__init__.py b/src/backend/base/langflow/components/documentloaders/__init__.py similarity index 100% rename from src/backend/langflow/components/memories/__init__.py rename to src/backend/base/langflow/components/documentloaders/__init__.py diff --git a/src/backend/langflow/components/embeddings/AmazonBedrockEmbeddings.py b/src/backend/base/langflow/components/embeddings/AmazonBedrockEmbeddings.py similarity index 95% rename from src/backend/langflow/components/embeddings/AmazonBedrockEmbeddings.py rename to src/backend/base/langflow/components/embeddings/AmazonBedrockEmbeddings.py index f9fe70d5b..e7661b113 100644 --- a/src/backend/langflow/components/embeddings/AmazonBedrockEmbeddings.py +++ b/src/backend/base/langflow/components/embeddings/AmazonBedrockEmbeddings.py @@ -3,8 +3,7 @@ from typing import Optional from langchain.embeddings.base import Embeddings from langchain_community.embeddings import BedrockEmbeddings - -from langflow import CustomComponent +from langflow.interface.custom.custom_component import CustomComponent class AmazonBedrockEmeddingsComponent(CustomComponent): diff --git a/src/backend/langflow/components/embeddings/AzureOpenAIEmbeddings.py b/src/backend/base/langflow/components/embeddings/AzureOpenAIEmbeddings.py similarity index 96% rename from src/backend/langflow/components/embeddings/AzureOpenAIEmbeddings.py rename to src/backend/base/langflow/components/embeddings/AzureOpenAIEmbeddings.py index a44259be9..a46230f72 100644 --- a/src/backend/langflow/components/embeddings/AzureOpenAIEmbeddings.py +++ b/src/backend/base/langflow/components/embeddings/AzureOpenAIEmbeddings.py @@ -1,7 +1,7 @@ from langchain.embeddings.base import Embeddings from langchain_community.embeddings import AzureOpenAIEmbeddings -from langflow import CustomComponent +from langflow.interface.custom.custom_component import CustomComponent class AzureOpenAIEmbeddingsComponent(CustomComponent): diff --git a/src/backend/langflow/components/embeddings/CohereEmbeddings.py b/src/backend/base/langflow/components/embeddings/CohereEmbeddings.py similarity index 94% rename from src/backend/langflow/components/embeddings/CohereEmbeddings.py rename to src/backend/base/langflow/components/embeddings/CohereEmbeddings.py index 049525b39..07b21dabe 100644 --- a/src/backend/langflow/components/embeddings/CohereEmbeddings.py +++ b/src/backend/base/langflow/components/embeddings/CohereEmbeddings.py @@ -1,7 +1,8 @@ from typing import Optional from langchain_community.embeddings.cohere import CohereEmbeddings -from langflow import CustomComponent + +from langflow.interface.custom.custom_component import CustomComponent class CohereEmbeddingsComponent(CustomComponent): diff --git a/src/backend/langflow/components/embeddings/HuggingFaceEmbeddings.py b/src/backend/base/langflow/components/embeddings/HuggingFaceEmbeddings.py similarity index 93% rename from src/backend/langflow/components/embeddings/HuggingFaceEmbeddings.py rename to src/backend/base/langflow/components/embeddings/HuggingFaceEmbeddings.py index fa2bb425a..8e3f2b96c 100644 --- a/src/backend/langflow/components/embeddings/HuggingFaceEmbeddings.py +++ b/src/backend/base/langflow/components/embeddings/HuggingFaceEmbeddings.py @@ -1,7 +1,9 @@ -from langflow import CustomComponent -from typing import Optional, Dict +from typing import Dict, Optional + from langchain_community.embeddings.huggingface import HuggingFaceEmbeddings +from langflow.interface.custom.custom_component import CustomComponent + class HuggingFaceEmbeddingsComponent(CustomComponent): display_name = "HuggingFaceEmbeddings" diff --git a/src/backend/langflow/components/embeddings/HuggingFaceInferenceAPIEmbeddings.py b/src/backend/base/langflow/components/embeddings/HuggingFaceInferenceAPIEmbeddings.py similarity index 96% rename from src/backend/langflow/components/embeddings/HuggingFaceInferenceAPIEmbeddings.py rename to src/backend/base/langflow/components/embeddings/HuggingFaceInferenceAPIEmbeddings.py index 578b601a6..b4198ab55 100644 --- a/src/backend/langflow/components/embeddings/HuggingFaceInferenceAPIEmbeddings.py +++ b/src/backend/base/langflow/components/embeddings/HuggingFaceInferenceAPIEmbeddings.py @@ -1,9 +1,10 @@ from typing import Dict, Optional from langchain_community.embeddings.huggingface import HuggingFaceInferenceAPIEmbeddings -from langflow import CustomComponent from pydantic.v1.types import SecretStr +from langflow.interface.custom.custom_component import CustomComponent + class HuggingFaceInferenceAPIEmbeddingsComponent(CustomComponent): display_name = "HuggingFaceInferenceAPIEmbeddings" diff --git a/src/backend/langflow/components/embeddings/OllamaEmbeddings.py b/src/backend/base/langflow/components/embeddings/OllamaEmbeddings.py similarity index 94% rename from src/backend/langflow/components/embeddings/OllamaEmbeddings.py rename to src/backend/base/langflow/components/embeddings/OllamaEmbeddings.py index 0e2da2005..07e219a2c 100644 --- a/src/backend/langflow/components/embeddings/OllamaEmbeddings.py +++ b/src/backend/base/langflow/components/embeddings/OllamaEmbeddings.py @@ -1,9 +1,10 @@ from typing import Optional -from langflow import CustomComponent from langchain.embeddings.base import Embeddings from langchain_community.embeddings import OllamaEmbeddings +from langflow.interface.custom.custom_component import CustomComponent + class OllamaEmbeddingsComponent(CustomComponent): """ diff --git a/src/backend/langflow/components/embeddings/OpenAIEmbeddings.py b/src/backend/base/langflow/components/embeddings/OpenAIEmbeddings.py similarity index 98% rename from src/backend/langflow/components/embeddings/OpenAIEmbeddings.py rename to src/backend/base/langflow/components/embeddings/OpenAIEmbeddings.py index ba6d634b8..3578caef7 100644 --- a/src/backend/langflow/components/embeddings/OpenAIEmbeddings.py +++ b/src/backend/base/langflow/components/embeddings/OpenAIEmbeddings.py @@ -1,10 +1,11 @@ from typing import Any, Callable, Dict, List, Optional, Union from langchain_openai.embeddings.base import OpenAIEmbeddings -from langflow import CustomComponent -from langflow.field_typing import NestedDict from pydantic.v1.types import SecretStr +from langflow.field_typing import NestedDict +from langflow.interface.custom.custom_component import CustomComponent + class OpenAIEmbeddingsComponent(CustomComponent): display_name = "OpenAIEmbeddings" diff --git a/src/backend/langflow/components/embeddings/VertexAIEmbeddings.py b/src/backend/base/langflow/components/embeddings/VertexAIEmbeddings.py similarity index 96% rename from src/backend/langflow/components/embeddings/VertexAIEmbeddings.py rename to src/backend/base/langflow/components/embeddings/VertexAIEmbeddings.py index f7f4cf2ee..30866bc69 100644 --- a/src/backend/langflow/components/embeddings/VertexAIEmbeddings.py +++ b/src/backend/base/langflow/components/embeddings/VertexAIEmbeddings.py @@ -1,6 +1,8 @@ -from langflow import CustomComponent +from typing import List, Optional + from langchain_community.embeddings import VertexAIEmbeddings -from typing import Optional, List + +from langflow.interface.custom.custom_component import CustomComponent class VertexAIEmbeddingsComponent(CustomComponent): diff --git a/src/backend/langflow/components/embeddings/__init__.py b/src/backend/base/langflow/components/embeddings/__init__.py similarity index 100% rename from src/backend/langflow/components/embeddings/__init__.py rename to src/backend/base/langflow/components/embeddings/__init__.py diff --git a/src/backend/langflow/components/experimental/ClearMessageHistory.py b/src/backend/base/langflow/components/experimental/ClearMessageHistory.py similarity index 90% rename from src/backend/langflow/components/experimental/ClearMessageHistory.py rename to src/backend/base/langflow/components/experimental/ClearMessageHistory.py index 2ceab8f1a..3c62b7ea3 100644 --- a/src/backend/langflow/components/experimental/ClearMessageHistory.py +++ b/src/backend/base/langflow/components/experimental/ClearMessageHistory.py @@ -1,4 +1,4 @@ -from langflow import CustomComponent +from langflow.interface.custom.custom_component import CustomComponent from langflow.memory import delete_messages, get_messages diff --git a/src/backend/langflow/components/experimental/ExtractDataFromRecord.py b/src/backend/base/langflow/components/experimental/ExtractDataFromRecord.py similarity index 95% rename from src/backend/langflow/components/experimental/ExtractDataFromRecord.py rename to src/backend/base/langflow/components/experimental/ExtractDataFromRecord.py index 6618ad213..5d816f112 100644 --- a/src/backend/langflow/components/experimental/ExtractDataFromRecord.py +++ b/src/backend/base/langflow/components/experimental/ExtractDataFromRecord.py @@ -1,4 +1,4 @@ -from langflow import CustomComponent +from langflow.interface.custom.custom_component import CustomComponent from langflow.schema import Record diff --git a/src/backend/langflow/components/experimental/FlowTool.py b/src/backend/base/langflow/components/experimental/FlowTool.py similarity index 98% rename from src/backend/langflow/components/experimental/FlowTool.py rename to src/backend/base/langflow/components/experimental/FlowTool.py index 5f504ff02..541341d85 100644 --- a/src/backend/langflow/components/experimental/FlowTool.py +++ b/src/backend/base/langflow/components/experimental/FlowTool.py @@ -3,7 +3,7 @@ from typing import Any, List, Optional, Text from langchain_core.tools import StructuredTool from loguru import logger -from langflow import CustomComponent +from langflow.custom import CustomComponent from langflow.field_typing import Tool from langflow.graph.graph.base import Graph from langflow.helpers.flow import build_function_and_schema diff --git a/src/backend/langflow/components/experimental/GetNotified.py b/src/backend/base/langflow/components/experimental/GetNotified.py similarity index 88% rename from src/backend/langflow/components/experimental/GetNotified.py rename to src/backend/base/langflow/components/experimental/GetNotified.py index 55b014b24..d2ee6ede9 100644 --- a/src/backend/langflow/components/experimental/GetNotified.py +++ b/src/backend/base/langflow/components/experimental/GetNotified.py @@ -1,4 +1,4 @@ -from langflow import CustomComponent +from langflow.interface.custom.custom_component import CustomComponent from langflow.schema import Record diff --git a/src/backend/langflow/components/experimental/ListFlows.py b/src/backend/base/langflow/components/experimental/ListFlows.py similarity index 85% rename from src/backend/langflow/components/experimental/ListFlows.py rename to src/backend/base/langflow/components/experimental/ListFlows.py index e0533660e..c7b421d15 100644 --- a/src/backend/langflow/components/experimental/ListFlows.py +++ b/src/backend/base/langflow/components/experimental/ListFlows.py @@ -1,6 +1,6 @@ from typing import List -from langflow import CustomComponent +from langflow.interface.custom.custom_component import CustomComponent from langflow.schema import Record diff --git a/src/backend/langflow/components/experimental/MergeRecords.py b/src/backend/base/langflow/components/experimental/MergeRecords.py similarity index 92% rename from src/backend/langflow/components/experimental/MergeRecords.py rename to src/backend/base/langflow/components/experimental/MergeRecords.py index c0b112f6b..60e5ffe20 100644 --- a/src/backend/langflow/components/experimental/MergeRecords.py +++ b/src/backend/base/langflow/components/experimental/MergeRecords.py @@ -1,4 +1,4 @@ -from langflow import CustomComponent +from langflow.interface.custom.custom_component import CustomComponent from langflow.schema import Record diff --git a/src/backend/langflow/components/experimental/Notify.py b/src/backend/base/langflow/components/experimental/Notify.py similarity index 95% rename from src/backend/langflow/components/experimental/Notify.py rename to src/backend/base/langflow/components/experimental/Notify.py index 57a496f4c..9af7f8ec6 100644 --- a/src/backend/langflow/components/experimental/Notify.py +++ b/src/backend/base/langflow/components/experimental/Notify.py @@ -1,6 +1,6 @@ from typing import Optional -from langflow import CustomComponent +from langflow.interface.custom.custom_component import CustomComponent from langflow.schema import Record diff --git a/src/backend/langflow/components/experimental/RunFlow.py b/src/backend/base/langflow/components/experimental/RunFlow.py similarity index 98% rename from src/backend/langflow/components/experimental/RunFlow.py rename to src/backend/base/langflow/components/experimental/RunFlow.py index 70e5e78e9..d3769de7a 100644 --- a/src/backend/langflow/components/experimental/RunFlow.py +++ b/src/backend/base/langflow/components/experimental/RunFlow.py @@ -1,6 +1,6 @@ from typing import Any, List, Optional -from langflow import CustomComponent +from langflow.custom import CustomComponent from langflow.field_typing import NestedDict, Text from langflow.graph.schema import ResultData from langflow.schema import Record, dotdict diff --git a/src/backend/langflow/components/experimental/RunnableExecutor.py b/src/backend/base/langflow/components/experimental/RunnableExecutor.py similarity index 94% rename from src/backend/langflow/components/experimental/RunnableExecutor.py rename to src/backend/base/langflow/components/experimental/RunnableExecutor.py index 9d790677b..09bf5bf4d 100644 --- a/src/backend/langflow/components/experimental/RunnableExecutor.py +++ b/src/backend/base/langflow/components/experimental/RunnableExecutor.py @@ -1,7 +1,7 @@ from langchain_core.runnables import Runnable -from langflow import CustomComponent from langflow.field_typing import Text +from langflow.interface.custom.custom_component import CustomComponent class RunnableExecComponent(CustomComponent): diff --git a/src/backend/langflow/components/experimental/SQLExecutor.py b/src/backend/base/langflow/components/experimental/SQLExecutor.py similarity index 96% rename from src/backend/langflow/components/experimental/SQLExecutor.py rename to src/backend/base/langflow/components/experimental/SQLExecutor.py index f8e7b3f9b..2289514a6 100644 --- a/src/backend/langflow/components/experimental/SQLExecutor.py +++ b/src/backend/base/langflow/components/experimental/SQLExecutor.py @@ -1,8 +1,8 @@ from langchain_community.tools.sql_database.tool import QuerySQLDataBaseTool from langchain_experimental.sql.base import SQLDatabase -from langflow import CustomComponent from langflow.field_typing import Text +from langflow.interface.custom.custom_component import CustomComponent class SQLExecutorComponent(CustomComponent): diff --git a/src/backend/langflow/components/experimental/SubFlow.py b/src/backend/base/langflow/components/experimental/SubFlow.py similarity index 99% rename from src/backend/langflow/components/experimental/SubFlow.py rename to src/backend/base/langflow/components/experimental/SubFlow.py index 558b1b9be..150461275 100644 --- a/src/backend/langflow/components/experimental/SubFlow.py +++ b/src/backend/base/langflow/components/experimental/SubFlow.py @@ -2,7 +2,7 @@ from typing import Any, List, Optional, Text, Tuple from loguru import logger -from langflow import CustomComponent +from langflow.custom import CustomComponent from langflow.graph.graph.base import Graph from langflow.graph.schema import ResultData, RunOutputs from langflow.schema import Record diff --git a/src/backend/langflow/components/experimental/__init__.py b/src/backend/base/langflow/components/experimental/__init__.py similarity index 100% rename from src/backend/langflow/components/experimental/__init__.py rename to src/backend/base/langflow/components/experimental/__init__.py diff --git a/src/backend/langflow/components/helpers/CustomComponent.py b/src/backend/base/langflow/components/helpers/CustomComponent.py similarity index 85% rename from src/backend/langflow/components/helpers/CustomComponent.py rename to src/backend/base/langflow/components/helpers/CustomComponent.py index 71a5f7656..e30b5fc4e 100644 --- a/src/backend/langflow/components/helpers/CustomComponent.py +++ b/src/backend/base/langflow/components/helpers/CustomComponent.py @@ -1,5 +1,5 @@ -from langflow import CustomComponent from langflow.field_typing import Data +from langflow.interface.custom.custom_component import CustomComponent class Component(CustomComponent): diff --git a/src/backend/langflow/components/helpers/DocumentToRecord.py b/src/backend/base/langflow/components/helpers/DocumentToRecord.py similarity index 89% rename from src/backend/langflow/components/helpers/DocumentToRecord.py rename to src/backend/base/langflow/components/helpers/DocumentToRecord.py index b5dc3f657..2f3c9316b 100644 --- a/src/backend/langflow/components/helpers/DocumentToRecord.py +++ b/src/backend/base/langflow/components/helpers/DocumentToRecord.py @@ -2,7 +2,7 @@ from typing import List from langchain_core.documents import Document -from langflow import CustomComponent +from langflow.interface.custom.custom_component import CustomComponent from langflow.schema import Record diff --git a/src/backend/langflow/components/helpers/IDGenerator.py b/src/backend/base/langflow/components/helpers/IDGenerator.py similarity index 91% rename from src/backend/langflow/components/helpers/IDGenerator.py rename to src/backend/base/langflow/components/helpers/IDGenerator.py index e69b2457e..534dd63ed 100644 --- a/src/backend/langflow/components/helpers/IDGenerator.py +++ b/src/backend/base/langflow/components/helpers/IDGenerator.py @@ -1,7 +1,7 @@ import uuid from typing import Any, Optional -from langflow import CustomComponent +from langflow.interface.custom.custom_component import CustomComponent class UUIDGeneratorComponent(CustomComponent): diff --git a/src/backend/langflow/components/helpers/MessageHistory.py b/src/backend/base/langflow/components/helpers/MessageHistory.py similarity index 95% rename from src/backend/langflow/components/helpers/MessageHistory.py rename to src/backend/base/langflow/components/helpers/MessageHistory.py index dabba3869..87bbb12c9 100644 --- a/src/backend/langflow/components/helpers/MessageHistory.py +++ b/src/backend/base/langflow/components/helpers/MessageHistory.py @@ -1,6 +1,6 @@ from typing import List, Optional -from langflow import CustomComponent +from langflow.interface.custom.custom_component import CustomComponent from langflow.memory import get_messages from langflow.schema import Record diff --git a/src/backend/langflow/components/helpers/PythonFunction.py b/src/backend/base/langflow/components/helpers/PythonFunction.py similarity index 90% rename from src/backend/langflow/components/helpers/PythonFunction.py rename to src/backend/base/langflow/components/helpers/PythonFunction.py index 0fab524cc..28e902abe 100644 --- a/src/backend/langflow/components/helpers/PythonFunction.py +++ b/src/backend/base/langflow/components/helpers/PythonFunction.py @@ -1,7 +1,7 @@ from typing import Callable -from langflow import CustomComponent from langflow.field_typing import Code +from langflow.interface.custom.custom_component import CustomComponent from langflow.interface.custom.utils import get_function diff --git a/src/backend/langflow/components/helpers/RecordsAsText.py b/src/backend/base/langflow/components/helpers/RecordsAsText.py similarity index 93% rename from src/backend/langflow/components/helpers/RecordsAsText.py rename to src/backend/base/langflow/components/helpers/RecordsAsText.py index f7750bdba..5597e411a 100644 --- a/src/backend/langflow/components/helpers/RecordsAsText.py +++ b/src/backend/base/langflow/components/helpers/RecordsAsText.py @@ -1,6 +1,6 @@ -from langflow import CustomComponent from langflow.field_typing import Text from langflow.helpers.record import records_to_text +from langflow.interface.custom.custom_component import CustomComponent from langflow.schema import Record diff --git a/src/backend/langflow/components/helpers/SearchApi.py b/src/backend/base/langflow/components/helpers/SearchApi.py similarity index 97% rename from src/backend/langflow/components/helpers/SearchApi.py rename to src/backend/base/langflow/components/helpers/SearchApi.py index a80cd22d5..3dcd48d9f 100644 --- a/src/backend/langflow/components/helpers/SearchApi.py +++ b/src/backend/base/langflow/components/helpers/SearchApi.py @@ -2,7 +2,7 @@ from typing import Optional from langchain_community.utilities.searchapi import SearchApiAPIWrapper -from langflow import CustomComponent +from langflow.custom import CustomComponent from langflow.schema.schema import Record from langflow.services.database.models.base import orjson_dumps diff --git a/src/backend/langflow/components/helpers/TextToRecord.py b/src/backend/base/langflow/components/helpers/TextToRecord.py similarity index 89% rename from src/backend/langflow/components/helpers/TextToRecord.py rename to src/backend/base/langflow/components/helpers/TextToRecord.py index 396458c5e..72668a580 100644 --- a/src/backend/langflow/components/helpers/TextToRecord.py +++ b/src/backend/base/langflow/components/helpers/TextToRecord.py @@ -1,4 +1,4 @@ -from langflow import CustomComponent +from langflow.interface.custom.custom_component import CustomComponent from langflow.schema import Record diff --git a/src/backend/langflow/components/helpers/UpdateRecord.py b/src/backend/base/langflow/components/helpers/UpdateRecord.py similarity index 93% rename from src/backend/langflow/components/helpers/UpdateRecord.py rename to src/backend/base/langflow/components/helpers/UpdateRecord.py index 0ec08de08..749f3abe8 100644 --- a/src/backend/langflow/components/helpers/UpdateRecord.py +++ b/src/backend/base/langflow/components/helpers/UpdateRecord.py @@ -1,4 +1,4 @@ -from langflow import CustomComponent +from langflow.interface.custom.custom_component import CustomComponent from langflow.schema import Record diff --git a/src/backend/langflow/components/helpers/__init__.py b/src/backend/base/langflow/components/helpers/__init__.py similarity index 100% rename from src/backend/langflow/components/helpers/__init__.py rename to src/backend/base/langflow/components/helpers/__init__.py diff --git a/src/backend/langflow/components/inputs/ChatInput.py b/src/backend/base/langflow/components/inputs/ChatInput.py similarity index 100% rename from src/backend/langflow/components/inputs/ChatInput.py rename to src/backend/base/langflow/components/inputs/ChatInput.py diff --git a/src/backend/langflow/components/inputs/JSONInput.py b/src/backend/base/langflow/components/inputs/JSONInput.py similarity index 94% rename from src/backend/langflow/components/inputs/JSONInput.py rename to src/backend/base/langflow/components/inputs/JSONInput.py index 752f41aa1..0306c2c61 100644 --- a/src/backend/langflow/components/inputs/JSONInput.py +++ b/src/backend/base/langflow/components/inputs/JSONInput.py @@ -1,7 +1,7 @@ import ast import json -from langflow import CustomComponent +from langflow.custom import CustomComponent from langflow.schema import Record diff --git a/src/backend/langflow/components/inputs/Prompt.py b/src/backend/base/langflow/components/inputs/Prompt.py similarity index 93% rename from src/backend/langflow/components/inputs/Prompt.py rename to src/backend/base/langflow/components/inputs/Prompt.py index 17055aec3..40f86ccb2 100644 --- a/src/backend/langflow/components/inputs/Prompt.py +++ b/src/backend/base/langflow/components/inputs/Prompt.py @@ -1,7 +1,7 @@ from langchain_core.prompts import PromptTemplate -from langflow import CustomComponent from langflow.field_typing import Prompt, TemplateField, Text +from langflow.interface.custom.custom_component import CustomComponent class PromptComponent(CustomComponent): diff --git a/src/backend/langflow/components/inputs/TextInput.py b/src/backend/base/langflow/components/inputs/TextInput.py similarity index 100% rename from src/backend/langflow/components/inputs/TextInput.py rename to src/backend/base/langflow/components/inputs/TextInput.py diff --git a/src/backend/langflow/components/inputs/__init__.py b/src/backend/base/langflow/components/inputs/__init__.py similarity index 100% rename from src/backend/langflow/components/inputs/__init__.py rename to src/backend/base/langflow/components/inputs/__init__.py diff --git a/src/backend/langflow/components/langchain_utilities/BingSearchAPIWrapper.py b/src/backend/base/langflow/components/langchain_utilities/BingSearchAPIWrapper.py similarity index 94% rename from src/backend/langflow/components/langchain_utilities/BingSearchAPIWrapper.py rename to src/backend/base/langflow/components/langchain_utilities/BingSearchAPIWrapper.py index b9dc4a2ef..23eebee10 100644 --- a/src/backend/langflow/components/langchain_utilities/BingSearchAPIWrapper.py +++ b/src/backend/base/langflow/components/langchain_utilities/BingSearchAPIWrapper.py @@ -1,10 +1,10 @@ -from langflow import CustomComponent - # Assuming `BingSearchAPIWrapper` is a class that exists in the context # and has the appropriate methods and attributes. # We need to make sure this class is importable from the context where this code will be running. from langchain_community.utilities.bing_search import BingSearchAPIWrapper +from langflow.interface.custom.custom_component import CustomComponent + class BingSearchAPIWrapperComponent(CustomComponent): display_name = "BingSearchAPIWrapper" diff --git a/src/backend/langflow/components/langchain_utilities/GoogleSearchAPIWrapper.py b/src/backend/base/langflow/components/langchain_utilities/GoogleSearchAPIWrapper.py similarity index 91% rename from src/backend/langflow/components/langchain_utilities/GoogleSearchAPIWrapper.py rename to src/backend/base/langflow/components/langchain_utilities/GoogleSearchAPIWrapper.py index 1d7123dc3..3f2f67faf 100644 --- a/src/backend/langflow/components/langchain_utilities/GoogleSearchAPIWrapper.py +++ b/src/backend/base/langflow/components/langchain_utilities/GoogleSearchAPIWrapper.py @@ -1,7 +1,8 @@ from typing import Callable, Union from langchain_community.utilities.google_search import GoogleSearchAPIWrapper -from langflow import CustomComponent + +from langflow.interface.custom.custom_component import CustomComponent class GoogleSearchAPIWrapperComponent(CustomComponent): diff --git a/src/backend/langflow/components/langchain_utilities/GoogleSerperAPIWrapper.py b/src/backend/base/langflow/components/langchain_utilities/GoogleSerperAPIWrapper.py similarity index 95% rename from src/backend/langflow/components/langchain_utilities/GoogleSerperAPIWrapper.py rename to src/backend/base/langflow/components/langchain_utilities/GoogleSerperAPIWrapper.py index 3c340e9c2..e70e85cf4 100644 --- a/src/backend/langflow/components/langchain_utilities/GoogleSerperAPIWrapper.py +++ b/src/backend/base/langflow/components/langchain_utilities/GoogleSerperAPIWrapper.py @@ -4,7 +4,7 @@ from typing import Dict # If this class does not exist, you would need to create it or import the appropriate class from another module from langchain_community.utilities.google_serper import GoogleSerperAPIWrapper -from langflow import CustomComponent +from langflow.interface.custom.custom_component import CustomComponent class GoogleSerperAPIWrapperComponent(CustomComponent): diff --git a/src/backend/langflow/components/langchain_utilities/JSONDocumentBuilder.py b/src/backend/base/langflow/components/langchain_utilities/JSONDocumentBuilder.py similarity index 95% rename from src/backend/langflow/components/langchain_utilities/JSONDocumentBuilder.py rename to src/backend/base/langflow/components/langchain_utilities/JSONDocumentBuilder.py index b287bf40c..df783470a 100644 --- a/src/backend/langflow/components/langchain_utilities/JSONDocumentBuilder.py +++ b/src/backend/base/langflow/components/langchain_utilities/JSONDocumentBuilder.py @@ -12,7 +12,8 @@ # - **Document:** The Document containing the JSON object. from langchain_core.documents import Document -from langflow import CustomComponent + +from langflow.interface.custom.custom_component import CustomComponent from langflow.services.database.models.base import orjson_dumps diff --git a/src/backend/langflow/components/langchain_utilities/SQLDatabase.py b/src/backend/base/langflow/components/langchain_utilities/SQLDatabase.py similarity index 89% rename from src/backend/langflow/components/langchain_utilities/SQLDatabase.py rename to src/backend/base/langflow/components/langchain_utilities/SQLDatabase.py index ddd1be318..7bbbdb870 100644 --- a/src/backend/langflow/components/langchain_utilities/SQLDatabase.py +++ b/src/backend/base/langflow/components/langchain_utilities/SQLDatabase.py @@ -1,6 +1,6 @@ from langchain_experimental.sql.base import SQLDatabase -from langflow import CustomComponent +from langflow.interface.custom.custom_component import CustomComponent class SQLDatabaseComponent(CustomComponent): diff --git a/src/backend/langflow/components/langchain_utilities/SearxSearchWrapper.py b/src/backend/base/langflow/components/langchain_utilities/SearxSearchWrapper.py similarity index 90% rename from src/backend/langflow/components/langchain_utilities/SearxSearchWrapper.py rename to src/backend/base/langflow/components/langchain_utilities/SearxSearchWrapper.py index b406f3882..d255f34b7 100644 --- a/src/backend/langflow/components/langchain_utilities/SearxSearchWrapper.py +++ b/src/backend/base/langflow/components/langchain_utilities/SearxSearchWrapper.py @@ -1,7 +1,9 @@ -from langflow import CustomComponent -from typing import Optional, Dict +from typing import Dict, Optional + from langchain_community.utilities.searx_search import SearxSearchWrapper +from langflow.interface.custom.custom_component import CustomComponent + class SearxSearchWrapperComponent(CustomComponent): display_name = "SearxSearchWrapper" diff --git a/src/backend/langflow/components/langchain_utilities/SerpAPIWrapper.py b/src/backend/base/langflow/components/langchain_utilities/SerpAPIWrapper.py similarity index 93% rename from src/backend/langflow/components/langchain_utilities/SerpAPIWrapper.py rename to src/backend/base/langflow/components/langchain_utilities/SerpAPIWrapper.py index 924f5628d..c64a26e79 100644 --- a/src/backend/langflow/components/langchain_utilities/SerpAPIWrapper.py +++ b/src/backend/base/langflow/components/langchain_utilities/SerpAPIWrapper.py @@ -1,7 +1,8 @@ from typing import Callable, Union from langchain_community.utilities.serpapi import SerpAPIWrapper -from langflow import CustomComponent + +from langflow.interface.custom.custom_component import CustomComponent class SerpAPIWrapperComponent(CustomComponent): diff --git a/src/backend/langflow/components/langchain_utilities/WikipediaAPIWrapper.py b/src/backend/base/langflow/components/langchain_utilities/WikipediaAPIWrapper.py similarity index 93% rename from src/backend/langflow/components/langchain_utilities/WikipediaAPIWrapper.py rename to src/backend/base/langflow/components/langchain_utilities/WikipediaAPIWrapper.py index 00820881b..144792315 100644 --- a/src/backend/langflow/components/langchain_utilities/WikipediaAPIWrapper.py +++ b/src/backend/base/langflow/components/langchain_utilities/WikipediaAPIWrapper.py @@ -1,7 +1,8 @@ from typing import Callable, Union from langchain_community.utilities.wikipedia import WikipediaAPIWrapper -from langflow import CustomComponent + +from langflow.interface.custom.custom_component import CustomComponent # Assuming WikipediaAPIWrapper is a class that needs to be imported. # The import statement is not included as it is not provided in the JSON diff --git a/src/backend/langflow/components/langchain_utilities/WolframAlphaAPIWrapper.py b/src/backend/base/langflow/components/langchain_utilities/WolframAlphaAPIWrapper.py similarity index 90% rename from src/backend/langflow/components/langchain_utilities/WolframAlphaAPIWrapper.py rename to src/backend/base/langflow/components/langchain_utilities/WolframAlphaAPIWrapper.py index 2e71a161c..bc224e83c 100644 --- a/src/backend/langflow/components/langchain_utilities/WolframAlphaAPIWrapper.py +++ b/src/backend/base/langflow/components/langchain_utilities/WolframAlphaAPIWrapper.py @@ -1,7 +1,8 @@ from typing import Callable, Union from langchain_community.utilities.wolfram_alpha import WolframAlphaAPIWrapper -from langflow import CustomComponent + +from langflow.interface.custom.custom_component import CustomComponent # Since all the fields in the JSON have show=False, we will only create a basic component # without any configurable fields. diff --git a/src/backend/langflow/components/tools/__init__.py b/src/backend/base/langflow/components/memories/__init__.py similarity index 100% rename from src/backend/langflow/components/tools/__init__.py rename to src/backend/base/langflow/components/memories/__init__.py diff --git a/src/backend/langflow/components/model_specs/AmazonBedrockSpecs.py b/src/backend/base/langflow/components/model_specs/AmazonBedrockSpecs.py similarity index 96% rename from src/backend/langflow/components/model_specs/AmazonBedrockSpecs.py rename to src/backend/base/langflow/components/model_specs/AmazonBedrockSpecs.py index 92b7bc7f9..1a18f5c08 100644 --- a/src/backend/langflow/components/model_specs/AmazonBedrockSpecs.py +++ b/src/backend/base/langflow/components/model_specs/AmazonBedrockSpecs.py @@ -3,8 +3,7 @@ from typing import Optional from langchain.llms.base import BaseLLM from langchain_community.llms.bedrock import Bedrock - -from langflow import CustomComponent +from langflow.interface.custom.custom_component import CustomComponent class AmazonBedrockComponent(CustomComponent): diff --git a/src/backend/langflow/components/model_specs/AnthropicLLMSpecs.py b/src/backend/base/langflow/components/model_specs/AnthropicLLMSpecs.py similarity index 97% rename from src/backend/langflow/components/model_specs/AnthropicLLMSpecs.py rename to src/backend/base/langflow/components/model_specs/AnthropicLLMSpecs.py index d5c093863..2ea78162b 100644 --- a/src/backend/langflow/components/model_specs/AnthropicLLMSpecs.py +++ b/src/backend/base/langflow/components/model_specs/AnthropicLLMSpecs.py @@ -1,10 +1,10 @@ from typing import Optional -from langchain_community.chat_models.anthropic import ChatAnthropic from langchain.llms.base import BaseLanguageModel +from langchain_community.chat_models.anthropic import ChatAnthropic from pydantic.v1 import SecretStr -from langflow import CustomComponent +from langflow.interface.custom.custom_component import CustomComponent class AnthropicLLM(CustomComponent): diff --git a/src/backend/langflow/components/model_specs/AnthropicSpecs.py b/src/backend/base/langflow/components/model_specs/AnthropicSpecs.py similarity index 95% rename from src/backend/langflow/components/model_specs/AnthropicSpecs.py rename to src/backend/base/langflow/components/model_specs/AnthropicSpecs.py index 218dac33f..23c284888 100644 --- a/src/backend/langflow/components/model_specs/AnthropicSpecs.py +++ b/src/backend/base/langflow/components/model_specs/AnthropicSpecs.py @@ -3,8 +3,8 @@ from typing import Optional from langchain_community.llms.anthropic import Anthropic from pydantic.v1 import SecretStr -from langflow import CustomComponent from langflow.field_typing import BaseLanguageModel, NestedDict +from langflow.interface.custom.custom_component import CustomComponent class AnthropicComponent(CustomComponent): diff --git a/src/backend/langflow/components/model_specs/AzureChatOpenAISpecs.py b/src/backend/base/langflow/components/model_specs/AzureChatOpenAISpecs.py similarity index 97% rename from src/backend/langflow/components/model_specs/AzureChatOpenAISpecs.py rename to src/backend/base/langflow/components/model_specs/AzureChatOpenAISpecs.py index e6e1b5da5..6f468bbed 100644 --- a/src/backend/langflow/components/model_specs/AzureChatOpenAISpecs.py +++ b/src/backend/base/langflow/components/model_specs/AzureChatOpenAISpecs.py @@ -3,7 +3,7 @@ from typing import Optional from langchain.llms.base import BaseLanguageModel from langchain_community.chat_models.azure_openai import AzureChatOpenAI -from langflow import CustomComponent +from langflow.interface.custom.custom_component import CustomComponent class AzureChatOpenAISpecsComponent(CustomComponent): diff --git a/src/backend/langflow/components/model_specs/BaiduQianfanChatEndpointsSpecs.py b/src/backend/base/langflow/components/model_specs/BaiduQianfanChatEndpointsSpecs.py similarity index 98% rename from src/backend/langflow/components/model_specs/BaiduQianfanChatEndpointsSpecs.py rename to src/backend/base/langflow/components/model_specs/BaiduQianfanChatEndpointsSpecs.py index fd7341e15..9c39acdf6 100644 --- a/src/backend/langflow/components/model_specs/BaiduQianfanChatEndpointsSpecs.py +++ b/src/backend/base/langflow/components/model_specs/BaiduQianfanChatEndpointsSpecs.py @@ -1,10 +1,10 @@ from typing import Optional -from langchain_community.chat_models.baidu_qianfan_endpoint import QianfanChatEndpoint from langchain.llms.base import BaseLLM +from langchain_community.chat_models.baidu_qianfan_endpoint import QianfanChatEndpoint from pydantic.v1 import SecretStr -from langflow import CustomComponent +from langflow.interface.custom.custom_component import CustomComponent class QianfanChatEndpointComponent(CustomComponent): diff --git a/src/backend/langflow/components/model_specs/BaiduQianfanLLMEndpointsSpecs.py b/src/backend/base/langflow/components/model_specs/BaiduQianfanLLMEndpointsSpecs.py similarity index 97% rename from src/backend/langflow/components/model_specs/BaiduQianfanLLMEndpointsSpecs.py rename to src/backend/base/langflow/components/model_specs/BaiduQianfanLLMEndpointsSpecs.py index 786c4516b..acbf8ba28 100644 --- a/src/backend/langflow/components/model_specs/BaiduQianfanLLMEndpointsSpecs.py +++ b/src/backend/base/langflow/components/model_specs/BaiduQianfanLLMEndpointsSpecs.py @@ -1,8 +1,10 @@ from typing import Optional -from langflow import CustomComponent + from langchain.llms.baidu_qianfan_endpoint import QianfanLLMEndpoint from langchain.llms.base import BaseLLM +from langflow.interface.custom.custom_component import CustomComponent + class QianfanLLMEndpointComponent(CustomComponent): display_name: str = "QianfanLLMEndpoint" diff --git a/src/backend/langflow/components/model_specs/CTransformersSpecs.py b/src/backend/base/langflow/components/model_specs/CTransformersSpecs.py similarity index 95% rename from src/backend/langflow/components/model_specs/CTransformersSpecs.py rename to src/backend/base/langflow/components/model_specs/CTransformersSpecs.py index a0668814e..ffa4f57e7 100644 --- a/src/backend/langflow/components/model_specs/CTransformersSpecs.py +++ b/src/backend/base/langflow/components/model_specs/CTransformersSpecs.py @@ -2,7 +2,7 @@ from typing import Dict, Optional from langchain_community.llms.ctransformers import CTransformers -from langflow import CustomComponent +from langflow.interface.custom.custom_component import CustomComponent class CTransformersComponent(CustomComponent): diff --git a/src/backend/langflow/components/model_specs/ChatAnthropicSpecs.py b/src/backend/base/langflow/components/model_specs/ChatAnthropicSpecs.py similarity index 92% rename from src/backend/langflow/components/model_specs/ChatAnthropicSpecs.py rename to src/backend/base/langflow/components/model_specs/ChatAnthropicSpecs.py index fe3c3b6bb..3b6a0e637 100644 --- a/src/backend/langflow/components/model_specs/ChatAnthropicSpecs.py +++ b/src/backend/base/langflow/components/model_specs/ChatAnthropicSpecs.py @@ -1,8 +1,10 @@ -from pydantic.v1.types import SecretStr -from langflow import CustomComponent -from typing import Optional, Union, Callable -from langflow.field_typing import BaseLanguageModel +from typing import Callable, Optional, Union + from langchain_community.chat_models.anthropic import ChatAnthropic +from pydantic.v1.types import SecretStr + +from langflow.field_typing import BaseLanguageModel +from langflow.interface.custom.custom_component import CustomComponent class ChatAnthropicComponent(CustomComponent): diff --git a/src/backend/langflow/components/model_specs/ChatLiteLLMSpecs.py b/src/backend/base/langflow/components/model_specs/ChatLiteLLMSpecs.py similarity index 98% rename from src/backend/langflow/components/model_specs/ChatLiteLLMSpecs.py rename to src/backend/base/langflow/components/model_specs/ChatLiteLLMSpecs.py index 6760c12aa..5c1463b71 100644 --- a/src/backend/langflow/components/model_specs/ChatLiteLLMSpecs.py +++ b/src/backend/base/langflow/components/model_specs/ChatLiteLLMSpecs.py @@ -1,9 +1,8 @@ from typing import Any, Callable, Dict, Optional, Union from langchain_community.chat_models.litellm import ChatLiteLLM, ChatLiteLLMException - -from langflow import CustomComponent from langflow.field_typing import BaseLanguageModel +from langflow.interface.custom.custom_component import CustomComponent class ChatLiteLLMComponent(CustomComponent): diff --git a/src/backend/langflow/components/model_specs/ChatOllamaEndpointSpecs.py b/src/backend/base/langflow/components/model_specs/ChatOllamaEndpointSpecs.py similarity index 98% rename from src/backend/langflow/components/model_specs/ChatOllamaEndpointSpecs.py rename to src/backend/base/langflow/components/model_specs/ChatOllamaEndpointSpecs.py index 34e9e0bd7..6afde420c 100644 --- a/src/backend/langflow/components/model_specs/ChatOllamaEndpointSpecs.py +++ b/src/backend/base/langflow/components/model_specs/ChatOllamaEndpointSpecs.py @@ -5,9 +5,8 @@ from langchain_community.chat_models import ChatOllama from langchain_core.language_models.chat_models import BaseChatModel # from langchain.chat_models import ChatOllama -from langflow import CustomComponent +from langflow.interface.custom.custom_component import CustomComponent -# whe When a callback component is added to Langflow, the comment must be uncommented. # from langchain.callbacks.manager import CallbackManager diff --git a/src/backend/langflow/components/model_specs/ChatOpenAISpecs.py b/src/backend/base/langflow/components/model_specs/ChatOpenAISpecs.py similarity index 97% rename from src/backend/langflow/components/model_specs/ChatOpenAISpecs.py rename to src/backend/base/langflow/components/model_specs/ChatOpenAISpecs.py index 0f20f0852..fcaf80965 100644 --- a/src/backend/langflow/components/model_specs/ChatOpenAISpecs.py +++ b/src/backend/base/langflow/components/model_specs/ChatOpenAISpecs.py @@ -2,8 +2,9 @@ from typing import Optional, Union from langchain.llms import BaseLLM from langchain_community.chat_models.openai import ChatOpenAI -from langflow import CustomComponent + from langflow.field_typing import BaseLanguageModel, NestedDict +from langflow.interface.custom.custom_component import CustomComponent class ChatOpenAIComponent(CustomComponent): diff --git a/src/backend/langflow/components/model_specs/ChatVertexAISpecs.py b/src/backend/base/langflow/components/model_specs/ChatVertexAISpecs.py similarity index 97% rename from src/backend/langflow/components/model_specs/ChatVertexAISpecs.py rename to src/backend/base/langflow/components/model_specs/ChatVertexAISpecs.py index a1c8556a7..fd8b5b427 100644 --- a/src/backend/langflow/components/model_specs/ChatVertexAISpecs.py +++ b/src/backend/base/langflow/components/model_specs/ChatVertexAISpecs.py @@ -3,8 +3,9 @@ from typing import List, Optional, Union from langchain.llms import BaseLLM from langchain_community.chat_models.vertexai import ChatVertexAI from langchain_core.messages.base import BaseMessage -from langflow import CustomComponent + from langflow.field_typing import BaseLanguageModel +from langflow.interface.custom.custom_component import CustomComponent class ChatVertexAIComponent(CustomComponent): diff --git a/src/backend/langflow/components/model_specs/CohereSpecs.py b/src/backend/base/langflow/components/model_specs/CohereSpecs.py similarity index 93% rename from src/backend/langflow/components/model_specs/CohereSpecs.py rename to src/backend/base/langflow/components/model_specs/CohereSpecs.py index 8cb0f3624..eeda381a4 100644 --- a/src/backend/langflow/components/model_specs/CohereSpecs.py +++ b/src/backend/base/langflow/components/model_specs/CohereSpecs.py @@ -1,6 +1,7 @@ from langchain_community.llms.cohere import Cohere from langchain_core.language_models.base import BaseLanguageModel -from langflow import CustomComponent + +from langflow.interface.custom.custom_component import CustomComponent class CohereComponent(CustomComponent): diff --git a/src/backend/langflow/components/model_specs/GoogleGenerativeAISpecs.py b/src/backend/base/langflow/components/model_specs/GoogleGenerativeAISpecs.py similarity index 97% rename from src/backend/langflow/components/model_specs/GoogleGenerativeAISpecs.py rename to src/backend/base/langflow/components/model_specs/GoogleGenerativeAISpecs.py index 9ff17e389..63e8b003e 100644 --- a/src/backend/langflow/components/model_specs/GoogleGenerativeAISpecs.py +++ b/src/backend/base/langflow/components/model_specs/GoogleGenerativeAISpecs.py @@ -1,10 +1,11 @@ from typing import Optional from langchain_google_genai import ChatGoogleGenerativeAI # type: ignore -from langflow import CustomComponent -from langflow.field_typing import BaseLanguageModel, RangeSpec from pydantic.v1.types import SecretStr +from langflow.field_typing import BaseLanguageModel, RangeSpec +from langflow.interface.custom.custom_component import CustomComponent + class GoogleGenerativeAIComponent(CustomComponent): display_name: str = "Google Generative AI" diff --git a/src/backend/langflow/components/model_specs/HuggingFaceEndpointsSpecs.py b/src/backend/base/langflow/components/model_specs/HuggingFaceEndpointsSpecs.py similarity index 95% rename from src/backend/langflow/components/model_specs/HuggingFaceEndpointsSpecs.py rename to src/backend/base/langflow/components/model_specs/HuggingFaceEndpointsSpecs.py index 4b5b07b9a..c3e74b1bd 100644 --- a/src/backend/langflow/components/model_specs/HuggingFaceEndpointsSpecs.py +++ b/src/backend/base/langflow/components/model_specs/HuggingFaceEndpointsSpecs.py @@ -2,7 +2,8 @@ from typing import Optional from langchain.llms.base import BaseLLM from langchain.llms.huggingface_endpoint import HuggingFaceEndpoint -from langflow import CustomComponent + +from langflow.interface.custom.custom_component import CustomComponent class HuggingFaceEndpointsComponent(CustomComponent): diff --git a/src/backend/langflow/components/model_specs/LlamaCppSpecs.py b/src/backend/base/langflow/components/model_specs/LlamaCppSpecs.py similarity index 97% rename from src/backend/langflow/components/model_specs/LlamaCppSpecs.py rename to src/backend/base/langflow/components/model_specs/LlamaCppSpecs.py index 831665bfa..599ff8850 100644 --- a/src/backend/langflow/components/model_specs/LlamaCppSpecs.py +++ b/src/backend/base/langflow/components/model_specs/LlamaCppSpecs.py @@ -1,7 +1,9 @@ -from typing import Optional, List, Dict, Any -from langflow import CustomComponent +from typing import Any, Dict, List, Optional + from langchain_community.llms.llamacpp import LlamaCpp +from langflow.interface.custom.custom_component import CustomComponent + class LlamaCppComponent(CustomComponent): display_name = "LlamaCpp" diff --git a/src/backend/langflow/components/model_specs/OllamaLLMSpecs.py b/src/backend/base/langflow/components/model_specs/OllamaLLMSpecs.py similarity index 98% rename from src/backend/langflow/components/model_specs/OllamaLLMSpecs.py rename to src/backend/base/langflow/components/model_specs/OllamaLLMSpecs.py index eb5c52975..8d94467db 100644 --- a/src/backend/langflow/components/model_specs/OllamaLLMSpecs.py +++ b/src/backend/base/langflow/components/model_specs/OllamaLLMSpecs.py @@ -3,7 +3,7 @@ from typing import List, Optional from langchain.llms.base import BaseLLM from langchain_community.llms.ollama import Ollama -from langflow import CustomComponent +from langflow.interface.custom.custom_component import CustomComponent class OllamaLLM(CustomComponent): diff --git a/src/backend/langflow/components/model_specs/VertexAISpecs.py b/src/backend/base/langflow/components/model_specs/VertexAISpecs.py similarity index 97% rename from src/backend/langflow/components/model_specs/VertexAISpecs.py rename to src/backend/base/langflow/components/model_specs/VertexAISpecs.py index d622ddc81..f186f2ed0 100644 --- a/src/backend/langflow/components/model_specs/VertexAISpecs.py +++ b/src/backend/base/langflow/components/model_specs/VertexAISpecs.py @@ -1,8 +1,10 @@ -from langflow import CustomComponent +from typing import Callable, Dict, Optional, Union + from langchain.llms import BaseLLM -from typing import Optional, Union, Callable, Dict from langchain_community.llms.vertexai import VertexAI +from langflow.interface.custom.custom_component import CustomComponent + class VertexAIComponent(CustomComponent): display_name = "VertexAI" diff --git a/src/backend/langflow/components/model_specs/__init__.py b/src/backend/base/langflow/components/model_specs/__init__.py similarity index 100% rename from src/backend/langflow/components/model_specs/__init__.py rename to src/backend/base/langflow/components/model_specs/__init__.py diff --git a/src/backend/langflow/components/models/AmazonBedrockModel.py b/src/backend/base/langflow/components/models/AmazonBedrockModel.py similarity index 100% rename from src/backend/langflow/components/models/AmazonBedrockModel.py rename to src/backend/base/langflow/components/models/AmazonBedrockModel.py diff --git a/src/backend/langflow/components/models/AnthropicModel.py b/src/backend/base/langflow/components/models/AnthropicModel.py similarity index 100% rename from src/backend/langflow/components/models/AnthropicModel.py rename to src/backend/base/langflow/components/models/AnthropicModel.py diff --git a/src/backend/langflow/components/models/AzureOpenAIModel.py b/src/backend/base/langflow/components/models/AzureOpenAIModel.py similarity index 95% rename from src/backend/langflow/components/models/AzureOpenAIModel.py rename to src/backend/base/langflow/components/models/AzureOpenAIModel.py index 543df96b5..eeb488f03 100644 --- a/src/backend/langflow/components/models/AzureOpenAIModel.py +++ b/src/backend/base/langflow/components/models/AzureOpenAIModel.py @@ -83,10 +83,6 @@ class AzureChatOpenAIComponent(LCModelComponent): "display_name": "System Message", "info": "System message to pass to the model.", }, - "system_message": { - "display_name": "System Message", - "info": "System message to pass to the model.", - }, } def build( diff --git a/src/backend/langflow/components/models/BaiduQianfanChatModel.py b/src/backend/base/langflow/components/models/BaiduQianfanChatModel.py similarity index 100% rename from src/backend/langflow/components/models/BaiduQianfanChatModel.py rename to src/backend/base/langflow/components/models/BaiduQianfanChatModel.py diff --git a/src/backend/langflow/components/models/CTransformersModel.py b/src/backend/base/langflow/components/models/CTransformersModel.py similarity index 100% rename from src/backend/langflow/components/models/CTransformersModel.py rename to src/backend/base/langflow/components/models/CTransformersModel.py diff --git a/src/backend/langflow/components/models/CohereModel.py b/src/backend/base/langflow/components/models/CohereModel.py similarity index 100% rename from src/backend/langflow/components/models/CohereModel.py rename to src/backend/base/langflow/components/models/CohereModel.py diff --git a/src/backend/langflow/components/models/GoogleGenerativeAIModel.py b/src/backend/base/langflow/components/models/GoogleGenerativeAIModel.py similarity index 100% rename from src/backend/langflow/components/models/GoogleGenerativeAIModel.py rename to src/backend/base/langflow/components/models/GoogleGenerativeAIModel.py diff --git a/src/backend/langflow/components/models/HuggingFaceModel.py b/src/backend/base/langflow/components/models/HuggingFaceModel.py similarity index 100% rename from src/backend/langflow/components/models/HuggingFaceModel.py rename to src/backend/base/langflow/components/models/HuggingFaceModel.py diff --git a/src/backend/langflow/components/models/LlamaCppModel.py b/src/backend/base/langflow/components/models/LlamaCppModel.py similarity index 100% rename from src/backend/langflow/components/models/LlamaCppModel.py rename to src/backend/base/langflow/components/models/LlamaCppModel.py diff --git a/src/backend/langflow/components/models/OllamaModel.py b/src/backend/base/langflow/components/models/OllamaModel.py similarity index 100% rename from src/backend/langflow/components/models/OllamaModel.py rename to src/backend/base/langflow/components/models/OllamaModel.py diff --git a/src/backend/langflow/components/models/OpenAIModel.py b/src/backend/base/langflow/components/models/OpenAIModel.py similarity index 100% rename from src/backend/langflow/components/models/OpenAIModel.py rename to src/backend/base/langflow/components/models/OpenAIModel.py diff --git a/src/backend/langflow/components/models/VertexAiModel.py b/src/backend/base/langflow/components/models/VertexAiModel.py similarity index 100% rename from src/backend/langflow/components/models/VertexAiModel.py rename to src/backend/base/langflow/components/models/VertexAiModel.py diff --git a/src/backend/langflow/components/models/__init__.py b/src/backend/base/langflow/components/models/__init__.py similarity index 100% rename from src/backend/langflow/components/models/__init__.py rename to src/backend/base/langflow/components/models/__init__.py diff --git a/src/backend/base/langflow/components/models/base/__init__.py b/src/backend/base/langflow/components/models/base/__init__.py new file mode 100644 index 000000000..921f10336 --- /dev/null +++ b/src/backend/base/langflow/components/models/base/__init__.py @@ -0,0 +1,3 @@ +from .model import LCModelComponent + +__all__ = ["LCModelComponent"] diff --git a/src/backend/langflow/components/outputs/ChatOutput.py b/src/backend/base/langflow/components/outputs/ChatOutput.py similarity index 100% rename from src/backend/langflow/components/outputs/ChatOutput.py rename to src/backend/base/langflow/components/outputs/ChatOutput.py diff --git a/src/backend/langflow/components/outputs/TextOutput.py b/src/backend/base/langflow/components/outputs/TextOutput.py similarity index 100% rename from src/backend/langflow/components/outputs/TextOutput.py rename to src/backend/base/langflow/components/outputs/TextOutput.py diff --git a/src/backend/langflow/components/outputs/__init__.py b/src/backend/base/langflow/components/outputs/__init__.py similarity index 100% rename from src/backend/langflow/components/outputs/__init__.py rename to src/backend/base/langflow/components/outputs/__init__.py diff --git a/src/backend/langflow/components/retrievers/AmazonKendra.py b/src/backend/base/langflow/components/retrievers/AmazonKendra.py similarity index 96% rename from src/backend/langflow/components/retrievers/AmazonKendra.py rename to src/backend/base/langflow/components/retrievers/AmazonKendra.py index 886afeff5..6584f6545 100644 --- a/src/backend/langflow/components/retrievers/AmazonKendra.py +++ b/src/backend/base/langflow/components/retrievers/AmazonKendra.py @@ -3,7 +3,7 @@ from typing import Optional from langchain.schema import BaseRetriever from langchain_community.retrievers import AmazonKendraRetriever -from langflow import CustomComponent +from langflow.interface.custom.custom_component import CustomComponent class AmazonKendraRetrieverComponent(CustomComponent): diff --git a/src/backend/langflow/components/retrievers/MetalRetriever.py b/src/backend/base/langflow/components/retrievers/MetalRetriever.py similarity index 93% rename from src/backend/langflow/components/retrievers/MetalRetriever.py rename to src/backend/base/langflow/components/retrievers/MetalRetriever.py index 1d37906d1..c5c56a397 100644 --- a/src/backend/langflow/components/retrievers/MetalRetriever.py +++ b/src/backend/base/langflow/components/retrievers/MetalRetriever.py @@ -4,7 +4,7 @@ from langchain.schema import BaseRetriever from langchain_community.retrievers import MetalRetriever from metal_sdk.metal import Metal # type: ignore -from langflow import CustomComponent +from langflow.interface.custom.custom_component import CustomComponent class MetalRetrieverComponent(CustomComponent): diff --git a/src/backend/langflow/components/retrievers/MultiQueryRetriever.py b/src/backend/base/langflow/components/retrievers/MultiQueryRetriever.py similarity index 96% rename from src/backend/langflow/components/retrievers/MultiQueryRetriever.py rename to src/backend/base/langflow/components/retrievers/MultiQueryRetriever.py index d2c12d7a5..0dec1c028 100644 --- a/src/backend/langflow/components/retrievers/MultiQueryRetriever.py +++ b/src/backend/base/langflow/components/retrievers/MultiQueryRetriever.py @@ -1,8 +1,9 @@ from typing import Callable, Optional, Union from langchain.retrievers import MultiQueryRetriever -from langflow import CustomComponent + from langflow.field_typing import BaseLLM, BaseRetriever, PromptTemplate +from langflow.interface.custom.custom_component import CustomComponent class MultiQueryRetrieverComponent(CustomComponent): diff --git a/src/backend/langflow/components/retrievers/VectaraSelfQueryRetriver.py b/src/backend/base/langflow/components/retrievers/VectaraSelfQueryRetriver.py similarity index 97% rename from src/backend/langflow/components/retrievers/VectaraSelfQueryRetriver.py rename to src/backend/base/langflow/components/retrievers/VectaraSelfQueryRetriver.py index 940ffd237..759021487 100644 --- a/src/backend/langflow/components/retrievers/VectaraSelfQueryRetriver.py +++ b/src/backend/base/langflow/components/retrievers/VectaraSelfQueryRetriver.py @@ -1,11 +1,13 @@ -from typing import List -from langflow import CustomComponent import json +from typing import List + +from langchain.base_language import BaseLanguageModel +from langchain.chains.query_constructor.base import AttributeInfo +from langchain.retrievers.self_query.base import SelfQueryRetriever from langchain.schema import BaseRetriever from langchain.schema.vectorstore import VectorStore -from langchain.base_language import BaseLanguageModel -from langchain.retrievers.self_query.base import SelfQueryRetriever -from langchain.chains.query_constructor.base import AttributeInfo + +from langflow.interface.custom.custom_component import CustomComponent class VectaraSelfQueryRetriverComponent(CustomComponent): diff --git a/src/backend/langflow/components/retrievers/VectorStoreRetriever.py b/src/backend/base/langflow/components/retrievers/VectorStoreRetriever.py similarity index 87% rename from src/backend/langflow/components/retrievers/VectorStoreRetriever.py rename to src/backend/base/langflow/components/retrievers/VectorStoreRetriever.py index 576b02e69..43f1aab71 100644 --- a/src/backend/langflow/components/retrievers/VectorStoreRetriever.py +++ b/src/backend/base/langflow/components/retrievers/VectorStoreRetriever.py @@ -1,7 +1,7 @@ from langchain_core.vectorstores import VectorStoreRetriever -from langflow import CustomComponent from langflow.field_typing import VectorStore +from langflow.interface.custom.custom_component import CustomComponent class VectoStoreRetrieverComponent(CustomComponent): diff --git a/src/backend/langflow/components/retrievers/__init__.py b/src/backend/base/langflow/components/retrievers/__init__.py similarity index 100% rename from src/backend/langflow/components/retrievers/__init__.py rename to src/backend/base/langflow/components/retrievers/__init__.py diff --git a/src/backend/langflow/components/textsplitters/CharacterTextSplitter.py b/src/backend/base/langflow/components/textsplitters/CharacterTextSplitter.py similarity index 95% rename from src/backend/langflow/components/textsplitters/CharacterTextSplitter.py rename to src/backend/base/langflow/components/textsplitters/CharacterTextSplitter.py index 8fcb1da11..2a0f3686f 100644 --- a/src/backend/langflow/components/textsplitters/CharacterTextSplitter.py +++ b/src/backend/base/langflow/components/textsplitters/CharacterTextSplitter.py @@ -2,7 +2,7 @@ from typing import List from langchain.text_splitter import CharacterTextSplitter -from langflow import CustomComponent +from langflow.interface.custom.custom_component import CustomComponent from langflow.schema.schema import Record from langflow.utils.util import unescape_string diff --git a/src/backend/langflow/components/textsplitters/LanguageRecursiveTextSplitter.py b/src/backend/base/langflow/components/textsplitters/LanguageRecursiveTextSplitter.py similarity index 97% rename from src/backend/langflow/components/textsplitters/LanguageRecursiveTextSplitter.py rename to src/backend/base/langflow/components/textsplitters/LanguageRecursiveTextSplitter.py index 3f521e0ba..1a4ae24a1 100644 --- a/src/backend/langflow/components/textsplitters/LanguageRecursiveTextSplitter.py +++ b/src/backend/base/langflow/components/textsplitters/LanguageRecursiveTextSplitter.py @@ -2,7 +2,7 @@ from typing import List, Optional from langchain.text_splitter import Language -from langflow import CustomComponent +from langflow.interface.custom.custom_component import CustomComponent from langflow.schema.schema import Record diff --git a/src/backend/langflow/components/textsplitters/RecursiveCharacterTextSplitter.py b/src/backend/base/langflow/components/textsplitters/RecursiveCharacterTextSplitter.py similarity index 97% rename from src/backend/langflow/components/textsplitters/RecursiveCharacterTextSplitter.py rename to src/backend/base/langflow/components/textsplitters/RecursiveCharacterTextSplitter.py index acbef0f10..1ceaa8bd6 100644 --- a/src/backend/langflow/components/textsplitters/RecursiveCharacterTextSplitter.py +++ b/src/backend/base/langflow/components/textsplitters/RecursiveCharacterTextSplitter.py @@ -3,7 +3,7 @@ from typing import Optional from langchain.text_splitter import RecursiveCharacterTextSplitter from langchain_core.documents import Document -from langflow import CustomComponent +from langflow.interface.custom.custom_component import CustomComponent from langflow.schema import Record from langflow.utils.util import build_loader_repr_from_records, unescape_string diff --git a/src/backend/langflow/components/textsplitters/__init__.py b/src/backend/base/langflow/components/textsplitters/__init__.py similarity index 100% rename from src/backend/langflow/components/textsplitters/__init__.py rename to src/backend/base/langflow/components/textsplitters/__init__.py diff --git a/src/backend/langflow/components/toolkits/JsonToolkit.py b/src/backend/base/langflow/components/toolkits/JsonToolkit.py similarity index 87% rename from src/backend/langflow/components/toolkits/JsonToolkit.py rename to src/backend/base/langflow/components/toolkits/JsonToolkit.py index ec9e49621..72fe17cde 100644 --- a/src/backend/langflow/components/toolkits/JsonToolkit.py +++ b/src/backend/base/langflow/components/toolkits/JsonToolkit.py @@ -1,6 +1,7 @@ -from langflow import CustomComponent -from langchain_community.tools.json.tool import JsonSpec from langchain_community.agent_toolkits.json.toolkit import JsonToolkit +from langchain_community.tools.json.tool import JsonSpec + +from langflow.interface.custom.custom_component import CustomComponent class JsonToolkitComponent(CustomComponent): diff --git a/src/backend/langflow/components/toolkits/Metaphor.py b/src/backend/base/langflow/components/toolkits/Metaphor.py similarity index 96% rename from src/backend/langflow/components/toolkits/Metaphor.py rename to src/backend/base/langflow/components/toolkits/Metaphor.py index 0f9f23334..14962924f 100644 --- a/src/backend/langflow/components/toolkits/Metaphor.py +++ b/src/backend/base/langflow/components/toolkits/Metaphor.py @@ -5,7 +5,7 @@ from langchain.agents.agent_toolkits.base import BaseToolkit from langchain.tools import Tool from metaphor_python import Metaphor # type: ignore -from langflow import CustomComponent +from langflow.interface.custom.custom_component import CustomComponent class MetaphorToolkit(CustomComponent): diff --git a/src/backend/langflow/components/toolkits/OpenAPIToolkit.py b/src/backend/base/langflow/components/toolkits/OpenAPIToolkit.py similarity index 91% rename from src/backend/langflow/components/toolkits/OpenAPIToolkit.py rename to src/backend/base/langflow/components/toolkits/OpenAPIToolkit.py index fc8780454..b29feb291 100644 --- a/src/backend/langflow/components/toolkits/OpenAPIToolkit.py +++ b/src/backend/base/langflow/components/toolkits/OpenAPIToolkit.py @@ -1,7 +1,8 @@ from langchain_community.agent_toolkits.openapi.toolkit import BaseToolkit, OpenAPIToolkit from langchain_community.utilities.requests import TextRequestsWrapper -from langflow import CustomComponent + from langflow.field_typing import AgentExecutor +from langflow.interface.custom.custom_component import CustomComponent class OpenAPIToolkitComponent(CustomComponent): diff --git a/src/backend/langflow/components/toolkits/VectorStoreInfo.py b/src/backend/base/langflow/components/toolkits/VectorStoreInfo.py similarity index 91% rename from src/backend/langflow/components/toolkits/VectorStoreInfo.py rename to src/backend/base/langflow/components/toolkits/VectorStoreInfo.py index ec2323bfd..1775d816a 100644 --- a/src/backend/langflow/components/toolkits/VectorStoreInfo.py +++ b/src/backend/base/langflow/components/toolkits/VectorStoreInfo.py @@ -3,7 +3,7 @@ from typing import Callable, Union from langchain.agents.agent_toolkits.vectorstore.toolkit import VectorStoreInfo from langchain_community.vectorstores import VectorStore -from langflow import CustomComponent +from langflow.interface.custom.custom_component import CustomComponent class VectorStoreInfoComponent(CustomComponent): diff --git a/src/backend/langflow/components/toolkits/VectorStoreRouterToolkit.py b/src/backend/base/langflow/components/toolkits/VectorStoreRouterToolkit.py similarity index 84% rename from src/backend/langflow/components/toolkits/VectorStoreRouterToolkit.py rename to src/backend/base/langflow/components/toolkits/VectorStoreRouterToolkit.py index ed8797044..13ec1656f 100644 --- a/src/backend/langflow/components/toolkits/VectorStoreRouterToolkit.py +++ b/src/backend/base/langflow/components/toolkits/VectorStoreRouterToolkit.py @@ -1,8 +1,9 @@ -from langflow import CustomComponent from typing import List, Union -from langchain.agents.agent_toolkits.vectorstore.toolkit import VectorStoreRouterToolkit -from langchain.agents.agent_toolkits.vectorstore.toolkit import VectorStoreInfo + +from langchain.agents.agent_toolkits.vectorstore.toolkit import VectorStoreInfo, VectorStoreRouterToolkit + from langflow.field_typing import BaseLanguageModel, Tool +from langflow.interface.custom.custom_component import CustomComponent class VectorStoreRouterToolkitComponent(CustomComponent): diff --git a/src/backend/langflow/components/toolkits/VectorStoreToolkit.py b/src/backend/base/langflow/components/toolkits/VectorStoreToolkit.py similarity index 72% rename from src/backend/langflow/components/toolkits/VectorStoreToolkit.py rename to src/backend/base/langflow/components/toolkits/VectorStoreToolkit.py index 38b9c9171..8436ba58e 100644 --- a/src/backend/langflow/components/toolkits/VectorStoreToolkit.py +++ b/src/backend/base/langflow/components/toolkits/VectorStoreToolkit.py @@ -1,14 +1,10 @@ -from langflow import CustomComponent -from langchain.agents.agent_toolkits.vectorstore.toolkit import VectorStoreToolkit -from langchain.agents.agent_toolkits.vectorstore.toolkit import VectorStoreInfo -from langflow.field_typing import ( - BaseLanguageModel, -) -from langflow.field_typing import ( - Tool, -) from typing import Union +from langchain.agents.agent_toolkits.vectorstore.toolkit import VectorStoreInfo, VectorStoreToolkit + +from langflow.field_typing import BaseLanguageModel, Tool +from langflow.interface.custom.custom_component import CustomComponent + class VectorStoreToolkitComponent(CustomComponent): display_name = "VectorStoreToolkit" diff --git a/src/backend/langflow/components/toolkits/__init__.py b/src/backend/base/langflow/components/toolkits/__init__.py similarity index 100% rename from src/backend/langflow/components/toolkits/__init__.py rename to src/backend/base/langflow/components/toolkits/__init__.py diff --git a/src/backend/langflow/components/tools/RetrieverTool.py b/src/backend/base/langflow/components/tools/RetrieverTool.py similarity index 92% rename from src/backend/langflow/components/tools/RetrieverTool.py rename to src/backend/base/langflow/components/tools/RetrieverTool.py index 5a598dbe2..914ba3941 100644 --- a/src/backend/langflow/components/tools/RetrieverTool.py +++ b/src/backend/base/langflow/components/tools/RetrieverTool.py @@ -1,7 +1,7 @@ from langchain.tools.retriever import create_retriever_tool -from langflow import CustomComponent from langflow.field_typing import BaseRetriever, Tool +from langflow.interface.custom.custom_component import CustomComponent class RetrieverToolComponent(CustomComponent): diff --git a/src/backend/langflow/components/tools/SearchAPITool.py b/src/backend/base/langflow/components/tools/SearchAPITool.py similarity index 96% rename from src/backend/langflow/components/tools/SearchAPITool.py rename to src/backend/base/langflow/components/tools/SearchAPITool.py index 76c82ad9c..6ec2f693c 100644 --- a/src/backend/langflow/components/tools/SearchAPITool.py +++ b/src/backend/base/langflow/components/tools/SearchAPITool.py @@ -1,7 +1,7 @@ from langchain_community.tools.searchapi import SearchAPIRun from langchain_community.utilities.searchapi import SearchApiAPIWrapper -from langflow import CustomComponent +from langflow.custom import CustomComponent from langflow.field_typing import Tool diff --git a/src/backend/base/langflow/components/tools/SearchApi.py b/src/backend/base/langflow/components/tools/SearchApi.py new file mode 100644 index 000000000..3dcd48d9f --- /dev/null +++ b/src/backend/base/langflow/components/tools/SearchApi.py @@ -0,0 +1,53 @@ +from typing import Optional + +from langchain_community.utilities.searchapi import SearchApiAPIWrapper + +from langflow.custom import CustomComponent +from langflow.schema.schema import Record +from langflow.services.database.models.base import orjson_dumps + + +class SearchApi(CustomComponent): + display_name: str = "SearchApi" + description: str = "Real-time search engine results API." + output_types: list[str] = ["Document"] + documentation: str = "https://www.searchapi.io/docs/google" + field_config = { + "engine": { + "display_name": "Engine", + "field_type": "str", + "info": "The search engine to use.", + }, + "params": { + "display_name": "Parameters", + "info": "The parameters to send with the request.", + }, + "code": {"show": False}, + "api_key": { + "display_name": "API Key", + "field_type": "str", + "required": True, + "password": True, + "info": "The API key to use SearchApi.", + }, + } + + def build( + self, + engine: str, + api_key: str, + params: Optional[dict] = None, + ) -> Record: + if params is None: + params = {} + + search_api_wrapper = SearchApiAPIWrapper(engine=engine, searchapi_api_key=api_key) + + q = params.pop("q", "SearchApi Langflow") + results = search_api_wrapper.results(q, **params) + + result = orjson_dumps(results, indent_2=False) + + record = Record(data=result) + self.status = record + return record diff --git a/src/backend/langflow/core/__init__.py b/src/backend/base/langflow/components/tools/__init__.py similarity index 100% rename from src/backend/langflow/core/__init__.py rename to src/backend/base/langflow/components/tools/__init__.py diff --git a/src/backend/langflow/components/vectorstores/AstraDB.py b/src/backend/base/langflow/components/vectorstores/AstraDB.py similarity index 100% rename from src/backend/langflow/components/vectorstores/AstraDB.py rename to src/backend/base/langflow/components/vectorstores/AstraDB.py diff --git a/src/backend/langflow/components/vectorstores/AstraDBSearch.py b/src/backend/base/langflow/components/vectorstores/AstraDBSearch.py similarity index 100% rename from src/backend/langflow/components/vectorstores/AstraDBSearch.py rename to src/backend/base/langflow/components/vectorstores/AstraDBSearch.py diff --git a/src/backend/langflow/components/vectorstores/Chroma.py b/src/backend/base/langflow/components/vectorstores/Chroma.py similarity index 98% rename from src/backend/langflow/components/vectorstores/Chroma.py rename to src/backend/base/langflow/components/vectorstores/Chroma.py index 0b8fbcb3a..8fe2f54a9 100644 --- a/src/backend/langflow/components/vectorstores/Chroma.py +++ b/src/backend/base/langflow/components/vectorstores/Chroma.py @@ -6,7 +6,7 @@ from langchain.schema import BaseRetriever from langchain_community.vectorstores import VectorStore from langchain_community.vectorstores.chroma import Chroma -from langflow import CustomComponent +from langflow.interface.custom.custom_component import CustomComponent from langflow.schema.schema import Record diff --git a/src/backend/langflow/components/vectorstores/ChromaSearch.py b/src/backend/base/langflow/components/vectorstores/ChromaSearch.py similarity index 100% rename from src/backend/langflow/components/vectorstores/ChromaSearch.py rename to src/backend/base/langflow/components/vectorstores/ChromaSearch.py diff --git a/src/backend/langflow/components/vectorstores/FAISS.py b/src/backend/base/langflow/components/vectorstores/FAISS.py similarity index 96% rename from src/backend/langflow/components/vectorstores/FAISS.py rename to src/backend/base/langflow/components/vectorstores/FAISS.py index dbdcbed9d..ea9ee1c4d 100644 --- a/src/backend/langflow/components/vectorstores/FAISS.py +++ b/src/backend/base/langflow/components/vectorstores/FAISS.py @@ -4,8 +4,8 @@ from langchain.schema import BaseRetriever from langchain_community.vectorstores import VectorStore from langchain_community.vectorstores.faiss import FAISS -from langflow import CustomComponent from langflow.field_typing import Embeddings +from langflow.interface.custom.custom_component import CustomComponent from langflow.schema.schema import Record diff --git a/src/backend/langflow/components/vectorstores/FAISSSearch.py b/src/backend/base/langflow/components/vectorstores/FAISSSearch.py similarity index 100% rename from src/backend/langflow/components/vectorstores/FAISSSearch.py rename to src/backend/base/langflow/components/vectorstores/FAISSSearch.py diff --git a/src/backend/langflow/components/vectorstores/MongoDBAtlasVector.py b/src/backend/base/langflow/components/vectorstores/MongoDBAtlasVector.py similarity index 97% rename from src/backend/langflow/components/vectorstores/MongoDBAtlasVector.py rename to src/backend/base/langflow/components/vectorstores/MongoDBAtlasVector.py index eee2cd8db..5a12488e4 100644 --- a/src/backend/langflow/components/vectorstores/MongoDBAtlasVector.py +++ b/src/backend/base/langflow/components/vectorstores/MongoDBAtlasVector.py @@ -1,9 +1,8 @@ from typing import List, Optional from langchain_community.vectorstores.mongodb_atlas import MongoDBAtlasVectorSearch - -from langflow import CustomComponent from langflow.field_typing import Embeddings, NestedDict +from langflow.interface.custom.custom_component import CustomComponent from langflow.schema.schema import Record diff --git a/src/backend/langflow/components/vectorstores/MongoDBAtlasVectorSearch.py b/src/backend/base/langflow/components/vectorstores/MongoDBAtlasVectorSearch.py similarity index 100% rename from src/backend/langflow/components/vectorstores/MongoDBAtlasVectorSearch.py rename to src/backend/base/langflow/components/vectorstores/MongoDBAtlasVectorSearch.py diff --git a/src/backend/langflow/components/vectorstores/Pinecone.py b/src/backend/base/langflow/components/vectorstores/Pinecone.py similarity index 97% rename from src/backend/langflow/components/vectorstores/Pinecone.py rename to src/backend/base/langflow/components/vectorstores/Pinecone.py index b6c022e80..e4d6de3aa 100644 --- a/src/backend/langflow/components/vectorstores/Pinecone.py +++ b/src/backend/base/langflow/components/vectorstores/Pinecone.py @@ -6,8 +6,8 @@ from langchain.schema import BaseRetriever from langchain_community.vectorstores import VectorStore from langchain_community.vectorstores.pinecone import Pinecone -from langflow import CustomComponent from langflow.field_typing import Embeddings +from langflow.interface.custom.custom_component import CustomComponent from langflow.schema.schema import Record diff --git a/src/backend/langflow/components/vectorstores/PineconeSearch.py b/src/backend/base/langflow/components/vectorstores/PineconeSearch.py similarity index 100% rename from src/backend/langflow/components/vectorstores/PineconeSearch.py rename to src/backend/base/langflow/components/vectorstores/PineconeSearch.py diff --git a/src/backend/langflow/components/vectorstores/Qdrant.py b/src/backend/base/langflow/components/vectorstores/Qdrant.py similarity index 98% rename from src/backend/langflow/components/vectorstores/Qdrant.py rename to src/backend/base/langflow/components/vectorstores/Qdrant.py index 9670ab984..61f8e14af 100644 --- a/src/backend/langflow/components/vectorstores/Qdrant.py +++ b/src/backend/base/langflow/components/vectorstores/Qdrant.py @@ -4,8 +4,8 @@ from langchain.schema import BaseRetriever from langchain_community.vectorstores import VectorStore from langchain_community.vectorstores.qdrant import Qdrant -from langflow import CustomComponent from langflow.field_typing import Embeddings, NestedDict +from langflow.interface.custom.custom_component import CustomComponent from langflow.schema.schema import Record diff --git a/src/backend/langflow/components/vectorstores/QdrantSearch.py b/src/backend/base/langflow/components/vectorstores/QdrantSearch.py similarity index 100% rename from src/backend/langflow/components/vectorstores/QdrantSearch.py rename to src/backend/base/langflow/components/vectorstores/QdrantSearch.py diff --git a/src/backend/langflow/components/vectorstores/Redis.py b/src/backend/base/langflow/components/vectorstores/Redis.py similarity index 97% rename from src/backend/langflow/components/vectorstores/Redis.py rename to src/backend/base/langflow/components/vectorstores/Redis.py index 4dff685a7..ea1046037 100644 --- a/src/backend/langflow/components/vectorstores/Redis.py +++ b/src/backend/base/langflow/components/vectorstores/Redis.py @@ -5,7 +5,7 @@ from langchain_community.vectorstores import VectorStore from langchain_community.vectorstores.redis import Redis from langchain_core.retrievers import BaseRetriever -from langflow import CustomComponent +from langflow.interface.custom.custom_component import CustomComponent from langflow.schema.schema import Record diff --git a/src/backend/langflow/components/vectorstores/RedisSearch.py b/src/backend/base/langflow/components/vectorstores/RedisSearch.py similarity index 100% rename from src/backend/langflow/components/vectorstores/RedisSearch.py rename to src/backend/base/langflow/components/vectorstores/RedisSearch.py diff --git a/src/backend/langflow/components/vectorstores/SupabaseVectorStore.py b/src/backend/base/langflow/components/vectorstores/SupabaseVectorStore.py similarity index 96% rename from src/backend/langflow/components/vectorstores/SupabaseVectorStore.py rename to src/backend/base/langflow/components/vectorstores/SupabaseVectorStore.py index 29b872895..876742117 100644 --- a/src/backend/langflow/components/vectorstores/SupabaseVectorStore.py +++ b/src/backend/base/langflow/components/vectorstores/SupabaseVectorStore.py @@ -5,8 +5,8 @@ from langchain_community.vectorstores import VectorStore from langchain_community.vectorstores.supabase import SupabaseVectorStore from supabase.client import Client, create_client -from langflow import CustomComponent from langflow.field_typing import Embeddings, NestedDict +from langflow.interface.custom.custom_component import CustomComponent from langflow.schema.schema import Record diff --git a/src/backend/langflow/components/vectorstores/SupabaseVectorStoreSearch.py b/src/backend/base/langflow/components/vectorstores/SupabaseVectorStoreSearch.py similarity index 100% rename from src/backend/langflow/components/vectorstores/SupabaseVectorStoreSearch.py rename to src/backend/base/langflow/components/vectorstores/SupabaseVectorStoreSearch.py diff --git a/src/backend/langflow/components/vectorstores/Vectara.py b/src/backend/base/langflow/components/vectorstores/Vectara.py similarity index 97% rename from src/backend/langflow/components/vectorstores/Vectara.py rename to src/backend/base/langflow/components/vectorstores/Vectara.py index 55171a6c1..5c087875f 100644 --- a/src/backend/langflow/components/vectorstores/Vectara.py +++ b/src/backend/base/langflow/components/vectorstores/Vectara.py @@ -7,8 +7,8 @@ from langchain_community.embeddings import FakeEmbeddings from langchain_community.vectorstores.vectara import Vectara from langchain_core.vectorstores import VectorStore -from langflow import CustomComponent from langflow.field_typing import BaseRetriever +from langflow.interface.custom.custom_component import CustomComponent from langflow.schema.schema import Record diff --git a/src/backend/langflow/components/vectorstores/VectaraSearch.py b/src/backend/base/langflow/components/vectorstores/VectaraSearch.py similarity index 100% rename from src/backend/langflow/components/vectorstores/VectaraSearch.py rename to src/backend/base/langflow/components/vectorstores/VectaraSearch.py diff --git a/src/backend/langflow/components/vectorstores/Weaviate.py b/src/backend/base/langflow/components/vectorstores/Weaviate.py similarity index 97% rename from src/backend/langflow/components/vectorstores/Weaviate.py rename to src/backend/base/langflow/components/vectorstores/Weaviate.py index 64037676c..3362a3fca 100644 --- a/src/backend/langflow/components/vectorstores/Weaviate.py +++ b/src/backend/base/langflow/components/vectorstores/Weaviate.py @@ -5,7 +5,7 @@ from langchain.embeddings.base import Embeddings from langchain.schema import BaseRetriever from langchain_community.vectorstores import VectorStore, Weaviate -from langflow import CustomComponent +from langflow.interface.custom.custom_component import CustomComponent from langflow.schema.schema import Record diff --git a/src/backend/langflow/components/vectorstores/WeaviateSearch.py b/src/backend/base/langflow/components/vectorstores/WeaviateSearch.py similarity index 100% rename from src/backend/langflow/components/vectorstores/WeaviateSearch.py rename to src/backend/base/langflow/components/vectorstores/WeaviateSearch.py diff --git a/src/backend/langflow/components/vectorstores/__init__.py b/src/backend/base/langflow/components/vectorstores/__init__.py similarity index 100% rename from src/backend/langflow/components/vectorstores/__init__.py rename to src/backend/base/langflow/components/vectorstores/__init__.py diff --git a/src/backend/langflow/components/vectorstores/base/__init__.py b/src/backend/base/langflow/components/vectorstores/base/__init__.py similarity index 100% rename from src/backend/langflow/components/vectorstores/base/__init__.py rename to src/backend/base/langflow/components/vectorstores/base/__init__.py diff --git a/src/backend/langflow/components/vectorstores/base/model.py b/src/backend/base/langflow/components/vectorstores/base/model.py similarity index 95% rename from src/backend/langflow/components/vectorstores/base/model.py rename to src/backend/base/langflow/components/vectorstores/base/model.py index 5cd335181..eef99ef21 100644 --- a/src/backend/langflow/components/vectorstores/base/model.py +++ b/src/backend/base/langflow/components/vectorstores/base/model.py @@ -4,9 +4,9 @@ from langchain_core.documents import Document from langchain_core.retrievers import BaseRetriever from langchain_core.vectorstores import VectorStore -from langflow import CustomComponent from langflow.field_typing import Text from langflow.helpers.record import docs_to_records +from langflow.interface.custom.custom_component import CustomComponent from langflow.schema import Record diff --git a/src/backend/langflow/components/vectorstores/pgvector.py b/src/backend/base/langflow/components/vectorstores/pgvector.py similarity index 97% rename from src/backend/langflow/components/vectorstores/pgvector.py rename to src/backend/base/langflow/components/vectorstores/pgvector.py index 1a3fb6f21..b061b22ac 100644 --- a/src/backend/langflow/components/vectorstores/pgvector.py +++ b/src/backend/base/langflow/components/vectorstores/pgvector.py @@ -5,7 +5,7 @@ from langchain_community.vectorstores import VectorStore from langchain_community.vectorstores.pgvector import PGVector from langchain_core.retrievers import BaseRetriever -from langflow import CustomComponent +from langflow.interface.custom.custom_component import CustomComponent from langflow.schema.schema import Record diff --git a/src/backend/langflow/components/vectorstores/pgvectorSearch.py b/src/backend/base/langflow/components/vectorstores/pgvectorSearch.py similarity index 100% rename from src/backend/langflow/components/vectorstores/pgvectorSearch.py rename to src/backend/base/langflow/components/vectorstores/pgvectorSearch.py diff --git a/src/backend/langflow/config.yaml b/src/backend/base/langflow/config.yaml similarity index 100% rename from src/backend/langflow/config.yaml rename to src/backend/base/langflow/config.yaml diff --git a/src/backend/langflow/custom/__init__.py b/src/backend/base/langflow/core/__init__.py similarity index 100% rename from src/backend/langflow/custom/__init__.py rename to src/backend/base/langflow/core/__init__.py diff --git a/src/backend/langflow/core/celery_app.py b/src/backend/base/langflow/core/celery_app.py similarity index 100% rename from src/backend/langflow/core/celery_app.py rename to src/backend/base/langflow/core/celery_app.py diff --git a/src/backend/langflow/core/celeryconfig.py b/src/backend/base/langflow/core/celeryconfig.py similarity index 100% rename from src/backend/langflow/core/celeryconfig.py rename to src/backend/base/langflow/core/celeryconfig.py diff --git a/src/backend/base/langflow/custom.py b/src/backend/base/langflow/custom.py new file mode 100644 index 000000000..ebe4c04e8 --- /dev/null +++ b/src/backend/base/langflow/custom.py @@ -0,0 +1 @@ +from langflow.interface.custom.custom_component import CustomComponent # noqa: F401 diff --git a/src/backend/langflow/field_typing/__init__.py b/src/backend/base/langflow/field_typing/__init__.py similarity index 100% rename from src/backend/langflow/field_typing/__init__.py rename to src/backend/base/langflow/field_typing/__init__.py diff --git a/src/backend/langflow/field_typing/constants.py b/src/backend/base/langflow/field_typing/constants.py similarity index 100% rename from src/backend/langflow/field_typing/constants.py rename to src/backend/base/langflow/field_typing/constants.py diff --git a/src/backend/langflow/field_typing/range_spec.py b/src/backend/base/langflow/field_typing/range_spec.py similarity index 100% rename from src/backend/langflow/field_typing/range_spec.py rename to src/backend/base/langflow/field_typing/range_spec.py diff --git a/src/backend/langflow/graph/__init__.py b/src/backend/base/langflow/graph/__init__.py similarity index 100% rename from src/backend/langflow/graph/__init__.py rename to src/backend/base/langflow/graph/__init__.py index 04db8e5a1..e80dcaa5f 100644 --- a/src/backend/langflow/graph/__init__.py +++ b/src/backend/base/langflow/graph/__init__.py @@ -4,18 +4,18 @@ from langflow.graph.vertex.base import Vertex from langflow.graph.vertex.types import ( AgentVertex, ChainVertex, + CustomComponentVertex, DocumentLoaderVertex, EmbeddingVertex, LLMVertex, MemoryVertex, PromptVertex, + RetrieverVertex, TextSplitterVertex, - ToolVertex, ToolkitVertex, + ToolVertex, VectorStoreVertex, WrapperVertex, - RetrieverVertex, - CustomComponentVertex, ) __all__ = [ diff --git a/src/backend/langflow/graph/edge/__init__.py b/src/backend/base/langflow/graph/edge/__init__.py similarity index 100% rename from src/backend/langflow/graph/edge/__init__.py rename to src/backend/base/langflow/graph/edge/__init__.py diff --git a/src/backend/langflow/graph/edge/base.py b/src/backend/base/langflow/graph/edge/base.py similarity index 100% rename from src/backend/langflow/graph/edge/base.py rename to src/backend/base/langflow/graph/edge/base.py diff --git a/src/backend/langflow/graph/edge/schema.py b/src/backend/base/langflow/graph/edge/schema.py similarity index 100% rename from src/backend/langflow/graph/edge/schema.py rename to src/backend/base/langflow/graph/edge/schema.py diff --git a/src/backend/langflow/graph/edge/utils.py b/src/backend/base/langflow/graph/edge/utils.py similarity index 100% rename from src/backend/langflow/graph/edge/utils.py rename to src/backend/base/langflow/graph/edge/utils.py diff --git a/src/backend/langflow/graph/graph/__init__.py b/src/backend/base/langflow/graph/graph/__init__.py similarity index 100% rename from src/backend/langflow/graph/graph/__init__.py rename to src/backend/base/langflow/graph/graph/__init__.py diff --git a/src/backend/langflow/graph/graph/base.py b/src/backend/base/langflow/graph/graph/base.py similarity index 100% rename from src/backend/langflow/graph/graph/base.py rename to src/backend/base/langflow/graph/graph/base.py diff --git a/src/backend/langflow/graph/graph/constants.py b/src/backend/base/langflow/graph/graph/constants.py similarity index 100% rename from src/backend/langflow/graph/graph/constants.py rename to src/backend/base/langflow/graph/graph/constants.py diff --git a/src/backend/langflow/graph/graph/runnable_vertices_manager.py b/src/backend/base/langflow/graph/graph/runnable_vertices_manager.py similarity index 100% rename from src/backend/langflow/graph/graph/runnable_vertices_manager.py rename to src/backend/base/langflow/graph/graph/runnable_vertices_manager.py diff --git a/src/backend/langflow/graph/graph/state_manager.py b/src/backend/base/langflow/graph/graph/state_manager.py similarity index 100% rename from src/backend/langflow/graph/graph/state_manager.py rename to src/backend/base/langflow/graph/graph/state_manager.py diff --git a/src/backend/langflow/graph/graph/utils.py b/src/backend/base/langflow/graph/graph/utils.py similarity index 100% rename from src/backend/langflow/graph/graph/utils.py rename to src/backend/base/langflow/graph/graph/utils.py diff --git a/src/backend/langflow/graph/schema.py b/src/backend/base/langflow/graph/schema.py similarity index 100% rename from src/backend/langflow/graph/schema.py rename to src/backend/base/langflow/graph/schema.py diff --git a/src/backend/langflow/graph/utils.py b/src/backend/base/langflow/graph/utils.py similarity index 100% rename from src/backend/langflow/graph/utils.py rename to src/backend/base/langflow/graph/utils.py diff --git a/src/backend/langflow/graph/vertex/__init__.py b/src/backend/base/langflow/graph/vertex/__init__.py similarity index 100% rename from src/backend/langflow/graph/vertex/__init__.py rename to src/backend/base/langflow/graph/vertex/__init__.py diff --git a/src/backend/langflow/graph/vertex/base.py b/src/backend/base/langflow/graph/vertex/base.py similarity index 100% rename from src/backend/langflow/graph/vertex/base.py rename to src/backend/base/langflow/graph/vertex/base.py diff --git a/src/backend/langflow/graph/vertex/constants.py b/src/backend/base/langflow/graph/vertex/constants.py similarity index 100% rename from src/backend/langflow/graph/vertex/constants.py rename to src/backend/base/langflow/graph/vertex/constants.py diff --git a/src/backend/langflow/graph/vertex/types.py b/src/backend/base/langflow/graph/vertex/types.py similarity index 99% rename from src/backend/langflow/graph/vertex/types.py rename to src/backend/base/langflow/graph/vertex/types.py index 712b1c572..538b2860d 100644 --- a/src/backend/langflow/graph/vertex/types.py +++ b/src/backend/base/langflow/graph/vertex/types.py @@ -1,6 +1,7 @@ import ast import json from typing import AsyncIterator, Callable, Dict, Iterator, List, Optional, Union + import yaml from langchain_core.messages import AIMessage from loguru import logger diff --git a/src/backend/langflow/graph/vertex/utils.py b/src/backend/base/langflow/graph/vertex/utils.py similarity index 99% rename from src/backend/langflow/graph/vertex/utils.py rename to src/backend/base/langflow/graph/vertex/utils.py index e67104365..ea2693e29 100644 --- a/src/backend/langflow/graph/vertex/utils.py +++ b/src/backend/base/langflow/graph/vertex/utils.py @@ -2,9 +2,10 @@ from typing import Any, Optional, Union from langchain_core.messages import BaseMessage from langchain_core.runnables import Runnable -from langflow.utils.constants import PYTHON_BASIC_TYPES from loguru import logger +from langflow.utils.constants import PYTHON_BASIC_TYPES + def is_basic_type(obj): return type(obj) in PYTHON_BASIC_TYPES diff --git a/src/backend/base/langflow/helpers/__init__py b/src/backend/base/langflow/helpers/__init__py new file mode 100644 index 000000000..b944a0178 --- /dev/null +++ b/src/backend/base/langflow/helpers/__init__py @@ -0,0 +1,3 @@ +from .record import docs_to_records, records_to_text + +__all__ = ["docs_to_records", "records_to_text"] \ No newline at end of file diff --git a/src/backend/base/langflow/helpers/flow.py b/src/backend/base/langflow/helpers/flow.py new file mode 100644 index 000000000..328e99ca1 --- /dev/null +++ b/src/backend/base/langflow/helpers/flow.py @@ -0,0 +1,199 @@ +from typing import TYPE_CHECKING, Any, Callable, Coroutine, List, Optional, Tuple, Union + +from pydantic.v1 import BaseModel, Field, create_model +from sqlmodel import select + +from langflow.schema.schema import INPUT_FIELD_NAME, Record +from langflow.services.database.models.flow.model import Flow +from langflow.services.deps import session_scope + +if TYPE_CHECKING: + from langflow.graph.graph.base import Graph + from langflow.graph.vertex.base import Vertex + +INPUT_TYPE_MAP = { + "ChatInput": {"type_hint": "Optional[str]", "default": '""'}, + "TextInput": {"type_hint": "Optional[str]", "default": '""'}, + "JSONInput": {"type_hint": "Optional[dict]", "default": "{}"}, +} + + +def list_flows(*, user_id: Optional[str] = None) -> List[Record]: + if not user_id: + raise ValueError("Session is invalid") + try: + with session_scope() as session: + flows = session.exec( + select(Flow).where(Flow.user_id == user_id).where(Flow.is_component == False) # noqa + ).all() + + flows_records = [flow.to_record() for flow in flows] + return flows_records + except Exception as e: + raise ValueError(f"Error listing flows: {e}") + + +async def load_flow( + user_id: str, flow_id: Optional[str] = None, flow_name: Optional[str] = None, tweaks: Optional[dict] = None +) -> "Graph": + from langflow.graph.graph.base import Graph + from langflow.processing.process import process_tweaks + + if not flow_id and not flow_name: + raise ValueError("Flow ID or Flow Name is required") + if not flow_id and flow_name: + flow_id = find_flow(flow_name, user_id) + if not flow_id: + raise ValueError(f"Flow {flow_name} not found") + + with session_scope() as session: + graph_data = flow.data if (flow := session.get(Flow, flow_id)) else None + if not graph_data: + raise ValueError(f"Flow {flow_id} not found") + if tweaks: + graph_data = process_tweaks(graph_data=graph_data, tweaks=tweaks) + graph = Graph.from_payload(graph_data, flow_id=flow_id) + return graph + + +def find_flow(flow_name: str, user_id: str) -> Optional[str]: + with session_scope() as session: + flow = session.exec(select(Flow).where(Flow.name == flow_name).where(Flow.user_id == user_id)).first() + return flow.id if flow else None + + +async def run_flow( + inputs: Union[dict, List[dict]] = None, + tweaks: Optional[dict] = None, + flow_id: Optional[str] = None, + flow_name: Optional[str] = None, + user_id: Optional[str] = None, +) -> Any: + graph = await load_flow(user_id, flow_id, flow_name, tweaks) + + if inputs is None: + inputs = [] + inputs_list = [] + inputs_components = [] + types = [] + for input_dict in inputs: + inputs_list.append({INPUT_FIELD_NAME: input_dict.get("input_value")}) + inputs_components.append(input_dict.get("components", [])) + types.append(input_dict.get("type", [])) + + return await graph.arun(inputs_list, inputs_components=inputs_components, types=types) + + +def generate_function_for_flow(inputs: List["Vertex"], flow_id: str) -> Coroutine: + """ + Generate a dynamic flow function based on the given inputs and flow ID. + + Args: + inputs (List[Vertex]): The list of input vertices for the flow. + flow_id (str): The ID of the flow. + + Returns: + Coroutine: The dynamic flow function. + + Raises: + None + + Example: + inputs = [vertex1, vertex2] + flow_id = "my_flow" + function = generate_function_for_flow(inputs, flow_id) + result = function(input1, input2) + """ + # Prepare function arguments with type hints and default values + args = [ + f"{input_.display_name.lower().replace(' ', '_')}: {INPUT_TYPE_MAP[input_.base_name]['type_hint']} = {INPUT_TYPE_MAP[input_.base_name]['default']}" + for input_ in inputs + ] + + # Maintain original argument names for constructing the tweaks dictionary + original_arg_names = [input_.display_name for input_ in inputs] + + # Prepare a Pythonic, valid function argument string + func_args = ", ".join(args) + + # Map original argument names to their corresponding Pythonic variable names in the function + arg_mappings = ", ".join( + f'"{original_name}": {name}' + for original_name, name in zip(original_arg_names, [arg.split(":")[0] for arg in args]) + ) + + func_body = f""" +from typing import Optional +async def flow_function({func_args}): + tweaks = {{ {arg_mappings} }} + from langflow.helpers.flow import run_flow + from langchain_core.tools import ToolException + try: + return await run_flow( + tweaks={{key: {{'input_value': value}} for key, value in tweaks.items()}}, + flow_id="{flow_id}", + ) + except Exception as e: + raise ToolException(f'Error running flow: ' + e) +""" + + compiled_func = compile(func_body, "", "exec") + local_scope = {} + exec(compiled_func, globals(), local_scope) + return local_scope["flow_function"] + + +def build_function_and_schema(flow_record: Record, graph: "Graph") -> Tuple[Callable, BaseModel]: + """ + Builds a dynamic function and schema for a given flow. + + Args: + flow_record (Record): The flow record containing information about the flow. + graph (Graph): The graph representing the flow. + + Returns: + Tuple[Callable, BaseModel]: A tuple containing the dynamic function and the schema. + """ + flow_id = flow_record.id + inputs = get_flow_inputs(graph) + dynamic_flow_function = generate_function_for_flow(inputs, flow_id) + schema = build_schema_from_inputs(flow_record.name, inputs) + return dynamic_flow_function, schema + + +def get_flow_inputs(graph: "Graph") -> List["Vertex"]: + """ + Retrieves the flow inputs from the given graph. + + Args: + graph (Graph): The graph object representing the flow. + + Returns: + List[Record]: A list of input records, where each record contains the ID, name, and description of the input vertex. + """ + inputs = [] + for vertex in graph.vertices: + if vertex.is_input: + inputs.append(vertex) + return inputs + + +def build_schema_from_inputs(name: str, inputs: List[tuple[str, str, str]]) -> BaseModel: + """ + Builds a schema from the given inputs. + + Args: + name (str): The name of the schema. + inputs (List[tuple[str, str, str]]): A list of tuples representing the inputs. + Each tuple contains three elements: the input name, the input type, and the input description. + + Returns: + BaseModel: The schema model. + + """ + fields = {} + for input_ in inputs: + field_name = input_.display_name.lower().replace(" ", "_") + description = input_.description + fields[field_name] = (str, Field(default="", description=description)) + return create_model(name, **fields) diff --git a/src/backend/base/langflow/helpers/record.py b/src/backend/base/langflow/helpers/record.py new file mode 100644 index 000000000..d7b1d2b06 --- /dev/null +++ b/src/backend/base/langflow/helpers/record.py @@ -0,0 +1,34 @@ +from langchain_core.documents import Document + +from langflow.schema import Record + + +def docs_to_records(documents: list[Document]) -> list[Record]: + """ + Converts a list of Documents to a list of Records. + + Args: + documents (list[Document]): The list of Documents to convert. + + Returns: + list[Record]: The converted list of Records. + """ + return [Record.from_document(document) for document in documents] + + +def records_to_text(template: str, records: list[Record]) -> str: + """ + Converts a list of Records to a list of texts. + + Args: + records (list[Record]): The list of Records to convert. + + Returns: + list[str]: The converted list of texts. + """ + if isinstance(records, Record): + records = [records] + # Check if there are any format strings in the template + + formated_records = [template.format(data=record.data, **record.data) for record in records] + return "\n".join(formated_records) diff --git a/src/backend/langflow/initial_setup/__init__.py b/src/backend/base/langflow/initial_setup/__init__.py similarity index 100% rename from src/backend/langflow/initial_setup/__init__.py rename to src/backend/base/langflow/initial_setup/__init__.py diff --git a/src/backend/langflow/initial_setup/setup.py b/src/backend/base/langflow/initial_setup/setup.py similarity index 100% rename from src/backend/langflow/initial_setup/setup.py rename to src/backend/base/langflow/initial_setup/setup.py diff --git a/src/backend/langflow/initial_setup/starter_projects/Langflow Basic Prompting.json b/src/backend/base/langflow/initial_setup/starter_projects/Langflow Basic Prompting.json similarity index 98% rename from src/backend/langflow/initial_setup/starter_projects/Langflow Basic Prompting.json rename to src/backend/base/langflow/initial_setup/starter_projects/Langflow Basic Prompting.json index cac86263f..66d6f2fd9 100644 --- a/src/backend/langflow/initial_setup/starter_projects/Langflow Basic Prompting.json +++ b/src/backend/base/langflow/initial_setup/starter_projects/Langflow Basic Prompting.json @@ -193,7 +193,7 @@ "list": false, "show": true, "multiline": true, - "value": "from langchain_core.prompts import PromptTemplate\n\nfrom langflow import CustomComponent\nfrom langflow.field_typing import Prompt, TemplateField, Text\n\n\nclass PromptComponent(CustomComponent):\n display_name: str = \"Prompt\"\n description: str = \"A component for creating prompts using templates\"\n icon = \"terminal-square\"\n\n def build_config(self):\n return {\n \"template\": TemplateField(display_name=\"Template\"),\n \"code\": TemplateField(advanced=True),\n }\n\n def build(\n self,\n template: Prompt,\n **kwargs,\n ) -> Text:\n from langflow.base.prompts.utils import dict_values_to_string\n\n prompt_template = PromptTemplate.from_template(Text(template))\n kwargs = dict_values_to_string(kwargs)\n kwargs = {k: \"\\n\".join(v) if isinstance(v, list) else v for k, v in kwargs.items()}\n try:\n formated_prompt = prompt_template.format(**kwargs)\n except Exception as exc:\n raise ValueError(f\"Error formatting prompt: {exc}\") from exc\n self.status = f'Prompt:\\n\"{formated_prompt}\"'\n return formated_prompt\n", + "value": "from langchain_core.prompts import PromptTemplate\n\nfrom langflow.custom import CustomComponent\nfrom langflow.field_typing import Prompt, TemplateField, Text\n\n\nclass PromptComponent(CustomComponent):\n display_name: str = \"Prompt\"\n description: str = \"A component for creating prompts using templates\"\n icon = \"terminal-square\"\n\n def build_config(self):\n return {\n \"template\": TemplateField(display_name=\"Template\"),\n \"code\": TemplateField(advanced=True),\n }\n\n def build(\n self,\n template: Prompt,\n **kwargs,\n ) -> Text:\n from langflow.base.prompts.utils import dict_values_to_string\n\n prompt_template = PromptTemplate.from_template(Text(template))\n kwargs = dict_values_to_string(kwargs)\n kwargs = {k: \"\\n\".join(v) if isinstance(v, list) else v for k, v in kwargs.items()}\n try:\n formated_prompt = prompt_template.format(**kwargs)\n except Exception as exc:\n raise ValueError(f\"Error formatting prompt: {exc}\") from exc\n self.status = f'Prompt:\\n\"{formated_prompt}\"'\n return formated_prompt\n", "fileTypes": [], "file_path": "", "password": false, diff --git a/src/backend/langflow/initial_setup/starter_projects/Langflow Data Ingestion.json b/src/backend/base/langflow/initial_setup/starter_projects/Langflow Data Ingestion.json similarity index 78% rename from src/backend/langflow/initial_setup/starter_projects/Langflow Data Ingestion.json rename to src/backend/base/langflow/initial_setup/starter_projects/Langflow Data Ingestion.json index e40ffda57..7ad9377a0 100644 --- a/src/backend/langflow/initial_setup/starter_projects/Langflow Data Ingestion.json +++ b/src/backend/base/langflow/initial_setup/starter_projects/Langflow Data Ingestion.json @@ -80,7 +80,7 @@ "list": false, "show": true, "multiline": true, - "value": "from typing import Optional\n\nfrom langchain.text_splitter import RecursiveCharacterTextSplitter\nfrom langchain_core.documents import Document\n\nfrom langflow import CustomComponent\nfrom langflow.schema import Record\nfrom langflow.utils.util import build_loader_repr_from_documents\n\n\nclass RecursiveCharacterTextSplitterComponent(CustomComponent):\n display_name: str = \"Recursive Character Text Splitter\"\n description: str = \"Split text into chunks of a specified length.\"\n documentation: str = (\n \"https://docs.langflow.org/components/text-splitters#recursivecharactertextsplitter\"\n )\n\n def build_config(self):\n return {\n \"inputs\": {\n \"display_name\": \"Input\",\n \"info\": \"The texts to split.\",\n \"input_types\": [\"Document\", \"Record\"],\n },\n \"separators\": {\n \"display_name\": \"Separators\",\n \"info\": 'The characters to split on.\\nIf left empty defaults to [\"\\\\n\\\\n\", \"\\\\n\", \" \", \"\"].',\n \"is_list\": True,\n },\n \"chunk_size\": {\n \"display_name\": \"Chunk Size\",\n \"info\": \"The maximum length of each chunk.\",\n \"field_type\": \"int\",\n \"value\": 1000,\n },\n \"chunk_overlap\": {\n \"display_name\": \"Chunk Overlap\",\n \"info\": \"The amount of overlap between chunks.\",\n \"field_type\": \"int\",\n \"value\": 200,\n },\n \"code\": {\"show\": False},\n }\n\n def build(\n self,\n inputs: list[Document],\n separators: Optional[list[str]] = None,\n chunk_size: Optional[int] = 1000,\n chunk_overlap: Optional[int] = 200,\n ) -> list[Record]:\n \"\"\"\n Split text into chunks of a specified length.\n\n Args:\n separators (list[str]): The characters to split on.\n chunk_size (int): The maximum length of each chunk.\n chunk_overlap (int): The amount of overlap between chunks.\n length_function (function): The function to use to calculate the length of the text.\n\n Returns:\n list[str]: The chunks of text.\n \"\"\"\n\n if separators == \"\":\n separators = None\n elif separators:\n # check if the separators list has escaped characters\n # if there are escaped characters, unescape them\n separators = [x.encode().decode(\"unicode-escape\") for x in separators]\n\n # Make sure chunk_size and chunk_overlap are ints\n if isinstance(chunk_size, str):\n chunk_size = int(chunk_size)\n if isinstance(chunk_overlap, str):\n chunk_overlap = int(chunk_overlap)\n splitter = RecursiveCharacterTextSplitter(\n separators=separators,\n chunk_size=chunk_size,\n chunk_overlap=chunk_overlap,\n )\n documents = []\n for _input in inputs:\n if isinstance(_input, Record):\n documents.append(_input.to_lc_document())\n else:\n documents.append(_input)\n docs = splitter.split_documents(documents)\n self.repr_value = build_loader_repr_from_documents(docs)\n return self.to_records(docs)\n", + "value": "from typing import Optional\n\nfrom langchain.text_splitter import RecursiveCharacterTextSplitter\nfrom langchain_core.documents import Document\n\nfrom langflow.custom import CustomComponent\nfrom langflow.schema import Record\nfrom langflow.utils.util import build_loader_repr_from_documents\n\n\nclass RecursiveCharacterTextSplitterComponent(CustomComponent):\n display_name: str = \"Recursive Character Text Splitter\"\n description: str = \"Split text into chunks of a specified length.\"\n documentation: str = (\n \"https://docs.langflow.org/components/text-splitters#recursivecharactertextsplitter\"\n )\n\n def build_config(self):\n return {\n \"inputs\": {\n \"display_name\": \"Input\",\n \"info\": \"The texts to split.\",\n \"input_types\": [\"Document\", \"Record\"],\n },\n \"separators\": {\n \"display_name\": \"Separators\",\n \"info\": 'The characters to split on.\\nIf left empty defaults to [\"\\\\n\\\\n\", \"\\\\n\", \" \", \"\"].',\n \"is_list\": True,\n },\n \"chunk_size\": {\n \"display_name\": \"Chunk Size\",\n \"info\": \"The maximum length of each chunk.\",\n \"field_type\": \"int\",\n \"value\": 1000,\n },\n \"chunk_overlap\": {\n \"display_name\": \"Chunk Overlap\",\n \"info\": \"The amount of overlap between chunks.\",\n \"field_type\": \"int\",\n \"value\": 200,\n },\n \"code\": {\"show\": False},\n }\n\n def build(\n self,\n inputs: list[Document],\n separators: Optional[list[str]] = None,\n chunk_size: Optional[int] = 1000,\n chunk_overlap: Optional[int] = 200,\n ) -> list[Record]:\n \"\"\"\n Split text into chunks of a specified length.\n\n Args:\n separators (list[str]): The characters to split on.\n chunk_size (int): The maximum length of each chunk.\n chunk_overlap (int): The amount of overlap between chunks.\n length_function (function): The function to use to calculate the length of the text.\n\n Returns:\n list[str]: The chunks of text.\n \"\"\"\n\n if separators == \"\":\n separators = None\n elif separators:\n # check if the separators list has escaped characters\n # if there are escaped characters, unescape them\n separators = [x.encode().decode(\"unicode-escape\") for x in separators]\n\n # Make sure chunk_size and chunk_overlap are ints\n if isinstance(chunk_size, str):\n chunk_size = int(chunk_size)\n if isinstance(chunk_overlap, str):\n chunk_overlap = int(chunk_overlap)\n splitter = RecursiveCharacterTextSplitter(\n separators=separators,\n chunk_size=chunk_size,\n chunk_overlap=chunk_overlap,\n )\n documents = []\n for _input in inputs:\n if isinstance(_input, Record):\n documents.append(_input.to_lc_document())\n else:\n documents.append(_input)\n docs = splitter.split_documents(documents)\n self.repr_value = build_loader_repr_from_documents(docs)\n return self.to_records(docs)\n", "fileTypes": [], "file_path": "", "password": false, @@ -293,7 +293,7 @@ "list": false, "show": true, "multiline": true, - "value": "from typing import List, Optional, Union\n\nimport chromadb # type: ignore\nfrom langchain.embeddings.base import Embeddings\nfrom langchain.schema import BaseRetriever\nfrom langchain_community.vectorstores import VectorStore\nfrom langchain_community.vectorstores.chroma import Chroma\n\nfrom langflow import CustomComponent\nfrom langflow.schema.schema import Record\n\n\nclass ChromaComponent(CustomComponent):\n \"\"\"\n A custom component for implementing a Vector Store using Chroma.\n \"\"\"\n\n display_name: str = \"Chroma\"\n description: str = \"Implementation of Vector Store using Chroma\"\n documentation = \"https://python.langchain.com/docs/integrations/vectorstores/chroma\"\n beta: bool = True\n icon = \"Chroma\"\n\n def build_config(self):\n \"\"\"\n Builds the configuration for the component.\n\n Returns:\n - dict: A dictionary containing the configuration options for the component.\n \"\"\"\n return {\n \"collection_name\": {\"display_name\": \"Collection Name\", \"value\": \"langflow\"},\n \"index_directory\": {\"display_name\": \"Persist Directory\"},\n \"code\": {\"advanced\": True, \"display_name\": \"Code\"},\n \"inputs\": {\"display_name\": \"Input\", \"input_types\": [\"Document\", \"Record\"]},\n \"embedding\": {\"display_name\": \"Embedding\"},\n \"chroma_server_cors_allow_origins\": {\n \"display_name\": \"Server CORS Allow Origins\",\n \"advanced\": True,\n },\n \"chroma_server_host\": {\"display_name\": \"Server Host\", \"advanced\": True},\n \"chroma_server_port\": {\"display_name\": \"Server Port\", \"advanced\": True},\n \"chroma_server_grpc_port\": {\n \"display_name\": \"Server gRPC Port\",\n \"advanced\": True,\n },\n \"chroma_server_ssl_enabled\": {\n \"display_name\": \"Server SSL Enabled\",\n \"advanced\": True,\n },\n }\n\n def build(\n self,\n collection_name: str,\n embedding: Embeddings,\n chroma_server_ssl_enabled: bool,\n index_directory: Optional[str] = None,\n inputs: Optional[List[Record]] = None,\n chroma_server_cors_allow_origins: Optional[str] = None,\n chroma_server_host: Optional[str] = None,\n chroma_server_port: Optional[int] = None,\n chroma_server_grpc_port: Optional[int] = None,\n ) -> Union[VectorStore, BaseRetriever]:\n \"\"\"\n Builds the Vector Store or BaseRetriever object.\n\n Args:\n - collection_name (str): The name of the collection.\n - index_directory (Optional[str]): The directory to persist the Vector Store to.\n - chroma_server_ssl_enabled (bool): Whether to enable SSL for the Chroma server.\n - embedding (Optional[Embeddings]): The embeddings to use for the Vector Store.\n - documents (Optional[Document]): The documents to use for the Vector Store.\n - chroma_server_cors_allow_origins (Optional[str]): The CORS allow origins for the Chroma server.\n - chroma_server_host (Optional[str]): The host for the Chroma server.\n - chroma_server_port (Optional[int]): The port for the Chroma server.\n - chroma_server_grpc_port (Optional[int]): The gRPC port for the Chroma server.\n\n Returns:\n - Union[VectorStore, BaseRetriever]: The Vector Store or BaseRetriever object.\n \"\"\"\n\n # Chroma settings\n chroma_settings = None\n\n if chroma_server_host is not None:\n chroma_settings = chromadb.config.Settings(\n chroma_server_cors_allow_origins=chroma_server_cors_allow_origins\n or None,\n chroma_server_host=chroma_server_host,\n chroma_server_port=chroma_server_port or None,\n chroma_server_grpc_port=chroma_server_grpc_port or None,\n chroma_server_ssl_enabled=chroma_server_ssl_enabled,\n )\n\n # If documents, then we need to create a Chroma instance using .from_documents\n\n # Check index_directory and expand it if it is a relative path\n if index_directory is not None:\n index_directory = self.resolve_path(index_directory)\n\n documents = []\n for _input in inputs:\n if isinstance(_input, Record):\n documents.append(_input.to_lc_document())\n else:\n documents.append(_input)\n if documents is not None and embedding is not None:\n if len(documents) == 0:\n raise ValueError(\n \"If documents are provided, there must be at least one document.\"\n )\n chroma = Chroma.from_documents(\n documents=documents, # type: ignore\n persist_directory=index_directory,\n collection_name=collection_name,\n embedding=embedding,\n client_settings=chroma_settings,\n )\n else:\n chroma = Chroma(\n persist_directory=index_directory,\n client_settings=chroma_settings,\n embedding_function=embedding,\n )\n return chroma\n", + "value": "from typing import List, Optional, Union\n\nimport chromadb # type: ignore\nfrom langchain.embeddings.base import Embeddings\nfrom langchain.schema import BaseRetriever\nfrom langchain_community.vectorstores import VectorStore\nfrom langchain_community.vectorstores.chroma import Chroma\n\nfrom langflow.custom import CustomComponent\nfrom langflow.schema.schema import Record\n\n\nclass ChromaComponent(CustomComponent):\n \"\"\"\n A custom component for implementing a Vector Store using Chroma.\n \"\"\"\n\n display_name: str = \"Chroma\"\n description: str = \"Implementation of Vector Store using Chroma\"\n documentation = \"https://python.langchain.com/docs/integrations/vectorstores/chroma\"\n beta: bool = True\n icon = \"Chroma\"\n\n def build_config(self):\n \"\"\"\n Builds the configuration for the component.\n\n Returns:\n - dict: A dictionary containing the configuration options for the component.\n \"\"\"\n return {\n \"collection_name\": {\"display_name\": \"Collection Name\", \"value\": \"langflow\"},\n \"index_directory\": {\"display_name\": \"Persist Directory\"},\n \"code\": {\"advanced\": True, \"display_name\": \"Code\"},\n \"inputs\": {\"display_name\": \"Input\", \"input_types\": [\"Document\", \"Record\"]},\n \"embedding\": {\"display_name\": \"Embedding\"},\n \"chroma_server_cors_allow_origins\": {\n \"display_name\": \"Server CORS Allow Origins\",\n \"advanced\": True,\n },\n \"chroma_server_host\": {\"display_name\": \"Server Host\", \"advanced\": True},\n \"chroma_server_port\": {\"display_name\": \"Server Port\", \"advanced\": True},\n \"chroma_server_grpc_port\": {\n \"display_name\": \"Server gRPC Port\",\n \"advanced\": True,\n },\n \"chroma_server_ssl_enabled\": {\n \"display_name\": \"Server SSL Enabled\",\n \"advanced\": True,\n },\n }\n\n def build(\n self,\n collection_name: str,\n embedding: Embeddings,\n chroma_server_ssl_enabled: bool,\n index_directory: Optional[str] = None,\n inputs: Optional[List[Record]] = None,\n chroma_server_cors_allow_origins: Optional[str] = None,\n chroma_server_host: Optional[str] = None,\n chroma_server_port: Optional[int] = None,\n chroma_server_grpc_port: Optional[int] = None,\n ) -> Union[VectorStore, BaseRetriever]:\n \"\"\"\n Builds the Vector Store or BaseRetriever object.\n\n Args:\n - collection_name (str): The name of the collection.\n - index_directory (Optional[str]): The directory to persist the Vector Store to.\n - chroma_server_ssl_enabled (bool): Whether to enable SSL for the Chroma server.\n - embedding (Optional[Embeddings]): The embeddings to use for the Vector Store.\n - documents (Optional[Document]): The documents to use for the Vector Store.\n - chroma_server_cors_allow_origins (Optional[str]): The CORS allow origins for the Chroma server.\n - chroma_server_host (Optional[str]): The host for the Chroma server.\n - chroma_server_port (Optional[int]): The port for the Chroma server.\n - chroma_server_grpc_port (Optional[int]): The gRPC port for the Chroma server.\n\n Returns:\n - Union[VectorStore, BaseRetriever]: The Vector Store or BaseRetriever object.\n \"\"\"\n\n # Chroma settings\n chroma_settings = None\n\n if chroma_server_host is not None:\n chroma_settings = chromadb.config.Settings(\n chroma_server_cors_allow_origins=chroma_server_cors_allow_origins\n or None,\n chroma_server_host=chroma_server_host,\n chroma_server_port=chroma_server_port or None,\n chroma_server_grpc_port=chroma_server_grpc_port or None,\n chroma_server_ssl_enabled=chroma_server_ssl_enabled,\n )\n\n # If documents, then we need to create a Chroma instance using .from_documents\n\n # Check index_directory and expand it if it is a relative path\n if index_directory is not None:\n index_directory = self.resolve_path(index_directory)\n\n documents = []\n for _input in inputs:\n if isinstance(_input, Record):\n documents.append(_input.to_lc_document())\n else:\n documents.append(_input)\n if documents is not None and embedding is not None:\n if len(documents) == 0:\n raise ValueError(\n \"If documents are provided, there must be at least one document.\"\n )\n chroma = Chroma.from_documents(\n documents=documents, # type: ignore\n persist_directory=index_directory,\n collection_name=collection_name,\n embedding=embedding,\n client_settings=chroma_settings,\n )\n else:\n chroma = Chroma(\n persist_directory=index_directory,\n client_settings=chroma_settings,\n embedding_function=embedding,\n )\n return chroma\n", "fileTypes": [], "file_path": "", "password": false, @@ -464,7 +464,7 @@ "list": false, "show": true, "multiline": true, - "value": "from typing import Any, Callable, Dict, List, Optional, Union\n\nfrom langchain_openai.embeddings.base import OpenAIEmbeddings\nfrom langflow import CustomComponent\nfrom langflow.field_typing import NestedDict\nfrom pydantic.v1.types import SecretStr\n\n\nclass OpenAIEmbeddingsComponent(CustomComponent):\n display_name = \"OpenAIEmbeddings\"\n description = \"OpenAI embedding models\"\n\n def build_config(self):\n return {\n \"allowed_special\": {\n \"display_name\": \"Allowed Special\",\n \"advanced\": True,\n \"field_type\": \"str\",\n \"is_list\": True,\n },\n \"default_headers\": {\n \"display_name\": \"Default Headers\",\n \"advanced\": True,\n \"field_type\": \"dict\",\n },\n \"default_query\": {\n \"display_name\": \"Default Query\",\n \"advanced\": True,\n \"field_type\": \"NestedDict\",\n },\n \"disallowed_special\": {\n \"display_name\": \"Disallowed Special\",\n \"advanced\": True,\n \"field_type\": \"str\",\n \"is_list\": True,\n },\n \"chunk_size\": {\"display_name\": \"Chunk Size\", \"advanced\": True},\n \"client\": {\"display_name\": \"Client\", \"advanced\": True},\n \"deployment\": {\"display_name\": \"Deployment\", \"advanced\": True},\n \"embedding_ctx_length\": {\n \"display_name\": \"Embedding Context Length\",\n \"advanced\": True,\n },\n \"max_retries\": {\"display_name\": \"Max Retries\", \"advanced\": True},\n \"model\": {\n \"display_name\": \"Model\",\n \"advanced\": False,\n \"options\": [\"text-embedding-3-small\", \"text-embedding-3-large\", \"text-embedding-ada-002\"],\n },\n \"model_kwargs\": {\"display_name\": \"Model Kwargs\", \"advanced\": True},\n \"openai_api_base\": {\"display_name\": \"OpenAI API Base\", \"password\": True, \"advanced\": True},\n \"openai_api_key\": {\"display_name\": \"OpenAI API Key\", \"password\": True},\n \"openai_api_type\": {\"display_name\": \"OpenAI API Type\", \"advanced\": True, \"password\": True},\n \"openai_api_version\": {\n \"display_name\": \"OpenAI API Version\",\n \"advanced\": True,\n },\n \"openai_organization\": {\n \"display_name\": \"OpenAI Organization\",\n \"advanced\": True,\n },\n \"openai_proxy\": {\"display_name\": \"OpenAI Proxy\", \"advanced\": True},\n \"request_timeout\": {\"display_name\": \"Request Timeout\", \"advanced\": True},\n \"show_progress_bar\": {\n \"display_name\": \"Show Progress Bar\",\n \"advanced\": True,\n },\n \"skip_empty\": {\"display_name\": \"Skip Empty\", \"advanced\": True},\n \"tiktoken_model_name\": {\"display_name\": \"TikToken Model Name\"},\n \"tikToken_enable\": {\"display_name\": \"TikToken Enable\", \"advanced\": True},\n }\n\n def build(\n self,\n default_headers: Optional[Dict[str, str]] = None,\n default_query: Optional[NestedDict] = {},\n allowed_special: List[str] = [],\n disallowed_special: List[str] = [\"all\"],\n chunk_size: int = 1000,\n client: Optional[Any] = None,\n deployment: str = \"text-embedding-3-small\",\n embedding_ctx_length: int = 8191,\n max_retries: int = 6,\n model: str = \"text-embedding-3-small\",\n model_kwargs: NestedDict = {},\n openai_api_base: Optional[str] = None,\n openai_api_key: Optional[str] = \"\",\n openai_api_type: Optional[str] = None,\n openai_api_version: Optional[str] = None,\n openai_organization: Optional[str] = None,\n openai_proxy: Optional[str] = None,\n request_timeout: Optional[float] = None,\n show_progress_bar: bool = False,\n skip_empty: bool = False,\n tiktoken_enable: bool = True,\n tiktoken_model_name: Optional[str] = None,\n ) -> Union[OpenAIEmbeddings, Callable]:\n # This is to avoid errors with Vector Stores (e.g Chroma)\n if disallowed_special == [\"all\"]:\n disallowed_special = \"all\" # type: ignore\n\n api_key = SecretStr(openai_api_key) if openai_api_key else None\n\n return OpenAIEmbeddings(\n tiktoken_enabled=tiktoken_enable,\n default_headers=default_headers,\n default_query=default_query,\n allowed_special=set(allowed_special),\n disallowed_special=\"all\",\n chunk_size=chunk_size,\n client=client,\n deployment=deployment,\n embedding_ctx_length=embedding_ctx_length,\n max_retries=max_retries,\n model=model,\n model_kwargs=model_kwargs,\n base_url=openai_api_base,\n api_key=api_key,\n openai_api_type=openai_api_type,\n api_version=openai_api_version,\n organization=openai_organization,\n openai_proxy=openai_proxy,\n timeout=request_timeout,\n show_progress_bar=show_progress_bar,\n skip_empty=skip_empty,\n tiktoken_model_name=tiktoken_model_name,\n )\n", + "value": "from typing import Any, Callable, Dict, List, Optional, Union\n\nfrom langchain_openai.embeddings.base import OpenAIEmbeddings\nfrom langflow.custom import CustomComponent\nfrom langflow.field_typing import NestedDict\nfrom pydantic.v1.types import SecretStr\n\n\nclass OpenAIEmbeddingsComponent(CustomComponent):\n display_name = \"OpenAIEmbeddings\"\n description = \"OpenAI embedding models\"\n\n def build_config(self):\n return {\n \"allowed_special\": {\n \"display_name\": \"Allowed Special\",\n \"advanced\": True,\n \"field_type\": \"str\",\n \"is_list\": True,\n },\n \"default_headers\": {\n \"display_name\": \"Default Headers\",\n \"advanced\": True,\n \"field_type\": \"dict\",\n },\n \"default_query\": {\n \"display_name\": \"Default Query\",\n \"advanced\": True,\n \"field_type\": \"NestedDict\",\n },\n \"disallowed_special\": {\n \"display_name\": \"Disallowed Special\",\n \"advanced\": True,\n \"field_type\": \"str\",\n \"is_list\": True,\n },\n \"chunk_size\": {\"display_name\": \"Chunk Size\", \"advanced\": True},\n \"client\": {\"display_name\": \"Client\", \"advanced\": True},\n \"deployment\": {\"display_name\": \"Deployment\", \"advanced\": True},\n \"embedding_ctx_length\": {\n \"display_name\": \"Embedding Context Length\",\n \"advanced\": True,\n },\n \"max_retries\": {\"display_name\": \"Max Retries\", \"advanced\": True},\n \"model\": {\n \"display_name\": \"Model\",\n \"advanced\": False,\n \"options\": [\"text-embedding-3-small\", \"text-embedding-3-large\", \"text-embedding-ada-002\"],\n },\n \"model_kwargs\": {\"display_name\": \"Model Kwargs\", \"advanced\": True},\n \"openai_api_base\": {\"display_name\": \"OpenAI API Base\", \"password\": True, \"advanced\": True},\n \"openai_api_key\": {\"display_name\": \"OpenAI API Key\", \"password\": True},\n \"openai_api_type\": {\"display_name\": \"OpenAI API Type\", \"advanced\": True, \"password\": True},\n \"openai_api_version\": {\n \"display_name\": \"OpenAI API Version\",\n \"advanced\": True,\n },\n \"openai_organization\": {\n \"display_name\": \"OpenAI Organization\",\n \"advanced\": True,\n },\n \"openai_proxy\": {\"display_name\": \"OpenAI Proxy\", \"advanced\": True},\n \"request_timeout\": {\"display_name\": \"Request Timeout\", \"advanced\": True},\n \"show_progress_bar\": {\n \"display_name\": \"Show Progress Bar\",\n \"advanced\": True,\n },\n \"skip_empty\": {\"display_name\": \"Skip Empty\", \"advanced\": True},\n \"tiktoken_model_name\": {\"display_name\": \"TikToken Model Name\"},\n \"tikToken_enable\": {\"display_name\": \"TikToken Enable\", \"advanced\": True},\n }\n\n def build(\n self,\n default_headers: Optional[Dict[str, str]] = None,\n default_query: Optional[NestedDict] = {},\n allowed_special: List[str] = [],\n disallowed_special: List[str] = [\"all\"],\n chunk_size: int = 1000,\n client: Optional[Any] = None,\n deployment: str = \"text-embedding-3-small\",\n embedding_ctx_length: int = 8191,\n max_retries: int = 6,\n model: str = \"text-embedding-3-small\",\n model_kwargs: NestedDict = {},\n openai_api_base: Optional[str] = None,\n openai_api_key: Optional[str] = \"\",\n openai_api_type: Optional[str] = None,\n openai_api_version: Optional[str] = None,\n openai_organization: Optional[str] = None,\n openai_proxy: Optional[str] = None,\n request_timeout: Optional[float] = None,\n show_progress_bar: bool = False,\n skip_empty: bool = False,\n tiktoken_enable: bool = True,\n tiktoken_model_name: Optional[str] = None,\n ) -> Union[OpenAIEmbeddings, Callable]:\n # This is to avoid errors with Vector Stores (e.g Chroma)\n if disallowed_special == [\"all\"]:\n disallowed_special = \"all\" # type: ignore\n\n api_key = SecretStr(openai_api_key) if openai_api_key else None\n\n return OpenAIEmbeddings(\n tiktoken_enabled=tiktoken_enable,\n default_headers=default_headers,\n default_query=default_query,\n allowed_special=set(allowed_special),\n disallowed_special=\"all\",\n chunk_size=chunk_size,\n client=client,\n deployment=deployment,\n embedding_ctx_length=embedding_ctx_length,\n max_retries=max_retries,\n model=model,\n model_kwargs=model_kwargs,\n base_url=openai_api_base,\n api_key=api_key,\n openai_api_type=openai_api_type,\n api_version=openai_api_version,\n organization=openai_organization,\n openai_proxy=openai_proxy,\n timeout=request_timeout,\n show_progress_bar=show_progress_bar,\n skip_empty=skip_empty,\n tiktoken_model_name=tiktoken_model_name,\n )\n", "fileTypes": [], "file_path": "", "password": false, @@ -922,7 +922,7 @@ "list": false, "show": true, "multiline": true, - "value": "from typing import Any, Dict\n\nfrom langchain_community.document_loaders.web_base import WebBaseLoader\n\nfrom langflow import CustomComponent\nfrom langflow.schema import Record\n\n\nclass URLComponent(CustomComponent):\n display_name = \"URL\"\n description = \"Load URLs and convert them to records.\"\n\n def build_config(self) -> Dict[str, Any]:\n return {\n \"urls\": {\"display_name\": \"URL\"},\n }\n\n async def build(\n self,\n urls: list[str],\n ) -> Record:\n\n loader = WebBaseLoader(web_paths=urls)\n docs = loader.load()\n records = self.to_records(docs)\n return records\n", + "value": "from typing import Any, Dict\n\nfrom langchain_community.document_loaders.web_base import WebBaseLoader\n\nfrom langflow.custom import CustomComponent\nfrom langflow.schema import Record\n\n\nclass URLComponent(CustomComponent):\n display_name = \"URL\"\n description = \"Load URLs and convert them to records.\"\n\n def build_config(self) -> Dict[str, Any]:\n return {\n \"urls\": {\"display_name\": \"URL\"},\n }\n\n async def build(\n self,\n urls: list[str],\n ) -> Record:\n\n loader = WebBaseLoader(web_paths=urls)\n docs = loader.load()\n records = self.to_records(docs)\n return records\n", "fileTypes": [], "file_path": "", "password": false, diff --git a/src/backend/langflow/interface/__init__.py b/src/backend/base/langflow/interface/__init__.py similarity index 100% rename from src/backend/langflow/interface/__init__.py rename to src/backend/base/langflow/interface/__init__.py diff --git a/src/backend/langflow/interface/agents/__init__.py b/src/backend/base/langflow/interface/agents/__init__.py similarity index 100% rename from src/backend/langflow/interface/agents/__init__.py rename to src/backend/base/langflow/interface/agents/__init__.py diff --git a/src/backend/langflow/interface/agents/base.py b/src/backend/base/langflow/interface/agents/base.py similarity index 97% rename from src/backend/langflow/interface/agents/base.py rename to src/backend/base/langflow/interface/agents/base.py index 9c0210b27..5d50b3aff 100644 --- a/src/backend/langflow/interface/agents/base.py +++ b/src/backend/base/langflow/interface/agents/base.py @@ -1,14 +1,13 @@ from typing import ClassVar, Dict, List, Optional from langchain.agents import types +from loguru import logger -from langflow.custom.customs import get_custom_nodes from langflow.interface.agents.custom import CUSTOM_AGENTS from langflow.interface.base import LangChainTypeCreator +from langflow.legacy_custom.customs import get_custom_nodes from langflow.services.deps import get_settings_service - from langflow.template.frontend_node.agents import AgentFrontendNode -from loguru import logger from langflow.utils.util import build_template_from_class, build_template_from_method diff --git a/src/backend/langflow/interface/agents/custom.py b/src/backend/base/langflow/interface/agents/custom.py similarity index 98% rename from src/backend/langflow/interface/agents/custom.py rename to src/backend/base/langflow/interface/agents/custom.py index 608a98a9b..142b77139 100644 --- a/src/backend/langflow/interface/agents/custom.py +++ b/src/backend/base/langflow/interface/agents/custom.py @@ -1,11 +1,7 @@ from typing import Any, Optional from langchain.agents import AgentExecutor, ZeroShotAgent -from langchain.agents.agent_toolkits import ( - VectorStoreInfo, - VectorStoreRouterToolkit, - VectorStoreToolkit, -) +from langchain.agents.agent_toolkits import VectorStoreInfo, VectorStoreRouterToolkit, VectorStoreToolkit from langchain.agents.agent_toolkits.vectorstore.prompt import PREFIX as VECTORSTORE_PREFIX from langchain.agents.agent_toolkits.vectorstore.prompt import ROUTER_PREFIX as VECTORSTORE_ROUTER_PREFIX from langchain.agents.mrkl.prompt import FORMAT_INSTRUCTIONS diff --git a/src/backend/langflow/interface/agents/prebuilt.py b/src/backend/base/langflow/interface/agents/prebuilt.py similarity index 100% rename from src/backend/langflow/interface/agents/prebuilt.py rename to src/backend/base/langflow/interface/agents/prebuilt.py diff --git a/src/backend/langflow/interface/base.py b/src/backend/base/langflow/interface/base.py similarity index 100% rename from src/backend/langflow/interface/base.py rename to src/backend/base/langflow/interface/base.py index d535838ac..a300f12f2 100644 --- a/src/backend/langflow/interface/base.py +++ b/src/backend/base/langflow/interface/base.py @@ -1,15 +1,15 @@ from abc import ABC, abstractmethod from typing import Any, Dict, List, Optional, Type, Union -from langchain.chains.base import Chain + from langchain.agents import AgentExecutor -from langflow.services.deps import get_settings_service +from langchain.chains.base import Chain +from loguru import logger from pydantic import BaseModel +from langflow.services.deps import get_settings_service from langflow.template.field.base import TemplateField from langflow.template.frontend_node.base import FrontendNode from langflow.template.template.base import Template -from loguru import logger - # Assuming necessary imports for Field, Template, and FrontendNode classes diff --git a/src/backend/langflow/interface/chains/__init__.py b/src/backend/base/langflow/interface/chains/__init__.py similarity index 100% rename from src/backend/langflow/interface/chains/__init__.py rename to src/backend/base/langflow/interface/chains/__init__.py diff --git a/src/backend/langflow/interface/chains/base.py b/src/backend/base/langflow/interface/chains/base.py similarity index 98% rename from src/backend/langflow/interface/chains/base.py rename to src/backend/base/langflow/interface/chains/base.py index 8017902bd..fb008f0a7 100644 --- a/src/backend/langflow/interface/chains/base.py +++ b/src/backend/base/langflow/interface/chains/base.py @@ -1,15 +1,15 @@ from typing import Any, ClassVar, Dict, List, Optional, Type -from langflow.custom.customs import get_custom_nodes -from langflow.interface.base import LangChainTypeCreator -from langflow.interface.importing.utils import import_class -from langflow.services.deps import get_settings_service - -from langflow.template.frontend_node.chains import ChainFrontendNode -from loguru import logger -from langflow.utils.util import build_template_from_class, build_template_from_method from langchain import chains from langchain_experimental.sql import SQLDatabaseChain +from loguru import logger + +from langflow.interface.base import LangChainTypeCreator +from langflow.interface.importing.utils import import_class +from langflow.legacy_custom.customs import get_custom_nodes +from langflow.services.deps import get_settings_service +from langflow.template.frontend_node.chains import ChainFrontendNode +from langflow.utils.util import build_template_from_class, build_template_from_method # Assuming necessary imports for Field, Template, and FrontendNode classes diff --git a/src/backend/langflow/interface/chains/custom.py b/src/backend/base/langflow/interface/chains/custom.py similarity index 99% rename from src/backend/langflow/interface/chains/custom.py rename to src/backend/base/langflow/interface/chains/custom.py index 27ed646b2..2a72f3471 100644 --- a/src/backend/langflow/interface/chains/custom.py +++ b/src/backend/base/langflow/interface/chains/custom.py @@ -1,13 +1,14 @@ from typing import Dict, Optional, Type, Union +from langchain.base_language import BaseLanguageModel from langchain.chains import ConversationChain +from langchain.chains.question_answering import load_qa_chain from langchain.memory.buffer import ConversationBufferMemory from langchain.schema import BaseMemory -from langflow.interface.base import CustomChain from pydantic.v1 import Field, root_validator -from langchain.chains.question_answering import load_qa_chain + +from langflow.interface.base import CustomChain from langflow.interface.utils import extract_input_variables_from_prompt -from langchain.base_language import BaseLanguageModel DEFAULT_SUFFIX = """" Current conversation: diff --git a/src/backend/langflow/interface/custom/__init__.py b/src/backend/base/langflow/interface/custom/__init__.py similarity index 100% rename from src/backend/langflow/interface/custom/__init__.py rename to src/backend/base/langflow/interface/custom/__init__.py diff --git a/src/backend/langflow/interface/custom/attributes.py b/src/backend/base/langflow/interface/custom/attributes.py similarity index 100% rename from src/backend/langflow/interface/custom/attributes.py rename to src/backend/base/langflow/interface/custom/attributes.py diff --git a/src/backend/langflow/interface/custom/base.py b/src/backend/base/langflow/interface/custom/base.py similarity index 85% rename from src/backend/langflow/interface/custom/base.py rename to src/backend/base/langflow/interface/custom/base.py index 45a3ea215..573eacba1 100644 --- a/src/backend/langflow/interface/custom/base.py +++ b/src/backend/base/langflow/interface/custom/base.py @@ -1,16 +1,12 @@ from typing import Any, Dict, List, Optional, Type +from loguru import logger from langflow.interface.base import LangChainTypeCreator # from langflow.interface.custom.custom import CustomComponent from langflow.interface.custom.custom_component import CustomComponent -from langflow.template.frontend_node.custom_components import ( - CustomComponentFrontendNode, -) -from loguru import logger - -# Assuming necessary imports for Field, Template, and FrontendNode classes +from langflow.template.frontend_node.custom_components import CustomComponentFrontendNode class CustomComponentCreator(LangChainTypeCreator): @@ -29,7 +25,7 @@ class CustomComponentCreator(LangChainTypeCreator): return self.type_dict def get_signature(self, name: str) -> Optional[Dict]: - from langflow.custom.customs import get_custom_nodes + from langflow.legacy_custom.customs import get_custom_nodes try: if name in get_custom_nodes(self.type_name).keys(): diff --git a/src/backend/langflow/interface/custom/code_parser/__init__.py b/src/backend/base/langflow/interface/custom/code_parser/__init__.py similarity index 100% rename from src/backend/langflow/interface/custom/code_parser/__init__.py rename to src/backend/base/langflow/interface/custom/code_parser/__init__.py diff --git a/src/backend/langflow/interface/custom/code_parser/code_parser.py b/src/backend/base/langflow/interface/custom/code_parser/code_parser.py similarity index 99% rename from src/backend/langflow/interface/custom/code_parser/code_parser.py rename to src/backend/base/langflow/interface/custom/code_parser/code_parser.py index 55a2c693f..4f74cf15f 100644 --- a/src/backend/langflow/interface/custom/code_parser/code_parser.py +++ b/src/backend/base/langflow/interface/custom/code_parser/code_parser.py @@ -9,11 +9,7 @@ from fastapi import HTTPException from loguru import logger from langflow.interface.custom.eval import eval_custom_component_code -from langflow.interface.custom.schema import ( - CallableCodeDetails, - ClassCodeDetails, - MissingDefault, -) +from langflow.interface.custom.schema import CallableCodeDetails, ClassCodeDetails, MissingDefault class CodeSyntaxError(HTTPException): diff --git a/src/backend/langflow/interface/custom/code_parser/utils.py b/src/backend/base/langflow/interface/custom/code_parser/utils.py similarity index 100% rename from src/backend/langflow/interface/custom/code_parser/utils.py rename to src/backend/base/langflow/interface/custom/code_parser/utils.py diff --git a/src/backend/langflow/interface/custom/custom_component/__init__.py b/src/backend/base/langflow/interface/custom/custom_component/__init__.py similarity index 100% rename from src/backend/langflow/interface/custom/custom_component/__init__.py rename to src/backend/base/langflow/interface/custom/custom_component/__init__.py diff --git a/src/backend/langflow/interface/custom/custom_component/component.py b/src/backend/base/langflow/interface/custom/custom_component/component.py similarity index 100% rename from src/backend/langflow/interface/custom/custom_component/component.py rename to src/backend/base/langflow/interface/custom/custom_component/component.py diff --git a/src/backend/langflow/interface/custom/custom_component/custom_component.py b/src/backend/base/langflow/interface/custom/custom_component/custom_component.py similarity index 100% rename from src/backend/langflow/interface/custom/custom_component/custom_component.py rename to src/backend/base/langflow/interface/custom/custom_component/custom_component.py diff --git a/src/backend/langflow/interface/custom/directory_reader/__init__.py b/src/backend/base/langflow/interface/custom/directory_reader/__init__.py similarity index 100% rename from src/backend/langflow/interface/custom/directory_reader/__init__.py rename to src/backend/base/langflow/interface/custom/directory_reader/__init__.py diff --git a/src/backend/langflow/interface/custom/directory_reader/directory_reader.py b/src/backend/base/langflow/interface/custom/directory_reader/directory_reader.py similarity index 100% rename from src/backend/langflow/interface/custom/directory_reader/directory_reader.py rename to src/backend/base/langflow/interface/custom/directory_reader/directory_reader.py diff --git a/src/backend/langflow/interface/custom/directory_reader/utils.py b/src/backend/base/langflow/interface/custom/directory_reader/utils.py similarity index 98% rename from src/backend/langflow/interface/custom/directory_reader/utils.py rename to src/backend/base/langflow/interface/custom/directory_reader/utils.py index 0936bd4dd..2772cb78c 100644 --- a/src/backend/langflow/interface/custom/directory_reader/utils.py +++ b/src/backend/base/langflow/interface/custom/directory_reader/utils.py @@ -1,9 +1,7 @@ from loguru import logger from langflow.interface.custom.directory_reader import DirectoryReader -from langflow.template.frontend_node.custom_components import ( - CustomComponentFrontendNode, -) +from langflow.template.frontend_node.custom_components import CustomComponentFrontendNode def merge_nested_dicts_with_renaming(dict1, dict2): diff --git a/src/backend/langflow/interface/custom/eval.py b/src/backend/base/langflow/interface/custom/eval.py similarity index 100% rename from src/backend/langflow/interface/custom/eval.py rename to src/backend/base/langflow/interface/custom/eval.py diff --git a/src/backend/langflow/interface/custom/schema.py b/src/backend/base/langflow/interface/custom/schema.py similarity index 100% rename from src/backend/langflow/interface/custom/schema.py rename to src/backend/base/langflow/interface/custom/schema.py diff --git a/src/backend/langflow/interface/custom/utils.py b/src/backend/base/langflow/interface/custom/utils.py similarity index 99% rename from src/backend/langflow/interface/custom/utils.py rename to src/backend/base/langflow/interface/custom/utils.py index 636d1ccf7..c6daa4fe2 100644 --- a/src/backend/langflow/interface/custom/utils.py +++ b/src/backend/base/langflow/interface/custom/utils.py @@ -23,9 +23,7 @@ from langflow.interface.custom.eval import eval_custom_component_code from langflow.interface.custom.schema import MissingDefault from langflow.schema import dotdict from langflow.template.field.base import TemplateField -from langflow.template.frontend_node.custom_components import ( - CustomComponentFrontendNode, -) +from langflow.template.frontend_node.custom_components import CustomComponentFrontendNode from langflow.utils import validate from langflow.utils.util import get_base_classes diff --git a/src/backend/langflow/interface/custom_lists.py b/src/backend/base/langflow/interface/custom_lists.py similarity index 100% rename from src/backend/langflow/interface/custom_lists.py rename to src/backend/base/langflow/interface/custom_lists.py index 3cff26099..8f428ee11 100644 --- a/src/backend/langflow/interface/custom_lists.py +++ b/src/backend/base/langflow/interface/custom_lists.py @@ -2,8 +2,8 @@ import inspect from typing import Any from langchain import llms, memory, requests, text_splitter -from langchain_community.chat_models import AzureChatOpenAI, ChatAnthropic, ChatOpenAI, ChatVertexAI from langchain_community import agent_toolkits, document_loaders, embeddings +from langchain_community.chat_models import AzureChatOpenAI, ChatAnthropic, ChatOpenAI, ChatVertexAI from langflow.interface.agents.custom import CUSTOM_AGENTS from langflow.interface.chains.custom import CUSTOM_CHAINS diff --git a/src/backend/langflow/interface/document_loaders/__init__.py b/src/backend/base/langflow/interface/document_loaders/__init__.py similarity index 100% rename from src/backend/langflow/interface/document_loaders/__init__.py rename to src/backend/base/langflow/interface/document_loaders/__init__.py diff --git a/src/backend/langflow/interface/document_loaders/base.py b/src/backend/base/langflow/interface/document_loaders/base.py similarity index 100% rename from src/backend/langflow/interface/document_loaders/base.py rename to src/backend/base/langflow/interface/document_loaders/base.py index 6142d2fa2..24108c9b4 100644 --- a/src/backend/langflow/interface/document_loaders/base.py +++ b/src/backend/base/langflow/interface/document_loaders/base.py @@ -1,11 +1,11 @@ from typing import Dict, List, Optional, Type +from loguru import logger + from langflow.interface.base import LangChainTypeCreator +from langflow.interface.custom_lists import documentloaders_type_to_cls_dict from langflow.services.deps import get_settings_service from langflow.template.frontend_node.documentloaders import DocumentLoaderFrontNode -from langflow.interface.custom_lists import documentloaders_type_to_cls_dict - -from loguru import logger from langflow.utils.util import build_template_from_class diff --git a/src/backend/langflow/interface/embeddings/__init__.py b/src/backend/base/langflow/interface/embeddings/__init__.py similarity index 100% rename from src/backend/langflow/interface/embeddings/__init__.py rename to src/backend/base/langflow/interface/embeddings/__init__.py diff --git a/src/backend/langflow/interface/embeddings/base.py b/src/backend/base/langflow/interface/embeddings/base.py similarity index 100% rename from src/backend/langflow/interface/embeddings/base.py rename to src/backend/base/langflow/interface/embeddings/base.py index 834ea61fa..061321092 100644 --- a/src/backend/langflow/interface/embeddings/base.py +++ b/src/backend/base/langflow/interface/embeddings/base.py @@ -1,12 +1,12 @@ from typing import Dict, List, Optional, Type +from loguru import logger + from langflow.interface.base import LangChainTypeCreator from langflow.interface.custom_lists import embedding_type_to_cls_dict from langflow.services.deps import get_settings_service - from langflow.template.frontend_node.base import FrontendNode from langflow.template.frontend_node.embeddings import EmbeddingFrontendNode -from loguru import logger from langflow.utils.util import build_template_from_class diff --git a/src/backend/langflow/interface/importing/__init__.py b/src/backend/base/langflow/interface/importing/__init__.py similarity index 54% rename from src/backend/langflow/interface/importing/__init__.py rename to src/backend/base/langflow/interface/importing/__init__.py index 317849f8e..066653f49 100644 --- a/src/backend/langflow/interface/importing/__init__.py +++ b/src/backend/base/langflow/interface/importing/__init__.py @@ -1,5 +1,3 @@ -from langflow.interface.importing.utils import import_by_type # noqa: F401 - # This module is used to import any langchain class by name. ALL = [ diff --git a/src/backend/langflow/interface/importing/utils.py b/src/backend/base/langflow/interface/importing/utils.py similarity index 100% rename from src/backend/langflow/interface/importing/utils.py rename to src/backend/base/langflow/interface/importing/utils.py diff --git a/src/backend/langflow/interface/initialize/__init__.py b/src/backend/base/langflow/interface/initialize/__init__.py similarity index 100% rename from src/backend/langflow/interface/initialize/__init__.py rename to src/backend/base/langflow/interface/initialize/__init__.py diff --git a/src/backend/langflow/interface/initialize/llm.py b/src/backend/base/langflow/interface/initialize/llm.py similarity index 100% rename from src/backend/langflow/interface/initialize/llm.py rename to src/backend/base/langflow/interface/initialize/llm.py diff --git a/src/backend/langflow/interface/initialize/loading.py b/src/backend/base/langflow/interface/initialize/loading.py similarity index 99% rename from src/backend/langflow/interface/initialize/loading.py rename to src/backend/base/langflow/interface/initialize/loading.py index 5cb5ba39a..08720db74 100644 --- a/src/backend/langflow/interface/initialize/loading.py +++ b/src/backend/base/langflow/interface/initialize/loading.py @@ -14,7 +14,6 @@ from langchain_core.documents import Document from loguru import logger from pydantic import ValidationError -from langflow.custom.customs import CUSTOM_NODES from langflow.interface.custom.eval import eval_custom_component_code from langflow.interface.importing.utils import import_by_type from langflow.interface.initialize.llm import initialize_vertexai @@ -30,8 +29,8 @@ from langflow.utils import validate from langflow.utils.util import unescape_string if TYPE_CHECKING: - from langflow import CustomComponent from langflow.graph.vertex.base import Vertex + from langflow.interface.custom.custom_component import CustomComponent async def instantiate_class( @@ -39,6 +38,8 @@ async def instantiate_class( user_id=None, ) -> Any: """Instantiate class from module type and key, and params""" + from langflow.legacy_custom.customs import CUSTOM_NODES + vertex_type = vertex.vertex_type base_type = vertex.base_type params = vertex.params diff --git a/src/backend/langflow/interface/initialize/utils.py b/src/backend/base/langflow/interface/initialize/utils.py similarity index 100% rename from src/backend/langflow/interface/initialize/utils.py rename to src/backend/base/langflow/interface/initialize/utils.py diff --git a/src/backend/langflow/interface/initialize/vector_store.py b/src/backend/base/langflow/interface/initialize/vector_store.py similarity index 100% rename from src/backend/langflow/interface/initialize/vector_store.py rename to src/backend/base/langflow/interface/initialize/vector_store.py diff --git a/src/backend/langflow/interface/listing.py b/src/backend/base/langflow/interface/listing.py similarity index 100% rename from src/backend/langflow/interface/listing.py rename to src/backend/base/langflow/interface/listing.py diff --git a/src/backend/langflow/interface/llms/__init__.py b/src/backend/base/langflow/interface/llms/__init__.py similarity index 100% rename from src/backend/langflow/interface/llms/__init__.py rename to src/backend/base/langflow/interface/llms/__init__.py diff --git a/src/backend/langflow/interface/llms/base.py b/src/backend/base/langflow/interface/llms/base.py similarity index 100% rename from src/backend/langflow/interface/llms/base.py rename to src/backend/base/langflow/interface/llms/base.py diff --git a/src/backend/langflow/interface/memories/__init__.py b/src/backend/base/langflow/interface/memories/__init__.py similarity index 100% rename from src/backend/langflow/interface/memories/__init__.py rename to src/backend/base/langflow/interface/memories/__init__.py diff --git a/src/backend/langflow/interface/memories/base.py b/src/backend/base/langflow/interface/memories/base.py similarity index 97% rename from src/backend/langflow/interface/memories/base.py rename to src/backend/base/langflow/interface/memories/base.py index 7508d6d64..b63c7d3f0 100644 --- a/src/backend/langflow/interface/memories/base.py +++ b/src/backend/base/langflow/interface/memories/base.py @@ -1,14 +1,14 @@ from typing import ClassVar, Dict, List, Optional, Type +from loguru import logger + from langflow.interface.base import LangChainTypeCreator from langflow.interface.custom_lists import memory_type_to_cls_dict +from langflow.legacy_custom.customs import get_custom_nodes from langflow.services.deps import get_settings_service - from langflow.template.frontend_node.base import FrontendNode from langflow.template.frontend_node.memories import MemoryFrontendNode -from loguru import logger from langflow.utils.util import build_template_from_class, build_template_from_method -from langflow.custom.customs import get_custom_nodes class MemoryCreator(LangChainTypeCreator): diff --git a/src/backend/langflow/interface/output_parsers/__init__.py b/src/backend/base/langflow/interface/output_parsers/__init__.py similarity index 100% rename from src/backend/langflow/interface/output_parsers/__init__.py rename to src/backend/base/langflow/interface/output_parsers/__init__.py diff --git a/src/backend/langflow/interface/output_parsers/base.py b/src/backend/base/langflow/interface/output_parsers/base.py similarity index 99% rename from src/backend/langflow/interface/output_parsers/base.py rename to src/backend/base/langflow/interface/output_parsers/base.py index 3ae1e9d7b..503b47642 100644 --- a/src/backend/langflow/interface/output_parsers/base.py +++ b/src/backend/base/langflow/interface/output_parsers/base.py @@ -1,13 +1,12 @@ from typing import ClassVar, Dict, List, Optional, Type from langchain import output_parsers +from loguru import logger from langflow.interface.base import LangChainTypeCreator from langflow.interface.importing.utils import import_class from langflow.services.deps import get_settings_service - from langflow.template.frontend_node.output_parsers import OutputParserFrontendNode -from loguru import logger from langflow.utils.util import build_template_from_class, build_template_from_method diff --git a/src/backend/langflow/interface/prompts/__init__.py b/src/backend/base/langflow/interface/prompts/__init__.py similarity index 100% rename from src/backend/langflow/interface/prompts/__init__.py rename to src/backend/base/langflow/interface/prompts/__init__.py diff --git a/src/backend/langflow/interface/prompts/base.py b/src/backend/base/langflow/interface/prompts/base.py similarity index 97% rename from src/backend/langflow/interface/prompts/base.py rename to src/backend/base/langflow/interface/prompts/base.py index 164ea2b10..2b448c362 100644 --- a/src/backend/langflow/interface/prompts/base.py +++ b/src/backend/base/langflow/interface/prompts/base.py @@ -1,14 +1,13 @@ from typing import Dict, List, Optional, Type from langchain import prompts +from loguru import logger -from langflow.custom.customs import get_custom_nodes from langflow.interface.base import LangChainTypeCreator from langflow.interface.importing.utils import import_class +from langflow.legacy_custom.customs import get_custom_nodes from langflow.services.deps import get_settings_service - from langflow.template.frontend_node.prompts import PromptFrontendNode -from loguru import logger from langflow.utils.util import build_template_from_class diff --git a/src/backend/langflow/interface/prompts/custom.py b/src/backend/base/langflow/interface/prompts/custom.py similarity index 100% rename from src/backend/langflow/interface/prompts/custom.py rename to src/backend/base/langflow/interface/prompts/custom.py diff --git a/src/backend/langflow/interface/retrievers/__init__.py b/src/backend/base/langflow/interface/retrievers/__init__.py similarity index 100% rename from src/backend/langflow/interface/retrievers/__init__.py rename to src/backend/base/langflow/interface/retrievers/__init__.py diff --git a/src/backend/langflow/interface/retrievers/base.py b/src/backend/base/langflow/interface/retrievers/base.py similarity index 99% rename from src/backend/langflow/interface/retrievers/base.py rename to src/backend/base/langflow/interface/retrievers/base.py index a6813e76c..a0be56b9b 100644 --- a/src/backend/langflow/interface/retrievers/base.py +++ b/src/backend/base/langflow/interface/retrievers/base.py @@ -1,12 +1,13 @@ from typing import Any, ClassVar, Dict, List, Optional, Type from langchain_community import retrievers +from loguru import logger + from langflow.interface.base import LangChainTypeCreator from langflow.interface.importing.utils import import_class from langflow.services.deps import get_settings_service from langflow.template.frontend_node.retrievers import RetrieverFrontendNode from langflow.utils.util import build_template_from_class, build_template_from_method -from loguru import logger class RetrieverCreator(LangChainTypeCreator): diff --git a/src/backend/langflow/interface/run.py b/src/backend/base/langflow/interface/run.py similarity index 100% rename from src/backend/langflow/interface/run.py rename to src/backend/base/langflow/interface/run.py diff --git a/src/backend/langflow/interface/text_splitters/__init__.py b/src/backend/base/langflow/interface/text_splitters/__init__.py similarity index 100% rename from src/backend/langflow/interface/text_splitters/__init__.py rename to src/backend/base/langflow/interface/text_splitters/__init__.py diff --git a/src/backend/langflow/interface/text_splitters/base.py b/src/backend/base/langflow/interface/text_splitters/base.py similarity index 100% rename from src/backend/langflow/interface/text_splitters/base.py rename to src/backend/base/langflow/interface/text_splitters/base.py index 29c77a12f..497377cde 100644 --- a/src/backend/langflow/interface/text_splitters/base.py +++ b/src/backend/base/langflow/interface/text_splitters/base.py @@ -1,11 +1,11 @@ from typing import Dict, List, Optional, Type +from loguru import logger + from langflow.interface.base import LangChainTypeCreator +from langflow.interface.custom_lists import textsplitter_type_to_cls_dict from langflow.services.deps import get_settings_service from langflow.template.frontend_node.textsplitters import TextSplittersFrontendNode -from langflow.interface.custom_lists import textsplitter_type_to_cls_dict - -from loguru import logger from langflow.utils.util import build_template_from_class diff --git a/src/backend/langflow/interface/toolkits/__init__.py b/src/backend/base/langflow/interface/toolkits/__init__.py similarity index 100% rename from src/backend/langflow/interface/toolkits/__init__.py rename to src/backend/base/langflow/interface/toolkits/__init__.py diff --git a/src/backend/langflow/interface/toolkits/base.py b/src/backend/base/langflow/interface/toolkits/base.py similarity index 99% rename from src/backend/langflow/interface/toolkits/base.py rename to src/backend/base/langflow/interface/toolkits/base.py index 7c57579d1..9ff3ad045 100644 --- a/src/backend/langflow/interface/toolkits/base.py +++ b/src/backend/base/langflow/interface/toolkits/base.py @@ -1,12 +1,11 @@ from typing import Callable, Dict, List, Optional from langchain.agents import agent_toolkits +from loguru import logger from langflow.interface.base import LangChainTypeCreator from langflow.interface.importing.utils import import_class, import_module from langflow.services.deps import get_settings_service - -from loguru import logger from langflow.utils.util import build_template_from_class diff --git a/src/backend/langflow/interface/toolkits/custom.py b/src/backend/base/langflow/interface/toolkits/custom.py similarity index 100% rename from src/backend/langflow/interface/toolkits/custom.py rename to src/backend/base/langflow/interface/toolkits/custom.py diff --git a/src/backend/langflow/interface/tools/__init__.py b/src/backend/base/langflow/interface/tools/__init__.py similarity index 100% rename from src/backend/langflow/interface/tools/__init__.py rename to src/backend/base/langflow/interface/tools/__init__.py diff --git a/src/backend/langflow/interface/tools/base.py b/src/backend/base/langflow/interface/tools/base.py similarity index 94% rename from src/backend/langflow/interface/tools/base.py rename to src/backend/base/langflow/interface/tools/base.py index 875915a58..2506c0170 100644 --- a/src/backend/langflow/interface/tools/base.py +++ b/src/backend/base/langflow/interface/tools/base.py @@ -1,27 +1,18 @@ from typing import Dict, List, Optional -from langchain.agents.load_tools import ( - _EXTRA_LLM_TOOLS, - _EXTRA_OPTIONAL_TOOLS, - _LLM_TOOLS, -) - -from langflow.custom import customs +from langchain.agents.load_tools import _EXTRA_LLM_TOOLS, _EXTRA_OPTIONAL_TOOLS, _LLM_TOOLS from langflow.interface.base import LangChainTypeCreator -from langflow.interface.tools.constants import ( - ALL_TOOLS_NAMES, - CUSTOM_TOOLS, - FILE_TOOLS, - OTHER_TOOLS, -) +from langflow.interface.tools.constants import ALL_TOOLS_NAMES, CUSTOM_TOOLS, FILE_TOOLS, OTHER_TOOLS from langflow.interface.tools.util import get_tool_params +from langflow.legacy_custom import customs +from langflow.interface.tools.util import get_tool_params +from langflow.legacy_custom import customs from langflow.services.deps import get_settings_service - from langflow.template.field.base import TemplateField from langflow.template.template.base import Template from langflow.utils import util -from langflow.utils.util import build_template_from_class from langflow.utils.logger import logger +from langflow.utils.util import build_template_from_class TOOL_INPUTS = { "str": TemplateField( diff --git a/src/backend/langflow/interface/tools/constants.py b/src/backend/base/langflow/interface/tools/constants.py similarity index 85% rename from src/backend/langflow/interface/tools/constants.py rename to src/backend/base/langflow/interface/tools/constants.py index 194bea2e9..7b07922e5 100644 --- a/src/backend/langflow/interface/tools/constants.py +++ b/src/backend/base/langflow/interface/tools/constants.py @@ -1,11 +1,6 @@ from langchain import tools from langchain.agents import Tool -from langchain.agents.load_tools import ( - _BASE_TOOLS, - _EXTRA_LLM_TOOLS, - _EXTRA_OPTIONAL_TOOLS, - _LLM_TOOLS, -) +from langchain.agents.load_tools import _BASE_TOOLS, _EXTRA_LLM_TOOLS, _EXTRA_OPTIONAL_TOOLS, _LLM_TOOLS from langchain.tools.json.tool import JsonSpec from langflow.interface.importing.utils import import_class diff --git a/src/backend/langflow/interface/tools/custom.py b/src/backend/base/langflow/interface/tools/custom.py similarity index 100% rename from src/backend/langflow/interface/tools/custom.py rename to src/backend/base/langflow/interface/tools/custom.py diff --git a/src/backend/langflow/interface/tools/util.py b/src/backend/base/langflow/interface/tools/util.py similarity index 100% rename from src/backend/langflow/interface/tools/util.py rename to src/backend/base/langflow/interface/tools/util.py diff --git a/src/backend/langflow/interface/types.py b/src/backend/base/langflow/interface/types.py similarity index 96% rename from src/backend/langflow/interface/types.py rename to src/backend/base/langflow/interface/types.py index f1f315700..32ab7ff95 100644 --- a/src/backend/langflow/interface/types.py +++ b/src/backend/base/langflow/interface/types.py @@ -2,9 +2,7 @@ from cachetools import LRUCache, cached from langflow.interface.agents.base import agent_creator from langflow.interface.chains.base import chain_creator -from langflow.interface.custom.directory_reader.utils import ( - merge_nested_dicts_with_renaming, -) +from langflow.interface.custom.directory_reader.utils import merge_nested_dicts_with_renaming from langflow.interface.custom.utils import build_custom_components from langflow.interface.document_loaders.base import documentloader_creator from langflow.interface.embeddings.base import embedding_creator diff --git a/src/backend/langflow/interface/utilities/__init__.py b/src/backend/base/langflow/interface/utilities/__init__.py similarity index 100% rename from src/backend/langflow/interface/utilities/__init__.py rename to src/backend/base/langflow/interface/utilities/__init__.py diff --git a/src/backend/langflow/interface/utilities/base.py b/src/backend/base/langflow/interface/utilities/base.py similarity index 97% rename from src/backend/langflow/interface/utilities/base.py rename to src/backend/base/langflow/interface/utilities/base.py index 0a58ef1bc..1b7b69421 100644 --- a/src/backend/langflow/interface/utilities/base.py +++ b/src/backend/base/langflow/interface/utilities/base.py @@ -3,9 +3,9 @@ from typing import Dict, List, Optional, Type from langchain_community import utilities from loguru import logger -from langflow.custom.customs import get_custom_nodes from langflow.interface.base import LangChainTypeCreator from langflow.interface.importing.utils import import_class +from langflow.legacy_custom.customs import get_custom_nodes from langflow.services.deps import get_settings_service from langflow.template.frontend_node.utilities import UtilitiesFrontendNode from langflow.utils.util import build_template_from_class diff --git a/src/backend/langflow/interface/utils.py b/src/backend/base/langflow/interface/utils.py similarity index 100% rename from src/backend/langflow/interface/utils.py rename to src/backend/base/langflow/interface/utils.py diff --git a/src/backend/langflow/interface/vector_store/__init__.py b/src/backend/base/langflow/interface/vector_store/__init__.py similarity index 100% rename from src/backend/langflow/interface/vector_store/__init__.py rename to src/backend/base/langflow/interface/vector_store/__init__.py diff --git a/src/backend/langflow/interface/vector_store/base.py b/src/backend/base/langflow/interface/vector_store/base.py similarity index 100% rename from src/backend/langflow/interface/vector_store/base.py rename to src/backend/base/langflow/interface/vector_store/base.py diff --git a/src/backend/langflow/interface/wrappers/__init__.py b/src/backend/base/langflow/interface/wrappers/__init__.py similarity index 100% rename from src/backend/langflow/interface/wrappers/__init__.py rename to src/backend/base/langflow/interface/wrappers/__init__.py diff --git a/src/backend/langflow/interface/wrappers/base.py b/src/backend/base/langflow/interface/wrappers/base.py similarity index 100% rename from src/backend/langflow/interface/wrappers/base.py rename to src/backend/base/langflow/interface/wrappers/base.py diff --git a/src/backend/langflow/processing/__init__.py b/src/backend/base/langflow/legacy_custom/__init__.py similarity index 100% rename from src/backend/langflow/processing/__init__.py rename to src/backend/base/langflow/legacy_custom/__init__.py diff --git a/src/backend/langflow/custom/customs.py b/src/backend/base/langflow/legacy_custom/customs.py similarity index 100% rename from src/backend/langflow/custom/customs.py rename to src/backend/base/langflow/legacy_custom/customs.py diff --git a/src/backend/base/langflow/load.py b/src/backend/base/langflow/load.py new file mode 100644 index 000000000..2f2854134 --- /dev/null +++ b/src/backend/base/langflow/load.py @@ -0,0 +1 @@ +from langflow.processing.load import load_flow_from_json # noqa: F401 diff --git a/src/backend/langflow/main.py b/src/backend/base/langflow/main.py similarity index 100% rename from src/backend/langflow/main.py rename to src/backend/base/langflow/main.py diff --git a/src/backend/langflow/memory.py b/src/backend/base/langflow/memory.py similarity index 100% rename from src/backend/langflow/memory.py rename to src/backend/base/langflow/memory.py diff --git a/src/backend/langflow/services/auth/__init__.py b/src/backend/base/langflow/processing/__init__.py similarity index 100% rename from src/backend/langflow/services/auth/__init__.py rename to src/backend/base/langflow/processing/__init__.py diff --git a/src/backend/langflow/processing/base.py b/src/backend/base/langflow/processing/base.py similarity index 100% rename from src/backend/langflow/processing/base.py rename to src/backend/base/langflow/processing/base.py diff --git a/src/backend/langflow/processing/load.py b/src/backend/base/langflow/processing/load.py similarity index 100% rename from src/backend/langflow/processing/load.py rename to src/backend/base/langflow/processing/load.py diff --git a/src/backend/langflow/processing/process.py b/src/backend/base/langflow/processing/process.py similarity index 100% rename from src/backend/langflow/processing/process.py rename to src/backend/base/langflow/processing/process.py diff --git a/src/backend/langflow/schema/__init__.py b/src/backend/base/langflow/schema/__init__.py similarity index 100% rename from src/backend/langflow/schema/__init__.py rename to src/backend/base/langflow/schema/__init__.py diff --git a/src/backend/langflow/schema/dotdict.py b/src/backend/base/langflow/schema/dotdict.py similarity index 100% rename from src/backend/langflow/schema/dotdict.py rename to src/backend/base/langflow/schema/dotdict.py diff --git a/src/backend/langflow/schema/schema.py b/src/backend/base/langflow/schema/schema.py similarity index 100% rename from src/backend/langflow/schema/schema.py rename to src/backend/base/langflow/schema/schema.py diff --git a/src/backend/langflow/server.py b/src/backend/base/langflow/server.py similarity index 100% rename from src/backend/langflow/server.py rename to src/backend/base/langflow/server.py diff --git a/src/backend/langflow/services/__init__.py b/src/backend/base/langflow/services/__init__.py similarity index 100% rename from src/backend/langflow/services/__init__.py rename to src/backend/base/langflow/services/__init__.py diff --git a/src/backend/langflow/services/chat/__init__.py b/src/backend/base/langflow/services/auth/__init__.py similarity index 100% rename from src/backend/langflow/services/chat/__init__.py rename to src/backend/base/langflow/services/auth/__init__.py diff --git a/src/backend/langflow/services/auth/factory.py b/src/backend/base/langflow/services/auth/factory.py similarity index 100% rename from src/backend/langflow/services/auth/factory.py rename to src/backend/base/langflow/services/auth/factory.py index b44019289..63d5d2a6d 100644 --- a/src/backend/langflow/services/auth/factory.py +++ b/src/backend/base/langflow/services/auth/factory.py @@ -1,5 +1,5 @@ -from langflow.services.factory import ServiceFactory from langflow.services.auth.service import AuthService +from langflow.services.factory import ServiceFactory class AuthServiceFactory(ServiceFactory): diff --git a/src/backend/langflow/services/auth/service.py b/src/backend/base/langflow/services/auth/service.py similarity index 99% rename from src/backend/langflow/services/auth/service.py rename to src/backend/base/langflow/services/auth/service.py index 8beef8dcb..5c3a89af6 100644 --- a/src/backend/langflow/services/auth/service.py +++ b/src/backend/base/langflow/services/auth/service.py @@ -1,6 +1,7 @@ -from langflow.services.base import Service from typing import TYPE_CHECKING +from langflow.services.base import Service + if TYPE_CHECKING: from langflow.services.settings.service import SettingsService diff --git a/src/backend/langflow/services/auth/utils.py b/src/backend/base/langflow/services/auth/utils.py similarity index 100% rename from src/backend/langflow/services/auth/utils.py rename to src/backend/base/langflow/services/auth/utils.py diff --git a/src/backend/langflow/services/base.py b/src/backend/base/langflow/services/base.py similarity index 100% rename from src/backend/langflow/services/base.py rename to src/backend/base/langflow/services/base.py diff --git a/src/backend/langflow/services/cache/__init__.py b/src/backend/base/langflow/services/cache/__init__.py similarity index 56% rename from src/backend/langflow/services/cache/__init__.py rename to src/backend/base/langflow/services/cache/__init__.py index d6467f0bc..48fb9837a 100644 --- a/src/backend/langflow/services/cache/__init__.py +++ b/src/backend/base/langflow/services/cache/__init__.py @@ -1,9 +1,4 @@ -from langflow.services.cache.service import ( - AsyncInMemoryCache, - CacheService, - RedisCache, - ThreadingInMemoryCache, -) +from langflow.services.cache.service import AsyncInMemoryCache, CacheService, RedisCache, ThreadingInMemoryCache from . import factory, service diff --git a/src/backend/langflow/services/cache/base.py b/src/backend/base/langflow/services/cache/base.py similarity index 100% rename from src/backend/langflow/services/cache/base.py rename to src/backend/base/langflow/services/cache/base.py diff --git a/src/backend/langflow/services/cache/factory.py b/src/backend/base/langflow/services/cache/factory.py similarity index 100% rename from src/backend/langflow/services/cache/factory.py rename to src/backend/base/langflow/services/cache/factory.py diff --git a/src/backend/langflow/services/cache/service.py b/src/backend/base/langflow/services/cache/service.py similarity index 100% rename from src/backend/langflow/services/cache/service.py rename to src/backend/base/langflow/services/cache/service.py diff --git a/src/backend/langflow/services/cache/utils.py b/src/backend/base/langflow/services/cache/utils.py similarity index 100% rename from src/backend/langflow/services/cache/utils.py rename to src/backend/base/langflow/services/cache/utils.py diff --git a/src/backend/langflow/services/credentials/__init__.py b/src/backend/base/langflow/services/chat/__init__.py similarity index 100% rename from src/backend/langflow/services/credentials/__init__.py rename to src/backend/base/langflow/services/chat/__init__.py diff --git a/src/backend/langflow/services/chat/cache.py b/src/backend/base/langflow/services/chat/cache.py similarity index 99% rename from src/backend/langflow/services/chat/cache.py rename to src/backend/base/langflow/services/chat/cache.py index f6247b540..959ea877c 100644 --- a/src/backend/langflow/services/chat/cache.py +++ b/src/backend/base/langflow/services/chat/cache.py @@ -1,10 +1,11 @@ from contextlib import contextmanager from typing import Any, Awaitable, Callable, List, Optional -from langflow.services.base import Service import pandas as pd from PIL import Image +from langflow.services.base import Service + class Subject: """Base class for implementing the observer pattern.""" diff --git a/src/backend/langflow/services/chat/config.py b/src/backend/base/langflow/services/chat/config.py similarity index 100% rename from src/backend/langflow/services/chat/config.py rename to src/backend/base/langflow/services/chat/config.py diff --git a/src/backend/langflow/services/chat/factory.py b/src/backend/base/langflow/services/chat/factory.py similarity index 100% rename from src/backend/langflow/services/chat/factory.py rename to src/backend/base/langflow/services/chat/factory.py diff --git a/src/backend/langflow/services/chat/service.py b/src/backend/base/langflow/services/chat/service.py similarity index 100% rename from src/backend/langflow/services/chat/service.py rename to src/backend/base/langflow/services/chat/service.py diff --git a/src/backend/langflow/services/chat/utils.py b/src/backend/base/langflow/services/chat/utils.py similarity index 99% rename from src/backend/langflow/services/chat/utils.py rename to src/backend/base/langflow/services/chat/utils.py index 0562b9df2..271c0e85b 100644 --- a/src/backend/langflow/services/chat/utils.py +++ b/src/backend/base/langflow/services/chat/utils.py @@ -3,10 +3,11 @@ from typing import Any from langchain.agents import AgentExecutor from langchain.chains.base import Chain from langchain_core.runnables import Runnable +from loguru import logger + from langflow.api.v1.schemas import ChatMessage from langflow.interface.utils import try_setting_streaming_options from langflow.processing.base import get_result_and_steps -from loguru import logger LANGCHAIN_RUNNABLES = (Chain, Runnable, AgentExecutor) diff --git a/src/backend/langflow/services/database/__init__.py b/src/backend/base/langflow/services/credentials/__init__.py similarity index 100% rename from src/backend/langflow/services/database/__init__.py rename to src/backend/base/langflow/services/credentials/__init__.py diff --git a/src/backend/langflow/services/credentials/factory.py b/src/backend/base/langflow/services/credentials/factory.py similarity index 100% rename from src/backend/langflow/services/credentials/factory.py rename to src/backend/base/langflow/services/credentials/factory.py diff --git a/src/backend/langflow/services/credentials/service.py b/src/backend/base/langflow/services/credentials/service.py similarity index 99% rename from src/backend/langflow/services/credentials/service.py rename to src/backend/base/langflow/services/credentials/service.py index 08e04fdaa..74d650687 100644 --- a/src/backend/langflow/services/credentials/service.py +++ b/src/backend/base/langflow/services/credentials/service.py @@ -2,11 +2,12 @@ from typing import TYPE_CHECKING, Optional, Union from uuid import UUID from fastapi import Depends +from sqlmodel import Session, select + from langflow.services.auth import utils as auth_utils from langflow.services.base import Service from langflow.services.database.models.credential.model import Credential from langflow.services.deps import get_session -from sqlmodel import Session, select if TYPE_CHECKING: from langflow.services.settings.service import SettingsService diff --git a/src/backend/langflow/services/monitor/__init__.py b/src/backend/base/langflow/services/database/__init__.py similarity index 100% rename from src/backend/langflow/services/monitor/__init__.py rename to src/backend/base/langflow/services/database/__init__.py diff --git a/src/backend/langflow/services/database/factory.py b/src/backend/base/langflow/services/database/factory.py similarity index 99% rename from src/backend/langflow/services/database/factory.py rename to src/backend/base/langflow/services/database/factory.py index 57bf1668d..3b03da131 100644 --- a/src/backend/langflow/services/database/factory.py +++ b/src/backend/base/langflow/services/database/factory.py @@ -1,4 +1,6 @@ from typing import TYPE_CHECKING + + from langflow.services.database.service import DatabaseService from langflow.services.factory import ServiceFactory diff --git a/src/backend/langflow/services/database/models/__init__.py b/src/backend/base/langflow/services/database/models/__init__.py similarity index 100% rename from src/backend/langflow/services/database/models/__init__.py rename to src/backend/base/langflow/services/database/models/__init__.py diff --git a/src/backend/langflow/services/database/models/api_key/__init__.py b/src/backend/base/langflow/services/database/models/api_key/__init__.py similarity index 100% rename from src/backend/langflow/services/database/models/api_key/__init__.py rename to src/backend/base/langflow/services/database/models/api_key/__init__.py diff --git a/src/backend/langflow/services/database/models/api_key/crud.py b/src/backend/base/langflow/services/database/models/api_key/crud.py similarity index 100% rename from src/backend/langflow/services/database/models/api_key/crud.py rename to src/backend/base/langflow/services/database/models/api_key/crud.py diff --git a/src/backend/langflow/services/database/models/api_key/model.py b/src/backend/base/langflow/services/database/models/api_key/model.py similarity index 100% rename from src/backend/langflow/services/database/models/api_key/model.py rename to src/backend/base/langflow/services/database/models/api_key/model.py diff --git a/src/backend/langflow/services/database/models/base.py b/src/backend/base/langflow/services/database/models/base.py similarity index 100% rename from src/backend/langflow/services/database/models/base.py rename to src/backend/base/langflow/services/database/models/base.py diff --git a/src/backend/langflow/services/database/models/credential/__init__.py b/src/backend/base/langflow/services/database/models/credential/__init__.py similarity index 100% rename from src/backend/langflow/services/database/models/credential/__init__.py rename to src/backend/base/langflow/services/database/models/credential/__init__.py diff --git a/src/backend/langflow/services/database/models/credential/model.py b/src/backend/base/langflow/services/database/models/credential/model.py similarity index 100% rename from src/backend/langflow/services/database/models/credential/model.py rename to src/backend/base/langflow/services/database/models/credential/model.py diff --git a/src/backend/langflow/services/database/models/credential/schema.py b/src/backend/base/langflow/services/database/models/credential/schema.py similarity index 100% rename from src/backend/langflow/services/database/models/credential/schema.py rename to src/backend/base/langflow/services/database/models/credential/schema.py diff --git a/src/backend/langflow/services/database/models/flow/__init__.py b/src/backend/base/langflow/services/database/models/flow/__init__.py similarity index 100% rename from src/backend/langflow/services/database/models/flow/__init__.py rename to src/backend/base/langflow/services/database/models/flow/__init__.py diff --git a/src/backend/langflow/services/database/models/flow/model.py b/src/backend/base/langflow/services/database/models/flow/model.py similarity index 100% rename from src/backend/langflow/services/database/models/flow/model.py rename to src/backend/base/langflow/services/database/models/flow/model.py diff --git a/src/backend/langflow/services/database/models/user/__init__.py b/src/backend/base/langflow/services/database/models/user/__init__.py similarity index 100% rename from src/backend/langflow/services/database/models/user/__init__.py rename to src/backend/base/langflow/services/database/models/user/__init__.py diff --git a/src/backend/langflow/services/database/models/user/crud.py b/src/backend/base/langflow/services/database/models/user/crud.py similarity index 99% rename from src/backend/langflow/services/database/models/user/crud.py rename to src/backend/base/langflow/services/database/models/user/crud.py index e8f58735c..5a948815e 100644 --- a/src/backend/langflow/services/database/models/user/crud.py +++ b/src/backend/base/langflow/services/database/models/user/crud.py @@ -3,12 +3,13 @@ from typing import Optional, Union from uuid import UUID from fastapi import Depends, HTTPException, status -from langflow.services.database.models.user.model import User, UserUpdate -from langflow.services.deps import get_session from sqlalchemy.exc import IntegrityError from sqlalchemy.orm.attributes import flag_modified from sqlmodel import Session, select +from langflow.services.database.models.user.model import User, UserUpdate +from langflow.services.deps import get_session + def get_user_by_username(db: Session, username: str) -> Union[User, None]: return db.exec(select(User).where(User.username == username)).first() diff --git a/src/backend/langflow/services/database/models/user/model.py b/src/backend/base/langflow/services/database/models/user/model.py similarity index 100% rename from src/backend/langflow/services/database/models/user/model.py rename to src/backend/base/langflow/services/database/models/user/model.py diff --git a/src/backend/langflow/services/database/service.py b/src/backend/base/langflow/services/database/service.py similarity index 100% rename from src/backend/langflow/services/database/service.py rename to src/backend/base/langflow/services/database/service.py diff --git a/src/backend/langflow/services/database/utils.py b/src/backend/base/langflow/services/database/utils.py similarity index 100% rename from src/backend/langflow/services/database/utils.py rename to src/backend/base/langflow/services/database/utils.py diff --git a/src/backend/langflow/services/deps.py b/src/backend/base/langflow/services/deps.py similarity index 100% rename from src/backend/langflow/services/deps.py rename to src/backend/base/langflow/services/deps.py diff --git a/src/backend/langflow/services/factory.py b/src/backend/base/langflow/services/factory.py similarity index 100% rename from src/backend/langflow/services/factory.py rename to src/backend/base/langflow/services/factory.py diff --git a/src/backend/langflow/services/manager.py b/src/backend/base/langflow/services/manager.py similarity index 96% rename from src/backend/langflow/services/manager.py rename to src/backend/base/langflow/services/manager.py index 20186f7da..6902b4a89 100644 --- a/src/backend/langflow/services/manager.py +++ b/src/backend/base/langflow/services/manager.py @@ -106,9 +106,7 @@ def initialize_session_service(): Initialize the session manager. """ from langflow.services.cache import factory as cache_factory - from langflow.services.session import ( - factory as session_service_factory, - ) # type: ignore + from langflow.services.session import factory as session_service_factory # type: ignore initialize_settings_service() diff --git a/src/backend/langflow/services/plugins/__init__.py b/src/backend/base/langflow/services/monitor/__init__.py similarity index 100% rename from src/backend/langflow/services/plugins/__init__.py rename to src/backend/base/langflow/services/monitor/__init__.py diff --git a/src/backend/langflow/services/monitor/factory.py b/src/backend/base/langflow/services/monitor/factory.py similarity index 100% rename from src/backend/langflow/services/monitor/factory.py rename to src/backend/base/langflow/services/monitor/factory.py diff --git a/src/backend/langflow/services/monitor/schema.py b/src/backend/base/langflow/services/monitor/schema.py similarity index 100% rename from src/backend/langflow/services/monitor/schema.py rename to src/backend/base/langflow/services/monitor/schema.py diff --git a/src/backend/langflow/services/monitor/service.py b/src/backend/base/langflow/services/monitor/service.py similarity index 95% rename from src/backend/langflow/services/monitor/service.py rename to src/backend/base/langflow/services/monitor/service.py index 7a3f26517..ecf710eea 100644 --- a/src/backend/langflow/services/monitor/service.py +++ b/src/backend/base/langflow/services/monitor/service.py @@ -7,15 +7,8 @@ from loguru import logger from platformdirs import user_cache_dir from langflow.services.base import Service -from langflow.services.monitor.schema import ( - MessageModel, - TransactionModel, - VertexBuildModel, -) -from langflow.services.monitor.utils import ( - add_row_to_table, - drop_and_create_table_if_schema_mismatch, -) +from langflow.services.monitor.schema import MessageModel, TransactionModel, VertexBuildModel +from langflow.services.monitor.utils import add_row_to_table, drop_and_create_table_if_schema_mismatch if TYPE_CHECKING: from langflow.services.settings.manager import SettingsService diff --git a/src/backend/langflow/services/monitor/utils.py b/src/backend/base/langflow/services/monitor/utils.py similarity index 100% rename from src/backend/langflow/services/monitor/utils.py rename to src/backend/base/langflow/services/monitor/utils.py diff --git a/src/backend/langflow/services/session/__init__.py b/src/backend/base/langflow/services/plugins/__init__.py similarity index 100% rename from src/backend/langflow/services/session/__init__.py rename to src/backend/base/langflow/services/plugins/__init__.py diff --git a/src/backend/langflow/services/plugins/base.py b/src/backend/base/langflow/services/plugins/base.py similarity index 100% rename from src/backend/langflow/services/plugins/base.py rename to src/backend/base/langflow/services/plugins/base.py diff --git a/src/backend/langflow/services/plugins/factory.py b/src/backend/base/langflow/services/plugins/factory.py similarity index 100% rename from src/backend/langflow/services/plugins/factory.py rename to src/backend/base/langflow/services/plugins/factory.py diff --git a/src/backend/langflow/services/plugins/langfuse_plugin.py b/src/backend/base/langflow/services/plugins/langfuse_plugin.py similarity index 99% rename from src/backend/langflow/services/plugins/langfuse_plugin.py rename to src/backend/base/langflow/services/plugins/langfuse_plugin.py index e5d3afdd6..e6d37d3c5 100644 --- a/src/backend/langflow/services/plugins/langfuse_plugin.py +++ b/src/backend/base/langflow/services/plugins/langfuse_plugin.py @@ -1,8 +1,9 @@ from typing import Optional +from loguru import logger + from langflow.services.deps import get_settings_service from langflow.services.plugins.base import CallbackPlugin -from loguru import logger class LangfuseInstance: diff --git a/src/backend/langflow/services/plugins/service.py b/src/backend/base/langflow/services/plugins/service.py similarity index 99% rename from src/backend/langflow/services/plugins/service.py rename to src/backend/base/langflow/services/plugins/service.py index f7b2895ec..98f210fea 100644 --- a/src/backend/langflow/services/plugins/service.py +++ b/src/backend/base/langflow/services/plugins/service.py @@ -3,9 +3,10 @@ import inspect import os from typing import TYPE_CHECKING, Union +from loguru import logger + from langflow.services.base import Service from langflow.services.plugins.base import BasePlugin, CallbackPlugin -from loguru import logger if TYPE_CHECKING: from langflow.services.settings.service import SettingsService diff --git a/src/backend/langflow/services/schema.py b/src/backend/base/langflow/services/schema.py similarity index 100% rename from src/backend/langflow/services/schema.py rename to src/backend/base/langflow/services/schema.py diff --git a/src/backend/langflow/services/socket/__init__.py b/src/backend/base/langflow/services/session/__init__.py similarity index 100% rename from src/backend/langflow/services/socket/__init__.py rename to src/backend/base/langflow/services/session/__init__.py diff --git a/src/backend/langflow/services/session/factory.py b/src/backend/base/langflow/services/session/factory.py similarity index 100% rename from src/backend/langflow/services/session/factory.py rename to src/backend/base/langflow/services/session/factory.py diff --git a/src/backend/langflow/services/session/service.py b/src/backend/base/langflow/services/session/service.py similarity index 100% rename from src/backend/langflow/services/session/service.py rename to src/backend/base/langflow/services/session/service.py diff --git a/src/backend/langflow/services/session/utils.py b/src/backend/base/langflow/services/session/utils.py similarity index 100% rename from src/backend/langflow/services/session/utils.py rename to src/backend/base/langflow/services/session/utils.py diff --git a/src/backend/langflow/services/settings/__init__.py b/src/backend/base/langflow/services/settings/__init__.py similarity index 100% rename from src/backend/langflow/services/settings/__init__.py rename to src/backend/base/langflow/services/settings/__init__.py diff --git a/src/backend/langflow/services/settings/auth.py b/src/backend/base/langflow/services/settings/auth.py similarity index 100% rename from src/backend/langflow/services/settings/auth.py rename to src/backend/base/langflow/services/settings/auth.py diff --git a/src/backend/langflow/services/settings/base.py b/src/backend/base/langflow/services/settings/base.py similarity index 100% rename from src/backend/langflow/services/settings/base.py rename to src/backend/base/langflow/services/settings/base.py diff --git a/src/backend/langflow/services/settings/constants.py b/src/backend/base/langflow/services/settings/constants.py similarity index 100% rename from src/backend/langflow/services/settings/constants.py rename to src/backend/base/langflow/services/settings/constants.py diff --git a/src/backend/langflow/services/settings/factory.py b/src/backend/base/langflow/services/settings/factory.py similarity index 99% rename from src/backend/langflow/services/settings/factory.py rename to src/backend/base/langflow/services/settings/factory.py index 713f13f82..a94e0abbe 100644 --- a/src/backend/langflow/services/settings/factory.py +++ b/src/backend/base/langflow/services/settings/factory.py @@ -1,6 +1,7 @@ from pathlib import Path -from langflow.services.settings.service import SettingsService + from langflow.services.factory import ServiceFactory +from langflow.services.settings.service import SettingsService class SettingsServiceFactory(ServiceFactory): diff --git a/src/backend/langflow/services/settings/manager.py b/src/backend/base/langflow/services/settings/manager.py similarity index 100% rename from src/backend/langflow/services/settings/manager.py rename to src/backend/base/langflow/services/settings/manager.py diff --git a/src/backend/langflow/services/settings/service.py b/src/backend/base/langflow/services/settings/service.py similarity index 99% rename from src/backend/langflow/services/settings/service.py rename to src/backend/base/langflow/services/settings/service.py index 46d825bd1..a66888924 100644 --- a/src/backend/langflow/services/settings/service.py +++ b/src/backend/base/langflow/services/settings/service.py @@ -1,10 +1,11 @@ import os import yaml +from loguru import logger + from langflow.services.base import Service from langflow.services.settings.auth import AuthSettings from langflow.services.settings.base import Settings -from loguru import logger class SettingsService(Service): diff --git a/src/backend/langflow/services/settings/utils.py b/src/backend/base/langflow/services/settings/utils.py similarity index 100% rename from src/backend/langflow/services/settings/utils.py rename to src/backend/base/langflow/services/settings/utils.py diff --git a/src/backend/langflow/services/storage/__init__.py b/src/backend/base/langflow/services/socket/__init__.py similarity index 100% rename from src/backend/langflow/services/storage/__init__.py rename to src/backend/base/langflow/services/socket/__init__.py diff --git a/src/backend/langflow/services/socket/factory.py b/src/backend/base/langflow/services/socket/factory.py similarity index 100% rename from src/backend/langflow/services/socket/factory.py rename to src/backend/base/langflow/services/socket/factory.py diff --git a/src/backend/langflow/services/socket/service.py b/src/backend/base/langflow/services/socket/service.py similarity index 100% rename from src/backend/langflow/services/socket/service.py rename to src/backend/base/langflow/services/socket/service.py diff --git a/src/backend/langflow/services/socket/utils.py b/src/backend/base/langflow/services/socket/utils.py similarity index 100% rename from src/backend/langflow/services/socket/utils.py rename to src/backend/base/langflow/services/socket/utils.py diff --git a/src/backend/langflow/services/store/__init__.py b/src/backend/base/langflow/services/storage/__init__.py similarity index 100% rename from src/backend/langflow/services/store/__init__.py rename to src/backend/base/langflow/services/storage/__init__.py diff --git a/src/backend/langflow/services/storage/constants.py b/src/backend/base/langflow/services/storage/constants.py similarity index 100% rename from src/backend/langflow/services/storage/constants.py rename to src/backend/base/langflow/services/storage/constants.py diff --git a/src/backend/langflow/services/storage/factory.py b/src/backend/base/langflow/services/storage/factory.py similarity index 100% rename from src/backend/langflow/services/storage/factory.py rename to src/backend/base/langflow/services/storage/factory.py diff --git a/src/backend/langflow/services/storage/local.py b/src/backend/base/langflow/services/storage/local.py similarity index 100% rename from src/backend/langflow/services/storage/local.py rename to src/backend/base/langflow/services/storage/local.py diff --git a/src/backend/langflow/services/storage/s3.py b/src/backend/base/langflow/services/storage/s3.py similarity index 100% rename from src/backend/langflow/services/storage/s3.py rename to src/backend/base/langflow/services/storage/s3.py diff --git a/src/backend/langflow/services/storage/service.py b/src/backend/base/langflow/services/storage/service.py similarity index 100% rename from src/backend/langflow/services/storage/service.py rename to src/backend/base/langflow/services/storage/service.py diff --git a/src/backend/langflow/services/storage/utils.py b/src/backend/base/langflow/services/storage/utils.py similarity index 100% rename from src/backend/langflow/services/storage/utils.py rename to src/backend/base/langflow/services/storage/utils.py diff --git a/src/backend/langflow/services/task/__init__.py b/src/backend/base/langflow/services/store/__init__.py similarity index 100% rename from src/backend/langflow/services/task/__init__.py rename to src/backend/base/langflow/services/store/__init__.py diff --git a/src/backend/langflow/services/store/exceptions.py b/src/backend/base/langflow/services/store/exceptions.py similarity index 100% rename from src/backend/langflow/services/store/exceptions.py rename to src/backend/base/langflow/services/store/exceptions.py diff --git a/src/backend/langflow/services/store/factory.py b/src/backend/base/langflow/services/store/factory.py similarity index 99% rename from src/backend/langflow/services/store/factory.py rename to src/backend/base/langflow/services/store/factory.py index a25ad78c7..2bdc918bd 100644 --- a/src/backend/langflow/services/store/factory.py +++ b/src/backend/base/langflow/services/store/factory.py @@ -1,6 +1,7 @@ from typing import TYPE_CHECKING -from langflow.services.store.service import StoreService + from langflow.services.factory import ServiceFactory +from langflow.services.store.service import StoreService if TYPE_CHECKING: from langflow.services.settings.service import SettingsService diff --git a/src/backend/langflow/services/store/schema.py b/src/backend/base/langflow/services/store/schema.py similarity index 100% rename from src/backend/langflow/services/store/schema.py rename to src/backend/base/langflow/services/store/schema.py diff --git a/src/backend/langflow/services/store/service.py b/src/backend/base/langflow/services/store/service.py similarity index 100% rename from src/backend/langflow/services/store/service.py rename to src/backend/base/langflow/services/store/service.py diff --git a/src/backend/langflow/services/store/utils.py b/src/backend/base/langflow/services/store/utils.py similarity index 100% rename from src/backend/langflow/services/store/utils.py rename to src/backend/base/langflow/services/store/utils.py diff --git a/src/backend/langflow/services/task/backends/__init__.py b/src/backend/base/langflow/services/task/__init__.py similarity index 100% rename from src/backend/langflow/services/task/backends/__init__.py rename to src/backend/base/langflow/services/task/__init__.py diff --git a/src/backend/langflow/template/__init__.py b/src/backend/base/langflow/services/task/backends/__init__.py similarity index 100% rename from src/backend/langflow/template/__init__.py rename to src/backend/base/langflow/services/task/backends/__init__.py diff --git a/src/backend/langflow/services/task/backends/anyio.py b/src/backend/base/langflow/services/task/backends/anyio.py similarity index 100% rename from src/backend/langflow/services/task/backends/anyio.py rename to src/backend/base/langflow/services/task/backends/anyio.py diff --git a/src/backend/langflow/services/task/backends/base.py b/src/backend/base/langflow/services/task/backends/base.py similarity index 100% rename from src/backend/langflow/services/task/backends/base.py rename to src/backend/base/langflow/services/task/backends/base.py diff --git a/src/backend/langflow/services/task/backends/celery.py b/src/backend/base/langflow/services/task/backends/celery.py similarity index 99% rename from src/backend/langflow/services/task/backends/celery.py rename to src/backend/base/langflow/services/task/backends/celery.py index f23374549..cfb17ae3b 100644 --- a/src/backend/langflow/services/task/backends/celery.py +++ b/src/backend/base/langflow/services/task/backends/celery.py @@ -1,5 +1,8 @@ from typing import Any, Callable + from celery.result import AsyncResult # type: ignore + + from langflow.services.task.backends.base import TaskBackend from langflow.worker import celery_app diff --git a/src/backend/langflow/services/task/factory.py b/src/backend/base/langflow/services/task/factory.py similarity index 100% rename from src/backend/langflow/services/task/factory.py rename to src/backend/base/langflow/services/task/factory.py index e87eecc94..937f390ae 100644 --- a/src/backend/langflow/services/task/factory.py +++ b/src/backend/base/langflow/services/task/factory.py @@ -1,5 +1,5 @@ -from langflow.services.task.service import TaskService from langflow.services.factory import ServiceFactory +from langflow.services.task.service import TaskService class TaskServiceFactory(ServiceFactory): diff --git a/src/backend/langflow/services/task/service.py b/src/backend/base/langflow/services/task/service.py similarity index 100% rename from src/backend/langflow/services/task/service.py rename to src/backend/base/langflow/services/task/service.py diff --git a/src/backend/langflow/services/task/utils.py b/src/backend/base/langflow/services/task/utils.py similarity index 100% rename from src/backend/langflow/services/task/utils.py rename to src/backend/base/langflow/services/task/utils.py diff --git a/src/backend/langflow/services/utils.py b/src/backend/base/langflow/services/utils.py similarity index 100% rename from src/backend/langflow/services/utils.py rename to src/backend/base/langflow/services/utils.py diff --git a/src/backend/langflow/settings.py b/src/backend/base/langflow/settings.py similarity index 100% rename from src/backend/langflow/settings.py rename to src/backend/base/langflow/settings.py diff --git a/src/backend/langflow/template/field/__init__.py b/src/backend/base/langflow/template/__init__.py similarity index 100% rename from src/backend/langflow/template/field/__init__.py rename to src/backend/base/langflow/template/__init__.py diff --git a/src/backend/langflow/template/frontend_node/formatter/__init__.py b/src/backend/base/langflow/template/field/__init__.py similarity index 100% rename from src/backend/langflow/template/frontend_node/formatter/__init__.py rename to src/backend/base/langflow/template/field/__init__.py diff --git a/src/backend/langflow/template/field/base.py b/src/backend/base/langflow/template/field/base.py similarity index 97% rename from src/backend/langflow/template/field/base.py rename to src/backend/base/langflow/template/field/base.py index 4cedf19f3..28d960298 100644 --- a/src/backend/langflow/template/field/base.py +++ b/src/backend/base/langflow/template/field/base.py @@ -1,13 +1,6 @@ from typing import Any, Callable, Optional, Union -from pydantic import ( - BaseModel, - ConfigDict, - Field, - field_serializer, - field_validator, - model_serializer, -) +from pydantic import BaseModel, ConfigDict, Field, field_serializer, field_validator, model_serializer from langflow.field_typing.range_spec import RangeSpec diff --git a/src/backend/langflow/template/field/prompt.py b/src/backend/base/langflow/template/field/prompt.py similarity index 100% rename from src/backend/langflow/template/field/prompt.py rename to src/backend/base/langflow/template/field/prompt.py diff --git a/src/backend/langflow/template/frontend_node/__init__.py b/src/backend/base/langflow/template/frontend_node/__init__.py similarity index 100% rename from src/backend/langflow/template/frontend_node/__init__.py rename to src/backend/base/langflow/template/frontend_node/__init__.py index e13aa1ded..00c276696 100644 --- a/src/backend/langflow/template/frontend_node/__init__.py +++ b/src/backend/base/langflow/template/frontend_node/__init__.py @@ -1,15 +1,15 @@ from langflow.template.frontend_node import ( agents, chains, + custom_components, + documentloaders, embeddings, llms, memories, prompts, + textsplitters, tools, vectorstores, - documentloaders, - textsplitters, - custom_components, ) __all__ = [ diff --git a/src/backend/langflow/template/frontend_node/agents.py b/src/backend/base/langflow/template/frontend_node/agents.py similarity index 99% rename from src/backend/langflow/template/frontend_node/agents.py rename to src/backend/base/langflow/template/frontend_node/agents.py index 361abf531..0993c1736 100644 --- a/src/backend/langflow/template/frontend_node/agents.py +++ b/src/backend/base/langflow/template/frontend_node/agents.py @@ -1,6 +1,8 @@ from typing import Optional from langchain.agents import types + + from langflow.template.field.base import TemplateField from langflow.template.frontend_node.base import FrontendNode from langflow.template.template.base import Template diff --git a/src/backend/langflow/template/frontend_node/base.py b/src/backend/base/langflow/template/frontend_node/base.py similarity index 100% rename from src/backend/langflow/template/frontend_node/base.py rename to src/backend/base/langflow/template/frontend_node/base.py diff --git a/src/backend/langflow/template/frontend_node/chains.py b/src/backend/base/langflow/template/frontend_node/chains.py similarity index 100% rename from src/backend/langflow/template/frontend_node/chains.py rename to src/backend/base/langflow/template/frontend_node/chains.py diff --git a/src/backend/langflow/template/frontend_node/constants.py b/src/backend/base/langflow/template/frontend_node/constants.py similarity index 100% rename from src/backend/langflow/template/frontend_node/constants.py rename to src/backend/base/langflow/template/frontend_node/constants.py diff --git a/src/backend/langflow/template/frontend_node/custom_components.py b/src/backend/base/langflow/template/frontend_node/custom_components.py similarity index 93% rename from src/backend/langflow/template/frontend_node/custom_components.py rename to src/backend/base/langflow/template/frontend_node/custom_components.py index 40acae5ea..456aa7466 100644 --- a/src/backend/langflow/template/frontend_node/custom_components.py +++ b/src/backend/base/langflow/template/frontend_node/custom_components.py @@ -4,7 +4,8 @@ from langflow.template.field.base import TemplateField from langflow.template.frontend_node.base import FrontendNode from langflow.template.template.base import Template -DEFAULT_CUSTOM_COMPONENT_CODE = """from langflow import CustomComponent +DEFAULT_CUSTOM_COMPONENT_CODE = """from langflow.interface.custom.custom_component import CustomComponent + from typing import Optional, List, Dict, Union from langflow.field_typing import ( AgentExecutor, diff --git a/src/backend/langflow/template/frontend_node/documentloaders.py b/src/backend/base/langflow/template/frontend_node/documentloaders.py similarity index 100% rename from src/backend/langflow/template/frontend_node/documentloaders.py rename to src/backend/base/langflow/template/frontend_node/documentloaders.py diff --git a/src/backend/langflow/template/frontend_node/embeddings.py b/src/backend/base/langflow/template/frontend_node/embeddings.py similarity index 100% rename from src/backend/langflow/template/frontend_node/embeddings.py rename to src/backend/base/langflow/template/frontend_node/embeddings.py diff --git a/src/backend/langflow/template/template/__init__.py b/src/backend/base/langflow/template/frontend_node/formatter/__init__.py similarity index 100% rename from src/backend/langflow/template/template/__init__.py rename to src/backend/base/langflow/template/frontend_node/formatter/__init__.py diff --git a/src/backend/langflow/template/frontend_node/formatter/base.py b/src/backend/base/langflow/template/frontend_node/formatter/base.py similarity index 99% rename from src/backend/langflow/template/frontend_node/formatter/base.py rename to src/backend/base/langflow/template/frontend_node/formatter/base.py index f582bc298..20ba64eae 100644 --- a/src/backend/langflow/template/frontend_node/formatter/base.py +++ b/src/backend/base/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 from pydantic import BaseModel +from langflow.template.field.base import TemplateField + class FieldFormatter(BaseModel, ABC): @abstractmethod diff --git a/src/backend/langflow/template/frontend_node/formatter/field_formatters.py b/src/backend/base/langflow/template/frontend_node/formatter/field_formatters.py similarity index 100% rename from src/backend/langflow/template/frontend_node/formatter/field_formatters.py rename to src/backend/base/langflow/template/frontend_node/formatter/field_formatters.py diff --git a/src/backend/langflow/template/frontend_node/llms.py b/src/backend/base/langflow/template/frontend_node/llms.py similarity index 100% rename from src/backend/langflow/template/frontend_node/llms.py rename to src/backend/base/langflow/template/frontend_node/llms.py diff --git a/src/backend/langflow/template/frontend_node/memories.py b/src/backend/base/langflow/template/frontend_node/memories.py similarity index 97% rename from src/backend/langflow/template/frontend_node/memories.py rename to src/backend/base/langflow/template/frontend_node/memories.py index 93ea561dd..1cdc8febb 100644 --- a/src/backend/langflow/template/frontend_node/memories.py +++ b/src/backend/base/langflow/template/frontend_node/memories.py @@ -1,12 +1,7 @@ from typing import Optional -from langchain_community.chat_message_histories.mongodb import ( - DEFAULT_COLLECTION_NAME, - DEFAULT_DBNAME, -) -from langchain_community.chat_message_histories.postgres import ( - DEFAULT_CONNECTION_STRING, -) +from langchain_community.chat_message_histories.mongodb import DEFAULT_COLLECTION_NAME, DEFAULT_DBNAME +from langchain_community.chat_message_histories.postgres import DEFAULT_CONNECTION_STRING from langflow.template.field.base import TemplateField from langflow.template.frontend_node.base import FrontendNode diff --git a/src/backend/langflow/template/frontend_node/output_parsers.py b/src/backend/base/langflow/template/frontend_node/output_parsers.py similarity index 99% rename from src/backend/langflow/template/frontend_node/output_parsers.py rename to src/backend/base/langflow/template/frontend_node/output_parsers.py index e9b4d3706..6b33ee680 100644 --- a/src/backend/langflow/template/frontend_node/output_parsers.py +++ b/src/backend/base/langflow/template/frontend_node/output_parsers.py @@ -1,4 +1,6 @@ from typing import Optional + + from langflow.template.field.base import TemplateField from langflow.template.frontend_node.base import FrontendNode diff --git a/src/backend/langflow/template/frontend_node/prompts.py b/src/backend/base/langflow/template/frontend_node/prompts.py similarity index 100% rename from src/backend/langflow/template/frontend_node/prompts.py rename to src/backend/base/langflow/template/frontend_node/prompts.py diff --git a/src/backend/langflow/template/frontend_node/retrievers.py b/src/backend/base/langflow/template/frontend_node/retrievers.py similarity index 100% rename from src/backend/langflow/template/frontend_node/retrievers.py rename to src/backend/base/langflow/template/frontend_node/retrievers.py diff --git a/src/backend/langflow/template/frontend_node/textsplitters.py b/src/backend/base/langflow/template/frontend_node/textsplitters.py similarity index 99% rename from src/backend/langflow/template/frontend_node/textsplitters.py rename to src/backend/base/langflow/template/frontend_node/textsplitters.py index e6d5bdc60..eb302e996 100644 --- a/src/backend/langflow/template/frontend_node/textsplitters.py +++ b/src/backend/base/langflow/template/frontend_node/textsplitters.py @@ -1,6 +1,7 @@ +from langchain.text_splitter import Language + from langflow.template.field.base import TemplateField from langflow.template.frontend_node.base import FrontendNode -from langchain.text_splitter import Language class TextSplittersFrontendNode(FrontendNode): diff --git a/src/backend/langflow/template/frontend_node/tools.py b/src/backend/base/langflow/template/frontend_node/tools.py similarity index 100% rename from src/backend/langflow/template/frontend_node/tools.py rename to src/backend/base/langflow/template/frontend_node/tools.py diff --git a/src/backend/langflow/template/frontend_node/utilities.py b/src/backend/base/langflow/template/frontend_node/utilities.py similarity index 100% rename from src/backend/langflow/template/frontend_node/utilities.py rename to src/backend/base/langflow/template/frontend_node/utilities.py index a5adb219d..51849189c 100644 --- a/src/backend/langflow/template/frontend_node/utilities.py +++ b/src/backend/base/langflow/template/frontend_node/utilities.py @@ -1,7 +1,7 @@ import ast from typing import Optional -from langflow.services.database.models.base import orjson_dumps +from langflow.services.database.models.base import orjson_dumps from langflow.template.field.base import TemplateField from langflow.template.frontend_node.base import FrontendNode diff --git a/src/backend/langflow/template/frontend_node/vectorstores.py b/src/backend/base/langflow/template/frontend_node/vectorstores.py similarity index 100% rename from src/backend/langflow/template/frontend_node/vectorstores.py rename to src/backend/base/langflow/template/frontend_node/vectorstores.py diff --git a/src/backend/langflow/utils/__init__.py b/src/backend/base/langflow/template/template/__init__.py similarity index 100% rename from src/backend/langflow/utils/__init__.py rename to src/backend/base/langflow/template/template/__init__.py diff --git a/src/backend/langflow/template/template/base.py b/src/backend/base/langflow/template/template/base.py similarity index 100% rename from src/backend/langflow/template/template/base.py rename to src/backend/base/langflow/template/template/base.py diff --git a/src/backend/base/langflow/utils/__init__.py b/src/backend/base/langflow/utils/__init__.py new file mode 100644 index 000000000..e69de29bb diff --git a/src/backend/langflow/utils/constants.py b/src/backend/base/langflow/utils/constants.py similarity index 100% rename from src/backend/langflow/utils/constants.py rename to src/backend/base/langflow/utils/constants.py diff --git a/src/backend/langflow/utils/lazy_load.py b/src/backend/base/langflow/utils/lazy_load.py similarity index 100% rename from src/backend/langflow/utils/lazy_load.py rename to src/backend/base/langflow/utils/lazy_load.py diff --git a/src/backend/langflow/utils/logger.py b/src/backend/base/langflow/utils/logger.py similarity index 100% rename from src/backend/langflow/utils/logger.py rename to src/backend/base/langflow/utils/logger.py diff --git a/src/backend/langflow/utils/payload.py b/src/backend/base/langflow/utils/payload.py similarity index 100% rename from src/backend/langflow/utils/payload.py rename to src/backend/base/langflow/utils/payload.py diff --git a/src/backend/langflow/utils/schemas.py b/src/backend/base/langflow/utils/schemas.py similarity index 100% rename from src/backend/langflow/utils/schemas.py rename to src/backend/base/langflow/utils/schemas.py diff --git a/src/backend/langflow/utils/util.py b/src/backend/base/langflow/utils/util.py similarity index 100% rename from src/backend/langflow/utils/util.py rename to src/backend/base/langflow/utils/util.py diff --git a/src/backend/langflow/utils/validate.py b/src/backend/base/langflow/utils/validate.py similarity index 100% rename from src/backend/langflow/utils/validate.py rename to src/backend/base/langflow/utils/validate.py diff --git a/src/backend/langflow/__init__.py b/src/backend/base/langflow/version.py similarity index 50% rename from src/backend/langflow/__init__.py rename to src/backend/base/langflow/version.py index 2b6dd4fb8..c8bb365ca 100644 --- a/src/backend/langflow/__init__.py +++ b/src/backend/base/langflow/version.py @@ -1,16 +1,8 @@ from importlib import metadata -from langflow.interface.custom.custom_component import CustomComponent - -# Deactivate cache manager for now -# from langflow.services.cache import cache_service -from langflow.processing.load import load_flow_from_json - try: __version__ = metadata.version(__package__) except metadata.PackageNotFoundError: # Case where package metadata is not available. __version__ = "" del metadata # optional, avoids polluting the results of dir(__package__) - -__all__ = ["load_flow_from_json", "CustomComponent"] diff --git a/src/backend/langflow/worker.py b/src/backend/base/langflow/worker.py similarity index 100% rename from src/backend/langflow/worker.py rename to src/backend/base/langflow/worker.py diff --git a/src/backend/base/pyproject.toml b/src/backend/base/pyproject.toml new file mode 100644 index 000000000..d69d3611a --- /dev/null +++ b/src/backend/base/pyproject.toml @@ -0,0 +1,102 @@ +[tool.poetry] +name = "langflow-base" +version = "0.0.11" +description = "A Python package with a built-in web application" +authors = ["Logspace "] +maintainers = [ + "Carlos Coelho ", + "Cristhian Zanforlin ", + "Gabriel Almeida ", + "Gustavo Schaedler ", + "Igor Carvalho ", + "Lucas Eduoli ", + "Otávio Anovazzi ", + "Rodrigo Nader ", +] +repository = "https://github.com/logspace-ai/langflow" +license = "MIT" +readme = "README.md" +keywords = ["nlp", "langchain", "openai", "gpt", "gui"] +packages = [{ include = "langflow" }] +include = ["pyproject.toml", "README.md", "langflow/**/*"] +documentation = "https://docs.langflow.org" + +[tool.poetry.scripts] +langflow-base = "langflow.__main__:main" + +[tool.poetry.dependencies] +python = ">=3.9,<3.12" + +fastapi = "^0.109.0" +httpx = "^0.24.0" +uvicorn = "^0.27.0" +gunicorn = "^21.2.0" +langchain = "~0.1.0" +sqlmodel = "^0.0.14" +loguru = "^0.7.1" +rich = "^13.7.0" +langchain-experimental = "*" +pydantic = "^2.5.0" +pydantic-settings = "^2.1.0" +websockets = "^10.3" +typer = "^0.9.0" +cachetools = "^5.3.1" +platformdirs = "^4.2.0" +python-multipart = "^0.0.7" +orjson = "3.9.15" +alembic = "^1.13.0" +passlib = "^1.7.4" +bcrypt = "4.0.1" +pillow = "^10.2.0" +docstring-parser = "^0.15" +python-jose = "^3.3.0" +pandas = "2.2.0" +multiprocess = "^0.70.14" + +[tool.poetry.group.dev.dependencies] +pytest-asyncio = "^0.21.1" +types-redis = "^4.6.0.5" +ipykernel = "^6.26.0" +mypy = "^1.7.1" +ruff = "^0.1.5" +httpx = "*" +pytest = "^7.4.2" +types-requests = "^2.31.0" +requests = "^2.31.0" +pytest-cov = "^4.1.0" +pandas-stubs = "^2.0.0.230412" +types-pillow = "^9.5.0.2" +types-pyyaml = "^6.0.12.8" +types-python-jose = "^3.3.4.8" +types-passlib = "^1.7.7.13" +locust = "^2.16.1" +pytest-mock = "^3.11.1" +pytest-xdist = "^3.3.1" +types-pywin32 = "^306.0.0.4" +types-google-cloud-ndb = "^2.2.0.0" +pytest-sugar = "^0.9.7" + + +[tool.poetry.extras] +deploy = ["langchain-serve", "celery", "redis", "flower"] +local = ["llama-cpp-python", "sentence-transformers", "ctransformers"] +all = ["deploy", "local"] + + +[tool.pytest.ini_options] +minversion = "6.0" +addopts = "-ra" +testpaths = ["tests", "integration"] +console_output_style = "progress" +filterwarnings = ["ignore::DeprecationWarning"] +log_cli = true +markers = ["async_test"] + + +[tool.ruff] +exclude = ["src/backend/langflow/alembic/*"] +line-length = 120 + +[build-system] +requires = ["poetry-core"] +build-backend = "poetry.core.masonry.api" diff --git a/src/backend/langflow/__main__.py b/src/backend/langflow/__main__.py index bc430e941..57dbc27f7 100644 --- a/src/backend/langflow/__main__.py +++ b/src/backend/langflow/__main__.py @@ -1,381 +1,4 @@ -import platform -import socket -import sys -from pathlib import Path -from typing import Optional - -import typer -from dotenv import load_dotenv -from multiprocess import cpu_count # type: ignore -from rich import box -from rich import print as rprint -from rich.console import Console -from rich.panel import Panel -from rich.table import Table -from sqlmodel import select - -from langflow.main import setup_app -from langflow.services.database.utils import session_getter -from langflow.services.deps import get_db_service, get_settings_service -from langflow.services.utils import initialize_services, initialize_settings_service -from langflow.utils.logger import configure, logger - -console = Console() - -app = typer.Typer(no_args_is_help=True) - - -def get_number_of_workers(workers=None): - if workers == -1 or workers is None: - workers = (cpu_count() * 2) + 1 - logger.debug(f"Number of workers: {workers}") - return workers - - -def display_results(results): - """ - Display the results of the migration. - """ - for table_results in results: - table = Table(title=f"Migration {table_results.table_name}") - table.add_column("Name") - table.add_column("Type") - table.add_column("Status") - - for result in table_results.results: - status = "Success" if result.success else "Failure" - color = "green" if result.success else "red" - table.add_row(result.name, result.type, f"[{color}]{status}[/{color}]") - - console.print(table) - console.print() # Print a new line - - -def set_var_for_macos_issue(): - # OBJC_DISABLE_INITIALIZE_FORK_SAFETY=YES - # we need to set this var is we are running on MacOS - # otherwise we get an error when running gunicorn - - if platform.system() in ["Darwin"]: - import os - - os.environ["OBJC_DISABLE_INITIALIZE_FORK_SAFETY"] = "YES" - # https://stackoverflow.com/questions/75747888/uwsgi-segmentation-fault-with-flask-python-app-behind-nginx-after-running-for-2 # noqa - os.environ["no_proxy"] = "*" # to avoid error with gunicorn - logger.debug("Set OBJC_DISABLE_INITIALIZE_FORK_SAFETY to YES to avoid error") - - -def update_settings( - config: str, - cache: Optional[str] = None, - dev: bool = False, - remove_api_keys: bool = False, - components_path: Optional[Path] = None, - store: bool = False, -): - """Update the settings from a config file.""" - - # Check for database_url in the environment variables - initialize_settings_service() - settings_service = get_settings_service() - if config: - logger.debug(f"Loading settings from {config}") - settings_service.settings.update_from_yaml(config, dev=dev) - if remove_api_keys: - logger.debug(f"Setting remove_api_keys to {remove_api_keys}") - settings_service.settings.update_settings(REMOVE_API_KEYS=remove_api_keys) - if cache: - logger.debug(f"Setting cache to {cache}") - settings_service.settings.update_settings(CACHE=cache) - if components_path: - logger.debug(f"Adding component path {components_path}") - settings_service.settings.update_settings(COMPONENTS_PATH=components_path) - if not store: - logger.debug("Setting store to False") - settings_service.settings.update_settings(STORE=False) - - -def version_callback(value: bool): - """ - Show the version and exit. - """ - from langflow import __version__ - - if value: - typer.echo(f"Langflow Version: {__version__}") - raise typer.Exit() - - -@app.callback() -def main_entry_point( - version: bool = typer.Option( - None, - "--version", - callback=version_callback, - is_eager=True, - help="Show the version and exit.", - ), -): - """ - Main entry point for the Langflow CLI. - """ - pass - - -@app.command() -def run( - host: str = typer.Option("127.0.0.1", help="Host to bind the server to.", envvar="LANGFLOW_HOST"), - workers: int = typer.Option(1, help="Number of worker processes.", envvar="LANGFLOW_WORKERS"), - timeout: int = typer.Option(300, help="Worker timeout in seconds."), - port: int = typer.Option(7860, help="Port to listen on.", envvar="LANGFLOW_PORT"), - components_path: Optional[Path] = typer.Option( - Path(__file__).parent / "components", - help="Path to the directory containing custom components.", - envvar="LANGFLOW_COMPONENTS_PATH", - ), - config: str = typer.Option(Path(__file__).parent / "config.yaml", help="Path to the configuration file."), - # .env file param - env_file: Path = typer.Option(None, help="Path to the .env file containing environment variables."), - log_level: str = typer.Option("critical", help="Logging level.", envvar="LANGFLOW_LOG_LEVEL"), - log_file: Path = typer.Option("logs/langflow.log", help="Path to the log file.", envvar="LANGFLOW_LOG_FILE"), - cache: Optional[str] = typer.Option( - envvar="LANGFLOW_LANGCHAIN_CACHE", - help="Type of cache to use. (InMemoryCache, SQLiteCache)", - default=None, - ), - dev: bool = typer.Option(False, help="Run in development mode (may contain bugs)"), - path: str = typer.Option( - None, - help="Path to the frontend directory containing build files. This is for development purposes only.", - envvar="LANGFLOW_FRONTEND_PATH", - ), - open_browser: bool = typer.Option( - True, - help="Open the browser after starting the server.", - envvar="LANGFLOW_OPEN_BROWSER", - ), - remove_api_keys: bool = typer.Option( - False, - help="Remove API keys from the projects saved in the database.", - envvar="LANGFLOW_REMOVE_API_KEYS", - ), - backend_only: bool = typer.Option( - False, - help="Run only the backend server without the frontend.", - envvar="LANGFLOW_BACKEND_ONLY", - ), - store: bool = typer.Option( - True, - help="Enables the store features.", - envvar="LANGFLOW_STORE", - ), -): - """ - Run the Langflow. - """ - - set_var_for_macos_issue() - # override env variables with .env file - - if env_file: - load_dotenv(env_file, override=True) - - configure(log_level=log_level, log_file=log_file) - update_settings( - config, - dev=dev, - remove_api_keys=remove_api_keys, - cache=cache, - components_path=components_path, - store=store, - ) - # 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, backend_only=backend_only) - # check if port is being used - if is_port_in_use(port, host): - port = get_free_port(port) - - options = { - "bind": f"{host}:{port}", - "workers": get_number_of_workers(workers), - "timeout": timeout, - } - - # Define an env variable to know if we are just testing the server - if "pytest" in sys.modules: - return - - if platform.system() in ["Windows"]: - # Run using uvicorn on MacOS and Windows - # Windows doesn't support gunicorn - # MacOS requires an env variable to be set to use gunicorn - run_on_windows(host, port, log_level, options, app) - else: - # Run using gunicorn on Linux - run_on_mac_or_linux(host, port, log_level, options, app) - - -def run_on_mac_or_linux(host, port, log_level, options, app): - print_banner(host, port) - run_langflow(host, port, log_level, options, app) - - -def run_on_windows(host, port, log_level, options, app): - """ - Run the Langflow server on Windows. - """ - print_banner(host, port) - run_langflow(host, port, log_level, options, app) - - -def is_port_in_use(port, host="localhost"): - """ - Check if a port is in use. - - Args: - port (int): The port number to check. - host (str): The host to check the port on. Defaults to 'localhost'. - - Returns: - bool: True if the port is in use, False otherwise. - """ - with socket.socket(socket.AF_INET, socket.SOCK_STREAM) as s: - return s.connect_ex((host, port)) == 0 - - -def get_free_port(port): - """ - Given a used port, find a free port. - - Args: - port (int): The port number to check. - - Returns: - int: A free port number. - """ - while is_port_in_use(port): - port += 1 - return port - - -def print_banner(host, port): - # console = Console() - - word = "Langflow" - colors = ["#3300cc"] - - styled_word = "" - - for i, char in enumerate(word): - color = colors[i % len(colors)] - styled_word += f"[{color}]{char}[/]" - - # Title with emojis and gradient text - title = ( - f"[bold]Welcome to :chains: {styled_word} [/bold]\n\n" - f"Access [link=http://{host}:{port}]http://{host}:{port}[/link]" - ) - info_text = ( - "Collaborate, and contribute at our " - "[bold][link=https://github.com/logspace-ai/langflow]GitHub Repo[/link][/bold] :rocket:" - ) - - # Create a panel with the title and the info text, and a border around it - panel = Panel(f"{title}\n{info_text}", box=box.ROUNDED, border_style="blue", expand=False) - - # Print the banner with a separator line before and after - rprint(panel) - - -def run_langflow(host, port, log_level, options, app): - """ - Run Langflow server on localhost - """ - try: - if platform.system() in ["Windows", "Darwin"]: - # Run using uvicorn on MacOS and Windows - # Windows doesn't support gunicorn - # MacOS requires an env variable to be set to use gunicorn - - import uvicorn - - uvicorn.run( - app, - host=host, - port=port, - log_level=log_level, - ) - else: - from langflow.server import LangflowApplication - - LangflowApplication(app, options).run() - except KeyboardInterrupt: - logger.info("Shutting down server") - sys.exit(0) - except Exception as e: - logger.exception(e) - sys.exit(1) - - -@app.command() -def superuser( - username: str = typer.Option(..., prompt=True, help="Username for the superuser."), - password: str = typer.Option(..., prompt=True, hide_input=True, help="Password for the superuser."), - log_level: str = typer.Option("critical", help="Logging level.", envvar="LANGFLOW_LOG_LEVEL"), -): - """ - Create a superuser. - """ - configure(log_level=log_level) - initialize_services() - db_service = get_db_service() - with session_getter(db_service) as session: - from langflow.services.auth.utils import create_super_user - - if create_super_user(db=session, username=username, password=password): - # Verify that the superuser was created - from langflow.services.database.models.user.model import User - - user: User = session.exec(select(User).where(User.username == username)).first() - if user is None or not user.is_superuser: - typer.echo("Superuser creation failed.") - return - - typer.echo("Superuser created successfully.") - - else: - typer.echo("Superuser creation failed.") - - -@app.command() -def migration( - test: bool = typer.Option(True, help="Run migrations in test mode."), - fix: bool = typer.Option( - False, - help="Fix migrations. This is a destructive operation, and should only be used if you know what you are doing.", - ), -): - """ - Run or test migrations. - """ - if fix: - if not typer.confirm( - "This will delete all data necessary to fix migrations. Are you sure you want to continue?" - ): - raise typer.Abort() - - initialize_services(fix_migration=fix) - db_service = get_db_service() - if not test: - db_service.run_migrations() - results = db_service.run_migrations_test() - display_results(results) - - -def main(): - app() - +from langflow.__main__ import main if __name__ == "__main__": main() diff --git a/src/backend/langflow/components/experimental/Schema.py b/src/backend/langflow/components/experimental/Schema.py new file mode 100644 index 000000000..72cbec23e --- /dev/null +++ b/src/backend/langflow/components/experimental/Schema.py @@ -0,0 +1,25 @@ +from langflow.custom import CustomComponent + + +class SchemaComponent(CustomComponent): + display_name = "Schema" + description = "Construct a Schema from a list of fields." + + def build_config(self): + return { + "fields": { + "display_name": "Fields", + "info": "The fields to include in the schema.", + }, + "name": { + "display_name": "Name", + "info": "The name of the schema.", + }, + } + + def build(self, name: str, fields: list[dict]): + # The idea for this component is to use create_model from pydantic to create a schema + # from a list of fields. This will be useful for creating schemas for the flow tool. + pass + + # field is a simple list of dictionaries with the field name and diff --git a/src/frontend/src/utils/utils.ts b/src/frontend/src/utils/utils.ts index 8732ed3d1..28d28fa90 100644 --- a/src/frontend/src/utils/utils.ts +++ b/src/frontend/src/utils/utils.ts @@ -429,7 +429,7 @@ export function getPythonCode( const flowName = flow.name; const tweaks = buildTweaks(flow); const inputs = buildInputs(); - return `from langflow import load_flow_from_json + return `from langflow.load import load_flow_from_json TWEAKS = ${ tweak && tweak.length > 0 ? buildTweakObject(tweak) diff --git a/src/frontend/tests/custom_component_full.ts b/src/frontend/tests/custom_component_full.ts index c38d7ff06..d5a890a1b 100644 --- a/src/frontend/tests/custom_component_full.ts +++ b/src/frontend/tests/custom_component_full.ts @@ -1,4 +1,4 @@ -export const custom = `from langflow import CustomComponent +export const custom = `from langflow.custom import CustomComponent from langchain.llms.base import BaseLLM from langchain.chains import LLMChain diff --git a/src/frontend/tests/end-to-end/assets/collection.json b/src/frontend/tests/end-to-end/assets/collection.json index 3872089d0..7b58fdadf 100644 --- a/src/frontend/tests/end-to-end/assets/collection.json +++ b/src/frontend/tests/end-to-end/assets/collection.json @@ -10,7 +10,10 @@ "height": 631, "id": "ChatOpenAI-Hz56M", "type": "genericNode", - "position": { "x": 543.1816229116944, "y": 942.891611351432 }, + "position": { + "x": 543.1816229116944, + "y": 942.891611351432 + }, "data": { "type": "ChatOpenAI", "node": { @@ -238,7 +241,10 @@ "height": 387, "id": "AgentInitializer-QiQ4x", "type": "genericNode", - "position": { "x": 1036.6064439140812, "y": 645.1919693466587 }, + "position": { + "x": 1036.6064439140812, + "y": 645.1919693466587 + }, "data": { "type": "AgentInitializer", "node": { @@ -299,7 +305,10 @@ "_type": "initialize_agent" }, "description": "Construct a zero shot agent from an LLM and tools.", - "base_classes": ["AgentExecutor", "function"], + "base_classes": [ + "AgentExecutor", + "function" + ], "display_name": "AgentInitializer" }, "id": "AgentInitializer-QiQ4x", @@ -316,7 +325,10 @@ "height": 437, "id": "PythonFunctionTool-kX99N", "type": "genericNode", - "position": { "x": 553.050119331742, "y": 412.9533535948685 }, + "position": { + "x": 553.050119331742, + "y": 412.9533535948685 + }, "data": { "type": "PythonFunctionTool", "node": { @@ -360,7 +372,9 @@ "_type": "PythonFunctionTool" }, "description": "Python function to be executed.", - "base_classes": ["Tool"], + "base_classes": [ + "Tool" + ], "display_name": "PythonFunctionTool" }, "id": "PythonFunctionTool-kX99N", @@ -380,7 +394,9 @@ "sourceHandle": "{œbaseClassesœ:[œSerializableœ,œBaseChatModelœ,œChatOpenAIœ,œBaseLanguageModelœ],œdataTypeœ:œChatOpenAIœ,œidœ:œChatOpenAI-Hz56Mœ}", "target": "AgentInitializer-QiQ4x", "targetHandle": "{œfieldNameœ:œllmœ,œidœ:œAgentInitializer-QiQ4xœ,œinputTypesœ:null,œtypeœ:œBaseLanguageModelœ}", - "style": { "stroke": "#555" }, + "style": { + "stroke": "#555" + }, "className": "stroke-gray-900 stroke-connection", "animated": false, "id": "reactflow__edge-ChatOpenAI-Hz56M{œbaseClassesœ:[œSerializableœ,œBaseChatModelœ,œChatOpenAIœ,œBaseLanguageModelœ],œdataTypeœ:œChatOpenAIœ,œidœ:œChatOpenAI-Hz56Mœ}-AgentInitializer-QiQ4x{œfieldNameœ:œllmœ,œidœ:œAgentInitializer-QiQ4xœ,œinputTypesœ:null,œtypeœ:œBaseLanguageModelœ}", @@ -409,14 +425,18 @@ "sourceHandle": "{œbaseClassesœ:[œToolœ],œdataTypeœ:œPythonFunctionToolœ,œidœ:œPythonFunctionTool-kX99Nœ}", "target": "AgentInitializer-QiQ4x", "targetHandle": "{œfieldNameœ:œtoolsœ,œidœ:œAgentInitializer-QiQ4xœ,œinputTypesœ:null,œtypeœ:œToolœ}", - "style": { "stroke": "#555" }, + "style": { + "stroke": "#555" + }, "className": "stroke-gray-900 stroke-connection", "animated": false, "id": "reactflow__edge-PythonFunctionTool-kX99N{œbaseClassesœ:[œToolœ],œdataTypeœ:œPythonFunctionToolœ,œidœ:œPythonFunctionTool-kX99Nœ}-AgentInitializer-QiQ4x{œfieldNameœ:œtoolsœ,œidœ:œAgentInitializer-QiQ4xœ,œinputTypesœ:null,œtypeœ:œToolœ}", "selected": false, "data": { "sourceHandle": { - "baseClasses": ["Tool"], + "baseClasses": [ + "Tool" + ], "dataType": "PythonFunctionTool", "id": "PythonFunctionTool-kX99N" }, @@ -446,7 +466,10 @@ { "id": "CustomComponent-w4WCp", "type": "genericNode", - "position": { "x": 536, "y": 337 }, + "position": { + "x": 536, + "y": 337 + }, "data": { "type": "CustomComponent", "node": { @@ -456,7 +479,7 @@ "placeholder": "", "show": true, "multiline": true, - "value": "from langflow import CustomComponent\n\nfrom langchain.llms.base import BaseLLM\nfrom langchain.chains import LLMChain\nfrom langchain.prompts import PromptTemplate\nfrom langchain.schema import Document\n\nimport requests\n\nclass YourComponent(CustomComponent):\n display_name: str = \"Custom Component\"\n description: str = \"Create any custom component you want!\"\n\n def build_config(self):\n return { \"url\": { \"multiline\": True, \"required\": True } }\n\n def build(self, url: str, llm: BaseLLM, prompt: PromptTemplate) -> Document:\n response = requests.get(url)\n chain = LLMChain(llm=llm, prompt=prompt)\n result = chain.run(response.text[:300])\n return Document(page_content=str(result))\n", + "value": "from langflow.custom import CustomComponent\n\nfrom langchain.llms.base import BaseLLM\nfrom langchain.chains import LLMChain\nfrom langchain.prompts import PromptTemplate\nfrom langchain.schema import Document\n\nimport requests\n\nclass YourComponent(CustomComponent):\n display_name: str = \"Custom Component\"\n description: str = \"Create any custom component you want!\"\n\n def build_config(self):\n return { \"url\": { \"multiline\": True, \"required\": True } }\n\n def build(self, url: str, llm: BaseLLM, prompt: PromptTemplate) -> Document:\n response = requests.get(url)\n chain = LLMChain(llm=llm, prompt=prompt)\n result = chain.run(response.text[:300])\n return Document(page_content=str(result))\n", "password": false, "name": "code", "advanced": false, @@ -478,11 +501,18 @@ }, "id": "CustomComponent-w4WCp" }, - "positionAbsolute": { "x": 536, "y": 337 } + "positionAbsolute": { + "x": 536, + "y": 337 + } } ], "edges": [], - "viewport": { "x": 0, "y": 0, "zoom": 1 } + "viewport": { + "x": 0, + "y": 0, + "zoom": 1 + } }, "id": "e43cf2c8-cd64-4936-8170-b207a8b109c4", "user_id": "6f6ebc2c-9e7a-4c35-84fc-51760db10d9b" @@ -497,7 +527,10 @@ "height": 631, "id": "ChatOpenAI-7GFF0", "type": "genericNode", - "position": { "x": 543.1816229116944, "y": 942.891611351432 }, + "position": { + "x": 543.1816229116944, + "y": 942.891611351432 + }, "data": { "type": "ChatOpenAI", "node": { @@ -725,7 +758,10 @@ "height": 387, "id": "AgentInitializer-YJgqs", "type": "genericNode", - "position": { "x": 1036.6064439140812, "y": 645.1919693466587 }, + "position": { + "x": 1036.6064439140812, + "y": 645.1919693466587 + }, "data": { "type": "AgentInitializer", "node": { @@ -786,7 +822,10 @@ "_type": "initialize_agent" }, "description": "Construct a zero shot agent from an LLM and tools.", - "base_classes": ["AgentExecutor", "function"], + "base_classes": [ + "AgentExecutor", + "function" + ], "display_name": "AgentInitializer" }, "id": "AgentInitializer-YJgqs", @@ -803,7 +842,10 @@ "height": 437, "id": "PythonFunctionTool-gqQDg", "type": "genericNode", - "position": { "x": 553.050119331742, "y": 412.9533535948685 }, + "position": { + "x": 553.050119331742, + "y": 412.9533535948685 + }, "data": { "type": "PythonFunctionTool", "node": { @@ -847,7 +889,9 @@ "_type": "PythonFunctionTool" }, "description": "Python function to be executed.", - "base_classes": ["Tool"], + "base_classes": [ + "Tool" + ], "display_name": "PythonFunctionTool" }, "id": "PythonFunctionTool-gqQDg", @@ -867,7 +911,9 @@ "sourceHandle": "{œbaseClassesœ:[œSerializableœ,œBaseChatModelœ,œChatOpenAIœ,œBaseLanguageModelœ],œdataTypeœ:œChatOpenAIœ,œidœ:œChatOpenAI-7GFF0œ}", "target": "AgentInitializer-YJgqs", "targetHandle": "{œfieldNameœ:œllmœ,œidœ:œAgentInitializer-YJgqsœ,œinputTypesœ:null,œtypeœ:œBaseLanguageModelœ}", - "style": { "stroke": "#555" }, + "style": { + "stroke": "#555" + }, "className": "stroke-gray-900 stroke-connection", "animated": false, "id": "reactflow__edge-ChatOpenAI-7GFF0{œbaseClassesœ:[œSerializableœ,œBaseChatModelœ,œChatOpenAIœ,œBaseLanguageModelœ],œdataTypeœ:œChatOpenAIœ,œidœ:œChatOpenAI-7GFF0œ}-AgentInitializer-YJgqs{œfieldNameœ:œllmœ,œidœ:œAgentInitializer-YJgqsœ,œinputTypesœ:null,œtypeœ:œBaseLanguageModelœ}", @@ -896,14 +942,18 @@ "sourceHandle": "{œbaseClassesœ:[œToolœ],œdataTypeœ:œPythonFunctionToolœ,œidœ:œPythonFunctionTool-gqQDgœ}", "target": "AgentInitializer-YJgqs", "targetHandle": "{œfieldNameœ:œtoolsœ,œidœ:œAgentInitializer-YJgqsœ,œinputTypesœ:null,œtypeœ:œToolœ}", - "style": { "stroke": "#555" }, + "style": { + "stroke": "#555" + }, "className": "stroke-gray-900 stroke-connection", "animated": false, "id": "reactflow__edge-PythonFunctionTool-gqQDg{œbaseClassesœ:[œToolœ],œdataTypeœ:œPythonFunctionToolœ,œidœ:œPythonFunctionTool-gqQDgœ}-AgentInitializer-YJgqs{œfieldNameœ:œtoolsœ,œidœ:œAgentInitializer-YJgqsœ,œinputTypesœ:null,œtypeœ:œToolœ}", "selected": false, "data": { "sourceHandle": { - "baseClasses": ["Tool"], + "baseClasses": [ + "Tool" + ], "dataType": "PythonFunctionTool", "id": "PythonFunctionTool-gqQDg" }, @@ -933,7 +983,10 @@ { "id": "CustomComponent-iF9Zr", "type": "genericNode", - "position": { "x": 536, "y": 337 }, + "position": { + "x": 536, + "y": 337 + }, "data": { "type": "CustomComponent", "node": { @@ -943,7 +996,7 @@ "placeholder": "", "show": true, "multiline": true, - "value": "from langflow import CustomComponent\n\nfrom langchain.llms.base import BaseLLM\nfrom langchain.chains import LLMChain\nfrom langchain.prompts import PromptTemplate\nfrom langchain.schema import Document\n\nimport requests\n\nclass YourComponent(CustomComponent):\n display_name: str = \"Custom Component\"\n description: str = \"Create any custom component you want!\"\n\n def build_config(self):\n return { \"url\": { \"multiline\": True, \"required\": True } }\n\n def build(self, url: str, llm: BaseLLM, prompt: PromptTemplate) -> Document:\n response = requests.get(url)\n chain = LLMChain(llm=llm, prompt=prompt)\n result = chain.run(response.text[:300])\n return Document(page_content=str(result))\n", + "value": "from langflow.custom import CustomComponent\n\nfrom langchain.llms.base import BaseLLM\nfrom langchain.chains import LLMChain\nfrom langchain.prompts import PromptTemplate\nfrom langchain.schema import Document\n\nimport requests\n\nclass YourComponent(CustomComponent):\n display_name: str = \"Custom Component\"\n description: str = \"Create any custom component you want!\"\n\n def build_config(self):\n return { \"url\": { \"multiline\": True, \"required\": True } }\n\n def build(self, url: str, llm: BaseLLM, prompt: PromptTemplate) -> Document:\n response = requests.get(url)\n chain = LLMChain(llm=llm, prompt=prompt)\n result = chain.run(response.text[:300])\n return Document(page_content=str(result))\n", "password": false, "name": "code", "advanced": false, @@ -965,11 +1018,18 @@ }, "id": "CustomComponent-iF9Zr" }, - "positionAbsolute": { "x": 536, "y": 337 } + "positionAbsolute": { + "x": 536, + "y": 337 + } } ], "edges": [], - "viewport": { "x": 0, "y": 0, "zoom": 1 } + "viewport": { + "x": 0, + "y": 0, + "zoom": 1 + } }, "id": "88a0e6a1-8144-4bff-b28c-d312ae5c8a10", "user_id": "6f6ebc2c-9e7a-4c35-84fc-51760db10d9b" @@ -984,7 +1044,10 @@ "height": 631, "id": "ChatOpenAI-cljAK", "type": "genericNode", - "position": { "x": 543.1816229116944, "y": 942.891611351432 }, + "position": { + "x": 543.1816229116944, + "y": 942.891611351432 + }, "data": { "type": "ChatOpenAI", "node": { @@ -1212,7 +1275,10 @@ "height": 387, "id": "AgentInitializer-grV0u", "type": "genericNode", - "position": { "x": 1036.6064439140812, "y": 645.1919693466587 }, + "position": { + "x": 1036.6064439140812, + "y": 645.1919693466587 + }, "data": { "type": "AgentInitializer", "node": { @@ -1273,7 +1339,10 @@ "_type": "initialize_agent" }, "description": "Construct a zero shot agent from an LLM and tools.", - "base_classes": ["AgentExecutor", "function"], + "base_classes": [ + "AgentExecutor", + "function" + ], "display_name": "AgentInitializer" }, "id": "AgentInitializer-grV0u", @@ -1290,7 +1359,10 @@ "height": 437, "id": "PythonFunctionTool-SctM2", "type": "genericNode", - "position": { "x": 553.050119331742, "y": 412.9533535948685 }, + "position": { + "x": 553.050119331742, + "y": 412.9533535948685 + }, "data": { "type": "PythonFunctionTool", "node": { @@ -1334,7 +1406,9 @@ "_type": "PythonFunctionTool" }, "description": "Python function to be executed.", - "base_classes": ["Tool"], + "base_classes": [ + "Tool" + ], "display_name": "PythonFunctionTool" }, "id": "PythonFunctionTool-SctM2", @@ -1354,7 +1428,9 @@ "sourceHandle": "{œbaseClassesœ:[œSerializableœ,œBaseChatModelœ,œChatOpenAIœ,œBaseLanguageModelœ],œdataTypeœ:œChatOpenAIœ,œidœ:œChatOpenAI-cljAKœ}", "target": "AgentInitializer-grV0u", "targetHandle": "{œfieldNameœ:œllmœ,œidœ:œAgentInitializer-grV0uœ,œinputTypesœ:null,œtypeœ:œBaseLanguageModelœ}", - "style": { "stroke": "#555" }, + "style": { + "stroke": "#555" + }, "className": "stroke-gray-900 stroke-connection", "animated": false, "id": "reactflow__edge-ChatOpenAI-cljAK{œbaseClassesœ:[œSerializableœ,œBaseChatModelœ,œChatOpenAIœ,œBaseLanguageModelœ],œdataTypeœ:œChatOpenAIœ,œidœ:œChatOpenAI-cljAKœ}-AgentInitializer-grV0u{œfieldNameœ:œllmœ,œidœ:œAgentInitializer-grV0uœ,œinputTypesœ:null,œtypeœ:œBaseLanguageModelœ}", @@ -1383,14 +1459,18 @@ "sourceHandle": "{œbaseClassesœ:[œToolœ],œdataTypeœ:œPythonFunctionToolœ,œidœ:œPythonFunctionTool-SctM2œ}", "target": "AgentInitializer-grV0u", "targetHandle": "{œfieldNameœ:œtoolsœ,œidœ:œAgentInitializer-grV0uœ,œinputTypesœ:null,œtypeœ:œToolœ}", - "style": { "stroke": "#555" }, + "style": { + "stroke": "#555" + }, "className": "stroke-gray-900 stroke-connection", "animated": false, "id": "reactflow__edge-PythonFunctionTool-SctM2{œbaseClassesœ:[œToolœ],œdataTypeœ:œPythonFunctionToolœ,œidœ:œPythonFunctionTool-SctM2œ}-AgentInitializer-grV0u{œfieldNameœ:œtoolsœ,œidœ:œAgentInitializer-grV0uœ,œinputTypesœ:null,œtypeœ:œToolœ}", "selected": false, "data": { "sourceHandle": { - "baseClasses": ["Tool"], + "baseClasses": [ + "Tool" + ], "dataType": "PythonFunctionTool", "id": "PythonFunctionTool-SctM2" }, @@ -1420,7 +1500,10 @@ { "id": "CustomComponent-z5kAP", "type": "genericNode", - "position": { "x": 536, "y": 337 }, + "position": { + "x": 536, + "y": 337 + }, "data": { "type": "CustomComponent", "node": { @@ -1430,7 +1513,7 @@ "placeholder": "", "show": true, "multiline": true, - "value": "from langflow import CustomComponent\n\nfrom langchain.llms.base import BaseLLM\nfrom langchain.chains import LLMChain\nfrom langchain.prompts import PromptTemplate\nfrom langchain.schema import Document\n\nimport requests\n\nclass YourComponent(CustomComponent):\n display_name: str = \"Custom Component\"\n description: str = \"Create any custom component you want!\"\n\n def build_config(self):\n return { \"url\": { \"multiline\": True, \"required\": True } }\n\n def build(self, url: str, llm: BaseLLM, prompt: PromptTemplate) -> Document:\n response = requests.get(url)\n chain = LLMChain(llm=llm, prompt=prompt)\n result = chain.run(response.text[:300])\n return Document(page_content=str(result))\n", + "value": "from langflow.custom import CustomComponent\n\nfrom langchain.llms.base import BaseLLM\nfrom langchain.chains import LLMChain\nfrom langchain.prompts import PromptTemplate\nfrom langchain.schema import Document\n\nimport requests\n\nclass YourComponent(CustomComponent):\n display_name: str = \"Custom Component\"\n description: str = \"Create any custom component you want!\"\n\n def build_config(self):\n return { \"url\": { \"multiline\": True, \"required\": True } }\n\n def build(self, url: str, llm: BaseLLM, prompt: PromptTemplate) -> Document:\n response = requests.get(url)\n chain = LLMChain(llm=llm, prompt=prompt)\n result = chain.run(response.text[:300])\n return Document(page_content=str(result))\n", "password": false, "name": "code", "advanced": false, @@ -1452,11 +1535,18 @@ }, "id": "CustomComponent-z5kAP" }, - "positionAbsolute": { "x": 536, "y": 337 } + "positionAbsolute": { + "x": 536, + "y": 337 + } } ], "edges": [], - "viewport": { "x": 0, "y": 0, "zoom": 1 } + "viewport": { + "x": 0, + "y": 0, + "zoom": 1 + } }, "id": "3128b556-35c7-4ced-a834-70fbeb1a410f", "user_id": "6f6ebc2c-9e7a-4c35-84fc-51760db10d9b" @@ -1469,7 +1559,10 @@ { "id": "CustomComponent-ZieNZ", "type": "genericNode", - "position": { "x": 536, "y": 337 }, + "position": { + "x": 536, + "y": 337 + }, "data": { "type": "CustomComponent", "node": { @@ -1479,7 +1572,7 @@ "placeholder": "", "show": true, "multiline": true, - "value": "from langflow import CustomComponent\n\nfrom langchain.llms.base import BaseLLM\nfrom langchain.chains import LLMChain\nfrom langchain.prompts import PromptTemplate\nfrom langchain.schema import Document\n\nimport requests\n\nclass YourComponent(CustomComponent):\n display_name: str = \"Custom Component\"\n description: str = \"Create any custom component you want!\"\n\n def build_config(self):\n return { \"url\": { \"multiline\": True, \"required\": True } }\n\n def build(self, url: str, llm: BaseLLM, prompt: PromptTemplate) -> Document:\n response = requests.get(url)\n chain = LLMChain(llm=llm, prompt=prompt)\n result = chain.run(response.text[:300])\n return Document(page_content=str(result))\n", + "value": "from langflow.custom import CustomComponent\n\nfrom langchain.llms.base import BaseLLM\nfrom langchain.chains import LLMChain\nfrom langchain.prompts import PromptTemplate\nfrom langchain.schema import Document\n\nimport requests\n\nclass YourComponent(CustomComponent):\n display_name: str = \"Custom Component\"\n description: str = \"Create any custom component you want!\"\n\n def build_config(self):\n return { \"url\": { \"multiline\": True, \"required\": True } }\n\n def build(self, url: str, llm: BaseLLM, prompt: PromptTemplate) -> Document:\n response = requests.get(url)\n chain = LLMChain(llm=llm, prompt=prompt)\n result = chain.run(response.text[:300])\n return Document(page_content=str(result))\n", "password": false, "name": "code", "advanced": false, @@ -1501,11 +1594,18 @@ }, "id": "CustomComponent-ZieNZ" }, - "positionAbsolute": { "x": 536, "y": 337 } + "positionAbsolute": { + "x": 536, + "y": 337 + } } ], "edges": [], - "viewport": { "x": 0, "y": 0, "zoom": 1 } + "viewport": { + "x": 0, + "y": 0, + "zoom": 1 + } }, "id": "d3f2c379-9df5-49a0-b33d-d855c2085949", "user_id": "6f6ebc2c-9e7a-4c35-84fc-51760db10d9b" @@ -1518,7 +1618,10 @@ { "id": "CustomComponent-CcHG0", "type": "genericNode", - "position": { "x": 536, "y": 337 }, + "position": { + "x": 536, + "y": 337 + }, "data": { "type": "CustomComponent", "node": { @@ -1528,7 +1631,7 @@ "placeholder": "", "show": true, "multiline": true, - "value": "from langflow import CustomComponent\n\nfrom langchain.llms.base import BaseLLM\nfrom langchain.chains import LLMChain\nfrom langchain.prompts import PromptTemplate\nfrom langchain.schema import Document\n\nimport requests\n\nclass YourComponent(CustomComponent):\n display_name: str = \"Custom Component\"\n description: str = \"Create any custom component you want!\"\n\n def build_config(self):\n return { \"url\": { \"multiline\": True, \"required\": True } }\n\n def build(self, url: str, llm: BaseLLM, prompt: PromptTemplate) -> Document:\n response = requests.get(url)\n chain = LLMChain(llm=llm, prompt=prompt)\n result = chain.run(response.text[:300])\n return Document(page_content=str(result))\n", + "value": "from langflow.custom import CustomComponent\n\nfrom langchain.llms.base import BaseLLM\nfrom langchain.chains import LLMChain\nfrom langchain.prompts import PromptTemplate\nfrom langchain.schema import Document\n\nimport requests\n\nclass YourComponent(CustomComponent):\n display_name: str = \"Custom Component\"\n description: str = \"Create any custom component you want!\"\n\n def build_config(self):\n return { \"url\": { \"multiline\": True, \"required\": True } }\n\n def build(self, url: str, llm: BaseLLM, prompt: PromptTemplate) -> Document:\n response = requests.get(url)\n chain = LLMChain(llm=llm, prompt=prompt)\n result = chain.run(response.text[:300])\n return Document(page_content=str(result))\n", "password": false, "name": "code", "advanced": false, @@ -1550,11 +1653,18 @@ }, "id": "CustomComponent-CcHG0" }, - "positionAbsolute": { "x": 536, "y": 337 } + "positionAbsolute": { + "x": 536, + "y": 337 + } } ], "edges": [], - "viewport": { "x": 0, "y": 0, "zoom": 1 } + "viewport": { + "x": 0, + "y": 0, + "zoom": 1 + } }, "id": "74afff1f-b540-43d5-bc66-d18f39d65d57", "user_id": "6f6ebc2c-9e7a-4c35-84fc-51760db10d9b" @@ -1567,7 +1677,10 @@ { "id": "CustomComponent-Q8qSr", "type": "genericNode", - "position": { "x": 536, "y": 337 }, + "position": { + "x": 536, + "y": 337 + }, "data": { "type": "CustomComponent", "node": { @@ -1577,7 +1690,7 @@ "placeholder": "", "show": true, "multiline": true, - "value": "from langflow import CustomComponent\n\nfrom langchain.llms.base import BaseLLM\nfrom langchain.chains import LLMChain\nfrom langchain.prompts import PromptTemplate\nfrom langchain.schema import Document\n\nimport requests\n\nclass YourComponent(CustomComponent):\n display_name: str = \"Custom Component\"\n description: str = \"Create any custom component you want!\"\n\n def build_config(self):\n return { \"url\": { \"multiline\": True, \"required\": True } }\n\n def build(self, url: str, llm: BaseLLM, prompt: PromptTemplate) -> Document:\n response = requests.get(url)\n chain = LLMChain(llm=llm, prompt=prompt)\n result = chain.run(response.text[:300])\n return Document(page_content=str(result))\n", + "value": "from langflow.custom import CustomComponent\n\nfrom langchain.llms.base import BaseLLM\nfrom langchain.chains import LLMChain\nfrom langchain.prompts import PromptTemplate\nfrom langchain.schema import Document\n\nimport requests\n\nclass YourComponent(CustomComponent):\n display_name: str = \"Custom Component\"\n description: str = \"Create any custom component you want!\"\n\n def build_config(self):\n return { \"url\": { \"multiline\": True, \"required\": True } }\n\n def build(self, url: str, llm: BaseLLM, prompt: PromptTemplate) -> Document:\n response = requests.get(url)\n chain = LLMChain(llm=llm, prompt=prompt)\n result = chain.run(response.text[:300])\n return Document(page_content=str(result))\n", "password": false, "name": "code", "advanced": false, @@ -1599,11 +1712,18 @@ }, "id": "CustomComponent-Q8qSr" }, - "positionAbsolute": { "x": 536, "y": 337 } + "positionAbsolute": { + "x": 536, + "y": 337 + } } ], "edges": [], - "viewport": { "x": 0, "y": 0, "zoom": 1 } + "viewport": { + "x": 0, + "y": 0, + "zoom": 1 + } }, "id": "b0b1c893-6194-4748-ae10-b5f604b271c2", "user_id": "6f6ebc2c-9e7a-4c35-84fc-51760db10d9b" @@ -1616,7 +1736,10 @@ { "id": "CustomComponent-Lgoca", "type": "genericNode", - "position": { "x": 536, "y": 337 }, + "position": { + "x": 536, + "y": 337 + }, "data": { "type": "CustomComponent", "node": { @@ -1626,7 +1749,7 @@ "placeholder": "", "show": true, "multiline": true, - "value": "from langflow import CustomComponent\n\nfrom langchain.llms.base import BaseLLM\nfrom langchain.chains import LLMChain\nfrom langchain.prompts import PromptTemplate\nfrom langchain.schema import Document\n\nimport requests\n\nclass YourComponent(CustomComponent):\n display_name: str = \"Custom Component\"\n description: str = \"Create any custom component you want!\"\n\n def build_config(self):\n return { \"url\": { \"multiline\": True, \"required\": True } }\n\n def build(self, url: str, llm: BaseLLM, prompt: PromptTemplate) -> Document:\n response = requests.get(url)\n chain = LLMChain(llm=llm, prompt=prompt)\n result = chain.run(response.text[:300])\n return Document(page_content=str(result))\n", + "value": "from langflow.custom import CustomComponent\n\nfrom langchain.llms.base import BaseLLM\nfrom langchain.chains import LLMChain\nfrom langchain.prompts import PromptTemplate\nfrom langchain.schema import Document\n\nimport requests\n\nclass YourComponent(CustomComponent):\n display_name: str = \"Custom Component\"\n description: str = \"Create any custom component you want!\"\n\n def build_config(self):\n return { \"url\": { \"multiline\": True, \"required\": True } }\n\n def build(self, url: str, llm: BaseLLM, prompt: PromptTemplate) -> Document:\n response = requests.get(url)\n chain = LLMChain(llm=llm, prompt=prompt)\n result = chain.run(response.text[:300])\n return Document(page_content=str(result))\n", "password": false, "name": "code", "advanced": false, @@ -1648,11 +1771,18 @@ }, "id": "CustomComponent-Lgoca" }, - "positionAbsolute": { "x": 536, "y": 337 } + "positionAbsolute": { + "x": 536, + "y": 337 + } } ], "edges": [], - "viewport": { "x": 0, "y": 0, "zoom": 1 } + "viewport": { + "x": 0, + "y": 0, + "zoom": 1 + } }, "id": "edf1051d-509b-46a2-84c6-b94bdcdc3a4f", "user_id": "6f6ebc2c-9e7a-4c35-84fc-51760db10d9b" @@ -1665,7 +1795,10 @@ { "id": "CustomComponent-6OJGW", "type": "genericNode", - "position": { "x": 536, "y": 337 }, + "position": { + "x": 536, + "y": 337 + }, "data": { "type": "CustomComponent", "node": { @@ -1675,7 +1808,7 @@ "placeholder": "", "show": true, "multiline": true, - "value": "from langflow import CustomComponent\n\nfrom langchain.llms.base import BaseLLM\nfrom langchain.chains import LLMChain\nfrom langchain.prompts import PromptTemplate\nfrom langchain.schema import Document\n\nimport requests\n\nclass YourComponent(CustomComponent):\n display_name: str = \"Custom Component\"\n description: str = \"Create any custom component you want!\"\n\n def build_config(self):\n return { \"url\": { \"multiline\": True, \"required\": True } }\n\n def build(self, url: str, llm: BaseLLM, prompt: PromptTemplate) -> Document:\n response = requests.get(url)\n chain = LLMChain(llm=llm, prompt=prompt)\n result = chain.run(response.text[:300])\n return Document(page_content=str(result))\n", + "value": "from langflow.custom import CustomComponent\n\nfrom langchain.llms.base import BaseLLM\nfrom langchain.chains import LLMChain\nfrom langchain.prompts import PromptTemplate\nfrom langchain.schema import Document\n\nimport requests\n\nclass YourComponent(CustomComponent):\n display_name: str = \"Custom Component\"\n description: str = \"Create any custom component you want!\"\n\n def build_config(self):\n return { \"url\": { \"multiline\": True, \"required\": True } }\n\n def build(self, url: str, llm: BaseLLM, prompt: PromptTemplate) -> Document:\n response = requests.get(url)\n chain = LLMChain(llm=llm, prompt=prompt)\n result = chain.run(response.text[:300])\n return Document(page_content=str(result))\n", "password": false, "name": "code", "advanced": false, @@ -1697,11 +1830,18 @@ }, "id": "CustomComponent-6OJGW" }, - "positionAbsolute": { "x": 536, "y": 337 } + "positionAbsolute": { + "x": 536, + "y": 337 + } } ], "edges": [], - "viewport": { "x": 0, "y": 0, "zoom": 1 } + "viewport": { + "x": 0, + "y": 0, + "zoom": 1 + } }, "id": "65b2a4e0-4084-418a-aa86-ee914acb0ab5", "user_id": "6f6ebc2c-9e7a-4c35-84fc-51760db10d9b" @@ -1714,7 +1854,10 @@ { "id": "CustomComponent-tcE83", "type": "genericNode", - "position": { "x": 536, "y": 337 }, + "position": { + "x": 536, + "y": 337 + }, "data": { "type": "CustomComponent", "node": { @@ -1724,7 +1867,7 @@ "placeholder": "", "show": true, "multiline": true, - "value": "from langflow import CustomComponent\n\nfrom langchain.llms.base import BaseLLM\nfrom langchain.chains import LLMChain\nfrom langchain.prompts import PromptTemplate\nfrom langchain.schema import Document\n\nimport requests\n\nclass YourComponent(CustomComponent):\n display_name: str = \"Custom Component\"\n description: str = \"Create any custom component you want!\"\n\n def build_config(self):\n return { \"url\": { \"multiline\": True, \"required\": True } }\n\n def build(self, url: str, llm: BaseLLM, prompt: PromptTemplate) -> Document:\n response = requests.get(url)\n chain = LLMChain(llm=llm, prompt=prompt)\n result = chain.run(response.text[:300])\n return Document(page_content=str(result))\n", + "value": "from langflow.custom import CustomComponent\n\nfrom langchain.llms.base import BaseLLM\nfrom langchain.chains import LLMChain\nfrom langchain.prompts import PromptTemplate\nfrom langchain.schema import Document\n\nimport requests\n\nclass YourComponent(CustomComponent):\n display_name: str = \"Custom Component\"\n description: str = \"Create any custom component you want!\"\n\n def build_config(self):\n return { \"url\": { \"multiline\": True, \"required\": True } }\n\n def build(self, url: str, llm: BaseLLM, prompt: PromptTemplate) -> Document:\n response = requests.get(url)\n chain = LLMChain(llm=llm, prompt=prompt)\n result = chain.run(response.text[:300])\n return Document(page_content=str(result))\n", "password": false, "name": "code", "advanced": false, @@ -1746,11 +1889,18 @@ }, "id": "CustomComponent-tcE83" }, - "positionAbsolute": { "x": 536, "y": 337 } + "positionAbsolute": { + "x": 536, + "y": 337 + } } ], "edges": [], - "viewport": { "x": 0, "y": 0, "zoom": 1 } + "viewport": { + "x": 0, + "y": 0, + "zoom": 1 + } }, "id": "534e412b-d37b-4133-8029-e5ed139fd55c", "user_id": "6f6ebc2c-9e7a-4c35-84fc-51760db10d9b" @@ -1765,7 +1915,10 @@ "height": 631, "id": "ChatOpenAI-mQEi3", "type": "genericNode", - "position": { "x": 543.1816229116944, "y": 942.891611351432 }, + "position": { + "x": 543.1816229116944, + "y": 942.891611351432 + }, "data": { "type": "ChatOpenAI", "node": { @@ -1993,7 +2146,10 @@ "height": 387, "id": "AgentInitializer-EE8R4", "type": "genericNode", - "position": { "x": 1036.6064439140812, "y": 645.1919693466587 }, + "position": { + "x": 1036.6064439140812, + "y": 645.1919693466587 + }, "data": { "type": "AgentInitializer", "node": { @@ -2054,7 +2210,10 @@ "_type": "initialize_agent" }, "description": "Construct a zero shot agent from an LLM and tools.", - "base_classes": ["AgentExecutor", "function"], + "base_classes": [ + "AgentExecutor", + "function" + ], "display_name": "AgentInitializer" }, "id": "AgentInitializer-EE8R4", @@ -2071,7 +2230,10 @@ "height": 437, "id": "PythonFunctionTool-YKkDL", "type": "genericNode", - "position": { "x": 553.050119331742, "y": 412.9533535948685 }, + "position": { + "x": 553.050119331742, + "y": 412.9533535948685 + }, "data": { "type": "PythonFunctionTool", "node": { @@ -2115,7 +2277,9 @@ "_type": "PythonFunctionTool" }, "description": "Python function to be executed.", - "base_classes": ["Tool"], + "base_classes": [ + "Tool" + ], "display_name": "PythonFunctionTool" }, "id": "PythonFunctionTool-YKkDL", @@ -2135,7 +2299,9 @@ "sourceHandle": "{œbaseClassesœ:[œSerializableœ,œBaseChatModelœ,œChatOpenAIœ,œBaseLanguageModelœ],œdataTypeœ:œChatOpenAIœ,œidœ:œChatOpenAI-mQEi3œ}", "target": "AgentInitializer-EE8R4", "targetHandle": "{œfieldNameœ:œllmœ,œidœ:œAgentInitializer-EE8R4œ,œinputTypesœ:null,œtypeœ:œBaseLanguageModelœ}", - "style": { "stroke": "#555" }, + "style": { + "stroke": "#555" + }, "className": "stroke-gray-900 stroke-connection", "animated": false, "id": "reactflow__edge-ChatOpenAI-mQEi3{œbaseClassesœ:[œSerializableœ,œBaseChatModelœ,œChatOpenAIœ,œBaseLanguageModelœ],œdataTypeœ:œChatOpenAIœ,œidœ:œChatOpenAI-mQEi3œ}-AgentInitializer-EE8R4{œfieldNameœ:œllmœ,œidœ:œAgentInitializer-EE8R4œ,œinputTypesœ:null,œtypeœ:œBaseLanguageModelœ}", @@ -2164,14 +2330,18 @@ "sourceHandle": "{œbaseClassesœ:[œToolœ],œdataTypeœ:œPythonFunctionToolœ,œidœ:œPythonFunctionTool-YKkDLœ}", "target": "AgentInitializer-EE8R4", "targetHandle": "{œfieldNameœ:œtoolsœ,œidœ:œAgentInitializer-EE8R4œ,œinputTypesœ:null,œtypeœ:œToolœ}", - "style": { "stroke": "#555" }, + "style": { + "stroke": "#555" + }, "className": "stroke-gray-900 stroke-connection", "animated": false, "id": "reactflow__edge-PythonFunctionTool-YKkDL{œbaseClassesœ:[œToolœ],œdataTypeœ:œPythonFunctionToolœ,œidœ:œPythonFunctionTool-YKkDLœ}-AgentInitializer-EE8R4{œfieldNameœ:œtoolsœ,œidœ:œAgentInitializer-EE8R4œ,œinputTypesœ:null,œtypeœ:œToolœ}", "selected": false, "data": { "sourceHandle": { - "baseClasses": ["Tool"], + "baseClasses": [ + "Tool" + ], "dataType": "PythonFunctionTool", "id": "PythonFunctionTool-YKkDL" }, @@ -2201,7 +2371,10 @@ { "id": "CustomComponent-T38LS", "type": "genericNode", - "position": { "x": 536, "y": 337 }, + "position": { + "x": 536, + "y": 337 + }, "data": { "type": "CustomComponent", "node": { @@ -2211,7 +2384,7 @@ "placeholder": "", "show": true, "multiline": true, - "value": "from langflow import CustomComponent\n\nfrom langchain.llms.base import BaseLLM\nfrom langchain.chains import LLMChain\nfrom langchain.prompts import PromptTemplate\nfrom langchain.schema import Document\n\nimport requests\n\nclass YourComponent(CustomComponent):\n display_name: str = \"Custom Component\"\n description: str = \"Create any custom component you want!\"\n\n def build_config(self):\n return { \"url\": { \"multiline\": True, \"required\": True } }\n\n def build(self, url: str, llm: BaseLLM, prompt: PromptTemplate) -> Document:\n response = requests.get(url)\n chain = LLMChain(llm=llm, prompt=prompt)\n result = chain.run(response.text[:300])\n return Document(page_content=str(result))\n", + "value": "from langflow.custom import CustomComponent\n\nfrom langchain.llms.base import BaseLLM\nfrom langchain.chains import LLMChain\nfrom langchain.prompts import PromptTemplate\nfrom langchain.schema import Document\n\nimport requests\n\nclass YourComponent(CustomComponent):\n display_name: str = \"Custom Component\"\n description: str = \"Create any custom component you want!\"\n\n def build_config(self):\n return { \"url\": { \"multiline\": True, \"required\": True } }\n\n def build(self, url: str, llm: BaseLLM, prompt: PromptTemplate) -> Document:\n response = requests.get(url)\n chain = LLMChain(llm=llm, prompt=prompt)\n result = chain.run(response.text[:300])\n return Document(page_content=str(result))\n", "password": false, "name": "code", "advanced": false, @@ -2233,11 +2406,18 @@ }, "id": "CustomComponent-T38LS" }, - "positionAbsolute": { "x": 536, "y": 337 } + "positionAbsolute": { + "x": 536, + "y": 337 + } } ], "edges": [], - "viewport": { "x": 0, "y": 0, "zoom": 1 } + "viewport": { + "x": 0, + "y": 0, + "zoom": 1 + } }, "id": "ec36a3b7-7b5f-4663-983c-833bcec4d851", "user_id": "6f6ebc2c-9e7a-4c35-84fc-51760db10d9b" @@ -2252,7 +2432,10 @@ "height": 631, "id": "ChatOpenAI-E1XSb", "type": "genericNode", - "position": { "x": 543.1816229116944, "y": 942.891611351432 }, + "position": { + "x": 543.1816229116944, + "y": 942.891611351432 + }, "data": { "type": "ChatOpenAI", "node": { @@ -2480,7 +2663,10 @@ "height": 387, "id": "AgentInitializer-goPm2", "type": "genericNode", - "position": { "x": 1036.6064439140812, "y": 645.1919693466587 }, + "position": { + "x": 1036.6064439140812, + "y": 645.1919693466587 + }, "data": { "type": "AgentInitializer", "node": { @@ -2541,7 +2727,10 @@ "_type": "initialize_agent" }, "description": "Construct a zero shot agent from an LLM and tools.", - "base_classes": ["AgentExecutor", "function"], + "base_classes": [ + "AgentExecutor", + "function" + ], "display_name": "AgentInitializer" }, "id": "AgentInitializer-goPm2", @@ -2558,7 +2747,10 @@ "height": 437, "id": "PythonFunctionTool-SQikY", "type": "genericNode", - "position": { "x": 553.050119331742, "y": 412.9533535948685 }, + "position": { + "x": 553.050119331742, + "y": 412.9533535948685 + }, "data": { "type": "PythonFunctionTool", "node": { @@ -2602,7 +2794,9 @@ "_type": "PythonFunctionTool" }, "description": "Python function to be executed.", - "base_classes": ["Tool"], + "base_classes": [ + "Tool" + ], "display_name": "PythonFunctionTool" }, "id": "PythonFunctionTool-SQikY", @@ -2622,7 +2816,9 @@ "sourceHandle": "{œbaseClassesœ:[œSerializableœ,œBaseChatModelœ,œChatOpenAIœ,œBaseLanguageModelœ],œdataTypeœ:œChatOpenAIœ,œidœ:œChatOpenAI-E1XSbœ}", "target": "AgentInitializer-goPm2", "targetHandle": "{œfieldNameœ:œllmœ,œidœ:œAgentInitializer-goPm2œ,œinputTypesœ:null,œtypeœ:œBaseLanguageModelœ}", - "style": { "stroke": "#555" }, + "style": { + "stroke": "#555" + }, "className": "stroke-gray-900 stroke-connection", "animated": false, "id": "reactflow__edge-ChatOpenAI-E1XSb{œbaseClassesœ:[œSerializableœ,œBaseChatModelœ,œChatOpenAIœ,œBaseLanguageModelœ],œdataTypeœ:œChatOpenAIœ,œidœ:œChatOpenAI-E1XSbœ}-AgentInitializer-goPm2{œfieldNameœ:œllmœ,œidœ:œAgentInitializer-goPm2œ,œinputTypesœ:null,œtypeœ:œBaseLanguageModelœ}", @@ -2651,14 +2847,18 @@ "sourceHandle": "{œbaseClassesœ:[œToolœ],œdataTypeœ:œPythonFunctionToolœ,œidœ:œPythonFunctionTool-SQikYœ}", "target": "AgentInitializer-goPm2", "targetHandle": "{œfieldNameœ:œtoolsœ,œidœ:œAgentInitializer-goPm2œ,œinputTypesœ:null,œtypeœ:œToolœ}", - "style": { "stroke": "#555" }, + "style": { + "stroke": "#555" + }, "className": "stroke-gray-900 stroke-connection", "animated": false, "id": "reactflow__edge-PythonFunctionTool-SQikY{œbaseClassesœ:[œToolœ],œdataTypeœ:œPythonFunctionToolœ,œidœ:œPythonFunctionTool-SQikYœ}-AgentInitializer-goPm2{œfieldNameœ:œtoolsœ,œidœ:œAgentInitializer-goPm2œ,œinputTypesœ:null,œtypeœ:œToolœ}", "selected": false, "data": { "sourceHandle": { - "baseClasses": ["Tool"], + "baseClasses": [ + "Tool" + ], "dataType": "PythonFunctionTool", "id": "PythonFunctionTool-SQikY" }, @@ -2681,4 +2881,4 @@ "user_id": "6f6ebc2c-9e7a-4c35-84fc-51760db10d9b" } ] -} +} \ No newline at end of file diff --git a/src/frontend/tests/end-to-end/assets/flow_group_test.json b/src/frontend/tests/end-to-end/assets/flow_group_test.json index 9df38cfb3..efd5478b3 100644 --- a/src/frontend/tests/end-to-end/assets/flow_group_test.json +++ b/src/frontend/tests/end-to-end/assets/flow_group_test.json @@ -5,7 +5,10 @@ { "id": "PythonFunctionTool-RfJui", "type": "genericNode", - "position": { "x": 117.54690105175428, "y": -84.2465475108354 }, + "position": { + "x": 117.54690105175428, + "y": -84.2465475108354 + }, "data": { "type": "PythonFunctionTool", "node": { @@ -43,7 +46,9 @@ "dynamic": false, "info": "", "title_case": false, - "input_types": ["Text"] + "input_types": [ + "Text" + ] }, "name": { "type": "str", @@ -61,7 +66,9 @@ "dynamic": false, "info": "", "title_case": false, - "input_types": ["Text"] + "input_types": [ + "Text" + ] }, "return_direct": { "type": "bool", @@ -83,7 +90,10 @@ "_type": "PythonFunctionTool" }, "description": "Python function to be executed.", - "base_classes": ["BaseTool", "Tool"], + "base_classes": [ + "BaseTool", + "Tool" + ], "display_name": "PythonFunctionTool", "documentation": "", "custom_fields": {}, @@ -97,13 +107,19 @@ "selected": true, "width": 384, "height": 466, - "positionAbsolute": { "x": 117.54690105175428, "y": -84.2465475108354 }, + "positionAbsolute": { + "x": 117.54690105175428, + "y": -84.2465475108354 + }, "dragging": false }, { "id": "AgentInitializer-tPdJw", "type": "genericNode", - "position": { "x": 677.68677055088, "y": 127.19859565276168 }, + "position": { + "x": 677.68677055088, + "y": 127.19859565276168 + }, "data": { "type": "AgentInitializer", "node": { @@ -192,7 +208,9 @@ "dynamic": false, "info": "", "title_case": false, - "input_types": ["Text"] + "input_types": [ + "Text" + ] }, "code": { "type": "code", @@ -201,7 +219,7 @@ "list": false, "show": true, "multiline": true, - "value": "from typing import Callable, List, Optional, Union\n\nfrom langchain.agents import AgentExecutor, AgentType, initialize_agent, types\nfrom langflow import CustomComponent\nfrom langflow.field_typing import BaseChatMemory, BaseLanguageModel, Tool\n\n\nclass AgentInitializerComponent(CustomComponent):\n display_name: str = \"Agent Initializer\"\n description: str = \"Initialize a Langchain Agent.\"\n documentation: str = \"https://python.langchain.com/docs/modules/agents/agent_types/\"\n\n def build_config(self):\n agents = list(types.AGENT_TO_CLASS.keys())\n # field_type and required are optional\n return {\n \"agent\": {\"options\": agents, \"value\": agents[0], \"display_name\": \"Agent Type\"},\n \"max_iterations\": {\"display_name\": \"Max Iterations\", \"value\": 10},\n \"memory\": {\"display_name\": \"Memory\"},\n \"tools\": {\"display_name\": \"Tools\"},\n \"llm\": {\"display_name\": \"Language Model\"},\n \"code\": {\"advanced\": True},\n }\n\n def build(\n self,\n agent: str,\n llm: BaseLanguageModel,\n tools: List[Tool],\n max_iterations: int,\n memory: Optional[BaseChatMemory] = None,\n ) -> Union[AgentExecutor, Callable]:\n agent = AgentType(agent)\n if memory:\n return initialize_agent(\n tools=tools,\n llm=llm,\n agent=agent,\n memory=memory,\n return_intermediate_steps=True,\n handle_parsing_errors=True,\n max_iterations=max_iterations,\n )\n return initialize_agent(\n tools=tools,\n llm=llm,\n agent=agent,\n return_intermediate_steps=True,\n handle_parsing_errors=True,\n max_iterations=max_iterations,\n )\n", + "value": "from typing import Callable, List, Optional, Union\n\nfrom langchain.agents import AgentExecutor, AgentType, initialize_agent, types\nfrom langflow.custom import CustomComponent\nfrom langflow.field_typing import BaseChatMemory, BaseLanguageModel, Tool\n\n\nclass AgentInitializerComponent(CustomComponent):\n display_name: str = \"Agent Initializer\"\n description: str = \"Initialize a Langchain Agent.\"\n documentation: str = \"https://python.langchain.com/docs/modules/agents/agent_types/\"\n\n def build_config(self):\n agents = list(types.AGENT_TO_CLASS.keys())\n # field_type and required are optional\n return {\n \"agent\": {\"options\": agents, \"value\": agents[0], \"display_name\": \"Agent Type\"},\n \"max_iterations\": {\"display_name\": \"Max Iterations\", \"value\": 10},\n \"memory\": {\"display_name\": \"Memory\"},\n \"tools\": {\"display_name\": \"Tools\"},\n \"llm\": {\"display_name\": \"Language Model\"},\n \"code\": {\"advanced\": True},\n }\n\n def build(\n self,\n agent: str,\n llm: BaseLanguageModel,\n tools: List[Tool],\n max_iterations: int,\n memory: Optional[BaseChatMemory] = None,\n ) -> Union[AgentExecutor, Callable]:\n agent = AgentType(agent)\n if memory:\n return initialize_agent(\n tools=tools,\n llm=llm,\n agent=agent,\n memory=memory,\n return_intermediate_steps=True,\n handle_parsing_errors=True,\n max_iterations=max_iterations,\n )\n return initialize_agent(\n tools=tools,\n llm=llm,\n agent=agent,\n return_intermediate_steps=True,\n handle_parsing_errors=True,\n max_iterations=max_iterations,\n )\n", "fileTypes": [], "file_path": "", "password": false, @@ -251,7 +269,10 @@ "max_iterations": null, "memory": null }, - "output_types": ["AgentExecutor", "Callable"], + "output_types": [ + "AgentExecutor", + "Callable" + ], "field_formatters": {}, "pinned": false, "beta": true @@ -265,7 +286,10 @@ { "id": "ChatOpenAISpecs-stxRM", "type": "genericNode", - "position": { "x": 18.226716205350385, "y": 432.6122491402193 }, + "position": { + "x": 18.226716205350385, + "y": 432.6122491402193 + }, "data": { "type": "ChatOpenAISpecs", "node": { @@ -277,7 +301,7 @@ "list": false, "show": true, "multiline": true, - "value": "from typing import Optional, Union\n\nfrom langchain.llms import BaseLLM\nfrom langchain_community.chat_models.openai import ChatOpenAI\nfrom langflow import CustomComponent\nfrom langflow.field_typing import BaseLanguageModel, NestedDict\n\n\nclass ChatOpenAIComponent(CustomComponent):\n display_name = \"ChatOpenAI\"\n description = \"`OpenAI` Chat large language models API.\"\n icon = \"OpenAI\"\n\n def build_config(self):\n return {\n \"max_tokens\": {\n \"display_name\": \"Max Tokens\",\n \"advanced\": False,\n \"required\": False,\n },\n \"model_kwargs\": {\n \"display_name\": \"Model Kwargs\",\n \"advanced\": True,\n \"required\": False,\n },\n \"model_name\": {\n \"display_name\": \"Model Name\",\n \"advanced\": False,\n \"required\": False,\n \"options\": [\n \"gpt-4-turbo-preview\",\n \"gpt-4-0125-preview\",\n \"gpt-4-1106-preview\",\n \"gpt-4-vision-preview\",\n \"gpt-3.5-turbo-0125\",\n \"gpt-3.5-turbo-1106\",\n ],\n },\n \"openai_api_base\": {\n \"display_name\": \"OpenAI API Base\",\n \"advanced\": False,\n \"required\": False,\n \"info\": (\n \"The base URL of the OpenAI API. Defaults to https://api.openai.com/v1.\\n\\n\"\n \"You can change this to use other APIs like JinaChat, LocalAI and Prem.\"\n ),\n },\n \"openai_api_key\": {\n \"display_name\": \"OpenAI API Key\",\n \"advanced\": False,\n \"required\": False,\n \"password\": True,\n },\n \"temperature\": {\n \"display_name\": \"Temperature\",\n \"advanced\": False,\n \"required\": False,\n \"value\": 0.7,\n },\n }\n\n def build(\n self,\n max_tokens: Optional[int] = 256,\n model_kwargs: NestedDict = {},\n model_name: str = \"gpt-4-1106-preview\",\n openai_api_base: Optional[str] = None,\n openai_api_key: Optional[str] = None,\n temperature: float = 0.7,\n ) -> Union[BaseLanguageModel, BaseLLM]:\n if not openai_api_base:\n openai_api_base = \"https://api.openai.com/v1\"\n return ChatOpenAI(\n max_tokens=max_tokens,\n model_kwargs=model_kwargs,\n model=model_name,\n base_url=openai_api_base,\n api_key=openai_api_key,\n temperature=temperature,\n )\n", + "value": "from typing import Optional, Union\n\nfrom langchain.llms import BaseLLM\nfrom langchain_community.chat_models.openai import ChatOpenAI\nfrom langflow.custom import CustomComponent\nfrom langflow.field_typing import BaseLanguageModel, NestedDict\n\n\nclass ChatOpenAIComponent(CustomComponent):\n display_name = \"ChatOpenAI\"\n description = \"`OpenAI` Chat large language models API.\"\n icon = \"OpenAI\"\n\n def build_config(self):\n return {\n \"max_tokens\": {\n \"display_name\": \"Max Tokens\",\n \"advanced\": False,\n \"required\": False,\n },\n \"model_kwargs\": {\n \"display_name\": \"Model Kwargs\",\n \"advanced\": True,\n \"required\": False,\n },\n \"model_name\": {\n \"display_name\": \"Model Name\",\n \"advanced\": False,\n \"required\": False,\n \"options\": [\n \"gpt-4-turbo-preview\",\n \"gpt-4-0125-preview\",\n \"gpt-4-1106-preview\",\n \"gpt-4-vision-preview\",\n \"gpt-3.5-turbo-0125\",\n \"gpt-3.5-turbo-1106\",\n ],\n },\n \"openai_api_base\": {\n \"display_name\": \"OpenAI API Base\",\n \"advanced\": False,\n \"required\": False,\n \"info\": (\n \"The base URL of the OpenAI API. Defaults to https://api.openai.com/v1.\\n\\n\"\n \"You can change this to use other APIs like JinaChat, LocalAI and Prem.\"\n ),\n },\n \"openai_api_key\": {\n \"display_name\": \"OpenAI API Key\",\n \"advanced\": False,\n \"required\": False,\n \"password\": True,\n },\n \"temperature\": {\n \"display_name\": \"Temperature\",\n \"advanced\": False,\n \"required\": False,\n \"value\": 0.7,\n },\n }\n\n def build(\n self,\n max_tokens: Optional[int] = 256,\n model_kwargs: NestedDict = {},\n model_name: str = \"gpt-4-1106-preview\",\n openai_api_base: Optional[str] = None,\n openai_api_key: Optional[str] = None,\n temperature: float = 0.7,\n ) -> Union[BaseLanguageModel, BaseLLM]:\n if not openai_api_base:\n openai_api_base = \"https://api.openai.com/v1\"\n return ChatOpenAI(\n max_tokens=max_tokens,\n model_kwargs=model_kwargs,\n model=model_name,\n base_url=openai_api_base,\n api_key=openai_api_key,\n temperature=temperature,\n )\n", "fileTypes": [], "file_path": "", "password": false, @@ -348,7 +372,9 @@ "dynamic": false, "info": "", "title_case": false, - "input_types": ["Text"] + "input_types": [ + "Text" + ] }, "openai_api_base": { "type": "str", @@ -366,7 +392,9 @@ "dynamic": false, "info": "The base URL of the OpenAI API. Defaults to https://api.openai.com/v1.\n\nYou can change this to use other APIs like JinaChat, LocalAI and Prem.", "title_case": false, - "input_types": ["Text"] + "input_types": [ + "Text" + ] }, "openai_api_key": { "type": "str", @@ -384,7 +412,9 @@ "dynamic": false, "info": "", "title_case": false, - "input_types": ["Text"] + "input_types": [ + "Text" + ] }, "temperature": { "type": "float", @@ -402,7 +432,11 @@ "advanced": false, "dynamic": false, "info": "", - "rangeSpec": { "min": -1, "max": 1, "step": 0.1 }, + "rangeSpec": { + "min": -1, + "max": 1, + "step": 0.1 + }, "title_case": false }, "_type": "CustomComponent" @@ -428,7 +462,10 @@ "openai_api_key": null, "temperature": null }, - "output_types": ["BaseLanguageModel", "BaseLLM"], + "output_types": [ + "BaseLanguageModel", + "BaseLLM" + ], "field_formatters": {}, "pinned": false, "beta": true @@ -438,7 +475,10 @@ "selected": false, "width": 384, "height": 666, - "positionAbsolute": { "x": 18.226716205350385, "y": 432.6122491402193 }, + "positionAbsolute": { + "x": 18.226716205350385, + "y": 432.6122491402193 + }, "dragging": false } ], @@ -469,7 +509,9 @@ "id": "ChatOpenAISpecs-stxRM" } }, - "style": { "stroke": "#555" }, + "style": { + "stroke": "#555" + }, "className": "stroke-foreground stroke-connection", "id": "reactflow__edge-ChatOpenAISpecs-stxRM{œbaseClassesœ:[œRunnableœ,œBaseLLMœ,œSerializableœ,œBaseLanguageModelœ,œobjectœ,œGenericœ,œRunnableSerializableœ],œdataTypeœ:œChatOpenAISpecsœ,œidœ:œChatOpenAISpecs-stxRMœ}-AgentInitializer-tPdJw{œfieldNameœ:œllmœ,œidœ:œAgentInitializer-tPdJwœ,œinputTypesœ:null,œtypeœ:œBaseLanguageModelœ}" }, @@ -486,12 +528,17 @@ "type": "Tool" }, "sourceHandle": { - "baseClasses": ["BaseTool", "Tool"], + "baseClasses": [ + "BaseTool", + "Tool" + ], "dataType": "PythonFunctionTool", "id": "PythonFunctionTool-RfJui" } }, - "style": { "stroke": "#555" }, + "style": { + "stroke": "#555" + }, "className": "stroke-foreground stroke-connection", "id": "reactflow__edge-PythonFunctionTool-RfJui{œbaseClassesœ:[œBaseToolœ,œToolœ],œdataTypeœ:œPythonFunctionToolœ,œidœ:œPythonFunctionTool-RfJuiœ}-AgentInitializer-tPdJw{œfieldNameœ:œtoolsœ,œidœ:œAgentInitializer-tPdJwœ,œinputTypesœ:null,œtypeœ:œToolœ}" } @@ -506,4 +553,4 @@ "name": "Untitled document (20)", "last_tested_version": "0.7.0a0", "is_component": false -} +} \ No newline at end of file diff --git a/src/frontend/tests/end-to-end/assets/flowtest.json b/src/frontend/tests/end-to-end/assets/flowtest.json index 8b83ee270..6ef790455 100644 --- a/src/frontend/tests/end-to-end/assets/flowtest.json +++ b/src/frontend/tests/end-to-end/assets/flowtest.json @@ -8,7 +8,10 @@ "height": 461, "id": "CustomComponent-MtJjl", "type": "genericNode", - "position": { "x": 534.3712097224906, "y": -135.01908566635723 }, + "position": { + "x": 534.3712097224906, + "y": -135.01908566635723 + }, "data": { "type": "CustomComponent", "node": { @@ -20,7 +23,7 @@ "list": false, "show": true, "multiline": true, - "value": "from langflow import CustomComponent\nfrom langflow.field_typing import Data\nfrom pathlib import Path\nfrom platformdirs import user_cache_dir\nimport os\n\nclass Component(CustomComponent):\n documentation: str = \"http://docs.langflow.org/components/custom\"\n\n def build_config(self):\n return {\"text_input\":{\"display_name\":\"Text Input\", \"input_types\":[\"str\"]},\"save_path\":{\"display_name\":\"Save Path\",\n \"info\":\"Put the full path with the file name and extension\",\"value\":Path(user_cache_dir(\"langflow\"))/\"text.t1.txt\"}}\n\n def build(self, text_input:str,save_path:str) -> str:\n try:\n # Create the directory if it doesn't exist\n os.makedirs(os.path.dirname(save_path), exist_ok=True)\n\n # Open the file in write mode and save the text\n with open(save_path, 'w') as file:\n file.write(text_input)\n except Exception as e:\n raise e\n self.status = text_input\n return text_input", + "value": "from langflow.custom import CustomComponent\nfrom langflow.field_typing import Data\nfrom pathlib import Path\nfrom platformdirs import user_cache_dir\nimport os\n\nclass Component(CustomComponent):\n documentation: str = \"http://docs.langflow.org/components/custom\"\n\n def build_config(self):\n return {\"text_input\":{\"display_name\":\"Text Input\", \"input_types\":[\"str\"]},\"save_path\":{\"display_name\":\"Save Path\",\n \"info\":\"Put the full path with the file name and extension\",\"value\":Path(user_cache_dir(\"langflow\"))/\"text.t1.txt\"}}\n\n def build(self, text_input:str,save_path:str) -> str:\n try:\n # Create the directory if it doesn't exist\n os.makedirs(os.path.dirname(save_path), exist_ok=True)\n\n # Open the file in write mode and save the text\n with open(save_path, 'w') as file:\n file.write(text_input)\n except Exception as e:\n raise e\n self.status = text_input\n return text_input", "fileTypes": [], "file_path": "", "password": false, @@ -59,18 +62,27 @@ "name": "text_input", "display_name": "Text Input", "advanced": false, - "input_types": ["str"], + "input_types": [ + "str" + ], "dynamic": false, "info": "", "value": "" }, "_type": "CustomComponent" }, - "base_classes": ["str"], + "base_classes": [ + "str" + ], "display_name": "text checkpoint", "documentation": "http://docs.langflow.org/components/custom", - "custom_fields": { "save_path": null, "text_input": null }, - "output_types": ["str"], + "custom_fields": { + "save_path": null, + "text_input": null + }, + "output_types": [ + "str" + ], "field_formatters": {}, "beta": true }, @@ -78,14 +90,20 @@ }, "selected": false, "dragging": false, - "positionAbsolute": { "x": 534.3712097224906, "y": -135.01908566635723 } + "positionAbsolute": { + "x": 534.3712097224906, + "y": -135.01908566635723 + } }, { "width": 384, "height": 453, "id": "CustomComponent-7NQoq", "type": "genericNode", - "position": { "x": 27.487979888011637, "y": -414.43998171034826 }, + "position": { + "x": 27.487979888011637, + "y": -414.43998171034826 + }, "data": { "type": "CustomComponent", "node": { @@ -131,7 +149,7 @@ "list": false, "show": true, "multiline": true, - "value": "from langflow import CustomComponent\nfrom typing import Optional, List, Dict, Union\nfrom langflow.field_typing import (\n AgentExecutor,\n BaseChatMemory,\n BaseLanguageModel,\n BaseLLM,\n BaseLoader,\n BaseMemory,\n BaseOutputParser,\n BasePromptTemplate,\n BaseRetriever,\n Callable,\n Chain,\n ChatPromptTemplate,\n Data,\n Document,\n Embeddings,\n NestedDict,\n Object,\n PromptTemplate,\n TextSplitter,\n Tool,\n VectorStore,\n)\n\nfrom openai import OpenAI\nimport os\nimport ffmpeg\n\nclass Component(CustomComponent):\n display_name: str = \"Whisper Transcriber\"\n description: str = \"Converts audio to text using OpenAI's Whisper.\"\n\n def build_config(self):\n return {\"audio\": {\"field_type\": \"file\", \"suffixes\": [\".mp3\", \".mp4\", \".m4a\"]}, \"OpenAIKey\": {\"field_type\": \"str\", \"password\": True}}\n\n def calculate_segment_duration(self, audio_path, target_chunk_size_mb=24):\n # Calculate the target chunk size in bytes\n target_chunk_size_bytes = target_chunk_size_mb * 1024 * 1024\n\n # Use ffprobe to get the audio file information\n ffprobe_output = ffmpeg.probe(audio_path)\n print(ffprobe_output)\n # Convert duration to float\n duration = float(ffprobe_output[\"format\"][\"duration\"])\n\n # Calculate the approximate bitrate\n bitrate = os.path.getsize(audio_path) / duration\n\n # Calculate the segment duration to achieve the target chunk size\n segment_duration = target_chunk_size_bytes / bitrate\n\n return segment_duration\n\n def split_audio_into_chunks(self, audio_path, target_chunk_size_mb=24):\n # Calculate the segment duration\n segment_duration = self.calculate_segment_duration(audio_path, target_chunk_size_mb)\n\n # Create a directory to store the chunks\n output_directory = f\"{os.path.splitext(audio_path)[0]}_chunks\"\n os.makedirs(output_directory, exist_ok=True)\n\n # Use ffmpeg-python to split the audio file into chunks\n (\n ffmpeg.input(audio_path)\n .output(f\"{output_directory}/%03d{os.path.splitext(audio_path)[1]}\", codec=\"copy\", f=\"segment\", segment_time=segment_duration)\n .run()\n )\n\n # Get the list of generated chunk files\n chunks = [os.path.join(output_directory, file) for file in os.listdir(output_directory)]\n\n return chunks\n\n def build(self, audio: str, OpenAIKey: str) -> str:\n # Split audio into chunks\n audio_chunks = self.split_audio_into_chunks(audio)\n\n client = OpenAI(api_key=OpenAIKey)\n transcripts = []\n\n try:\n for chunk in audio_chunks:\n with open(chunk, \"rb\") as chunk_file:\n transcript = client.audio.transcriptions.create(\n model=\"whisper-1\",\n file=chunk_file,\n response_format=\"text\"\n )\n transcripts.append(transcript)\n finally:\n # Clean up temporary chunk files\n for chunk in audio_chunks:\n os.remove(chunk)\n\n # Concatenate transcripts into the final response\n final_response = \"\\n\".join(transcripts)\n self.status = final_response\n return final_response\n", + "value": "from langflow.custom import CustomComponent\nfrom typing import Optional, List, Dict, Union\nfrom langflow.field_typing import (\n AgentExecutor,\n BaseChatMemory,\n BaseLanguageModel,\n BaseLLM,\n BaseLoader,\n BaseMemory,\n BaseOutputParser,\n BasePromptTemplate,\n BaseRetriever,\n Callable,\n Chain,\n ChatPromptTemplate,\n Data,\n Document,\n Embeddings,\n NestedDict,\n Object,\n PromptTemplate,\n TextSplitter,\n Tool,\n VectorStore,\n)\n\nfrom openai import OpenAI\nimport os\nimport ffmpeg\n\nclass Component(CustomComponent):\n display_name: str = \"Whisper Transcriber\"\n description: str = \"Converts audio to text using OpenAI's Whisper.\"\n\n def build_config(self):\n return {\"audio\": {\"field_type\": \"file\", \"suffixes\": [\".mp3\", \".mp4\", \".m4a\"]}, \"OpenAIKey\": {\"field_type\": \"str\", \"password\": True}}\n\n def calculate_segment_duration(self, audio_path, target_chunk_size_mb=24):\n # Calculate the target chunk size in bytes\n target_chunk_size_bytes = target_chunk_size_mb * 1024 * 1024\n\n # Use ffprobe to get the audio file information\n ffprobe_output = ffmpeg.probe(audio_path)\n print(ffprobe_output)\n # Convert duration to float\n duration = float(ffprobe_output[\"format\"][\"duration\"])\n\n # Calculate the approximate bitrate\n bitrate = os.path.getsize(audio_path) / duration\n\n # Calculate the segment duration to achieve the target chunk size\n segment_duration = target_chunk_size_bytes / bitrate\n\n return segment_duration\n\n def split_audio_into_chunks(self, audio_path, target_chunk_size_mb=24):\n # Calculate the segment duration\n segment_duration = self.calculate_segment_duration(audio_path, target_chunk_size_mb)\n\n # Create a directory to store the chunks\n output_directory = f\"{os.path.splitext(audio_path)[0]}_chunks\"\n os.makedirs(output_directory, exist_ok=True)\n\n # Use ffmpeg-python to split the audio file into chunks\n (\n ffmpeg.input(audio_path)\n .output(f\"{output_directory}/%03d{os.path.splitext(audio_path)[1]}\", codec=\"copy\", f=\"segment\", segment_time=segment_duration)\n .run()\n )\n\n # Get the list of generated chunk files\n chunks = [os.path.join(output_directory, file) for file in os.listdir(output_directory)]\n\n return chunks\n\n def build(self, audio: str, OpenAIKey: str) -> str:\n # Split audio into chunks\n audio_chunks = self.split_audio_into_chunks(audio)\n\n client = OpenAI(api_key=OpenAIKey)\n transcripts = []\n\n try:\n for chunk in audio_chunks:\n with open(chunk, \"rb\") as chunk_file:\n transcript = client.audio.transcriptions.create(\n model=\"whisper-1\",\n file=chunk_file,\n response_format=\"text\"\n )\n transcripts.append(transcript)\n finally:\n # Clean up temporary chunk files\n for chunk in audio_chunks:\n os.remove(chunk)\n\n # Concatenate transcripts into the final response\n final_response = \"\\n\".join(transcripts)\n self.status = final_response\n return final_response\n", "fileTypes": [], "file_path": "", "password": false, @@ -143,11 +161,18 @@ "_type": "CustomComponent" }, "description": "Converts audio to text using OpenAI's Whisper.", - "base_classes": ["str"], + "base_classes": [ + "str" + ], "display_name": "Whisper Transcriber", "documentation": "", - "custom_fields": { "OpenAIKey": null, "audio": null }, - "output_types": ["str"], + "custom_fields": { + "OpenAIKey": null, + "audio": null + }, + "output_types": [ + "str" + ], "field_formatters": {}, "beta": true }, @@ -171,26 +196,36 @@ "targetHandle": { "fieldName": "text_input", "id": "CustomComponent-MtJjl", - "inputTypes": ["str"], + "inputTypes": [ + "str" + ], "type": "str" }, "sourceHandle": { - "baseClasses": ["str"], + "baseClasses": [ + "str" + ], "dataType": "CustomComponent", "id": "CustomComponent-7NQoq" } }, - "style": { "stroke": "#555" }, + "style": { + "stroke": "#555" + }, "className": "stroke-gray-900 stroke-connection", "animated": false, "id": "reactflow__edge-CustomComponent-7NQoq{œbaseClassesœ:[œstrœ],œdataTypeœ:œCustomComponentœ,œidœ:œCustomComponent-7NQoqœ}-CustomComponent-MtJjl{œfieldNameœ:œtext_inputœ,œidœ:œCustomComponent-MtJjlœ,œinputTypesœ:[œstrœ],œtypeœ:œstrœ}" } ], - "viewport": { "x": 119.37759169012509, "y": 351.3082742479685, "zoom": 1 } + "viewport": { + "x": 119.37759169012509, + "y": 351.3082742479685, + "zoom": 1 + } }, "is_component": false, "updated_at": "2023-12-13T23:51:56.874099", "folder": null, "id": "1b0814b7-2964-4e09-9b4b-f7413c4fb50b", "user_id": "8b5cf798-f1b8-4108-88fd-d7274d08d471" -} +} \ No newline at end of file diff --git a/tests/data/ChatInputTest.json b/tests/data/ChatInputTest.json index 24771bab9..3c516067e 100644 --- a/tests/data/ChatInputTest.json +++ b/tests/data/ChatInputTest.json @@ -1 +1,918 @@ -{"name":"ChatInputTest","description":"","data":{"nodes":[{"width":384,"height":359,"id":"PromptTemplate-IKKOx","type":"genericNode","position":{"x":880,"y":646.9375},"data":{"type":"PromptTemplate","node":{"template":{"output_parser":{"required":false,"placeholder":"","show":false,"multiline":false,"password":false,"name":"output_parser","advanced":false,"dynamic":false,"info":"","type":"BaseOutputParser","list":false},"input_variables":{"required":true,"placeholder":"","show":false,"multiline":false,"password":false,"name":"input_variables","advanced":false,"dynamic":false,"info":"","type":"str","list":true,"value":["input"]},"partial_variables":{"required":false,"placeholder":"","show":false,"multiline":false,"password":false,"name":"partial_variables","advanced":false,"dynamic":false,"info":"","type":"code","list":false},"template":{"required":true,"placeholder":"","show":true,"multiline":true,"password":false,"name":"template","advanced":false,"dynamic":false,"info":"","type":"prompt","list":false,"value":"Input: {input}\nAI:"},"template_format":{"required":false,"placeholder":"","show":false,"multiline":false,"value":"f-string","password":false,"name":"template_format","advanced":false,"dynamic":false,"info":"","type":"str","list":false},"validate_template":{"required":false,"placeholder":"","show":false,"multiline":false,"value":true,"password":false,"name":"validate_template","advanced":false,"dynamic":false,"info":"","type":"bool","list":false},"_type":"PromptTemplate","input":{"required":false,"placeholder":"","show":true,"multiline":true,"value":"","password":false,"name":"input","display_name":"input","advanced":false,"input_types":["Document","BaseOutputParser","str"],"dynamic":false,"info":"","type":"str","list":false}},"description":"A prompt template for a language model.","base_classes":["BasePromptTemplate","PromptTemplate","StringPromptTemplate"],"name":"","display_name":"PromptTemplate","documentation":"https://python.langchain.com/docs/modules/model_io/prompts/prompt_templates/","custom_fields":{"":["input"],"template":["input"]},"output_types":[],"field_formatters":{"formatters":{"openai_api_key":{}},"base_formatters":{"kwargs":{},"optional":{},"list":{},"dict":{},"union":{},"multiline":{},"show":{},"password":{},"default":{},"headers":{},"dict_code_file":{},"model_fields":{"MODEL_DICT":{"OpenAI":["text-davinci-003","text-davinci-002","text-curie-001","text-babbage-001","text-ada-001"],"ChatOpenAI":["gpt-3.5-turbo-0613","gpt-3.5-turbo","gpt-3.5-turbo-16k-0613","gpt-3.5-turbo-16k","gpt-4-0613","gpt-4-32k-0613","gpt-4","gpt-4-32k"],"Anthropic":["claude-v1","claude-v1-100k","claude-instant-v1","claude-instant-v1-100k","claude-v1.3","claude-v1.3-100k","claude-v1.2","claude-v1.0","claude-instant-v1.1","claude-instant-v1.1-100k","claude-instant-v1.0"],"ChatAnthropic":["claude-v1","claude-v1-100k","claude-instant-v1","claude-instant-v1-100k","claude-v1.3","claude-v1.3-100k","claude-v1.2","claude-v1.0","claude-instant-v1.1","claude-instant-v1.1-100k","claude-instant-v1.0"]}}}},"beta":false,"error":null},"id":"PromptTemplate-IKKOx"},"selected":false,"positionAbsolute":{"x":880,"y":646.9375},"dragging":false},{"width":384,"height":307,"id":"LLMChain-e2dhN","type":"genericNode","position":{"x":1449.330344958542,"y":880.1760221487797},"data":{"type":"LLMChain","node":{"template":{"callbacks":{"required":false,"placeholder":"","show":false,"multiline":false,"password":false,"name":"callbacks","advanced":false,"dynamic":false,"info":"","type":"langchain.callbacks.base.BaseCallbackHandler","list":true},"llm":{"required":true,"placeholder":"","show":true,"multiline":false,"password":false,"name":"llm","advanced":false,"dynamic":false,"info":"","type":"BaseLanguageModel","list":false},"memory":{"required":false,"placeholder":"","show":true,"multiline":false,"password":false,"name":"memory","advanced":false,"dynamic":false,"info":"","type":"BaseMemory","list":false},"output_parser":{"required":false,"placeholder":"","show":false,"multiline":false,"password":false,"name":"output_parser","advanced":false,"dynamic":false,"info":"","type":"BaseLLMOutputParser","list":false},"prompt":{"required":true,"placeholder":"","show":true,"multiline":false,"password":false,"name":"prompt","advanced":false,"dynamic":false,"info":"","type":"BasePromptTemplate","list":false},"llm_kwargs":{"required":false,"placeholder":"","show":false,"multiline":false,"password":false,"name":"llm_kwargs","advanced":false,"dynamic":false,"info":"","type":"code","list":false},"metadata":{"required":false,"placeholder":"","show":false,"multiline":false,"password":false,"name":"metadata","advanced":false,"dynamic":false,"info":"","type":"code","list":false},"output_key":{"required":true,"placeholder":"","show":true,"multiline":false,"value":"text","password":false,"name":"output_key","advanced":true,"dynamic":false,"info":"","type":"str","list":false},"return_final_only":{"required":false,"placeholder":"","show":false,"multiline":false,"value":true,"password":false,"name":"return_final_only","advanced":false,"dynamic":false,"info":"","type":"bool","list":false},"tags":{"required":false,"placeholder":"","show":false,"multiline":false,"password":false,"name":"tags","advanced":false,"dynamic":false,"info":"","type":"str","list":true},"verbose":{"required":false,"placeholder":"","show":false,"multiline":false,"value":false,"password":false,"name":"verbose","advanced":true,"dynamic":false,"info":"","type":"bool","list":false},"_type":"LLMChain"},"description":"Chain to run queries against LLMs.","base_classes":["Chain","LLMChain","function","Text"],"display_name":"LLMChain","custom_fields":{},"output_types":[],"documentation":"https://python.langchain.com/docs/modules/chains/foundational/llm_chain","beta":false,"error":null},"id":"LLMChain-e2dhN"},"positionAbsolute":{"x":1449.330344958542,"y":880.1760221487797}},{"width":384,"height":621,"id":"ChatOpenAI-2I57f","type":"genericNode","position":{"x":393.3551923753797,"y":1061.025177453298},"data":{"type":"ChatOpenAI","node":{"template":{"callbacks":{"required":false,"placeholder":"","show":false,"multiline":false,"password":false,"name":"callbacks","advanced":false,"dynamic":false,"info":"","type":"langchain.callbacks.base.BaseCallbackHandler","list":true},"cache":{"required":false,"placeholder":"","show":false,"multiline":false,"password":false,"name":"cache","advanced":false,"dynamic":false,"info":"","type":"bool","list":false},"client":{"required":false,"placeholder":"","show":false,"multiline":false,"password":false,"name":"client","advanced":false,"dynamic":false,"info":"","type":"Any","list":false},"max_retries":{"required":false,"placeholder":"","show":false,"multiline":false,"value":6,"password":false,"name":"max_retries","advanced":false,"dynamic":false,"info":"","type":"int","list":false},"max_tokens":{"required":false,"placeholder":"","show":true,"multiline":false,"password":true,"name":"max_tokens","advanced":false,"dynamic":false,"info":"","type":"int","list":false,"value":""},"metadata":{"required":false,"placeholder":"","show":false,"multiline":false,"password":false,"name":"metadata","advanced":false,"dynamic":false,"info":"","type":"code","list":false},"model_kwargs":{"required":false,"placeholder":"","show":true,"multiline":false,"password":false,"name":"model_kwargs","advanced":true,"dynamic":false,"info":"","type":"code","list":false},"model_name":{"required":false,"placeholder":"","show":true,"multiline":false,"value":"gpt-3.5-turbo-0613","password":false,"options":["gpt-3.5-turbo-0613","gpt-3.5-turbo","gpt-3.5-turbo-16k-0613","gpt-3.5-turbo-16k","gpt-4-0613","gpt-4-32k-0613","gpt-4","gpt-4-32k"],"name":"model_name","advanced":false,"dynamic":false,"info":"","type":"str","list":true},"n":{"required":false,"placeholder":"","show":false,"multiline":false,"value":1,"password":false,"name":"n","advanced":false,"dynamic":false,"info":"","type":"int","list":false},"openai_api_base":{"required":false,"placeholder":"","show":true,"multiline":false,"password":false,"name":"openai_api_base","display_name":"OpenAI API Base","advanced":false,"dynamic":false,"info":"\nThe base URL of the OpenAI API. Defaults to https://api.openai.com/v1.\n\nYou can change this to use other APIs like JinaChat, LocalAI and Prem.\n","type":"str","list":false},"openai_api_key":{"required":false,"placeholder":"","show":true,"multiline":false,"value":"","password":true,"name":"openai_api_key","display_name":"OpenAI API Key","advanced":false,"dynamic":false,"info":"","type":"str","list":false},"openai_organization":{"required":false,"placeholder":"","show":false,"multiline":false,"password":false,"name":"openai_organization","display_name":"OpenAI Organization","advanced":false,"dynamic":false,"info":"","type":"str","list":false},"openai_proxy":{"required":false,"placeholder":"","show":false,"multiline":false,"password":false,"name":"openai_proxy","display_name":"OpenAI Proxy","advanced":false,"dynamic":false,"info":"","type":"str","list":false},"request_timeout":{"required":false,"placeholder":"","show":false,"multiline":false,"password":false,"name":"request_timeout","advanced":false,"dynamic":false,"info":"","type":"float","list":false},"streaming":{"required":false,"placeholder":"","show":false,"multiline":false,"value":false,"password":false,"name":"streaming","advanced":false,"dynamic":false,"info":"","type":"bool","list":false},"tags":{"required":false,"placeholder":"","show":false,"multiline":false,"password":false,"name":"tags","advanced":false,"dynamic":false,"info":"","type":"str","list":true},"temperature":{"required":false,"placeholder":"","show":true,"multiline":false,"value":0.7,"password":false,"name":"temperature","advanced":false,"dynamic":false,"info":"","type":"float","list":false},"tiktoken_model_name":{"required":false,"placeholder":"","show":false,"multiline":false,"password":false,"name":"tiktoken_model_name","advanced":false,"dynamic":false,"info":"","type":"str","list":false},"verbose":{"required":false,"placeholder":"","show":false,"multiline":false,"value":false,"password":false,"name":"verbose","advanced":false,"dynamic":false,"info":"","type":"bool","list":false},"_type":"ChatOpenAI"},"description":"`OpenAI` Chat large language models API.","base_classes":["BaseChatModel","ChatOpenAI","BaseLanguageModel","BaseLLM"],"display_name":"ChatOpenAI","custom_fields":{},"output_types":[],"documentation":"https://python.langchain.com/docs/modules/model_io/models/chat/integrations/openai","beta":false,"error":null},"id":"ChatOpenAI-2I57f"},"selected":false,"positionAbsolute":{"x":393.3551923753797,"y":1061.025177453298},"dragging":false},{"width":384,"height":359,"id":"ChatInput-207IY","type":"genericNode","position":{"x":415.1018926651509,"y":506.62736462360317},"data":{"type":"ChatInput","node":{"template":{"code":{"dynamic":true,"required":true,"placeholder":"","show":false,"multiline":true,"value":"from typing import Optional\nfrom langflow import CustomComponent\n\n\nclass ChatInput(CustomComponent):\n display_name = \"Chat Input\"\n\n def build(self, message: Optional[str] = \"\") -> str:\n return message\n","password":false,"name":"code","advanced":false,"type":"code","list":false},"_type":"CustomComponent","message":{"required":false,"placeholder":"","show":true,"multiline":false,"value":"","password":false,"name":"message","display_name":"message","advanced":false,"dynamic":false,"info":"","type":"str","list":false}},"description":"Used to get user input from the chat.","base_classes":["str"],"display_name":"Chat Input","custom_fields":{"message":null},"output_types":["ChatInput"],"documentation":"","beta":true,"error":null},"id":"ChatInput-207IY"},"positionAbsolute":{"x":415.1018926651509,"y":506.62736462360317}},{"width":384,"height":389,"id":"ChatOutput-1jlJy","type":"genericNode","position":{"x":2002.8008888732943,"y":926.1397178702218},"data":{"type":"ChatOutput","node":{"template":{"code":{"dynamic":true,"required":true,"placeholder":"","show":true,"multiline":true,"value":"from typing import Optional, Text\nfrom langflow.api.v1.schemas import ChatMessage\nfrom langflow.services.utils import get_chat_manager\nfrom langflow import CustomComponent\nfrom anyio.from_thread import start_blocking_portal\nfrom loguru import logger\n\n\nclass ChatOutput(CustomComponent):\n display_name = \"Chat Output\"\n description = \"Used to send a message to the chat.\"\n\n field_config = {\n \"code\": {\n \"show\": False,\n }\n }\n\n def build_config(self):\n return {\"message\": {\"input_types\": [\"Text\"]}}\n\n def build(self, message: Optional[Text], is_ai: bool = False) -> Text:\n if not message:\n return \"\"\n try:\n chat_manager = get_chat_manager()\n chat_message = ChatMessage(message=message, is_bot=is_ai)\n # send_message is a coroutine\n # run in a thread safe manner\n with start_blocking_portal() as portal:\n portal.call(chat_manager.send_message, chat_message)\n chat_manager.chat_history.add_message(\n chat_manager.cache_manager.current_client_id, chat_message\n )\n except Exception as exc:\n logger.exception(exc)\n logger.debug(f\"Error sending message to chat: {exc}\")\n self.repr_value = message\n return message\n","password":false,"name":"code","advanced":false,"type":"code","list":false},"_type":"CustomComponent","is_ai":{"required":true,"placeholder":"","show":true,"multiline":false,"value":true,"password":false,"name":"is_ai","display_name":"is_ai","advanced":false,"dynamic":false,"info":"","type":"bool","list":false},"message":{"required":false,"placeholder":"","show":true,"multiline":false,"password":false,"name":"message","display_name":"message","advanced":false,"input_types":["Text"],"dynamic":false,"info":"","type":"Text","list":false}},"description":"Used to send a message to the chat.","base_classes":["str"],"display_name":"Chat Output","custom_fields":{"is_ai":null,"message":null},"output_types":["ChatOutput"],"documentation":"","beta":true,"error":null},"id":"ChatOutput-1jlJy"},"selected":true,"dragging":false,"positionAbsolute":{"x":2002.8008888732943,"y":926.1397178702218}}],"edges":[{"source":"PromptTemplate-IKKOx","sourceHandle":"PromptTemplate|PromptTemplate-IKKOx|BasePromptTemplate|PromptTemplate|StringPromptTemplate","target":"LLMChain-e2dhN","targetHandle":"BasePromptTemplate|prompt|LLMChain-e2dhN","style":{"stroke":"#555"},"className":"","animated":false,"id":"reactflow__edge-PromptTemplate-IKKOxPromptTemplate|PromptTemplate-IKKOx|StringPromptTemplate|BasePromptTemplate|PromptTemplate-LLMChain-e2dhNBasePromptTemplate|prompt|LLMChain-e2dhN"},{"source":"ChatOpenAI-2I57f","sourceHandle":"ChatOpenAI|ChatOpenAI-2I57f|BaseChatModel|ChatOpenAI|BaseLanguageModel|BaseLLM","target":"LLMChain-e2dhN","targetHandle":"BaseLanguageModel|llm|LLMChain-e2dhN","style":{"stroke":"#555"},"className":"","animated":false,"id":"reactflow__edge-ChatOpenAI-2I57fChatOpenAI|ChatOpenAI-2I57f|BaseChatModel|ChatOpenAI|BaseLanguageModel|BaseLLM-LLMChain-e2dhNBaseLanguageModel|llm|LLMChain-e2dhN"},{"source":"ChatInput-207IY","sourceHandle":"ChatInput|ChatInput-207IY|str","target":"PromptTemplate-IKKOx","targetHandle":"Document;BaseOutputParser;str|input|PromptTemplate-IKKOx","style":{"stroke":"#555"},"className":"","animated":false,"id":"reactflow__edge-ChatInput-207IYChatInput|ChatInput-207IY|str-PromptTemplate-IKKOxDocument;BaseOutputParser;str|input|PromptTemplate-IKKOx"},{"source":"LLMChain-e2dhN","sourceHandle":"LLMChain|LLMChain-e2dhN|Chain|LLMChain|function|Text","target":"ChatOutput-1jlJy","targetHandle":"Text|message|ChatOutput-1jlJy","style":{"stroke":"#555"},"className":"stroke-foreground stroke-connection","animated":true,"id":"reactflow__edge-LLMChain-e2dhNLLMChain|LLMChain-e2dhN|Chain|LLMChain|function|Text-ChatOutput-1jlJyText|message|ChatOutput-1jlJy"}],"viewport":{"x":-141.98308184453367,"y":-104.98637616656356,"zoom":0.4788209787464315}},"id":"b3388ab9-b5dc-4447-b560-79caef40faa5","user_id":"c65bfea3-3eea-4e71-8fc4-106238eb0583"} \ No newline at end of file +{ + "name": "ChatInputTest", + "description": "", + "data": { + "nodes": [ + { + "width": 384, + "height": 359, + "id": "PromptTemplate-IKKOx", + "type": "genericNode", + "position": { + "x": 880, + "y": 646.9375 + }, + "data": { + "type": "PromptTemplate", + "node": { + "template": { + "output_parser": { + "required": false, + "placeholder": "", + "show": false, + "multiline": false, + "password": false, + "name": "output_parser", + "advanced": false, + "dynamic": false, + "info": "", + "type": "BaseOutputParser", + "list": false + }, + "input_variables": { + "required": true, + "placeholder": "", + "show": false, + "multiline": false, + "password": false, + "name": "input_variables", + "advanced": false, + "dynamic": false, + "info": "", + "type": "str", + "list": true, + "value": [ + "input" + ] + }, + "partial_variables": { + "required": false, + "placeholder": "", + "show": false, + "multiline": false, + "password": false, + "name": "partial_variables", + "advanced": false, + "dynamic": false, + "info": "", + "type": "code", + "list": false + }, + "template": { + "required": true, + "placeholder": "", + "show": true, + "multiline": true, + "password": false, + "name": "template", + "advanced": false, + "dynamic": false, + "info": "", + "type": "prompt", + "list": false, + "value": "Input: {input}\nAI:" + }, + "template_format": { + "required": false, + "placeholder": "", + "show": false, + "multiline": false, + "value": "f-string", + "password": false, + "name": "template_format", + "advanced": false, + "dynamic": false, + "info": "", + "type": "str", + "list": false + }, + "validate_template": { + "required": false, + "placeholder": "", + "show": false, + "multiline": false, + "value": true, + "password": false, + "name": "validate_template", + "advanced": false, + "dynamic": false, + "info": "", + "type": "bool", + "list": false + }, + "_type": "PromptTemplate", + "input": { + "required": false, + "placeholder": "", + "show": true, + "multiline": true, + "value": "", + "password": false, + "name": "input", + "display_name": "input", + "advanced": false, + "input_types": [ + "Document", + "BaseOutputParser", + "str" + ], + "dynamic": false, + "info": "", + "type": "str", + "list": false + } + }, + "description": "A prompt template for a language model.", + "base_classes": [ + "BasePromptTemplate", + "PromptTemplate", + "StringPromptTemplate" + ], + "name": "", + "display_name": "PromptTemplate", + "documentation": "https://python.langchain.com/docs/modules/model_io/prompts/prompt_templates/", + "custom_fields": { + "": [ + "input" + ], + "template": [ + "input" + ] + }, + "output_types": [], + "field_formatters": { + "formatters": { + "openai_api_key": {} + }, + "base_formatters": { + "kwargs": {}, + "optional": {}, + "list": {}, + "dict": {}, + "union": {}, + "multiline": {}, + "show": {}, + "password": {}, + "default": {}, + "headers": {}, + "dict_code_file": {}, + "model_fields": { + "MODEL_DICT": { + "OpenAI": [ + "text-davinci-003", + "text-davinci-002", + "text-curie-001", + "text-babbage-001", + "text-ada-001" + ], + "ChatOpenAI": [ + "gpt-3.5-turbo-0613", + "gpt-3.5-turbo", + "gpt-3.5-turbo-16k-0613", + "gpt-3.5-turbo-16k", + "gpt-4-0613", + "gpt-4-32k-0613", + "gpt-4", + "gpt-4-32k" + ], + "Anthropic": [ + "claude-v1", + "claude-v1-100k", + "claude-instant-v1", + "claude-instant-v1-100k", + "claude-v1.3", + "claude-v1.3-100k", + "claude-v1.2", + "claude-v1.0", + "claude-instant-v1.1", + "claude-instant-v1.1-100k", + "claude-instant-v1.0" + ], + "ChatAnthropic": [ + "claude-v1", + "claude-v1-100k", + "claude-instant-v1", + "claude-instant-v1-100k", + "claude-v1.3", + "claude-v1.3-100k", + "claude-v1.2", + "claude-v1.0", + "claude-instant-v1.1", + "claude-instant-v1.1-100k", + "claude-instant-v1.0" + ] + } + } + } + }, + "beta": false, + "error": null + }, + "id": "PromptTemplate-IKKOx" + }, + "selected": false, + "positionAbsolute": { + "x": 880, + "y": 646.9375 + }, + "dragging": false + }, + { + "width": 384, + "height": 307, + "id": "LLMChain-e2dhN", + "type": "genericNode", + "position": { + "x": 1449.330344958542, + "y": 880.1760221487797 + }, + "data": { + "type": "LLMChain", + "node": { + "template": { + "callbacks": { + "required": false, + "placeholder": "", + "show": false, + "multiline": false, + "password": false, + "name": "callbacks", + "advanced": false, + "dynamic": false, + "info": "", + "type": "langchain.callbacks.base.BaseCallbackHandler", + "list": true + }, + "llm": { + "required": true, + "placeholder": "", + "show": true, + "multiline": false, + "password": false, + "name": "llm", + "advanced": false, + "dynamic": false, + "info": "", + "type": "BaseLanguageModel", + "list": false + }, + "memory": { + "required": false, + "placeholder": "", + "show": true, + "multiline": false, + "password": false, + "name": "memory", + "advanced": false, + "dynamic": false, + "info": "", + "type": "BaseMemory", + "list": false + }, + "output_parser": { + "required": false, + "placeholder": "", + "show": false, + "multiline": false, + "password": false, + "name": "output_parser", + "advanced": false, + "dynamic": false, + "info": "", + "type": "BaseLLMOutputParser", + "list": false + }, + "prompt": { + "required": true, + "placeholder": "", + "show": true, + "multiline": false, + "password": false, + "name": "prompt", + "advanced": false, + "dynamic": false, + "info": "", + "type": "BasePromptTemplate", + "list": false + }, + "llm_kwargs": { + "required": false, + "placeholder": "", + "show": false, + "multiline": false, + "password": false, + "name": "llm_kwargs", + "advanced": false, + "dynamic": false, + "info": "", + "type": "code", + "list": false + }, + "metadata": { + "required": false, + "placeholder": "", + "show": false, + "multiline": false, + "password": false, + "name": "metadata", + "advanced": false, + "dynamic": false, + "info": "", + "type": "code", + "list": false + }, + "output_key": { + "required": true, + "placeholder": "", + "show": true, + "multiline": false, + "value": "text", + "password": false, + "name": "output_key", + "advanced": true, + "dynamic": false, + "info": "", + "type": "str", + "list": false + }, + "return_final_only": { + "required": false, + "placeholder": "", + "show": false, + "multiline": false, + "value": true, + "password": false, + "name": "return_final_only", + "advanced": false, + "dynamic": false, + "info": "", + "type": "bool", + "list": false + }, + "tags": { + "required": false, + "placeholder": "", + "show": false, + "multiline": false, + "password": false, + "name": "tags", + "advanced": false, + "dynamic": false, + "info": "", + "type": "str", + "list": true + }, + "verbose": { + "required": false, + "placeholder": "", + "show": false, + "multiline": false, + "value": false, + "password": false, + "name": "verbose", + "advanced": true, + "dynamic": false, + "info": "", + "type": "bool", + "list": false + }, + "_type": "LLMChain" + }, + "description": "Chain to run queries against LLMs.", + "base_classes": [ + "Chain", + "LLMChain", + "function", + "Text" + ], + "display_name": "LLMChain", + "custom_fields": {}, + "output_types": [], + "documentation": "https://python.langchain.com/docs/modules/chains/foundational/llm_chain", + "beta": false, + "error": null + }, + "id": "LLMChain-e2dhN" + }, + "positionAbsolute": { + "x": 1449.330344958542, + "y": 880.1760221487797 + } + }, + { + "width": 384, + "height": 621, + "id": "ChatOpenAI-2I57f", + "type": "genericNode", + "position": { + "x": 393.3551923753797, + "y": 1061.025177453298 + }, + "data": { + "type": "ChatOpenAI", + "node": { + "template": { + "callbacks": { + "required": false, + "placeholder": "", + "show": false, + "multiline": false, + "password": false, + "name": "callbacks", + "advanced": false, + "dynamic": false, + "info": "", + "type": "langchain.callbacks.base.BaseCallbackHandler", + "list": true + }, + "cache": { + "required": false, + "placeholder": "", + "show": false, + "multiline": false, + "password": false, + "name": "cache", + "advanced": false, + "dynamic": false, + "info": "", + "type": "bool", + "list": false + }, + "client": { + "required": false, + "placeholder": "", + "show": false, + "multiline": false, + "password": false, + "name": "client", + "advanced": false, + "dynamic": false, + "info": "", + "type": "Any", + "list": false + }, + "max_retries": { + "required": false, + "placeholder": "", + "show": false, + "multiline": false, + "value": 6, + "password": false, + "name": "max_retries", + "advanced": false, + "dynamic": false, + "info": "", + "type": "int", + "list": false + }, + "max_tokens": { + "required": false, + "placeholder": "", + "show": true, + "multiline": false, + "password": true, + "name": "max_tokens", + "advanced": false, + "dynamic": false, + "info": "", + "type": "int", + "list": false, + "value": "" + }, + "metadata": { + "required": false, + "placeholder": "", + "show": false, + "multiline": false, + "password": false, + "name": "metadata", + "advanced": false, + "dynamic": false, + "info": "", + "type": "code", + "list": false + }, + "model_kwargs": { + "required": false, + "placeholder": "", + "show": true, + "multiline": false, + "password": false, + "name": "model_kwargs", + "advanced": true, + "dynamic": false, + "info": "", + "type": "code", + "list": false + }, + "model_name": { + "required": false, + "placeholder": "", + "show": true, + "multiline": false, + "value": "gpt-3.5-turbo-0613", + "password": false, + "options": [ + "gpt-3.5-turbo-0613", + "gpt-3.5-turbo", + "gpt-3.5-turbo-16k-0613", + "gpt-3.5-turbo-16k", + "gpt-4-0613", + "gpt-4-32k-0613", + "gpt-4", + "gpt-4-32k" + ], + "name": "model_name", + "advanced": false, + "dynamic": false, + "info": "", + "type": "str", + "list": true + }, + "n": { + "required": false, + "placeholder": "", + "show": false, + "multiline": false, + "value": 1, + "password": false, + "name": "n", + "advanced": false, + "dynamic": false, + "info": "", + "type": "int", + "list": false + }, + "openai_api_base": { + "required": false, + "placeholder": "", + "show": true, + "multiline": false, + "password": false, + "name": "openai_api_base", + "display_name": "OpenAI API Base", + "advanced": false, + "dynamic": false, + "info": "\nThe base URL of the OpenAI API. Defaults to https://api.openai.com/v1.\n\nYou can change this to use other APIs like JinaChat, LocalAI and Prem.\n", + "type": "str", + "list": false + }, + "openai_api_key": { + "required": false, + "placeholder": "", + "show": true, + "multiline": false, + "value": "", + "password": true, + "name": "openai_api_key", + "display_name": "OpenAI API Key", + "advanced": false, + "dynamic": false, + "info": "", + "type": "str", + "list": false + }, + "openai_organization": { + "required": false, + "placeholder": "", + "show": false, + "multiline": false, + "password": false, + "name": "openai_organization", + "display_name": "OpenAI Organization", + "advanced": false, + "dynamic": false, + "info": "", + "type": "str", + "list": false + }, + "openai_proxy": { + "required": false, + "placeholder": "", + "show": false, + "multiline": false, + "password": false, + "name": "openai_proxy", + "display_name": "OpenAI Proxy", + "advanced": false, + "dynamic": false, + "info": "", + "type": "str", + "list": false + }, + "request_timeout": { + "required": false, + "placeholder": "", + "show": false, + "multiline": false, + "password": false, + "name": "request_timeout", + "advanced": false, + "dynamic": false, + "info": "", + "type": "float", + "list": false + }, + "streaming": { + "required": false, + "placeholder": "", + "show": false, + "multiline": false, + "value": false, + "password": false, + "name": "streaming", + "advanced": false, + "dynamic": false, + "info": "", + "type": "bool", + "list": false + }, + "tags": { + "required": false, + "placeholder": "", + "show": false, + "multiline": false, + "password": false, + "name": "tags", + "advanced": false, + "dynamic": false, + "info": "", + "type": "str", + "list": true + }, + "temperature": { + "required": false, + "placeholder": "", + "show": true, + "multiline": false, + "value": 0.7, + "password": false, + "name": "temperature", + "advanced": false, + "dynamic": false, + "info": "", + "type": "float", + "list": false + }, + "tiktoken_model_name": { + "required": false, + "placeholder": "", + "show": false, + "multiline": false, + "password": false, + "name": "tiktoken_model_name", + "advanced": false, + "dynamic": false, + "info": "", + "type": "str", + "list": false + }, + "verbose": { + "required": false, + "placeholder": "", + "show": false, + "multiline": false, + "value": false, + "password": false, + "name": "verbose", + "advanced": false, + "dynamic": false, + "info": "", + "type": "bool", + "list": false + }, + "_type": "ChatOpenAI" + }, + "description": "`OpenAI` Chat large language models API.", + "base_classes": [ + "BaseChatModel", + "ChatOpenAI", + "BaseLanguageModel", + "BaseLLM" + ], + "display_name": "ChatOpenAI", + "custom_fields": {}, + "output_types": [], + "documentation": "https://python.langchain.com/docs/modules/model_io/models/chat/integrations/openai", + "beta": false, + "error": null + }, + "id": "ChatOpenAI-2I57f" + }, + "selected": false, + "positionAbsolute": { + "x": 393.3551923753797, + "y": 1061.025177453298 + }, + "dragging": false + }, + { + "width": 384, + "height": 359, + "id": "ChatInput-207IY", + "type": "genericNode", + "position": { + "x": 415.1018926651509, + "y": 506.62736462360317 + }, + "data": { + "type": "ChatInput", + "node": { + "template": { + "code": { + "dynamic": true, + "required": true, + "placeholder": "", + "show": false, + "multiline": true, + "value": "from typing import Optional\nfrom langflow.custom import CustomComponent\n\n\nclass ChatInput(CustomComponent):\n display_name = \"Chat Input\"\n\n def build(self, message: Optional[str] = \"\") -> str:\n return message\n", + "password": false, + "name": "code", + "advanced": false, + "type": "code", + "list": false + }, + "_type": "CustomComponent", + "message": { + "required": false, + "placeholder": "", + "show": true, + "multiline": false, + "value": "", + "password": false, + "name": "message", + "display_name": "message", + "advanced": false, + "dynamic": false, + "info": "", + "type": "str", + "list": false + } + }, + "description": "Used to get user input from the chat.", + "base_classes": [ + "str" + ], + "display_name": "Chat Input", + "custom_fields": { + "message": null + }, + "output_types": [ + "ChatInput" + ], + "documentation": "", + "beta": true, + "error": null + }, + "id": "ChatInput-207IY" + }, + "positionAbsolute": { + "x": 415.1018926651509, + "y": 506.62736462360317 + } + }, + { + "width": 384, + "height": 389, + "id": "ChatOutput-1jlJy", + "type": "genericNode", + "position": { + "x": 2002.8008888732943, + "y": 926.1397178702218 + }, + "data": { + "type": "ChatOutput", + "node": { + "template": { + "code": { + "dynamic": true, + "required": true, + "placeholder": "", + "show": true, + "multiline": true, + "value": "from typing import Optional, Text\nfrom langflow.api.v1.schemas import ChatMessage\nfrom langflow.services.utils import get_chat_manager\nfrom langflow.custom import CustomComponent\nfrom anyio.from_thread import start_blocking_portal\nfrom loguru import logger\n\n\nclass ChatOutput(CustomComponent):\n display_name = \"Chat Output\"\n description = \"Used to send a message to the chat.\"\n\n field_config = {\n \"code\": {\n \"show\": False,\n }\n }\n\n def build_config(self):\n return {\"message\": {\"input_types\": [\"Text\"]}}\n\n def build(self, message: Optional[Text], is_ai: bool = False) -> Text:\n if not message:\n return \"\"\n try:\n chat_manager = get_chat_manager()\n chat_message = ChatMessage(message=message, is_bot=is_ai)\n # send_message is a coroutine\n # run in a thread safe manner\n with start_blocking_portal() as portal:\n portal.call(chat_manager.send_message, chat_message)\n chat_manager.chat_history.add_message(\n chat_manager.cache_manager.current_client_id, chat_message\n )\n except Exception as exc:\n logger.exception(exc)\n logger.debug(f\"Error sending message to chat: {exc}\")\n self.repr_value = message\n return message\n", + "password": false, + "name": "code", + "advanced": false, + "type": "code", + "list": false + }, + "_type": "CustomComponent", + "is_ai": { + "required": true, + "placeholder": "", + "show": true, + "multiline": false, + "value": true, + "password": false, + "name": "is_ai", + "display_name": "is_ai", + "advanced": false, + "dynamic": false, + "info": "", + "type": "bool", + "list": false + }, + "message": { + "required": false, + "placeholder": "", + "show": true, + "multiline": false, + "password": false, + "name": "message", + "display_name": "message", + "advanced": false, + "input_types": [ + "Text" + ], + "dynamic": false, + "info": "", + "type": "Text", + "list": false + } + }, + "description": "Used to send a message to the chat.", + "base_classes": [ + "str" + ], + "display_name": "Chat Output", + "custom_fields": { + "is_ai": null, + "message": null + }, + "output_types": [ + "ChatOutput" + ], + "documentation": "", + "beta": true, + "error": null + }, + "id": "ChatOutput-1jlJy" + }, + "selected": true, + "dragging": false, + "positionAbsolute": { + "x": 2002.8008888732943, + "y": 926.1397178702218 + } + } + ], + "edges": [ + { + "source": "PromptTemplate-IKKOx", + "sourceHandle": "PromptTemplate|PromptTemplate-IKKOx|BasePromptTemplate|PromptTemplate|StringPromptTemplate", + "target": "LLMChain-e2dhN", + "targetHandle": "BasePromptTemplate|prompt|LLMChain-e2dhN", + "style": { + "stroke": "#555" + }, + "className": "", + "animated": false, + "id": "reactflow__edge-PromptTemplate-IKKOxPromptTemplate|PromptTemplate-IKKOx|StringPromptTemplate|BasePromptTemplate|PromptTemplate-LLMChain-e2dhNBasePromptTemplate|prompt|LLMChain-e2dhN" + }, + { + "source": "ChatOpenAI-2I57f", + "sourceHandle": "ChatOpenAI|ChatOpenAI-2I57f|BaseChatModel|ChatOpenAI|BaseLanguageModel|BaseLLM", + "target": "LLMChain-e2dhN", + "targetHandle": "BaseLanguageModel|llm|LLMChain-e2dhN", + "style": { + "stroke": "#555" + }, + "className": "", + "animated": false, + "id": "reactflow__edge-ChatOpenAI-2I57fChatOpenAI|ChatOpenAI-2I57f|BaseChatModel|ChatOpenAI|BaseLanguageModel|BaseLLM-LLMChain-e2dhNBaseLanguageModel|llm|LLMChain-e2dhN" + }, + { + "source": "ChatInput-207IY", + "sourceHandle": "ChatInput|ChatInput-207IY|str", + "target": "PromptTemplate-IKKOx", + "targetHandle": "Document;BaseOutputParser;str|input|PromptTemplate-IKKOx", + "style": { + "stroke": "#555" + }, + "className": "", + "animated": false, + "id": "reactflow__edge-ChatInput-207IYChatInput|ChatInput-207IY|str-PromptTemplate-IKKOxDocument;BaseOutputParser;str|input|PromptTemplate-IKKOx" + }, + { + "source": "LLMChain-e2dhN", + "sourceHandle": "LLMChain|LLMChain-e2dhN|Chain|LLMChain|function|Text", + "target": "ChatOutput-1jlJy", + "targetHandle": "Text|message|ChatOutput-1jlJy", + "style": { + "stroke": "#555" + }, + "className": "stroke-foreground stroke-connection", + "animated": true, + "id": "reactflow__edge-LLMChain-e2dhNLLMChain|LLMChain-e2dhN|Chain|LLMChain|function|Text-ChatOutput-1jlJyText|message|ChatOutput-1jlJy" + } + ], + "viewport": { + "x": -141.98308184453367, + "y": -104.98637616656356, + "zoom": 0.4788209787464315 + } + }, + "id": "b3388ab9-b5dc-4447-b560-79caef40faa5", + "user_id": "c65bfea3-3eea-4e71-8fc4-106238eb0583" +} \ No newline at end of file diff --git a/tests/data/TwoOutputsTest.json b/tests/data/TwoOutputsTest.json index 9dfb5cd43..4cd060249 100644 --- a/tests/data/TwoOutputsTest.json +++ b/tests/data/TwoOutputsTest.json @@ -1 +1,1024 @@ -{"name":"TwoOutputsTest","description":"","data":{"nodes":[{"width":384,"height":359,"id":"PromptTemplate-CweKz","type":"genericNode","position":{"x":969.6448076246203,"y":528.7788853763968},"data":{"type":"PromptTemplate","node":{"template":{"output_parser":{"required":false,"placeholder":"","show":false,"multiline":false,"password":false,"name":"output_parser","advanced":false,"dynamic":false,"info":"","type":"BaseOutputParser","list":false},"input_variables":{"required":true,"placeholder":"","show":false,"multiline":false,"password":false,"name":"input_variables","advanced":false,"dynamic":false,"info":"","type":"str","list":true,"value":["input"]},"partial_variables":{"required":false,"placeholder":"","show":false,"multiline":false,"password":false,"name":"partial_variables","advanced":false,"dynamic":false,"info":"","type":"code","list":false},"template":{"required":true,"placeholder":"","show":true,"multiline":true,"password":false,"name":"template","advanced":false,"dynamic":false,"info":"","type":"prompt","list":false,"value":"Input: {input}\nAI:"},"template_format":{"required":false,"placeholder":"","show":false,"multiline":false,"value":"f-string","password":false,"name":"template_format","advanced":false,"dynamic":false,"info":"","type":"str","list":false},"validate_template":{"required":false,"placeholder":"","show":false,"multiline":false,"value":true,"password":false,"name":"validate_template","advanced":false,"dynamic":false,"info":"","type":"bool","list":false},"_type":"PromptTemplate","input":{"required":false,"placeholder":"","show":true,"multiline":true,"value":"","password":false,"name":"input","display_name":"input","advanced":false,"input_types":["Document","BaseOutputParser","str"],"dynamic":false,"info":"","type":"str","list":false}},"description":"A prompt template for a language model.","base_classes":["BasePromptTemplate","StringPromptTemplate","PromptTemplate"],"name":"","display_name":"PromptTemplate","documentation":"https://python.langchain.com/docs/modules/model_io/prompts/prompt_templates/","custom_fields":{"":["input"],"template":["input"]},"output_types":[],"field_formatters":{"formatters":{"openai_api_key":{}},"base_formatters":{"kwargs":{},"optional":{},"list":{},"dict":{},"union":{},"multiline":{},"show":{},"password":{},"default":{},"headers":{},"dict_code_file":{},"model_fields":{"MODEL_DICT":{"OpenAI":["text-davinci-003","text-davinci-002","text-curie-001","text-babbage-001","text-ada-001"],"ChatOpenAI":["gpt-3.5-turbo-0613","gpt-3.5-turbo","gpt-3.5-turbo-16k-0613","gpt-3.5-turbo-16k","gpt-4-0613","gpt-4-32k-0613","gpt-4","gpt-4-32k"],"Anthropic":["claude-v1","claude-v1-100k","claude-instant-v1","claude-instant-v1-100k","claude-v1.3","claude-v1.3-100k","claude-v1.2","claude-v1.0","claude-instant-v1.1","claude-instant-v1.1-100k","claude-instant-v1.0"],"ChatAnthropic":["claude-v1","claude-v1-100k","claude-instant-v1","claude-instant-v1-100k","claude-v1.3","claude-v1.3-100k","claude-v1.2","claude-v1.0","claude-instant-v1.1","claude-instant-v1.1-100k","claude-instant-v1.0"]}}}},"beta":false,"error":null},"id":"PromptTemplate-CweKz"},"selected":false,"positionAbsolute":{"x":969.6448076246203,"y":528.7788853763968}},{"width":384,"height":307,"id":"LLMChain-HUM6g","type":"genericNode","position":{"x":1515.3241458756393,"y":732.4536491407735},"data":{"type":"LLMChain","node":{"template":{"callbacks":{"required":false,"placeholder":"","show":false,"multiline":false,"password":false,"name":"callbacks","advanced":false,"dynamic":false,"info":"","type":"langchain.callbacks.base.BaseCallbackHandler","list":true},"llm":{"required":true,"placeholder":"","show":true,"multiline":false,"password":false,"name":"llm","advanced":false,"dynamic":false,"info":"","type":"BaseLanguageModel","list":false},"memory":{"required":false,"placeholder":"","show":true,"multiline":false,"password":false,"name":"memory","advanced":false,"dynamic":false,"info":"","type":"BaseMemory","list":false},"output_parser":{"required":false,"placeholder":"","show":false,"multiline":false,"password":false,"name":"output_parser","advanced":false,"dynamic":false,"info":"","type":"BaseLLMOutputParser","list":false},"prompt":{"required":true,"placeholder":"","show":true,"multiline":false,"password":false,"name":"prompt","advanced":false,"dynamic":false,"info":"","type":"BasePromptTemplate","list":false},"llm_kwargs":{"required":false,"placeholder":"","show":false,"multiline":false,"password":false,"name":"llm_kwargs","advanced":false,"dynamic":false,"info":"","type":"code","list":false},"metadata":{"required":false,"placeholder":"","show":false,"multiline":false,"password":false,"name":"metadata","advanced":false,"dynamic":false,"info":"","type":"code","list":false},"output_key":{"required":true,"placeholder":"","show":true,"multiline":false,"value":"text","password":false,"name":"output_key","advanced":true,"dynamic":false,"info":"","type":"str","list":false},"return_final_only":{"required":false,"placeholder":"","show":false,"multiline":false,"value":true,"password":false,"name":"return_final_only","advanced":false,"dynamic":false,"info":"","type":"bool","list":false},"tags":{"required":false,"placeholder":"","show":false,"multiline":false,"password":false,"name":"tags","advanced":false,"dynamic":false,"info":"","type":"str","list":true},"verbose":{"required":false,"placeholder":"","show":false,"multiline":false,"value":false,"password":false,"name":"verbose","advanced":true,"dynamic":false,"info":"","type":"bool","list":false},"_type":"LLMChain"},"description":"Chain to run queries against LLMs.","base_classes":["LLMChain","Chain","function","Text"],"display_name":"LLMChain","custom_fields":{},"output_types":[],"documentation":"https://python.langchain.com/docs/modules/chains/foundational/llm_chain","beta":false,"error":null},"id":"LLMChain-HUM6g"},"selected":false,"positionAbsolute":{"x":1515.3241458756393,"y":732.4536491407735},"dragging":false},{"width":384,"height":621,"id":"ChatOpenAI-02kOF","type":"genericNode","position":{"x":483,"y":942.8665628296949},"data":{"type":"ChatOpenAI","node":{"template":{"callbacks":{"required":false,"placeholder":"","show":false,"multiline":false,"password":false,"name":"callbacks","advanced":false,"dynamic":false,"info":"","type":"langchain.callbacks.base.BaseCallbackHandler","list":true},"cache":{"required":false,"placeholder":"","show":false,"multiline":false,"password":false,"name":"cache","advanced":false,"dynamic":false,"info":"","type":"bool","list":false},"client":{"required":false,"placeholder":"","show":false,"multiline":false,"password":false,"name":"client","advanced":false,"dynamic":false,"info":"","type":"Any","list":false},"max_retries":{"required":false,"placeholder":"","show":false,"multiline":false,"value":6,"password":false,"name":"max_retries","advanced":false,"dynamic":false,"info":"","type":"int","list":false},"max_tokens":{"required":false,"placeholder":"","show":true,"multiline":false,"password":true,"name":"max_tokens","advanced":false,"dynamic":false,"info":"","type":"int","list":false,"value":""},"metadata":{"required":false,"placeholder":"","show":false,"multiline":false,"password":false,"name":"metadata","advanced":false,"dynamic":false,"info":"","type":"code","list":false},"model_kwargs":{"required":false,"placeholder":"","show":true,"multiline":false,"password":false,"name":"model_kwargs","advanced":true,"dynamic":false,"info":"","type":"code","list":false},"model_name":{"required":false,"placeholder":"","show":true,"multiline":false,"value":"gpt-3.5-turbo-0613","password":false,"options":["gpt-3.5-turbo-0613","gpt-3.5-turbo","gpt-3.5-turbo-16k-0613","gpt-3.5-turbo-16k","gpt-4-0613","gpt-4-32k-0613","gpt-4","gpt-4-32k"],"name":"model_name","advanced":false,"dynamic":false,"info":"","type":"str","list":true},"n":{"required":false,"placeholder":"","show":false,"multiline":false,"value":1,"password":false,"name":"n","advanced":false,"dynamic":false,"info":"","type":"int","list":false},"openai_api_base":{"required":false,"placeholder":"","show":true,"multiline":false,"password":false,"name":"openai_api_base","display_name":"OpenAI API Base","advanced":false,"dynamic":false,"info":"\nThe base URL of the OpenAI API. Defaults to https://api.openai.com/v1.\n\nYou can change this to use other APIs like JinaChat, LocalAI and Prem.\n","type":"str","list":false},"openai_api_key":{"required":false,"placeholder":"","show":true,"multiline":false,"value":"","password":true,"name":"openai_api_key","display_name":"OpenAI API Key","advanced":false,"dynamic":false,"info":"","type":"str","list":false},"openai_organization":{"required":false,"placeholder":"","show":false,"multiline":false,"password":false,"name":"openai_organization","display_name":"OpenAI Organization","advanced":false,"dynamic":false,"info":"","type":"str","list":false},"openai_proxy":{"required":false,"placeholder":"","show":false,"multiline":false,"password":false,"name":"openai_proxy","display_name":"OpenAI Proxy","advanced":false,"dynamic":false,"info":"","type":"str","list":false},"request_timeout":{"required":false,"placeholder":"","show":false,"multiline":false,"password":false,"name":"request_timeout","advanced":false,"dynamic":false,"info":"","type":"float","list":false},"streaming":{"required":false,"placeholder":"","show":false,"multiline":false,"value":false,"password":false,"name":"streaming","advanced":false,"dynamic":false,"info":"","type":"bool","list":false},"tags":{"required":false,"placeholder":"","show":false,"multiline":false,"password":false,"name":"tags","advanced":false,"dynamic":false,"info":"","type":"str","list":true},"temperature":{"required":false,"placeholder":"","show":true,"multiline":false,"value":0.7,"password":false,"name":"temperature","advanced":false,"dynamic":false,"info":"","type":"float","list":false},"tiktoken_model_name":{"required":false,"placeholder":"","show":false,"multiline":false,"password":false,"name":"tiktoken_model_name","advanced":false,"dynamic":false,"info":"","type":"str","list":false},"verbose":{"required":false,"placeholder":"","show":false,"multiline":false,"value":false,"password":false,"name":"verbose","advanced":false,"dynamic":false,"info":"","type":"bool","list":false},"_type":"ChatOpenAI"},"description":"`OpenAI` Chat large language models API.","base_classes":["ChatOpenAI","BaseLanguageModel","BaseChatModel","BaseLLM"],"display_name":"ChatOpenAI","custom_fields":{},"output_types":[],"documentation":"https://python.langchain.com/docs/modules/model_io/models/chat/integrations/openai","beta":false,"error":null},"id":"ChatOpenAI-02kOF"},"selected":false,"positionAbsolute":{"x":483,"y":942.8665628296949}},{"width":384,"height":389,"id":"ChatOutput-8SWFf","type":"genericNode","position":{"x":2035.5749798606498,"y":651.0174452514373},"data":{"type":"ChatOutput","node":{"template":{"code":{"dynamic":true,"required":true,"placeholder":"","show":true,"multiline":true,"value":"from typing import Optional\nfrom langflow.api.v1.schemas import ChatMessage\nfrom langflow.services.utils import get_chat_manager\nfrom langflow import CustomComponent\nfrom anyio.from_thread import start_blocking_portal\nfrom loguru import logger\nfrom langflow.field_typing import Text\n\n\nclass ChatOutput(CustomComponent):\n display_name = \"Chat Output\"\n\n def build_config(self):\n return {\"message\": {\"input_types\": [\"str\"]}}\n\n def build(self, message: Optional[Text], is_ai: bool = False) -> Text:\n if not message:\n return \"\"\n try:\n chat_manager = get_chat_manager()\n chat_message = ChatMessage(message=message, is_bot=is_ai)\n # send_message is a coroutine\n # run in a thread safe manner\n with start_blocking_portal() as portal:\n portal.call(chat_manager.send_message, chat_message)\n chat_manager.chat_history.add_message(\n chat_manager.cache_manager.current_client_id, chat_message\n )\n except Exception as exc:\n logger.exception(exc)\n logger.debug(f\"Error sending message to chat: {exc}\")\n\n return message\n","password":false,"name":"code","advanced":false,"type":"code","list":false},"_type":"CustomComponent","is_ai":{"required":true,"placeholder":"","show":true,"multiline":false,"value":false,"password":false,"name":"is_ai","display_name":"is_ai","advanced":false,"dynamic":false,"info":"","type":"bool","list":false},"message":{"required":false,"placeholder":"","show":true,"multiline":false,"password":false,"name":"message","display_name":"message","advanced":false,"input_types":["Text"],"dynamic":false,"info":"","type":"Text","list":false}},"description":"Used to send a message to the chat.","base_classes":["str"],"display_name":"Chat Output","custom_fields":{"is_ai":null,"message":null},"output_types":["ChatOutput"],"documentation":"","beta":true,"error":null},"id":"ChatOutput-8SWFf"},"selected":false,"positionAbsolute":{"x":2035.5749798606498,"y":651.0174452514373}},{"width":384,"height":273,"id":"ChatInput-PqtHe","type":"genericNode","position":{"x":504.7467002897712,"y":388.46875},"data":{"type":"ChatInput","node":{"template":{"code":{"dynamic":true,"required":true,"placeholder":"","show":false,"multiline":true,"value":"from typing import Optional\nfrom langflow import CustomComponent\n\n\nclass ChatInput(CustomComponent):\n display_name = \"Chat Input\"\n\n def build(self, message: Optional[str] = \"\") -> str:\n return message\n","password":false,"name":"code","advanced":false,"type":"code","list":false},"_type":"CustomComponent","message":{"required":false,"placeholder":"","show":true,"multiline":false,"value":"","password":false,"name":"message","display_name":"message","advanced":false,"dynamic":false,"info":"","type":"str","list":false}},"description":"Used to get user input from the chat.","base_classes":["str"],"display_name":"Chat Input","custom_fields":{"message":null},"output_types":["ChatInput"],"documentation":"","beta":true,"error":null},"id":"ChatInput-PqtHe"},"selected":false,"positionAbsolute":{"x":504.7467002897712,"y":388.46875}},{"width":384,"height":475,"id":"Tool-jyI4N","type":"genericNode","position":{"x":2044.485030617051,"y":1131.4250055845532},"data":{"type":"Tool","node":{"template":{"func":{"required":true,"placeholder":"","show":true,"multiline":true,"password":false,"name":"func","advanced":false,"dynamic":false,"info":"","type":"function","list":false},"description":{"required":true,"placeholder":"","show":true,"multiline":true,"value":"Test tool","password":false,"name":"description","advanced":false,"dynamic":false,"info":"","type":"str","list":false},"name":{"required":true,"placeholder":"","show":true,"multiline":true,"value":"Tool","password":false,"name":"name","advanced":false,"dynamic":false,"info":"","type":"str","list":false},"return_direct":{"required":true,"placeholder":"","show":true,"multiline":false,"value":false,"password":false,"name":"return_direct","advanced":false,"dynamic":false,"info":"","type":"bool","list":false},"_type":"Tool"},"description":"Converts a chain, agent or function into a tool.","base_classes":["Tool","BaseTool"],"display_name":"Tool","custom_fields":{},"output_types":[],"documentation":"","beta":false,"error":null},"id":"Tool-jyI4N"},"selected":true,"positionAbsolute":{"x":2044.485030617051,"y":1131.4250055845532},"dragging":false}],"edges":[{"source":"PromptTemplate-CweKz","target":"LLMChain-HUM6g","sourceHandle":"PromptTemplate|PromptTemplate-CweKz|BasePromptTemplate|StringPromptTemplate|PromptTemplate","targetHandle":"BasePromptTemplate|prompt|LLMChain-HUM6g","id":"reactflow__edge-PromptTemplate-CweKzPromptTemplate|PromptTemplate-CweKz|BasePromptTemplate|StringPromptTemplate|PromptTemplate-LLMChain-HUM6gBasePromptTemplate|prompt|LLMChain-HUM6g","style":{"stroke":"#555"},"className":"stroke-gray-900 ","animated":false,"selected":false},{"source":"ChatOpenAI-02kOF","target":"LLMChain-HUM6g","sourceHandle":"ChatOpenAI|ChatOpenAI-02kOF|ChatOpenAI|BaseLanguageModel|BaseChatModel|BaseLLM","targetHandle":"BaseLanguageModel|llm|LLMChain-HUM6g","id":"reactflow__edge-ChatOpenAI-02kOFChatOpenAI|ChatOpenAI-02kOF|ChatOpenAI|BaseLanguageModel|BaseChatModel|BaseLLM-LLMChain-HUM6gBaseLanguageModel|llm|LLMChain-HUM6g","style":{"stroke":"#555"},"className":"stroke-gray-900 ","animated":false,"selected":false},{"source":"ChatInput-PqtHe","target":"PromptTemplate-CweKz","sourceHandle":"ChatInput|ChatInput-PqtHe|str","targetHandle":"Document;BaseOutputParser;str|input|PromptTemplate-CweKz","id":"reactflow__edge-ChatInput-PqtHeChatInput|ChatInput-PqtHe|str-PromptTemplate-CweKzDocument;BaseOutputParser;str|input|PromptTemplate-CweKz","style":{"stroke":"#555"},"className":"stroke-gray-900 ","animated":false,"selected":false},{"source":"LLMChain-HUM6g","sourceHandle":"LLMChain|LLMChain-HUM6g|LLMChain|Chain|function|Text","target":"ChatOutput-8SWFf","targetHandle":"Text|message|ChatOutput-8SWFf","style":{"stroke":"#555"},"className":"stroke-foreground stroke-connection","animated":true,"id":"reactflow__edge-LLMChain-HUM6gLLMChain|LLMChain-HUM6g|LLMChain|Chain|function|Text-ChatOutput-8SWFfText|message|ChatOutput-8SWFf"},{"source":"LLMChain-HUM6g","sourceHandle":"LLMChain|LLMChain-HUM6g|LLMChain|Chain|function|Text","target":"Tool-jyI4N","targetHandle":"function|func|Tool-jyI4N","style":{"stroke":"#555"},"className":"stroke-foreground stroke-connection","animated":false,"id":"reactflow__edge-LLMChain-HUM6gLLMChain|LLMChain-HUM6g|LLMChain|Chain|function|Text-Tool-jyI4Nfunction|func|Tool-jyI4N"}],"viewport":{"x":-401.32668426335044,"y":-129.59138346130635,"zoom":0.5073779796520557}},"id":"cf923ccb-e14c-4754-96eb-a8a3b5bbe082","user_id":"c65bfea3-3eea-4e71-8fc4-106238eb0583"} \ No newline at end of file +{ + "name": "TwoOutputsTest", + "description": "", + "data": { + "nodes": [ + { + "width": 384, + "height": 359, + "id": "PromptTemplate-CweKz", + "type": "genericNode", + "position": { + "x": 969.6448076246203, + "y": 528.7788853763968 + }, + "data": { + "type": "PromptTemplate", + "node": { + "template": { + "output_parser": { + "required": false, + "placeholder": "", + "show": false, + "multiline": false, + "password": false, + "name": "output_parser", + "advanced": false, + "dynamic": false, + "info": "", + "type": "BaseOutputParser", + "list": false + }, + "input_variables": { + "required": true, + "placeholder": "", + "show": false, + "multiline": false, + "password": false, + "name": "input_variables", + "advanced": false, + "dynamic": false, + "info": "", + "type": "str", + "list": true, + "value": [ + "input" + ] + }, + "partial_variables": { + "required": false, + "placeholder": "", + "show": false, + "multiline": false, + "password": false, + "name": "partial_variables", + "advanced": false, + "dynamic": false, + "info": "", + "type": "code", + "list": false + }, + "template": { + "required": true, + "placeholder": "", + "show": true, + "multiline": true, + "password": false, + "name": "template", + "advanced": false, + "dynamic": false, + "info": "", + "type": "prompt", + "list": false, + "value": "Input: {input}\nAI:" + }, + "template_format": { + "required": false, + "placeholder": "", + "show": false, + "multiline": false, + "value": "f-string", + "password": false, + "name": "template_format", + "advanced": false, + "dynamic": false, + "info": "", + "type": "str", + "list": false + }, + "validate_template": { + "required": false, + "placeholder": "", + "show": false, + "multiline": false, + "value": true, + "password": false, + "name": "validate_template", + "advanced": false, + "dynamic": false, + "info": "", + "type": "bool", + "list": false + }, + "_type": "PromptTemplate", + "input": { + "required": false, + "placeholder": "", + "show": true, + "multiline": true, + "value": "", + "password": false, + "name": "input", + "display_name": "input", + "advanced": false, + "input_types": [ + "Document", + "BaseOutputParser", + "str" + ], + "dynamic": false, + "info": "", + "type": "str", + "list": false + } + }, + "description": "A prompt template for a language model.", + "base_classes": [ + "BasePromptTemplate", + "StringPromptTemplate", + "PromptTemplate" + ], + "name": "", + "display_name": "PromptTemplate", + "documentation": "https://python.langchain.com/docs/modules/model_io/prompts/prompt_templates/", + "custom_fields": { + "": [ + "input" + ], + "template": [ + "input" + ] + }, + "output_types": [], + "field_formatters": { + "formatters": { + "openai_api_key": {} + }, + "base_formatters": { + "kwargs": {}, + "optional": {}, + "list": {}, + "dict": {}, + "union": {}, + "multiline": {}, + "show": {}, + "password": {}, + "default": {}, + "headers": {}, + "dict_code_file": {}, + "model_fields": { + "MODEL_DICT": { + "OpenAI": [ + "text-davinci-003", + "text-davinci-002", + "text-curie-001", + "text-babbage-001", + "text-ada-001" + ], + "ChatOpenAI": [ + "gpt-3.5-turbo-0613", + "gpt-3.5-turbo", + "gpt-3.5-turbo-16k-0613", + "gpt-3.5-turbo-16k", + "gpt-4-0613", + "gpt-4-32k-0613", + "gpt-4", + "gpt-4-32k" + ], + "Anthropic": [ + "claude-v1", + "claude-v1-100k", + "claude-instant-v1", + "claude-instant-v1-100k", + "claude-v1.3", + "claude-v1.3-100k", + "claude-v1.2", + "claude-v1.0", + "claude-instant-v1.1", + "claude-instant-v1.1-100k", + "claude-instant-v1.0" + ], + "ChatAnthropic": [ + "claude-v1", + "claude-v1-100k", + "claude-instant-v1", + "claude-instant-v1-100k", + "claude-v1.3", + "claude-v1.3-100k", + "claude-v1.2", + "claude-v1.0", + "claude-instant-v1.1", + "claude-instant-v1.1-100k", + "claude-instant-v1.0" + ] + } + } + } + }, + "beta": false, + "error": null + }, + "id": "PromptTemplate-CweKz" + }, + "selected": false, + "positionAbsolute": { + "x": 969.6448076246203, + "y": 528.7788853763968 + } + }, + { + "width": 384, + "height": 307, + "id": "LLMChain-HUM6g", + "type": "genericNode", + "position": { + "x": 1515.3241458756393, + "y": 732.4536491407735 + }, + "data": { + "type": "LLMChain", + "node": { + "template": { + "callbacks": { + "required": false, + "placeholder": "", + "show": false, + "multiline": false, + "password": false, + "name": "callbacks", + "advanced": false, + "dynamic": false, + "info": "", + "type": "langchain.callbacks.base.BaseCallbackHandler", + "list": true + }, + "llm": { + "required": true, + "placeholder": "", + "show": true, + "multiline": false, + "password": false, + "name": "llm", + "advanced": false, + "dynamic": false, + "info": "", + "type": "BaseLanguageModel", + "list": false + }, + "memory": { + "required": false, + "placeholder": "", + "show": true, + "multiline": false, + "password": false, + "name": "memory", + "advanced": false, + "dynamic": false, + "info": "", + "type": "BaseMemory", + "list": false + }, + "output_parser": { + "required": false, + "placeholder": "", + "show": false, + "multiline": false, + "password": false, + "name": "output_parser", + "advanced": false, + "dynamic": false, + "info": "", + "type": "BaseLLMOutputParser", + "list": false + }, + "prompt": { + "required": true, + "placeholder": "", + "show": true, + "multiline": false, + "password": false, + "name": "prompt", + "advanced": false, + "dynamic": false, + "info": "", + "type": "BasePromptTemplate", + "list": false + }, + "llm_kwargs": { + "required": false, + "placeholder": "", + "show": false, + "multiline": false, + "password": false, + "name": "llm_kwargs", + "advanced": false, + "dynamic": false, + "info": "", + "type": "code", + "list": false + }, + "metadata": { + "required": false, + "placeholder": "", + "show": false, + "multiline": false, + "password": false, + "name": "metadata", + "advanced": false, + "dynamic": false, + "info": "", + "type": "code", + "list": false + }, + "output_key": { + "required": true, + "placeholder": "", + "show": true, + "multiline": false, + "value": "text", + "password": false, + "name": "output_key", + "advanced": true, + "dynamic": false, + "info": "", + "type": "str", + "list": false + }, + "return_final_only": { + "required": false, + "placeholder": "", + "show": false, + "multiline": false, + "value": true, + "password": false, + "name": "return_final_only", + "advanced": false, + "dynamic": false, + "info": "", + "type": "bool", + "list": false + }, + "tags": { + "required": false, + "placeholder": "", + "show": false, + "multiline": false, + "password": false, + "name": "tags", + "advanced": false, + "dynamic": false, + "info": "", + "type": "str", + "list": true + }, + "verbose": { + "required": false, + "placeholder": "", + "show": false, + "multiline": false, + "value": false, + "password": false, + "name": "verbose", + "advanced": true, + "dynamic": false, + "info": "", + "type": "bool", + "list": false + }, + "_type": "LLMChain" + }, + "description": "Chain to run queries against LLMs.", + "base_classes": [ + "LLMChain", + "Chain", + "function", + "Text" + ], + "display_name": "LLMChain", + "custom_fields": {}, + "output_types": [], + "documentation": "https://python.langchain.com/docs/modules/chains/foundational/llm_chain", + "beta": false, + "error": null + }, + "id": "LLMChain-HUM6g" + }, + "selected": false, + "positionAbsolute": { + "x": 1515.3241458756393, + "y": 732.4536491407735 + }, + "dragging": false + }, + { + "width": 384, + "height": 621, + "id": "ChatOpenAI-02kOF", + "type": "genericNode", + "position": { + "x": 483, + "y": 942.8665628296949 + }, + "data": { + "type": "ChatOpenAI", + "node": { + "template": { + "callbacks": { + "required": false, + "placeholder": "", + "show": false, + "multiline": false, + "password": false, + "name": "callbacks", + "advanced": false, + "dynamic": false, + "info": "", + "type": "langchain.callbacks.base.BaseCallbackHandler", + "list": true + }, + "cache": { + "required": false, + "placeholder": "", + "show": false, + "multiline": false, + "password": false, + "name": "cache", + "advanced": false, + "dynamic": false, + "info": "", + "type": "bool", + "list": false + }, + "client": { + "required": false, + "placeholder": "", + "show": false, + "multiline": false, + "password": false, + "name": "client", + "advanced": false, + "dynamic": false, + "info": "", + "type": "Any", + "list": false + }, + "max_retries": { + "required": false, + "placeholder": "", + "show": false, + "multiline": false, + "value": 6, + "password": false, + "name": "max_retries", + "advanced": false, + "dynamic": false, + "info": "", + "type": "int", + "list": false + }, + "max_tokens": { + "required": false, + "placeholder": "", + "show": true, + "multiline": false, + "password": true, + "name": "max_tokens", + "advanced": false, + "dynamic": false, + "info": "", + "type": "int", + "list": false, + "value": "" + }, + "metadata": { + "required": false, + "placeholder": "", + "show": false, + "multiline": false, + "password": false, + "name": "metadata", + "advanced": false, + "dynamic": false, + "info": "", + "type": "code", + "list": false + }, + "model_kwargs": { + "required": false, + "placeholder": "", + "show": true, + "multiline": false, + "password": false, + "name": "model_kwargs", + "advanced": true, + "dynamic": false, + "info": "", + "type": "code", + "list": false + }, + "model_name": { + "required": false, + "placeholder": "", + "show": true, + "multiline": false, + "value": "gpt-3.5-turbo-0613", + "password": false, + "options": [ + "gpt-3.5-turbo-0613", + "gpt-3.5-turbo", + "gpt-3.5-turbo-16k-0613", + "gpt-3.5-turbo-16k", + "gpt-4-0613", + "gpt-4-32k-0613", + "gpt-4", + "gpt-4-32k" + ], + "name": "model_name", + "advanced": false, + "dynamic": false, + "info": "", + "type": "str", + "list": true + }, + "n": { + "required": false, + "placeholder": "", + "show": false, + "multiline": false, + "value": 1, + "password": false, + "name": "n", + "advanced": false, + "dynamic": false, + "info": "", + "type": "int", + "list": false + }, + "openai_api_base": { + "required": false, + "placeholder": "", + "show": true, + "multiline": false, + "password": false, + "name": "openai_api_base", + "display_name": "OpenAI API Base", + "advanced": false, + "dynamic": false, + "info": "\nThe base URL of the OpenAI API. Defaults to https://api.openai.com/v1.\n\nYou can change this to use other APIs like JinaChat, LocalAI and Prem.\n", + "type": "str", + "list": false + }, + "openai_api_key": { + "required": false, + "placeholder": "", + "show": true, + "multiline": false, + "value": "", + "password": true, + "name": "openai_api_key", + "display_name": "OpenAI API Key", + "advanced": false, + "dynamic": false, + "info": "", + "type": "str", + "list": false + }, + "openai_organization": { + "required": false, + "placeholder": "", + "show": false, + "multiline": false, + "password": false, + "name": "openai_organization", + "display_name": "OpenAI Organization", + "advanced": false, + "dynamic": false, + "info": "", + "type": "str", + "list": false + }, + "openai_proxy": { + "required": false, + "placeholder": "", + "show": false, + "multiline": false, + "password": false, + "name": "openai_proxy", + "display_name": "OpenAI Proxy", + "advanced": false, + "dynamic": false, + "info": "", + "type": "str", + "list": false + }, + "request_timeout": { + "required": false, + "placeholder": "", + "show": false, + "multiline": false, + "password": false, + "name": "request_timeout", + "advanced": false, + "dynamic": false, + "info": "", + "type": "float", + "list": false + }, + "streaming": { + "required": false, + "placeholder": "", + "show": false, + "multiline": false, + "value": false, + "password": false, + "name": "streaming", + "advanced": false, + "dynamic": false, + "info": "", + "type": "bool", + "list": false + }, + "tags": { + "required": false, + "placeholder": "", + "show": false, + "multiline": false, + "password": false, + "name": "tags", + "advanced": false, + "dynamic": false, + "info": "", + "type": "str", + "list": true + }, + "temperature": { + "required": false, + "placeholder": "", + "show": true, + "multiline": false, + "value": 0.7, + "password": false, + "name": "temperature", + "advanced": false, + "dynamic": false, + "info": "", + "type": "float", + "list": false + }, + "tiktoken_model_name": { + "required": false, + "placeholder": "", + "show": false, + "multiline": false, + "password": false, + "name": "tiktoken_model_name", + "advanced": false, + "dynamic": false, + "info": "", + "type": "str", + "list": false + }, + "verbose": { + "required": false, + "placeholder": "", + "show": false, + "multiline": false, + "value": false, + "password": false, + "name": "verbose", + "advanced": false, + "dynamic": false, + "info": "", + "type": "bool", + "list": false + }, + "_type": "ChatOpenAI" + }, + "description": "`OpenAI` Chat large language models API.", + "base_classes": [ + "ChatOpenAI", + "BaseLanguageModel", + "BaseChatModel", + "BaseLLM" + ], + "display_name": "ChatOpenAI", + "custom_fields": {}, + "output_types": [], + "documentation": "https://python.langchain.com/docs/modules/model_io/models/chat/integrations/openai", + "beta": false, + "error": null + }, + "id": "ChatOpenAI-02kOF" + }, + "selected": false, + "positionAbsolute": { + "x": 483, + "y": 942.8665628296949 + } + }, + { + "width": 384, + "height": 389, + "id": "ChatOutput-8SWFf", + "type": "genericNode", + "position": { + "x": 2035.5749798606498, + "y": 651.0174452514373 + }, + "data": { + "type": "ChatOutput", + "node": { + "template": { + "code": { + "dynamic": true, + "required": true, + "placeholder": "", + "show": true, + "multiline": true, + "value": "from typing import Optional\nfrom langflow.api.v1.schemas import ChatMessage\nfrom langflow.services.utils import get_chat_manager\nfrom langflow.custom import CustomComponent\nfrom anyio.from_thread import start_blocking_portal\nfrom loguru import logger\nfrom langflow.field_typing import Text\n\n\nclass ChatOutput(CustomComponent):\n display_name = \"Chat Output\"\n\n def build_config(self):\n return {\"message\": {\"input_types\": [\"str\"]}}\n\n def build(self, message: Optional[Text], is_ai: bool = False) -> Text:\n if not message:\n return \"\"\n try:\n chat_manager = get_chat_manager()\n chat_message = ChatMessage(message=message, is_bot=is_ai)\n # send_message is a coroutine\n # run in a thread safe manner\n with start_blocking_portal() as portal:\n portal.call(chat_manager.send_message, chat_message)\n chat_manager.chat_history.add_message(\n chat_manager.cache_manager.current_client_id, chat_message\n )\n except Exception as exc:\n logger.exception(exc)\n logger.debug(f\"Error sending message to chat: {exc}\")\n\n return message\n", + "password": false, + "name": "code", + "advanced": false, + "type": "code", + "list": false + }, + "_type": "CustomComponent", + "is_ai": { + "required": true, + "placeholder": "", + "show": true, + "multiline": false, + "value": false, + "password": false, + "name": "is_ai", + "display_name": "is_ai", + "advanced": false, + "dynamic": false, + "info": "", + "type": "bool", + "list": false + }, + "message": { + "required": false, + "placeholder": "", + "show": true, + "multiline": false, + "password": false, + "name": "message", + "display_name": "message", + "advanced": false, + "input_types": [ + "Text" + ], + "dynamic": false, + "info": "", + "type": "Text", + "list": false + } + }, + "description": "Used to send a message to the chat.", + "base_classes": [ + "str" + ], + "display_name": "Chat Output", + "custom_fields": { + "is_ai": null, + "message": null + }, + "output_types": [ + "ChatOutput" + ], + "documentation": "", + "beta": true, + "error": null + }, + "id": "ChatOutput-8SWFf" + }, + "selected": false, + "positionAbsolute": { + "x": 2035.5749798606498, + "y": 651.0174452514373 + } + }, + { + "width": 384, + "height": 273, + "id": "ChatInput-PqtHe", + "type": "genericNode", + "position": { + "x": 504.7467002897712, + "y": 388.46875 + }, + "data": { + "type": "ChatInput", + "node": { + "template": { + "code": { + "dynamic": true, + "required": true, + "placeholder": "", + "show": false, + "multiline": true, + "value": "from typing import Optional\nfrom langflow.custom import CustomComponent\n\n\nclass ChatInput(CustomComponent):\n display_name = \"Chat Input\"\n\n def build(self, message: Optional[str] = \"\") -> str:\n return message\n", + "password": false, + "name": "code", + "advanced": false, + "type": "code", + "list": false + }, + "_type": "CustomComponent", + "message": { + "required": false, + "placeholder": "", + "show": true, + "multiline": false, + "value": "", + "password": false, + "name": "message", + "display_name": "message", + "advanced": false, + "dynamic": false, + "info": "", + "type": "str", + "list": false + } + }, + "description": "Used to get user input from the chat.", + "base_classes": [ + "str" + ], + "display_name": "Chat Input", + "custom_fields": { + "message": null + }, + "output_types": [ + "ChatInput" + ], + "documentation": "", + "beta": true, + "error": null + }, + "id": "ChatInput-PqtHe" + }, + "selected": false, + "positionAbsolute": { + "x": 504.7467002897712, + "y": 388.46875 + } + }, + { + "width": 384, + "height": 475, + "id": "Tool-jyI4N", + "type": "genericNode", + "position": { + "x": 2044.485030617051, + "y": 1131.4250055845532 + }, + "data": { + "type": "Tool", + "node": { + "template": { + "func": { + "required": true, + "placeholder": "", + "show": true, + "multiline": true, + "password": false, + "name": "func", + "advanced": false, + "dynamic": false, + "info": "", + "type": "function", + "list": false + }, + "description": { + "required": true, + "placeholder": "", + "show": true, + "multiline": true, + "value": "Test tool", + "password": false, + "name": "description", + "advanced": false, + "dynamic": false, + "info": "", + "type": "str", + "list": false + }, + "name": { + "required": true, + "placeholder": "", + "show": true, + "multiline": true, + "value": "Tool", + "password": false, + "name": "name", + "advanced": false, + "dynamic": false, + "info": "", + "type": "str", + "list": false + }, + "return_direct": { + "required": true, + "placeholder": "", + "show": true, + "multiline": false, + "value": false, + "password": false, + "name": "return_direct", + "advanced": false, + "dynamic": false, + "info": "", + "type": "bool", + "list": false + }, + "_type": "Tool" + }, + "description": "Converts a chain, agent or function into a tool.", + "base_classes": [ + "Tool", + "BaseTool" + ], + "display_name": "Tool", + "custom_fields": {}, + "output_types": [], + "documentation": "", + "beta": false, + "error": null + }, + "id": "Tool-jyI4N" + }, + "selected": true, + "positionAbsolute": { + "x": 2044.485030617051, + "y": 1131.4250055845532 + }, + "dragging": false + } + ], + "edges": [ + { + "source": "PromptTemplate-CweKz", + "target": "LLMChain-HUM6g", + "sourceHandle": "PromptTemplate|PromptTemplate-CweKz|BasePromptTemplate|StringPromptTemplate|PromptTemplate", + "targetHandle": "BasePromptTemplate|prompt|LLMChain-HUM6g", + "id": "reactflow__edge-PromptTemplate-CweKzPromptTemplate|PromptTemplate-CweKz|BasePromptTemplate|StringPromptTemplate|PromptTemplate-LLMChain-HUM6gBasePromptTemplate|prompt|LLMChain-HUM6g", + "style": { + "stroke": "#555" + }, + "className": "stroke-gray-900 ", + "animated": false, + "selected": false + }, + { + "source": "ChatOpenAI-02kOF", + "target": "LLMChain-HUM6g", + "sourceHandle": "ChatOpenAI|ChatOpenAI-02kOF|ChatOpenAI|BaseLanguageModel|BaseChatModel|BaseLLM", + "targetHandle": "BaseLanguageModel|llm|LLMChain-HUM6g", + "id": "reactflow__edge-ChatOpenAI-02kOFChatOpenAI|ChatOpenAI-02kOF|ChatOpenAI|BaseLanguageModel|BaseChatModel|BaseLLM-LLMChain-HUM6gBaseLanguageModel|llm|LLMChain-HUM6g", + "style": { + "stroke": "#555" + }, + "className": "stroke-gray-900 ", + "animated": false, + "selected": false + }, + { + "source": "ChatInput-PqtHe", + "target": "PromptTemplate-CweKz", + "sourceHandle": "ChatInput|ChatInput-PqtHe|str", + "targetHandle": "Document;BaseOutputParser;str|input|PromptTemplate-CweKz", + "id": "reactflow__edge-ChatInput-PqtHeChatInput|ChatInput-PqtHe|str-PromptTemplate-CweKzDocument;BaseOutputParser;str|input|PromptTemplate-CweKz", + "style": { + "stroke": "#555" + }, + "className": "stroke-gray-900 ", + "animated": false, + "selected": false + }, + { + "source": "LLMChain-HUM6g", + "sourceHandle": "LLMChain|LLMChain-HUM6g|LLMChain|Chain|function|Text", + "target": "ChatOutput-8SWFf", + "targetHandle": "Text|message|ChatOutput-8SWFf", + "style": { + "stroke": "#555" + }, + "className": "stroke-foreground stroke-connection", + "animated": true, + "id": "reactflow__edge-LLMChain-HUM6gLLMChain|LLMChain-HUM6g|LLMChain|Chain|function|Text-ChatOutput-8SWFfText|message|ChatOutput-8SWFf" + }, + { + "source": "LLMChain-HUM6g", + "sourceHandle": "LLMChain|LLMChain-HUM6g|LLMChain|Chain|function|Text", + "target": "Tool-jyI4N", + "targetHandle": "function|func|Tool-jyI4N", + "style": { + "stroke": "#555" + }, + "className": "stroke-foreground stroke-connection", + "animated": false, + "id": "reactflow__edge-LLMChain-HUM6gLLMChain|LLMChain-HUM6g|LLMChain|Chain|function|Text-Tool-jyI4Nfunction|func|Tool-jyI4N" + } + ], + "viewport": { + "x": -401.32668426335044, + "y": -129.59138346130635, + "zoom": 0.5073779796520557 + } + }, + "id": "cf923ccb-e14c-4754-96eb-a8a3b5bbe082", + "user_id": "c65bfea3-3eea-4e71-8fc4-106238eb0583" +} \ No newline at end of file diff --git a/tests/data/component.py b/tests/data/component.py index e801d2feb..5de63fcd5 100644 --- a/tests/data/component.py +++ b/tests/data/component.py @@ -1,6 +1,6 @@ import random -from langflow import CustomComponent +from langflow.custom import CustomComponent class TestComponent(CustomComponent): diff --git a/tests/data/component_with_templatefield.py b/tests/data/component_with_templatefield.py index 6b2ce011b..26d7e834b 100644 --- a/tests/data/component_with_templatefield.py +++ b/tests/data/component_with_templatefield.py @@ -1,6 +1,6 @@ import random -from langflow import CustomComponent +from langflow.custom import CustomComponent from langflow.field_typing import TemplateField