diff --git a/.devcontainer/devcontainer.json b/.devcontainer/devcontainer.json index 90966fb38..ab0ccf145 100644 --- a/.devcontainer/devcontainer.json +++ b/.devcontainer/devcontainer.json @@ -15,7 +15,7 @@ // "forwardPorts": [], // Use 'postCreateCommand' to run commands after the container is created. - "postCreateCommand": "make install_frontend && make install_backend", + "postCreateCommand": "make setup_devcontainer", "containerEnv": { "POETRY_VIRTUALENVS_IN_PROJECT": "true" @@ -31,11 +31,13 @@ "sourcery.sourcery", "eamodio.gitlens", "ms-vscode.makefile-tools", - "GitHub.vscode-pull-request-github" + "GitHub.vscode-pull-request-github", + "Codium.codium", + "ms-azuretools.vscode-docker" ] } } // Uncomment to connect as root instead. More info: https://aka.ms/dev-containers-non-root. // "remoteUser": "root" -} +} \ No newline at end of file diff --git a/.github/workflows/lint.yml b/.github/workflows/lint.yml index 3ec6881ff..3d8b497b0 100644 --- a/.github/workflows/lint.yml +++ b/.github/workflows/lint.yml @@ -15,7 +15,7 @@ on: - "pyproject.toml" env: - POETRY_VERSION: "1.4.0" + POETRY_VERSION: "1.7.0" jobs: lint: diff --git a/Dockerfile b/Dockerfile index 520c407de..346348c0a 100644 --- a/Dockerfile +++ b/Dockerfile @@ -11,5 +11,5 @@ WORKDIR $HOME/app COPY --chown=user . $HOME/app -RUN pip install langflow>==0.0.86 -U --user +RUN pip install langflow>==0.5.0 -U --user CMD ["python", "-m", "langflow", "run", "--host", "0.0.0.0", "--port", "7860"] diff --git a/Makefile b/Makefile index 31198a982..41319e0e3 100644 --- a/Makefile +++ b/Makefile @@ -49,15 +49,16 @@ run_frontend: cd src/frontend && npm start run_cli: - poetry run langflow run --path src/frontend/build + poetry run langflow --path src/frontend/build run_cli_debug: - poetry run langflow run --path src/frontend/build --log-level debug + poetry run langflow --path src/frontend/build --log-level debug setup_devcontainer: make init make build_frontend - poetry run langflow --path src/frontend/build + @echo 'Run Cli' + make run_cli frontend: @-make install_frontend || (echo "An error occurred while installing frontend dependencies. Attempting to fix." && make install_frontendc) diff --git a/base.Dockerfile b/base.Dockerfile index c76bbbcda..ff3b95ee5 100644 --- a/base.Dockerfile +++ b/base.Dockerfile @@ -23,7 +23,7 @@ ENV PYTHONUNBUFFERED=1 \ \ # poetry # https://python-poetry.org/docs/configuration/#using-environment-variables - POETRY_VERSION=1.5.1 \ + POETRY_VERSION=1.7 \ # make poetry install to this location POETRY_HOME="/opt/poetry" \ # make poetry create the virtual environment in the project's root diff --git a/docker_example/Dockerfile b/docker_example/Dockerfile index 1b713c3a0..346348c0a 100644 --- a/docker_example/Dockerfile +++ b/docker_example/Dockerfile @@ -1,14 +1,15 @@ FROM python:3.10-slim -RUN apt-get update && apt-get install gcc g++ git make -y +RUN apt-get update && apt-get install gcc g++ git make -y && apt-get clean \ + && rm -rf /var/lib/apt/lists/* RUN useradd -m -u 1000 user USER user ENV HOME=/home/user \ - PATH=/home/user/.local/bin:$PATH + PATH=/home/user/.local/bin:$PATH WORKDIR $HOME/app COPY --chown=user . $HOME/app -RUN pip install langflow>==0.0.71 -U --user -CMD ["langflow", "--host", "0.0.0.0", "--port", "7860"] +RUN pip install langflow>==0.5.0 -U --user +CMD ["python", "-m", "langflow", "run", "--host", "0.0.0.0", "--port", "7860"] diff --git a/docker_example/docker-compose.yml b/docker_example/docker-compose.yml index ffb033104..da68b4471 100644 --- a/docker_example/docker-compose.yml +++ b/docker_example/docker-compose.yml @@ -7,4 +7,4 @@ services: dockerfile: Dockerfile ports: - "7860:7860" - command: langflow --host 0.0.0.0 + command: langflow run --host 0.0.0.0 diff --git a/docs/docs/components/embeddings.mdx b/docs/docs/components/embeddings.mdx index 5b134f08d..1b7ca1dbe 100644 --- a/docs/docs/components/embeddings.mdx +++ b/docs/docs/components/embeddings.mdx @@ -12,6 +12,22 @@ Embeddings are vector representations of text that capture the semantic meaning --- +### BedrockEmbeddings + +Used to load [Amazon Bedrocks’s](https://aws.amazon.com/bedrock/) embedding models. + +**Params** + +- **credentials_profile_name:** The name of the profile in the ~/.aws/credentials or ~/.aws/config files, which has either access keys or role information specified. If not specified, the default credential profile or, if on an EC2 instance, credentials from IMDS will be used. See [the AWS documentation](https://boto3.amazonaws.com/v1/documentation/api/latest/guide/credentials.html) for more details. + +- **model_id:** Id of the model to call, e.g., amazon.titan-embed-text-v1, this is equivalent to the modelId property in the list-foundation-models api. + +- **endpoint_url:** Needed if you don’t want to default to us-east-1 endpoint. + +- **region_name:** The aws region e.g., us-west-2. Fallsback to AWS_DEFAULT_REGION env variable or region specified in ~/.aws/config in case it is not provided here. + +--- + ### CohereEmbeddings Used to load [Cohere’s](https://cohere.com/) embedding models. diff --git a/docs/docs/guidelines/components.mdx b/docs/docs/guidelines/components.mdx index b7dadcfce..7188bf1e0 100644 --- a/docs/docs/guidelines/components.mdx +++ b/docs/docs/guidelines/components.mdx @@ -5,7 +5,7 @@ import ReactPlayer from "react-player"; # Component -Components are the building blocks of the flows. They are made of inputs, outputs, and parameters that define their functionality, providing a convenient and straightforward way to compose LLM-based applications. Learn more about components and how they work in the LangChain [documentation](https://docs.langchain.com/docs/category/components) section. +Components are the building blocks of the flows. They are made of inputs, outputs, and parameters that define their functionality, providing a convenient and straightforward way to compose LLM-based applications. Learn more about components and how they work in the LangChain [documentation](https://python.langchain.com/docs/integrations/components) section. ### Component's Features diff --git a/docs/docusaurus.config.js b/docs/docusaurus.config.js index 617aec3d0..538180ccd 100644 --- a/docs/docusaurus.config.js +++ b/docs/docusaurus.config.js @@ -31,7 +31,7 @@ module.exports = { [ remarkCodeHike, { - theme: "github-light", + theme: "github-dark", showCopyButton: true, lineNumbers: true, }, @@ -112,8 +112,10 @@ module.exports = { }, colorMode: { defaultMode: "light", - disableSwitch: true, - respectPrefersColorScheme: false, + /* Allow users to chose light or dark mode. */ + disableSwitch: false, + /* Respect user preferences, such as low light mode in the evening */ + respectPrefersColorScheme: true, }, announcementBar: { content: diff --git a/poetry.lock b/poetry.lock index b8f9dd84a..e7f0ae2ac 100644 --- a/poetry.lock +++ b/poetry.lock @@ -180,15 +180,26 @@ files = [ [package.dependencies] vine = ">=5.0.0,<6.0.0" +[[package]] +name = "annotated-types" +version = "0.6.0" +description = "Reusable constraint types to use with typing.Annotated" +optional = false +python-versions = ">=3.8" +files = [ + {file = "annotated_types-0.6.0-py3-none-any.whl", hash = "sha256:0641064de18ba7a25dee8f96403ebc39113d0cb953a01429249d5c7564666a43"}, + {file = "annotated_types-0.6.0.tar.gz", hash = "sha256:563339e807e53ffd9c267e99fc6d9ea23eb8443c08f112651963e24e22f84a5d"}, +] + [[package]] name = "anthropic" -version = "0.3.11" +version = "0.5.0" description = "Client library for the anthropic API" optional = false -python-versions = ">=3.7,<4.0" +python-versions = ">=3.7" files = [ - {file = "anthropic-0.3.11-py3-none-any.whl", hash = "sha256:5c81105cd9ee7388bff3fdb739aaddedc83bbae9b95d51c2d50c13b1ad106138"}, - {file = "anthropic-0.3.11.tar.gz", hash = "sha256:2e0fa5351c9b368cbed0bbd7217deaa9409b82b56afaf244e2196e99eb4fe20e"}, + {file = "anthropic-0.5.0-py3-none-any.whl", hash = "sha256:61a774b57252831bff80636f351a74ef0e8a727a70a46dcddab9a62e3b00ecb2"}, + {file = "anthropic-0.5.0.tar.gz", hash = "sha256:b7961cf3ff930698d6c1e11f3ad5d193c0623d3b4c607fbf5f23bcf9a17fa6a6"}, ] [package.dependencies] @@ -220,17 +231,6 @@ doc = ["Sphinx", "packaging", "sphinx-autodoc-typehints (>=1.2.0)", "sphinx-rtd- test = ["anyio[trio]", "coverage[toml] (>=4.5)", "hypothesis (>=4.0)", "mock (>=4)", "psutil (>=5.9)", "pytest (>=7.0)", "pytest-mock (>=3.6.1)", "trustme", "uvloop (>=0.17)"] trio = ["trio (<0.22)"] -[[package]] -name = "appdirs" -version = "1.4.4" -description = "A small Python module for determining appropriate platform-specific dirs, e.g. a \"user data dir\"." -optional = false -python-versions = "*" -files = [ - {file = "appdirs-1.4.4-py2.py3-none-any.whl", hash = "sha256:a841dacd6b99318a741b166adb07e19ee71a274450e68237b4650ca1055ab128"}, - {file = "appdirs-1.4.4.tar.gz", hash = "sha256:7d5d0167b2b1ba821647616af46a749d1c653740dd0d2415100fe26e27afdf41"}, -] - [[package]] name = "appnope" version = "0.1.3" @@ -421,6 +421,47 @@ files = [ {file = "blinker-1.7.0.tar.gz", hash = "sha256:e6820ff6fa4e4d1d8e2747c2283749c3f547e4fee112b98555cdcdae32996182"}, ] +[[package]] +name = "boto3" +version = "1.29.0" +description = "The AWS SDK for Python" +optional = false +python-versions = ">= 3.7" +files = [ + {file = "boto3-1.29.0-py3-none-any.whl", hash = "sha256:91c72fa4848eda9311c273db667946bd9d953285ae8d54b7bbad541b74adc254"}, + {file = "boto3-1.29.0.tar.gz", hash = "sha256:3e90ea2faa3e9892b9140f857911f9ef0013192a106f50d0ec7b71e8d1afc90a"}, +] + +[package.dependencies] +botocore = ">=1.32.0,<1.33.0" +jmespath = ">=0.7.1,<2.0.0" +s3transfer = ">=0.7.0,<0.8.0" + +[package.extras] +crt = ["botocore[crt] (>=1.21.0,<2.0a0)"] + +[[package]] +name = "botocore" +version = "1.32.0" +description = "Low-level, data-driven core of boto 3." +optional = false +python-versions = ">= 3.7" +files = [ + {file = "botocore-1.32.0-py3-none-any.whl", hash = "sha256:9c1e143feb6a04235cec342d2acb31a0f44df3c89f309f839e03e38a75f3f44e"}, + {file = "botocore-1.32.0.tar.gz", hash = "sha256:95fe3357b9ddc4559941dbea0f0a6b8fc043305f013b7ae2a85dff0c3b36ee92"}, +] + +[package.dependencies] +jmespath = ">=0.7.1,<2.0.0" +python-dateutil = ">=2.1,<3.0.0" +urllib3 = [ + {version = ">=1.25.4,<1.27", markers = "python_version < \"3.10\""}, + {version = ">=1.25.4,<2.1", markers = "python_version >= \"3.10\""}, +] + +[package.extras] +crt = ["awscrt (==0.19.12)"] + [[package]] name = "brotli" version = "1.1.0" @@ -765,32 +806,70 @@ files = [ {file = "charset_normalizer-3.3.2-py3-none-any.whl", hash = "sha256:3e4d1f6587322d2788836a99c69062fbb091331ec940e02d12d179c1d53e25fc"}, ] +[[package]] +name = "chroma-hnswlib" +version = "0.7.3" +description = "Chromas fork of hnswlib" +optional = false +python-versions = "*" +files = [ + {file = "chroma-hnswlib-0.7.3.tar.gz", hash = "sha256:b6137bedde49fffda6af93b0297fe00429fc61e5a072b1ed9377f909ed95a932"}, + {file = "chroma_hnswlib-0.7.3-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:59d6a7c6f863c67aeb23e79a64001d537060b6995c3eca9a06e349ff7b0998ca"}, + {file = "chroma_hnswlib-0.7.3-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:d71a3f4f232f537b6152947006bd32bc1629a8686df22fd97777b70f416c127a"}, + {file = "chroma_hnswlib-0.7.3-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:1c92dc1ebe062188e53970ba13f6b07e0ae32e64c9770eb7f7ffa83f149d4210"}, + {file = "chroma_hnswlib-0.7.3-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:49da700a6656fed8753f68d44b8cc8ae46efc99fc8a22a6d970dc1697f49b403"}, + {file = "chroma_hnswlib-0.7.3-cp310-cp310-win_amd64.whl", hash = "sha256:108bc4c293d819b56476d8f7865803cb03afd6ca128a2a04d678fffc139af029"}, + {file = "chroma_hnswlib-0.7.3-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:11e7ca93fb8192214ac2b9c0943641ac0daf8f9d4591bb7b73be808a83835667"}, + {file = "chroma_hnswlib-0.7.3-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:6f552e4d23edc06cdeb553cdc757d2fe190cdeb10d43093d6a3319f8d4bf1c6b"}, + {file = "chroma_hnswlib-0.7.3-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:f96f4d5699e486eb1fb95849fe35ab79ab0901265805be7e60f4eaa83ce263ec"}, + {file = "chroma_hnswlib-0.7.3-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:368e57fe9ebae05ee5844840fa588028a023d1182b0cfdb1d13f607c9ea05756"}, + {file = "chroma_hnswlib-0.7.3-cp311-cp311-win_amd64.whl", hash = "sha256:b7dca27b8896b494456db0fd705b689ac6b73af78e186eb6a42fea2de4f71c6f"}, + {file = "chroma_hnswlib-0.7.3-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:70f897dc6218afa1d99f43a9ad5eb82f392df31f57ff514ccf4eeadecd62f544"}, + {file = "chroma_hnswlib-0.7.3-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:5aef10b4952708f5a1381c124a29aead0c356f8d7d6e0b520b778aaa62a356f4"}, + {file = "chroma_hnswlib-0.7.3-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:7ee2d8d1529fca3898d512079144ec3e28a81d9c17e15e0ea4665697a7923253"}, + {file = "chroma_hnswlib-0.7.3-cp37-cp37m-win_amd64.whl", hash = "sha256:a4021a70e898783cd6f26e00008b494c6249a7babe8774e90ce4766dd288c8ba"}, + {file = "chroma_hnswlib-0.7.3-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:a8f61fa1d417fda848e3ba06c07671f14806a2585272b175ba47501b066fe6b1"}, + {file = "chroma_hnswlib-0.7.3-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:d7563be58bc98e8f0866907368e22ae218d6060601b79c42f59af4eccbbd2e0a"}, + {file = "chroma_hnswlib-0.7.3-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:51b8d411486ee70d7b66ec08cc8b9b6620116b650df9c19076d2d8b6ce2ae914"}, + {file = "chroma_hnswlib-0.7.3-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:9d706782b628e4f43f1b8a81e9120ac486837fbd9bcb8ced70fe0d9b95c72d77"}, + {file = "chroma_hnswlib-0.7.3-cp38-cp38-win_amd64.whl", hash = "sha256:54f053dedc0e3ba657f05fec6e73dd541bc5db5b09aa8bc146466ffb734bdc86"}, + {file = "chroma_hnswlib-0.7.3-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:e607c5a71c610a73167a517062d302c0827ccdd6e259af6e4869a5c1306ffb5d"}, + {file = "chroma_hnswlib-0.7.3-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:c2358a795870156af6761890f9eb5ca8cade57eb10c5f046fe94dae1faa04b9e"}, + {file = "chroma_hnswlib-0.7.3-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:7cea425df2e6b8a5e201fff0d922a1cc1d165b3cfe762b1408075723c8892218"}, + {file = "chroma_hnswlib-0.7.3-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:454df3dd3e97aa784fba7cf888ad191e0087eef0fd8c70daf28b753b3b591170"}, + {file = "chroma_hnswlib-0.7.3-cp39-cp39-win_amd64.whl", hash = "sha256:df587d15007ca701c6de0ee7d5585dd5e976b7edd2b30ac72bc376b3c3f85882"}, +] + +[package.dependencies] +numpy = "*" + [[package]] name = "chromadb" -version = "0.3.26" +version = "0.4.13" description = "Chroma." optional = false python-versions = ">=3.7" files = [ - {file = "chromadb-0.3.26-py3-none-any.whl", hash = "sha256:45a7848ee3ed8b694ca5789e5fd723406b76a13fa46f9a9a769f93317f29894c"}, - {file = "chromadb-0.3.26.tar.gz", hash = "sha256:a9b596d507f081993f2e32a7dcacabbbec2f6aebc2b6defe524442b07e265296"}, + {file = "chromadb-0.4.13-py3-none-any.whl", hash = "sha256:6959dc4aaa6278c7491dd1911724981a0e46816b19e9f86945b9bd875e6a252a"}, + {file = "chromadb-0.4.13.tar.gz", hash = "sha256:99d330b9ac8f2ec81f4b34798d34f2ea9f4656bef1da951efa7e93957ef7e706"}, ] [package.dependencies] -clickhouse-connect = ">=0.5.7" -duckdb = ">=0.7.1" -fastapi = ">=0.85.1" -hnswlib = ">=0.7" -numpy = ">=1.21.6" +bcrypt = ">=4.0.1" +chroma-hnswlib = "0.7.3" +fastapi = ">=0.95.2" +importlib-resources = "*" +numpy = {version = ">=1.22.5", markers = "python_version >= \"3.8\""} onnxruntime = ">=1.14.1" overrides = ">=7.3.1" -pandas = ">=1.3" posthog = ">=2.4.0" pulsar-client = ">=3.1.0" pydantic = ">=1.9" +pypika = ">=0.48.9" requests = ">=2.28" tokenizers = ">=0.13.2" tqdm = ">=4.65.0" +typer = ">=0.9.0" typing-extensions = ">=4.5.0" uvicorn = {version = ">=0.18.3", extras = ["standard"]} @@ -857,109 +936,6 @@ prompt-toolkit = ">=3.0.36" [package.extras] testing = ["pytest (>=7.2.1)", "pytest-cov (>=4.0.0)", "tox (>=4.4.3)"] -[[package]] -name = "clickhouse-connect" -version = "0.6.20" -description = "ClickHouse Database Core Driver for Python, Pandas, and Superset" -optional = false -python-versions = "~=3.7" -files = [ - {file = "clickhouse-connect-0.6.20.tar.gz", hash = "sha256:4448c8bbebd9f994faa507bf0db1d41ca1e2c3d9aed5d52f7012283f70bda83a"}, - {file = "clickhouse_connect-0.6.20-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:940aed4852468ea9e9541857c21fb7c8194f180cdee4907c47675d98aa301614"}, - {file = "clickhouse_connect-0.6.20-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:518d3971e6ffd85d9eb1b06f767ca41636cada5dddda38a102239b43b135cdb5"}, - {file = "clickhouse_connect-0.6.20-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:8f7fbcaed1cb459a48cad5761eeff07c51262f973e9366582bcba11b4595403e"}, - {file = "clickhouse_connect-0.6.20-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:0cea8c05fe7152d010894a454cfc0969c58e95308e55ca00f49cbb43bb52295c"}, - {file = "clickhouse_connect-0.6.20-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:338f2671662b5369031379568ecdbffced11fd9b0a8b7a7b15b1b534e8e54ace"}, - {file = "clickhouse_connect-0.6.20-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:d7196dc690c8fc2df28a39264340ad971eba31cc72048f81d4c3261b490446dc"}, - {file = "clickhouse_connect-0.6.20-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:f2eab185d6570695c488c829b2579b11a76be326bf8304a68322fad69d9edd28"}, - {file = "clickhouse_connect-0.6.20-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:fd1f8a3cb713186a55abd0b386b49d03b172a3f21ebf3fa3102f3239854482ac"}, - {file = "clickhouse_connect-0.6.20-cp310-cp310-win32.whl", hash = "sha256:2fdcc38d42069a2c795af7347a57dd4c3d39c32b3ab14abef610da8f7968a46b"}, - {file = "clickhouse_connect-0.6.20-cp310-cp310-win_amd64.whl", hash = "sha256:0233451a7dabeebfbf6c4b952a33621b247b2cd0c2de351e089c54a7260ac3e3"}, - {file = "clickhouse_connect-0.6.20-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:34c946c531901d3986a948213de828fe73979f0bbda06b7d669f601c023f3614"}, - {file = "clickhouse_connect-0.6.20-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:789420fcffa67f5bac565c4a7a0fa223e5a8a4448acece9d723360d9c0be0c5e"}, - {file = "clickhouse_connect-0.6.20-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:192a133a5b8e182b236395f0c0075ed2b512ce4406301308e3f7692f63a86e5d"}, - {file = "clickhouse_connect-0.6.20-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:cbd289dd2d583b9c1398a7f1c687849063aa9d1fd05a2a0d7984e3c95649906e"}, - {file = "clickhouse_connect-0.6.20-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:9bb6bcfa7e0a0f321d663a35c6db0c9f448abe8edd59402631bda76ddeef0f8e"}, - {file = "clickhouse_connect-0.6.20-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:a55f8c656e0283345678c3e7d4a1e3eca0b7bc2198f8a282f245d915f299df2e"}, - {file = "clickhouse_connect-0.6.20-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:e1a2e9e875e105c43bb7aac306febbdff2f33e1816fb38283ad4b98019352995"}, - {file = "clickhouse_connect-0.6.20-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:b0a8dd06fffea9f095c23be768cb3c5c190d1522310c61fc1540d72d8248f1ce"}, - {file = "clickhouse_connect-0.6.20-cp311-cp311-win32.whl", hash = "sha256:bfc9529b54001f4deedbd5743080d379bf567cf057f42858d7782bccef32f829"}, - {file = "clickhouse_connect-0.6.20-cp311-cp311-win_amd64.whl", hash = "sha256:4f5ca783973d8c2ee8b2d44d0b5f5e71769c9008ebc79cd2d6e936534fc3e371"}, - {file = "clickhouse_connect-0.6.20-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:83ab72a29291dbf4cb16414a04c18d6463e0c25179a15974eab875a810d9792e"}, - {file = "clickhouse_connect-0.6.20-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:615bdc7e6862c2f817d57ddcab7a537ff34e788dff90a247e5f470dcca39ed22"}, - {file = "clickhouse_connect-0.6.20-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:b3d9919dae205097ab62740c6a224ea7e8f6f038144cb45ee81750dba373b141"}, - {file = "clickhouse_connect-0.6.20-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:2c6ea0d57563b7aa3101a74c743698e1269d4c69ee25bb915c17d9f60b2a514f"}, - {file = "clickhouse_connect-0.6.20-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:6805c70851af7d327ea1cb28e7d43d59d246598d894cd5e07c778b7581edea49"}, - {file = "clickhouse_connect-0.6.20-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:84341f26ecaf86ee75b963f3eb343848b61b07987271dc62023083e8ee310825"}, - {file = "clickhouse_connect-0.6.20-cp312-cp312-musllinux_1_1_i686.whl", hash = "sha256:9d26ff9d4884c0c78e1f3108d460f8922b3d32b8c8ca674eb766fc16d35a8bc8"}, - {file = "clickhouse_connect-0.6.20-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:0d978c75a9dbc7c90078037095e1cc73800c2759cd27b1a9376f93c5b2776439"}, - {file = "clickhouse_connect-0.6.20-cp312-cp312-win32.whl", hash = "sha256:14f22f6e4af576b58f2797fef2bce19b7597a5b0e10ced1130c471069c575cb1"}, - {file = "clickhouse_connect-0.6.20-cp312-cp312-win_amd64.whl", hash = "sha256:7188abd36750baad6708ccefe80bb6c4680d391d3f55d16e8fedd27c9c99aa2b"}, - {file = "clickhouse_connect-0.6.20-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:cdbf6b1418617a2229e79ad61aa27ad46d65b527f89d9314beeca67507d20b45"}, - {file = "clickhouse_connect-0.6.20-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:8675b8ffa960137833270d2d2b700a1ad3631352ff9683ee37002b84b0832601"}, - {file = "clickhouse_connect-0.6.20-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:bce4effe410130fe523f197c4ea87d3e5a4f967d267c36b94c8a4718d084fe9f"}, - {file = "clickhouse_connect-0.6.20-cp37-cp37m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:9c3360dd63f434ae88b044ae93ceb57787ea4adfacf20e96727a1618a19407ea"}, - {file = "clickhouse_connect-0.6.20-cp37-cp37m-musllinux_1_1_aarch64.whl", hash = "sha256:8c93f22a2d66e07d21a05a7825ad1f55c748993e5aaecaf4b8cb315868b2443b"}, - {file = "clickhouse_connect-0.6.20-cp37-cp37m-musllinux_1_1_i686.whl", hash = "sha256:c6ec2f2053dd245d85fc1c47c8a8b1abb4e9648978d5df1fc3ae6e3445022e40"}, - {file = "clickhouse_connect-0.6.20-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:945e88ac6b5decfa6d3ec80f21d6040a4c3b09243738b76b2b2e3675066fbeb7"}, - {file = "clickhouse_connect-0.6.20-cp37-cp37m-win32.whl", hash = "sha256:f283aed361bbedf1d21557e1b31ffa05a907eb7c9ea1724594dbbb79e48c34a7"}, - {file = "clickhouse_connect-0.6.20-cp37-cp37m-win_amd64.whl", hash = "sha256:7c560bc97c6e21b8155f0044be733f65976a2ab85cad4e23ea11a3a54db441a6"}, - {file = "clickhouse_connect-0.6.20-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:0f1a6a3a29f750b66b4bfc18580c78e8eef11a9416a407768941c54e31b7e1c6"}, - {file = "clickhouse_connect-0.6.20-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:dfb1090ec6617b1fefa9cce8bfa54d554f81217fd368d8741a5c7288bf3c0cb5"}, - {file = "clickhouse_connect-0.6.20-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:de0e2fa97bebf77dd40c0388ad34dc04dbc81b6df77fe9db434edb38f1d01c33"}, - {file = "clickhouse_connect-0.6.20-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:d37513c9abc2dcc60638de4de594c9ad14eb67fc0372df2bd1ef5ed3c262b70f"}, - {file = "clickhouse_connect-0.6.20-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:e9393c7121797c70155697a1f26821788fd2b69b8facde94f5023966e0e14d01"}, - {file = "clickhouse_connect-0.6.20-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:8061f12e1e90e3c68c52f647d1e139bc20cb67a5015d74c76d550e2ca4dc579d"}, - {file = "clickhouse_connect-0.6.20-cp38-cp38-musllinux_1_1_i686.whl", hash = "sha256:f7fde21c1c52136253cca97192950c5debe7617cc2722634de572ab7b2c8cd17"}, - {file = "clickhouse_connect-0.6.20-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:896f13f6432ce4b5229a31c7c3c2e8f60e783cadceb6c30f1ee2facfcaf3a484"}, - {file = "clickhouse_connect-0.6.20-cp38-cp38-win32.whl", hash = "sha256:7c4ac78071dcdf272a125bd206d4b49816ff043d668c9e08ad4b97c6dad61c4c"}, - {file = "clickhouse_connect-0.6.20-cp38-cp38-win_amd64.whl", hash = "sha256:a53333961259750e73e2a54b733e206bef29ff8845732978818bf1c0353669f5"}, - {file = "clickhouse_connect-0.6.20-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:56c345bd34a64d32cebb42a6f63cf3609ad1d22f269324959d894345689f9ec6"}, - {file = "clickhouse_connect-0.6.20-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:7130dd2bb79cbc54ff92a5ceaf3da10d51d43dbb9b5a3de06bf958dc74acbb4e"}, - {file = "clickhouse_connect-0.6.20-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:9c137a7804ab552ccd144161783baf6f5cc6b0cbf23eba14ae4ae6d338c77006"}, - {file = "clickhouse_connect-0.6.20-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:97119fed09231d670e9556a3eb9900d6c5ee68c81e51565893b7265245c91e11"}, - {file = "clickhouse_connect-0.6.20-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:96a929030f8ccd983d3c989c7b296217bbb5c9e96998ab694e5ac952734baecc"}, - {file = "clickhouse_connect-0.6.20-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:afe170cb99288db6d26260b291c5181f44ea200d33de98f48d6409bdd82b4b9c"}, - {file = "clickhouse_connect-0.6.20-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:856a8eacb972ba2806bff92bf4c7ae383d33c2dbc8bb3312b6563d62c2b9566e"}, - {file = "clickhouse_connect-0.6.20-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:2957d14fbd6fac543454afa611775f810466e33d41e05a27082f6920d8ce8113"}, - {file = "clickhouse_connect-0.6.20-cp39-cp39-win32.whl", hash = "sha256:ca391d1600bcfb8b09a1a3f416167cfacef48cba4052dec28cdae4573de43364"}, - {file = "clickhouse_connect-0.6.20-cp39-cp39-win_amd64.whl", hash = "sha256:8e87ec988632a854370e69f4597b22c1ebc3bb25281478283c9985ef0223f014"}, - {file = "clickhouse_connect-0.6.20-pp310-pypy310_pp73-macosx_10_9_x86_64.whl", hash = "sha256:49d7ad3a7c73442428928c36dbad46ec69c28655f2da518ba273bfd0085589e3"}, - {file = "clickhouse_connect-0.6.20-pp310-pypy310_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:e1270a9c57a1f0c454ff0c5921220a8f26c100da3ba14fd8ab71b598b6d18e88"}, - {file = "clickhouse_connect-0.6.20-pp310-pypy310_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:e10d5954649a6533ed113777298b1920e986055fc7acc4541128de8b3e79ef72"}, - {file = "clickhouse_connect-0.6.20-pp310-pypy310_pp73-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:9d677d97247416e41e44c61cfaf60d0549724998ab7326a9d7d94133ae1b01bd"}, - {file = "clickhouse_connect-0.6.20-pp310-pypy310_pp73-win_amd64.whl", hash = "sha256:4a86f4770705c2bfaad15d3e79a664cea4c66e9ecbd7743457880296970c4dfb"}, - {file = "clickhouse_connect-0.6.20-pp37-pypy37_pp73-macosx_10_9_x86_64.whl", hash = "sha256:cc3ff7c2941f8f90219c271708fd5594a761475e09b91d4a381cfcb272926313"}, - {file = "clickhouse_connect-0.6.20-pp37-pypy37_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:b7d7b0664e8eb90dc310c060aa1f7c628b8893bf23d002b5d3b06deed821379a"}, - {file = "clickhouse_connect-0.6.20-pp37-pypy37_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:7b4cfab7c3c834fd5371298418972102f3451b3a57e56f34848bcc0b93080709"}, - {file = "clickhouse_connect-0.6.20-pp37-pypy37_pp73-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:123ad3ab6a7ae4c659b934622cc32b247d5d0779248c70feb497805f6a8e3943"}, - {file = "clickhouse_connect-0.6.20-pp37-pypy37_pp73-win_amd64.whl", hash = "sha256:c44b861a59a9eec0a9c04919dbafb436c739c75fa4d633c8dc9281e484cfd827"}, - {file = "clickhouse_connect-0.6.20-pp38-pypy38_pp73-macosx_10_9_x86_64.whl", hash = "sha256:45b4574bc00320c262cfd6b6bf86ca75bb94a68bf25f482439c6119fb45a2ace"}, - {file = "clickhouse_connect-0.6.20-pp38-pypy38_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:bac83700c4fe768553592c73303e541ec0b585e9569b495fa0548433476670a4"}, - {file = "clickhouse_connect-0.6.20-pp38-pypy38_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:4c834491a1216fb9dcbbd953b219ba9afbca7ef2fef99a5ae19b87a52fcbfc3e"}, - {file = "clickhouse_connect-0.6.20-pp38-pypy38_pp73-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:d4e9f2de0b640aab45d51ce384a5ae1d22780e1f41111072a7e03283b254db89"}, - {file = "clickhouse_connect-0.6.20-pp38-pypy38_pp73-win_amd64.whl", hash = "sha256:33d4664f7a6e4e8c2879e011cc3cc04a77c17f28e136594c9b024cc7c9c0379f"}, - {file = "clickhouse_connect-0.6.20-pp39-pypy39_pp73-macosx_10_9_x86_64.whl", hash = "sha256:d9dd04e5e9f6c727f17a14299b7aa4c32226cd4755de9d112ebc43bf296481b6"}, - {file = "clickhouse_connect-0.6.20-pp39-pypy39_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:deffbb32b470db7563d3c61049784b41933456ab4c395d1f529af472fe91f07e"}, - {file = "clickhouse_connect-0.6.20-pp39-pypy39_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:27870545fdc83a973c86d5d88b74e73e06614f126cb23c692e9b142468461b2c"}, - {file = "clickhouse_connect-0.6.20-pp39-pypy39_pp73-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:60ad09b66ff5adfa2742fa9bc5e78b6865e6a214bf658ee7e2065a62b666caa3"}, - {file = "clickhouse_connect-0.6.20-pp39-pypy39_pp73-win_amd64.whl", hash = "sha256:4038de6a3a6c3c305899dbcc7521af433b236c89282d7de0908f3eb6b51d0f72"}, -] - -[package.dependencies] -certifi = "*" -lz4 = "*" -pytz = "*" -urllib3 = ">=1.26" -zstandard = "*" - -[package.extras] -arrow = ["pyarrow"] -numpy = ["numpy"] -orjson = ["orjson"] -pandas = ["pandas"] -sqlalchemy = ["sqlalchemy (>1.3.21,<2.0)"] - [[package]] name = "cohere" version = "4.34" @@ -990,6 +966,17 @@ files = [ {file = "colorama-0.4.6.tar.gz", hash = "sha256:08695f5cb7ed6e0531a20572697297273c47b8cae5a63ffc6d6ed5c201be6e44"}, ] +[[package]] +name = "colorclass" +version = "2.2.2" +description = "Colorful worry-free console applications for Linux, Mac OS X, and Windows." +optional = false +python-versions = ">=2.6" +files = [ + {file = "colorclass-2.2.2-py2.py3-none-any.whl", hash = "sha256:6f10c273a0ef7a1150b1120b6095cbdd68e5cf36dfd5d0fc957a2500bbf99a55"}, + {file = "colorclass-2.2.2.tar.gz", hash = "sha256:6d4fe287766166a98ca7bc6f6312daf04a0481b1eda43e7173484051c0ab4366"}, +] + [[package]] name = "coloredlogs" version = "15.0.1" @@ -1041,6 +1028,16 @@ traitlets = ">=4" [package.extras] test = ["pytest"] +[[package]] +name = "compressed-rtf" +version = "1.0.6" +description = "Compressed Rich Text Format (RTF) compression and decompression package" +optional = false +python-versions = "*" +files = [ + {file = "compressed_rtf-1.0.6.tar.gz", hash = "sha256:c1c827f1d124d24608981a56e8b8691eb1f2a69a78ccad6440e7d92fde1781dd"}, +] + [[package]] name = "configargparse" version = "1.7" @@ -1388,51 +1385,24 @@ files = [ ] [[package]] -name = "duckdb" -version = "0.9.2" -description = "DuckDB embedded database" +name = "easygui" +version = "0.98.3" +description = "EasyGUI is a module for very simple, very easy GUI programming in Python. EasyGUI is different from other GUI generators in that EasyGUI is NOT event-driven. Instead, all GUI interactions are invoked by simple function calls." optional = false -python-versions = ">=3.7.0" +python-versions = "*" files = [ - {file = "duckdb-0.9.2-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:aadcea5160c586704c03a8a796c06a8afffbefefb1986601104a60cb0bfdb5ab"}, - {file = "duckdb-0.9.2-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:08215f17147ed83cbec972175d9882387366de2ed36c21cbe4add04b39a5bcb4"}, - {file = "duckdb-0.9.2-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:ee6c2a8aba6850abef5e1be9dbc04b8e72a5b2c2b67f77892317a21fae868fe7"}, - {file = "duckdb-0.9.2-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:1ff49f3da9399900fd58b5acd0bb8bfad22c5147584ad2427a78d937e11ec9d0"}, - {file = "duckdb-0.9.2-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:dd5ac5baf8597efd2bfa75f984654afcabcd698342d59b0e265a0bc6f267b3f0"}, - {file = "duckdb-0.9.2-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:81c6df905589a1023a27e9712edb5b724566587ef280a0c66a7ec07c8083623b"}, - {file = "duckdb-0.9.2-cp310-cp310-win32.whl", hash = "sha256:a298cd1d821c81d0dec8a60878c4b38c1adea04a9675fb6306c8f9083bbf314d"}, - {file = "duckdb-0.9.2-cp310-cp310-win_amd64.whl", hash = "sha256:492a69cd60b6cb4f671b51893884cdc5efc4c3b2eb76057a007d2a2295427173"}, - {file = "duckdb-0.9.2-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:061a9ea809811d6e3025c5de31bc40e0302cfb08c08feefa574a6491e882e7e8"}, - {file = "duckdb-0.9.2-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:a43f93be768af39f604b7b9b48891f9177c9282a408051209101ff80f7450d8f"}, - {file = "duckdb-0.9.2-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:ac29c8c8f56fff5a681f7bf61711ccb9325c5329e64f23cb7ff31781d7b50773"}, - {file = "duckdb-0.9.2-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:b14d98d26bab139114f62ade81350a5342f60a168d94b27ed2c706838f949eda"}, - {file = "duckdb-0.9.2-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:796a995299878913e765b28cc2b14c8e44fae2f54ab41a9ee668c18449f5f833"}, - {file = "duckdb-0.9.2-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:6cb64ccfb72c11ec9c41b3cb6181b6fd33deccceda530e94e1c362af5f810ba1"}, - {file = "duckdb-0.9.2-cp311-cp311-win32.whl", hash = "sha256:930740cb7b2cd9e79946e1d3a8f66e15dc5849d4eaeff75c8788d0983b9256a5"}, - {file = "duckdb-0.9.2-cp311-cp311-win_amd64.whl", hash = "sha256:c28f13c45006fd525001b2011cdf91fa216530e9751779651e66edc0e446be50"}, - {file = "duckdb-0.9.2-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:fbce7bbcb4ba7d99fcec84cec08db40bc0dd9342c6c11930ce708817741faeeb"}, - {file = "duckdb-0.9.2-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:15a82109a9e69b1891f0999749f9e3265f550032470f51432f944a37cfdc908b"}, - {file = "duckdb-0.9.2-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:9490fb9a35eb74af40db5569d90df8a04a6f09ed9a8c9caa024998c40e2506aa"}, - {file = "duckdb-0.9.2-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:696d5c6dee86c1a491ea15b74aafe34ad2b62dcd46ad7e03b1d00111ca1a8c68"}, - {file = "duckdb-0.9.2-cp37-cp37m-win32.whl", hash = "sha256:4f0935300bdf8b7631ddfc838f36a858c1323696d8c8a2cecbd416bddf6b0631"}, - {file = "duckdb-0.9.2-cp37-cp37m-win_amd64.whl", hash = "sha256:0aab900f7510e4d2613263865570203ddfa2631858c7eb8cbed091af6ceb597f"}, - {file = "duckdb-0.9.2-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:7d8130ed6a0c9421b135d0743705ea95b9a745852977717504e45722c112bf7a"}, - {file = "duckdb-0.9.2-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:974e5de0294f88a1a837378f1f83330395801e9246f4e88ed3bfc8ada65dcbee"}, - {file = "duckdb-0.9.2-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:4fbc297b602ef17e579bb3190c94d19c5002422b55814421a0fc11299c0c1100"}, - {file = "duckdb-0.9.2-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:1dd58a0d84a424924a35b3772419f8cd78a01c626be3147e4934d7a035a8ad68"}, - {file = "duckdb-0.9.2-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:11a1194a582c80dfb57565daa06141727e415ff5d17e022dc5f31888a5423d33"}, - {file = "duckdb-0.9.2-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:be45d08541002a9338e568dca67ab4f20c0277f8f58a73dfc1435c5b4297c996"}, - {file = "duckdb-0.9.2-cp38-cp38-win32.whl", hash = "sha256:dd6f88aeb7fc0bfecaca633629ff5c986ac966fe3b7dcec0b2c48632fd550ba2"}, - {file = "duckdb-0.9.2-cp38-cp38-win_amd64.whl", hash = "sha256:28100c4a6a04e69aa0f4a6670a6d3d67a65f0337246a0c1a429f3f28f3c40b9a"}, - {file = "duckdb-0.9.2-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:7ae5bf0b6ad4278e46e933e51473b86b4b932dbc54ff097610e5b482dd125552"}, - {file = "duckdb-0.9.2-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:e5d0bb845a80aa48ed1fd1d2d285dd352e96dc97f8efced2a7429437ccd1fe1f"}, - {file = "duckdb-0.9.2-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:4ce262d74a52500d10888110dfd6715989926ec936918c232dcbaddb78fc55b4"}, - {file = "duckdb-0.9.2-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:6935240da090a7f7d2666f6d0a5e45ff85715244171ca4e6576060a7f4a1200e"}, - {file = "duckdb-0.9.2-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:a5cfb93e73911696a98b9479299d19cfbc21dd05bb7ab11a923a903f86b4d06e"}, - {file = "duckdb-0.9.2-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:64e3bc01751f31e7572d2716c3e8da8fe785f1cdc5be329100818d223002213f"}, - {file = "duckdb-0.9.2-cp39-cp39-win32.whl", hash = "sha256:6e5b80f46487636368e31b61461940e3999986359a78660a50dfdd17dd72017c"}, - {file = "duckdb-0.9.2-cp39-cp39-win_amd64.whl", hash = "sha256:e6142a220180dbeea4f341708bd5f9501c5c962ce7ef47c1cadf5e8810b4cb13"}, - {file = "duckdb-0.9.2.tar.gz", hash = "sha256:3843afeab7c3fc4a4c0b53686a4cc1d9cdbdadcbb468d60fef910355ecafd447"}, + {file = "easygui-0.98.3-py2.py3-none-any.whl", hash = "sha256:33498710c68b5376b459cd3fc48d1d1f33822139eb3ed01defbc0528326da3ba"}, + {file = "easygui-0.98.3.tar.gz", hash = "sha256:d653ff79ee1f42f63b5a090f2f98ce02335d86ad8963b3ce2661805cafe99a04"}, +] + +[[package]] +name = "ebcdic" +version = "1.1.1" +description = "Additional EBCDIC codecs" +optional = false +python-versions = "*" +files = [ + {file = "ebcdic-1.1.1-py2.py3-none-any.whl", hash = "sha256:33b4cb729bc2d0bf46cc1847b0e5946897cb8d3f53520c5b9aa5fa98d7e735f1"}, ] [[package]] @@ -1453,6 +1423,21 @@ six = ">=1.9.0" gmpy = ["gmpy"] gmpy2 = ["gmpy2"] +[[package]] +name = "email-validator" +version = "2.1.0.post1" +description = "A robust email address syntax and deliverability validation library." +optional = false +python-versions = ">=3.8" +files = [ + {file = "email_validator-2.1.0.post1-py3-none-any.whl", hash = "sha256:c973053efbeddfef924dc0bd93f6e77a1ea7ee0fce935aea7103c7a3d6d2d637"}, + {file = "email_validator-2.1.0.post1.tar.gz", hash = "sha256:a4b0bd1cf55f073b924258d19321b1f3aa74b4b5a71a42c305575dba920e1a44"}, +] + +[package.dependencies] +dnspython = ">=2.0.0" +idna = ">=2.0.0" + [[package]] name = "emoji" version = "2.8.0" @@ -1530,6 +1515,32 @@ files = [ [package.extras] tests = ["asttokens (>=2.1.0)", "coverage", "coverage-enable-subprocess", "ipython", "littleutils", "pytest", "rich"] +[[package]] +name = "extract-msg" +version = "0.45.0" +description = "Extracts emails and attachments saved in Microsoft Outlook's .msg files" +optional = false +python-versions = ">=3.8" +files = [ + {file = "extract_msg-0.45.0-py2.py3-none-any.whl", hash = "sha256:af645ffe1534bce93b20390576dac2aee027c17a714365172d31b3894f810ca7"}, + {file = "extract_msg-0.45.0.tar.gz", hash = "sha256:6814865cf2ba806bd69af53af688a13e000a95d4991cce6a0416b3bdeb739496"}, +] + +[package.dependencies] +beautifulsoup4 = ">=4.11.1,<4.13" +compressed-rtf = ">=1.0.6,<2" +ebcdic = ">=1.1.1,<2" +imapclient = ">=2.3.0,<3" +olefile = "0.46" +red-black-tree-mod = "1.20" +RTFDE = ">=0.1.0,<0.2" +tzlocal = ">=4.2,<6" + +[package.extras] +all = ["extract-msg[image]", "extract-msg[mime]"] +image = ["Pillow (>=9.5.0,<10)"] +mime = ["python-magic (>=0.4.27,<0.5)"] + [[package]] name = "faiss-cpu" version = "1.7.4" @@ -1580,20 +1591,20 @@ importlib-resources = {version = ">=5.0", markers = "python_version < \"3.10\""} [[package]] name = "fastapi" -version = "0.103.2" +version = "0.104.1" description = "FastAPI framework, high performance, easy to learn, fast to code, ready for production" optional = false -python-versions = ">=3.7" +python-versions = ">=3.8" files = [ - {file = "fastapi-0.103.2-py3-none-any.whl", hash = "sha256:3270de872f0fe9ec809d4bd3d4d890c6d5cc7b9611d721d6438f9dacc8c4ef2e"}, - {file = "fastapi-0.103.2.tar.gz", hash = "sha256:75a11f6bfb8fc4d2bec0bd710c2d5f2829659c0e8c0afd5560fdda6ce25ec653"}, + {file = "fastapi-0.104.1-py3-none-any.whl", hash = "sha256:752dc31160cdbd0436bb93bad51560b57e525cbb1d4bbf6f4904ceee75548241"}, + {file = "fastapi-0.104.1.tar.gz", hash = "sha256:e5e4540a7c5e1dcfbbcf5b903c234feddcdcd881f191977a1c5dfd917487e7ae"}, ] [package.dependencies] anyio = ">=3.7.1,<4.0.0" pydantic = ">=1.7.4,<1.8 || >1.8,<1.8.1 || >1.8.1,<2.0.0 || >2.0.0,<2.0.1 || >2.0.1,<2.1.0 || >2.1.0,<3.0.0" starlette = ">=0.27.0,<0.28.0" -typing-extensions = ">=4.5.0" +typing-extensions = ">=4.8.0" [package.extras] all = ["email-validator (>=2.0.0)", "httpx (>=0.23.0)", "itsdangerous (>=1.1.0)", "jinja2 (>=2.11.2)", "orjson (>=3.2.1)", "pydantic-extra-types (>=2.0.0)", "pydantic-settings (>=2.0.0)", "python-multipart (>=0.0.5)", "pyyaml (>=5.3.1)", "ujson (>=4.0.1,!=4.0.2,!=4.1.0,!=4.2.0,!=4.3.0,!=5.0.0,!=5.1.0)", "uvicorn[standard] (>=0.12.0)"] @@ -2126,13 +2137,13 @@ httplib2 = ">=0.19.0" [[package]] name = "google-cloud-aiplatform" -version = "1.36.2" +version = "1.36.3" description = "Vertex AI API client library" optional = false python-versions = ">=3.8" files = [ - {file = "google-cloud-aiplatform-1.36.2.tar.gz", hash = "sha256:26c0eee7b9c964d2f493e0ba9f2ba669a569ca4ba6564eb469ecf15bb33b3df8"}, - {file = "google_cloud_aiplatform-1.36.2-py2.py3-none-any.whl", hash = "sha256:0cdcf9e603497682dbc0fcbbbdab569aa7c1e928eef7dfb26d374d7ee66b6de7"}, + {file = "google-cloud-aiplatform-1.36.3.tar.gz", hash = "sha256:3e24fb9f64e633fb66b03b39f6c9c5c3074440290cc99cb22e2574d68276466f"}, + {file = "google_cloud_aiplatform-1.36.3-py2.py3-none-any.whl", hash = "sha256:3baffabf43e129be14dbf090ce6381444e9f3f108de6ac64abe0a16a39e92a2d"}, ] [package.dependencies] @@ -2695,19 +2706,6 @@ files = [ hpack = ">=4.0,<5" hyperframe = ">=6.0,<7" -[[package]] -name = "hnswlib" -version = "0.7.0" -description = "hnswlib" -optional = false -python-versions = "*" -files = [ - {file = "hnswlib-0.7.0.tar.gz", hash = "sha256:bc459668e7e44bb7454b256b90c98c5af750653919d9a91698dafcf416cf64c4"}, -] - -[package.dependencies] -numpy = "*" - [[package]] name = "hpack" version = "4.0.0" @@ -2910,6 +2908,24 @@ files = [ {file = "idna-3.4.tar.gz", hash = "sha256:814f528e8dead7d329833b91c5faa87d60bf71824cd12a7530b5526063d02cb4"}, ] +[[package]] +name = "imapclient" +version = "2.3.1" +description = "Easy-to-use, Pythonic and complete IMAP client library" +optional = false +python-versions = "*" +files = [ + {file = "IMAPClient-2.3.1-py2.py3-none-any.whl", hash = "sha256:057f28025d2987c63e065afb0e4370b0b850b539b0e1494cea0427e88130108c"}, + {file = "IMAPClient-2.3.1.zip", hash = "sha256:26ea995664fae3a88b878ebce2aff7402931697b86658b7882043ddb01b0e6ba"}, +] + +[package.dependencies] +six = "*" + +[package.extras] +doc = ["sphinx"] +test = ["mock (>=1.3.0)"] + [[package]] name = "importlib-metadata" version = "6.8.0" @@ -3240,6 +3256,17 @@ MarkupSafe = ">=2.0" [package.extras] i18n = ["Babel (>=2.7)"] +[[package]] +name = "jmespath" +version = "1.0.1" +description = "JSON Matching Expressions" +optional = false +python-versions = ">=3.7" +files = [ + {file = "jmespath-1.0.1-py3-none-any.whl", hash = "sha256:02e2e4cc71b5bcab88332eebf907519190dd9e6e82107fa7f83b1003a6252980"}, + {file = "jmespath-1.0.1.tar.gz", hash = "sha256:90261b206d6defd58fdd5e85f478bf633a2901798906be2ad389150c5c60edbe"}, +] + [[package]] name = "joblib" version = "1.3.2" @@ -3251,6 +3278,89 @@ files = [ {file = "joblib-1.3.2.tar.gz", hash = "sha256:92f865e621e17784e7955080b6d042489e3b8e294949cc44c6eac304f59772b1"}, ] +[[package]] +name = "jq" +version = "1.6.0" +description = "jq is a lightweight and flexible JSON processor." +optional = false +python-versions = ">=3.5" +files = [ + {file = "jq-1.6.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:5773851cfb9ec6525f362f5bf7f18adab5c1fd1f0161c3599264cd0118c799da"}, + {file = "jq-1.6.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:a758df4eae767a21ebd8466dfd0066d99c9741d9f7fd4a7e1d5b5227e1924af7"}, + {file = "jq-1.6.0-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:15cf9dd3e7fb40d029f12f60cf418374c0b830a6ea6267dd285b48809069d6af"}, + {file = "jq-1.6.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:c7e768cf5c25d703d944ef81c787d745da0eb266a97768f3003f91c4c828118d"}, + {file = "jq-1.6.0-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:85a697b3cdc65e787f90faa1237caa44c117b6b2853f21263c3f0b16661b192c"}, + {file = "jq-1.6.0-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:944e081c328501ddc0a22a8f08196df72afe7910ca11e1a1f21244410dbdd3b3"}, + {file = "jq-1.6.0-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:09262d0e0cafb03acc968622e6450bb08abfb14c793bab47afd2732b47c655fd"}, + {file = "jq-1.6.0-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:611f460f616f957d57e0da52ac6e1e6294b073c72a89651da5546a31347817bd"}, + {file = "jq-1.6.0-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:aba35b5cc07cd75202148e55f47ede3f4d0819b51c80f6d0c82a2ca47db07189"}, + {file = "jq-1.6.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:ef5ddb76b03610df19a53583348aed3604f21d0ba6b583ee8d079e8df026cd47"}, + {file = "jq-1.6.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:872f322ff7bfd7daff41b7e8248d414a88722df0e82d1027f3b091a438543e63"}, + {file = "jq-1.6.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:ca7a2982ff26f4620ac03099542a0230dabd8787af3f03ac93660598e26acbf0"}, + {file = "jq-1.6.0-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:316affc6debf15eb05b7fd8e84ebf8993042b10b840e8d2a504659fb3ba07992"}, + {file = "jq-1.6.0-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:9bc42ade4de77fe4370c0e8e105ef10ad1821ef74d61dcc70982178b9ecfdc72"}, + {file = "jq-1.6.0-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:02da59230912b886ed45489f3693ce75877f3e99c9e490c0a2dbcf0db397e0df"}, + {file = "jq-1.6.0-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:7ea39f89aa469eb12145ddd686248916cd6d186647aa40b319af8444b1f45a2d"}, + {file = "jq-1.6.0-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:6e9016f5ba064fabc527adb609ebae1f27cac20c8e0da990abae1cfb12eca706"}, + {file = "jq-1.6.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:022be104a548f7fbddf103ce749937956df9d37a4f2f1650396dacad73bce7ee"}, + {file = "jq-1.6.0-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:1d5a7f31f779e1aa3d165eaec237d74c7f5728227e81023a576c939ba3da34f8"}, + {file = "jq-1.6.0-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:5f1533a2a15c42be3368878b4031b12f30441246878e0b5f6bedfdd7828cdb1f"}, + {file = "jq-1.6.0-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:8aa67a304e58aa85c550ec011a68754ae49abe227b37d63a351feef4eea4c7a7"}, + {file = "jq-1.6.0-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:0893d1590cfa6facaf787cc6c28ac51e47d0d06a303613f84d4943ac0ca98e32"}, + {file = "jq-1.6.0-cp312-cp312-musllinux_1_1_i686.whl", hash = "sha256:63db80b4803905a4f4f6c87a17aa1816c530f6262bc795773ebe60f8ab259092"}, + {file = "jq-1.6.0-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:e2c1f429e644cb962e846a6157b5352c3c556fbd0b22bba9fc2fea0710333369"}, + {file = "jq-1.6.0-cp36-cp36m-macosx_10_9_x86_64.whl", hash = "sha256:bcf574f28809ec63b8df6456fdd4a981751b7466851e80621993b4e9d3e3c8ee"}, + {file = "jq-1.6.0-cp36-cp36m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:49dbe0f003b411ca52b5d0afaf09cad8e430a1011181c86f2ef720a0956f31c1"}, + {file = "jq-1.6.0-cp36-cp36m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:9f5a9c4185269a5faf395aa7ca086c7b02c9c8b448d542be3b899041d06e0970"}, + {file = "jq-1.6.0-cp36-cp36m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:8265f3badcd125f234e55dfc02a078c5decdc6faafcd453fde04d4c0d2699886"}, + {file = "jq-1.6.0-cp36-cp36m-musllinux_1_1_aarch64.whl", hash = "sha256:c6c39b53d000d2f7f9f6338061942b83c9034d04f3bc99acae0867d23c9e7127"}, + {file = "jq-1.6.0-cp36-cp36m-musllinux_1_1_i686.whl", hash = "sha256:9897931ea7b9a46f8165ee69737ece4a2e6dbc8e10ececb81f459d51d71401df"}, + {file = "jq-1.6.0-cp36-cp36m-musllinux_1_1_x86_64.whl", hash = "sha256:6312237159e88e92775ea497e0c739590528062d4074544aacf12a08d252f966"}, + {file = "jq-1.6.0-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:aa786a60bdd1a3571f092a4021dd9abf6c46798530fa99f19ecf4f0fceaa7eaf"}, + {file = "jq-1.6.0-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:22495573d8221320d3433e1aeded40132bd8e1726845629558bd73aaa66eef7b"}, + {file = "jq-1.6.0-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:711eabc5d33ef3ec581e0744d9cff52f43896d84847a2692c287a0140a29c915"}, + {file = "jq-1.6.0-cp37-cp37m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:57e75c1563d083b0424690b3c3ef2bb519e670770931fe633101ede16615d6ee"}, + {file = "jq-1.6.0-cp37-cp37m-musllinux_1_1_aarch64.whl", hash = "sha256:c795f175b1a13bd716a0c180d062cc8e305271f47bbdb9eb0f0f62f7e4f5def4"}, + {file = "jq-1.6.0-cp37-cp37m-musllinux_1_1_i686.whl", hash = "sha256:227b178b22a7f91ae88525810441791b1ca1fc71c86f03190911793be15cec3d"}, + {file = "jq-1.6.0-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:780eb6383fbae12afa819ef676fc93e1548ae4b076c004a393af26a04b460742"}, + {file = "jq-1.6.0-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:08ded6467f4ef89fec35b2bf310f210f8cd13fbd9d80e521500889edf8d22441"}, + {file = "jq-1.6.0-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:49e44ed677713f4115bd5bf2dbae23baa4cd503be350e12a1c1f506b0687848f"}, + {file = "jq-1.6.0-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:984f33862af285ad3e41e23179ac4795f1701822473e1a26bf87ff023e5a89ea"}, + {file = "jq-1.6.0-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:f42264fafc6166efb5611b5d4cb01058887d050a6c19334f6a3f8a13bb369df5"}, + {file = "jq-1.6.0-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:a67154f150aaf76cc1294032ed588436eb002097dd4fd1e283824bf753a05080"}, + {file = "jq-1.6.0-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:1b3b95d5fd20e51f18a42647fdb52e5d8aaf150b7a666dd659cf282a2221ee3f"}, + {file = "jq-1.6.0-cp38-cp38-musllinux_1_1_i686.whl", hash = "sha256:3a8d98f72111043e75610cad7fa9ec5aec0b1ee2f7332dc7fd0f6603ea8144f8"}, + {file = "jq-1.6.0-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:487483f10ae8f70e6acf7723f31b329736de4b421ce56b2f43b46d5cbd7337b0"}, + {file = "jq-1.6.0-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:18a700f55b7ef83a1382edf0a48cb176b22bacd155e097375ef2345ff8621d97"}, + {file = "jq-1.6.0-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:68aec8534ac3c4705e524b4ef54f66b8bdc867df9e0af2c3895e82c6774b5374"}, + {file = "jq-1.6.0-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:b7a164748dbd03bb06d23bab7ead7ba7e5c4fcfebea7b082bdcd21d14136931e"}, + {file = "jq-1.6.0-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:aa22d24740276a8ce82411e4960ed2b5fab476230f913f9d9cf726f766a22208"}, + {file = "jq-1.6.0-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:4c1a6fae1b74b3e0478e281eb6addedad7b32421221ac685e21c1d49af5e997f"}, + {file = "jq-1.6.0-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:ce628546c22792b8870b9815086f65873ebb78d7bf617b5a16dd839adba36538"}, + {file = "jq-1.6.0-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:7bb685f337cf5d4f4fe210c46220e31a7baec02a0ca0df3ace3dd4780328fc30"}, + {file = "jq-1.6.0-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:bdbbc509a35ee6082d79c1f25eb97c08f1c59043d21e0772cd24baa909505899"}, + {file = "jq-1.6.0-pp310-pypy310_pp73-macosx_10_9_x86_64.whl", hash = "sha256:1b332dfdf0d81fb7faf3d12aabf997565d7544bec9812e0ac5ee55e60ef4df8c"}, + {file = "jq-1.6.0-pp310-pypy310_pp73-macosx_11_0_arm64.whl", hash = "sha256:3a4f6ef8c0bd19beae56074c50026665d66345d1908f050e5c442ceac2efe398"}, + {file = "jq-1.6.0-pp310-pypy310_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:5184c2fcca40f8f2ab1b14662721accf68b4b5e772e2f5336fec24aa58fe235a"}, + {file = "jq-1.6.0-pp310-pypy310_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:689429fe1e07a2d6041daba2c21ced3a24895b2745326deb0c90ccab9386e116"}, + {file = "jq-1.6.0-pp310-pypy310_pp73-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:8405d1c996c83711570f16aac32e3bf2c116d6fa4254a820276b87aed544d7e8"}, + {file = "jq-1.6.0-pp37-pypy37_pp73-macosx_10_9_x86_64.whl", hash = "sha256:138d56c7efc8bb162c1cfc3806bd6b4d779115943af36c9e3b8ca644dde856c2"}, + {file = "jq-1.6.0-pp37-pypy37_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:fd28f8395687e45bba56dc771284ebb6492b02037f74f450176c102f3f4e86a3"}, + {file = "jq-1.6.0-pp37-pypy37_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:b2c783288bf10e67aad321b58735e663f4975d7ddfbfb0a5bca8428eee283bde"}, + {file = "jq-1.6.0-pp37-pypy37_pp73-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:206391ac5b2eb556720b94f0f131558cbf8d82d8cc7e0404e733eeef48bcd823"}, + {file = "jq-1.6.0-pp38-pypy38_pp73-macosx_10_9_x86_64.whl", hash = "sha256:35090fea1283402abc3a13b43261468162199d8b5dcdaba2d1029e557ed23070"}, + {file = "jq-1.6.0-pp38-pypy38_pp73-macosx_11_0_arm64.whl", hash = "sha256:201c6384603aec87a744ad7b393cc4f1c58ece23d6e0a6c216a47bfcc405d231"}, + {file = "jq-1.6.0-pp38-pypy38_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:a3d8b075351c29653f29a1fec5d31bc88aa198a0843c0a9550b9be74d8fab33b"}, + {file = "jq-1.6.0-pp38-pypy38_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:132e41f6e988c42b91c04b1b60dd8fa185a5c0681de5438ea1e6c64f5329768c"}, + {file = "jq-1.6.0-pp38-pypy38_pp73-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:e1cb4751808b1d0dbddd37319e0c574fb0c3a29910d52ba35890b1343a1f1e59"}, + {file = "jq-1.6.0-pp39-pypy39_pp73-macosx_10_9_x86_64.whl", hash = "sha256:bd158911ed5f5c644f557ad94d6424c411560632a885eae47d105f290f0109cb"}, + {file = "jq-1.6.0-pp39-pypy39_pp73-macosx_11_0_arm64.whl", hash = "sha256:64bc09ae6a9d9b82b78e15d142f90b816228bd3ee48833ddca3ff8c08e163fa7"}, + {file = "jq-1.6.0-pp39-pypy39_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:f4eed167322662f4b7e65235723c54aa6879f6175b6f9b68bc24887549637ffb"}, + {file = "jq-1.6.0-pp39-pypy39_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:64bb4b305e2fabe5b5161b599bf934aceb0e0e7d3dd8f79246737ea91a2bc9ae"}, + {file = "jq-1.6.0-pp39-pypy39_pp73-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:165bfbe29bf73878d073edf75f384b7da8a9657ba0ab9fb1e5fe6be65ab7debb"}, + {file = "jq-1.6.0.tar.gz", hash = "sha256:c7711f0c913a826a00990736efa6ffc285f8ef433414516bb14b7df971d6c1ea"}, +] + [[package]] name = "jsonpatch" version = "1.33" @@ -3299,17 +3409,17 @@ format-nongpl = ["fqdn", "idna", "isoduration", "jsonpointer (>1.13)", "rfc3339- [[package]] name = "jsonschema-specifications" -version = "2023.7.1" +version = "2023.11.1" description = "The JSON Schema meta-schemas and vocabularies, exposed as a Registry" optional = false python-versions = ">=3.8" files = [ - {file = "jsonschema_specifications-2023.7.1-py3-none-any.whl", hash = "sha256:05adf340b659828a004220a9613be00fa3f223f2b82002e273dee62fd50524b1"}, - {file = "jsonschema_specifications-2023.7.1.tar.gz", hash = "sha256:c91a50404e88a1f6ba40636778e2ee08f6e24c5613fe4c53ac24578a5a7f72bb"}, + {file = "jsonschema_specifications-2023.11.1-py3-none-any.whl", hash = "sha256:f596778ab612b3fd29f72ea0d990393d0540a5aab18bf0407a46632eab540779"}, + {file = "jsonschema_specifications-2023.11.1.tar.gz", hash = "sha256:c9b234904ffe02f079bf91b14d79987faa685fd4b39c377a0996954c0090b9ca"}, ] [package.dependencies] -referencing = ">=0.28.0" +referencing = ">=0.31.0" [[package]] name = "jupyter-client" @@ -3389,13 +3499,13 @@ zookeeper = ["kazoo (>=2.8.0)"] [[package]] name = "langchain" -version = "0.0.312" +version = "0.0.335" description = "Building applications with LLMs through composability" optional = false python-versions = ">=3.8.1,<4.0" files = [ - {file = "langchain-0.0.312-py3-none-any.whl", hash = "sha256:2c7ea6e80195b8747c25ca4b905bd4814f26f47719a27edcb369cb6cd2186df3"}, - {file = "langchain-0.0.312.tar.gz", hash = "sha256:4629233c158f23dcfb0cbc249b27d7d8bde1e71ce1d8972d53ae54c7504fc78a"}, + {file = "langchain-0.0.335-py3-none-any.whl", hash = "sha256:f74c98366070a46953c071c69f6c01671a9437569c08406cace256ccaabdfcaf"}, + {file = "langchain-0.0.335.tar.gz", hash = "sha256:93136fe6cc9ac06a80ccf7cf581e58af5cfcc31fef1083b30165df9a9bc53f5d"}, ] [package.dependencies] @@ -3404,7 +3514,7 @@ anyio = "<4.0" async-timeout = {version = ">=4.0.0,<5.0.0", markers = "python_version < \"3.11\""} dataclasses-json = ">=0.5.7,<0.7" jsonpatch = ">=1.33,<2.0" -langsmith = ">=0.0.43,<0.1.0" +langsmith = ">=0.0.63,<0.1.0" numpy = ">=1,<2" pydantic = ">=1,<3" PyYAML = ">=5.3" @@ -3413,14 +3523,14 @@ SQLAlchemy = ">=1.4,<3" tenacity = ">=8.1.0,<9.0.0" [package.extras] -all = ["O365 (>=2.0.26,<3.0.0)", "aleph-alpha-client (>=2.15.0,<3.0.0)", "amadeus (>=8.1.0)", "arxiv (>=1.4,<2.0)", "atlassian-python-api (>=3.36.0,<4.0.0)", "awadb (>=0.3.9,<0.4.0)", "azure-ai-formrecognizer (>=3.2.1,<4.0.0)", "azure-ai-vision (>=0.11.1b1,<0.12.0)", "azure-cognitiveservices-speech (>=1.28.0,<2.0.0)", "azure-cosmos (>=4.4.0b1,<5.0.0)", "azure-identity (>=1.12.0,<2.0.0)", "beautifulsoup4 (>=4,<5)", "clarifai (>=9.1.0)", "clickhouse-connect (>=0.5.14,<0.6.0)", "cohere (>=4,<5)", "deeplake (>=3.6.8,<4.0.0)", "docarray[hnswlib] (>=0.32.0,<0.33.0)", "duckduckgo-search (>=3.8.3,<4.0.0)", "elasticsearch (>=8,<9)", "esprima (>=4.0.1,<5.0.0)", "faiss-cpu (>=1,<2)", "google-api-python-client (==2.70.0)", "google-auth (>=2.18.1,<3.0.0)", "google-search-results (>=2,<3)", "gptcache (>=0.1.7)", "html2text (>=2020.1.16,<2021.0.0)", "huggingface_hub (>=0,<1)", "jinja2 (>=3,<4)", "jq (>=1.4.1,<2.0.0)", "lancedb (>=0.1,<0.2)", "langkit (>=0.0.6,<0.1.0)", "lark (>=1.1.5,<2.0.0)", "libdeeplake (>=0.0.60,<0.0.61)", "librosa (>=0.10.0.post2,<0.11.0)", "lxml (>=4.9.2,<5.0.0)", "manifest-ml (>=0.0.1,<0.0.2)", "marqo (>=1.2.4,<2.0.0)", "momento (>=1.10.1,<2.0.0)", "nebula3-python (>=3.4.0,<4.0.0)", "neo4j (>=5.8.1,<6.0.0)", "networkx (>=2.6.3,<4)", "nlpcloud (>=1,<2)", "nltk (>=3,<4)", "nomic (>=1.0.43,<2.0.0)", "openai (>=0,<1)", "openlm (>=0.0.5,<0.0.6)", "opensearch-py (>=2.0.0,<3.0.0)", "pdfminer-six (>=20221105,<20221106)", "pexpect (>=4.8.0,<5.0.0)", "pgvector (>=0.1.6,<0.2.0)", "pinecone-client (>=2,<3)", "pinecone-text (>=0.4.2,<0.5.0)", "psycopg2-binary (>=2.9.5,<3.0.0)", "pymongo (>=4.3.3,<5.0.0)", "pyowm (>=3.3.0,<4.0.0)", "pypdf (>=3.4.0,<4.0.0)", "pytesseract (>=0.3.10,<0.4.0)", "python-arango (>=7.5.9,<8.0.0)", "pyvespa (>=0.33.0,<0.34.0)", "qdrant-client (>=1.3.1,<2.0.0)", "rdflib (>=6.3.2,<7.0.0)", "redis (>=4,<5)", "requests-toolbelt (>=1.0.0,<2.0.0)", "sentence-transformers (>=2,<3)", "singlestoredb (>=0.7.1,<0.8.0)", "tensorflow-text (>=2.11.0,<3.0.0)", "tigrisdb (>=1.0.0b6,<2.0.0)", "tiktoken (>=0.3.2,<0.6.0)", "torch (>=1,<3)", "transformers (>=4,<5)", "weaviate-client (>=3,<4)", "wikipedia (>=1,<2)", "wolframalpha (==5.0.0)"] +all = ["O365 (>=2.0.26,<3.0.0)", "aleph-alpha-client (>=2.15.0,<3.0.0)", "amadeus (>=8.1.0)", "arxiv (>=1.4,<2.0)", "atlassian-python-api (>=3.36.0,<4.0.0)", "awadb (>=0.3.9,<0.4.0)", "azure-ai-formrecognizer (>=3.2.1,<4.0.0)", "azure-ai-vision (>=0.11.1b1,<0.12.0)", "azure-cognitiveservices-speech (>=1.28.0,<2.0.0)", "azure-cosmos (>=4.4.0b1,<5.0.0)", "azure-identity (>=1.12.0,<2.0.0)", "beautifulsoup4 (>=4,<5)", "clarifai (>=9.1.0)", "clickhouse-connect (>=0.5.14,<0.6.0)", "cohere (>=4,<5)", "deeplake (>=3.8.3,<4.0.0)", "docarray[hnswlib] (>=0.32.0,<0.33.0)", "duckduckgo-search (>=3.8.3,<4.0.0)", "elasticsearch (>=8,<9)", "esprima (>=4.0.1,<5.0.0)", "faiss-cpu (>=1,<2)", "google-api-python-client (==2.70.0)", "google-auth (>=2.18.1,<3.0.0)", "google-search-results (>=2,<3)", "gptcache (>=0.1.7)", "html2text (>=2020.1.16,<2021.0.0)", "huggingface_hub (>=0,<1)", "jinja2 (>=3,<4)", "jq (>=1.4.1,<2.0.0)", "lancedb (>=0.1,<0.2)", "langkit (>=0.0.6,<0.1.0)", "lark (>=1.1.5,<2.0.0)", "librosa (>=0.10.0.post2,<0.11.0)", "lxml (>=4.9.2,<5.0.0)", "manifest-ml (>=0.0.1,<0.0.2)", "marqo (>=1.2.4,<2.0.0)", "momento (>=1.10.1,<2.0.0)", "nebula3-python (>=3.4.0,<4.0.0)", "neo4j (>=5.8.1,<6.0.0)", "networkx (>=2.6.3,<4)", "nlpcloud (>=1,<2)", "nltk (>=3,<4)", "nomic (>=1.0.43,<2.0.0)", "openai (>=0,<1)", "openlm (>=0.0.5,<0.0.6)", "opensearch-py (>=2.0.0,<3.0.0)", "pdfminer-six (>=20221105,<20221106)", "pexpect (>=4.8.0,<5.0.0)", "pgvector (>=0.1.6,<0.2.0)", "pinecone-client (>=2,<3)", "pinecone-text (>=0.4.2,<0.5.0)", "psycopg2-binary (>=2.9.5,<3.0.0)", "pymongo (>=4.3.3,<5.0.0)", "pyowm (>=3.3.0,<4.0.0)", "pypdf (>=3.4.0,<4.0.0)", "pytesseract (>=0.3.10,<0.4.0)", "python-arango (>=7.5.9,<8.0.0)", "pyvespa (>=0.33.0,<0.34.0)", "qdrant-client (>=1.3.1,<2.0.0)", "rdflib (>=6.3.2,<7.0.0)", "redis (>=4,<5)", "requests-toolbelt (>=1.0.0,<2.0.0)", "sentence-transformers (>=2,<3)", "singlestoredb (>=0.7.1,<0.8.0)", "tensorflow-text (>=2.11.0,<3.0.0)", "tigrisdb (>=1.0.0b6,<2.0.0)", "tiktoken (>=0.3.2,<0.6.0)", "torch (>=1,<3)", "transformers (>=4,<5)", "weaviate-client (>=3,<4)", "wikipedia (>=1,<2)", "wolframalpha (==5.0.0)"] azure = ["azure-ai-formrecognizer (>=3.2.1,<4.0.0)", "azure-ai-vision (>=0.11.1b1,<0.12.0)", "azure-cognitiveservices-speech (>=1.28.0,<2.0.0)", "azure-core (>=1.26.4,<2.0.0)", "azure-cosmos (>=4.4.0b1,<5.0.0)", "azure-identity (>=1.12.0,<2.0.0)", "azure-search-documents (==11.4.0b8)", "openai (>=0,<1)"] clarifai = ["clarifai (>=9.1.0)"] cli = ["typer (>=0.9.0,<0.10.0)"] cohere = ["cohere (>=4,<5)"] docarray = ["docarray[hnswlib] (>=0.32.0,<0.33.0)"] embeddings = ["sentence-transformers (>=2,<3)"] -extended-testing = ["aiosqlite (>=0.19.0,<0.20.0)", "amazon-textract-caller (<2)", "anthropic (>=0.3.11,<0.4.0)", "arxiv (>=1.4,<2.0)", "assemblyai (>=0.17.0,<0.18.0)", "atlassian-python-api (>=3.36.0,<4.0.0)", "beautifulsoup4 (>=4,<5)", "bibtexparser (>=1.4.0,<2.0.0)", "cassio (>=0.1.0,<0.2.0)", "chardet (>=5.1.0,<6.0.0)", "dashvector (>=1.0.1,<2.0.0)", "esprima (>=4.0.1,<5.0.0)", "faiss-cpu (>=1,<2)", "feedparser (>=6.0.10,<7.0.0)", "geopandas (>=0.13.1,<0.14.0)", "gitpython (>=3.1.32,<4.0.0)", "gql (>=3.4.1,<4.0.0)", "html2text (>=2020.1.16,<2021.0.0)", "jinja2 (>=3,<4)", "jq (>=1.4.1,<2.0.0)", "lxml (>=4.9.2,<5.0.0)", "markdownify (>=0.11.6,<0.12.0)", "motor (>=3.3.1,<4.0.0)", "mwparserfromhell (>=0.6.4,<0.7.0)", "mwxml (>=0.3.3,<0.4.0)", "newspaper3k (>=0.2.8,<0.3.0)", "numexpr (>=2.8.6,<3.0.0)", "openai (>=0,<1)", "openapi-schema-pydantic (>=1.2,<2.0)", "pandas (>=2.0.1,<3.0.0)", "pdfminer-six (>=20221105,<20221106)", "pgvector (>=0.1.6,<0.2.0)", "psychicapi (>=0.8.0,<0.9.0)", "py-trello (>=0.19.0,<0.20.0)", "pymupdf (>=1.22.3,<2.0.0)", "pypdf (>=3.4.0,<4.0.0)", "pypdfium2 (>=4.10.0,<5.0.0)", "pyspark (>=3.4.0,<4.0.0)", "rank-bm25 (>=0.2.2,<0.3.0)", "rapidfuzz (>=3.1.1,<4.0.0)", "rapidocr-onnxruntime (>=1.3.2,<2.0.0)", "requests-toolbelt (>=1.0.0,<2.0.0)", "scikit-learn (>=1.2.2,<2.0.0)", "sqlite-vss (>=0.1.2,<0.2.0)", "streamlit (>=1.18.0,<2.0.0)", "sympy (>=1.12,<2.0)", "telethon (>=1.28.5,<2.0.0)", "timescale-vector (>=0.0.1,<0.0.2)", "tqdm (>=4.48.0)", "xata (>=1.0.0a7,<2.0.0)", "xmltodict (>=0.13.0,<0.14.0)"] +extended-testing = ["aiosqlite (>=0.19.0,<0.20.0)", "aleph-alpha-client (>=2.15.0,<3.0.0)", "anthropic (>=0.3.11,<0.4.0)", "arxiv (>=1.4,<2.0)", "assemblyai (>=0.17.0,<0.18.0)", "atlassian-python-api (>=3.36.0,<4.0.0)", "beautifulsoup4 (>=4,<5)", "bibtexparser (>=1.4.0,<2.0.0)", "cassio (>=0.1.0,<0.2.0)", "chardet (>=5.1.0,<6.0.0)", "dashvector (>=1.0.1,<2.0.0)", "esprima (>=4.0.1,<5.0.0)", "faiss-cpu (>=1,<2)", "feedparser (>=6.0.10,<7.0.0)", "fireworks-ai (>=0.6.0,<0.7.0)", "geopandas (>=0.13.1,<0.14.0)", "gitpython (>=3.1.32,<4.0.0)", "google-cloud-documentai (>=2.20.1,<3.0.0)", "gql (>=3.4.1,<4.0.0)", "html2text (>=2020.1.16,<2021.0.0)", "jinja2 (>=3,<4)", "jq (>=1.4.1,<2.0.0)", "jsonschema (>1)", "lxml (>=4.9.2,<5.0.0)", "markdownify (>=0.11.6,<0.12.0)", "motor (>=3.3.1,<4.0.0)", "mwparserfromhell (>=0.6.4,<0.7.0)", "mwxml (>=0.3.3,<0.4.0)", "newspaper3k (>=0.2.8,<0.3.0)", "numexpr (>=2.8.6,<3.0.0)", "openai (>=0,<1)", "openapi-pydantic (>=0.3.2,<0.4.0)", "pandas (>=2.0.1,<3.0.0)", "pdfminer-six (>=20221105,<20221106)", "pgvector (>=0.1.6,<0.2.0)", "psychicapi (>=0.8.0,<0.9.0)", "py-trello (>=0.19.0,<0.20.0)", "pymupdf (>=1.22.3,<2.0.0)", "pypdf (>=3.4.0,<4.0.0)", "pypdfium2 (>=4.10.0,<5.0.0)", "pyspark (>=3.4.0,<4.0.0)", "rank-bm25 (>=0.2.2,<0.3.0)", "rapidfuzz (>=3.1.1,<4.0.0)", "rapidocr-onnxruntime (>=1.3.2,<2.0.0)", "requests-toolbelt (>=1.0.0,<2.0.0)", "rspace_client (>=2.5.0,<3.0.0)", "scikit-learn (>=1.2.2,<2.0.0)", "sqlite-vss (>=0.1.2,<0.2.0)", "streamlit (>=1.18.0,<2.0.0)", "sympy (>=1.12,<2.0)", "telethon (>=1.28.5,<2.0.0)", "timescale-vector (>=0.0.1,<0.0.2)", "tqdm (>=4.48.0)", "upstash-redis (>=0.15.0,<0.16.0)", "xata (>=1.0.0a7,<2.0.0)", "xmltodict (>=0.13.0,<0.14.0)"] javascript = ["esprima (>=4.0.1,<5.0.0)"] llms = ["clarifai (>=9.1.0)", "cohere (>=4,<5)", "huggingface_hub (>=0,<1)", "manifest-ml (>=0.0.1,<0.0.2)", "nlpcloud (>=1,<2)", "openai (>=0,<1)", "openlm (>=0.0.5,<0.0.6)", "torch (>=1,<3)", "transformers (>=4,<5)"] openai = ["openai (>=0,<1)", "tiktoken (>=0.3.2,<0.6.0)"] @@ -3429,17 +3539,20 @@ text-helpers = ["chardet (>=5.1.0,<6.0.0)"] [[package]] name = "langchain-experimental" -version = "0.0.8" +version = "0.0.40" description = "Building applications with LLMs through composability" optional = false python-versions = ">=3.8.1,<4.0" files = [ - {file = "langchain_experimental-0.0.8-py3-none-any.whl", hash = "sha256:34cf202ba29fdef178c5d68772cf2fa08dd2a0fad588ca3ef324ae71e596cc21"}, - {file = "langchain_experimental-0.0.8.tar.gz", hash = "sha256:35d198f8e70a053ccd84273198ff08b4b700ac03ec5f43ba9b7ef797dd42ad14"}, + {file = "langchain_experimental-0.0.40-py3-none-any.whl", hash = "sha256:21260efee3646bd9b13e3ea9d20d6caaf63a65deed6ea9f9f886e8f4c91e3663"}, + {file = "langchain_experimental-0.0.40.tar.gz", hash = "sha256:8d2e767519769aca702dc3c191ec87c256e288e8d304733245158c934d2601b6"}, ] [package.dependencies] -langchain = ">=0.0.239" +langchain = ">=0.0.308" + +[package.extras] +extended-testing = ["faker (>=19.3.1,<20.0.0)", "presidio-analyzer (>=2.2.33,<3.0.0)", "presidio-anonymizer (>=2.2.33,<3.0.0)", "sentence-transformers (>=2,<3)", "vowpal-wabbit-next (==0.6.0)"] [[package]] name = "langdetect" @@ -3491,13 +3604,29 @@ pydantic = ">=1,<3" requests = ">=2,<3" [[package]] -name = "llama-cpp-python" -version = "0.1.85" -description = "A Python wrapper for llama.cpp" -optional = true -python-versions = ">=3.7" +name = "lark" +version = "1.1.5" +description = "a modern parsing library" +optional = false +python-versions = "*" files = [ - {file = "llama_cpp_python-0.1.85.tar.gz", hash = "sha256:9ad2269f47a5fac10e78565e0b4078ea6b8d56ddd3b78892967da4739684db2b"}, + {file = "lark-1.1.5-py3-none-any.whl", hash = "sha256:8476f9903e93fbde4f6c327f74d79e9b4bd0ed9294c5dfa3164ab8c581b5de2a"}, + {file = "lark-1.1.5.tar.gz", hash = "sha256:4b534eae1f9af5b4ea000bea95776350befe1981658eea3820a01c37e504bb4d"}, +] + +[package.extras] +atomic-cache = ["atomicwrites"] +nearley = ["js2py"] +regex = ["regex"] + +[[package]] +name = "llama-cpp-python" +version = "0.2.18" +description = "Python bindings for the llama.cpp library" +optional = true +python-versions = ">=3.8" +files = [ + {file = "llama_cpp_python-0.2.18.tar.gz", hash = "sha256:faf270a861f114cc2dd1acdfff2a394023c30a9d8af58b8c1d492b31078b8cf9"}, ] [package.dependencies] @@ -3506,7 +3635,10 @@ numpy = ">=1.20.0" typing-extensions = ">=4.5.0" [package.extras] -server = ["fastapi (>=0.100.0)", "pydantic-settings (>=2.0.1)", "sse-starlette (>=1.6.1)", "uvicorn (>=0.22.0)"] +all = ["llama_cpp_python[dev,server,test]"] +dev = ["black (>=23.3.0)", "httpx (>=0.24.1)", "mkdocs (>=1.4.3)", "mkdocs-material (>=9.1.18)", "mkdocstrings[python] (>=0.22.0)", "pytest (>=7.4.0)", "twine (>=4.0.2)"] +server = ["fastapi (>=0.100.0)", "pydantic-settings (>=2.0.1)", "sse-starlette (>=1.6.1)", "starlette-context (>=0.3.6,<0.4)", "uvicorn (>=0.22.0)"] +test = ["httpx (>=0.24.1)", "pytest (>=7.4.0)"] [[package]] name = "locust" @@ -3648,55 +3780,6 @@ html5 = ["html5lib"] htmlsoup = ["BeautifulSoup4"] source = ["Cython (>=0.29.35)"] -[[package]] -name = "lz4" -version = "4.3.2" -description = "LZ4 Bindings for Python" -optional = false -python-versions = ">=3.7" -files = [ - {file = "lz4-4.3.2-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:1c4c100d99eed7c08d4e8852dd11e7d1ec47a3340f49e3a96f8dfbba17ffb300"}, - {file = "lz4-4.3.2-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:edd8987d8415b5dad25e797043936d91535017237f72fa456601be1479386c92"}, - {file = "lz4-4.3.2-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:f7c50542b4ddceb74ab4f8b3435327a0861f06257ca501d59067a6a482535a77"}, - {file = "lz4-4.3.2-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:0f5614d8229b33d4a97cb527db2a1ac81308c6e796e7bdb5d1309127289f69d5"}, - {file = "lz4-4.3.2-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:8f00a9ba98f6364cadda366ae6469b7b3568c0cced27e16a47ddf6b774169270"}, - {file = "lz4-4.3.2-cp310-cp310-win32.whl", hash = "sha256:b10b77dc2e6b1daa2f11e241141ab8285c42b4ed13a8642495620416279cc5b2"}, - {file = "lz4-4.3.2-cp310-cp310-win_amd64.whl", hash = "sha256:86480f14a188c37cb1416cdabacfb4e42f7a5eab20a737dac9c4b1c227f3b822"}, - {file = "lz4-4.3.2-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:7c2df117def1589fba1327dceee51c5c2176a2b5a7040b45e84185ce0c08b6a3"}, - {file = "lz4-4.3.2-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:1f25eb322eeb24068bb7647cae2b0732b71e5c639e4e4026db57618dcd8279f0"}, - {file = "lz4-4.3.2-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:8df16c9a2377bdc01e01e6de5a6e4bbc66ddf007a6b045688e285d7d9d61d1c9"}, - {file = "lz4-4.3.2-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:f571eab7fec554d3b1db0d666bdc2ad85c81f4b8cb08906c4c59a8cad75e6e22"}, - {file = "lz4-4.3.2-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:7211dc8f636ca625abc3d4fb9ab74e5444b92df4f8d58ec83c8868a2b0ff643d"}, - {file = "lz4-4.3.2-cp311-cp311-win32.whl", hash = "sha256:867664d9ca9bdfce840ac96d46cd8838c9ae891e859eb98ce82fcdf0e103a947"}, - {file = "lz4-4.3.2-cp311-cp311-win_amd64.whl", hash = "sha256:a6a46889325fd60b8a6b62ffc61588ec500a1883db32cddee9903edfba0b7584"}, - {file = "lz4-4.3.2-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:3a85b430138882f82f354135b98c320dafb96fc8fe4656573d95ab05de9eb092"}, - {file = "lz4-4.3.2-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:65d5c93f8badacfa0456b660285e394e65023ef8071142e0dcbd4762166e1be0"}, - {file = "lz4-4.3.2-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:6b50f096a6a25f3b2edca05aa626ce39979d63c3b160687c8c6d50ac3943d0ba"}, - {file = "lz4-4.3.2-cp37-cp37m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:200d05777d61ba1ff8d29cb51c534a162ea0b4fe6d3c28be3571a0a48ff36080"}, - {file = "lz4-4.3.2-cp37-cp37m-win32.whl", hash = "sha256:edc2fb3463d5d9338ccf13eb512aab61937be50aa70734bcf873f2f493801d3b"}, - {file = "lz4-4.3.2-cp37-cp37m-win_amd64.whl", hash = "sha256:83acfacab3a1a7ab9694333bcb7950fbeb0be21660d236fd09c8337a50817897"}, - {file = "lz4-4.3.2-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:7a9eec24ec7d8c99aab54de91b4a5a149559ed5b3097cf30249b665689b3d402"}, - {file = "lz4-4.3.2-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:31d72731c4ac6ebdce57cd9a5cabe0aecba229c4f31ba3e2c64ae52eee3fdb1c"}, - {file = "lz4-4.3.2-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:83903fe6db92db0be101acedc677aa41a490b561567fe1b3fe68695b2110326c"}, - {file = "lz4-4.3.2-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:926b26db87ec8822cf1870efc3d04d06062730ec3279bbbd33ba47a6c0a5c673"}, - {file = "lz4-4.3.2-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:e05afefc4529e97c08e65ef92432e5f5225c0bb21ad89dee1e06a882f91d7f5e"}, - {file = "lz4-4.3.2-cp38-cp38-win32.whl", hash = "sha256:ad38dc6a7eea6f6b8b642aaa0683253288b0460b70cab3216838747163fb774d"}, - {file = "lz4-4.3.2-cp38-cp38-win_amd64.whl", hash = "sha256:7e2dc1bd88b60fa09b9b37f08553f45dc2b770c52a5996ea52b2b40f25445676"}, - {file = "lz4-4.3.2-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:edda4fb109439b7f3f58ed6bede59694bc631c4b69c041112b1b7dc727fffb23"}, - {file = "lz4-4.3.2-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:0ca83a623c449295bafad745dcd399cea4c55b16b13ed8cfea30963b004016c9"}, - {file = "lz4-4.3.2-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:d5ea0e788dc7e2311989b78cae7accf75a580827b4d96bbaf06c7e5a03989bd5"}, - {file = "lz4-4.3.2-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:a98b61e504fb69f99117b188e60b71e3c94469295571492a6468c1acd63c37ba"}, - {file = "lz4-4.3.2-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:4931ab28a0d1c133104613e74eec1b8bb1f52403faabe4f47f93008785c0b929"}, - {file = "lz4-4.3.2-cp39-cp39-win32.whl", hash = "sha256:ec6755cacf83f0c5588d28abb40a1ac1643f2ff2115481089264c7630236618a"}, - {file = "lz4-4.3.2-cp39-cp39-win_amd64.whl", hash = "sha256:4caedeb19e3ede6c7a178968b800f910db6503cb4cb1e9cc9221157572139b49"}, - {file = "lz4-4.3.2.tar.gz", hash = "sha256:e1431d84a9cfb23e6773e72078ce8e65cad6745816d4cbf9ae67da5ea419acda"}, -] - -[package.extras] -docs = ["sphinx (>=1.6.0)", "sphinx-bootstrap-theme"] -flake8 = ["flake8"] -tests = ["psutil", "pytest (!=3.3.0)", "pytest-cov"] - [[package]] name = "mako" version = "1.3.0" @@ -3966,6 +4049,21 @@ files = [ {file = "msgpack-1.0.7.tar.gz", hash = "sha256:572efc93db7a4d27e404501975ca6d2d9775705c2d922390d878fcf768d92c87"}, ] +[[package]] +name = "msoffcrypto-tool" +version = "5.1.1" +description = "Python tool and library for decrypting MS Office files with passwords or other keys" +optional = false +python-versions = ">=3.8,<4.0" +files = [ + {file = "msoffcrypto_tool-5.1.1-py3-none-any.whl", hash = "sha256:27475aaf8a70485471ad86426c0be10ee4e24c6fad70335e4a8f88d2da323ca1"}, + {file = "msoffcrypto_tool-5.1.1.tar.gz", hash = "sha256:5585a303fa3ee49eec0253f912be17b82cf83f13f0f7489b4ea10f4ecb285278"}, +] + +[package.dependencies] +cryptography = ">=35.0" +olefile = ">=0.46" + [[package]] name = "multidict" version = "6.0.4" @@ -4275,6 +4373,38 @@ files = [ {file = "numpy-1.26.2.tar.gz", hash = "sha256:f65738447676ab5777f11e6bbbdb8ce11b785e105f690bc45966574816b6d3ea"}, ] +[[package]] +name = "olefile" +version = "0.46" +description = "Python package to parse, read and write Microsoft OLE2 files (Structured Storage or Compound Document, Microsoft Office)" +optional = false +python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*" +files = [ + {file = "olefile-0.46.zip", hash = "sha256:133b031eaf8fd2c9399b78b8bc5b8fcbe4c31e85295749bb17a87cba8f3c3964"}, +] + +[[package]] +name = "oletools" +version = "0.60.1" +description = "Python tools to analyze security characteristics of MS Office and OLE files (also called Structured Storage, Compound File Binary Format or Compound Document File Format), for Malware Analysis and Incident Response #DFIR" +optional = false +python-versions = "*" +files = [ + {file = "oletools-0.60.1-py2.py3-none-any.whl", hash = "sha256:edef92374e688989a39269eb9a11142fb20a023629c23538c849c14d1d1144ea"}, + {file = "oletools-0.60.1.zip", hash = "sha256:67a796da4c4b8e2feb9a6b2495bef8798a3323a75512de4e5669d9dc9d1fae31"}, +] + +[package.dependencies] +colorclass = "*" +easygui = "*" +msoffcrypto-tool = {version = "*", markers = "platform_python_implementation != \"PyPy\" or python_version >= \"3\" and (platform_system != \"Windows\" and platform_system != \"Darwin\")"} +olefile = ">=0.46" +pcodedmp = ">=1.2.5" +pyparsing = ">=2.1.0,<3" + +[package.extras] +full = ["XLMMacroDeobfuscator"] + [[package]] name = "onnxruntime" version = "1.16.2" @@ -4812,6 +4942,21 @@ files = [ {file = "pathspec-0.11.2.tar.gz", hash = "sha256:e0d8d0ac2f12da61956eb2306b69f9469b42f4deb0f3cb6ed47b9cce9996ced3"}, ] +[[package]] +name = "pcodedmp" +version = "1.2.6" +description = "A VBA p-code disassembler" +optional = false +python-versions = "*" +files = [ + {file = "pcodedmp-1.2.6-py2.py3-none-any.whl", hash = "sha256:4441f7c0ab4cbda27bd4668db3b14f36261d86e5059ce06c0828602cbe1c4278"}, + {file = "pcodedmp-1.2.6.tar.gz", hash = "sha256:025f8c809a126f45a082ffa820893e6a8d990d9d7ddb68694b5a9f0a6dbcd955"}, +] + +[package.dependencies] +oletools = ">=0.54" +win-unicode-console = {version = "*", markers = "platform_system == \"Windows\" and platform_python_implementation != \"PyPy\""} + [[package]] name = "pexpect" version = "4.8.0" @@ -4826,6 +4971,19 @@ files = [ [package.dependencies] ptyprocess = ">=0.5" +[[package]] +name = "pgvector" +version = "0.2.3" +description = "pgvector support for Python" +optional = false +python-versions = ">=3.8" +files = [ + {file = "pgvector-0.2.3-py2.py3-none-any.whl", hash = "sha256:9d53dc01138ecc7c9aca64e4680cfa9edf4c38f9cb8ed7098317871fdd211824"}, +] + +[package.dependencies] +numpy = "*" + [[package]] name = "pillow" version = "10.1.0" @@ -4920,13 +5078,13 @@ grpc = ["googleapis-common-protos (>=1.53.0)", "grpc-gateway-protoc-gen-openapiv [[package]] name = "platformdirs" -version = "4.0.0" +version = "3.11.0" description = "A small Python package for determining appropriate platform-specific dirs, e.g. a \"user data dir\"." optional = false python-versions = ">=3.7" files = [ - {file = "platformdirs-4.0.0-py3-none-any.whl", hash = "sha256:118c954d7e949b35437270383a3f2531e99dd93cf7ce4dc8340d3356d30f173b"}, - {file = "platformdirs-4.0.0.tar.gz", hash = "sha256:cb633b2bcf10c51af60beb0ab06d2f1d69064b43abf4c185ca6b28865f3f9731"}, + {file = "platformdirs-3.11.0-py3-none-any.whl", hash = "sha256:e9d171d00af68be50e9202731309c4e658fd8bc76f55c11c7dd760d023bda68e"}, + {file = "platformdirs-3.11.0.tar.gz", hash = "sha256:cf8ee52a3afdb965072dcc652433e0c7e3e40cf5ea1477cd4b3b1d2eb75495b3"}, ] [package.extras] @@ -4969,13 +5127,13 @@ tests = ["pytest (>=5.4.1)", "pytest-cov (>=2.8.1)", "pytest-mypy (>=0.8.0)", "p [[package]] name = "postgrest" -version = "0.11.0" +version = "0.13.0" description = "PostgREST client for Python. This library provides an ORM interface to PostgREST." optional = false python-versions = ">=3.8,<4.0" files = [ - {file = "postgrest-0.11.0-py3-none-any.whl", hash = "sha256:1ee5ff587890824ffe49f474d7e8142161eeb8d99ddff4fc59559ea9f6d6f224"}, - {file = "postgrest-0.11.0.tar.gz", hash = "sha256:ac243cb984ed264d84707ded5958e0d6b51209b41a77e8ce43f56fc079414980"}, + {file = "postgrest-0.13.0-py3-none-any.whl", hash = "sha256:30aa8b2826db540705ba9896422fd7ad3751cebc4f884f15fffcad5032218647"}, + {file = "postgrest-0.13.0.tar.gz", hash = "sha256:13d3c13bea10d1d47e7fbb9ca90beba19181197877dccf750f5f666fa28fe910"}, ] [package.dependencies] @@ -5360,36 +5518,47 @@ files = [ [[package]] name = "pyarrow" -version = "12.0.1" +version = "14.0.1" description = "Python library for Apache Arrow" optional = false -python-versions = ">=3.7" +python-versions = ">=3.8" files = [ - {file = "pyarrow-12.0.1-cp310-cp310-macosx_10_14_x86_64.whl", hash = "sha256:6d288029a94a9bb5407ceebdd7110ba398a00412c5b0155ee9813a40d246c5df"}, - {file = "pyarrow-12.0.1-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:345e1828efdbd9aa4d4de7d5676778aba384a2c3add896d995b23d368e60e5af"}, - {file = "pyarrow-12.0.1-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:8d6009fdf8986332b2169314da482baed47ac053311c8934ac6651e614deacd6"}, - {file = "pyarrow-12.0.1-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:2d3c4cbbf81e6dd23fe921bc91dc4619ea3b79bc58ef10bce0f49bdafb103daf"}, - {file = "pyarrow-12.0.1-cp310-cp310-win_amd64.whl", hash = "sha256:cdacf515ec276709ac8042c7d9bd5be83b4f5f39c6c037a17a60d7ebfd92c890"}, - {file = "pyarrow-12.0.1-cp311-cp311-macosx_10_14_x86_64.whl", hash = "sha256:749be7fd2ff260683f9cc739cb862fb11be376de965a2a8ccbf2693b098db6c7"}, - {file = "pyarrow-12.0.1-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:6895b5fb74289d055c43db3af0de6e16b07586c45763cb5e558d38b86a91e3a7"}, - {file = "pyarrow-12.0.1-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:1887bdae17ec3b4c046fcf19951e71b6a619f39fa674f9881216173566c8f718"}, - {file = "pyarrow-12.0.1-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:e2c9cb8eeabbadf5fcfc3d1ddea616c7ce893db2ce4dcef0ac13b099ad7ca082"}, - {file = "pyarrow-12.0.1-cp311-cp311-win_amd64.whl", hash = "sha256:ce4aebdf412bd0eeb800d8e47db854f9f9f7e2f5a0220440acf219ddfddd4f63"}, - {file = "pyarrow-12.0.1-cp37-cp37m-macosx_10_14_x86_64.whl", hash = "sha256:e0d8730c7f6e893f6db5d5b86eda42c0a130842d101992b581e2138e4d5663d3"}, - {file = "pyarrow-12.0.1-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:43364daec02f69fec89d2315f7fbfbeec956e0d991cbbef471681bd77875c40f"}, - {file = "pyarrow-12.0.1-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:051f9f5ccf585f12d7de836e50965b3c235542cc896959320d9776ab93f3b33d"}, - {file = "pyarrow-12.0.1-cp37-cp37m-win_amd64.whl", hash = "sha256:be2757e9275875d2a9c6e6052ac7957fbbfc7bc7370e4a036a9b893e96fedaba"}, - {file = "pyarrow-12.0.1-cp38-cp38-macosx_10_14_x86_64.whl", hash = "sha256:cf812306d66f40f69e684300f7af5111c11f6e0d89d6b733e05a3de44961529d"}, - {file = "pyarrow-12.0.1-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:459a1c0ed2d68671188b2118c63bac91eaef6fc150c77ddd8a583e3c795737bf"}, - {file = "pyarrow-12.0.1-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:85e705e33eaf666bbe508a16fd5ba27ca061e177916b7a317ba5a51bee43384c"}, - {file = "pyarrow-12.0.1-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:9120c3eb2b1f6f516a3b7a9714ed860882d9ef98c4b17edcdc91d95b7528db60"}, - {file = "pyarrow-12.0.1-cp38-cp38-win_amd64.whl", hash = "sha256:c780f4dc40460015d80fcd6a6140de80b615349ed68ef9adb653fe351778c9b3"}, - {file = "pyarrow-12.0.1-cp39-cp39-macosx_10_14_x86_64.whl", hash = "sha256:a3c63124fc26bf5f95f508f5d04e1ece8cc23a8b0af2a1e6ab2b1ec3fdc91b24"}, - {file = "pyarrow-12.0.1-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:b13329f79fa4472324f8d32dc1b1216616d09bd1e77cfb13104dec5463632c36"}, - {file = "pyarrow-12.0.1-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:bb656150d3d12ec1396f6dde542db1675a95c0cc8366d507347b0beed96e87ca"}, - {file = "pyarrow-12.0.1-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:6251e38470da97a5b2e00de5c6a049149f7b2bd62f12fa5dbb9ac674119ba71a"}, - {file = "pyarrow-12.0.1-cp39-cp39-win_amd64.whl", hash = "sha256:3de26da901216149ce086920547dfff5cd22818c9eab67ebc41e863a5883bac7"}, - {file = "pyarrow-12.0.1.tar.gz", hash = "sha256:cce317fc96e5b71107bf1f9f184d5e54e2bd14bbf3f9a3d62819961f0af86fec"}, + {file = "pyarrow-14.0.1-cp310-cp310-macosx_10_14_x86_64.whl", hash = "sha256:96d64e5ba7dceb519a955e5eeb5c9adcfd63f73a56aea4722e2cc81364fc567a"}, + {file = "pyarrow-14.0.1-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:1a8ae88c0038d1bc362a682320112ee6774f006134cd5afc291591ee4bc06505"}, + {file = "pyarrow-14.0.1-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:0f6f053cb66dc24091f5511e5920e45c83107f954a21032feadc7b9e3a8e7851"}, + {file = "pyarrow-14.0.1-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:906b0dc25f2be12e95975722f1e60e162437023f490dbd80d0deb7375baf3171"}, + {file = "pyarrow-14.0.1-cp310-cp310-manylinux_2_28_aarch64.whl", hash = "sha256:78d4a77a46a7de9388b653af1c4ce539350726cd9af62e0831e4f2bd0c95a2f4"}, + {file = "pyarrow-14.0.1-cp310-cp310-manylinux_2_28_x86_64.whl", hash = "sha256:06ca79080ef89d6529bb8e5074d4b4f6086143b2520494fcb7cf8a99079cde93"}, + {file = "pyarrow-14.0.1-cp310-cp310-win_amd64.whl", hash = "sha256:32542164d905002c42dff896efdac79b3bdd7291b1b74aa292fac8450d0e4dcd"}, + {file = "pyarrow-14.0.1-cp311-cp311-macosx_10_14_x86_64.whl", hash = "sha256:c7331b4ed3401b7ee56f22c980608cf273f0380f77d0f73dd3c185f78f5a6220"}, + {file = "pyarrow-14.0.1-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:922e8b49b88da8633d6cac0e1b5a690311b6758d6f5d7c2be71acb0f1e14cd61"}, + {file = "pyarrow-14.0.1-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:58c889851ca33f992ea916b48b8540735055201b177cb0dcf0596a495a667b00"}, + {file = "pyarrow-14.0.1-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:30d8494870d9916bb53b2a4384948491444741cb9a38253c590e21f836b01222"}, + {file = "pyarrow-14.0.1-cp311-cp311-manylinux_2_28_aarch64.whl", hash = "sha256:be28e1a07f20391bb0b15ea03dcac3aade29fc773c5eb4bee2838e9b2cdde0cb"}, + {file = "pyarrow-14.0.1-cp311-cp311-manylinux_2_28_x86_64.whl", hash = "sha256:981670b4ce0110d8dcb3246410a4aabf5714db5d8ea63b15686bce1c914b1f83"}, + {file = "pyarrow-14.0.1-cp311-cp311-win_amd64.whl", hash = "sha256:4756a2b373a28f6166c42711240643fb8bd6322467e9aacabd26b488fa41ec23"}, + {file = "pyarrow-14.0.1-cp312-cp312-macosx_10_14_x86_64.whl", hash = "sha256:cf87e2cec65dd5cf1aa4aba918d523ef56ef95597b545bbaad01e6433851aa10"}, + {file = "pyarrow-14.0.1-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:470ae0194fbfdfbf4a6b65b4f9e0f6e1fa0ea5b90c1ee6b65b38aecee53508c8"}, + {file = "pyarrow-14.0.1-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:6263cffd0c3721c1e348062997babdf0151301f7353010c9c9a8ed47448f82ab"}, + {file = "pyarrow-14.0.1-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:7a8089d7e77d1455d529dbd7cff08898bbb2666ee48bc4085203af1d826a33cc"}, + {file = "pyarrow-14.0.1-cp312-cp312-manylinux_2_28_aarch64.whl", hash = "sha256:fada8396bc739d958d0b81d291cfd201126ed5e7913cb73de6bc606befc30226"}, + {file = "pyarrow-14.0.1-cp312-cp312-manylinux_2_28_x86_64.whl", hash = "sha256:2a145dab9ed7849fc1101bf03bcdc69913547f10513fdf70fc3ab6c0a50c7eee"}, + {file = "pyarrow-14.0.1-cp312-cp312-win_amd64.whl", hash = "sha256:05fe7994745b634c5fb16ce5717e39a1ac1fac3e2b0795232841660aa76647cd"}, + {file = "pyarrow-14.0.1-cp38-cp38-macosx_10_14_x86_64.whl", hash = "sha256:a8eeef015ae69d104c4c3117a6011e7e3ecd1abec79dc87fd2fac6e442f666ee"}, + {file = "pyarrow-14.0.1-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:3c76807540989fe8fcd02285dd15e4f2a3da0b09d27781abec3adc265ddbeba1"}, + {file = "pyarrow-14.0.1-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:450e4605e3c20e558485f9161a79280a61c55efe585d51513c014de9ae8d393f"}, + {file = "pyarrow-14.0.1-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:323cbe60210173ffd7db78bfd50b80bdd792c4c9daca8843ef3cd70b186649db"}, + {file = "pyarrow-14.0.1-cp38-cp38-manylinux_2_28_aarch64.whl", hash = "sha256:0140c7e2b740e08c5a459439d87acd26b747fc408bde0a8806096ee0baaa0c15"}, + {file = "pyarrow-14.0.1-cp38-cp38-manylinux_2_28_x86_64.whl", hash = "sha256:e592e482edd9f1ab32f18cd6a716c45b2c0f2403dc2af782f4e9674952e6dd27"}, + {file = "pyarrow-14.0.1-cp38-cp38-win_amd64.whl", hash = "sha256:d264ad13605b61959f2ae7c1d25b1a5b8505b112715c961418c8396433f213ad"}, + {file = "pyarrow-14.0.1-cp39-cp39-macosx_10_14_x86_64.whl", hash = "sha256:01e44de9749cddc486169cb632f3c99962318e9dacac7778315a110f4bf8a450"}, + {file = "pyarrow-14.0.1-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:d0351fecf0e26e152542bc164c22ea2a8e8c682726fce160ce4d459ea802d69c"}, + {file = "pyarrow-14.0.1-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:33c1f6110c386464fd2e5e4ea3624466055bbe681ff185fd6c9daa98f30a3f9a"}, + {file = "pyarrow-14.0.1-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:11e045dfa09855b6d3e7705a37c42e2dc2c71d608fab34d3c23df2e02df9aec3"}, + {file = "pyarrow-14.0.1-cp39-cp39-manylinux_2_28_aarch64.whl", hash = "sha256:097828b55321897db0e1dbfc606e3ff8101ae5725673498cbfa7754ee0da80e4"}, + {file = "pyarrow-14.0.1-cp39-cp39-manylinux_2_28_x86_64.whl", hash = "sha256:1daab52050a1c48506c029e6fa0944a7b2436334d7e44221c16f6f1b2cc9c510"}, + {file = "pyarrow-14.0.1-cp39-cp39-win_amd64.whl", hash = "sha256:3f6d5faf4f1b0d5a7f97be987cf9e9f8cd39902611e818fe134588ee99bf0283"}, + {file = "pyarrow-14.0.1.tar.gz", hash = "sha256:b8b3f4fe8d4ec15e1ef9b599b94683c5216adaed78d5cb4c606180546d1e2ee1"}, ] [package.dependencies] @@ -5474,55 +5643,156 @@ files = [ [[package]] name = "pydantic" -version = "1.10.13" -description = "Data validation and settings management using python type hints" +version = "2.4.0" +description = "Data validation using Python type hints" optional = false python-versions = ">=3.7" files = [ - {file = "pydantic-1.10.13-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:efff03cc7a4f29d9009d1c96ceb1e7a70a65cfe86e89d34e4a5f2ab1e5693737"}, - {file = "pydantic-1.10.13-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:3ecea2b9d80e5333303eeb77e180b90e95eea8f765d08c3d278cd56b00345d01"}, - {file = "pydantic-1.10.13-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:1740068fd8e2ef6eb27a20e5651df000978edce6da6803c2bef0bc74540f9548"}, - {file = "pydantic-1.10.13-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:84bafe2e60b5e78bc64a2941b4c071a4b7404c5c907f5f5a99b0139781e69ed8"}, - {file = "pydantic-1.10.13-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:bc0898c12f8e9c97f6cd44c0ed70d55749eaf783716896960b4ecce2edfd2d69"}, - {file = "pydantic-1.10.13-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:654db58ae399fe6434e55325a2c3e959836bd17a6f6a0b6ca8107ea0571d2e17"}, - {file = "pydantic-1.10.13-cp310-cp310-win_amd64.whl", hash = "sha256:75ac15385a3534d887a99c713aa3da88a30fbd6204a5cd0dc4dab3d770b9bd2f"}, - {file = "pydantic-1.10.13-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:c553f6a156deb868ba38a23cf0df886c63492e9257f60a79c0fd8e7173537653"}, - {file = "pydantic-1.10.13-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:5e08865bc6464df8c7d61439ef4439829e3ab62ab1669cddea8dd00cd74b9ffe"}, - {file = "pydantic-1.10.13-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:e31647d85a2013d926ce60b84f9dd5300d44535a9941fe825dc349ae1f760df9"}, - {file = "pydantic-1.10.13-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:210ce042e8f6f7c01168b2d84d4c9eb2b009fe7bf572c2266e235edf14bacd80"}, - {file = "pydantic-1.10.13-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:8ae5dd6b721459bfa30805f4c25880e0dd78fc5b5879f9f7a692196ddcb5a580"}, - {file = "pydantic-1.10.13-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:f8e81fc5fb17dae698f52bdd1c4f18b6ca674d7068242b2aff075f588301bbb0"}, - {file = "pydantic-1.10.13-cp311-cp311-win_amd64.whl", hash = "sha256:61d9dce220447fb74f45e73d7ff3b530e25db30192ad8d425166d43c5deb6df0"}, - {file = "pydantic-1.10.13-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:4b03e42ec20286f052490423682016fd80fda830d8e4119f8ab13ec7464c0132"}, - {file = "pydantic-1.10.13-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:f59ef915cac80275245824e9d771ee939133be38215555e9dc90c6cb148aaeb5"}, - {file = "pydantic-1.10.13-cp37-cp37m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:5a1f9f747851338933942db7af7b6ee8268568ef2ed86c4185c6ef4402e80ba8"}, - {file = "pydantic-1.10.13-cp37-cp37m-musllinux_1_1_i686.whl", hash = "sha256:97cce3ae7341f7620a0ba5ef6cf043975cd9d2b81f3aa5f4ea37928269bc1b87"}, - {file = "pydantic-1.10.13-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:854223752ba81e3abf663d685f105c64150873cc6f5d0c01d3e3220bcff7d36f"}, - {file = "pydantic-1.10.13-cp37-cp37m-win_amd64.whl", hash = "sha256:b97c1fac8c49be29486df85968682b0afa77e1b809aff74b83081cc115e52f33"}, - {file = "pydantic-1.10.13-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:c958d053453a1c4b1c2062b05cd42d9d5c8eb67537b8d5a7e3c3032943ecd261"}, - {file = "pydantic-1.10.13-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:4c5370a7edaac06daee3af1c8b1192e305bc102abcbf2a92374b5bc793818599"}, - {file = "pydantic-1.10.13-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:7d6f6e7305244bddb4414ba7094ce910560c907bdfa3501e9db1a7fd7eaea127"}, - {file = "pydantic-1.10.13-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:d3a3c792a58e1622667a2837512099eac62490cdfd63bd407993aaf200a4cf1f"}, - {file = "pydantic-1.10.13-cp38-cp38-musllinux_1_1_i686.whl", hash = "sha256:c636925f38b8db208e09d344c7aa4f29a86bb9947495dd6b6d376ad10334fb78"}, - {file = "pydantic-1.10.13-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:678bcf5591b63cc917100dc50ab6caebe597ac67e8c9ccb75e698f66038ea953"}, - {file = "pydantic-1.10.13-cp38-cp38-win_amd64.whl", hash = "sha256:6cf25c1a65c27923a17b3da28a0bdb99f62ee04230c931d83e888012851f4e7f"}, - {file = "pydantic-1.10.13-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:8ef467901d7a41fa0ca6db9ae3ec0021e3f657ce2c208e98cd511f3161c762c6"}, - {file = "pydantic-1.10.13-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:968ac42970f57b8344ee08837b62f6ee6f53c33f603547a55571c954a4225691"}, - {file = "pydantic-1.10.13-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:9849f031cf8a2f0a928fe885e5a04b08006d6d41876b8bbd2fc68a18f9f2e3fd"}, - {file = "pydantic-1.10.13-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:56e3ff861c3b9c6857579de282ce8baabf443f42ffba355bf070770ed63e11e1"}, - {file = "pydantic-1.10.13-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:9f00790179497767aae6bcdc36355792c79e7bbb20b145ff449700eb076c5f96"}, - {file = "pydantic-1.10.13-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:75b297827b59bc229cac1a23a2f7a4ac0031068e5be0ce385be1462e7e17a35d"}, - {file = "pydantic-1.10.13-cp39-cp39-win_amd64.whl", hash = "sha256:e70ca129d2053fb8b728ee7d1af8e553a928d7e301a311094b8a0501adc8763d"}, - {file = "pydantic-1.10.13-py3-none-any.whl", hash = "sha256:b87326822e71bd5f313e7d3bfdc77ac3247035ac10b0c0618bd99dcf95b1e687"}, - {file = "pydantic-1.10.13.tar.gz", hash = "sha256:32c8b48dcd3b2ac4e78b0ba4af3a2c2eb6048cb75202f0ea7b34feb740efc340"}, + {file = "pydantic-2.4.0-py3-none-any.whl", hash = "sha256:909b2b7d7be775a890631218e8c4b6b5418c9b6c57074ae153e5c09b73bf06a3"}, + {file = "pydantic-2.4.0.tar.gz", hash = "sha256:54216ccb537a606579f53d7f6ed912e98fffce35aff93b25cd80b1c2ca806fc3"}, ] [package.dependencies] -typing-extensions = ">=4.2.0" +annotated-types = ">=0.4.0" +email-validator = {version = ">=2.0.0", optional = true, markers = "extra == \"email\""} +pydantic-core = "2.10.0" +typing-extensions = ">=4.6.1" [package.extras] -dotenv = ["python-dotenv (>=0.10.4)"] -email = ["email-validator (>=1.0.3)"] +email = ["email-validator (>=2.0.0)"] + +[[package]] +name = "pydantic-core" +version = "2.10.0" +description = "" +optional = false +python-versions = ">=3.7" +files = [ + {file = "pydantic_core-2.10.0-cp310-cp310-macosx_10_7_x86_64.whl", hash = "sha256:daea90360d99ad06a3f686b3e628222ac3aa953b1982f13be5b69b2648c5e6bb"}, + {file = "pydantic_core-2.10.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:5f76cb8d68d87fd05e56aba392c841d98eeb3ad378bcf5331b42bac7afee0d66"}, + {file = "pydantic_core-2.10.0-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:5e816d042f80dd630aaedbc75c21084da9e1d7ea5918619b8089c7edaedd57e8"}, + {file = "pydantic_core-2.10.0-cp310-cp310-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:7192492b09c1e4ad103e5cb98eb397f9b61a9037fce03e94cafe3238404dbe0f"}, + {file = "pydantic_core-2.10.0-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:312831c5bf50d9d432c11baf9bbd8d8961740608ccbc66fb1290d532aff21b18"}, + {file = "pydantic_core-2.10.0-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:873db84afcbcf3f1ed0040ed9c5534bc1af5d647d13c04be12f3568421f5dd3e"}, + {file = "pydantic_core-2.10.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:0aa8bdc2d78afadd191148726f094be81d5e4b76011f8fa9300f317e06a1b732"}, + {file = "pydantic_core-2.10.0-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:7cbf77664099345a25932ebe25d7bf9a330fc29acd9a909e8751ac0c42097fb3"}, + {file = "pydantic_core-2.10.0-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:a537e87ca600e59e532fbc770a60f9f3a5ebcff9bae8c60aceeec5beb326e1b8"}, + {file = "pydantic_core-2.10.0-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:ed5f8d6cb834c80fb813d233f9bfb60d3453b7450c80c0814b8e78c23d1ea8bf"}, + {file = "pydantic_core-2.10.0-cp310-none-win32.whl", hash = "sha256:0e210107faf47d5965fcebc294c41891573adab36e5cf70731c57d0068fc7c5c"}, + {file = "pydantic_core-2.10.0-cp310-none-win_amd64.whl", hash = "sha256:9527cf9c25fd655617620c8d6cb43216c0ce5779871ab7f83175421267b85199"}, + {file = "pydantic_core-2.10.0-cp311-cp311-macosx_10_7_x86_64.whl", hash = "sha256:ab2d56dfa13244164f0ba8125d8315c799fa0150459b88fc42ed5c1e3c04d47a"}, + {file = "pydantic_core-2.10.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:d1e79893a20207ff671f13f5562c1f0aaece030e6e30252683f536286ba89864"}, + {file = "pydantic_core-2.10.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:030ba2f59e78c8732445d8c9f093579674f2b5b93b3960945face14ec2e82682"}, + {file = "pydantic_core-2.10.0-cp311-cp311-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:705fad71297dfedc5c9e3c935702864aa0cc7812be11ac544f152677ba6ea430"}, + {file = "pydantic_core-2.10.0-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:394a8ce4a7495af8dbf33038daf57a6170be15f8d1d92a7b63c6f2211527d950"}, + {file = "pydantic_core-2.10.0-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:19c7aa3c0ff08ddc91597d8af08f8c4de59b27fe752b3bd1db9a67f6f08c4020"}, + {file = "pydantic_core-2.10.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:fb204346d3eda4e0c63cbeeec6398a52682ac51f9cf7379a13505863e47d3186"}, + {file = "pydantic_core-2.10.0-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:b1fefe63baa04f1d9dd5b4564b1e73d133e1c745589933d7ef9718235915cc81"}, + {file = "pydantic_core-2.10.0-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:fa4bd88165d860111e860e8b43efd97afd137a9165cf24eb3cfb2371f57452bf"}, + {file = "pydantic_core-2.10.0-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:9e21ab9c49cc58282c228ff89fb4a5e4b447233ccd53acb7f333d1cde58df37b"}, + {file = "pydantic_core-2.10.0-cp311-none-win32.whl", hash = "sha256:2a6f28e2b2a5cef3b52b5ac6c6d64fe810ca51ec57081554f447c818778eea09"}, + {file = "pydantic_core-2.10.0-cp311-none-win_amd64.whl", hash = "sha256:f94539aa4265ab5528d8c3dc4505a19369083c29d0713b8ed536f93b9bc1e94f"}, + {file = "pydantic_core-2.10.0-cp311-none-win_arm64.whl", hash = "sha256:2352f7cb8ef0cd21fbc582abe2a14105d7e8400f97a551ca2e3b05dee77525d2"}, + {file = "pydantic_core-2.10.0-cp312-cp312-macosx_10_7_x86_64.whl", hash = "sha256:c2a126c7271a9421005a0f57cf71294ad49c375e4d0a9198b93665796f49e7f7"}, + {file = "pydantic_core-2.10.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:7440933341f655a64456065211cf7657c3cf3524d5b0b02f5d9b63ef5a7e0d49"}, + {file = "pydantic_core-2.10.0-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:85d8225cd08aacb8a2843cf0a0a72f1c403c6ac6f18d4cfeecabe050f80c9ea3"}, + {file = "pydantic_core-2.10.0-cp312-cp312-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:573e89b3da5908f564ae54b6284e20b490158681e91e1776a59dfda17ec0a6a8"}, + {file = "pydantic_core-2.10.0-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:b0061965942489e6da23f0399b1136fd10eff0a4f0cefae13369eba1776e22a6"}, + {file = "pydantic_core-2.10.0-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:725f0276402773a6b61b6f67bf9562f37ba08a8bfebdfb9990eea786ed5711b2"}, + {file = "pydantic_core-2.10.0-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:25cacd12689b1a357ae6212c7f5980ebf487720db5bbf1bb5d91085226b6a962"}, + {file = "pydantic_core-2.10.0-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:e70c6c882ab101a72010c8f91e87db211fa2aaf6aa51acc7160fe5649630ed75"}, + {file = "pydantic_core-2.10.0-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:e079540fd4c45c23de4465cafb20cddcd8befe3b5f46505a2eb28e49b9d13ee2"}, + {file = "pydantic_core-2.10.0-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:98474284adb71c8738e5efb71ccb1382d8d66f042ad0875018c78bcb38ac0f47"}, + {file = "pydantic_core-2.10.0-cp312-none-win32.whl", hash = "sha256:ab1fa046ef9058ceef941b576c5e7711bab3d99be00a304fb4726cf4b94e05ff"}, + {file = "pydantic_core-2.10.0-cp312-none-win_amd64.whl", hash = "sha256:b4df023610af081d6da85328411fed7aacf19e939fe955bb31f29212f8dcf306"}, + {file = "pydantic_core-2.10.0-cp312-none-win_arm64.whl", hash = "sha256:f1a70f99d1a7270d4f321a8824e87d5b88acd64c2af6049915b7fd8215437e04"}, + {file = "pydantic_core-2.10.0-cp37-cp37m-macosx_10_7_x86_64.whl", hash = "sha256:f622778eb180cf7eba25e65d2fe37a57a0eadd8403df4c44606b56d204f686de"}, + {file = "pydantic_core-2.10.0-cp37-cp37m-macosx_11_0_arm64.whl", hash = "sha256:fb513fc74bdf5f649e6e855fc87ed9b81ee8b0be96717190f9e00683244f0616"}, + {file = "pydantic_core-2.10.0-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:82c3f0752547f928e4fcfb00151d6deb9124be7d35e012c567429fe93ec71b71"}, + {file = "pydantic_core-2.10.0-cp37-cp37m-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:100bbd622433d9d7ca8ee4fa63dfae90f9f38358558955173aed6ed56c573db8"}, + {file = "pydantic_core-2.10.0-cp37-cp37m-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:8f919d17581fdf6e71ff3d3fe4b02ed32aaa0429e0b4346798de7a1361e098ef"}, + {file = "pydantic_core-2.10.0-cp37-cp37m-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:f32df1d8d383e1b729674ad1053d8f43f7ed79848496d3cb6ca81a906318317b"}, + {file = "pydantic_core-2.10.0-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:ab4d279c480e83c516e4e0b7b1f882f168f614d9c62e18ab779edef0cd13aaa9"}, + {file = "pydantic_core-2.10.0-cp37-cp37m-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:c394e9ed6f9e6f4af3618c34bc15f2af4237f7d1989b7f45588f8e855bc10e08"}, + {file = "pydantic_core-2.10.0-cp37-cp37m-musllinux_1_1_aarch64.whl", hash = "sha256:bc0a33779fded534ff0b5d8ef766a1c94d3e740877ea8adab65cbf1878ba03b4"}, + {file = "pydantic_core-2.10.0-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:c1041d8fcd313c68b77dec6a16bf1d690008270b50eec11e96d89e1b4ba756b1"}, + {file = "pydantic_core-2.10.0-cp37-none-win32.whl", hash = "sha256:68992f78507e95ed63ca87b8b177785d9806cde34ca3a9f98382188dd11d8720"}, + {file = "pydantic_core-2.10.0-cp37-none-win_amd64.whl", hash = "sha256:aa45f0846773cb142252ccef66b096d917bb76c6ef9da1aa747e6b44aa318192"}, + {file = "pydantic_core-2.10.0-cp38-cp38-macosx_10_7_x86_64.whl", hash = "sha256:a04054b91afc41282a0a7426147654849136b37a41da86412d4ff5ba51b9cd2f"}, + {file = "pydantic_core-2.10.0-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:1c1bfa2ca352bf43d34b7099f8ed675deb88113bd36c76880f4ca18fc0d3af50"}, + {file = "pydantic_core-2.10.0-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:ba288fa675b2951e7898ebfdd8defa0e958e514d4d1cc7a5f6a8d627378c0c47"}, + {file = "pydantic_core-2.10.0-cp38-cp38-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:fbba90179672707ab69ad19ef7d3c3f0a8e2f0a0579f0eb79649ffcdacf476d0"}, + {file = "pydantic_core-2.10.0-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:7c6915a9b3dd16e016dba7e76070e667eca50530f957daa5b78c73abbf281b25"}, + {file = "pydantic_core-2.10.0-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:9e72c1e06a20c10b9c5f7a3fe09ec46e0e208c65a69d2efb92a3e1b64443e6c3"}, + {file = "pydantic_core-2.10.0-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:0b50848d1a614093c05c97d0fdf841ef547d8c087fbd06f6eafe8ef1d836d6c1"}, + {file = "pydantic_core-2.10.0-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:ad7b5f4352f3dfcc481b008bce3b3931a485a93112deaa0a25bee2817d3f7b98"}, + {file = "pydantic_core-2.10.0-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:66c0169457733a4dfe72be51dd359414eddd0738b15dda07827f18a10e9f6ab7"}, + {file = "pydantic_core-2.10.0-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:e24d92d3a60d6eb19a1bd0f1f259369f478e0f34412a33e794da6cdaa36218be"}, + {file = "pydantic_core-2.10.0-cp38-none-win32.whl", hash = "sha256:30c5df611afc5a9f2ad48babe2192f9cf0d12ed6c0dd5eb57b3538491c113737"}, + {file = "pydantic_core-2.10.0-cp38-none-win_amd64.whl", hash = "sha256:d72a561d7c0738ae5d05a709c739b2953d05e18151539750ca9622f3438de041"}, + {file = "pydantic_core-2.10.0-cp39-cp39-macosx_10_7_x86_64.whl", hash = "sha256:7cecd7669b1ebee8ae90f5aa7d459770b6e79db7b95983aacc5b7392a050b9ab"}, + {file = "pydantic_core-2.10.0-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:923000ea46def1bdded511b5792ec19866909797a05dc8f75342c6a9cacb2d66"}, + {file = "pydantic_core-2.10.0-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:729a2fc4bc1564d164258eaf138ab4c03baa2080a5e3f91a9b3cb2d758248b8f"}, + {file = "pydantic_core-2.10.0-cp39-cp39-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:6930eaf3aa2ba660ed3f64206902a534f454f9954e5de06354e20d890bebbd8a"}, + {file = "pydantic_core-2.10.0-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:d0b17e8d08a1c94efb91d8d389ec76a32fc3f85ba06626b5ef0c2d6bffcbe066"}, + {file = "pydantic_core-2.10.0-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:c61755149ba534123ae08e6aa814aa34f47c6ba45a622ea98ddd7860b5312767"}, + {file = "pydantic_core-2.10.0-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:22b126893f53c789ad2253c9288a59362171a5bafbb865190c43d430dc805edb"}, + {file = "pydantic_core-2.10.0-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:776eee60ca8ca3de83add0fb95a0034ac965a12590bb22ec09b05c87870ba401"}, + {file = "pydantic_core-2.10.0-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:b1496f38e49c7960461002768c5f4c9ba9720fe259cd5c8b229cd0b3b0861844"}, + {file = "pydantic_core-2.10.0-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:cd175beab2ac845a90d31bb4ea8e6c1e8be12efaf14b9918d0ab4828dd3c916b"}, + {file = "pydantic_core-2.10.0-cp39-none-win32.whl", hash = "sha256:391805e8a4ad731e729a22d8e14bad2d724915d28618be6c66dc7ccb421a13a0"}, + {file = "pydantic_core-2.10.0-cp39-none-win_amd64.whl", hash = "sha256:7e2360b86b21e2aab8d4f1ce2551e2b731bc30610b7cc9324ea7517af4375b08"}, + {file = "pydantic_core-2.10.0-pp310-pypy310_pp73-macosx_10_7_x86_64.whl", hash = "sha256:b40221d1490f2c6e488d2576773a574d42436b5aba1faed91f59a9feb82c384b"}, + {file = "pydantic_core-2.10.0-pp310-pypy310_pp73-macosx_11_0_arm64.whl", hash = "sha256:9f3b25201efe20d182f3bd6fe8d99685f4ed01cac67b79c017c9cf688b747263"}, + {file = "pydantic_core-2.10.0-pp310-pypy310_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:34a45943bb14275e9681fd4abafbe3acae1e7dac7248bebf38ac5bde492e00f7"}, + {file = "pydantic_core-2.10.0-pp310-pypy310_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:bc5be7a29a6b25a186941e9e2b5f9281c05723628e1fdb244f429f4c1682ff49"}, + {file = "pydantic_core-2.10.0-pp310-pypy310_pp73-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:17460ffd8f8e49ca52711b4926fefe2b336d01b63dc27aee432a576c2147c8ce"}, + {file = "pydantic_core-2.10.0-pp310-pypy310_pp73-musllinux_1_1_aarch64.whl", hash = "sha256:c1ab3701d660bd136a22e1ca95292bfed50245eb869adaee2e08f29d4dd5e360"}, + {file = "pydantic_core-2.10.0-pp310-pypy310_pp73-musllinux_1_1_x86_64.whl", hash = "sha256:09ac18617199704327d99c85893d697b8442c18b8c2db1ea636ba83313223541"}, + {file = "pydantic_core-2.10.0-pp310-pypy310_pp73-win_amd64.whl", hash = "sha256:e3f69d48191103587950981cf47c936064c808b6c18f57e745ed130a305c73a6"}, + {file = "pydantic_core-2.10.0-pp37-pypy37_pp73-macosx_10_7_x86_64.whl", hash = "sha256:792af9e4f78d6f1d0aabfb95162c5ed56b5369b25350eaa68b1495e8f675d4d9"}, + {file = "pydantic_core-2.10.0-pp37-pypy37_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:1ecd28fb4c98c97836046d092029017bcc35e060ea547484aa1234b8a592de17"}, + {file = "pydantic_core-2.10.0-pp37-pypy37_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:4a622a8abf656cc51960766fa4d194504e8a9f85ae48032f87fb42c79462c7b8"}, + {file = "pydantic_core-2.10.0-pp37-pypy37_pp73-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:52eb5c61de017bfee422f6aa9a3e76de5aa5a9189ba808bba63b9de67e55c4ca"}, + {file = "pydantic_core-2.10.0-pp37-pypy37_pp73-musllinux_1_1_aarch64.whl", hash = "sha256:69772dcdcf90b677d0d2ecedafe4c6a610572f1fad15912cde28a6f8eb5654fd"}, + {file = "pydantic_core-2.10.0-pp37-pypy37_pp73-musllinux_1_1_x86_64.whl", hash = "sha256:12470a4de172aaa1bbadb45744de4a9b0298fa8f974eb508314c3b5da0cb4aed"}, + {file = "pydantic_core-2.10.0-pp37-pypy37_pp73-win_amd64.whl", hash = "sha256:f9f2c70257f03db712658d4138e2b892bdd7c71472783eaebc2813a47fd29ef3"}, + {file = "pydantic_core-2.10.0-pp38-pypy38_pp73-macosx_10_7_x86_64.whl", hash = "sha256:8a5323d6778931ab1b3b22bac05fb7c961786d3b04a6c84f7c0ffcc331b4b998"}, + {file = "pydantic_core-2.10.0-pp38-pypy38_pp73-macosx_11_0_arm64.whl", hash = "sha256:5f00e83aa9aebbfd4382695a5ed94e6282ac01455fbb1a37d99d2effa29df30f"}, + {file = "pydantic_core-2.10.0-pp38-pypy38_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:c871820c60fc863c7b3f660612af6ce5bb8f5f69d6364f208e29d2ca7992d154"}, + {file = "pydantic_core-2.10.0-pp38-pypy38_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:c1bcb1b9b33573eeef218ffb3a2910c57fedc8831caf3c942e68a2222481d2cc"}, + {file = "pydantic_core-2.10.0-pp38-pypy38_pp73-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:d122a46c360c8069f7ac39c6f2c29cf99436baa48ba1e28ea5443336e9bbb838"}, + {file = "pydantic_core-2.10.0-pp38-pypy38_pp73-musllinux_1_1_aarch64.whl", hash = "sha256:3ffb2a3462bb7905c4d849b95f536ac1f3948e92f5e0fc7e65bd3f3b0d132cf4"}, + {file = "pydantic_core-2.10.0-pp38-pypy38_pp73-musllinux_1_1_x86_64.whl", hash = "sha256:b5d4eec8aba25b163a4d9dcc6be8354bc8f939040bc15a6400cbd62ba0511a5f"}, + {file = "pydantic_core-2.10.0-pp38-pypy38_pp73-win_amd64.whl", hash = "sha256:5cbfe4cd608cf6d032374961e4e07d0506acfaec7b1a69beade1d5f98dce00fd"}, + {file = "pydantic_core-2.10.0-pp39-pypy39_pp73-macosx_10_7_x86_64.whl", hash = "sha256:02b3d546342e7f583bf58f4a4618c7e97f44426db2358789393537dd4e9a921d"}, + {file = "pydantic_core-2.10.0-pp39-pypy39_pp73-macosx_11_0_arm64.whl", hash = "sha256:7820faf076216654ae54ad8a8443a296faaac9057a49ff404ce92ab85c9518a3"}, + {file = "pydantic_core-2.10.0-pp39-pypy39_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:f114130c44ae52b3bd2450dac8e1d3e1e92a92baecb24dbcdb6de2d2fc15bdb5"}, + {file = "pydantic_core-2.10.0-pp39-pypy39_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:9f6f70680c15876c583a24bd476e49004327e87392be0282aedbc65773519ea8"}, + {file = "pydantic_core-2.10.0-pp39-pypy39_pp73-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:3f230d70be54447e12fcd0f1c2319dac74341244fafd2350d5675aa194f6c3f4"}, + {file = "pydantic_core-2.10.0-pp39-pypy39_pp73-musllinux_1_1_aarch64.whl", hash = "sha256:96b3007451863b46e8138f8096ef31aea6f7721a9910843b0554ce4ae17024a2"}, + {file = "pydantic_core-2.10.0-pp39-pypy39_pp73-musllinux_1_1_x86_64.whl", hash = "sha256:b196c4ace34be6c2953c6ec3906d1af88c418b93325d612d7f900ed30bf1e0ac"}, + {file = "pydantic_core-2.10.0-pp39-pypy39_pp73-win_amd64.whl", hash = "sha256:5958b1af7acd7b4a629e9758ce54a31c1910695e85e0ef847ba3daa4f25a0a08"}, + {file = "pydantic_core-2.10.0.tar.gz", hash = "sha256:8fe66506700efdfc699c613ccc4974ac7d8fceed8c74983e55ec380504db2e05"}, +] + +[package.dependencies] +typing-extensions = ">=4.6.0,<4.7.0 || >4.7.0" + +[[package]] +name = "pydantic-settings" +version = "2.1.0" +description = "Settings management using Pydantic" +optional = false +python-versions = ">=3.8" +files = [ + {file = "pydantic_settings-2.1.0-py3-none-any.whl", hash = "sha256:7621c0cb5d90d1140d2f0ef557bdf03573aac7035948109adf2574770b77605a"}, + {file = "pydantic_settings-2.1.0.tar.gz", hash = "sha256:26b1492e0a24755626ac5e6d715e9077ab7ad4fb5f19a8b7ed7011d52f36141c"}, +] + +[package.dependencies] +pydantic = ">=2.3.0" +python-dotenv = ">=0.21.0" [[package]] name = "pygments" @@ -5642,18 +5912,15 @@ zstd = ["zstandard"] [[package]] name = "pyparsing" -version = "3.1.1" -description = "pyparsing module - Classes and methods to define and execute parsing grammars" +version = "2.4.7" +description = "Python parsing module" optional = false -python-versions = ">=3.6.8" +python-versions = ">=2.6, !=3.0.*, !=3.1.*, !=3.2.*" files = [ - {file = "pyparsing-3.1.1-py3-none-any.whl", hash = "sha256:32c7c0b711493c72ff18a981d24f28aaf9c1fb7ed5e9667c9e84e3db623bdbfb"}, - {file = "pyparsing-3.1.1.tar.gz", hash = "sha256:ede28a1a32462f5a9705e07aea48001a08f7cf81a021585011deba701581a0db"}, + {file = "pyparsing-2.4.7-py2.py3-none-any.whl", hash = "sha256:ef9d7589ef3c200abe66653d3f1ab1033c3c419ae9b9bdb1240a85b024efc88b"}, + {file = "pyparsing-2.4.7.tar.gz", hash = "sha256:c203ec8783bf771a155b207279b9bccb8dea02d8f0c9e5f8ead507bc3246ecc1"}, ] -[package.extras] -diagrams = ["jinja2", "railroad-diagrams"] - [[package]] name = "pypdf" version = "3.17.1" @@ -5675,6 +5942,16 @@ docs = ["myst_parser", "sphinx", "sphinx_rtd_theme"] full = ["Pillow (>=8.0.0)", "PyCryptodome", "cryptography"] image = ["Pillow (>=8.0.0)"] +[[package]] +name = "pypika" +version = "0.48.9" +description = "A SQL query builder API for Python" +optional = false +python-versions = "*" +files = [ + {file = "PyPika-0.48.9.tar.gz", hash = "sha256:838836a61747e7c8380cd1b7ff638694b7a7335345d0f559b04b2cd832ad5378"}, +] + [[package]] name = "pyreadline3" version = "3.4.1" @@ -6227,6 +6504,16 @@ python-dateutil = ">=2.8.1,<3.0.0" typing-extensions = ">=4.2.0,<5.0.0" websockets = ">=10.3,<11.0" +[[package]] +name = "red-black-tree-mod" +version = "1.20" +description = "Flexible python implementation of red black trees" +optional = false +python-versions = "*" +files = [ + {file = "red-black-tree-mod-1.20.tar.gz", hash = "sha256:2448e6fc9cbf1be204c753f352c6ee49aa8156dbf1faa57dfc26bd7705077e0a"}, +] + [[package]] name = "redis" version = "4.6.0" @@ -6247,13 +6534,13 @@ ocsp = ["cryptography (>=36.0.1)", "pyopenssl (==20.0.1)", "requests (>=2.26.0)" [[package]] name = "referencing" -version = "0.30.2" +version = "0.31.0" description = "JSON Referencing + Python" optional = false python-versions = ">=3.8" files = [ - {file = "referencing-0.30.2-py3-none-any.whl", hash = "sha256:449b6669b6121a9e96a7f9e410b245d471e8d48964c67113ce9afe50c8dd7bdf"}, - {file = "referencing-0.30.2.tar.gz", hash = "sha256:794ad8003c65938edcdbc027f1933215e0d0ccc0291e3ce20a4d87432b59efc0"}, + {file = "referencing-0.31.0-py3-none-any.whl", hash = "sha256:381b11e53dd93babb55696c71cf42aef2d36b8a150c49bf0bc301e36d536c882"}, + {file = "referencing-0.31.0.tar.gz", hash = "sha256:cc28f2c88fbe7b961a7817a0abc034c09a1e36358f82fedb4ffdf29a25398863"}, ] [package.dependencies] @@ -6528,6 +6815,25 @@ files = [ [package.dependencies] pyasn1 = ">=0.1.3" +[[package]] +name = "rtfde" +version = "0.1.0" +description = "A library for extracting HTML content from RTF encapsulated HTML as commonly found in the exchange MSG email format." +optional = false +python-versions = ">=3.6" +files = [ + {file = "RTFDE-0.1.0-py3-none-any.whl", hash = "sha256:a110dbef435803f3fba717d51a7b9c7a92695c2461637cc6eaf36a9f54386e26"}, + {file = "RTFDE-0.1.0.tar.gz", hash = "sha256:12215ee59856208010b9200c19afe0f9fa13a3fb39f44015979299c248cbacd7"}, +] + +[package.dependencies] +lark = "1.1.5" +oletools = ">=0.56" + +[package.extras] +dev = ["coverage (>=7.2.2)", "lxml (>=4.6)", "mypy (>=1.1.1)", "pdoc3 (>=0.10.0)"] +msg-parse = ["extract-msg (>=0.27)"] + [[package]] name = "ruff" version = "0.1.5" @@ -6554,6 +6860,23 @@ files = [ {file = "ruff-0.1.5.tar.gz", hash = "sha256:5cbec0ef2ae1748fb194f420fb03fb2c25c3258c86129af7172ff8f198f125ab"}, ] +[[package]] +name = "s3transfer" +version = "0.7.0" +description = "An Amazon S3 Transfer Manager" +optional = false +python-versions = ">= 3.7" +files = [ + {file = "s3transfer-0.7.0-py3-none-any.whl", hash = "sha256:10d6923c6359175f264811ef4bf6161a3156ce8e350e705396a7557d6293c33a"}, + {file = "s3transfer-0.7.0.tar.gz", hash = "sha256:fd3889a66f5fe17299fe75b82eae6cf722554edca744ca5d5fe308b104883d2e"}, +] + +[package.dependencies] +botocore = ">=1.12.36,<2.0a.0" + +[package.extras] +crt = ["botocore[crt] (>=1.20.29,<2.0a.0)"] + [[package]] name = "safetensors" version = "0.4.0" @@ -6946,107 +7269,99 @@ files = [ [[package]] name = "sqlalchemy" -version = "1.4.41" +version = "2.0.11" description = "Database Abstraction Library" optional = false -python-versions = "!=3.0.*,!=3.1.*,!=3.2.*,!=3.3.*,!=3.4.*,!=3.5.*,>=2.7" +python-versions = ">=3.7" files = [ - {file = "SQLAlchemy-1.4.41-cp27-cp27m-macosx_10_14_x86_64.whl", hash = "sha256:13e397a9371ecd25573a7b90bd037db604331cf403f5318038c46ee44908c44d"}, - {file = "SQLAlchemy-1.4.41-cp27-cp27m-manylinux_2_5_x86_64.manylinux1_x86_64.whl", hash = "sha256:2d6495f84c4fd11584f34e62f9feec81bf373787b3942270487074e35cbe5330"}, - {file = "SQLAlchemy-1.4.41-cp27-cp27m-win32.whl", hash = "sha256:e570cfc40a29d6ad46c9aeaddbdcee687880940a3a327f2c668dd0e4ef0a441d"}, - {file = "SQLAlchemy-1.4.41-cp27-cp27m-win_amd64.whl", hash = "sha256:5facb7fd6fa8a7353bbe88b95695e555338fb038ad19ceb29c82d94f62775a05"}, - {file = "SQLAlchemy-1.4.41-cp27-cp27mu-manylinux_2_5_x86_64.manylinux1_x86_64.whl", hash = "sha256:f37fa70d95658763254941ddd30ecb23fc4ec0c5a788a7c21034fc2305dab7cc"}, - {file = "SQLAlchemy-1.4.41-cp310-cp310-macosx_10_15_x86_64.whl", hash = "sha256:361f6b5e3f659e3c56ea3518cf85fbdae1b9e788ade0219a67eeaaea8a4e4d2a"}, - {file = "SQLAlchemy-1.4.41-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:0990932f7cca97fece8017414f57fdd80db506a045869d7ddf2dda1d7cf69ecc"}, - {file = "SQLAlchemy-1.4.41-cp310-cp310-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:cd767cf5d7252b1c88fcfb58426a32d7bd14a7e4942497e15b68ff5d822b41ad"}, - {file = "SQLAlchemy-1.4.41-cp310-cp310-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:5102fb9ee2c258a2218281adcb3e1918b793c51d6c2b4666ce38c35101bb940e"}, - {file = "SQLAlchemy-1.4.41-cp310-cp310-win32.whl", hash = "sha256:2082a2d2fca363a3ce21cfa3d068c5a1ce4bf720cf6497fb3a9fc643a8ee4ddd"}, - {file = "SQLAlchemy-1.4.41-cp310-cp310-win_amd64.whl", hash = "sha256:e4b12e3d88a8fffd0b4ca559f6d4957ed91bd4c0613a4e13846ab8729dc5c251"}, - {file = "SQLAlchemy-1.4.41-cp311-cp311-macosx_10_15_x86_64.whl", hash = "sha256:90484a2b00baedad361402c257895b13faa3f01780f18f4a104a2f5c413e4536"}, - {file = "SQLAlchemy-1.4.41-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:b67fc780cfe2b306180e56daaa411dd3186bf979d50a6a7c2a5b5036575cbdbb"}, - {file = "SQLAlchemy-1.4.41-cp311-cp311-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:2ad2b727fc41c7f8757098903f85fafb4bf587ca6605f82d9bf5604bd9c7cded"}, - {file = "SQLAlchemy-1.4.41-cp311-cp311-win32.whl", hash = "sha256:59bdc291165b6119fc6cdbc287c36f7f2859e6051dd923bdf47b4c55fd2f8bd0"}, - {file = "SQLAlchemy-1.4.41-cp311-cp311-win_amd64.whl", hash = "sha256:d2e054aed4645f9b755db85bc69fc4ed2c9020c19c8027976f66576b906a74f1"}, - {file = "SQLAlchemy-1.4.41-cp36-cp36m-macosx_10_14_x86_64.whl", hash = "sha256:4ba7e122510bbc07258dc42be6ed45997efdf38129bde3e3f12649be70683546"}, - {file = "SQLAlchemy-1.4.41-cp36-cp36m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:c0dcf127bb99458a9d211e6e1f0f3edb96c874dd12f2503d4d8e4f1fd103790b"}, - {file = "SQLAlchemy-1.4.41-cp36-cp36m-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:e16c2be5cb19e2c08da7bd3a87fed2a0d4e90065ee553a940c4fc1a0fb1ab72b"}, - {file = "SQLAlchemy-1.4.41-cp36-cp36m-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:f5ebeeec5c14533221eb30bad716bc1fd32f509196318fb9caa7002c4a364e4c"}, - {file = "SQLAlchemy-1.4.41-cp36-cp36m-win32.whl", hash = "sha256:3e2ef592ac3693c65210f8b53d0edcf9f4405925adcfc031ff495e8d18169682"}, - {file = "SQLAlchemy-1.4.41-cp36-cp36m-win_amd64.whl", hash = "sha256:eb30cf008850c0a26b72bd1b9be6730830165ce049d239cfdccd906f2685f892"}, - {file = "SQLAlchemy-1.4.41-cp37-cp37m-macosx_10_15_x86_64.whl", hash = "sha256:c23d64a0b28fc78c96289ffbd0d9d1abd48d267269b27f2d34e430ea73ce4b26"}, - {file = "SQLAlchemy-1.4.41-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:8eb8897367a21b578b26f5713833836f886817ee2ffba1177d446fa3f77e67c8"}, - {file = "SQLAlchemy-1.4.41-cp37-cp37m-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:14576238a5f89bcf504c5f0a388d0ca78df61fb42cb2af0efe239dc965d4f5c9"}, - {file = "SQLAlchemy-1.4.41-cp37-cp37m-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:639e1ae8d48b3c86ffe59c0daa9a02e2bfe17ca3d2b41611b30a0073937d4497"}, - {file = "SQLAlchemy-1.4.41-cp37-cp37m-win32.whl", hash = "sha256:0005bd73026cd239fc1e8ccdf54db58b6193be9a02b3f0c5983808f84862c767"}, - {file = "SQLAlchemy-1.4.41-cp37-cp37m-win_amd64.whl", hash = "sha256:5323252be2bd261e0aa3f33cb3a64c45d76829989fa3ce90652838397d84197d"}, - {file = "SQLAlchemy-1.4.41-cp38-cp38-macosx_10_15_x86_64.whl", hash = "sha256:05f0de3a1dc3810a776275763764bb0015a02ae0f698a794646ebc5fb06fad33"}, - {file = "SQLAlchemy-1.4.41-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:0002e829142b2af00b4eaa26c51728f3ea68235f232a2e72a9508a3116bd6ed0"}, - {file = "SQLAlchemy-1.4.41-cp38-cp38-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:22ff16cedab5b16a0db79f1bc99e46a6ddececb60c396562e50aab58ddb2871c"}, - {file = "SQLAlchemy-1.4.41-cp38-cp38-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:ccfd238f766a5bb5ee5545a62dd03f316ac67966a6a658efb63eeff8158a4bbf"}, - {file = "SQLAlchemy-1.4.41-cp38-cp38-win32.whl", hash = "sha256:58bb65b3274b0c8a02cea9f91d6f44d0da79abc993b33bdedbfec98c8440175a"}, - {file = "SQLAlchemy-1.4.41-cp38-cp38-win_amd64.whl", hash = "sha256:ce8feaa52c1640de9541eeaaa8b5fb632d9d66249c947bb0d89dd01f87c7c288"}, - {file = "SQLAlchemy-1.4.41-cp39-cp39-macosx_10_15_x86_64.whl", hash = "sha256:199a73c31ac8ea59937cc0bf3dfc04392e81afe2ec8a74f26f489d268867846c"}, - {file = "SQLAlchemy-1.4.41-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:4676d51c9f6f6226ae8f26dc83ec291c088fe7633269757d333978df78d931ab"}, - {file = "SQLAlchemy-1.4.41-cp39-cp39-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:036d8472356e1d5f096c5e0e1a7e0f9182140ada3602f8fff6b7329e9e7cfbcd"}, - {file = "SQLAlchemy-1.4.41-cp39-cp39-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:2307495d9e0ea00d0c726be97a5b96615035854972cc538f6e7eaed23a35886c"}, - {file = "SQLAlchemy-1.4.41-cp39-cp39-win32.whl", hash = "sha256:9c56e19780cd1344fcd362fd6265a15f48aa8d365996a37fab1495cae8fcd97d"}, - {file = "SQLAlchemy-1.4.41-cp39-cp39-win_amd64.whl", hash = "sha256:f5fa526d027d804b1f85cdda1eb091f70bde6fb7d87892f6dd5a48925bc88898"}, - {file = "SQLAlchemy-1.4.41.tar.gz", hash = "sha256:0292f70d1797e3c54e862e6f30ae474014648bc9c723e14a2fda730adb0a9791"}, + {file = "SQLAlchemy-2.0.11-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:e9069faea64d3390d90d16e5b2bc0652d8eb979ccdfd555822d96bc8d93afda1"}, + {file = "SQLAlchemy-2.0.11-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:8aea55b1754430449d43823c8c4da2d5c7621ccd1fcd4c36231417762542d4ef"}, + {file = "SQLAlchemy-2.0.11-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:0ccd20b5a4e3511c2f0c889b7b79a7462b6c6aa2c06d0f4943c27a552e35e091"}, + {file = "SQLAlchemy-2.0.11-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:c1dcfea87230e34d7d55f67959ed09d3e60e09b77c76996de151c32f1b780135"}, + {file = "SQLAlchemy-2.0.11-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:a836f391d7dc1039f10d2ef58cdc6e271462d6898dacdae1bfabfc16ca295f2c"}, + {file = "SQLAlchemy-2.0.11-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:25bbf89e6f171d37cf3a993dbeee18cb85abe37a421c40e78131bf339e48da9d"}, + {file = "SQLAlchemy-2.0.11-cp310-cp310-win32.whl", hash = "sha256:0624852aec618438a4cd7a53ce00835435588506e6f8fbd60deaf9ac109f7cd0"}, + {file = "SQLAlchemy-2.0.11-cp310-cp310-win_amd64.whl", hash = "sha256:d7eab7d668f95a1a2ef443da17154834adf9c5ac742a5992d5ebecbdca7d943e"}, + {file = "SQLAlchemy-2.0.11-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:aa81761ff674d2e2d591fc88d31835d3ecf65bddb021a522f4eaaae831c584cf"}, + {file = "SQLAlchemy-2.0.11-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:21f447403a1bfeb832a7384c4ac742b7baab04460632c0335e020e8e2c741d4b"}, + {file = "SQLAlchemy-2.0.11-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:e4d8d96c0a7265de8496250a2c2d02593da5e5e85ea24b5c54c2db028d74cf8c"}, + {file = "SQLAlchemy-2.0.11-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:7c4c5834789f718315cb25d1b95d18fde91b72a1a158cdc515d7f6380c1f02a3"}, + {file = "SQLAlchemy-2.0.11-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:f57965a9d5882efdea0a2c87ae2f6c7dbc14591dcd0639209b50eec2b3ec947e"}, + {file = "SQLAlchemy-2.0.11-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:0dd98b0be54503afc4c74e947720c3196f96fb2546bfa54d911d5de313c5463c"}, + {file = "SQLAlchemy-2.0.11-cp311-cp311-win32.whl", hash = "sha256:eec40c522781a58839df6a2a7a2d9fbaa473419a3ab94633d61e00a8c0c768b7"}, + {file = "SQLAlchemy-2.0.11-cp311-cp311-win_amd64.whl", hash = "sha256:62835d8cd6713458c032466c38a43e56503e19ea6e54b0e73295c6ab281fc0b1"}, + {file = "SQLAlchemy-2.0.11-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:216b9c4dbeaa143a36c9249f9e5a0fd7fa6549a1a3f9de9a2d30104f7e35d8b9"}, + {file = "SQLAlchemy-2.0.11-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:aae7710fd24bcf33abed7ab7673dbb38ad48f20555835ff8c77258f07de46a87"}, + {file = "SQLAlchemy-2.0.11-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:718c0a9f8509542d0674c15b01f362b2f10e8bc425db74444bda4e073e06e660"}, + {file = "SQLAlchemy-2.0.11-cp37-cp37m-musllinux_1_1_aarch64.whl", hash = "sha256:2a5fb41db86f6d4892edcf30bd67418dd757eb0246242648e610fa2bca7533d4"}, + {file = "SQLAlchemy-2.0.11-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:352dcd93e5a0421eee59dbac0000f8f811203cf228334d85d77b3ef075707322"}, + {file = "SQLAlchemy-2.0.11-cp37-cp37m-win32.whl", hash = "sha256:fb21777cc9205b94f51688cdcba0924bdecbeb23dcf81473ff8c5352211e6e38"}, + {file = "SQLAlchemy-2.0.11-cp37-cp37m-win_amd64.whl", hash = "sha256:2f9268d7417467e9fde5f4364c71ce490b18a4b83a6543b0d55d1f83fce42bda"}, + {file = "SQLAlchemy-2.0.11-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:125c41b3557179e9a514a1cfe2764433177ba6195b2264725ceaa7a2e8afcbde"}, + {file = "SQLAlchemy-2.0.11-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:e19a03413cf36e86674857e519936b9c9e52059ba9f6e2ab0ec75d9a458277cb"}, + {file = "SQLAlchemy-2.0.11-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:e48d908695abe05435250e0a083416cc49bd5afd46bc16a7ec8725771aad8eac"}, + {file = "SQLAlchemy-2.0.11-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:3728f7518aa70e5ce88fae4c68b5d7f25493f37d8d867e4a7d60905bd162cd0d"}, + {file = "SQLAlchemy-2.0.11-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:1ab6ac214354957db83c72c65941af7e022d4c9324bdadc54d0266aa162a3828"}, + {file = "SQLAlchemy-2.0.11-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:abadc6bf6b2c0a0be4370513221563afdbac3901d29fcdb7faf23b4e1ed26068"}, + {file = "SQLAlchemy-2.0.11-cp38-cp38-win32.whl", hash = "sha256:78cbc8eba442c9b8dc2d90c43ac477f0ee27467617704cd82d741b2eb061afb2"}, + {file = "SQLAlchemy-2.0.11-cp38-cp38-win_amd64.whl", hash = "sha256:384fdde6bd628d1a882f04aa9a40aa6928840b02d595ff5bd08abeae4c25f867"}, + {file = "SQLAlchemy-2.0.11-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:737a70c994f5b34e437a6ca754957a7a0f6f76c59fa460fc59d1bd15b8f8cb32"}, + {file = "SQLAlchemy-2.0.11-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:0e53e4920cd5872280256ddf6ca843b5d1435e0302847992bcb90f84b744999f"}, + {file = "SQLAlchemy-2.0.11-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:409cc6cd15d4db5c5af2c4e2d3a2137815c31d065cea9a77dec92cbe7cfcf448"}, + {file = "SQLAlchemy-2.0.11-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:a71dd742e3146be6fdded0b95a4b779f7d81595760eab32b0f718089573d3b86"}, + {file = "SQLAlchemy-2.0.11-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:d85ca17b070f7076ec2582324331cf3683c09146fd8bd2621e8d80d6c3a93bbf"}, + {file = "SQLAlchemy-2.0.11-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:a785c30929a5d82f2fa1c60ec46d623d418b19981dc0c594da806d3901658e39"}, + {file = "SQLAlchemy-2.0.11-cp39-cp39-win32.whl", hash = "sha256:66f24708cebe5a4e900e221574b50e102908f60f539fea30f1922705c0e97744"}, + {file = "SQLAlchemy-2.0.11-cp39-cp39-win_amd64.whl", hash = "sha256:5a2f95901e6bbed27b4ad5d59ab3f970eda0ce0b9ede3a67b6f9a914149ed71b"}, + {file = "SQLAlchemy-2.0.11-py3-none-any.whl", hash = "sha256:1d28e8278d943d9111d44720f92cc338282e956ed68849bfcee053c06bde4f39"}, + {file = "SQLAlchemy-2.0.11.tar.gz", hash = "sha256:c3cbff7cced3c42dbe71448ce6bf4202b4a2d305e78dd77e3f280ba6cd245138"}, ] [package.dependencies] -greenlet = {version = "!=0.4.17", markers = "python_version >= \"3\" and (platform_machine == \"aarch64\" or platform_machine == \"ppc64le\" or platform_machine == \"x86_64\" or platform_machine == \"amd64\" or platform_machine == \"AMD64\" or platform_machine == \"win32\" or platform_machine == \"WIN32\")"} +greenlet = {version = "!=0.4.17", markers = "platform_machine == \"aarch64\" or platform_machine == \"ppc64le\" or platform_machine == \"x86_64\" or platform_machine == \"amd64\" or platform_machine == \"AMD64\" or platform_machine == \"win32\" or platform_machine == \"WIN32\""} +typing-extensions = ">=4.2.0" [package.extras] aiomysql = ["aiomysql", "greenlet (!=0.4.17)"] aiosqlite = ["aiosqlite", "greenlet (!=0.4.17)", "typing-extensions (!=3.10.0.1)"] asyncio = ["greenlet (!=0.4.17)"] -asyncmy = ["asyncmy (>=0.2.3,!=0.2.4)", "greenlet (!=0.4.17)"] -mariadb-connector = ["mariadb (>=1.0.1,!=1.1.2)"] +asyncmy = ["asyncmy (>=0.2.3,!=0.2.4,!=0.2.6)", "greenlet (!=0.4.17)"] +mariadb-connector = ["mariadb (>=1.0.1,!=1.1.2,!=1.1.5)"] mssql = ["pyodbc"] mssql-pymssql = ["pymssql"] mssql-pyodbc = ["pyodbc"] -mypy = ["mypy (>=0.910)", "sqlalchemy2-stubs"] -mysql = ["mysqlclient (>=1.4.0)", "mysqlclient (>=1.4.0,<2)"] +mypy = ["mypy (>=0.910)"] +mysql = ["mysqlclient (>=1.4.0)"] mysql-connector = ["mysql-connector-python"] -oracle = ["cx-oracle (>=7)", "cx-oracle (>=7,<8)"] +oracle = ["cx-oracle (>=7)"] +oracle-oracledb = ["oracledb (>=1.0.1)"] postgresql = ["psycopg2 (>=2.7)"] postgresql-asyncpg = ["asyncpg", "greenlet (!=0.4.17)"] -postgresql-pg8000 = ["pg8000 (>=1.16.6,!=1.29.0)"] +postgresql-pg8000 = ["pg8000 (>=1.29.1)"] +postgresql-psycopg = ["psycopg (>=3.0.7)"] postgresql-psycopg2binary = ["psycopg2-binary"] postgresql-psycopg2cffi = ["psycopg2cffi"] -pymysql = ["pymysql", "pymysql (<1)"] +pymysql = ["pymysql"] sqlcipher = ["sqlcipher3-binary"] -[[package]] -name = "sqlalchemy2-stubs" -version = "0.0.2a37" -description = "Typing Stubs for SQLAlchemy 1.4" -optional = false -python-versions = ">=3.6" -files = [ - {file = "sqlalchemy2-stubs-0.0.2a37.tar.gz", hash = "sha256:619bd131f8ad7eeb88af8dfabb0e6ba07593db91868cdc49674d2cd4ca61e986"}, - {file = "sqlalchemy2_stubs-0.0.2a37-py3-none-any.whl", hash = "sha256:43067e3f67bd16a7fb2b574ee696f7ed53bf60f3e73329cf234a7b4dd4d3816a"}, -] - -[package.dependencies] -typing-extensions = ">=3.7.4" - [[package]] name = "sqlmodel" -version = "0.0.8" +version = "0" description = "SQLModel, SQL databases in Python, designed for simplicity, compatibility, and robustness." optional = false -python-versions = ">=3.6.1,<4.0.0" -files = [ - {file = "sqlmodel-0.0.8-py3-none-any.whl", hash = "sha256:0fd805719e0c5d4f22be32eb3ffc856eca3f7f20e8c7aa3e117ad91684b518ee"}, - {file = "sqlmodel-0.0.8.tar.gz", hash = "sha256:3371b4d1ad59d2ffd0c530582c2140b6c06b090b32af9b9c6412986d7b117036"}, -] +python-versions = "^3.7" +files = [] +develop = false [package.dependencies] -pydantic = ">=1.8.2,<2.0.0" -SQLAlchemy = ">=1.4.17,<=1.4.41" -sqlalchemy2-stubs = "*" +pydantic = {version = ">=2.1.1,<=2.4", extras = ["email"]} +SQLAlchemy = ">=2.0.0,<=2.0.11" + +[package.source] +type = "git" +url = "https://github.com/honglei/sqlmodel.git" +reference = "main" +resolved_reference = "3005495a3ec6c8216b31cbd623f91c7bc8ba174f" [[package]] name = "stack-data" @@ -7119,32 +7434,32 @@ test = ["pylint", "pytest", "pytest-black", "pytest-cov", "pytest-pylint"] [[package]] name = "supabase" -version = "1.2.0" +version = "2.0.3" description = "Supabase client for Python." optional = false python-versions = ">=3.8,<4.0" files = [ - {file = "supabase-1.2.0-py3-none-any.whl", hash = "sha256:1549600a3965d64de97f2eb37e4e562b7d171383f439ceaab881c5cd6a79e9f7"}, - {file = "supabase-1.2.0.tar.gz", hash = "sha256:2597ef8ec6af973b9c9e94849204f43f47bb5f46d8c65a0c7a6bdf95ad018704"}, + {file = "supabase-2.0.3-py3-none-any.whl", hash = "sha256:7385c1bd7897d93ba0fb1c5f33496efcbab2264eb44738c4c14284adbfd97099"}, + {file = "supabase-2.0.3.tar.gz", hash = "sha256:89b6556bf4f5f2e3dd1255f5840ceb12c3dc187ce8947b9bc0f5f7b0ad010971"}, ] [package.dependencies] -gotrue = ">=1.0.4,<2.0.0" +gotrue = ">=1.3.0,<2.0.0" httpx = ">=0.24.0,<0.25.0" -postgrest = ">=0.10.8,<0.12.0" +postgrest = ">=0.10.8,<0.14.0" realtime = ">=1.0.0,<2.0.0" storage3 = ">=0.5.3,<0.7.0" -supafunc = ">=0.2.3,<0.3.0" +supafunc = ">=0.3.1,<0.4.0" [[package]] name = "supafunc" -version = "0.2.3" +version = "0.3.1" description = "Library for Supabase Functions" optional = false python-versions = ">=3.8,<4.0" files = [ - {file = "supafunc-0.2.3-py3-none-any.whl", hash = "sha256:4124773799682207d0c6ed90b72271f717373977f7de9d12a641bf32f8e13897"}, - {file = "supafunc-0.2.3.tar.gz", hash = "sha256:b23ec2559bcd56ad74fec42cf9dd28c131ba1f00b5ba21853557ed8960891a9b"}, + {file = "supafunc-0.3.1-py3-none-any.whl", hash = "sha256:8d0f3e09bd2d6bef2088cf91e4337aa920bf5e8ecadd24235e4a276c8c6b301c"}, + {file = "supafunc-0.3.1.tar.gz", hash = "sha256:8ab338216f3845d52c45c9fdc3246a719d3f9b8d8647e8bc382fb5cdda54ddb9"}, ] [package.dependencies] @@ -7610,17 +7925,6 @@ dev = ["autoflake (>=1.3.1,<2.0.0)", "flake8 (>=3.8.3,<4.0.0)", "pre-commit (>=2 doc = ["cairosvg (>=2.5.2,<3.0.0)", "mdx-include (>=1.4.1,<2.0.0)", "mkdocs (>=1.1.2,<2.0.0)", "mkdocs-material (>=8.1.4,<9.0.0)", "pillow (>=9.3.0,<10.0.0)"] test = ["black (>=22.3.0,<23.0.0)", "coverage (>=6.2,<7.0)", "isort (>=5.0.6,<6.0.0)", "mypy (==0.910)", "pytest (>=4.4.0,<8.0.0)", "pytest-cov (>=2.10.0,<5.0.0)", "pytest-sugar (>=0.9.4,<0.10.0)", "pytest-xdist (>=1.32.0,<4.0.0)", "rich (>=10.11.0,<14.0.0)", "shellingham (>=1.3.0,<2.0.0)"] -[[package]] -name = "types-appdirs" -version = "1.4.3.5" -description = "Typing stubs for appdirs" -optional = false -python-versions = "*" -files = [ - {file = "types-appdirs-1.4.3.5.tar.gz", hash = "sha256:83268da64585361bfa291f8f506a209276212a0497bd37f0512a939b3d69ff14"}, - {file = "types_appdirs-1.4.3.5-py3-none-any.whl", hash = "sha256:337c750e423c40911d389359b4edabe5bbc2cdd5cd0bd0518b71d2839646273b"}, -] - [[package]] name = "types-cachetools" version = "5.3.0.7" @@ -7814,6 +8118,23 @@ files = [ {file = "tzdata-2023.3.tar.gz", hash = "sha256:11ef1e08e54acb0d4f95bdb1be05da659673de4acbd21bf9c69e94cc5e907a3a"}, ] +[[package]] +name = "tzlocal" +version = "5.2" +description = "tzinfo object for the local timezone" +optional = false +python-versions = ">=3.8" +files = [ + {file = "tzlocal-5.2-py3-none-any.whl", hash = "sha256:49816ef2fe65ea8ac19d19aa7a1ae0551c834303d5014c6d5a62e4cbda8047b8"}, + {file = "tzlocal-5.2.tar.gz", hash = "sha256:8d399205578f1a9342816409cc1e46a93ebd5755e39ea2d85334bea911bf0e6e"}, +] + +[package.dependencies] +tzdata = {version = "*", markers = "platform_system == \"Windows\""} + +[package.extras] +devenv = ["check-manifest", "pytest (>=4.3)", "pytest-cov", "pytest-mock (>=3.3)", "zest.releaser"] + [[package]] name = "unstructured" version = "0.10.30" @@ -8264,6 +8585,16 @@ files = [ beautifulsoup4 = "*" requests = ">=2.0.0,<3.0.0" +[[package]] +name = "win-unicode-console" +version = "0.5" +description = "Enable Unicode input and display when running Python from Windows console." +optional = false +python-versions = "*" +files = [ + {file = "win_unicode_console-0.5.zip", hash = "sha256:d4142d4d56d46f449d6f00536a73625a871cba040f0bc1a2e305a04578f07d1e"}, +] + [[package]] name = "win32-setctime" version = "1.1.0" @@ -8444,6 +8775,22 @@ files = [ idna = ">=2.0" multidict = ">=4.0" +[[package]] +name = "zep-python" +version = "1.4.1" +description = "Zep: Fast, scalable building blocks for LLM apps. This is the Python client for the Zep service." +optional = false +python-versions = ">=3.8.1,<4" +files = [ + {file = "zep_python-1.4.1-py3-none-any.whl", hash = "sha256:51237bcdda7824b85afe9990692cbf7ca166c8221fddd9711b211d12752db306"}, + {file = "zep_python-1.4.1.tar.gz", hash = "sha256:0e65d8f346e80e7f3c76d4d979d15c9946f4e89c12bb68cc5c5cfa3bbb6e7ef1"}, +] + +[package.dependencies] +httpx = ">=0.24.0,<0.25.0" +packaging = ">=23.1,<24.0" +pydantic = ">=1.10.7" + [[package]] name = "zipp" version = "3.17.0" @@ -8530,67 +8877,6 @@ docs = ["Sphinx", "repoze.sphinx.autointerface", "sphinx-rtd-theme"] test = ["coverage (>=5.0.3)", "zope.event", "zope.testing"] testing = ["coverage (>=5.0.3)", "zope.event", "zope.testing"] -[[package]] -name = "zstandard" -version = "0.22.0" -description = "Zstandard bindings for Python" -optional = false -python-versions = ">=3.8" -files = [ - {file = "zstandard-0.22.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:275df437ab03f8c033b8a2c181e51716c32d831082d93ce48002a5227ec93019"}, - {file = "zstandard-0.22.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:2ac9957bc6d2403c4772c890916bf181b2653640da98f32e04b96e4d6fb3252a"}, - {file = "zstandard-0.22.0-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:fe3390c538f12437b859d815040763abc728955a52ca6ff9c5d4ac707c4ad98e"}, - {file = "zstandard-0.22.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:1958100b8a1cc3f27fa21071a55cb2ed32e9e5df4c3c6e661c193437f171cba2"}, - {file = "zstandard-0.22.0-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:93e1856c8313bc688d5df069e106a4bc962eef3d13372020cc6e3ebf5e045202"}, - {file = "zstandard-0.22.0-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:1a90ba9a4c9c884bb876a14be2b1d216609385efb180393df40e5172e7ecf356"}, - {file = "zstandard-0.22.0-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:3db41c5e49ef73641d5111554e1d1d3af106410a6c1fb52cf68912ba7a343a0d"}, - {file = "zstandard-0.22.0-cp310-cp310-win32.whl", hash = "sha256:d8593f8464fb64d58e8cb0b905b272d40184eac9a18d83cf8c10749c3eafcd7e"}, - {file = "zstandard-0.22.0-cp310-cp310-win_amd64.whl", hash = "sha256:f1a4b358947a65b94e2501ce3e078bbc929b039ede4679ddb0460829b12f7375"}, - {file = "zstandard-0.22.0-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:589402548251056878d2e7c8859286eb91bd841af117dbe4ab000e6450987e08"}, - {file = "zstandard-0.22.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:a97079b955b00b732c6f280d5023e0eefe359045e8b83b08cf0333af9ec78f26"}, - {file = "zstandard-0.22.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:445b47bc32de69d990ad0f34da0e20f535914623d1e506e74d6bc5c9dc40bb09"}, - {file = "zstandard-0.22.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:33591d59f4956c9812f8063eff2e2c0065bc02050837f152574069f5f9f17775"}, - {file = "zstandard-0.22.0-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:888196c9c8893a1e8ff5e89b8f894e7f4f0e64a5af4d8f3c410f0319128bb2f8"}, - {file = "zstandard-0.22.0-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:53866a9d8ab363271c9e80c7c2e9441814961d47f88c9bc3b248142c32141d94"}, - {file = "zstandard-0.22.0-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:4ac59d5d6910b220141c1737b79d4a5aa9e57466e7469a012ed42ce2d3995e88"}, - {file = "zstandard-0.22.0-cp311-cp311-win32.whl", hash = "sha256:2b11ea433db22e720758cba584c9d661077121fcf60ab43351950ded20283440"}, - {file = "zstandard-0.22.0-cp311-cp311-win_amd64.whl", hash = "sha256:11f0d1aab9516a497137b41e3d3ed4bbf7b2ee2abc79e5c8b010ad286d7464bd"}, - {file = "zstandard-0.22.0-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:6c25b8eb733d4e741246151d895dd0308137532737f337411160ff69ca24f93a"}, - {file = "zstandard-0.22.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:f9b2cde1cd1b2a10246dbc143ba49d942d14fb3d2b4bccf4618d475c65464912"}, - {file = "zstandard-0.22.0-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:a88b7df61a292603e7cd662d92565d915796b094ffb3d206579aaebac6b85d5f"}, - {file = "zstandard-0.22.0-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:466e6ad8caefb589ed281c076deb6f0cd330e8bc13c5035854ffb9c2014b118c"}, - {file = "zstandard-0.22.0-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:a1d67d0d53d2a138f9e29d8acdabe11310c185e36f0a848efa104d4e40b808e4"}, - {file = "zstandard-0.22.0-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:39b2853efc9403927f9065cc48c9980649462acbdf81cd4f0cb773af2fd734bc"}, - {file = "zstandard-0.22.0-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:8a1b2effa96a5f019e72874969394edd393e2fbd6414a8208fea363a22803b45"}, - {file = "zstandard-0.22.0-cp312-cp312-win32.whl", hash = "sha256:88c5b4b47a8a138338a07fc94e2ba3b1535f69247670abfe422de4e0b344aae2"}, - {file = "zstandard-0.22.0-cp312-cp312-win_amd64.whl", hash = "sha256:de20a212ef3d00d609d0b22eb7cc798d5a69035e81839f549b538eff4105d01c"}, - {file = "zstandard-0.22.0-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:d75f693bb4e92c335e0645e8845e553cd09dc91616412d1d4650da835b5449df"}, - {file = "zstandard-0.22.0-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:36a47636c3de227cd765e25a21dc5dace00539b82ddd99ee36abae38178eff9e"}, - {file = "zstandard-0.22.0-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:68953dc84b244b053c0d5f137a21ae8287ecf51b20872eccf8eaac0302d3e3b0"}, - {file = "zstandard-0.22.0-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:2612e9bb4977381184bb2463150336d0f7e014d6bb5d4a370f9a372d21916f69"}, - {file = "zstandard-0.22.0-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:23d2b3c2b8e7e5a6cb7922f7c27d73a9a615f0a5ab5d0e03dd533c477de23004"}, - {file = "zstandard-0.22.0-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:1d43501f5f31e22baf822720d82b5547f8a08f5386a883b32584a185675c8fbf"}, - {file = "zstandard-0.22.0-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:a493d470183ee620a3df1e6e55b3e4de8143c0ba1b16f3ded83208ea8ddfd91d"}, - {file = "zstandard-0.22.0-cp38-cp38-win32.whl", hash = "sha256:7034d381789f45576ec3f1fa0e15d741828146439228dc3f7c59856c5bcd3292"}, - {file = "zstandard-0.22.0-cp38-cp38-win_amd64.whl", hash = "sha256:d8fff0f0c1d8bc5d866762ae95bd99d53282337af1be9dc0d88506b340e74b73"}, - {file = "zstandard-0.22.0-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:2fdd53b806786bd6112d97c1f1e7841e5e4daa06810ab4b284026a1a0e484c0b"}, - {file = "zstandard-0.22.0-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:73a1d6bd01961e9fd447162e137ed949c01bdb830dfca487c4a14e9742dccc93"}, - {file = "zstandard-0.22.0-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:9501f36fac6b875c124243a379267d879262480bf85b1dbda61f5ad4d01b75a3"}, - {file = "zstandard-0.22.0-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:48f260e4c7294ef275744210a4010f116048e0c95857befb7462e033f09442fe"}, - {file = "zstandard-0.22.0-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:959665072bd60f45c5b6b5d711f15bdefc9849dd5da9fb6c873e35f5d34d8cfb"}, - {file = "zstandard-0.22.0-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:d22fdef58976457c65e2796e6730a3ea4a254f3ba83777ecfc8592ff8d77d303"}, - {file = "zstandard-0.22.0-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:a7ccf5825fd71d4542c8ab28d4d482aace885f5ebe4b40faaa290eed8e095a4c"}, - {file = "zstandard-0.22.0-cp39-cp39-win32.whl", hash = "sha256:f058a77ef0ece4e210bb0450e68408d4223f728b109764676e1a13537d056bb0"}, - {file = "zstandard-0.22.0-cp39-cp39-win_amd64.whl", hash = "sha256:e9e9d4e2e336c529d4c435baad846a181e39a982f823f7e4495ec0b0ec8538d2"}, - {file = "zstandard-0.22.0.tar.gz", hash = "sha256:8226a33c542bcb54cd6bd0a366067b610b41713b64c9abec1bc4533d69f51e70"}, -] - -[package.dependencies] -cffi = {version = ">=1.11", markers = "platform_python_implementation == \"PyPy\""} - -[package.extras] -cffi = ["cffi (>=1.11)"] - [extras] all = [] deploy = ["celery", "flower", "redis"] @@ -8599,4 +8885,4 @@ local = ["ctransformers", "llama-cpp-python", "sentence-transformers"] [metadata] lock-version = "2.0" python-versions = ">=3.9,<3.11" -content-hash = "e8501192f8cc6149dd1e27f6d791eac0d9b63ebc53f140e399f2c6b11400b7a8" +content-hash = "ab18ac504d15c9a85e1fe6457df0bef60aeeb96ed78d7281fbe3eb7c9017c8f4" diff --git a/pyproject.toml b/pyproject.toml index 0169e9746..d561e38a7 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -1,6 +1,6 @@ [tool.poetry] name = "langflow" -version = "0.5.3" +version = "0.6.0a0" description = "A Python package with a built-in web application" authors = ["Logspace "] maintainers = [ @@ -25,30 +25,32 @@ documentation = "https://docs.langflow.org" langflow = "langflow.__main__:main" [tool.poetry.dependencies] + + python = ">=3.9,<3.11" -fastapi = "^0.103.0" +fastapi = "^0.104.0" uvicorn = "^0.23.0" beautifulsoup4 = "^4.12.2" google-search-results = "^2.4.1" google-api-python-client = "^2.79.0" typer = "^0.9.0" gunicorn = "^21.2.0" -langchain = "^0.0.312" +langchain = "~0.0.327" openai = "^0.27.8" pandas = "2.0.3" -chromadb = "^0.3.21" +chromadb = "^0.4.0" huggingface-hub = { version = "^0.16.0", extras = ["inference"] } -rich = "^13.5.0" -llama-cpp-python = { version = "~0.1.0", optional = true } +rich = "^13.6.0" +llama-cpp-python = { version = "~0.2.0", optional = true } networkx = "^3.1" unstructured = "^0.10.0" -pypdf = "^3.15.0" +pypdf = "^3.17.0" lxml = "^4.9.2" pysrt = "^1.1.2" -fake-useragent = "^1.2.1" +fake-useragent = "^1.3.0" docstring-parser = "^0.15" psycopg2-binary = "^2.9.6" -pyarrow = "^12.0.0" +pyarrow = "^14.0.0" tiktoken = "~0.5.0" wikipedia = "^1.4.0" qdrant-client = "^1.4.0" @@ -57,25 +59,26 @@ weaviate-client = "^3.23.0" jina = "3.15.2" sentence-transformers = { version = "^2.2.2", optional = true } ctransformers = { version = "^0.2.10", optional = true } -cohere = "^4.27.0" +cohere = "^4.32.0" python-multipart = "^0.0.6" -sqlmodel = "^0.0.8" +# install sqlmodel using https://github.com/honglei/sqlmodel.git +sqlmodel = { git = "https://github.com/honglei/sqlmodel.git", branch = "main" } faiss-cpu = "^1.7.4" -anthropic = "^0.3.0" +anthropic = "^0.5.0" orjson = "3.9.3" multiprocess = "^0.70.14" cachetools = "^5.3.1" types-cachetools = "^5.3.0.5" -appdirs = "^1.4.4" +platformdirs = "^3.11.0" pinecone-client = "^2.2.2" -supabase = "^1.0.3" -pymongo = "^4.4.0" +pymongo = "^4.5.0" +supabase = "^2.0.3" certifi = "^2023.5.7" -google-cloud-aiplatform = "^1.26.1" +google-cloud-aiplatform = "^1.36.0" psycopg = "^3.1.9" psycopg-binary = "^3.1.9" fastavro = "^1.8.0" -langchain-experimental = "^0.0.8" +langchain-experimental = "*" celery = { extras = ["redis"], version = "^5.3.1", optional = true } redis = { version = "^4.6.0", optional = true } flower = { version = "^2.0.0", optional = true } @@ -84,15 +87,21 @@ passlib = "^1.7.4" bcrypt = "^4.0.1" python-jose = "^3.3.0" metaphor-python = "^0.1.11" +pydantic = "^2.0.0" +pydantic-settings = "^2.0.3" +zep-python = { version = "^1.3.0", allow-prereleases = true } pywin32 = { version = "^306", markers = "sys_platform == 'win32'" } loguru = "^0.7.1" -langfuse = "^1.0.13" +langfuse = "^1.1.11" pillow = "^10.0.0" -metal-sdk = "^2.2.0" +metal-sdk = "^2.4.0" markupsafe = "^2.1.3" +extract-msg = "^0.45.0" +jq = "^1.6.0" +boto3 = "^1.28.63" numexpr = "^2.8.6" qianfan = "0.0.5" - +pgvector = "^0.2.3" [tool.poetry.group.dev.dependencies] types-redis = "^4.6.0.5" @@ -100,13 +109,12 @@ ipykernel = "^6.21.2" mypy = "^1.1.1" ruff = "^0.1.5" httpx = "*" -pytest = "^7.2.2" -types-requests = "^2.28.11" -requests = "^2.28.0" -pytest-cov = "^4.0.0" +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-appdirs = "^1.4.3.5" types-pyyaml = "^6.0.12.8" types-python-jose = "^3.3.4.8" types-passlib = "^1.7.7.13" diff --git a/src/backend/langflow/api/v1/base.py b/src/backend/langflow/api/v1/base.py index 701c953cd..15bb4e17a 100644 --- a/src/backend/langflow/api/v1/base.py +++ b/src/backend/langflow/api/v1/base.py @@ -1,6 +1,6 @@ from typing import Optional from langflow.template.frontend_node.base import FrontendNode -from pydantic import BaseModel, validator +from pydantic import field_validator, BaseModel from langflow.interface.utils import extract_input_variables_from_prompt from langchain.prompts import PromptTemplate @@ -30,11 +30,13 @@ class CodeValidationResponse(BaseModel): imports: dict function: dict - @validator("imports") + @field_validator("imports") + @classmethod def validate_imports(cls, v): return v or {"errors": []} - @validator("function") + @field_validator("function") + @classmethod def validate_function(cls, v): return v or {"errors": []} diff --git a/src/backend/langflow/api/v1/chat.py b/src/backend/langflow/api/v1/chat.py index c8be9cca2..51779b2c9 100644 --- a/src/backend/langflow/api/v1/chat.py +++ b/src/backend/langflow/api/v1/chat.py @@ -12,7 +12,10 @@ from langflow.api.utils import build_input_keys_response from langflow.api.v1.schemas import BuildStatus, BuiltResponse, InitResponse, StreamData from langflow.graph.graph.base import Graph -from langflow.services.auth.utils import get_current_active_user, get_current_user +from langflow.services.auth.utils import ( + get_current_active_user, + get_current_user_by_jwt, +) from langflow.services.cache.utils import update_build_status from loguru import logger from langflow.services.deps import get_chat_service, get_session, get_cache_service @@ -34,8 +37,8 @@ async def chat( ): """Websocket endpoint for chat.""" try: + user = await get_current_user_by_jwt(token, db) await websocket.accept() - user = await get_current_user(token, db) if not user: await websocket.close(code=status.WS_1008_POLICY_VIOLATION, reason="Unauthorized") if not user.is_active: @@ -149,6 +152,11 @@ async def stream_build( number_of_nodes = len(graph.nodes) update_build_status(cache_service, flow_id, BuildStatus.IN_PROGRESS) + try: + user_id = cache_service[flow_id]["user_id"] + except KeyError: + logger.debug("No user_id found in cache_service") + user_id = None for i, vertex in enumerate(graph.generator_build(), 1): try: log_dict = { @@ -156,9 +164,9 @@ async def stream_build( } yield str(StreamData(event="log", data=log_dict)) if vertex.is_task: - vertex = try_running_celery_task(vertex) + vertex = try_running_celery_task(vertex, user_id) else: - vertex.build() + vertex.build(user_id=user_id) params = vertex._built_object_repr() valid = True logger.debug(f"Building node {str(vertex.vertex_type)}") @@ -216,7 +224,7 @@ async def stream_build( raise HTTPException(status_code=500, detail=str(exc)) -def try_running_celery_task(vertex): +def try_running_celery_task(vertex, user_id): # Try running the task in celery # and set the task_id to the local vertex # if it fails, run the task locally @@ -228,5 +236,5 @@ def try_running_celery_task(vertex): except Exception as exc: logger.debug(f"Error running task in celery: {exc}") vertex.task_id = None - vertex.build() + vertex.build(user_id=user_id) return vertex diff --git a/src/backend/langflow/api/v1/endpoints.py b/src/backend/langflow/api/v1/endpoints.py index 65ff08b51..adecd5dbf 100644 --- a/src/backend/langflow/api/v1/endpoints.py +++ b/src/backend/langflow/api/v1/endpoints.py @@ -210,6 +210,7 @@ def get_version(): @router.post("/custom_component", status_code=HTTPStatus.OK) async def custom_component( raw_code: CustomComponentCode, + user: User = Depends(get_current_active_user), ): from langflow.interface.types import ( build_langchain_template_custom_component, @@ -218,4 +219,4 @@ async def custom_component( extractor = CustomComponent(code=raw_code.code) extractor.is_check_valid() - return build_langchain_template_custom_component(extractor) + return build_langchain_template_custom_component(extractor, user_id=user.id) diff --git a/src/backend/langflow/api/v1/schemas.py b/src/backend/langflow/api/v1/schemas.py index e84d8295c..99a8b08cb 100644 --- a/src/backend/langflow/api/v1/schemas.py +++ b/src/backend/langflow/api/v1/schemas.py @@ -7,7 +7,7 @@ from langflow.services.database.models.flow import FlowCreate, FlowRead from langflow.services.database.models.user import UserRead from langflow.services.database.models.base import orjson_dumps -from pydantic import BaseModel, Field, validator +from pydantic import BaseModel, Field, field_validator class BuildStatus(Enum): @@ -91,7 +91,8 @@ class ChatResponse(ChatMessage): is_bot: bool = True files: list = [] - @validator("type") + @field_validator("type") + @classmethod def validate_message_type(cls, v): if v not in ["start", "stream", "end", "error", "info", "file"]: raise ValueError("type must be start, stream, end, error, info, or file") @@ -109,12 +110,13 @@ class PromptResponse(ChatMessage): class FileResponse(ChatMessage): """File response schema.""" - data: Any + data: Any = None data_type: str type: str = "file" is_bot: bool = True - @validator("data_type") + @field_validator("data_type") + @classmethod def validate_data_type(cls, v): if v not in ["image", "csv"]: raise ValueError("data_type must be image or csv") diff --git a/src/backend/langflow/components/agents/OpenAIConversationalAgent.py b/src/backend/langflow/components/agents/OpenAIConversationalAgent.py index 5dc042aed..eb53a89c0 100644 --- a/src/backend/langflow/components/agents/OpenAIConversationalAgent.py +++ b/src/backend/langflow/components/agents/OpenAIConversationalAgent.py @@ -20,10 +20,11 @@ class ConversationalAgent(CustomComponent): def build_config(self): openai_function_models = [ - "gpt-3.5-turbo-0613", - "gpt-3.5-turbo-16k-0613", - "gpt-4-0613", - "gpt-4-32k-0613", + "gpt-4-1106-preview", + "gpt-3.5-turbo", + "gpt-3.5-turbo-16k", + "gpt-4", + "gpt-4-32k", ] return { "tools": {"is_list": True, "display_name": "Tools"}, diff --git a/src/backend/langflow/components/chains/ConversationChain.py b/src/backend/langflow/components/chains/ConversationChain.py new file mode 100644 index 000000000..76e6d8e25 --- /dev/null +++ b/src/backend/langflow/components/chains/ConversationChain.py @@ -0,0 +1,29 @@ +from langflow import CustomComponent +from langchain.chains import ConversationChain +from typing import Optional, Union, Callable +from langflow.field_typing import BaseLanguageModel, BaseMemory, Chain + + +class ConversationChainComponent(CustomComponent): + display_name = "ConversationChain" + description = "Chain to have a conversation and load context from memory." + + def build_config(self): + return { + "prompt": {"display_name": "Prompt"}, + "llm": {"display_name": "LLM"}, + "memory": { + "display_name": "Memory", + "info": "Memory to load context from. If none is provided, a ConversationBufferMemory will be used.", + }, + "code": {"show": False}, + } + + def build( + self, + llm: BaseLanguageModel, + memory: Optional[BaseMemory] = None, + ) -> Union[Chain, Callable]: + if memory is None: + return ConversationChain(llm=llm) + return ConversationChain(llm=llm, memory=memory) diff --git a/src/backend/langflow/components/chains/LLMChain.py b/src/backend/langflow/components/chains/LLMChain.py new file mode 100644 index 000000000..b14eef302 --- /dev/null +++ b/src/backend/langflow/components/chains/LLMChain.py @@ -0,0 +1,30 @@ +from langflow import CustomComponent +from langchain.chains import LLMChain +from typing import Optional, Union, Callable +from langflow.field_typing import ( + BasePromptTemplate, + BaseLanguageModel, + BaseMemory, + Chain, +) + + +class LLMChainComponent(CustomComponent): + display_name = "LLMChain" + description = "Chain to run queries against LLMs" + + def build_config(self): + return { + "prompt": {"display_name": "Prompt"}, + "llm": {"display_name": "LLM"}, + "memory": {"display_name": "Memory"}, + "code": {"show": False}, + } + + def build( + self, + prompt: BasePromptTemplate, + llm: BaseLanguageModel, + memory: Optional[BaseMemory] = None, + ) -> Union[Chain, Callable]: + return LLMChain(prompt=prompt, llm=llm, memory=memory) diff --git a/src/backend/langflow/components/chains/PromptRunner.py b/src/backend/langflow/components/chains/PromptRunner.py index ba2fd7e34..496be610e 100644 --- a/src/backend/langflow/components/chains/PromptRunner.py +++ b/src/backend/langflow/components/chains/PromptRunner.py @@ -8,7 +8,7 @@ from langchain.schema import Document class PromptRunner(CustomComponent): display_name: str = "Prompt Runner" description: str = "Run a Chain with the given PromptTemplate" - beta = True + beta: bool = True field_config = { "llm": {"display_name": "LLM"}, "prompt": { diff --git a/src/backend/langflow/components/documentloaders/FileLoader.py b/src/backend/langflow/components/documentloaders/FileLoader.py new file mode 100644 index 000000000..04f43d60b --- /dev/null +++ b/src/backend/langflow/components/documentloaders/FileLoader.py @@ -0,0 +1,232 @@ +from langflow import CustomComponent +from langchain.schema import Document +from typing import Any, Dict, List + +loaders_info: List[Dict[str, Any]] = [ + { + "loader": "AirbyteJSONLoader", + "name": "Airbyte JSON (.jsonl)", + "import": "langchain.document_loaders.AirbyteJSONLoader", + "defaultFor": ["jsonl"], + "allowdTypes": ["jsonl"], + }, + { + "loader": "JSONLoader", + "name": "JSON (.json)", + "import": "langchain.document_loaders.JSONLoader", + "defaultFor": ["json"], + "allowdTypes": ["json"], + }, + { + "loader": "BSHTMLLoader", + "name": "BeautifulSoup4 HTML (.html, .htm)", + "import": "langchain.document_loaders.BSHTMLLoader", + "allowdTypes": ["html", "htm"], + }, + { + "loader": "CSVLoader", + "name": "CSV (.csv)", + "import": "langchain.document_loaders.CSVLoader", + "defaultFor": ["csv"], + "allowdTypes": ["csv"], + }, + { + "loader": "CoNLLULoader", + "name": "CoNLL-U (.conllu)", + "import": "langchain.document_loaders.CoNLLULoader", + "defaultFor": ["conllu"], + "allowdTypes": ["conllu"], + }, + { + "loader": "EverNoteLoader", + "name": "EverNote (.enex)", + "import": "langchain.document_loaders.EverNoteLoader", + "defaultFor": ["enex"], + "allowdTypes": ["enex"], + }, + { + "loader": "FacebookChatLoader", + "name": "Facebook Chat (.json)", + "import": "langchain.document_loaders.FacebookChatLoader", + "allowdTypes": ["json"], + }, + { + "loader": "OutlookMessageLoader", + "name": "Outlook Message (.msg)", + "import": "langchain.document_loaders.OutlookMessageLoader", + "defaultFor": ["msg"], + "allowdTypes": ["msg"], + }, + { + "loader": "PyPDFLoader", + "name": "PyPDF (.pdf)", + "import": "langchain.document_loaders.PyPDFLoader", + "defaultFor": ["pdf"], + "allowdTypes": ["pdf"], + }, + { + "loader": "STRLoader", + "name": "Subtitle (.str)", + "import": "langchain.document_loaders.STRLoader", + "defaultFor": ["str"], + "allowdTypes": ["str"], + }, + { + "loader": "TextLoader", + "name": "Text (.txt)", + "import": "langchain.document_loaders.TextLoader", + "defaultFor": ["txt"], + "allowdTypes": ["txt"], + }, + { + "loader": "UnstructuredEmailLoader", + "name": "Unstructured Email (.eml)", + "import": "langchain.document_loaders.UnstructuredEmailLoader", + "defaultFor": ["eml"], + "allowdTypes": ["eml"], + }, + { + "loader": "UnstructuredHTMLLoader", + "name": "Unstructured HTML (.html, .htm)", + "import": "langchain.document_loaders.UnstructuredHTMLLoader", + "defaultFor": ["html", "htm"], + "allowdTypes": ["html", "htm"], + }, + { + "loader": "UnstructuredMarkdownLoader", + "name": "Unstructured Markdown (.md)", + "import": "langchain.document_loaders.UnstructuredMarkdownLoader", + "defaultFor": ["md"], + "allowdTypes": ["md"], + }, + { + "loader": "UnstructuredPowerPointLoader", + "name": "Unstructured PowerPoint (.pptx)", + "import": "langchain.document_loaders.UnstructuredPowerPointLoader", + "defaultFor": ["pptx"], + "allowdTypes": ["pptx"], + }, + { + "loader": "UnstructuredWordLoader", + "name": "Unstructured Word (.docx)", + "import": "langchain.document_loaders.UnstructuredWordLoader", + "defaultFor": ["docx"], + "allowdTypes": ["docx"], + }, +] + + +class FileLoaderComponent(CustomComponent): + display_name: str = "File Loader" + description: str = "Generic File Loader" + beta = True + + def build_config(self): + loader_options = ["Automatic"] + [ + loader_info["name"] for loader_info in loaders_info + ] + + file_types = [] + suffixes = [] + + for loader_info in loaders_info: + if "allowedTypes" in loader_info: + file_types.extend(loader_info["allowedTypes"]) + suffixes.extend([f".{ext}" for ext in loader_info["allowedTypes"]]) + + return { + "file_path": { + "display_name": "File Path", + "required": True, + "field_type": "file", + "file_types": [ + "json", + "txt", + "csv", + "jsonl", + "html", + "htm", + "conllu", + "enex", + "msg", + "pdf", + "srt", + "eml", + "md", + "pptx", + "docx", + ], + "suffixes": [ + ".json", + ".txt", + ".csv", + ".jsonl", + ".html", + ".htm", + ".conllu", + ".enex", + ".msg", + ".pdf", + ".srt", + ".eml", + ".md", + ".pptx", + ".docx", + ], + # "file_types" : file_types, + # "suffixes": suffixes, + }, + "loader": { + "display_name": "Loader", + "is_list": True, + "required": True, + "options": loader_options, + "value": "Automatic", + }, + "code": {"show": False}, + } + + def build(self, file_path: str, loader: str) -> Document: + file_type = file_path.split(".")[-1] + + # Mapeie o nome do loader selecionado para suas informações + selected_loader_info = None + for loader_info in loaders_info: + if loader_info["name"] == loader: + selected_loader_info = loader_info + break + + if selected_loader_info is None and loader != "Automatic": + raise ValueError(f"Loader {loader} not found in the loader info list") + + if loader == "Automatic": + # Determine o loader automaticamente com base na extensão do arquivo + default_loader_info = None + for info in loaders_info: + if "defaultFor" in info and file_type in info["defaultFor"]: + default_loader_info = info + break + + if default_loader_info is None: + raise ValueError(f"No default loader found for file type: {file_type}") + + selected_loader_info = default_loader_info + if isinstance(selected_loader_info, dict): + loader_import: str = selected_loader_info["import"] + else: + raise ValueError( + f"Loader info for {loader} is not a dict\nLoader info:\n{selected_loader_info}" + ) + module_name, class_name = loader_import.rsplit(".", 1) + + try: + # Importe o loader dinamicamente + loader_module = __import__(module_name, fromlist=[class_name]) + loader_instance = getattr(loader_module, class_name) + except ImportError as e: + raise ValueError( + f"Loader {loader} could not be imported\nLoader info:\n{selected_loader_info}" + ) from e + + result = loader_instance(file_path=file_path) + return result.load() diff --git a/src/backend/langflow/components/documentloaders/UrlLoader.py b/src/backend/langflow/components/documentloaders/UrlLoader.py new file mode 100644 index 000000000..94004e545 --- /dev/null +++ b/src/backend/langflow/components/documentloaders/UrlLoader.py @@ -0,0 +1,62 @@ +from typing import List +from langflow import CustomComponent +from langchain.document_loaders import AZLyricsLoader +from langchain.document_loaders import CollegeConfidentialLoader +from langchain.document_loaders import GitbookLoader +from langchain.document_loaders import HNLoader +from langchain.document_loaders import IFixitLoader +from langchain.document_loaders import IMSDbLoader +from langchain.document_loaders import WebBaseLoader + + +from langchain.schema import Document + + +class UrlLoaderComponent(CustomComponent): + display_name: str = "Url Loader" + description: str = "Generic Url Loader Component" + + def build_config(self): + return { + "web_path": { + "display_name": "Url", + "required": True, + }, + "loader": { + "display_name": "Loader", + "is_list": True, + "required": True, + "options": [ + "AZLyricsLoader", + "CollegeConfidentialLoader", + "GitbookLoader", + "HNLoader", + "IFixitLoader", + "IMSDbLoader", + "WebBaseLoader", + ], + "value": "WebBaseLoader", + }, + "code": {"show": False}, + } + + def build(self, web_path: str, loader: str) -> List[Document]: + if loader == "AZLyricsLoader": + loader_instance = AZLyricsLoader(web_path=web_path) # type: ignore + elif loader == "CollegeConfidentialLoader": + loader_instance = CollegeConfidentialLoader(web_path=web_path) # type: ignore + elif loader == "GitbookLoader": + loader_instance = GitbookLoader(web_page=web_path) # type: ignore + elif loader == "HNLoader": + loader_instance = HNLoader(web_path=web_path) # type: ignore + elif loader == "IFixitLoader": + loader_instance = IFixitLoader(web_path=web_path) # type: ignore + elif loader == "IMSDbLoader": + loader_instance = IMSDbLoader(web_path=web_path) # type: ignore + elif loader == "WebBaseLoader": + loader_instance = WebBaseLoader(web_path=web_path) # type: ignore + + if loader_instance is None: + raise ValueError(f"No loader found for: {web_path}") + + return loader_instance.load() diff --git a/src/backend/langflow/components/documentloaders/__init__.py b/src/backend/langflow/components/documentloaders/__init__.py new file mode 100644 index 000000000..e69de29bb diff --git a/src/backend/langflow/components/embeddings/AmazonBedrockEmbeddings.py b/src/backend/langflow/components/embeddings/AmazonBedrockEmbeddings.py new file mode 100644 index 000000000..6efa22961 --- /dev/null +++ b/src/backend/langflow/components/embeddings/AmazonBedrockEmbeddings.py @@ -0,0 +1,46 @@ +from typing import Optional +from langflow import CustomComponent + +from langchain.embeddings import BedrockEmbeddings +from langchain.embeddings.base import Embeddings + + +class AmazonBedrockEmeddingsComponent(CustomComponent): + """ + A custom component for implementing an Embeddings Model using Amazon Bedrock. + """ + + display_name: str = "Amazon Bedrock Embeddings" + description: str = "Embeddings model from Amazon Bedrock." + documentation = "https://python.langchain.com/docs/modules/data_connection/text_embedding/integrations/bedrock" + beta = True + + def build_config(self): + return { + "model_id": { + "display_name": "Model Id", + "options": ["amazon.titan-embed-text-v1"], + }, + "credentials_profile_name": {"display_name": "Credentials Profile Name"}, + "endpoint_url": {"display_name": "Bedrock Endpoint URL"}, + "region_name": {"display_name": "AWS Region"}, + "code": {"show": False}, + } + + def build( + self, + model_id: str = "amazon.titan-embed-text-v1", + credentials_profile_name: Optional[str] = None, + endpoint_url: Optional[str] = None, + region_name: Optional[str] = None, + ) -> Embeddings: + try: + output = BedrockEmbeddings( + credentials_profile_name=credentials_profile_name, + model_id=model_id, + endpoint_url=endpoint_url, + region_name=region_name, + ) # type: ignore + except Exception as e: + raise ValueError("Could not connect to AmazonBedrock API.") from e + return output diff --git a/src/backend/langflow/components/embeddings/__init__.py b/src/backend/langflow/components/embeddings/__init__.py new file mode 100644 index 000000000..e69de29bb diff --git a/src/backend/langflow/components/llms/AmazonBedrock.py b/src/backend/langflow/components/llms/AmazonBedrock.py new file mode 100644 index 000000000..04785db63 --- /dev/null +++ b/src/backend/langflow/components/llms/AmazonBedrock.py @@ -0,0 +1,45 @@ +from typing import Optional +from langflow import CustomComponent +from langchain.llms.bedrock import Bedrock +from langchain.llms.base import BaseLLM + + +class AmazonBedrockComponent(CustomComponent): + display_name: str = "Amazon Bedrock" + description: str = "LLM model from Amazon Bedrock." + + def build_config(self): + return { + "model_id": { + "display_name": "Model Id", + "options": [ + "ai21.j2-grande-instruct", + "ai21.j2-jumbo-instruct", + "ai21.j2-mid", + "ai21.j2-mid-v1", + "ai21.j2-ultra", + "ai21.j2-ultra-v1", + "anthropic.claude-instant-v1", + "anthropic.claude-v1", + "anthropic.claude-v2", + "cohere.command-text-v14", + ], + }, + "credentials_profile_name": {"display_name": "Credentials Profile Name"}, + "streaming": {"display_name": "Streaming", "field_type": "bool"}, + "code": {"show": False}, + } + + def build( + self, + model_id: str = "anthropic.claude-instant-v1", + credentials_profile_name: Optional[str] = None, + ) -> BaseLLM: + try: + output = Bedrock( + credentials_profile_name=credentials_profile_name, + model_id=model_id, + ) # type: ignore + except Exception as e: + raise ValueError("Could not connect to AmazonBedrock API.") from e + return output diff --git a/src/backend/langflow/components/retrievers/AmazonKendra.py b/src/backend/langflow/components/retrievers/AmazonKendra.py new file mode 100644 index 000000000..827945a51 --- /dev/null +++ b/src/backend/langflow/components/retrievers/AmazonKendra.py @@ -0,0 +1,48 @@ +from typing import Optional +from langflow import CustomComponent +from langchain.retrievers import AmazonKendraRetriever +from langchain.schema import BaseRetriever + + +class AmazonKendraRetrieverComponent(CustomComponent): + display_name: str = "Amazon Kendra Retriever" + description: str = "Retriever that uses the Amazon Kendra API." + + def build_config(self): + return { + "index_id": {"display_name": "Index ID"}, + "region_name": {"display_name": "Region Name"}, + "credentials_profile_name": {"display_name": "Credentials Profile Name"}, + "attribute_filter": { + "display_name": "Attribute Filter", + "field_type": "code", + }, + "top_k": {"display_name": "Top K", "field_type": "int"}, + "user_context": { + "display_name": "User Context", + "field_type": "code", + }, + "code": {"show": False}, + } + + def build( + self, + index_id: str, + top_k: int = 3, + region_name: Optional[str] = None, + credentials_profile_name: Optional[str] = None, + attribute_filter: Optional[dict] = None, + user_context: Optional[dict] = None, + ) -> BaseRetriever: + try: + output = AmazonKendraRetriever( + index_id=index_id, + top_k=top_k, + region_name=region_name, + credentials_profile_name=credentials_profile_name, + attribute_filter=attribute_filter, + user_context=user_context, + ) # type: ignore + except Exception as e: + raise ValueError("Could not connect to AmazonKendra API.") from e + return output diff --git a/src/backend/langflow/components/toolkits/Metaphor.py b/src/backend/langflow/components/toolkits/Metaphor.py index a66da9bca..0f9f23334 100644 --- a/src/backend/langflow/components/toolkits/Metaphor.py +++ b/src/backend/langflow/components/toolkits/Metaphor.py @@ -1,17 +1,18 @@ from typing import List, Union -from langflow import CustomComponent -from metaphor_python import Metaphor # type: ignore -from langchain.tools import Tool from langchain.agents import tool from langchain.agents.agent_toolkits.base import BaseToolkit +from langchain.tools import Tool +from metaphor_python import Metaphor # type: ignore + +from langflow import CustomComponent class MetaphorToolkit(CustomComponent): display_name: str = "Metaphor" description: str = "Metaphor Toolkit" documentation = "https://python.langchain.com/docs/integrations/tools/metaphor_search" - beta = True + beta: bool = True # api key should be password = True field_config = { "metaphor_api_key": {"display_name": "Metaphor API Key", "password": True}, diff --git a/src/backend/langflow/components/utilities/GetRequest.py b/src/backend/langflow/components/utilities/GetRequest.py index 546b3b10b..627d0804a 100644 --- a/src/backend/langflow/components/utilities/GetRequest.py +++ b/src/backend/langflow/components/utilities/GetRequest.py @@ -10,7 +10,7 @@ class GetRequest(CustomComponent): description: str = "Make a GET request to the given URL." output_types: list[str] = ["Document"] documentation: str = "https://docs.langflow.org/components/utilities#get-request" - beta = True + beta: bool = True field_config = { "url": { "display_name": "URL", diff --git a/src/backend/langflow/components/utilities/JSONDocumentBuilder.py b/src/backend/langflow/components/utilities/JSONDocumentBuilder.py index fc637c5a5..b5f3b1263 100644 --- a/src/backend/langflow/components/utilities/JSONDocumentBuilder.py +++ b/src/backend/langflow/components/utilities/JSONDocumentBuilder.py @@ -11,8 +11,8 @@ # - **Document:** The Document containing the JSON object. -from langflow import CustomComponent from langchain.schema import Document +from langflow import CustomComponent from langflow.services.database.models.base import orjson_dumps diff --git a/src/backend/langflow/components/utilities/PostRequest.py b/src/backend/langflow/components/utilities/PostRequest.py index 81c54660a..cbecac535 100644 --- a/src/backend/langflow/components/utilities/PostRequest.py +++ b/src/backend/langflow/components/utilities/PostRequest.py @@ -10,7 +10,7 @@ class PostRequest(CustomComponent): description: str = "Make a POST request to the given URL." output_types: list[str] = ["Document"] documentation: str = "https://docs.langflow.org/components/utilities#post-request" - beta = True + beta: bool = True field_config = { "url": {"display_name": "URL", "info": "The URL to make the request to."}, "headers": { diff --git a/src/backend/langflow/components/utilities/UpdateRequest.py b/src/backend/langflow/components/utilities/UpdateRequest.py index 6f9ef91a5..1e6355b2c 100644 --- a/src/backend/langflow/components/utilities/UpdateRequest.py +++ b/src/backend/langflow/components/utilities/UpdateRequest.py @@ -10,7 +10,7 @@ class UpdateRequest(CustomComponent): description: str = "Make a PATCH request to the given URL." output_types: list[str] = ["Document"] documentation: str = "https://docs.langflow.org/components/utilities#update-request" - beta = True + beta: bool = True field_config = { "url": {"display_name": "URL", "info": "The URL to make the request to."}, "headers": { diff --git a/src/backend/langflow/components/vectorstores/Chroma.py b/src/backend/langflow/components/vectorstores/Chroma.py index c798ab83b..dd65e26c8 100644 --- a/src/backend/langflow/components/vectorstores/Chroma.py +++ b/src/backend/langflow/components/vectorstores/Chroma.py @@ -14,10 +14,10 @@ class ChromaComponent(CustomComponent): A custom component for implementing a Vector Store using Chroma. """ - display_name: str = "Chroma (Custom Component)" + display_name: str = "Chroma" description: str = "Implementation of Vector Store using Chroma" documentation = "https://python.langchain.com/docs/integrations/vectorstores/chroma" - beta = True + beta: bool = True def build_config(self): """ diff --git a/src/backend/langflow/components/vectorstores/Redis.py b/src/backend/langflow/components/vectorstores/Redis.py new file mode 100644 index 000000000..f13428829 --- /dev/null +++ b/src/backend/langflow/components/vectorstores/Redis.py @@ -0,0 +1,64 @@ +from typing import Optional +from langflow import CustomComponent + +from langchain.vectorstores.redis import Redis +from langchain.schema import Document +from langchain.vectorstores.base import VectorStore +from langchain.embeddings.base import Embeddings + + +class RedisComponent(CustomComponent): + """ + A custom component for implementing a Vector Store using Redis. + """ + + display_name: str = "Redis" + description: str = "Implementation of Vector Store using Redis" + documentation = "https://python.langchain.com/docs/integrations/vectorstores/redis" + beta = True + + def build_config(self): + """ + Builds the configuration for the component. + + Returns: + - dict: A dictionary containing the configuration options for the component. + """ + return { + "index_name": {"display_name": "Index Name", "value": "your_index"}, + "code": {"show": False, "display_name": "Code"}, + "documents": {"display_name": "Documents", "is_list": True}, + "embedding": {"display_name": "Embedding"}, + "redis_server_url": { + "display_name": "Redis Server Connection String", + "advanced": False, + }, + "redis_index_name": {"display_name": "Redis Index", "advanced": False}, + } + + def build( + self, + embedding: Embeddings, + redis_server_url: str, + redis_index_name: str, + documents: Optional[Document] = None, + ) -> VectorStore: + """ + Builds the Vector Store or BaseRetriever object. + + Args: + - embedding (Embeddings): The embeddings to use for the Vector Store. + - documents (Optional[Document]): The documents to use for the Vector Store. + - redis_index_name (str): The name of the Redis index. + - redis_server_url (str): The URL for the Redis server. + + Returns: + - VectorStore: The Vector Store object. + """ + + return Redis.from_documents( + documents=documents, # type: ignore + embedding=embedding, + redis_url=redis_server_url, + index_name=redis_index_name, + ) diff --git a/src/backend/langflow/components/vectorstores/Vectara.py b/src/backend/langflow/components/vectorstores/Vectara.py index eeee290d1..1f0d10179 100644 --- a/src/backend/langflow/components/vectorstores/Vectara.py +++ b/src/backend/langflow/components/vectorstores/Vectara.py @@ -1,10 +1,10 @@ from typing import Optional, Union -from langflow import CustomComponent +from langchain.schema import BaseRetriever, Document from langchain.vectorstores import Vectara -from langchain.schema import Document from langchain.vectorstores.base import VectorStore -from langchain.schema import BaseRetriever + +from langflow import CustomComponent class VectaraComponent(CustomComponent): diff --git a/src/backend/langflow/components/vectorstores/pgvector.py b/src/backend/langflow/components/vectorstores/pgvector.py new file mode 100644 index 000000000..eecf4d187 --- /dev/null +++ b/src/backend/langflow/components/vectorstores/pgvector.py @@ -0,0 +1,76 @@ +from typing import Optional, List +from langflow import CustomComponent + +from langchain.vectorstores.pgvector import PGVector +from langchain.schema import Document +from langchain.vectorstores.base import VectorStore +from langchain.embeddings.base import Embeddings + + +class PostgresqlVectorComponent(CustomComponent): + """ + A custom component for implementing a Vector Store using PostgreSQL. + """ + + display_name: str = "PGVector" + description: str = "Implementation of Vector Store using PostgreSQL" + documentation = ( + "https://python.langchain.com/docs/integrations/vectorstores/pgvector" + ) + beta = True + + def build_config(self): + """ + Builds the configuration for the component. + + Returns: + - dict: A dictionary containing the configuration options for the component. + """ + return { + "index_name": {"display_name": "Index Name", "value": "your_index"}, + "code": {"show": True, "display_name": "Code"}, + "documents": {"display_name": "Documents", "is_list": True}, + "embedding": {"display_name": "Embedding"}, + "pg_server_url": { + "display_name": "PostgreSQL Server Connection String", + "advanced": False, + }, + "collection_name": {"display_name": "Table", "advanced": False}, + } + + def build( + self, + embedding: Embeddings, + pg_server_url: str, + collection_name: str, + documents: Optional[List[Document]] = None, + ) -> VectorStore: + """ + Builds the Vector Store or BaseRetriever object. + + Args: + - embedding (Embeddings): The embeddings to use for the Vector Store. + - documents (Optional[Document]): The documents to use for the Vector Store. + - collection_name (str): The name of the PG table. + - pg_server_url (str): The URL for the PG server. + + Returns: + - VectorStore: The Vector Store object. + """ + + try: + if documents is None: + return PGVector.from_existing_index( + embedding=embedding, + collection_name=collection_name, + connection_string=pg_server_url, + ) + + return PGVector.from_documents( + embedding=embedding, + documents=documents, + collection_name=collection_name, + connection_string=pg_server_url, + ) + except Exception as e: + raise RuntimeError(f"Failed to build PGVector: {e}") diff --git a/src/backend/langflow/config.yaml b/src/backend/langflow/config.yaml index 48f7b1da1..d234ce8ea 100644 --- a/src/backend/langflow/config.yaml +++ b/src/backend/langflow/config.yaml @@ -14,14 +14,14 @@ agents: SQLAgent: documentation: "" chains: - LLMChain: - documentation: "https://python.langchain.com/docs/modules/chains/foundational/llm_chain" + # LLMChain: + # documentation: "https://python.langchain.com/docs/modules/chains/foundational/llm_chain" LLMMathChain: documentation: "https://python.langchain.com/docs/modules/chains/additional/llm_math" LLMCheckerChain: documentation: "https://python.langchain.com/docs/modules/chains/additional/llm_checker" - ConversationChain: - documentation: "" + # ConversationChain: + # documentation: "" SeriesCharacterChain: documentation: "" MidJourneyPromptChain: @@ -106,6 +106,9 @@ embeddings: documentation: "https://python.langchain.com/docs/modules/data_connection/text_embedding/integrations/cohere" VertexAIEmbeddings: documentation: "https://python.langchain.com/docs/modules/data_connection/text_embedding/integrations/google_vertex_ai_palm" + AmazonBedrockEmbeddings: + documentation: "https://python.langchain.com/docs/modules/data_connection/text_embedding/integrations/bedrock" + llms: OpenAI: documentation: "https://python.langchain.com/docs/modules/model_io/models/llms/integrations/openai" @@ -265,8 +268,8 @@ retrievers: # ZepRetriever: # documentation: "https://python.langchain.com/docs/modules/data_connection/retrievers/integrations/zep_memorystore" vectorstores: - Chroma: - documentation: "https://python.langchain.com/docs/modules/data_connection/vectorstores/integrations/chroma" + # Chroma: + # documentation: "https://python.langchain.com/docs/modules/data_connection/vectorstores/integrations/chroma" Qdrant: documentation: "https://python.langchain.com/docs/modules/data_connection/vectorstores/integrations/qdrant" Weaviate: diff --git a/src/backend/langflow/field_typing/__init__.py b/src/backend/langflow/field_typing/__init__.py index 5ba3ec020..3ee8fe291 100644 --- a/src/backend/langflow/field_typing/__init__.py +++ b/src/backend/langflow/field_typing/__init__.py @@ -14,25 +14,6 @@ # "BaseMemory": BaseMemory, # "BaseChatMemory": BaseChatMemory, # } -from .constants import ( - Tool, - PromptTemplate, - Chain, - BaseChatMemory, - BaseLLM, - BaseLoader, - BaseMemory, - BaseOutputParser, - BaseRetriever, - VectorStore, - Embeddings, - TextSplitter, - Document, - AgentExecutor, - NestedDict, - Data, - Object, -) __all__ = [ "NestedDict", @@ -42,6 +23,7 @@ __all__ = [ "Chain", "BaseChatMemory", "BaseLLM", + "BaseLanguageModel", "BaseLoader", "BaseMemory", "BaseOutputParser", @@ -52,4 +34,7 @@ __all__ = [ "Document", "AgentExecutor", "Object", + "Callable", + "BasePromptTemplate", + "ChatPromptTemplate", ] diff --git a/src/backend/langflow/field_typing/constants.py b/src/backend/langflow/field_typing/constants.py index 66abe46bd..646af0bac 100644 --- a/src/backend/langflow/field_typing/constants.py +++ b/src/backend/langflow/field_typing/constants.py @@ -1,11 +1,11 @@ -from typing import Dict, Union +from typing import Callable, Dict, Union from langchain.agents.agent import AgentExecutor from langchain.chains.base import Chain from langchain.document_loaders.base import BaseLoader -from langchain.llms.base import BaseLLM +from langchain.llms.base import BaseLanguageModel, BaseLLM from langchain.memory.chat_memory import BaseChatMemory -from langchain.prompts import PromptTemplate +from langchain.prompts import BasePromptTemplate, ChatPromptTemplate, PromptTemplate from langchain.schema import BaseOutputParser, BaseRetriever, Document from langchain.schema.embeddings import Embeddings from langchain.schema.memory import BaseMemory @@ -30,7 +30,10 @@ LANGCHAIN_BASE_TYPES = { "AgentExecutor": AgentExecutor, "Tool": Tool, "BaseLLM": BaseLLM, + "BaseLanguageModel": BaseLanguageModel, "PromptTemplate": PromptTemplate, + "ChatPromptTemplate": ChatPromptTemplate, + "BasePromptTemplate": BasePromptTemplate, "BaseLoader": BaseLoader, "Document": Document, "TextSplitter": TextSplitter, @@ -53,4 +56,5 @@ CUSTOM_COMPONENT_SUPPORTED_TYPES = { "NestedDict": NestedDict, "Data": Data, "Object": Object, + "Callable": Callable, } diff --git a/src/backend/langflow/graph/vertex/types.py b/src/backend/langflow/graph/vertex/types.py index 5e7dfae5a..5fe6f8d31 100644 --- a/src/backend/langflow/graph/vertex/types.py +++ b/src/backend/langflow/graph/vertex/types.py @@ -204,6 +204,10 @@ class ChainVertex(Vertex): # Temporarily remove the code from the params self.params.pop("code", None) # Check if the chain requires a PromptVertex + + # Temporarily remove "code" from the params + self.params.pop("code", None) + for key, value in self.params.items(): if isinstance(value, PromptVertex): # Build the PromptVertex, passing the tools if available diff --git a/src/backend/langflow/interface/agents/base.py b/src/backend/langflow/interface/agents/base.py index 68ae7b91a..9c0210b27 100644 --- a/src/backend/langflow/interface/agents/base.py +++ b/src/backend/langflow/interface/agents/base.py @@ -1,4 +1,4 @@ -from typing import Dict, List, Optional +from typing import ClassVar, Dict, List, Optional from langchain.agents import types @@ -15,7 +15,7 @@ from langflow.utils.util import build_template_from_class, build_template_from_m class AgentCreator(LangChainTypeCreator): type_name: str = "agents" - from_method_nodes = {"ZeroShotAgent": "from_llm_and_tools"} + from_method_nodes: ClassVar[Dict] = {"ZeroShotAgent": "from_llm_and_tools"} @property def frontend_node_class(self) -> type[AgentFrontendNode]: diff --git a/src/backend/langflow/interface/agents/custom.py b/src/backend/langflow/interface/agents/custom.py index 95c81f137..b9da48b73 100644 --- a/src/backend/langflow/interface/agents/custom.py +++ b/src/backend/langflow/interface/agents/custom.py @@ -16,8 +16,10 @@ from langchain.agents.agent_toolkits import ( ) from langchain.agents.agent_toolkits.json.prompt import JSON_PREFIX, JSON_SUFFIX from langchain.agents.agent_toolkits.json.toolkit import JsonToolkit -from langchain.agents.agent_toolkits.pandas.prompt import PREFIX as PANDAS_PREFIX -from langchain.agents.agent_toolkits.pandas.prompt import ( +from langchain_experimental.agents.agent_toolkits.pandas.prompt import ( + PREFIX as PANDAS_PREFIX, +) +from langchain_experimental.agents.agent_toolkits.pandas.prompt import ( SUFFIX_WITH_DF as PANDAS_SUFFIX, ) from langchain.agents.agent_toolkits.sql.prompt import SQL_PREFIX, SQL_SUFFIX @@ -31,7 +33,7 @@ from langchain.agents.mrkl.prompt import FORMAT_INSTRUCTIONS from langchain.base_language import BaseLanguageModel from langchain.memory.chat_memory import BaseChatMemory from langchain.sql_database import SQLDatabase -from langchain.tools.python.tool import PythonAstREPLTool +from langchain_experimental.tools.python.tool import PythonAstREPLTool from langchain.tools.sql_database.prompt import QUERY_CHECKER from langflow.interface.base import CustomAgentExecutor @@ -103,9 +105,9 @@ class CSVAgent(CustomAgentExecutor): tools, prefix=PANDAS_PREFIX, suffix=PANDAS_SUFFIX, - input_variables=["df", "input", "agent_scratchpad"], + input_variables=["df_head", "input", "agent_scratchpad"], ) - partial_prompt = prompt.partial(df=str(df.head())) + partial_prompt = prompt.partial(df_head=str(df.head())) llm_chain = LLMChain( llm=llm, prompt=partial_prompt, diff --git a/src/backend/langflow/interface/chains/base.py b/src/backend/langflow/interface/chains/base.py index 1ca2e944c..8017902bd 100644 --- a/src/backend/langflow/interface/chains/base.py +++ b/src/backend/langflow/interface/chains/base.py @@ -1,4 +1,4 @@ -from typing import Any, Dict, List, Optional, Type +from typing import Any, ClassVar, Dict, List, Optional, Type from langflow.custom.customs import get_custom_nodes from langflow.interface.base import LangChainTypeCreator @@ -9,7 +9,7 @@ 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 # type: ignore +from langchain_experimental.sql import SQLDatabaseChain # Assuming necessary imports for Field, Template, and FrontendNode classes @@ -22,7 +22,7 @@ class ChainCreator(LangChainTypeCreator): return ChainFrontendNode #! We need to find a better solution for this - from_method_nodes = { + from_method_nodes: ClassVar[Dict] = { "ConversationalRetrievalChain": "from_llm", "LLMCheckerChain": "from_llm", "SQLDatabaseChain": "from_llm", diff --git a/src/backend/langflow/interface/chains/custom.py b/src/backend/langflow/interface/chains/custom.py index dc960f71c..01aad73c3 100644 --- a/src/backend/langflow/interface/chains/custom.py +++ b/src/backend/langflow/interface/chains/custom.py @@ -4,7 +4,7 @@ from langchain.chains import ConversationChain from langchain.memory.buffer import ConversationBufferMemory from langchain.schema import BaseMemory from langflow.interface.base import CustomChain -from pydantic import Field, root_validator +from pydantic.v1 import Field, root_validator from langchain.chains.question_answering import load_qa_chain from langflow.interface.utils import extract_input_variables_from_prompt from langchain.base_language import BaseLanguageModel diff --git a/src/backend/langflow/interface/custom/component.py b/src/backend/langflow/interface/custom/component.py index 92df3ef93..5a476ff58 100644 --- a/src/backend/langflow/interface/custom/component.py +++ b/src/backend/langflow/interface/custom/component.py @@ -1,10 +1,10 @@ import ast -from typing import Any, Optional -from pydantic import BaseModel +from typing import Any, ClassVar, Optional + from fastapi import HTTPException -from langflow.utils import validate from langflow.interface.custom.code_parser import CodeParser +from langflow.utils import validate class ComponentCodeNullError(HTTPException): @@ -15,16 +15,17 @@ class ComponentFunctionEntrypointNameNullError(HTTPException): pass -class Component(BaseModel): - ERROR_CODE_NULL = "Python code must be provided." - ERROR_FUNCTION_ENTRYPOINT_NAME_NULL = "The name of the entrypoint function must be provided." +class Component: + ERROR_CODE_NULL: ClassVar[str] = "Python code must be provided." + ERROR_FUNCTION_ENTRYPOINT_NAME_NULL: ClassVar[str] = "The name of the entrypoint function must be provided." - code: Optional[str] - function_entrypoint_name = "build" + code: Optional[str] = None + _function_entrypoint_name: str = "build" field_config: dict = {} def __init__(self, **data): - super().__init__(**data) + for key, value in data.items(): + setattr(self, key, value) def get_code_tree(self, code: str): parser = CodeParser(code) @@ -37,7 +38,7 @@ class Component(BaseModel): detail={"error": self.ERROR_CODE_NULL, "traceback": ""}, ) - if not self.function_entrypoint_name: + if not self._function_entrypoint_name: raise ComponentFunctionEntrypointNameNullError( status_code=400, detail={ @@ -46,7 +47,7 @@ class Component(BaseModel): }, ) - return validate.create_function(self.code, self.function_entrypoint_name) + return validate.create_function(self.code, self._function_entrypoint_name) def build_template_config(self, attributes) -> dict: template_config = {} diff --git a/src/backend/langflow/interface/custom/custom_component.py b/src/backend/langflow/interface/custom/custom_component.py index 4b3c3ebac..1bda1beb4 100644 --- a/src/backend/langflow/interface/custom/custom_component.py +++ b/src/backend/langflow/interface/custom/custom_component.py @@ -1,27 +1,28 @@ -from typing import Any, Callable, List, Optional, Union +from typing import Any, Callable, ClassVar, List, Optional, Union from uuid import UUID + +import yaml from fastapi import HTTPException + from langflow.field_typing.constants import CUSTOM_COMPONENT_SUPPORTED_TYPES from langflow.interface.custom.component import Component from langflow.interface.custom.directory_reader import DirectoryReader -from langflow.services.deps import get_db_service -from langflow.interface.custom.utils import extract_inner_type - +from langflow.interface.custom.utils import extract_inner_type, extract_union_types +from langflow.services.database.models.flow import Flow +from langflow.services.database.utils import session_getter +from langflow.services.getters import get_db_service from langflow.utils import validate -from langflow.services.database.utils import session_getter -from langflow.services.database.models.flow import Flow -from pydantic import Extra -import yaml - -class CustomComponent(Component, extra=Extra.allow): - code: Optional[str] +class CustomComponent(Component): + display_name: Optional[str] = "Custom Component" + description: Optional[str] = "Custom Component" + code: Optional[str] = None field_config: dict = {} - code_class_base_inheritance = "CustomComponent" - function_entrypoint_name = "build" + code_class_base_inheritance: ClassVar[str] = "CustomComponent" + function_entrypoint_name: ClassVar[str] = "build" function: Optional[Callable] = None - return_type_valid_list = list(CUSTOM_COMPONENT_SUPPORTED_TYPES.keys()) + return_type_valid_list: List[str] = list(CUSTOM_COMPONENT_SUPPORTED_TYPES.keys()) repr_value: Optional[Any] = "" user_id: Optional[Union[UUID, str]] = None @@ -138,9 +139,7 @@ class CustomComponent(Component, extra=Extra.allow): return [return_type] if return_type in self.return_type_valid_list else [] # If the return type is a Union, then we need to parse it - return_type = return_type.replace("Union", "").replace("[", "").replace("]", "") - return_type = return_type.split(",") - return_type = [item.strip() for item in return_type] + return_type = extract_union_types(return_type) return [item for item in return_type if item in self.return_type_valid_list] @property @@ -179,8 +178,7 @@ class CustomComponent(Component, extra=Extra.allow): return validate.create_function(self.code, self.function_entrypoint_name) def load_flow(self, flow_id: str, tweaks: Optional[dict] = None) -> Any: - from langflow.processing.process import build_sorted_vertices - from langflow.processing.process import process_tweaks + from langflow.processing.process import build_sorted_vertices, process_tweaks db_service = get_db_service() with session_getter(db_service) as session: @@ -189,7 +187,7 @@ class CustomComponent(Component, extra=Extra.allow): raise ValueError(f"Flow {flow_id} not found") if tweaks: graph_data = process_tweaks(graph_data=graph_data, tweaks=tweaks) - return build_sorted_vertices(graph_data) + return build_sorted_vertices(graph_data, self.user_id) def list_flows(self, *, get_session: Optional[Callable] = None) -> List[Flow]: if not self.user_id: diff --git a/src/backend/langflow/interface/custom/schema.py b/src/backend/langflow/interface/custom/schema.py index 80d65405f..418309cee 100644 --- a/src/backend/langflow/interface/custom/schema.py +++ b/src/backend/langflow/interface/custom/schema.py @@ -10,7 +10,7 @@ class ClassCodeDetails(BaseModel): """ name: str - doc: Optional[str] + doc: Optional[str] = None bases: list attributes: list methods: list @@ -23,7 +23,7 @@ class CallableCodeDetails(BaseModel): """ name: str - doc: Optional[str] + doc: Optional[str] = None args: list body: list - return_type: Optional[str] + return_type: Optional[str] = None diff --git a/src/backend/langflow/interface/custom/utils.py b/src/backend/langflow/interface/custom/utils.py index 99b0d4bc6..700b98b53 100644 --- a/src/backend/langflow/interface/custom/utils.py +++ b/src/backend/langflow/interface/custom/utils.py @@ -8,3 +8,14 @@ def extract_inner_type(return_type: str) -> str: if match := re.match(r"list\[(.*)\]", return_type, re.IGNORECASE): return match[1] return return_type + + +def extract_union_types(return_type: str) -> list[str]: + """ + Extracts the inner type from a type hint that is a list. + """ + # If the return type is a Union, then we need to parse it + return_type = return_type.replace("Union", "").replace("[", "").replace("]", "") + return_types = return_type.split(",") + return_types = [item.strip() for item in return_types] + return return_types diff --git a/src/backend/langflow/interface/initialize/loading.py b/src/backend/langflow/interface/initialize/loading.py index bf8fa2187..bcf27b042 100644 --- a/src/backend/langflow/interface/initialize/loading.py +++ b/src/backend/langflow/interface/initialize/loading.py @@ -1,40 +1,39 @@ import json +from typing import TYPE_CHECKING, Any, Callable, Dict, Sequence, Type + import orjson -from typing import Any, Callable, Dict, Sequence, Type, TYPE_CHECKING -from langchain.schema import Document from langchain.agents import agent as agent_module from langchain.agents.agent import AgentExecutor from langchain.agents.agent_toolkits.base import BaseToolkit from langchain.agents.tools import BaseTool +from langchain.chains.base import Chain +from langchain.document_loaders.base import BaseLoader +from langchain.schema import Document +from langchain.vectorstores.base import VectorStore +from loguru import logger +from pydantic import ValidationError + +from langflow.interface.agents.base import agent_creator +from langflow.interface.chains.base import chain_creator +from langflow.interface.custom_lists import CUSTOM_NODES +from langflow.interface.importing.utils import ( + get_function, + get_function_custom, + import_by_type, +) from langflow.interface.initialize.llm import initialize_vertexai from langflow.interface.initialize.utils import ( handle_format_kwargs, handle_node_type, handle_partial_variables, ) - from langflow.interface.initialize.vector_store import vecstore_initializer - -from pydantic import ValidationError - -from langflow.interface.importing.utils import ( - get_function, - get_function_custom, - import_by_type, -) -from langflow.interface.custom_lists import CUSTOM_NODES -from langflow.interface.agents.base import agent_creator -from langflow.interface.toolkits.base import toolkits_creator -from langflow.interface.chains.base import chain_creator from langflow.interface.output_parsers.base import output_parser_creator from langflow.interface.retrievers.base import retriever_creator -from langflow.interface.wrappers.base import wrapper_creator +from langflow.interface.toolkits.base import toolkits_creator from langflow.interface.utils import load_file_into_dict +from langflow.interface.wrappers.base import wrapper_creator from langflow.utils import validate -from langchain.chains.base import Chain -from langchain.vectorstores.base import VectorStore -from langchain.document_loaders.base import BaseLoader -from loguru import logger if TYPE_CHECKING: from langflow import CustomComponent @@ -279,12 +278,14 @@ def instantiate_embedding(node_type, class_object, params: Dict): try: return class_object(**params) except ValidationError: - params = {key: value for key, value in params.items() if key in class_object.__fields__} + params = {key: value for key, value in params.items() if key in class_object.model_fields} return class_object(**params) def instantiate_vectorstore(class_object: Type[VectorStore], params: Dict): search_kwargs = params.pop("search_kwargs", {}) + if search_kwargs == {"yourkey": "value"}: + search_kwargs = {} # clean up docs or texts to have only documents if "texts" in params: params["documents"] = params.pop("texts") diff --git a/src/backend/langflow/interface/initialize/vector_store.py b/src/backend/langflow/interface/initialize/vector_store.py index 736d3cc2b..0b5ade7c8 100644 --- a/src/backend/langflow/interface/initialize/vector_store.py +++ b/src/backend/langflow/interface/initialize/vector_store.py @@ -184,7 +184,7 @@ def initialize_chroma(class_object: Type[Chroma], params: dict): params.pop("documents", None) params.pop("texts", None) params["embedding_function"] = params.pop("embedding") - chromadb = class_object(**params) + chromadb_instance = class_object(**params) else: if "texts" in params: params["documents"] = params.pop("texts") @@ -199,10 +199,10 @@ def initialize_chroma(class_object: Type[Chroma], params: dict): if value is None: doc.metadata[key] = "" - chromadb = class_object.from_documents(**params) + chromadb_instance = class_object.from_documents(**params) if persist: - chromadb.persist() - return chromadb + chromadb_instance.persist() + return chromadb_instance def initialize_qdrant(class_object: Type[Qdrant], params: dict): diff --git a/src/backend/langflow/interface/memories/base.py b/src/backend/langflow/interface/memories/base.py index a6bff858f..7508d6d64 100644 --- a/src/backend/langflow/interface/memories/base.py +++ b/src/backend/langflow/interface/memories/base.py @@ -1,4 +1,4 @@ -from typing import Dict, List, Optional, Type +from typing import ClassVar, Dict, List, Optional, Type from langflow.interface.base import LangChainTypeCreator from langflow.interface.custom_lists import memory_type_to_cls_dict @@ -14,7 +14,7 @@ from langflow.custom.customs import get_custom_nodes class MemoryCreator(LangChainTypeCreator): type_name: str = "memories" - from_method_nodes = { + from_method_nodes: ClassVar[Dict] = { "ZepChatMessageHistory": "__init__", "SQLiteEntityStore": "__init__", } diff --git a/src/backend/langflow/interface/output_parsers/base.py b/src/backend/langflow/interface/output_parsers/base.py index 926f403ab..3ae1e9d7b 100644 --- a/src/backend/langflow/interface/output_parsers/base.py +++ b/src/backend/langflow/interface/output_parsers/base.py @@ -1,4 +1,4 @@ -from typing import Dict, List, Optional, Type +from typing import ClassVar, Dict, List, Optional, Type from langchain import output_parsers @@ -13,7 +13,7 @@ from langflow.utils.util import build_template_from_class, build_template_from_m class OutputParserCreator(LangChainTypeCreator): type_name: str = "output_parsers" - from_method_nodes = { + from_method_nodes: ClassVar[Dict] = { "StructuredOutputParser": "from_response_schemas", } diff --git a/src/backend/langflow/interface/prompts/custom.py b/src/backend/langflow/interface/prompts/custom.py index 47b990326..202fbe409 100644 --- a/src/backend/langflow/interface/prompts/custom.py +++ b/src/backend/langflow/interface/prompts/custom.py @@ -1,7 +1,7 @@ from typing import Dict, List, Optional, Type from langchain.prompts import PromptTemplate -from pydantic import root_validator +from pydantic.v1 import root_validator from langflow.interface.utils import extract_input_variables_from_prompt diff --git a/src/backend/langflow/interface/retrievers/base.py b/src/backend/langflow/interface/retrievers/base.py index 27eda0772..2439708a3 100644 --- a/src/backend/langflow/interface/retrievers/base.py +++ b/src/backend/langflow/interface/retrievers/base.py @@ -1,4 +1,4 @@ -from typing import Any, Dict, List, Optional, Type +from typing import Any, ClassVar, Dict, List, Optional, Type from langchain import retrievers @@ -14,7 +14,10 @@ from langflow.utils.util import build_template_from_method, build_template_from_ class RetrieverCreator(LangChainTypeCreator): type_name: str = "retrievers" - from_method_nodes = {"MultiQueryRetriever": "from_llm", "ZepRetriever": "__init__"} + from_method_nodes: ClassVar[Dict] = { + "MultiQueryRetriever": "from_llm", + "ZepRetriever": "__init__", + } @property def frontend_node_class(self) -> Type[RetrieverFrontendNode]: diff --git a/src/backend/langflow/interface/run.py b/src/backend/langflow/interface/run.py index 63391204a..b482f8c50 100644 --- a/src/backend/langflow/interface/run.py +++ b/src/backend/langflow/interface/run.py @@ -1,9 +1,12 @@ -from typing import Dict, Tuple +from typing import Dict, Tuple, Optional, Union from langflow.graph import Graph from loguru import logger +from uuid import UUID -def build_sorted_vertices(data_graph) -> Tuple[Graph, Dict]: +def build_sorted_vertices( + data_graph, user_id: Optional[Union[str, UUID]] = None +) -> Tuple[Graph, Dict]: """ Build langchain object from data_graph. """ @@ -13,7 +16,7 @@ def build_sorted_vertices(data_graph) -> Tuple[Graph, Dict]: sorted_vertices = graph.topological_sort() artifacts = {} for vertex in sorted_vertices: - vertex.build() + vertex.build(user_id=user_id) if vertex.artifacts: artifacts.update(vertex.artifacts) return graph, artifacts diff --git a/src/backend/langflow/interface/tools/base.py b/src/backend/langflow/interface/tools/base.py index 42c9e01ca..56112bf30 100644 --- a/src/backend/langflow/interface/tools/base.py +++ b/src/backend/langflow/interface/tools/base.py @@ -21,6 +21,7 @@ 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 TOOL_INPUTS = { "str": TemplateField( @@ -33,7 +34,7 @@ TOOL_INPUTS = { ), "llm": TemplateField(field_type="BaseLanguageModel", required=True, is_list=False, show=True), "func": TemplateField( - field_type="function", + field_type="Callable", required=True, is_list=False, show=True, @@ -70,7 +71,11 @@ class ToolCreator(LangChainTypeCreator): all_tools = {} for tool, tool_fcn in ALL_TOOLS_NAMES.items(): - tool_params = get_tool_params(tool_fcn) + try: + tool_params = get_tool_params(tool_fcn) + except Exception: + logger.error(f"Error getting params for tool {tool}") + continue tool_name = tool_params.get("name") or tool @@ -116,7 +121,7 @@ class ToolCreator(LangChainTypeCreator): elif tool_type in CUSTOM_TOOLS: # Get custom tool params params = self.type_to_loader_dict[name]["params"] # type: ignore - base_classes = ["function"] + base_classes = ["Callable"] if node := customs.get_custom_nodes("tools").get(tool_type): return node elif tool_type in FILE_TOOLS: @@ -126,10 +131,15 @@ class ToolCreator(LangChainTypeCreator): tool_dict = build_template_from_class(tool_type, OTHER_TOOLS) fields = tool_dict["template"] + # _type is the only key in fields + # return None + if len(fields) == 1 and "_type" in fields: + return None + # Pop unnecessary fields and add name fields.pop("_type") # type: ignore - fields.pop("return_direct") # type: ignore - fields.pop("verbose") # type: ignore + fields.pop("return_direct", None) # type: ignore + fields.pop("verbose", None) # type: ignore tool_params = { "name": fields.pop("name")["value"], # type: ignore diff --git a/src/backend/langflow/interface/tools/custom.py b/src/backend/langflow/interface/tools/custom.py index 321298e34..73f5842df 100644 --- a/src/backend/langflow/interface/tools/custom.py +++ b/src/backend/langflow/interface/tools/custom.py @@ -1,7 +1,7 @@ from typing import Callable, Optional from langflow.interface.importing.utils import get_function -from pydantic import BaseModel, validator +from pydantic.v1 import BaseModel, validator from langflow.utils import validate from langchain.agents.tools import Tool diff --git a/src/backend/langflow/interface/types.py b/src/backend/langflow/interface/types.py index 755bfc435..424029b62 100644 --- a/src/backend/langflow/interface/types.py +++ b/src/backend/langflow/interface/types.py @@ -1,6 +1,7 @@ import ast import contextlib -from typing import Any, List +from typing import Any, List, Union, Optional +from uuid import UUID from langflow.api.utils import get_new_key from langflow.interface.agents.base import agent_creator from langflow.interface.chains.base import chain_creator @@ -202,7 +203,9 @@ def update_attributes(frontend_node, template_config): frontend_node[attribute] = template_config[attribute] -def build_field_config(custom_component: CustomComponent): +def build_field_config( + custom_component: CustomComponent, user_id: Optional[Union[str, UUID]] = None +): """Build the field configuration for a custom component""" try: @@ -212,7 +215,7 @@ def build_field_config(custom_component: CustomComponent): return {} try: - return custom_class().build_config() + return custom_class(user_id=user_id).build_config() except Exception as exc: logger.error(f"Error while building field config: {str(exc)}") return {} @@ -296,7 +299,9 @@ def add_output_types(frontend_node, return_types: List[str]): frontend_node.get("output_types").append(return_type) -def build_langchain_template_custom_component(custom_component: CustomComponent): +def build_langchain_template_custom_component( + custom_component: CustomComponent, user_id: Optional[Union[str, UUID]] = None +): """Build a custom component template for the langchain""" try: logger.debug("Building custom component template") @@ -309,7 +314,7 @@ def build_langchain_template_custom_component(custom_component: CustomComponent) update_attributes(frontend_node, template_config) logger.debug("Updated attributes") - field_config = build_field_config(custom_component) + field_config = build_field_config(custom_component, user_id=user_id) logger.debug("Built field config") entrypoint_args = custom_component.get_function_entrypoint_args diff --git a/src/backend/langflow/interface/utilities/base.py b/src/backend/langflow/interface/utilities/base.py index 2f2235586..cfebf83a4 100644 --- a/src/backend/langflow/interface/utilities/base.py +++ b/src/backend/langflow/interface/utilities/base.py @@ -1,14 +1,13 @@ from typing import Dict, List, Optional, Type from langchain 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.services.deps import get_settings_service - from langflow.template.frontend_node.utilities import UtilitiesFrontendNode -from loguru import logger from langflow.utils.util import build_template_from_class @@ -28,9 +27,14 @@ class UtilityCreator(LangChainTypeCreator): """ if self.type_dict is None: settings_service = get_settings_service() - self.type_dict = { - utility_name: import_class(f"langchain.utilities.{utility_name}") for utility_name in utilities.__all__ - } + self.type_dict = {} + for utility_name in utilities.__all__: + try: + imported = import_class(f"langchain.utilities.{utility_name}") + self.type_dict[utility_name] = imported + except Exception: + pass + self.type_dict["SQLDatabase"] = utilities.SQLDatabase # Filter according to settings.utilities self.type_dict = { diff --git a/src/backend/langflow/interface/wrappers/base.py b/src/backend/langflow/interface/wrappers/base.py index 66dca7f58..38d61af78 100644 --- a/src/backend/langflow/interface/wrappers/base.py +++ b/src/backend/langflow/interface/wrappers/base.py @@ -1,4 +1,4 @@ -from typing import Dict, List, Optional +from typing import ClassVar, Dict, List, Optional from langchain.utilities import requests, sql_database @@ -10,7 +10,7 @@ from langflow.utils.util import build_template_from_class, build_template_from_m class WrapperCreator(LangChainTypeCreator): type_name: str = "wrappers" - from_method_nodes = {"SQLDatabase": "from_uri"} + from_method_nodes: ClassVar[Dict] = {"SQLDatabase": "from_uri"} @property def type_to_loader_dict(self) -> Dict: diff --git a/src/backend/langflow/services/auth/utils.py b/src/backend/langflow/services/auth/utils.py index 79bb43faa..505e1888c 100644 --- a/src/backend/langflow/services/auth/utils.py +++ b/src/backend/langflow/services/auth/utils.py @@ -16,7 +16,7 @@ from langflow.services.deps import get_session, get_settings_service from sqlmodel import Session from cryptography.fernet import Fernet -oauth2_login = OAuth2PasswordBearer(tokenUrl="api/v1/login") +oauth2_login = OAuth2PasswordBearer(tokenUrl="api/v1/login", auto_error=False) API_KEY_NAME = "x-api-key" @@ -66,6 +66,30 @@ async def api_key_security( async def get_current_user( + token: str = Security(oauth2_login), + query_param: str = Security(api_key_query), + header_param: str = Security(api_key_header), + db: Session = Depends(get_session), +) -> User: + if token: + return await get_current_user_by_jwt(token, db) + else: + if not query_param and not header_param: + raise HTTPException( + status_code=status.HTTP_403_FORBIDDEN, + detail="An API key must be passed as query or header", + ) + user = await api_key_security(query_param, header_param, db) + if user: + return user + + raise HTTPException( + status_code=status.HTTP_403_FORBIDDEN, + detail="Invalid or missing API key", + ) + + +async def get_current_user_by_jwt( token: Annotated[str, Depends(oauth2_login)], db: Session = Depends(get_session), ) -> User: diff --git a/src/backend/langflow/services/cache/utils.py b/src/backend/langflow/services/cache/utils.py index bb8ba9a9e..a6c62d7ec 100644 --- a/src/backend/langflow/services/cache/utils.py +++ b/src/backend/langflow/services/cache/utils.py @@ -7,7 +7,7 @@ import tempfile from collections import OrderedDict from pathlib import Path from typing import TYPE_CHECKING, Any, Dict -from appdirs import user_cache_dir +from platformdirs import user_cache_dir from fastapi import UploadFile from langflow.api.v1.schemas import BuildStatus from langflow.services.database.models.base import orjson_dumps diff --git a/src/backend/langflow/services/database/models/base.py b/src/backend/langflow/services/database/models/base.py index a70999206..9dff68c19 100644 --- a/src/backend/langflow/services/database/models/base.py +++ b/src/backend/langflow/services/database/models/base.py @@ -19,7 +19,6 @@ def orjson_dumps(v, *, default=None, sort_keys=False, indent_2=True): class SQLModelSerializable(SQLModel): - class Config: - orm_mode = True - json_loads = orjson.loads - json_dumps = orjson_dumps + # TODO[pydantic]: The following keys were removed: `json_loads`, `json_dumps`. + # Check https://docs.pydantic.dev/dev-v2/migration/#changes-to-config for more information. + pass diff --git a/src/backend/langflow/services/database/models/flow/flow.py b/src/backend/langflow/services/database/models/flow/flow.py index e4e8f9f78..310969364 100644 --- a/src/backend/langflow/services/database/models/flow/flow.py +++ b/src/backend/langflow/services/database/models/flow/flow.py @@ -1,7 +1,7 @@ # Path: src/backend/langflow/database/models/flow.py from langflow.services.database.models.base import SQLModelSerializable -from pydantic import validator +from pydantic import field_validator from sqlmodel import Field, JSON, Column, Relationship from uuid import UUID, uuid4 @@ -13,11 +13,11 @@ if TYPE_CHECKING: class FlowBase(SQLModelSerializable): name: str = Field(index=True) - description: Optional[str] = Field(index=True) + description: Optional[str] = Field(index=True, nullable=True, default=None) data: Optional[Dict] = Field(default=None, nullable=True) is_component: Optional[bool] = Field(default=False, nullable=True) - @validator("data") + @field_validator("data") def validate_json(v): if not v: return v diff --git a/src/backend/langflow/services/database/models/user/crud.py b/src/backend/langflow/services/database/models/user/crud.py index dd6cbdc7a..c7239bcee 100644 --- a/src/backend/langflow/services/database/models/user/crud.py +++ b/src/backend/langflow/services/database/models/user/crud.py @@ -50,6 +50,9 @@ def update_user(user_db: Optional[User], user: UserUpdate, db: Session = Depends def update_user_last_login_at(user_id: UUID, db: Session = Depends(get_session)): - user_data = UserUpdate(last_login_at=datetime.now(timezone.utc)) # type: ignore - user = get_user_by_id(db, user_id) - return update_user(user, user_data, db) + try: + user_data = UserUpdate(last_login_at=datetime.now(timezone.utc)) # type: ignore + user = get_user_by_id(db, user_id) + return update_user(user, user_data, db) + except Exception: + pass diff --git a/src/backend/langflow/services/database/models/user/user.py b/src/backend/langflow/services/database/models/user/user.py index 1f769c8ec..50525d025 100644 --- a/src/backend/langflow/services/database/models/user/user.py +++ b/src/backend/langflow/services/database/models/user/user.py @@ -20,7 +20,7 @@ class User(SQLModelSerializable, table=True): is_superuser: bool = Field(default=False) create_at: datetime = Field(default_factory=datetime.utcnow) updated_at: datetime = Field(default_factory=datetime.utcnow) - last_login_at: Optional[datetime] = Field() + last_login_at: Optional[datetime] = Field(nullable=True) api_keys: list["ApiKey"] = Relationship( back_populates="user", sa_relationship_kwargs={"cascade": "delete"}, @@ -42,13 +42,13 @@ class UserRead(SQLModel): is_superuser: bool = Field() create_at: datetime = Field() updated_at: datetime = Field() - last_login_at: Optional[datetime] = Field() + last_login_at: Optional[datetime] = Field(nullable=True) class UserUpdate(SQLModel): - username: Optional[str] = Field() - profile_image: Optional[str] = Field() - password: Optional[str] = Field() - is_active: Optional[bool] = Field() - is_superuser: Optional[bool] = Field() - last_login_at: Optional[datetime] = Field() + username: Optional[str] = None + profile_image: Optional[str] = None + password: Optional[str] = None + is_active: Optional[bool] = None + is_superuser: Optional[bool] = None + last_login_at: Optional[datetime] = None diff --git a/src/backend/langflow/services/database/service.py b/src/backend/langflow/services/database/service.py index 2dfac285f..48e576e81 100644 --- a/src/backend/langflow/services/database/service.py +++ b/src/backend/langflow/services/database/service.py @@ -91,7 +91,7 @@ class DatabaseService(Service): legacy_tables = ["flowstyle"] for table, model in model_mapping.items(): - expected_columns = list(model.__fields__.keys()) + expected_columns = list(model.model_fields.keys()) try: available_columns = [col["name"] for col in inspector.get_columns(table)] diff --git a/src/backend/langflow/services/settings/auth.py b/src/backend/langflow/services/settings/auth.py index 432822f4c..476faf0d7 100644 --- a/src/backend/langflow/services/settings/auth.py +++ b/src/backend/langflow/services/settings/auth.py @@ -1,16 +1,18 @@ +import secrets from pathlib import Path from typing import Optional -import secrets + +from loguru import logger +from passlib.context import CryptContext +from pydantic import Field, validator +from pydantic_settings import BaseSettings + from langflow.services.settings.constants import ( DEFAULT_SUPERUSER, DEFAULT_SUPERUSER_PASSWORD, ) from langflow.services.settings.utils import read_secret_from_file, write_secret_to_file -from pydantic import BaseSettings, Field, validator -from passlib.context import CryptContext -from loguru import logger - class AuthSettings(BaseSettings): # Login settings @@ -18,8 +20,7 @@ class AuthSettings(BaseSettings): SECRET_KEY: str = Field( default="", description="Secret key for JWT. If not provided, a random one will be generated.", - env="LANGFLOW_SECRET_KEY", - allow_mutation=False, + frozen=False, ) ALGORITHM: str = "HS256" ACCESS_TOKEN_EXPIRE_MINUTES: int = 60 @@ -37,7 +38,7 @@ class AuthSettings(BaseSettings): SUPERUSER: str = DEFAULT_SUPERUSER SUPERUSER_PASSWORD: str = DEFAULT_SUPERUSER_PASSWORD - pwd_context = CryptContext(schemes=["bcrypt"], deprecated="auto") + pwd_context: CryptContext = CryptContext(schemes=["bcrypt"], deprecated="auto") class Config: validate_assignment = True diff --git a/src/backend/langflow/services/settings/base.py b/src/backend/langflow/services/settings/base.py index 0db5da6b4..f63fbabac 100644 --- a/src/backend/langflow/services/settings/base.py +++ b/src/backend/langflow/services/settings/base.py @@ -7,7 +7,8 @@ from typing import Optional, List from pathlib import Path import yaml -from pydantic import BaseSettings, root_validator, validator +from pydantic import field_validator, validator +from pydantic_settings import BaseSettings, SettingsConfigDict from loguru import logger # BASE_COMPONENTS_PATH = str(Path(__file__).parent / "components") @@ -60,14 +61,14 @@ class Settings(BaseSettings): @validator("CONFIG_DIR", pre=True, allow_reuse=True) def set_langflow_dir(cls, value): if not value: - import appdirs + from platformdirs import user_cache_dir # Define the app name and author app_name = "langflow" app_author = "logspace" # Get the cache directory for the application - cache_dir = appdirs.user_cache_dir(app_name, app_author) + cache_dir = user_cache_dir(app_name, app_author) # Create a .langflow directory inside the cache directory value = Path(cache_dir) @@ -112,7 +113,7 @@ class Settings(BaseSettings): return value - @validator("COMPONENTS_PATH", pre=True) + @field_validator("COMPONENTS_PATH", mode="before") def set_components_path(cls, value): if os.getenv("LANGFLOW_COMPONENTS_PATH"): logger.debug("Adding LANGFLOW_COMPONENTS_PATH to components_path") @@ -137,17 +138,17 @@ class Settings(BaseSettings): logger.debug(f"Components path: {value}") return value - class Config: - validate_assignment = True - extra = "ignore" - env_prefix = "LANGFLOW_" + model_config = SettingsConfigDict( + validate_assignment=True, extra="ignore", env_prefix="LANGFLOW_" + ) - @root_validator(allow_reuse=True) - def validate_lists(cls, values): - for key, value in values.items(): - if key != "dev" and not value: - values[key] = [] - return values + # @model_validator() + # @classmethod + # def validate_lists(cls, values): + # for key, value in values.items(): + # if key != "dev" and not value: + # values[key] = [] + # return values def update_from_yaml(self, file_path: str, dev: bool = False): new_settings = load_settings_from_yaml(file_path) @@ -221,7 +222,7 @@ def load_settings_from_yaml(file_path: str) -> Settings: settings_dict = {k.upper(): v for k, v in settings_dict.items()} for key in settings_dict: - if key not in Settings.__fields__.keys(): + if key not in Settings.model_fields.keys(): raise KeyError(f"Key {key} not found in settings") logger.debug(f"Loading {len(settings_dict[key])} {key} from {file_path}") diff --git a/src/backend/langflow/services/settings/service.py b/src/backend/langflow/services/settings/service.py index e9e535911..a57a59eb8 100644 --- a/src/backend/langflow/services/settings/service.py +++ b/src/backend/langflow/services/settings/service.py @@ -28,7 +28,7 @@ class SettingsService(Service): settings_dict = {k.upper(): v for k, v in settings_dict.items()} for key in settings_dict: - if key not in Settings.__fields__.keys(): + if key not in Settings.model_fields.keys(): raise KeyError(f"Key {key} not found in settings") logger.debug(f"Loading {len(settings_dict[key])} {key} from {file_path}") diff --git a/src/backend/langflow/settings.py b/src/backend/langflow/settings.py new file mode 100644 index 000000000..6b6e81baf --- /dev/null +++ b/src/backend/langflow/settings.py @@ -0,0 +1,177 @@ +import contextlib +import json +import os +from typing import Optional, List +from pathlib import Path + +import yaml +from pydantic import validator, model_validator +from pydantic_settings import BaseSettings +from langflow.utils.logger import logger + +BASE_COMPONENTS_PATH = str(Path(__file__).parent / "components") + + +class Settings(BaseSettings): + CHAINS: dict = {} + AGENTS: dict = {} + PROMPTS: dict = {} + LLMS: dict = {} + TOOLS: dict = {} + MEMORIES: dict = {} + EMBEDDINGS: dict = {} + VECTORSTORES: dict = {} + DOCUMENTLOADERS: dict = {} + WRAPPERS: dict = {} + RETRIEVERS: dict = {} + TOOLKITS: dict = {} + TEXTSPLITTERS: dict = {} + UTILITIES: dict = {} + OUTPUT_PARSERS: dict = {} + CUSTOM_COMPONENTS: dict = {} + + DEV: bool = False + DATABASE_URL: Optional[str] = None + CACHE: str = "InMemoryCache" + REMOVE_API_KEYS: bool = False + COMPONENTS_PATH: List[str] = [] + + @validator("DATABASE_URL", pre=True) + def set_database_url(cls, value): + if not value: + logger.debug( + "No database_url provided, trying LANGFLOW_DATABASE_URL env variable" + ) + if langflow_database_url := os.getenv("LANGFLOW_DATABASE_URL"): + value = langflow_database_url + logger.debug("Using LANGFLOW_DATABASE_URL env variable.") + else: + logger.debug("No DATABASE_URL env variable, using sqlite database") + value = "sqlite:///./langflow.db" + + return value + + @validator("COMPONENTS_PATH", pre=True) + def set_components_path(cls, value): + if os.getenv("LANGFLOW_COMPONENTS_PATH"): + logger.debug("Adding LANGFLOW_COMPONENTS_PATH to components_path") + langflow_component_path = os.getenv("LANGFLOW_COMPONENTS_PATH") + if ( + Path(langflow_component_path).exists() + and langflow_component_path not in value + ): + if isinstance(langflow_component_path, list): + for path in langflow_component_path: + if path not in value: + value.append(path) + logger.debug( + f"Extending {langflow_component_path} to components_path" + ) + elif langflow_component_path not in value: + value.append(langflow_component_path) + logger.debug( + f"Appending {langflow_component_path} to components_path" + ) + + if not value: + value = [BASE_COMPONENTS_PATH] + logger.debug("Setting default components path to components_path") + elif BASE_COMPONENTS_PATH not in value: + value.append(BASE_COMPONENTS_PATH) + logger.debug("Adding default components path to components_path") + + logger.debug(f"Components path: {value}") + return value + + class Config: + validate_assignment = True + extra = "ignore" + env_prefix = "LANGFLOW_" + + @model_validator(mode="after") + def validate_lists(cls, values): + for key, value in values.items(): + if key != "dev" and not value: + values[key] = [] + return values + + def update_from_yaml(self, file_path: str, dev: bool = False): + new_settings = load_settings_from_yaml(file_path) + self.CHAINS = new_settings.CHAINS or {} + self.AGENTS = new_settings.AGENTS or {} + self.PROMPTS = new_settings.PROMPTS or {} + self.LLMS = new_settings.LLMS or {} + self.TOOLS = new_settings.TOOLS or {} + self.MEMORIES = new_settings.MEMORIES or {} + self.WRAPPERS = new_settings.WRAPPERS or {} + self.TOOLKITS = new_settings.TOOLKITS or {} + self.TEXTSPLITTERS = new_settings.TEXTSPLITTERS or {} + self.UTILITIES = new_settings.UTILITIES or {} + self.EMBEDDINGS = new_settings.EMBEDDINGS or {} + self.VECTORSTORES = new_settings.VECTORSTORES or {} + self.DOCUMENTLOADERS = new_settings.DOCUMENTLOADERS or {} + self.RETRIEVERS = new_settings.RETRIEVERS or {} + self.OUTPUT_PARSERS = new_settings.OUTPUT_PARSERS or {} + self.CUSTOM_COMPONENTS = new_settings.CUSTOM_COMPONENTS or {} + self.COMPONENTS_PATH = new_settings.COMPONENTS_PATH or [] + self.DEV = dev + + def update_settings(self, **kwargs): + logger.debug("Updating settings") + for key, value in kwargs.items(): + # value may contain sensitive information, so we don't want to log it + if not hasattr(self, key): + logger.debug(f"Key {key} not found in settings") + continue + logger.debug(f"Updating {key}") + if isinstance(getattr(self, key), list): + # value might be a '[something]' string + with contextlib.suppress(json.decoder.JSONDecodeError): + value = json.loads(str(value)) + if isinstance(value, list): + for item in value: + if isinstance(item, Path): + item = str(item) + if item not in getattr(self, key): + getattr(self, key).append(item) + logger.debug(f"Extended {key}") + else: + if isinstance(value, Path): + value = str(value) + if value not in getattr(self, key): + getattr(self, key).append(value) + logger.debug(f"Appended {key}") + + else: + setattr(self, key, value) + logger.debug(f"Updated {key}") + logger.debug(f"{key}: {getattr(self, key)}") + + +def save_settings_to_yaml(settings: Settings, file_path: str): + with open(file_path, "w") as f: + settings_dict = settings.dict() + yaml.dump(settings_dict, f) + + +def load_settings_from_yaml(file_path: str) -> Settings: + # Check if a string is a valid path or a file name + if "/" not in file_path: + # Get current path + current_path = os.path.dirname(os.path.abspath(__file__)) + + file_path = os.path.join(current_path, file_path) + + with open(file_path, "r") as f: + settings_dict = yaml.safe_load(f) + settings_dict = {k.upper(): v for k, v in settings_dict.items()} + + for key in settings_dict: + if key not in Settings.model_fields.keys(): + raise KeyError(f"Key {key} not found in settings") + logger.debug(f"Loading {len(settings_dict[key])} {key} from {file_path}") + + return Settings(**settings_dict) + + +settings = load_settings_from_yaml("config.yaml") diff --git a/src/backend/langflow/template/frontend_node/agents.py b/src/backend/langflow/template/frontend_node/agents.py index b3f9b4545..1d9d44aaa 100644 --- a/src/backend/langflow/template/frontend_node/agents.py +++ b/src/backend/langflow/template/frontend_node/agents.py @@ -206,7 +206,7 @@ class InitializeAgentNode(FrontendNode): ], ) description: str = """Construct a zero shot agent from an LLM and tools.""" - base_classes: list[str] = ["AgentExecutor", "function"] + base_classes: list[str] = ["AgentExecutor", "Callable"] def to_dict(self): return super().to_dict() diff --git a/src/backend/langflow/template/frontend_node/base.py b/src/backend/langflow/template/frontend_node/base.py index 75af144a7..dc64b0fd8 100644 --- a/src/backend/langflow/template/frontend_node/base.py +++ b/src/backend/langflow/template/frontend_node/base.py @@ -1,6 +1,6 @@ from collections import defaultdict import re -from typing import List, Optional +from typing import ClassVar, DefaultDict, Dict, List, Optional from pydantic import BaseModel, Field @@ -15,10 +15,10 @@ from langflow.utils import constants class FieldFormatters(BaseModel): - formatters = { + formatters: ClassVar[Dict] = { "openai_api_key": field_formatters.OpenAIAPIKeyFormatter(), } - base_formatters = { + base_formatters: ClassVar[Dict] = { "kwargs": field_formatters.KwargsFormatter(), "optional": field_formatters.RemoveOptionalFormatter(), "list": field_formatters.ListTypeFormatter(), @@ -49,7 +49,7 @@ class FrontendNode(BaseModel): name: str = "" display_name: str = "" documentation: str = "" - custom_fields: defaultdict = defaultdict(list) + custom_fields: Optional[DefaultDict[str, List[str]]] = defaultdict(list) output_types: List[str] = [] field_formatters: FieldFormatters = Field(default_factory=FieldFormatters) beta: bool = False diff --git a/src/backend/langflow/template/frontend_node/chains.py b/src/backend/langflow/template/frontend_node/chains.py index dcd8cfcc7..f6e1eacd1 100644 --- a/src/backend/langflow/template/frontend_node/chains.py +++ b/src/backend/langflow/template/frontend_node/chains.py @@ -87,6 +87,8 @@ class ChainFrontendNode(FrontendNode): field.required = True field.show = True field.advanced = False + field.field_type = "BaseLanguageModel" # temporary fix + field.is_list = False if field.name == "return_source_documents": field.required = False @@ -142,7 +144,7 @@ class SeriesCharacterChainNode(FrontendNode): "Chain", "ConversationChain", "SeriesCharacterChain", - "function", + "Callable", ] @@ -243,7 +245,7 @@ class CombineDocsChainNode(FrontendNode): ], ) description: str = """Load question answering chain.""" - base_classes: list[str] = ["BaseCombineDocumentsChain", "function"] + base_classes: list[str] = ["BaseCombineDocumentsChain", "Callable"] def to_dict(self): return super().to_dict() diff --git a/src/backend/langflow/template/frontend_node/documentloaders.py b/src/backend/langflow/template/frontend_node/documentloaders.py index 20ec27009..3b9458321 100644 --- a/src/backend/langflow/template/frontend_node/documentloaders.py +++ b/src/backend/langflow/template/frontend_node/documentloaders.py @@ -1,4 +1,4 @@ -from typing import Optional +from typing import ClassVar, Dict, Optional from langflow.template.field.base import TemplateField from langflow.template.frontend_node.base import FrontendNode @@ -21,7 +21,7 @@ class DocumentLoaderFrontNode(FrontendNode): self.base_classes = ["Document"] self.output_types = ["Document"] - file_path_templates = { + file_path_templates: ClassVar[Dict] = { "AirbyteJSONLoader": build_file_field(suffixes=[".json"], fileTypes=["json"]), "CoNLLULoader": build_file_field(suffixes=[".csv"], fileTypes=["csv"]), "CSVLoader": build_file_field(suffixes=[".csv"], fileTypes=["csv"]), diff --git a/src/backend/langflow/template/frontend_node/formatter/field_formatters.py b/src/backend/langflow/template/frontend_node/formatter/field_formatters.py index c7dca1065..35fb74512 100644 --- a/src/backend/langflow/template/frontend_node/formatter/field_formatters.py +++ b/src/backend/langflow/template/frontend_node/formatter/field_formatters.py @@ -1,4 +1,4 @@ -from typing import Optional +from typing import ClassVar, Dict, Optional from langflow.template.field.base import TemplateField from langflow.template.frontend_node.constants import FORCE_SHOW_FIELDS from langflow.template.frontend_node.formatter.base import FieldFormatter @@ -21,7 +21,7 @@ class OpenAIAPIKeyFormatter(FieldFormatter): class ModelSpecificFieldFormatter(FieldFormatter): - MODEL_DICT = { + MODEL_DICT: ClassVar[Dict] = { "OpenAI": OPENAI_MODELS, "ChatOpenAI": CHAT_OPENAI_MODELS, "Anthropic": ANTHROPIC_MODELS, @@ -86,7 +86,7 @@ class UnionTypeFormatter(FieldFormatter): class SpecialFieldFormatter(FieldFormatter): - SPECIAL_FIELD_HANDLERS = { + SPECIAL_FIELD_HANDLERS: ClassVar[Dict] = { "allowed_tools": lambda field: "Tool", "max_value_length": lambda field: "int", } diff --git a/src/backend/langflow/template/frontend_node/tools.py b/src/backend/langflow/template/frontend_node/tools.py index 579b32da3..315b216a4 100644 --- a/src/backend/langflow/template/frontend_node/tools.py +++ b/src/backend/langflow/template/frontend_node/tools.py @@ -35,7 +35,7 @@ class ToolNode(FrontendNode): ), TemplateField( name="func", - field_type="function", + field_type="Callable", required=True, is_list=False, show=True, @@ -135,7 +135,7 @@ class PythonFunctionNode(FrontendNode): ], ) description: str = "Python function to be executed." - base_classes: list[str] = ["function"] + base_classes: list[str] = ["Callable"] def to_dict(self): return super().to_dict() diff --git a/src/backend/langflow/utils/constants.py b/src/backend/langflow/utils/constants.py index 0c97b56a2..283f44406 100644 --- a/src/backend/langflow/utils/constants.py +++ b/src/backend/langflow/utils/constants.py @@ -6,16 +6,14 @@ OPENAI_MODELS = [ "text-ada-001", ] CHAT_OPENAI_MODELS = [ - "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-1106-preview", "gpt-4", "gpt-4-32k", + "gpt-3.5-turbo", + "gpt-3.5-turbo-16k", ] + ANTHROPIC_MODELS = [ # largest model, ideal for a wide range of more complex tasks. "claude-v1", diff --git a/src/backend/langflow/utils/logger.py b/src/backend/langflow/utils/logger.py index b08621410..08ac40c98 100644 --- a/src/backend/langflow/utils/logger.py +++ b/src/backend/langflow/utils/logger.py @@ -2,9 +2,9 @@ from typing import Optional from loguru import logger from pathlib import Path from rich.logging import RichHandler +from platformdirs import user_cache_dir import os import orjson -import appdirs VALID_LOG_LEVELS = ["DEBUG", "INFO", "WARNING", "ERROR", "CRITICAL"] @@ -50,7 +50,7 @@ def configure(log_level: Optional[str] = None, log_file: Optional[Path] = None): ) if not log_file: - cache_dir = Path(appdirs.user_cache_dir("langflow")) + cache_dir = Path(user_cache_dir("langflow")) log_file = cache_dir / "langflow.log" log_file = Path(log_file) diff --git a/src/backend/langflow/utils/util.py b/src/backend/langflow/utils/util.py index 8eb7f8b25..c86a5f91f 100644 --- a/src/backend/langflow/utils/util.py +++ b/src/backend/langflow/utils/util.py @@ -30,7 +30,7 @@ def build_template_from_function(name: str, type_to_loader_dict: Dict, add_funct docs = parse(_class.__doc__) variables = {"_type": _type} - for class_field_items, value in _class.__fields__.items(): + for class_field_items, value in _class.model_fields.items(): if class_field_items in ["callback_manager"]: continue variables[class_field_items] = {} @@ -52,7 +52,7 @@ def build_template_from_function(name: str, type_to_loader_dict: Dict, add_funct # the output to be a function base_classes = get_base_classes(_class) if add_function: - base_classes.append("function") + base_classes.append("Callable") return { "template": format_dict(variables, name), @@ -100,7 +100,7 @@ def build_template_from_class(name: str, type_to_cls_dict: Dict, add_function: b # Adding function to base classes to allow # the output to be a function if add_function: - base_classes.append("function") + base_classes.append("Callable") return { "template": format_dict(variables, name), "description": docs.short_description or "", @@ -158,7 +158,7 @@ def build_template_from_method( # Adding function to base classes to allow the output to be a function if add_function: - base_classes.append("function") + base_classes.append("Callable") return { "template": format_dict(variables, class_name), @@ -254,6 +254,7 @@ def format_dict(dictionary: Dict[str, Any], class_name: Optional[str] = None) -> _type = remove_optional_wrapper(_type) _type = check_list_type(_type, value) _type = replace_mapping_with_dict(_type) + _type = get_type_from_union_literal(_type) value["type"] = get_formatted_type(key, _type) value["show"] = should_show_field(value, key) @@ -273,6 +274,15 @@ def format_dict(dictionary: Dict[str, Any], class_name: Optional[str] = None) -> return dictionary +# "Union[Literal['f-string'], Literal['jinja2']]" -> "str" +def get_type_from_union_literal(union_literal: str) -> str: + # if types are literal strings + # the type is a string + if "Literal" in union_literal: + return "str" + return union_literal + + def get_type(value: Any) -> Union[str, type]: """ Retrieves the type value from the dictionary. @@ -280,7 +290,8 @@ def get_type(value: Any) -> Union[str, type]: Returns: The type value. """ - _type = value["type"] + # get "type" or "annotation" from the value + _type = value.get("type") or value.get("annotation") return _type if isinstance(_type, str) else _type.__name__ diff --git a/src/frontend/src/App.tsx b/src/frontend/src/App.tsx index 2ffde4deb..0898ad58d 100644 --- a/src/frontend/src/App.tsx +++ b/src/frontend/src/App.tsx @@ -16,8 +16,8 @@ import { FETCH_ERROR_MESSAGE, } from "./constants/constants"; import { alertContext } from "./contexts/alertContext"; +import { FlowsContext } from "./contexts/flowsContext"; import { locationContext } from "./contexts/locationContext"; -import { TabsContext } from "./contexts/tabsContext"; import { typesContext } from "./contexts/typesContext"; import Router from "./routes"; @@ -30,7 +30,7 @@ export default function App() { setShowSideBar(true); setIsStackedOpen(true); }, [location.pathname, setCurrent, setIsStackedOpen, setShowSideBar]); - const { hardReset } = useContext(TabsContext); + const { hardReset } = useContext(FlowsContext); const { errorData, diff --git a/src/frontend/src/CustomNodes/GenericNode/components/parameterComponent/index.tsx b/src/frontend/src/CustomNodes/GenericNode/components/parameterComponent/index.tsx index 78881d959..d47b7bcda 100644 --- a/src/frontend/src/CustomNodes/GenericNode/components/parameterComponent/index.tsx +++ b/src/frontend/src/CustomNodes/GenericNode/components/parameterComponent/index.tsx @@ -23,10 +23,9 @@ import TextAreaComponent from "../../../../components/textAreaComponent"; import ToggleShadComponent from "../../../../components/toggleShadComponent"; import { Button } from "../../../../components/ui/button"; import { TOOLTIP_EMPTY } from "../../../../constants/constants"; -import { TabsContext } from "../../../../contexts/tabsContext"; +import { FlowsContext } from "../../../../contexts/flowsContext"; import { typesContext } from "../../../../contexts/typesContext"; import { ParameterComponentType } from "../../../../types/components"; -import { TabsState } from "../../../../types/tabs"; import { convertObjToArray, convertValuesToNumbers, @@ -63,7 +62,7 @@ export default function ParameterComponent({ const infoHtml = useRef(null); const updateNodeInternals = useUpdateNodeInternals(); const [position, setPosition] = useState(0); - const { setTabsState, tabId, flows } = useContext(TabsContext); + const { setTabsState, tabId, flows } = useContext(FlowsContext); const flow = flows.find((flow) => flow.id === tabId)?.data?.nodes ?? null; diff --git a/src/frontend/src/CustomNodes/GenericNode/index.tsx b/src/frontend/src/CustomNodes/GenericNode/index.tsx index a58f7a92c..81d99c8d5 100644 --- a/src/frontend/src/CustomNodes/GenericNode/index.tsx +++ b/src/frontend/src/CustomNodes/GenericNode/index.tsx @@ -7,7 +7,7 @@ import IconComponent from "../../components/genericIconComponent"; import InputComponent from "../../components/inputComponent"; import { Textarea } from "../../components/ui/textarea"; import { useSSE } from "../../contexts/SSEContext"; -import { TabsContext } from "../../contexts/tabsContext"; +import { FlowsContext } from "../../contexts/flowsContext"; import { typesContext } from "../../contexts/typesContext"; import NodeToolbarComponent from "../../pages/FlowPage/components/nodeToolbarComponent"; import { validationStatusType } from "../../types/components"; @@ -18,7 +18,7 @@ import { scapedJSONStringfy, } from "../../utils/reactflowUtils"; import { nodeColors, nodeIconsLucide } from "../../utils/styleUtils"; -import { classNames, toTitleCase } from "../../utils/utils"; +import { classNames, getFieldTitle } from "../../utils/utils"; import ParameterComponent from "./components/parameterComponent"; export default function GenericNode({ @@ -33,7 +33,7 @@ export default function GenericNode({ yPos: number; }): JSX.Element { const [data, setData] = useState(olddata); - const { updateFlow, flows, tabId } = useContext(TabsContext); + const { updateFlow, flows, tabId } = useContext(FlowsContext); const updateNodeInternals = useUpdateNodeInternals(); const { types, deleteNode, reactFlowInstance, setFilterEdge, getFilterEdge } = useContext(typesContext); @@ -239,15 +239,10 @@ export default function GenericNode({ ] ?? nodeColors.unknown } - title={ - data.node?.template[templateField].display_name - ? data.node.template[templateField].display_name - : data.node?.template[templateField].name - ? toTitleCase( - data.node.template[templateField].name - ) - : toTitleCase(templateField) - } + title={getFieldTitle( + data.node?.template!, + templateField + )} info={data.node?.template[templateField].info} name={templateField} tooltipTitle={ @@ -448,15 +443,10 @@ export default function GenericNode({ ] ?? nodeColors.unknown } - title={ - data.node?.template[templateField].display_name - ? data.node.template[templateField].display_name - : data.node?.template[templateField].name - ? toTitleCase( - data.node.template[templateField].name - ) - : toTitleCase(templateField) - } + title={getFieldTitle( + data.node?.template!, + templateField + )} info={data.node?.template[templateField].info} name={templateField} tooltipTitle={ diff --git a/src/frontend/src/components/chatComponent/buildTrigger/index.tsx b/src/frontend/src/components/chatComponent/buildTrigger/index.tsx index 90876c5c7..21ea64e01 100644 --- a/src/frontend/src/components/chatComponent/buildTrigger/index.tsx +++ b/src/frontend/src/components/chatComponent/buildTrigger/index.tsx @@ -7,9 +7,9 @@ import { typesContext } from "../../../contexts/typesContext"; import { postBuildInit } from "../../../controllers/API"; import { FlowType } from "../../../types/flow"; -import { TabsContext } from "../../../contexts/tabsContext"; +import { FlowsContext } from "../../../contexts/flowsContext"; import { parsedDataType } from "../../../types/components"; -import { TabsState } from "../../../types/tabs"; +import { FlowsState } from "../../../types/tabs"; import { validateNodes } from "../../../utils/reactflowUtils"; import RadialProgressComponent from "../../RadialProgress"; import IconComponent from "../../genericIconComponent"; @@ -26,7 +26,7 @@ export default function BuildTrigger({ }): JSX.Element { const { updateSSEData, isBuilding, setIsBuilding, sseData } = useSSE(); const { reactFlowInstance } = useContext(typesContext); - const { setTabsState, saveFlow } = useContext(TabsContext); + const { setTabsState, saveFlow } = useContext(FlowsContext); const { setErrorData, setSuccessData } = useContext(alertContext); const [isIconTouched, setIsIconTouched] = useState(false); const eventClick = isBuilding ? "pointer-events-none" : ""; @@ -103,7 +103,7 @@ export default function BuildTrigger({ setSuccessData({ title: parsedData.log }); } else if (parsedData.input_keys !== undefined) { //@ts-ignore - setTabsState((old: TabsState) => { + setTabsState((old: FlowsState) => { return { ...old, [flowId]: { diff --git a/src/frontend/src/components/chatComponent/index.tsx b/src/frontend/src/components/chatComponent/index.tsx index 69765dfe0..56a65dd35 100644 --- a/src/frontend/src/components/chatComponent/index.tsx +++ b/src/frontend/src/components/chatComponent/index.tsx @@ -5,7 +5,7 @@ import BuildTrigger from "./buildTrigger"; import ChatTrigger from "./chatTrigger"; import * as _ from "lodash"; -import { TabsContext } from "../../contexts/tabsContext"; +import { FlowsContext } from "../../contexts/flowsContext"; import { getBuildStatus } from "../../controllers/API"; import FormModal from "../../modals/formModal"; import { NodeType } from "../../types/flow"; @@ -13,7 +13,7 @@ import { NodeType } from "../../types/flow"; export default function Chat({ flow }: ChatType): JSX.Element { const [open, setOpen] = useState(false); const [canOpen, setCanOpen] = useState(false); - const { tabsState, isBuilt, setIsBuilt } = useContext(TabsContext); + const { tabsState, isBuilt, setIsBuilt } = useContext(FlowsContext); useEffect(() => { const handleKeyDown = (event: KeyboardEvent) => { diff --git a/src/frontend/src/components/headerComponent/components/menuBar/index.tsx b/src/frontend/src/components/headerComponent/components/menuBar/index.tsx index 676dccabe..02282ab59 100644 --- a/src/frontend/src/components/headerComponent/components/menuBar/index.tsx +++ b/src/frontend/src/components/headerComponent/components/menuBar/index.tsx @@ -1,5 +1,5 @@ import { useContext, useState } from "react"; -import { TabsContext } from "../../../../contexts/tabsContext"; +import { FlowsContext } from "../../../../contexts/flowsContext"; import { DropdownMenu, DropdownMenuContent, @@ -17,7 +17,7 @@ import IconComponent from "../../../genericIconComponent"; import { Button } from "../../../ui/button"; export const MenuBar = ({ flows, tabId }: menuBarPropsType): JSX.Element => { - const { addFlow } = useContext(TabsContext); + const { addFlow } = useContext(FlowsContext); const { setErrorData } = useContext(alertContext); const { undo, redo } = useContext(undoRedoContext); const [openSettings, setOpenSettings] = useState(false); diff --git a/src/frontend/src/components/headerComponent/index.tsx b/src/frontend/src/components/headerComponent/index.tsx index 337d6c570..77cd0ded8 100644 --- a/src/frontend/src/components/headerComponent/index.tsx +++ b/src/frontend/src/components/headerComponent/index.tsx @@ -7,7 +7,8 @@ import { alertContext } from "../../contexts/alertContext"; import { AuthContext } from "../../contexts/authContext"; import { darkContext } from "../../contexts/darkContext"; import { StoreContext } from "../../contexts/storeContext"; -import { TabsContext } from "../../contexts/tabsContext"; + +import { FlowsContext } from "../../contexts/flowsContext"; import { gradients } from "../../utils/styleUtils"; import IconComponent from "../genericIconComponent"; import { Button } from "../ui/button"; @@ -23,7 +24,7 @@ import { Separator } from "../ui/separator"; import MenuBar from "./components/menuBar"; export default function Header(): JSX.Element { - const { flows, tabId } = useContext(TabsContext); + const { flows, tabId } = useContext(FlowsContext); const { dark, setDark } = useContext(darkContext); const { notificationCenter } = useContext(alertContext); const location = useLocation(); diff --git a/src/frontend/src/components/inputFileComponent/index.tsx b/src/frontend/src/components/inputFileComponent/index.tsx index 3bd1d1c23..e3aaf5d04 100644 --- a/src/frontend/src/components/inputFileComponent/index.tsx +++ b/src/frontend/src/components/inputFileComponent/index.tsx @@ -1,6 +1,6 @@ import { useContext, useEffect, useState } from "react"; import { alertContext } from "../../contexts/alertContext"; -import { TabsContext } from "../../contexts/tabsContext"; +import { FlowsContext } from "../../contexts/flowsContext"; import { uploadFile } from "../../controllers/API"; import { FileComponentType } from "../../types/components"; import IconComponent from "../genericIconComponent"; @@ -17,7 +17,7 @@ export default function InputFileComponent({ const [myValue, setMyValue] = useState(value); const [loading, setLoading] = useState(false); const { setErrorData } = useContext(alertContext); - const { tabId } = useContext(TabsContext); + const { tabId } = useContext(FlowsContext); // Clear component state useEffect(() => { diff --git a/src/frontend/src/contexts/tabsContext.tsx b/src/frontend/src/contexts/flowsContext.tsx similarity index 98% rename from src/frontend/src/contexts/tabsContext.tsx rename to src/frontend/src/contexts/flowsContext.tsx index 08ac1f29d..e89d59715 100644 --- a/src/frontend/src/contexts/tabsContext.tsx +++ b/src/frontend/src/contexts/flowsContext.tsx @@ -28,7 +28,7 @@ import { sourceHandleType, targetHandleType, } from "../types/flow"; -import { TabsContextType, TabsState } from "../types/tabs"; +import { FlowsContextType, TabsState } from "../types/tabs"; import { addVersionToDuplicates, checkOldEdgesHandles, @@ -52,7 +52,7 @@ import { typesContext } from "./typesContext"; const uid = new ShortUniqueId({ length: 5 }); -const TabsContextInitialValue: TabsContextType = { +const FlowsContextInitialValue: FlowsContextType = { tabId: "", setTabId: (index: string) => {}, isLoading: true, @@ -84,11 +84,11 @@ const TabsContextInitialValue: TabsContextType = { deleteComponent: (id: string, key: string) => {}, }; -export const TabsContext = createContext( - TabsContextInitialValue +export const FlowsContext = createContext( + FlowsContextInitialValue ); -export function TabsProvider({ children }: { children: ReactNode }) { +export function FlowsProvider({ children }: { children: ReactNode }) { const { setErrorData, setNoticeData, setSuccessData } = useContext(alertContext); const { getAuthentication, isAuthenticated } = useContext(AuthContext); @@ -713,7 +713,7 @@ export function TabsProvider({ children }: { children: ReactNode }) { const [isBuilt, setIsBuilt] = useState(false); return ( - {children} - + ); } diff --git a/src/frontend/src/contexts/index.tsx b/src/frontend/src/contexts/index.tsx index d9f5ef867..e61102846 100644 --- a/src/frontend/src/contexts/index.tsx +++ b/src/frontend/src/contexts/index.tsx @@ -7,9 +7,10 @@ import { SSEProvider } from "./SSEContext"; import { AlertProvider } from "./alertContext"; import { AuthProvider } from "./authContext"; import { DarkProvider } from "./darkContext"; +import { FlowsProvider } from "./flowsContext"; import { LocationProvider } from "./locationContext"; import { StoreProvider } from "./storeContext"; -import { TabsProvider } from "./tabsContext"; + import { TypesProvider } from "./typesContext"; import { UndoRedoProvider } from "./undoRedoContext"; @@ -27,11 +28,11 @@ export default function ContextWrapper({ children }: { children: ReactNode }) { - + {children} - + diff --git a/src/frontend/src/contexts/undoRedoContext.tsx b/src/frontend/src/contexts/undoRedoContext.tsx index 83dfd8f32..a948e37e3 100644 --- a/src/frontend/src/contexts/undoRedoContext.tsx +++ b/src/frontend/src/contexts/undoRedoContext.tsx @@ -13,7 +13,7 @@ import { undoRedoContextType, } from "../types/typesContext"; import { isWrappedWithClass } from "../utils/utils"; -import { TabsContext } from "./tabsContext"; +import { FlowsContext } from "./flowsContext"; const initialValue = { undo: () => {}, @@ -29,7 +29,7 @@ const defaultOptions: UseUndoRedoOptions = { export const undoRedoContext = createContext(initialValue); export function UndoRedoProvider({ children }) { - const { tabId, flows } = useContext(TabsContext); + const { tabId, flows } = useContext(FlowsContext); const [past, setPast] = useState(flows.map(() => [])); const [future, setFuture] = useState(flows.map(() => [])); diff --git a/src/frontend/src/icons/AWS/AWS.jsx b/src/frontend/src/icons/AWS/AWS.jsx new file mode 100644 index 000000000..f79821431 --- /dev/null +++ b/src/frontend/src/icons/AWS/AWS.jsx @@ -0,0 +1,31 @@ +const SvgAWS = (props) => ( + + + + + + +); +export default SvgAWS; diff --git a/src/frontend/src/icons/AWS/AWS.svg b/src/frontend/src/icons/AWS/AWS.svg new file mode 100644 index 000000000..4715937ff --- /dev/null +++ b/src/frontend/src/icons/AWS/AWS.svg @@ -0,0 +1,38 @@ + + + + + + + + + + + + diff --git a/src/frontend/src/icons/AWS/index.tsx b/src/frontend/src/icons/AWS/index.tsx new file mode 100644 index 000000000..caedd54aa --- /dev/null +++ b/src/frontend/src/icons/AWS/index.tsx @@ -0,0 +1,8 @@ +import React, { forwardRef } from "react"; +import SvgAWS from "./AWS"; + +export const AWSIcon = forwardRef>( + (props, ref) => { + return ; + } +); diff --git a/src/frontend/src/modals/ApiModal/index.tsx b/src/frontend/src/modals/ApiModal/index.tsx index 446562f66..dde0090c1 100644 --- a/src/frontend/src/modals/ApiModal/index.tsx +++ b/src/frontend/src/modals/ApiModal/index.tsx @@ -15,7 +15,7 @@ import CodeTabsComponent from "../../components/codeTabsComponent"; import IconComponent from "../../components/genericIconComponent"; import { EXPORT_CODE_DIALOG } from "../../constants/constants"; import { AuthContext } from "../../contexts/authContext"; -import { TabsContext } from "../../contexts/tabsContext"; +import { FlowsContext } from "../../contexts/flowsContext"; import { TemplateVariableType } from "../../types/api"; import { tweakType, uniqueTweakType } from "../../types/components"; import { FlowType, NodeType } from "../../types/flow/index"; @@ -45,7 +45,7 @@ const ApiModal = forwardRef( const [activeTab, setActiveTab] = useState("0"); const tweak = useRef([]); const tweaksList = useRef([]); - const { setTweak, getTweak, tabsState } = useContext(TabsContext); + const { setTweak, getTweak, tabsState } = useContext(FlowsContext); const pythonApiCode = getPythonApiCode( flow, autoLogin, diff --git a/src/frontend/src/modals/EditNodeModal/index.tsx b/src/frontend/src/modals/EditNodeModal/index.tsx index af70d6b0e..6466d19b9 100644 --- a/src/frontend/src/modals/EditNodeModal/index.tsx +++ b/src/frontend/src/modals/EditNodeModal/index.tsx @@ -33,10 +33,10 @@ import { TableRow, } from "../../components/ui/table"; import { limitScrollFieldsModal } from "../../constants/constants"; -import { TabsContext } from "../../contexts/tabsContext"; +import { FlowsContext } from "../../contexts/flowsContext"; import { typesContext } from "../../contexts/typesContext"; import { NodeDataType } from "../../types/flow"; -import { TabsState } from "../../types/tabs"; +import { FlowsState } from "../../types/tabs"; import { convertObjToArray, convertValuesToNumbers, @@ -69,7 +69,7 @@ const EditNodeModal = forwardRef( const myData = useRef(data); - const { setTabsState, tabId } = useContext(TabsContext); + const { setTabsState, tabId } = useContext(FlowsContext); const { reactFlowInstance } = useContext(typesContext); let disabled = reactFlowInstance @@ -542,7 +542,7 @@ const EditNodeModal = forwardRef( const newData = cloneDeep(myData.current); myData.current = newData; //@ts-ignore - setTabsState((prev: TabsState) => { + setTabsState((prev: FlowsState) => { return { ...prev, [tabId]: { diff --git a/src/frontend/src/modals/exportModal/index.tsx b/src/frontend/src/modals/exportModal/index.tsx index 2f41a6810..8ed243876 100644 --- a/src/frontend/src/modals/exportModal/index.tsx +++ b/src/frontend/src/modals/exportModal/index.tsx @@ -5,13 +5,15 @@ import { Button } from "../../components/ui/button"; import { Checkbox } from "../../components/ui/checkbox"; import { EXPORT_DIALOG_SUBTITLE } from "../../constants/constants"; import { alertContext } from "../../contexts/alertContext"; -import { TabsContext } from "../../contexts/tabsContext"; +import { FlowsContext } from "../../contexts/flowsContext"; +import { typesContext } from "../../contexts/typesContext"; import { removeApiKeys } from "../../utils/reactflowUtils"; import BaseModal from "../baseModal"; const ExportModal = forwardRef( (props: { children: ReactNode }, ref): JSX.Element => { - const { flows, tabId, downloadFlow } = useContext(TabsContext); + const { flows, tabId, downloadFlow } = useContext(FlowsContext); + const { reactFlowInstance } = useContext(typesContext); const { setNoticeData } = useContext(alertContext); const [checked, setChecked] = useState(true); const flow = flows.find((f) => f.id === tabId); @@ -66,7 +68,12 @@ const ExportModal = forwardRef( onClick={() => { if (checked) { downloadFlow( - flows.find((flow) => flow.id === tabId)!, + { + id: tabId, + data: reactFlowInstance?.toObject()!, + description, + name, + }, name!, description ); @@ -76,7 +83,12 @@ const ExportModal = forwardRef( }); } else downloadFlow( - removeApiKeys(flows.find((flow) => flow.id === tabId)!), + removeApiKeys({ + id: tabId, + data: reactFlowInstance?.toObject()!, + description, + name, + }), name!, description ); diff --git a/src/frontend/src/modals/flowSettingsModal/index.tsx b/src/frontend/src/modals/flowSettingsModal/index.tsx index 48eb9225c..1d514adc9 100644 --- a/src/frontend/src/modals/flowSettingsModal/index.tsx +++ b/src/frontend/src/modals/flowSettingsModal/index.tsx @@ -3,7 +3,7 @@ import EditFlowSettings from "../../components/EditFlowSettingsComponent"; import IconComponent from "../../components/genericIconComponent"; import { Button } from "../../components/ui/button"; import { SETTINGS_DIALOG_SUBTITLE } from "../../constants/constants"; -import { TabsContext } from "../../contexts/tabsContext"; +import { FlowsContext } from "../../contexts/flowsContext"; import { FlowSettingsPropsType } from "../../types/components"; import BaseModal from "../baseModal"; @@ -11,7 +11,7 @@ export default function FlowSettingsModal({ open, setOpen, }: FlowSettingsPropsType): JSX.Element { - const { flows, tabId, updateFlow, saveFlow } = useContext(TabsContext); + const { flows, tabId, updateFlow, saveFlow } = useContext(FlowsContext); const flow = flows.find((f) => f.id === tabId); useEffect(() => { setName(flow!.name); diff --git a/src/frontend/src/modals/formModal/index.tsx b/src/frontend/src/modals/formModal/index.tsx index 2c7fa53fe..f6f7c214f 100644 --- a/src/frontend/src/modals/formModal/index.tsx +++ b/src/frontend/src/modals/formModal/index.tsx @@ -24,9 +24,9 @@ import { import { Textarea } from "../../components/ui/textarea"; import { CHAT_FORM_DIALOG_SUBTITLE } from "../../constants/constants"; import { AuthContext } from "../../contexts/authContext"; -import { TabsContext } from "../../contexts/tabsContext"; +import { FlowsContext } from "../../contexts/flowsContext"; import { getBuildStatus } from "../../controllers/API"; -import { TabsState } from "../../types/tabs"; +import { FlowsState } from "../../types/tabs"; import { validateNodes } from "../../utils/reactflowUtils"; export default function FormModal({ @@ -38,7 +38,7 @@ export default function FormModal({ setOpen: (open: boolean) => void; flow: FlowType; }): JSX.Element { - const { tabsState, setTabsState } = useContext(TabsContext); + const { tabsState, setTabsState } = useContext(FlowsContext); const [chatValue, setChatValue] = useState(() => { try { const { formKeysData } = tabsState[flow.id]; @@ -401,7 +401,7 @@ export default function FormModal({ chatKey: chatKey!, }); //@ts-ignore - setTabsState((old: TabsState) => { + setTabsState((old: FlowsState) => { if (!chatKey) return old; let newTabsState = _.cloneDeep(old); newTabsState[id.current].formKeysData.input_keys![chatKey] = ""; @@ -522,7 +522,7 @@ export default function FormModal({ } onChange={(e) => { //@ts-ignore - setTabsState((old: TabsState) => { + setTabsState((old: FlowsState) => { let newTabsState = _.cloneDeep(old); newTabsState[ id.current @@ -634,7 +634,7 @@ export default function FormModal({ setChatValue={(value) => { setChatValue(value); //@ts-ignore - setTabsState((old: TabsState) => { + setTabsState((old: FlowsState) => { let newTabsState = _.cloneDeep(old); newTabsState[id.current].formKeysData.input_keys![ chatKey! diff --git a/src/frontend/src/pages/AdminPage/index.tsx b/src/frontend/src/pages/AdminPage/index.tsx index bc8f56b70..39a36544c 100644 --- a/src/frontend/src/pages/AdminPage/index.tsx +++ b/src/frontend/src/pages/AdminPage/index.tsx @@ -22,7 +22,7 @@ import { } from "../../constants/constants"; import { alertContext } from "../../contexts/alertContext"; import { AuthContext } from "../../contexts/authContext"; -import { TabsContext } from "../../contexts/tabsContext"; +import { FlowsContext } from "../../contexts/flowsContext"; import { addUser, deleteUser, @@ -43,7 +43,8 @@ export default function AdminPage() { const { setErrorData, setSuccessData } = useContext(alertContext); const { userData } = useContext(AuthContext); const [totalRowsCount, setTotalRowsCount] = useState(0); - const { setTabId } = useContext(TabsContext); + + const { setTabId } = useContext(FlowsContext); // set null id useEffect(() => { diff --git a/src/frontend/src/pages/CommunityPage/index.tsx b/src/frontend/src/pages/CommunityPage/index.tsx index ec8f375fe..d005375fc 100644 --- a/src/frontend/src/pages/CommunityPage/index.tsx +++ b/src/frontend/src/pages/CommunityPage/index.tsx @@ -1,7 +1,7 @@ import { useContext, useEffect, useState } from "react"; import { Button } from "../../components/ui/button"; import { alertContext } from "../../contexts/alertContext"; -import { TabsContext } from "../../contexts/tabsContext"; +import { FlowsContext } from "../../contexts/flowsContext"; import { useNavigate } from "react-router-dom"; import { CardComponent } from "../../components/cardComponent"; @@ -12,7 +12,7 @@ import { getExamples } from "../../controllers/API"; import { FlowType } from "../../types/flow"; export default function CommunityPage(): JSX.Element { const { flows, setTabId, downloadFlows, uploadFlows, addFlow } = - useContext(TabsContext); + useContext(FlowsContext); // set null id useEffect(() => { diff --git a/src/frontend/src/pages/FlowPage/components/DisclosureComponent/index.tsx b/src/frontend/src/pages/FlowPage/components/DisclosureComponent/index.tsx index 3a47580bb..d2ff0eee8 100644 --- a/src/frontend/src/pages/FlowPage/components/DisclosureComponent/index.tsx +++ b/src/frontend/src/pages/FlowPage/components/DisclosureComponent/index.tsx @@ -8,7 +8,7 @@ export default function DisclosureComponent({ openDisc, }: DisclosureComponentType): JSX.Element { return ( - + {({ open }) => ( <>
@@ -35,9 +35,7 @@ export default function DisclosureComponent({
- - {children} - + {children} )}
diff --git a/src/frontend/src/pages/FlowPage/components/PageComponent/index.tsx b/src/frontend/src/pages/FlowPage/components/PageComponent/index.tsx index 0512859c7..71931b18c 100644 --- a/src/frontend/src/pages/FlowPage/components/PageComponent/index.tsx +++ b/src/frontend/src/pages/FlowPage/components/PageComponent/index.tsx @@ -28,13 +28,13 @@ import ReactFlow, { import GenericNode from "../../../../CustomNodes/GenericNode"; import Chat from "../../../../components/chatComponent"; import { alertContext } from "../../../../contexts/alertContext"; +import { FlowsContext } from "../../../../contexts/flowsContext"; import { locationContext } from "../../../../contexts/locationContext"; -import { TabsContext } from "../../../../contexts/tabsContext"; import { typesContext } from "../../../../contexts/typesContext"; import { undoRedoContext } from "../../../../contexts/undoRedoContext"; import { APIClassType } from "../../../../types/api"; import { FlowType, NodeType, targetHandleType } from "../../../../types/flow"; -import { TabsState } from "../../../../types/tabs"; +import { FlowsState } from "../../../../types/tabs"; import { generateFlow, generateNodeFromFlow, @@ -70,7 +70,7 @@ export default function Page({ saveFlow, setTabsState, tabId, - } = useContext(TabsContext); + } = useContext(FlowsContext); const { types, reactFlowInstance, @@ -208,7 +208,7 @@ export default function Page({ return newX; }); //@ts-ignore - setTabsState((prev: TabsState) => { + setTabsState((prev: FlowsState) => { return { ...prev, [tabId]: { @@ -225,7 +225,7 @@ export default function Page({ (change: NodeChange[]) => { onNodesChange(change); //@ts-ignore - setTabsState((prev: TabsState) => { + setTabsState((prev: FlowsState) => { return { ...prev, [tabId]: { diff --git a/src/frontend/src/pages/FlowPage/components/extraSidebarComponent/index.tsx b/src/frontend/src/pages/FlowPage/components/extraSidebarComponent/index.tsx index a02cd5cd0..0de370b54 100644 --- a/src/frontend/src/pages/FlowPage/components/extraSidebarComponent/index.tsx +++ b/src/frontend/src/pages/FlowPage/components/extraSidebarComponent/index.tsx @@ -8,7 +8,7 @@ import ToggleShadComponent from "../../../../components/toggleShadComponent"; import { Input } from "../../../../components/ui/input"; import { Separator } from "../../../../components/ui/separator"; import { alertContext } from "../../../../contexts/alertContext"; -import { TabsContext } from "../../../../contexts/tabsContext"; +import { FlowsContext } from "../../../../contexts/flowsContext"; import { typesContext } from "../../../../contexts/typesContext"; import { getStoreTags, saveFlowStore } from "../../../../controllers/API"; import ApiModal from "../../../../modals/ApiModal"; @@ -34,7 +34,7 @@ export default function ExtraSidebar(): JSX.Element { const { data, templates, getFilterEdge, setFilterEdge } = useContext(typesContext); const { flows, tabId, uploadFlow, tabsState, saveFlow, isBuilt } = - useContext(TabsContext); + useContext(FlowsContext); const { setSuccessData, setErrorData } = useContext(alertContext); const [dataFilter, setFilterData] = useState(data); const [search, setSearch] = useState(""); @@ -195,7 +195,7 @@ export default function ExtraSidebar(): JSX.Element { } } }); - setSearch("search"); + setSearch(""); return ret; }); } @@ -368,8 +368,12 @@ export default function ExtraSidebar(): JSX.Element { .map((SBSectionName: keyof APIObjectType, index) => Object.keys(dataFilter[SBSectionName]).length > 0 ? ( ( CONTROL_PATCH_USER_STATE diff --git a/src/frontend/src/pages/ViewPage/index.tsx b/src/frontend/src/pages/ViewPage/index.tsx index 4ce5baed4..ec64001dd 100644 --- a/src/frontend/src/pages/ViewPage/index.tsx +++ b/src/frontend/src/pages/ViewPage/index.tsx @@ -1,11 +1,11 @@ import { useContext, useEffect, useState } from "react"; import { useParams } from "react-router-dom"; -import { TabsContext } from "../../contexts/tabsContext"; +import { FlowsContext } from "../../contexts/flowsContext"; import { getVersion } from "../../controllers/API"; import Page from "../FlowPage/components/PageComponent"; export default function ViewPage() { - const { flows, tabId, setTabId } = useContext(TabsContext); + const { flows, tabId, setTabId } = useContext(FlowsContext); const { id } = useParams(); // Set flow tab id diff --git a/src/frontend/src/types/api/index.ts b/src/frontend/src/types/api/index.ts index 647f76ce7..38cd59bda 100644 --- a/src/frontend/src/types/api/index.ts +++ b/src/frontend/src/types/api/index.ts @@ -48,6 +48,8 @@ export type TemplateVariableType = { dynamic?: boolean; proxy?: { id: string; field: string }; input_types?: Array; + display_name?: string; + name?: string; [key: string]: any; }; export type sendAllProps = { diff --git a/src/frontend/src/types/tabs/index.ts b/src/frontend/src/types/tabs/index.ts index b8b4a24e9..0d83065a4 100644 --- a/src/frontend/src/types/tabs/index.ts +++ b/src/frontend/src/types/tabs/index.ts @@ -1,7 +1,7 @@ import { tweakType } from "../components"; import { FlowType, NodeDataType } from "../flow"; -export type TabsContextType = { +export type FlowsContextType = { saveFlow: (flow: FlowType, silent?: boolean) => Promise; tabId: string; isLoading: boolean; @@ -26,8 +26,8 @@ export type TabsContextType = { uploadFlow: (newFlow: boolean, file?: File) => Promise; hardReset: () => void; getNodeId: (nodeType: string) => string; - tabsState: TabsState; - setTabsState: (state: TabsState) => void; + tabsState: FlowsState; + setTabsState: (state: FlowsState) => void; paste: ( selection: { nodes: any; edges: any }, position: { x: number; y: number; paneX?: number; paneY?: number } @@ -40,7 +40,7 @@ export type TabsContextType = { deleteComponent: (id: string, key: string) => void; }; -export type TabsState = { +export type FlowsState = { [key: string]: { isPending: boolean; formKeysData: { diff --git a/src/frontend/src/utils/reactflowUtils.ts b/src/frontend/src/utils/reactflowUtils.ts index 4f9c7ba0b..407828982 100644 --- a/src/frontend/src/utils/reactflowUtils.ts +++ b/src/frontend/src/utils/reactflowUtils.ts @@ -8,7 +8,6 @@ import { ReactFlowJsonObject, XYPosition, } from "reactflow"; -import ShortUniqueId from "short-unique-id"; import { specialCharsRegex } from "../constants/constants"; import { APITemplateType, TemplateVariableType } from "../types/api"; import { @@ -25,8 +24,7 @@ import { unselectAllNodesType, updateEdgesHandleIdsType, } from "../types/utils/reactflowUtils"; -import { toNormalCase, toTitleCase } from "./utils"; -const uid = new ShortUniqueId({ length: 5 }); +import { getFieldTitle, toTitleCase } from "./utils"; export function cleanEdges({ flow: { edges, nodes }, @@ -241,11 +239,7 @@ export function validateNode(node: NodeType, edges: Edge[]): Array { node.id ) ) { - errors.push( - `${type} is missing ${ - template.display_name || toNormalCase(template[t].name) - }.` - ); + errors.push(`${type} is missing ${getFieldTitle(template, t)}.`); } else if ( template[t].type === "dict" && template[t].required && @@ -256,15 +250,14 @@ export function validateNode(node: NodeType, edges: Edge[]): Array { ) { if (hasDuplicateKeys(template[t].value)) errors.push( - `${type} (${ - template.display_name || template[t].name - }) contains duplicate keys with the same values.` + `${type} (${getFieldTitle( + template, + t + )}) contains duplicate keys with the same values.` ); if (hasEmptyKey(template[t].value)) errors.push( - `${type} (${ - template.display_name || template[t].name - }) field must not be empty.` + `${type} (${getFieldTitle(template, t)}) field must not be empty.` ); } return errors; @@ -513,7 +506,7 @@ export function generateFlow( name: string ): generateFlowType { const newFlowData = reactFlowInstance.toObject(); - + const uid = new ShortUniqueId({ length: 5 }); /* remove edges that are not connected to selected nodes on both ends in future we can save this edges to when ungrouping reconect to the old nodes */ @@ -875,7 +868,7 @@ export function ungroupNode( let { field, id } = template[key].proxy!; let nodeIndex = gNodes.findIndex((n) => n.id === id); if (nodeIndex !== -1) { - let display_name: string; + let display_name: string | undefined; let show = gNodes[nodeIndex].data.node!.template[field].show; let advanced = gNodes[nodeIndex].data.node!.template[field].advanced; if (gNodes[nodeIndex].data.node!.template[field].display_name) { @@ -993,7 +986,7 @@ export function expandGroupNode( let nodeIndex = gNodes.findIndex((n) => n.id === id); if (nodeIndex !== -1) { let proxy: { id: string; field: string } | undefined; - let display_name: string; + let display_name: string | undefined; let show = gNodes[nodeIndex].data.node!.template[field].show; let advanced = gNodes[nodeIndex].data.node!.template[field].advanced; if (gNodes[nodeIndex].data.node!.template[field].display_name) { diff --git a/src/frontend/src/utils/styleUtils.ts b/src/frontend/src/utils/styleUtils.ts index 6c69dfd78..254f86cf8 100644 --- a/src/frontend/src/utils/styleUtils.ts +++ b/src/frontend/src/utils/styleUtils.ts @@ -98,6 +98,7 @@ import { Zap, } from "lucide-react"; import { FaApple, FaGithub } from "react-icons/fa"; +import { AWSIcon } from "../icons/AWS"; import { AirbyteIcon } from "../icons/Airbyte"; import { AnthropicIcon } from "../icons/Anthropic"; import { BingIcon } from "../icons/Bing"; @@ -210,6 +211,7 @@ export const nodeIconsLucide: iconsType = { ArrowUpToLine: ArrowUpToLine, Chroma: ChromaIcon, AirbyteJSONLoader: AirbyteIcon, + AmazonBedrockEmbeddings: AWSIcon, Anthropic: AnthropicIcon, ChatAnthropic: AnthropicIcon, BingSearchAPIWrapper: BingIcon, diff --git a/src/frontend/src/utils/utils.ts b/src/frontend/src/utils/utils.ts index 29cc4780a..654828178 100644 --- a/src/frontend/src/utils/utils.ts +++ b/src/frontend/src/utils/utils.ts @@ -1,14 +1,18 @@ import clsx, { ClassValue } from "clsx"; import { twMerge } from "tailwind-merge"; import { ADJECTIVES, DESCRIPTIONS, NOUNS } from "../flow_constants"; -import { APIDataType, TemplateVariableType } from "../types/api"; +import { + APIDataType, + APITemplateType, + TemplateVariableType, +} from "../types/api"; import { IVarHighlightType, groupedObjType, tweakType, } from "../types/components"; import { FlowType, NodeType } from "../types/flow"; -import { TabsState } from "../types/tabs"; +import { FlowsState } from "../types/tabs"; import { buildTweaks } from "./reactflowUtils"; export function classNames(...classes: Array): string { @@ -53,7 +57,8 @@ export function normalCaseToSnakeCase(str: string): string { .join("_"); } -export function toTitleCase(str: string): string { +export function toTitleCase(str: string | undefined): string { + if (!str) return ""; let result = str .split("_") .map((word, index) => { @@ -194,7 +199,7 @@ export function groupByFamily( })); } -export function buildInputs(tabsState: TabsState, id: string): string { +export function buildInputs(tabsState: FlowsState, id: string): string { return tabsState && tabsState[id] && tabsState[id].formKeysData && @@ -272,10 +277,10 @@ export function buildTweakObject(tweak: tweakType) { /** * Function to get Chat Input Field * @param {FlowType} flow - The current flow. - * @param {TabsState} tabsState - The current tabs state. + * @param {FlowsState} tabsState - The current tabs state. * @returns {string} - The chat input field */ -export function getChatInputField(flow: FlowType, tabsState?: TabsState) { +export function getChatInputField(flow: FlowType, tabsState?: FlowsState) { let chat_input_field = "text"; if ( @@ -300,7 +305,7 @@ export function getPythonApiCode( flow: FlowType, isAuth: boolean, tweak?: any[], - tabsState?: TabsState + tabsState?: FlowsState ): string { const flowId = flow.id; @@ -364,7 +369,7 @@ export function getCurlCode( flow: FlowType, isAuth: boolean, tweak?: any[], - tabsState?: TabsState + tabsState?: FlowsState ): string { const flowId = flow.id; const tweaks = buildTweaks(flow); @@ -392,7 +397,7 @@ export function getCurlCode( export function getPythonCode( flow: FlowType, tweak?: any[], - tabsState?: TabsState + tabsState?: FlowsState ): string { const flowName = flow.name; const tweaks = buildTweaks(flow); @@ -417,7 +422,7 @@ flow(inputs)`; export function getWidgetCode( flow: FlowType, isAuth: boolean, - tabsState?: TabsState + tabsState?: FlowsState ): string { const flowId = flow.id; const flowName = flow.name; @@ -620,3 +625,14 @@ export function getSetFromObject(obj: object, key?: string): Set { } return set; } + +export function getFieldTitle( + template: APITemplateType, + templateField: string +): string { + return template[templateField].display_name + ? template[templateField].display_name! + : template[templateField].name + ? toTitleCase(template[templateField].name!) + : toTitleCase(templateField); +} diff --git a/tests/conftest.py b/tests/conftest.py index 857e26f06..238e7cdab 100644 --- a/tests/conftest.py +++ b/tests/conftest.py @@ -1,26 +1,25 @@ -from contextlib import contextmanager import json -from contextlib import suppress -from pathlib import Path -from typing import AsyncGenerator, TYPE_CHECKING +# we need to import tmpdir +import tempfile +from contextlib import contextmanager, suppress +from pathlib import Path +from typing import TYPE_CHECKING, AsyncGenerator + +import orjson +import pytest +from fastapi.testclient import TestClient +from httpx import AsyncClient from langflow.graph.graph.base import Graph from langflow.services.auth.utils import get_password_hash from langflow.services.database.models.flow.flow import Flow, FlowCreate from langflow.services.database.models.user.user import User, UserCreate -import orjson from langflow.services.database.utils import session_getter from langflow.services.deps import get_db_service -import pytest -from fastapi.testclient import TestClient -from httpx import AsyncClient -from sqlmodel import SQLModel, Session, create_engine +from sqlmodel import Session, SQLModel, create_engine from sqlmodel.pool import StaticPool from typer.testing import CliRunner -# we need to import tmpdir -import tempfile - if TYPE_CHECKING: from langflow.services.database.service import DatabaseService @@ -264,7 +263,12 @@ def flow(client, json_flow: str, active_user): from langflow.services.database.models.flow.flow import FlowCreate loaded_json = json.loads(json_flow) - flow_data = FlowCreate(name="test_flow", data=loaded_json.get("data"), user_id=active_user.id) + flow_data = FlowCreate( + name="test_flow", + data=loaded_json.get("data"), + user_id=active_user.id, + description="description", + ) flow = Flow(**flow_data.dict()) with session_getter(get_db_service()) as session: session.add(flow) diff --git a/tests/test_agents_template.py b/tests/test_agents_template.py index e354d4a16..f2ce4e3e2 100644 --- a/tests/test_agents_template.py +++ b/tests/test_agents_template.py @@ -12,7 +12,7 @@ def test_zero_shot_agent(client: TestClient, logged_in_headers): "ZeroShotAgent", "BaseSingleActionAgent", "Agent", - "function", + "Callable", } template = zero_shot_agent["template"] @@ -202,7 +202,7 @@ def test_initialize_agent(client: TestClient, logged_in_headers): agents = json_response["agents"] initialize_agent = agents["AgentInitializer"] - assert initialize_agent["base_classes"] == ["AgentExecutor", "function"] + assert initialize_agent["base_classes"] == ["AgentExecutor", "Callable"] template = initialize_agent["template"] assert template["agent"] == { diff --git a/tests/test_chains_template.py b/tests/test_chains_template.py index 771fb91cc..6627fb26c 100644 --- a/tests/test_chains_template.py +++ b/tests/test_chains_template.py @@ -1,6 +1,5 @@ from fastapi.testclient import TestClient - # def test_chains_settings(client: TestClient, logged_in_headers): # response = client.get("api/v1/all", headers=logged_in_headers) # assert response.status_code == 200 @@ -9,167 +8,6 @@ from fastapi.testclient import TestClient # assert set(chains.keys()) == set(settings.chains) -# Test the ConversationChain object -def test_conversation_chain(client: TestClient, logged_in_headers): - response = client.get("api/v1/all", headers=logged_in_headers) - assert response.status_code == 200 - json_response = response.json() - chains = json_response["chains"] - - chain = chains["ConversationChain"] - # Test the base classes, template, memory, verbose, llm, input_key, output_key, and _type objects - assert set(chain["base_classes"]) == { - "ConversationChain", - "LLMChain", - "Chain", - "function", - } - - template = chain["template"] - assert template["memory"] == { - "required": False, - "dynamic": False, - "placeholder": "", - "show": True, - "multiline": False, - "password": False, - "name": "memory", - "type": "BaseMemory", - "list": False, - "advanced": False, - "info": "", - } - assert template["verbose"] == { - "required": False, - "dynamic": False, - "placeholder": "", - "show": False, - "multiline": False, - "password": False, - "name": "verbose", - "type": "bool", - "list": False, - "advanced": True, - "info": "", - } - assert template["llm"] == { - "required": True, - "dynamic": False, - "placeholder": "", - "show": True, - "multiline": False, - "password": False, - "name": "llm", - "type": "BaseLanguageModel", - "list": False, - "advanced": False, - "info": "", - } - assert template["input_key"] == { - "required": True, - "dynamic": False, - "placeholder": "", - "show": True, - "multiline": False, - "value": "input", - "password": False, - "name": "input_key", - "type": "str", - "list": False, - "advanced": True, - "info": "", - } - assert template["output_key"] == { - "required": True, - "dynamic": False, - "placeholder": "", - "show": True, - "multiline": False, - "value": "response", - "password": False, - "name": "output_key", - "type": "str", - "list": False, - "advanced": True, - "info": "", - } - assert template["_type"] == "ConversationChain" - - # Test the description object - assert chain["description"] == "Chain to have a conversation and load context from memory." - - -def test_llm_chain(client: TestClient, logged_in_headers): - response = client.get("api/v1/all", headers=logged_in_headers) - assert response.status_code == 200 - json_response = response.json() - chains = json_response["chains"] - chain = chains["LLMChain"] - - # Test the base classes, template, memory, verbose, llm, input_key, output_key, and _type objects - assert set(chain["base_classes"]) == { - "function", - "LLMChain", - "Chain", - } - - template = chain["template"] - assert template["memory"] == { - "required": False, - "dynamic": False, - "placeholder": "", - "show": True, - "multiline": False, - "password": False, - "name": "memory", - "type": "BaseMemory", - "list": False, - "advanced": False, - "info": "", - } - assert template["verbose"] == { - "required": False, - "dynamic": False, - "placeholder": "", - "show": False, - "multiline": False, - "value": False, - "password": False, - "name": "verbose", - "type": "bool", - "list": False, - "advanced": True, - "info": "", - } - assert template["llm"] == { - "required": True, - "dynamic": False, - "placeholder": "", - "show": True, - "multiline": False, - "password": False, - "name": "llm", - "type": "BaseLanguageModel", - "list": False, - "advanced": False, - "info": "", - } - assert template["output_key"] == { - "required": True, - "dynamic": False, - "placeholder": "", - "show": True, - "multiline": False, - "value": "text", - "password": False, - "name": "output_key", - "type": "str", - "list": False, - "advanced": True, - "info": "", - } - - def test_llm_checker_chain(client: TestClient, logged_in_headers): response = client.get("api/v1/all", headers=logged_in_headers) assert response.status_code == 200 @@ -179,7 +17,7 @@ def test_llm_checker_chain(client: TestClient, logged_in_headers): # Test the base classes, template, memory, verbose, llm, input_key, output_key, and _type objects assert set(chain["base_classes"]) == { - "function", + "Callable", "LLMCheckerChain", "Chain", } @@ -213,7 +51,7 @@ def test_llm_math_chain(client: TestClient, logged_in_headers): chain = chains["LLMMathChain"] # Test the base classes, template, memory, verbose, llm, input_key, output_key, and _type objects assert set(chain["base_classes"]) == { - "function", + "Callable", "LLMMathChain", "Chain", } @@ -303,7 +141,7 @@ def test_series_character_chain(client: TestClient, logged_in_headers): # Test the base classes, template, memory, verbose, llm, input_key, output_key, and _type objects assert set(chain["base_classes"]) == { - "function", + "Callable", "LLMChain", "BaseCustomChain", "Chain", diff --git a/tests/test_custom_component.py b/tests/test_custom_component.py index 9cc279d2a..c60247668 100644 --- a/tests/test_custom_component.py +++ b/tests/test_custom_component.py @@ -10,7 +10,6 @@ from langflow.interface.custom.base import CustomComponent from langflow.interface.custom.component import ( Component, ComponentCodeNullError, - ComponentFunctionEntrypointNameNullError, ) from langflow.interface.custom.code_parser import CodeParser, CodeSyntaxError @@ -73,16 +72,16 @@ def test_component_init(): """ Test the initialization of the Component class. """ - component = Component(code=code_default, function_entrypoint_name="build") + component = Component(code=code_default, _function_entrypoint_name="build") assert component.code == code_default - assert component.function_entrypoint_name == "build" + assert component._function_entrypoint_name == "build" def test_component_get_code_tree(): """ Test the get_code_tree method of the Component class. """ - component = Component(code=code_default, function_entrypoint_name="build") + component = Component(code=code_default, _function_entrypoint_name="build") tree = component.get_code_tree(component.code) assert "imports" in tree @@ -92,19 +91,20 @@ def test_component_code_null_error(): Test the get_function method raises the ComponentCodeNullError when the code is empty. """ - component = Component(code="", function_entrypoint_name="") + component = Component(code="", _function_entrypoint_name="") with pytest.raises(ComponentCodeNullError): component.get_function() -def test_component_function_entrypoint_name_null_error(): - """ - Test the get_function method raises the ComponentFunctionEntrypointNameNullError - when the function_entrypoint_name is empty. - """ - component = Component(code=code_default, function_entrypoint_name="") - with pytest.raises(ComponentFunctionEntrypointNameNullError): - component.get_function() +# TODO: Validate if we should remove this +# def test_component_function_entrypoint_name_null_error(): +# """ +# Test the get_function method raises the ComponentFunctionEntrypointNameNullError +# when the function_entrypoint_name is empty. +# """ +# component = Component(code=code_default, _function_entrypoint_name="") +# with pytest.raises(ComponentFunctionEntrypointNameNullError): +# component.get_function() def test_custom_component_init(): @@ -206,7 +206,7 @@ def test_component_get_function_valid(): Test the get_function method of the Component class with valid code and function_entrypoint_name. """ - component = Component(code="def build(): pass", function_entrypoint_name="build") + component = Component(code="def build(): pass", _function_entrypoint_name="build") my_function = component.get_function() assert callable(my_function) @@ -362,7 +362,7 @@ def test_component_get_code_tree_syntax_error(): Test the get_code_tree method of the Component class raises the CodeSyntaxError when given incorrect syntax. """ - component = Component(code="import os as", function_entrypoint_name="build") + component = Component(code="import os as", _function_entrypoint_name="build") with pytest.raises(CodeSyntaxError): component.get_code_tree(component.code) diff --git a/tests/test_database.py b/tests/test_database.py index a7a04e76c..abbe20c81 100644 --- a/tests/test_database.py +++ b/tests/test_database.py @@ -1,16 +1,14 @@ -from langflow.services.database.models.base import orjson_dumps -from langflow.services.database.utils import session_getter -from langflow.services.deps import get_db_service +from uuid import UUID, uuid4 + import orjson import pytest - -from uuid import UUID, uuid4 -from sqlmodel import Session - from fastapi.testclient import TestClient - from langflow.api.v1.schemas import FlowListCreate +from langflow.services.database.models.base import orjson_dumps from langflow.services.database.models.flow import Flow, FlowCreate, FlowUpdate +from langflow.services.database.utils import session_getter +from langflow.services.deps import get_db_service +from sqlmodel import Session @pytest.fixture(scope="module") @@ -36,7 +34,7 @@ def test_create_flow(client: TestClient, json_flow: str, active_user, logged_in_ assert response.json()["name"] == flow.name assert response.json()["data"] == flow.data # flow is optional so we can create a flow without a flow - flow = FlowCreate(name="Test Flow") + flow = FlowCreate(name="Test Flow", description="description") response = client.post("api/v1/flows/", json=flow.dict(exclude_unset=True), headers=logged_in_headers) assert response.status_code == 201 assert response.json()["name"] == flow.name diff --git a/tests/test_llms_template.py b/tests/test_llms_template.py index 0a30a825e..78131cb05 100644 --- a/tests/test_llms_template.py +++ b/tests/test_llms_template.py @@ -309,17 +309,14 @@ def test_chat_open_ai(client: TestClient, logged_in_headers): "placeholder": "", "show": True, "multiline": False, - "value": "gpt-3.5-turbo-0613", + "value": "gpt-4-1106-preview", "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-1106-preview", "gpt-4", "gpt-4-32k", + "gpt-3.5-turbo", + "gpt-3.5-turbo-16k", ], "name": "model_name", "type": "str", diff --git a/tests/test_prompts_template.py b/tests/test_prompts_template.py index d03ad5cbd..b9e55ce77 100644 --- a/tests/test_prompts_template.py +++ b/tests/test_prompts_template.py @@ -96,7 +96,7 @@ def test_prompt_template(client: TestClient, logged_in_headers): "placeholder": "", "show": False, "multiline": False, - "value": True, + "value": False, "password": False, "name": "validate_template", "type": "bool", diff --git a/tests/test_template.py b/tests/test_template.py index 5ee2e71da..e01d9e65b 100644 --- a/tests/test_template.py +++ b/tests/test_template.py @@ -67,7 +67,7 @@ def test_build_template_from_function(): # Test with add_function=True result_with_function = build_template_from_function("ExampleClass1", type_to_loader_dict, add_function=True) assert result_with_function is not None - assert "function" in result_with_function["base_classes"] + assert "Callable" in result_with_function["base_classes"] # Test with invalid name with pytest.raises(ValueError, match=r".* not found"): @@ -235,7 +235,7 @@ def test_format_dict(): "password": False, "multiline": False, "options": CHAT_OPENAI_MODELS, - "value": "gpt-3.5-turbo-0613", + "value": "gpt-4-1106-preview", }, } assert format_dict(input_dict, "OpenAI") == expected_output_openai diff --git a/tests/test_user.py b/tests/test_user.py index 3b4e71527..2933c5b18 100644 --- a/tests/test_user.py +++ b/tests/test_user.py @@ -202,9 +202,14 @@ def test_patch_user_wrong_id(client, active_user, logged_in_headers): assert response.json() == { "detail": [ { + "type": "uuid_parsing", "loc": ["path", "user_id"], - "msg": "value is not a valid uuid", - "type": "type_error.uuid", + "msg": "Input should be a valid UUID, invalid character: expected an optional prefix of `urn:uuid:` followed by [0-9a-fA-F-], found `w` at 1", # noqa + "input": "wrong_id", + "ctx": { + "error": "invalid character: expected an optional prefix of `urn:uuid:` followed by [0-9a-fA-F-], found `w` at 1" # noqa + }, + "url": "https://errors.pydantic.dev/2.4/v/uuid_parsing", } ] } @@ -224,9 +229,14 @@ def test_delete_user_wrong_id(client, test_user, super_user_headers): assert response.json() == { "detail": [ { + "type": "uuid_parsing", "loc": ["path", "user_id"], - "msg": "value is not a valid uuid", - "type": "type_error.uuid", + "msg": "Input should be a valid UUID, invalid character: expected an optional prefix of `urn:uuid:` followed by [0-9a-fA-F-], found `w` at 1", # noqa + "input": "wrong_id", + "ctx": { + "error": "invalid character: expected an optional prefix of `urn:uuid:` followed by [0-9a-fA-F-], found `w` at 1" # noqa + }, + "url": "https://errors.pydantic.dev/2.4/v/uuid_parsing", } ] }