From b0e8cbe0b3f5f3a5b0cfd2a280d1f368a75b48a5 Mon Sep 17 00:00:00 2001 From: Eugene Yurtsev Date: Fri, 10 Nov 2023 13:44:43 -0500 Subject: [PATCH 01/14] Add RunnableSequence documentation (#13094) Add RunnableSequence documentation --- .../langchain/schema/runnable/base.py | 85 ++++++++++++++++++- 1 file changed, 83 insertions(+), 2 deletions(-) diff --git a/libs/langchain/langchain/schema/runnable/base.py b/libs/langchain/langchain/schema/runnable/base.py index c9919adc530..4308a202534 100644 --- a/libs/langchain/langchain/schema/runnable/base.py +++ b/libs/langchain/langchain/schema/runnable/base.py @@ -1217,16 +1217,97 @@ class RunnableSerializable(Serializable, Runnable[Input, Output]): class RunnableSequence(RunnableSerializable[Input, Output]): - """ - A sequence of runnables, where the output of each is the input of the next. + """A sequence of runnables, where the output of each is the input of the next. + + RunnableSequence is the most important composition operator in LangChain as it is + used in virtually every chain. + + A RunnableSequence can be instantiated directly or more commonly by using the `|` + operator where either the left or right operands (or both) must be a Runnable. + + Any RunnableSequence automatically supports sync, async, batch. + + The default implementations of `batch` and `abatch` utilize threadpools and + asyncio gather and will be faster than naive invocation of invoke or ainvoke + for IO bound runnables. + + Batching is implemented by invoking the batch method on each component of the + RunnableSequence in order. + + A RunnableSequence preserves the streaming properties of its components, so if all + components of the sequence implement a `transform` method -- which + is the method that implements the logic to map a streaming input to a streaming + output -- then the sequence will be able to stream input to output! + + If any component of the sequence does not implement transform then the + streaming will only begin after this component is run. If there are + multiple blocking components, streaming begins after the last one. + + Please note: RunnableLambdas do not support `transform` by default! So if + you need to use a RunnableLambdas be careful about where you place them in a + RunnableSequence (if you need to use the .stream()/.astream() methods). + + If you need arbitrary logic and need streaming, you can subclass + Runnable, and implement `transform` for whatever logic you need. + + Here is a simple example that uses simple functions to illustrate the use of + RunnableSequence: + + .. code-block:: python + + from langchain.schema.runnable import RunnableLambda + + def add_one(x: int) -> int: + return x + 1 + + def mul_two(x: int) -> int: + return x * 2 + + runnable_1 = RunnableLambda(add_one) + runnable_2 = RunnableLambda(mul_two) + sequence = runnable_1 | runnable_2 + # Or equivalently: + # sequence = RunnableSequence(first=runnable_1, last=runnable_2) + sequence.invoke(1) + await runnable.ainvoke(1) + + sequence.batch([1, 2, 3]) + await sequence.abatch([1, 2, 3]) + + Here's an example that uses streams JSON output generated by an LLM: + + .. code-block:: python + + from langchain.output_parsers.json import SimpleJsonOutputParser + from langchain.chat_models.openai import ChatOpenAI + + prompt = PromptTemplate.from_template( + 'In JSON format, give me a list of {topic} and their ' + 'corresponding names in French, Spanish and in a ' + 'Cat Language.' + ) + + model = ChatOpenAI() + chain = prompt | model | SimpleJsonOutputParser() + + async for chunk in chain.astream({'topic': 'colors'}): + print('-') + print(chunk, sep='', flush=True) """ + # The steps are broken into first, middle and last, solely for type checking + # purposes. It allows specifying the `Input` on the first type, the `Output` of + # the last type. first: Runnable[Input, Any] + """The first runnable in the sequence.""" middle: List[Runnable[Any, Any]] = Field(default_factory=list) + """The middle runnables in the sequence.""" last: Runnable[Any, Output] + """The last runnable in the sequence.""" @property def steps(self) -> List[Runnable[Any, Any]]: + """All the runnables that make up the sequence in order.""" return [self.first] + self.middle + [self.last] @classmethod From 52f34de9b7914b4836fece4bdf2ef9a0a1f7e696 Mon Sep 17 00:00:00 2001 From: Anush Date: Sat, 11 Nov 2023 00:21:52 +0530 Subject: [PATCH 02/14] feat: FastEmbed embedding provider (#13109) ## Description: This PR intends to add [Qdrant/FastEmbed](https://qdrant.github.io/fastembed/) as a local embeddings provider, associated tests and documentation. **Documentation preview:** https://langchain-git-fork-anush008-master-langchain.vercel.app/docs/integrations/text_embedding/fastembed --------- Co-authored-by: Eugene Yurtsev --- .../text_embedding/fastembed.ipynb | 154 ++++++++++++++++++ .../langchain/embeddings/__init__.py | 2 + .../langchain/embeddings/fastembed.py | 108 ++++++++++++ .../embeddings/test_fastembed.py | 76 +++++++++ .../unit_tests/embeddings/test_imports.py | 1 + 5 files changed, 341 insertions(+) create mode 100644 docs/docs/integrations/text_embedding/fastembed.ipynb create mode 100644 libs/langchain/langchain/embeddings/fastembed.py create mode 100644 libs/langchain/tests/integration_tests/embeddings/test_fastembed.py diff --git a/docs/docs/integrations/text_embedding/fastembed.ipynb b/docs/docs/integrations/text_embedding/fastembed.ipynb new file mode 100644 index 00000000000..9d6826f92d2 --- /dev/null +++ b/docs/docs/integrations/text_embedding/fastembed.ipynb @@ -0,0 +1,154 @@ +{ + "cells": [ + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "# Qdrant FastEmbed\n", + "\n", + "[FastEmbed](https://qdrant.github.io/fastembed/) is a lightweight, fast, Python library built for embedding generation. \n", + "\n", + "- Quantized model weights\n", + "- ONNX Runtime, no PyTorch dependency\n", + "- CPU-first design\n", + "- Data-parallelism for encoding of large datasets." + ] + }, + { + "attachments": {}, + "cell_type": "markdown", + "id": "2a773d8d", + "metadata": {}, + "source": [ + "## Dependencies\n", + "\n", + "To use FastEmbed with LangChain, install the `fastembed` Python package." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "91ea14ce-831d-409a-a88f-30353acdabd1", + "metadata": { + "tags": [] + }, + "outputs": [], + "source": [ + "%pip install fastembed" + ] + }, + { + "attachments": {}, + "cell_type": "markdown", + "id": "426f1156", + "metadata": {}, + "source": [ + "## Imports" + ] + }, + { + "cell_type": "code", + "execution_count": 2, + "id": "3f5dc9d7-65e3-4b5b-9086-3327d016cfe0", + "metadata": { + "tags": [] + }, + "outputs": [], + "source": [ + "from langchain.embeddings.fastembed import FastEmbedEmbeddings" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Instantiating FastEmbed\n", + " \n", + "### Parameters\n", + "- `model_name: str` (default: \"BAAI/bge-small-en-v1.5\")\n", + " > Name of the FastEmbedding model to use. You can find the list of supported models [here](https://qdrant.github.io/fastembed/examples/Supported_Models/).\n", + "\n", + "- `max_length: int` (default: 512)\n", + " > The maximum number of tokens. Unknown behavior for values > 512.\n", + "\n", + "- `cache_dir: Optional[str]`\n", + " > The path to the cache directory. Defaults to `local_cache` in the parent directory.\n", + "\n", + "- `threads: Optional[int]`\n", + " > The number of threads a single onnxruntime session can use. Defaults to None.\n", + "\n", + "- `doc_embed_type: Literal[\"default\", \"passage\"]` (default: \"default\")\n", + " > \"default\": Uses FastEmbed's default embedding method.\n", + " \n", + " > \"passage\": Prefixes the text with \"passage\" before embedding." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "6fb585dd", + "metadata": { + "tags": [] + }, + "outputs": [], + "source": [ + "embeddings = FastEmbedEmbeddings()" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Usage\n", + "\n", + "### Generating document embeddings" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "document_embeddings = embeddings.embed_documents([\"This is a document\", \"This is some other document\"])" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### Generating query embeddings" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "query_embeddings = embeddings.embed_query(\"This is a query\")" + ] + } + ], + "metadata": { + "kernelspec": { + "display_name": "Python 3 (ipykernel)", + "language": "python", + "name": "python3" + }, + "language_info": { + "codemirror_mode": { + "name": "ipython", + "version": 3 + }, + "file_extension": ".py", + "mimetype": "text/x-python", + "name": "python", + "nbconvert_exporter": "python", + "pygments_lexer": "ipython3", + "version": "3.11.6" + } + }, + "nbformat": 4, + "nbformat_minor": 5 +} diff --git a/libs/langchain/langchain/embeddings/__init__.py b/libs/langchain/langchain/embeddings/__init__.py index dfbb814fbe2..8ead8ee1c03 100644 --- a/libs/langchain/langchain/embeddings/__init__.py +++ b/libs/langchain/langchain/embeddings/__init__.py @@ -32,6 +32,7 @@ from langchain.embeddings.elasticsearch import ElasticsearchEmbeddings from langchain.embeddings.embaas import EmbaasEmbeddings from langchain.embeddings.ernie import ErnieEmbeddings from langchain.embeddings.fake import DeterministicFakeEmbedding, FakeEmbeddings +from langchain.embeddings.fastembed import FastEmbedEmbeddings from langchain.embeddings.google_palm import GooglePalmEmbeddings from langchain.embeddings.gpt4all import GPT4AllEmbeddings from langchain.embeddings.gradient_ai import GradientEmbeddings @@ -77,6 +78,7 @@ __all__ = [ "ClarifaiEmbeddings", "CohereEmbeddings", "ElasticsearchEmbeddings", + "FastEmbedEmbeddings", "HuggingFaceEmbeddings", "HuggingFaceInferenceAPIEmbeddings", "GradientEmbeddings", diff --git a/libs/langchain/langchain/embeddings/fastembed.py b/libs/langchain/langchain/embeddings/fastembed.py new file mode 100644 index 00000000000..cbc2c9ff16b --- /dev/null +++ b/libs/langchain/langchain/embeddings/fastembed.py @@ -0,0 +1,108 @@ +from typing import Any, Dict, List, Literal, Optional + +import numpy as np + +from langchain.pydantic_v1 import BaseModel, Extra, root_validator +from langchain.schema.embeddings import Embeddings + + +class FastEmbedEmbeddings(BaseModel, Embeddings): + """Qdrant FastEmbedding models. + FastEmbed is a lightweight, fast, Python library built for embedding generation. + See more documentation at: + * https://github.com/qdrant/fastembed/ + * https://qdrant.github.io/fastembed/ + + To use this class, you must install the `fastembed` Python package. + + `pip install fastembed` + Example: + from langchain.embeddings import FastEmbedEmbeddings + fastembed = FastEmbedEmbeddings() + """ + + model_name: str = "BAAI/bge-small-en-v1.5" + """Name of the FastEmbedding model to use + Defaults to "BAAI/bge-small-en-v1.5" + Find the list of supported models at + https://qdrant.github.io/fastembed/examples/Supported_Models/ + """ + + max_length: int = 512 + """The maximum number of tokens. Defaults to 512. + Unknown behavior for values > 512. + """ + + cache_dir: Optional[str] + """The path to the cache directory. + Defaults to `local_cache` in the parent directory + """ + + threads: Optional[int] + """The number of threads single onnxruntime session can use. + Defaults to None + """ + + doc_embed_type: Literal["default", "passage"] = "default" + """Type of embedding to use for documents + "default": Uses FastEmbed's default embedding method + "passage": Prefixes the text with "passage" before embedding. + """ + + _model: Any # : :meta private: + + class Config: + """Configuration for this pydantic object.""" + + extra = Extra.forbid + + @root_validator() + def validate_environment(cls, values: Dict) -> Dict: + """Validate that FastEmbed has been installed.""" + try: + from fastembed.embedding import FlagEmbedding + + model_name = values.get("model_name") + max_length = values.get("max_length") + cache_dir = values.get("cache_dir") + threads = values.get("threads") + values["_model"] = FlagEmbedding( + model_name=model_name, + max_length=max_length, + cache_dir=cache_dir, + threads=threads, + ) + except ImportError as ie: + raise ImportError( + "Could not import 'fastembed' Python package. " + "Please install it with `pip install fastembed`." + ) from ie + return values + + def embed_documents(self, texts: List[str]) -> List[List[float]]: + """Generate embeddings for documents using FastEmbed. + + Args: + texts: The list of texts to embed. + + Returns: + List of embeddings, one for each text. + """ + embeddings: List[np.ndarray] + if self.doc_embed_type == "passage": + embeddings = self._model.passage_embed(texts) + else: + embeddings = self._model.embed(texts) + return [e.tolist() for e in embeddings] + + def embed_query(self, text: str) -> List[float]: + """Generate query embeddings using FastEmbed. + + Args: + text: The text to embed. + + Returns: + Embeddings for the text. + """ + query_embeddings: np.ndarray = next(self._model.query_embed(text)) + return query_embeddings.tolist() diff --git a/libs/langchain/tests/integration_tests/embeddings/test_fastembed.py b/libs/langchain/tests/integration_tests/embeddings/test_fastembed.py new file mode 100644 index 00000000000..84e4ea67fe8 --- /dev/null +++ b/libs/langchain/tests/integration_tests/embeddings/test_fastembed.py @@ -0,0 +1,76 @@ +"""Test FastEmbed embeddings.""" +import pytest + +from langchain.embeddings.fastembed import FastEmbedEmbeddings + + +@pytest.mark.parametrize( + "model_name", ["sentence-transformers/all-MiniLM-L6-v2", "BAAI/bge-small-en-v1.5"] +) +@pytest.mark.parametrize("max_length", [50, 512]) +@pytest.mark.parametrize("doc_embed_type", ["default", "passage"]) +@pytest.mark.parametrize("threads", [0, 10]) +def test_fastembed_embedding_documents( + model_name: str, max_length: int, doc_embed_type: str, threads: int +) -> None: + """Test fastembed embeddings for documents.""" + documents = ["foo bar", "bar foo"] + embedding = FastEmbedEmbeddings( + model_name=model_name, + max_length=max_length, + doc_embed_type=doc_embed_type, + threads=threads, + ) + output = embedding.embed_documents(documents) + assert len(output) == 2 + assert len(output[0]) == 384 + + +@pytest.mark.parametrize( + "model_name", ["sentence-transformers/all-MiniLM-L6-v2", "BAAI/bge-small-en-v1.5"] +) +@pytest.mark.parametrize("max_length", [50, 512]) +def test_fastembed_embedding_query(model_name: str, max_length: int) -> None: + """Test fastembed embeddings for query.""" + document = "foo bar" + embedding = FastEmbedEmbeddings(model_name=model_name, max_length=max_length) + output = embedding.embed_query(document) + assert len(output) == 384 + + +@pytest.mark.asyncio +@pytest.mark.parametrize( + "model_name", ["sentence-transformers/all-MiniLM-L6-v2", "BAAI/bge-small-en-v1.5"] +) +@pytest.mark.parametrize("max_length", [50, 512]) +@pytest.mark.parametrize("doc_embed_type", ["default", "passage"]) +@pytest.mark.parametrize("threads", [0, 10]) +async def test_fastembed_async_embedding_documents( + model_name: str, max_length: int, doc_embed_type: str, threads: int +) -> None: + """Test fastembed embeddings for documents.""" + documents = ["foo bar", "bar foo"] + embedding = FastEmbedEmbeddings( + model_name=model_name, + max_length=max_length, + doc_embed_type=doc_embed_type, + threads=threads, + ) + output = await embedding.aembed_documents(documents) + assert len(output) == 2 + assert len(output[0]) == 384 + + +@pytest.mark.asyncio +@pytest.mark.parametrize( + "model_name", ["sentence-transformers/all-MiniLM-L6-v2", "BAAI/bge-small-en-v1.5"] +) +@pytest.mark.parametrize("max_length", [50, 512]) +async def test_fastembed_async_embedding_query( + model_name: str, max_length: int +) -> None: + """Test fastembed embeddings for query.""" + document = "foo bar" + embedding = FastEmbedEmbeddings(model_name=model_name, max_length=max_length) + output = await embedding.aembed_query(document) + assert len(output) == 384 diff --git a/libs/langchain/tests/unit_tests/embeddings/test_imports.py b/libs/langchain/tests/unit_tests/embeddings/test_imports.py index 6fe7a85cff6..a8884d23b1c 100644 --- a/libs/langchain/tests/unit_tests/embeddings/test_imports.py +++ b/libs/langchain/tests/unit_tests/embeddings/test_imports.py @@ -7,6 +7,7 @@ EXPECTED_ALL = [ "ClarifaiEmbeddings", "CohereEmbeddings", "ElasticsearchEmbeddings", + "FastEmbedEmbeddings", "HuggingFaceEmbeddings", "HuggingFaceInferenceAPIEmbeddings", "GradientEmbeddings", From d266b3ea4a5dc85fe895b93090d89aa311f8c48e Mon Sep 17 00:00:00 2001 From: fyasla <53271240+fyasla@users.noreply.github.com> Date: Fri, 10 Nov 2023 20:05:19 +0100 Subject: [PATCH 03/14] issue #12165 mask API key in chat_models/azureml_endpoint module (#12836) - **Description:** `AzureMLChatOnlineEndpoint` object from langchain/chat_models/azureml_endpoint.py safe to print without having any secrets included in raw format in the string representation. - **Issue:** #12165, - **Tag maintainer:** @eyurtsev --------- Co-authored-by: Faysal Bougamale Co-authored-by: Bagatur --- .../langchain/chat_models/azureml_endpoint.py | 14 ++-- .../chat_models/test_azureml_endpoint.py | 65 +++++++++++++++++++ 2 files changed, 73 insertions(+), 6 deletions(-) create mode 100644 libs/langchain/tests/unit_tests/chat_models/test_azureml_endpoint.py diff --git a/libs/langchain/langchain/chat_models/azureml_endpoint.py b/libs/langchain/langchain/chat_models/azureml_endpoint.py index 53bdc849252..8efa957ad0f 100644 --- a/libs/langchain/langchain/chat_models/azureml_endpoint.py +++ b/libs/langchain/langchain/chat_models/azureml_endpoint.py @@ -4,7 +4,7 @@ from typing import Any, Dict, List, Optional, cast from langchain.callbacks.manager import CallbackManagerForLLMRun from langchain.chat_models.base import SimpleChatModel from langchain.llms.azureml_endpoint import AzureMLEndpointClient, ContentFormatterBase -from langchain.pydantic_v1 import validator +from langchain.pydantic_v1 import SecretStr, validator from langchain.schema.messages import ( AIMessage, BaseMessage, @@ -12,7 +12,7 @@ from langchain.schema.messages import ( HumanMessage, SystemMessage, ) -from langchain.utils import get_from_dict_or_env +from langchain.utils import convert_to_secret_str, get_from_dict_or_env class LlamaContentFormatter(ContentFormatterBase): @@ -94,7 +94,7 @@ class AzureMLChatOnlineEndpoint(SimpleChatModel): """URL of pre-existing Endpoint. Should be passed to constructor or specified as env var `AZUREML_ENDPOINT_URL`.""" - endpoint_api_key: str = "" + endpoint_api_key: SecretStr = convert_to_secret_str("") """Authentication Key for Endpoint. Should be passed to constructor or specified as env var `AZUREML_ENDPOINT_API_KEY`.""" @@ -112,13 +112,15 @@ class AzureMLChatOnlineEndpoint(SimpleChatModel): @classmethod def validate_client(cls, field_value: Any, values: Dict) -> AzureMLEndpointClient: """Validate that api key and python package exist in environment.""" - endpoint_key = get_from_dict_or_env( - values, "endpoint_api_key", "AZUREML_ENDPOINT_API_KEY" + values["endpoint_api_key"] = convert_to_secret_str( + get_from_dict_or_env(values, "endpoint_api_key", "AZUREML_ENDPOINT_API_KEY") ) endpoint_url = get_from_dict_or_env( values, "endpoint_url", "AZUREML_ENDPOINT_URL" ) - http_client = AzureMLEndpointClient(endpoint_url, endpoint_key) + http_client = AzureMLEndpointClient( + endpoint_url, values["endpoint_api_key"].get_secret_value() + ) return http_client @property diff --git a/libs/langchain/tests/unit_tests/chat_models/test_azureml_endpoint.py b/libs/langchain/tests/unit_tests/chat_models/test_azureml_endpoint.py new file mode 100644 index 00000000000..de1055fc3d5 --- /dev/null +++ b/libs/langchain/tests/unit_tests/chat_models/test_azureml_endpoint.py @@ -0,0 +1,65 @@ +"""Test AzureML chat endpoint.""" + +import os + +import pytest +from pytest import CaptureFixture, FixtureRequest + +from langchain.chat_models.azureml_endpoint import AzureMLChatOnlineEndpoint +from langchain.pydantic_v1 import SecretStr + + +@pytest.fixture(scope="class") +def api_passed_via_environment_fixture() -> AzureMLChatOnlineEndpoint: + """Fixture to create an AzureMLChatOnlineEndpoint instance + with API key passed from environment""" + os.environ["AZUREML_ENDPOINT_API_KEY"] = "my-api-key" + azure_chat = AzureMLChatOnlineEndpoint( + endpoint_url="https://..inference.ml.azure.com/score" + ) + del os.environ["AZUREML_ENDPOINT_API_KEY"] + return azure_chat + + +@pytest.fixture(scope="class") +def api_passed_via_constructor_fixture() -> AzureMLChatOnlineEndpoint: + """Fixture to create an AzureMLChatOnlineEndpoint instance + with API key passed from constructor""" + azure_chat = AzureMLChatOnlineEndpoint( + endpoint_url="https://..inference.ml.azure.com/score", + endpoint_api_key="my-api-key", + ) + return azure_chat + + +@pytest.mark.parametrize( + "fixture_name", + ["api_passed_via_constructor_fixture", "api_passed_via_environment_fixture"], +) +class TestAzureMLChatOnlineEndpoint: + def test_api_key_is_secret_string( + self, fixture_name: str, request: FixtureRequest + ) -> None: + """Test that the API key is a SecretStr instance""" + azure_chat = request.getfixturevalue(fixture_name) + assert isinstance(azure_chat.endpoint_api_key, SecretStr) + + def test_api_key_masked( + self, fixture_name: str, request: FixtureRequest, capsys: CaptureFixture + ) -> None: + """Test that the API key is masked""" + azure_chat = request.getfixturevalue(fixture_name) + print(azure_chat.endpoint_api_key, end="") + captured = capsys.readouterr() + assert ( + (str(azure_chat.endpoint_api_key) == "**********") + and (repr(azure_chat.endpoint_api_key) == "SecretStr('**********')") + and (captured.out == "**********") + ) + + def test_api_key_is_readable( + self, fixture_name: str, request: FixtureRequest + ) -> None: + """Test that the real secret value of the API key can be read""" + azure_chat = request.getfixturevalue(fixture_name) + assert azure_chat.endpoint_api_key.get_secret_value() == "my-api-key" From bf8cf7e0424412c7b53a0b7d564b635bb9b63034 Mon Sep 17 00:00:00 2001 From: Bagatur <22008038+baskaryan@users.noreply.github.com> Date: Fri, 10 Nov 2023 11:05:43 -0800 Subject: [PATCH 04/14] Bagatur/langserve blurb (#13217) --- docs/docs/expression_language/index.mdx | 3 +++ 1 file changed, 3 insertions(+) diff --git a/docs/docs/expression_language/index.mdx b/docs/docs/expression_language/index.mdx index 902cbe00a2a..c93884b6b7c 100644 --- a/docs/docs/expression_language/index.mdx +++ b/docs/docs/expression_language/index.mdx @@ -28,3 +28,6 @@ Input and output schemas give every LCEL chain Pydantic and JSONSchema schemas i **Seamless LangSmith tracing integration** As your chains get more and more complex, it becomes increasingly important to understand what exactly is happening at every step. With LCEL, **all** steps are automatically logged to [LangSmith](/docs/langsmith/) for maximum observability and debuggability. + +**Seamless LangServe deployment integration** +Any chain created with LCEL can be easily deployed using LangServe. \ No newline at end of file From 0dc4ab0be144b4c6c467f1e76d5d0636c1a505dc Mon Sep 17 00:00:00 2001 From: Tomaz Bratanic Date: Fri, 10 Nov 2023 20:53:34 +0100 Subject: [PATCH 05/14] Neo4j chat message history (#13008) --- .../memory/neo4j_chat_message_history.ipynb | 76 ++++++++++++ .../memory/chat_message_histories/__init__.py | 2 + .../memory/chat_message_histories/neo4j.py | 112 ++++++++++++++++++ .../integration_tests/memory/test_neo4j.py | 30 +++++ 4 files changed, 220 insertions(+) create mode 100644 docs/docs/integrations/memory/neo4j_chat_message_history.ipynb create mode 100644 libs/langchain/langchain/memory/chat_message_histories/neo4j.py create mode 100644 libs/langchain/tests/integration_tests/memory/test_neo4j.py diff --git a/docs/docs/integrations/memory/neo4j_chat_message_history.ipynb b/docs/docs/integrations/memory/neo4j_chat_message_history.ipynb new file mode 100644 index 00000000000..238beb09982 --- /dev/null +++ b/docs/docs/integrations/memory/neo4j_chat_message_history.ipynb @@ -0,0 +1,76 @@ +{ + "cells": [ + { + "cell_type": "markdown", + "id": "91c6a7ef", + "metadata": {}, + "source": [ + "# Neo4j\n", + "\n", + "[Neo4j](https://en.wikipedia.org/wiki/Neo4j) is an open-source graph database management system, renowned for its efficient management of highly connected data. Unlike traditional databases that store data in tables, Neo4j uses a graph structure with nodes, edges, and properties to represent and store data. This design allows for high-performance queries on complex data relationships.\n", + "\n", + "This notebook goes over how to use `Neo4j` to store chat message history." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "d15e3302", + "metadata": {}, + "outputs": [], + "source": [ + "from langchain.memory import Neo4jChatMessageHistory\n", + "\n", + "history = Neo4jChatMessageHistory(\n", + " url=\"bolt://localhost:7687\",\n", + " username=\"neo4j\",\n", + " password=\"password\",\n", + " session_id=\"session_id_1\"\n", + ")\n", + "\n", + "history.add_user_message(\"hi!\")\n", + "\n", + "history.add_ai_message(\"whats up?\")" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "64fc465e", + "metadata": {}, + "outputs": [], + "source": [ + "history.messages" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "8af285f8", + "metadata": {}, + "outputs": [], + "source": [] + } + ], + "metadata": { + "kernelspec": { + "display_name": "Python 3 (ipykernel)", + "language": "python", + "name": "python3" + }, + "language_info": { + "codemirror_mode": { + "name": "ipython", + "version": 3 + }, + "file_extension": ".py", + "mimetype": "text/x-python", + "name": "python", + "nbconvert_exporter": "python", + "pygments_lexer": "ipython3", + "version": "3.8.8" + } + }, + "nbformat": 4, + "nbformat_minor": 5 +} diff --git a/libs/langchain/langchain/memory/chat_message_histories/__init__.py b/libs/langchain/langchain/memory/chat_message_histories/__init__.py index c0b7c544a9b..a1497e8a122 100644 --- a/libs/langchain/langchain/memory/chat_message_histories/__init__.py +++ b/libs/langchain/langchain/memory/chat_message_histories/__init__.py @@ -13,6 +13,7 @@ from langchain.memory.chat_message_histories.firestore import ( from langchain.memory.chat_message_histories.in_memory import ChatMessageHistory from langchain.memory.chat_message_histories.momento import MomentoChatMessageHistory from langchain.memory.chat_message_histories.mongodb import MongoDBChatMessageHistory +from langchain.memory.chat_message_histories.neo4j import Neo4jChatMessageHistory from langchain.memory.chat_message_histories.postgres import PostgresChatMessageHistory from langchain.memory.chat_message_histories.redis import RedisChatMessageHistory from langchain.memory.chat_message_histories.rocksetdb import RocksetChatMessageHistory @@ -48,4 +49,5 @@ __all__ = [ "XataChatMessageHistory", "ZepChatMessageHistory", "UpstashRedisChatMessageHistory", + "Neo4jChatMessageHistory", ] diff --git a/libs/langchain/langchain/memory/chat_message_histories/neo4j.py b/libs/langchain/langchain/memory/chat_message_histories/neo4j.py new file mode 100644 index 00000000000..dfbf75cc304 --- /dev/null +++ b/libs/langchain/langchain/memory/chat_message_histories/neo4j.py @@ -0,0 +1,112 @@ +from typing import List, Optional, Union + +from langchain.schema import BaseChatMessageHistory +from langchain.schema.messages import BaseMessage, messages_from_dict +from langchain.utils import get_from_env + + +class Neo4jChatMessageHistory(BaseChatMessageHistory): + """Chat message history stored in a Neo4j database.""" + + def __init__( + self, + session_id: Union[str, int], + url: Optional[str] = None, + username: Optional[str] = None, + password: Optional[str] = None, + database: str = "neo4j", + node_label: str = "Session", + window: int = 3, + ): + try: + import neo4j + except ImportError: + raise ValueError( + "Could not import neo4j python package. " + "Please install it with `pip install neo4j`." + ) + + # Make sure session id is not null + if not session_id: + raise ValueError("Please ensure that the session_id parameter is provided") + + url = get_from_env("url", "NEO4J_URI", url) + username = get_from_env("username", "NEO4J_USERNAME", username) + password = get_from_env("password", "NEO4J_PASSWORD", password) + database = get_from_env("database", "NEO4J_DATABASE", database) + + self._driver = neo4j.GraphDatabase.driver(url, auth=(username, password)) + self._database = database + self._session_id = session_id + self._node_label = node_label + self._window = window + + # Verify connection + try: + self._driver.verify_connectivity() + except neo4j.exceptions.ServiceUnavailable: + raise ValueError( + "Could not connect to Neo4j database. " + "Please ensure that the url is correct" + ) + except neo4j.exceptions.AuthError: + raise ValueError( + "Could not connect to Neo4j database. " + "Please ensure that the username and password are correct" + ) + # Create session node + self._driver.execute_query( + f"MERGE (s:`{self._node_label}` {{id:$session_id}})", + {"session_id": self._session_id}, + ).summary + + @property + def messages(self) -> List[BaseMessage]: # type: ignore + """Retrieve the messages from Neo4j""" + query = ( + f"MATCH (s:`{self._node_label}`)-[:LAST_MESSAGE]->(last_message) " + "WHERE s.id = $session_id MATCH p=(last_message)<-[:NEXT*0.." + f"{self._window*2}]-() WITH p, length(p) AS length " + "ORDER BY length DESC LIMIT 1 UNWIND reverse(nodes(p)) AS node " + "RETURN {data:{content: node.content}, type:node.type} AS result" + ) + records, _, _ = self._driver.execute_query( + query, {"session_id": self._session_id} + ) + + messages = messages_from_dict([el["result"] for el in records]) + return messages + + def add_message(self, message: BaseMessage) -> None: + """Append the message to the record in Neo4j""" + query = ( + f"MATCH (s:`{self._node_label}`) WHERE s.id = $session_id " + "OPTIONAL MATCH (s)-[lm:LAST_MESSAGE]->(last_message) " + "CREATE (s)-[:LAST_MESSAGE]->(new:Message) " + "SET new += {type:$type, content:$content} " + "WITH new, lm, last_message WHERE last_message IS NOT NULL " + "CREATE (last_message)-[:NEXT]->(new) " + "DELETE lm" + ) + self._driver.execute_query( + query, + { + "type": message.type, + "content": message.content, + "session_id": self._session_id, + }, + ).summary + + def clear(self) -> None: + """Clear session memory from Neo4j""" + query = ( + f"MATCH (s:`{self._node_label}`)-[:LAST_MESSAGE]->(last_message) " + "WHERE s.id = $session_id MATCH p=(last_message)<-[:NEXT]-() " + "WITH p, length(p) AS length ORDER BY length DESC LIMIT 1 " + "UNWIND nodes(p) as node DETACH DELETE node;" + ) + self._driver.execute_query(query, {"session_id": self._session_id}).summary + + def __del__(self) -> None: + if self._driver: + self._driver.close() diff --git a/libs/langchain/tests/integration_tests/memory/test_neo4j.py b/libs/langchain/tests/integration_tests/memory/test_neo4j.py new file mode 100644 index 00000000000..d14e2c81f25 --- /dev/null +++ b/libs/langchain/tests/integration_tests/memory/test_neo4j.py @@ -0,0 +1,30 @@ +import json + +from langchain.memory import ConversationBufferMemory +from langchain.memory.chat_message_histories import Neo4jChatMessageHistory +from langchain.schema.messages import _message_to_dict + + +def test_memory_with_message_store() -> None: + """Test the memory with a message store.""" + # setup MongoDB as a message store + message_history = Neo4jChatMessageHistory(session_id="test-session") + memory = ConversationBufferMemory( + memory_key="baz", chat_memory=message_history, return_messages=True + ) + + # add some messages + memory.chat_memory.add_ai_message("This is me, the AI") + memory.chat_memory.add_user_message("This is me, the human") + + # get the message history from the memory store and turn it into a json + messages = memory.chat_memory.messages + messages_json = json.dumps([_message_to_dict(msg) for msg in messages]) + + assert "This is me, the AI" in messages_json + assert "This is me, the human" in messages_json + + # remove the record from Azure Cosmos DB, so the next test run won't pick it up + memory.chat_memory.clear() + + assert memory.chat_memory.messages == [] From 93ae589f1bd11f992eff5018660b667b2e15e585 Mon Sep 17 00:00:00 2001 From: Erick Friis Date: Fri, 10 Nov 2023 11:56:44 -0800 Subject: [PATCH 06/14] Add mongo parent template to index (#13222) --- templates/docs/INDEX.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/templates/docs/INDEX.md b/templates/docs/INDEX.md index f9d24400a1d..ab2a1519aa2 100644 --- a/templates/docs/INDEX.md +++ b/templates/docs/INDEX.md @@ -19,7 +19,7 @@ These templates cover advanced retrieval techniques, which can be used for chat - [Reranking](../rag-pinecone-rerank): This retrieval technique uses Cohere's reranking endpoint to rerank documents from an initial retrieval step. - [Anthropic Iterative Search](../anthropic-iterative-search): This retrieval technique uses iterative prompting to determine what to retrieve and whether the retriever documents are good enough. -- [Neo4j Parent Document Retrieval](../neo4j-parent): This retrieval technique stores embeddings for smaller chunks, but then returns larger chunks to pass to the model for generation. +- **Parent Document Retrieval** using [Neo4j](../neo4j-parent) or [MongoDB](../mongo-parent-document-retrieval): This retrieval technique stores embeddings for smaller chunks, but then returns larger chunks to pass to the model for generation. - [Semi-Structured RAG](../rag-semi-structured): The template shows how to do retrieval over semi-structured data (e.g. data that involves both text and tables). - [Temporal RAG](../rag-timescale-hybrid-search-time): The template shows how to do hybrid search over data with a time-based component using [Timescale Vector](https://www.timescale.com/ai?utm_campaign=vectorlaunch&utm_source=langchain&utm_medium=referral). From e165daa0ae93a82719b078fa4218869a5228ae5c Mon Sep 17 00:00:00 2001 From: Leonid Ganeline Date: Fri, 10 Nov 2023 13:55:27 -0800 Subject: [PATCH 07/14] new course on `DeepLearning.ai` (#12755) Added a new course on [DeepLearning.ai](https://learn.deeplearning.ai/functions-tools-agents-langchain) Added the LangChain `Wikipedia` link. Probably, it can be placed in the "More" menu. --- docs/docs/additional_resources/tutorials.mdx | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/docs/docs/additional_resources/tutorials.mdx b/docs/docs/additional_resources/tutorials.mdx index 85c2259ad29..b9aa3ac256e 100644 --- a/docs/docs/additional_resources/tutorials.mdx +++ b/docs/docs/additional_resources/tutorials.mdx @@ -1,15 +1,18 @@ # Tutorials -Below are links to tutorials and courses on LangChain. For written guides on common use cases for LangChain, check out the [use cases guides](/docs/use_cases/qa_structured/sql). +Below are links to tutorials and courses on LangChain. For written guides on common use cases for LangChain, check out the [use cases guides](/docs/use_cases). β›“ icon marks a new addition [last update 2023-09-21] --------------------- +### [LangChain on Wikipedia](https://en.wikipedia.org/wiki/LangChain) + ### DeepLearning.AI courses - by [Harrison Chase](https://github.com/hwchase17) and [Andrew Ng](https://en.wikipedia.org/wiki/Andrew_Ng) + by [Harrison Chase](https://en.wikipedia.org/wiki/LangChain) and [Andrew Ng](https://en.wikipedia.org/wiki/Andrew_Ng) - [LangChain for LLM Application Development](https://learn.deeplearning.ai/langchain) - [LangChain Chat with Your Data](https://learn.deeplearning.ai/langchain-chat-with-your-data) +- β›“ [Functions, Tools and Agents with LangChain](https://learn.deeplearning.ai/functions-tools-agents-langchain) ### Handbook [LangChain AI Handbook](https://www.pinecone.io/learn/langchain/) By **James Briggs** and **Francisco Ingham** From 8fa960641af6d6b6822b993cb6a44e22d0433883 Mon Sep 17 00:00:00 2001 From: VAS <126754021+fvaysh@users.noreply.github.com> Date: Sat, 11 Nov 2023 03:44:44 +0530 Subject: [PATCH 08/14] Update Documentation: Corrected Typos and Improved Clarity (#11725) Docs updates --------- Co-authored-by: Advaya <126754021+bluevayes@users.noreply.github.com> Co-authored-by: Erick Friis --- docs/docs/modules/agents/agent_types/index.mdx | 4 ++-- .../modules/agents/how_to/custom_llm_agent.mdx | 2 +- .../agents/how_to/custom_llm_chat_agent.mdx | 14 +++++++------- docs/docs/modules/agents/how_to/mrkl.mdx | 4 ++-- docs/docs/modules/agents/tools/index.mdx | 6 +++--- docs/docs/modules/agents/tools/toolkits.mdx | 4 ++-- 6 files changed, 17 insertions(+), 17 deletions(-) diff --git a/docs/docs/modules/agents/agent_types/index.mdx b/docs/docs/modules/agents/agent_types/index.mdx index 75dae52ff5c..c97947e78d5 100644 --- a/docs/docs/modules/agents/agent_types/index.mdx +++ b/docs/docs/modules/agents/agent_types/index.mdx @@ -38,7 +38,7 @@ It uses the ReAct framework to decide which tool to use, and uses memory to reme ## [Self-ask with search](/docs/modules/agents/agent_types/self_ask_with_search) This agent utilizes a single tool that should be named `Intermediate Answer`. -This tool should be able to lookup factual answers to questions. This agent +This tool should be able to look up factual answers to questions. This agent is equivalent to the original [self-ask with search paper](https://ofir.io/self-ask.pdf), where a Google search API was provided as the tool. @@ -46,7 +46,7 @@ where a Google search API was provided as the tool. This agent uses the ReAct framework to interact with a docstore. Two tools must be provided: a `Search` tool and a `Lookup` tool (they must be named exactly as so). -The `Search` tool should search for a document, while the `Lookup` tool should lookup +The `Search` tool should search for a document, while the `Lookup` tool should look up a term in the most recently found document. This agent is equivalent to the original [ReAct paper](https://arxiv.org/pdf/2210.03629.pdf), specifically the Wikipedia example. diff --git a/docs/docs/modules/agents/how_to/custom_llm_agent.mdx b/docs/docs/modules/agents/how_to/custom_llm_agent.mdx index 7d10cf50b84..6e92c54717e 100644 --- a/docs/docs/modules/agents/how_to/custom_llm_agent.mdx +++ b/docs/docs/modules/agents/how_to/custom_llm_agent.mdx @@ -1,4 +1,4 @@ -# Custom LLM agent +# Custom LLM Agent This notebook goes through how to create your own custom LLM agent. diff --git a/docs/docs/modules/agents/how_to/custom_llm_chat_agent.mdx b/docs/docs/modules/agents/how_to/custom_llm_chat_agent.mdx index a00f59d11ed..f9d8045dc6e 100644 --- a/docs/docs/modules/agents/how_to/custom_llm_chat_agent.mdx +++ b/docs/docs/modules/agents/how_to/custom_llm_chat_agent.mdx @@ -1,13 +1,13 @@ -# Custom LLM Agent (with a ChatModel) +# Custom LLM Chat Agent -This notebook goes through how to create your own custom agent based on a chat model. +This notebook explains how to create your own custom agent based on a chat model. -An LLM chat agent consists of three parts: +An LLM chat agent consists of four key components: -- `PromptTemplate`: This is the prompt template that can be used to instruct the language model on what to do -- `ChatModel`: This is the language model that powers the agent -- `stop` sequence: Instructs the LLM to stop generating as soon as this string is found -- `OutputParser`: This determines how to parse the LLM output into an `AgentAction` or `AgentFinish` object +- `PromptTemplate`: This is the prompt template that instructs the language model on what to do. +- `ChatModel`: This is the language model that powers the agent. +- `stop` sequence: Instructs the LLM to stop generating as soon as this string is found. +- `OutputParser`: This determines how to parse the LLM output into an `AgentAction` or `AgentFinish` object. The LLM Agent is used in an `AgentExecutor`. This `AgentExecutor` can largely be thought of as a loop that: 1. Passes user input and any previous steps to the Agent (in this case, the LLM Agent) diff --git a/docs/docs/modules/agents/how_to/mrkl.mdx b/docs/docs/modules/agents/how_to/mrkl.mdx index 6657fedc97e..2269766ee42 100644 --- a/docs/docs/modules/agents/how_to/mrkl.mdx +++ b/docs/docs/modules/agents/how_to/mrkl.mdx @@ -3,7 +3,7 @@ This walkthrough demonstrates how to replicate the [MRKL](https://arxiv.org/pdf/2205.00445.pdf) system using agents. This uses the example Chinook database. -To set it up follow the instructions on https://database.guide/2-sample-databases-sqlite/, placing the `.db` file in a notebooks folder at the root of this repository. +To set it up, follow the instructions on https://database.guide/2-sample-databases-sqlite/ and place the `.db` file in a "notebooks" folder at the root of this repository. ```python from langchain.chains import LLMMathChain @@ -127,7 +127,7 @@ mrkl.run("What is the full name of the artist who recently released an album cal -## With a chat model +## Using a Chat Model ```python from langchain.chat_models import ChatOpenAI diff --git a/docs/docs/modules/agents/tools/index.mdx b/docs/docs/modules/agents/tools/index.mdx index bf04ed6c47a..31e0fca7d41 100644 --- a/docs/docs/modules/agents/tools/index.mdx +++ b/docs/docs/modules/agents/tools/index.mdx @@ -4,17 +4,17 @@ sidebar_position: 2 # Tools :::info -Head to [Integrations](/docs/integrations/tools/) for documentation on built-in tool integrations. +For documentation on built-in tool integrations, visit [Integrations](/docs/integrations/tools/). ::: Tools are interfaces that an agent can use to interact with the world. -## Get started +## Getting Started Tools are functions that agents can use to interact with the world. These tools can be generic utilities (e.g. search), other chains, or even other agents. -Currently, tools can be loaded with the following snippet: +Currently, tools can be loaded using the following snippet: ```python from langchain.agents import load_tools diff --git a/docs/docs/modules/agents/tools/toolkits.mdx b/docs/docs/modules/agents/tools/toolkits.mdx index a09facee720..b8d1997025b 100644 --- a/docs/docs/modules/agents/tools/toolkits.mdx +++ b/docs/docs/modules/agents/tools/toolkits.mdx @@ -4,7 +4,7 @@ sidebar_position: 3 # Toolkits :::info -Head to [Integrations](/docs/integrations/toolkits/) for documentation on built-in toolkit integrations. +For documentation on built-in toolkit integrations, visit [Integrations](/docs/integrations/toolkits/). ::: -Toolkits are collections of tools that are designed to be used together for specific tasks and have convenience loading methods. +Toolkits are collections of tools that are designed to be used together for specific tasks and have convenient loading methods. From 72ad448daa60937ef8424d2e5d90d4d50d7af7f5 Mon Sep 17 00:00:00 2001 From: Lee Date: Fri, 10 Nov 2023 17:21:55 -0500 Subject: [PATCH 09/14] feat: Docusaurus Loader (#9138) Added a Docusaurus Loader Issue: #6353 I had to implement this for working with the Ionic documentation, and wanted to open this up as a draft to get some guidance on building this out further. I wasn't sure if having it be a light extension of the SitemapLoader was in the spirit of a proper feature for the library -- but I'm grateful for the opportunities Langchain has given me and I'd love to build this out properly for the sake of the community. Any feedback welcome! --- .../document_loaders/docusaurus.ipynb | 243 ++++++++++++++++++ .../langchain/document_loaders/__init__.py | 2 + .../langchain/document_loaders/docusaurus.py | 49 ++++ .../document_loaders/test_docusaurus.py | 43 ++++ .../examples/docusaurus-sitemap.xml | 42 +++ 5 files changed, 379 insertions(+) create mode 100644 docs/docs/integrations/document_loaders/docusaurus.ipynb create mode 100644 libs/langchain/langchain/document_loaders/docusaurus.py create mode 100644 libs/langchain/tests/integration_tests/document_loaders/test_docusaurus.py create mode 100644 libs/langchain/tests/integration_tests/examples/docusaurus-sitemap.xml diff --git a/docs/docs/integrations/document_loaders/docusaurus.ipynb b/docs/docs/integrations/document_loaders/docusaurus.ipynb new file mode 100644 index 00000000000..ca953cb6684 --- /dev/null +++ b/docs/docs/integrations/document_loaders/docusaurus.ipynb @@ -0,0 +1,243 @@ +{ + "cells": [ + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "# Docusaurus\n", + "> [Docusaurus](https://docusaurus.io/) is a static-site generator which provides out-of-the-box documentation features.\n", + "\n", + "By utilizing the existing `SitemapLoader`, this loader scans and loads all pages from a given Docusaurus application and returns the main documentation content of each page as a Document." + ] + }, + { + "cell_type": "code", + "execution_count": 1, + "metadata": {}, + "outputs": [], + "source": [ + "from langchain.document_loaders import DocusaurusLoader" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Install necessary dependencies" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "!pip install -U beautifulsoup4 lxml" + ] + }, + { + "cell_type": "code", + "execution_count": 4, + "metadata": {}, + "outputs": [], + "source": [ + "# fixes a bug with asyncio and jupyter\n", + "import nest_asyncio\n", + "\n", + "nest_asyncio.apply()" + ] + }, + { + "cell_type": "code", + "execution_count": 5, + "metadata": {}, + "outputs": [ + { + "name": "stderr", + "output_type": "stream", + "text": [ + "Fetching pages: 100%|##########| 939/939 [01:19<00:00, 11.85it/s]\n" + ] + } + ], + "source": [ + "loader = DocusaurusLoader(\"https://python.langchain.com\")\n", + "\n", + "docs = loader.load()" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "> `SitemapLoader` also provides the ability to utilize and tweak concurrency which can help optimize the time it takes to load the source documentation. Refer to the [sitemap docs](/docs/integrations/document_loaders/sitemap) for more info." + ] + }, + { + "cell_type": "code", + "execution_count": 6, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "Document(page_content=\"\\n\\n\\n\\n\\nCookbook | πŸ¦œοΈπŸ”— Langchain\\n\\n\\n\\n\\n\\n\\nSkip to main contentπŸ¦œοΈπŸ”— LangChainDocsUse casesIntegrationsAPICommunityChat our docsLangSmithJS/TS DocsSearchCTRLKCookbookThe page you're looking for has been moved to the cookbook section of the repo as a notebook.CommunityDiscordTwitterGitHubPythonJS/TSMoreHomepageBlogCopyright Β© 2023 LangChain, Inc.\\n\\n\\n\\n\", metadata={'source': 'https://python.langchain.com/cookbook', 'loc': 'https://python.langchain.com/cookbook', 'changefreq': 'weekly', 'priority': '0.5'})" + ] + }, + "execution_count": 6, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "docs[0]" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Filtering sitemap URLs\n", + "\n", + "Sitemaps can contain thousands of URLs and ften you don't need every single one of them. You can filter the URLs by passing a list of strings or regex patterns to the `url_filter` parameter. Only URLs that match one of the patterns will be loaded." + ] + }, + { + "cell_type": "code", + "execution_count": 14, + "metadata": {}, + "outputs": [ + { + "name": "stderr", + "output_type": "stream", + "text": [ + "Fetching pages: 100%|##########| 1/1 [00:00<00:00, 5.21it/s]\n" + ] + } + ], + "source": [ + "loader = DocusaurusLoader(\n", + " \"https://python.langchain.com\",\n", + " filter_urls=[\"https://python.langchain.com/docs/integrations/document_loaders/sitemap\"],\n", + ")\n", + "documents = loader.load()" + ] + }, + { + "cell_type": "code", + "execution_count": 16, + "metadata": { + "scrolled": true + }, + "outputs": [ + { + "data": { + "text/plain": [ + "Document(page_content='\\n\\n\\n\\n\\nSitemap | πŸ¦œοΈπŸ”— Langchain\\n\\n\\n\\n\\n\\n\\nSkip to main contentπŸ¦œοΈπŸ”— LangChainDocsUse casesIntegrationsAPICommunityChat our docsLangSmithJS/TS DocsSearchCTRLKProvidersAnthropicAWSGoogleMicrosoftOpenAIMoreComponentsLLMsChat modelsDocument loadersacreomAirbyte CDKAirbyte GongAirbyte HubspotAirbyte JSONAirbyte SalesforceAirbyte ShopifyAirbyte StripeAirbyte TypeformAirbyte Zendesk SupportAirtableAlibaba Cloud MaxComputeApify DatasetArcGISArxivAssemblyAI Audio TranscriptsAsync ChromiumAsyncHtmlAWS S3 DirectoryAWS S3 FileAZLyricsAzure Blob Storage ContainerAzure Blob Storage FileAzure Document IntelligenceBibTeXBiliBiliBlackboardBlockchainBrave SearchBrowserlessChatGPT DataCollege ConfidentialConcurrent LoaderConfluenceCoNLL-UCopy PasteCSVCube Semantic LayerDatadog LogsDiffbotDiscordDocugamiDropboxDuckDBEmailEmbaasEPubEtherscanEverNoteexample_dataMicrosoft ExcelFacebook ChatFaunaFigmaGeopandasGitGitBookGitHubGoogle BigQueryGoogle Cloud Storage DirectoryGoogle Cloud Storage FileGoogle DriveGrobidGutenbergHacker NewsHuawei OBS DirectoryHuawei OBS FileHuggingFace datasetiFixitImagesImage captionsIMSDbIuguJoplinJupyter NotebookLarkSuite (FeiShu)MastodonMediaWiki DumpMerge Documents LoadermhtmlMicrosoft OneDriveMicrosoft PowerPointMicrosoft SharePointMicrosoft WordModern TreasuryMongoDBNews URLNotion DB 1/2Notion DB 2/2NucliaObsidianOpen Document Format (ODT)Open City DataOrg-modePandas DataFrameAmazon TextractPolars DataFramePsychicPubMedPySparkReadTheDocs DocumentationRecursive URLRedditRoamRocksetrspaceRSS FeedsRSTSitemapSlackSnowflakeSource CodeSpreedlyStripeSubtitleTelegramTencent COS DirectoryTencent COS FileTensorFlow Datasets2MarkdownTOMLTrelloTSVTwitterUnstructured FileURLWeatherWebBaseLoaderWhatsApp ChatWikipediaXMLXorbits Pandas DataFrameYouTube audioYouTube transcriptsDocument transformersText embedding modelsVector storesRetrieversToolsAgents and toolkitsMemoryCallbacksChat loadersComponentsDocument loadersSitemapOn this pageSitemapExtends from the WebBaseLoader, SitemapLoader loads a sitemap from a given URL, and then scrape and load all pages in the sitemap, returning each page as a Document.The scraping is done concurrently. There are reasonable limits to concurrent requests, defaulting to 2 per second. If you aren\\'t concerned about being a good citizen, or you control the scrapped server, or don\\'t care about load. Note, while this will speed up the scraping process, but it may cause the server to block you. Be careful!pip install nest_asyncio Requirement already satisfied: nest_asyncio in /Users/tasp/Code/projects/langchain/.venv/lib/python3.10/site-packages (1.5.6) [notice] A new release of pip available: 22.3.1 -> 23.0.1 [notice] To update, run: pip install --upgrade pip# fixes a bug with asyncio and jupyterimport nest_asyncionest_asyncio.apply()from langchain.document_loaders.sitemap import SitemapLoadersitemap_loader = SitemapLoader(web_path=\"https://langchain.readthedocs.io/sitemap.xml\")docs = sitemap_loader.load()You can change the requests_per_second parameter to increase the max concurrent requests. and use requests_kwargs to pass kwargs when send requests.sitemap_loader.requests_per_second = 2# Optional: avoid `[SSL: CERTIFICATE_VERIFY_FAILED]` issuesitemap_loader.requests_kwargs = {\"verify\": False}docs[0] Document(page_content=\\'\\\\n\\\\n\\\\n\\\\n\\\\n\\\\nWelcome to LangChain β€” πŸ¦œπŸ”— LangChain 0.0.123\\\\n\\\\n\\\\n\\\\n\\\\n\\\\n\\\\n\\\\n\\\\n\\\\n\\\\n\\\\n\\\\n\\\\n\\\\n\\\\n\\\\n\\\\n\\\\n\\\\n\\\\n\\\\n\\\\n\\\\n\\\\n\\\\n\\\\n\\\\n\\\\n\\\\n\\\\n\\\\n\\\\n\\\\n\\\\n\\\\n\\\\n\\\\n\\\\n\\\\n\\\\n\\\\n\\\\n\\\\n\\\\n\\\\n\\\\nSkip to main content\\\\n\\\\n\\\\n\\\\n\\\\n\\\\n\\\\n\\\\n\\\\n\\\\n\\\\nCtrl+K\\\\n\\\\n\\\\n\\\\n\\\\n\\\\n\\\\n\\\\n\\\\n\\\\n\\\\n\\\\n\\\\nπŸ¦œπŸ”— LangChain 0.0.123\\\\n\\\\n\\\\n\\\\nGetting Started\\\\n\\\\nQuickstart Guide\\\\n\\\\nModules\\\\n\\\\nPrompt Templates\\\\nGetting Started\\\\nKey Concepts\\\\nHow-To Guides\\\\nCreate a custom prompt template\\\\nCreate a custom example selector\\\\nProvide few shot examples to a prompt\\\\nPrompt Serialization\\\\nExample Selectors\\\\nOutput Parsers\\\\n\\\\n\\\\nReference\\\\nPromptTemplates\\\\nExample Selector\\\\n\\\\n\\\\n\\\\n\\\\nLLMs\\\\nGetting Started\\\\nKey Concepts\\\\nHow-To Guides\\\\nGeneric Functionality\\\\nCustom LLM\\\\nFake LLM\\\\nLLM Caching\\\\nLLM Serialization\\\\nToken Usage Tracking\\\\n\\\\n\\\\nIntegrations\\\\nAI21\\\\nAleph Alpha\\\\nAnthropic\\\\nAzure OpenAI LLM Example\\\\nBanana\\\\nCerebriumAI LLM Example\\\\nCohere\\\\nDeepInfra LLM Example\\\\nForefrontAI LLM Example\\\\nGooseAI LLM Example\\\\nHugging Face Hub\\\\nManifest\\\\nModal\\\\nOpenAI\\\\nPetals LLM Example\\\\nPromptLayer OpenAI\\\\nSageMakerEndpoint\\\\nSelf-Hosted Models via Runhouse\\\\nStochasticAI\\\\nWriter\\\\n\\\\n\\\\nAsync API for LLM\\\\nStreaming with LLMs\\\\n\\\\n\\\\nReference\\\\n\\\\n\\\\nDocument Loaders\\\\nKey Concepts\\\\nHow To Guides\\\\nCoNLL-U\\\\nAirbyte JSON\\\\nAZLyrics\\\\nBlackboard\\\\nCollege Confidential\\\\nCopy Paste\\\\nCSV Loader\\\\nDirectory Loader\\\\nEmail\\\\nEverNote\\\\nFacebook Chat\\\\nFigma\\\\nGCS Directory\\\\nGCS File Storage\\\\nGitBook\\\\nGoogle Drive\\\\nGutenberg\\\\nHacker News\\\\nHTML\\\\niFixit\\\\nImages\\\\nIMSDb\\\\nMarkdown\\\\nNotebook\\\\nNotion\\\\nObsidian\\\\nPDF\\\\nPowerPoint\\\\nReadTheDocs Documentation\\\\nRoam\\\\ns3 Directory\\\\ns3 File\\\\nSubtitle Files\\\\nTelegram\\\\nUnstructured File Loader\\\\nURL\\\\nWeb Base\\\\nWord Documents\\\\nYouTube\\\\n\\\\n\\\\n\\\\n\\\\nUtils\\\\nKey Concepts\\\\nGeneric Utilities\\\\nBash\\\\nBing Search\\\\nGoogle Search\\\\nGoogle Serper API\\\\nIFTTT WebHooks\\\\nPython REPL\\\\nRequests\\\\nSearxNG Search API\\\\nSerpAPI\\\\nWolfram Alpha\\\\nZapier Natural Language Actions API\\\\n\\\\n\\\\nReference\\\\nPython REPL\\\\nSerpAPI\\\\nSearxNG Search\\\\nDocstore\\\\nText Splitter\\\\nEmbeddings\\\\nVectorStores\\\\n\\\\n\\\\n\\\\n\\\\nIndexes\\\\nGetting Started\\\\nKey Concepts\\\\nHow To Guides\\\\nEmbeddings\\\\nHypothetical Document Embeddings\\\\nText Splitter\\\\nVectorStores\\\\nAtlasDB\\\\nChroma\\\\nDeep Lake\\\\nElasticSearch\\\\nFAISS\\\\nMilvus\\\\nOpenSearch\\\\nPGVector\\\\nPinecone\\\\nQdrant\\\\nRedis\\\\nWeaviate\\\\nChatGPT Plugin Retriever\\\\nVectorStore Retriever\\\\nAnalyze Document\\\\nChat Index\\\\nGraph QA\\\\nQuestion Answering with Sources\\\\nQuestion Answering\\\\nSummarization\\\\nRetrieval Question/Answering\\\\nRetrieval Question Answering with Sources\\\\nVector DB Text Generation\\\\n\\\\n\\\\n\\\\n\\\\nChains\\\\nGetting Started\\\\nHow-To Guides\\\\nGeneric Chains\\\\nLoading from LangChainHub\\\\nLLM Chain\\\\nSequential Chains\\\\nSerialization\\\\nTransformation Chain\\\\n\\\\n\\\\nUtility Chains\\\\nAPI Chains\\\\nSelf-Critique Chain with Constitutional AI\\\\nBashChain\\\\nLLMCheckerChain\\\\nLLM Math\\\\nLLMRequestsChain\\\\nLLMSummarizationCheckerChain\\\\nModeration\\\\nPAL\\\\nSQLite example\\\\n\\\\n\\\\nAsync API for Chain\\\\n\\\\n\\\\nKey Concepts\\\\nReference\\\\n\\\\n\\\\nAgents\\\\nGetting Started\\\\nKey Concepts\\\\nHow-To Guides\\\\nAgents and Vectorstores\\\\nAsync API for Agent\\\\nConversation Agent (for Chat Models)\\\\nChatGPT Plugins\\\\nCustom Agent\\\\nDefining Custom Tools\\\\nHuman as a tool\\\\nIntermediate Steps\\\\nLoading from LangChainHub\\\\nMax Iterations\\\\nMulti Input Tools\\\\nSearch Tools\\\\nSerialization\\\\nAdding SharedMemory to an Agent and its Tools\\\\nCSV Agent\\\\nJSON Agent\\\\nOpenAPI Agent\\\\nPandas Dataframe Agent\\\\nPython Agent\\\\nSQL Database Agent\\\\nVectorstore Agent\\\\nMRKL\\\\nMRKL Chat\\\\nReAct\\\\nSelf Ask With Search\\\\n\\\\n\\\\nReference\\\\n\\\\n\\\\nMemory\\\\nGetting Started\\\\nKey Concepts\\\\nHow-To Guides\\\\nConversationBufferMemory\\\\nConversationBufferWindowMemory\\\\nEntity Memory\\\\nConversation Knowledge Graph Memory\\\\nConversationSummaryMemory\\\\nConversationSummaryBufferMemory\\\\nConversationTokenBufferMemory\\\\nAdding Memory To an LLMChain\\\\nAdding Memory to a Multi-Input Chain\\\\nAdding Memory to an Agent\\\\nChatGPT Clone\\\\nConversation Agent\\\\nConversational Memory Customization\\\\nCustom Memory\\\\nMultiple Memory\\\\n\\\\n\\\\n\\\\n\\\\nChat\\\\nGetting Started\\\\nKey Concepts\\\\nHow-To Guides\\\\nAgent\\\\nChat Vector DB\\\\nFew Shot Examples\\\\nMemory\\\\nPromptLayer ChatOpenAI\\\\nStreaming\\\\nRetrieval Question/Answering\\\\nRetrieval Question Answering with Sources\\\\n\\\\n\\\\n\\\\n\\\\n\\\\nUse Cases\\\\n\\\\nAgents\\\\nChatbots\\\\nGenerate Examples\\\\nData Augmented Generation\\\\nQuestion Answering\\\\nSummarization\\\\nQuerying Tabular Data\\\\nExtraction\\\\nEvaluation\\\\nAgent Benchmarking: Search + Calculator\\\\nAgent VectorDB Question Answering Benchmarking\\\\nBenchmarking Template\\\\nData Augmented Question Answering\\\\nUsing Hugging Face Datasets\\\\nLLM Math\\\\nQuestion Answering Benchmarking: Paul Graham Essay\\\\nQuestion Answering Benchmarking: State of the Union Address\\\\nQA Generation\\\\nQuestion Answering\\\\nSQL Question Answering Benchmarking: Chinook\\\\n\\\\n\\\\nModel Comparison\\\\n\\\\nReference\\\\n\\\\nInstallation\\\\nIntegrations\\\\nAPI References\\\\nPrompts\\\\nPromptTemplates\\\\nExample Selector\\\\n\\\\n\\\\nUtilities\\\\nPython REPL\\\\nSerpAPI\\\\nSearxNG Search\\\\nDocstore\\\\nText Splitter\\\\nEmbeddings\\\\nVectorStores\\\\n\\\\n\\\\nChains\\\\nAgents\\\\n\\\\n\\\\n\\\\nEcosystem\\\\n\\\\nLangChain Ecosystem\\\\nAI21 Labs\\\\nAtlasDB\\\\nBanana\\\\nCerebriumAI\\\\nChroma\\\\nCohere\\\\nDeepInfra\\\\nDeep Lake\\\\nForefrontAI\\\\nGoogle Search Wrapper\\\\nGoogle Serper Wrapper\\\\nGooseAI\\\\nGraphsignal\\\\nHazy Research\\\\nHelicone\\\\nHugging Face\\\\nMilvus\\\\nModal\\\\nNLPCloud\\\\nOpenAI\\\\nOpenSearch\\\\nPetals\\\\nPGVector\\\\nPinecone\\\\nPromptLayer\\\\nQdrant\\\\nRunhouse\\\\nSearxNG Search API\\\\nSerpAPI\\\\nStochasticAI\\\\nUnstructured\\\\nWeights & Biases\\\\nWeaviate\\\\nWolfram Alpha Wrapper\\\\nWriter\\\\n\\\\n\\\\n\\\\nAdditional Resources\\\\n\\\\nLangChainHub\\\\nGlossary\\\\nLangChain Gallery\\\\nDeployments\\\\nTracing\\\\nDiscord\\\\nProduction Support\\\\n\\\\n\\\\n\\\\n\\\\n\\\\n\\\\n\\\\n\\\\n\\\\n\\\\n\\\\n\\\\n\\\\n\\\\n\\\\n\\\\n\\\\n\\\\n\\\\n\\\\n\\\\n\\\\n\\\\n\\\\n\\\\n\\\\n\\\\n\\\\n\\\\n\\\\n\\\\n\\\\n\\\\n\\\\n\\\\n\\\\n\\\\n\\\\n\\\\n\\\\n.rst\\\\n\\\\n\\\\n\\\\n\\\\n\\\\n\\\\n\\\\n.pdf\\\\n\\\\n\\\\n\\\\n\\\\n\\\\n\\\\n\\\\n\\\\n\\\\n\\\\n\\\\n\\\\n\\\\n\\\\n\\\\n\\\\n\\\\n\\\\n\\\\nWelcome to LangChain\\\\n\\\\n\\\\n\\\\n\\\\n Contents \\\\n\\\\n\\\\n\\\\nGetting Started\\\\nModules\\\\nUse Cases\\\\nReference Docs\\\\nLangChain Ecosystem\\\\nAdditional Resources\\\\n\\\\n\\\\n\\\\n\\\\n\\\\n\\\\n\\\\n\\\\nWelcome to LangChain#\\\\nLarge language models (LLMs) are emerging as a transformative technology, enabling\\\\ndevelopers to build applications that they previously could not.\\\\nBut using these LLMs in isolation is often not enough to\\\\ncreate a truly powerful app - the real power comes when you are able to\\\\ncombine them with other sources of computation or knowledge.\\\\nThis library is aimed at assisting in the development of those types of applications. Common examples of these types of applications include:\\\\n❓ Question Answering over specific documents\\\\n\\\\nDocumentation\\\\nEnd-to-end Example: Question Answering over Notion Database\\\\n\\\\nπŸ’¬ Chatbots\\\\n\\\\nDocumentation\\\\nEnd-to-end Example: Chat-LangChain\\\\n\\\\nπŸ€– Agents\\\\n\\\\nDocumentation\\\\nEnd-to-end Example: GPT+WolframAlpha\\\\n\\\\n\\\\nGetting Started#\\\\nCheckout the below guide for a walkthrough of how to get started using LangChain to create an Language Model application.\\\\n\\\\nGetting Started Documentation\\\\n\\\\n\\\\n\\\\n\\\\n\\\\nModules#\\\\nThere are several main modules that LangChain provides support for.\\\\nFor each module we provide some examples to get started, how-to guides, reference docs, and conceptual guides.\\\\nThese modules are, in increasing order of complexity:\\\\n\\\\nPrompts: This includes prompt management, prompt optimization, and prompt serialization.\\\\nLLMs: This includes a generic interface for all LLMs, and common utilities for working with LLMs.\\\\nDocument Loaders: This includes a standard interface for loading documents, as well as specific integrations to all types of text data sources.\\\\nUtils: Language models are often more powerful when interacting with other sources of knowledge or computation. This can include Python REPLs, embeddings, search engines, and more. LangChain provides a large collection of common utils to use in your application.\\\\nChains: Chains go beyond just a single LLM call, and are sequences of calls (whether to an LLM or a different utility). LangChain provides a standard interface for chains, lots of integrations with other tools, and end-to-end chains for common applications.\\\\nIndexes: Language models are often more powerful when combined with your own text data - this module covers best practices for doing exactly that.\\\\nAgents: Agents involve an LLM making decisions about which Actions to take, taking that Action, seeing an Observation, and repeating that until done. LangChain provides a standard interface for agents, a selection of agents to choose from, and examples of end to end agents.\\\\nMemory: Memory is the concept of persisting state between calls of a chain/agent. LangChain provides a standard interface for memory, a collection of memory implementations, and examples of chains/agents that use memory.\\\\nChat: Chat models are a variation on Language Models that expose a different API - rather than working with raw text, they work with messages. LangChain provides a standard interface for working with them and doing all the same things as above.\\\\n\\\\n\\\\n\\\\n\\\\n\\\\nUse Cases#\\\\nThe above modules can be used in a variety of ways. LangChain also provides guidance and assistance in this. Below are some of the common use cases LangChain supports.\\\\n\\\\nAgents: Agents are systems that use a language model to interact with other tools. These can be used to do more grounded question/answering, interact with APIs, or even take actions.\\\\nChatbots: Since language models are good at producing text, that makes them ideal for creating chatbots.\\\\nData Augmented Generation: Data Augmented Generation involves specific types of chains that first interact with an external datasource to fetch data to use in the generation step. Examples of this include summarization of long pieces of text and question/answering over specific data sources.\\\\nQuestion Answering: Answering questions over specific documents, only utilizing the information in those documents to construct an answer. A type of Data Augmented Generation.\\\\nSummarization: Summarizing longer documents into shorter, more condensed chunks of information. A type of Data Augmented Generation.\\\\nQuerying Tabular Data: If you want to understand how to use LLMs to query data that is stored in a tabular format (csvs, SQL, dataframes, etc) you should read this page.\\\\nEvaluation: Generative models are notoriously hard to evaluate with traditional metrics. One new way of evaluating them is using language models themselves to do the evaluation. LangChain provides some prompts/chains for assisting in this.\\\\nGenerate similar examples: Generating similar examples to a given input. This is a common use case for many applications, and LangChain provides some prompts/chains for assisting in this.\\\\nCompare models: Experimenting with different prompts, models, and chains is a big part of developing the best possible application. The ModelLaboratory makes it easy to do so.\\\\n\\\\n\\\\n\\\\n\\\\n\\\\nReference Docs#\\\\nAll of LangChain’s reference documentation, in one place. Full documentation on all methods, classes, installation methods, and integration setups for LangChain.\\\\n\\\\nReference Documentation\\\\n\\\\n\\\\n\\\\n\\\\n\\\\nLangChain Ecosystem#\\\\nGuides for how other companies/products can be used with LangChain\\\\n\\\\nLangChain Ecosystem\\\\n\\\\n\\\\n\\\\n\\\\n\\\\nAdditional Resources#\\\\nAdditional collection of resources we think may be useful as you develop your application!\\\\n\\\\nLangChainHub: The LangChainHub is a place to share and explore other prompts, chains, and agents.\\\\nGlossary: A glossary of all related terms, papers, methods, etc. Whether implemented in LangChain or not!\\\\nGallery: A collection of our favorite projects that use LangChain. Useful for finding inspiration or seeing how things were done in other applications.\\\\nDeployments: A collection of instructions, code snippets, and template repositories for deploying LangChain apps.\\\\nDiscord: Join us on our Discord to discuss all things LangChain!\\\\nTracing: A guide on using tracing in LangChain to visualize the execution of chains and agents.\\\\nProduction Support: As you move your LangChains into production, we’d love to offer more comprehensive support. Please fill out this form and we’ll set up a dedicated support Slack channel.\\\\n\\\\n\\\\n\\\\n\\\\n\\\\n\\\\n\\\\n\\\\n\\\\n\\\\n\\\\nnext\\\\nQuickstart Guide\\\\n\\\\n\\\\n\\\\n\\\\n\\\\n\\\\n\\\\n\\\\n\\\\n Contents\\\\n \\\\n\\\\n\\\\nGetting Started\\\\nModules\\\\nUse Cases\\\\nReference Docs\\\\nLangChain Ecosystem\\\\nAdditional Resources\\\\n\\\\n\\\\n\\\\n\\\\n\\\\n\\\\n\\\\n\\\\n\\\\nBy Harrison Chase\\\\n\\\\n\\\\n\\\\n\\\\n \\\\n Β© Copyright 2023, Harrison Chase.\\\\n \\\\n\\\\n\\\\n\\\\n\\\\n Last updated on Mar 24, 2023.\\\\n \\\\n\\\\n\\\\n\\\\n\\\\n\\\\n\\\\n\\\\n\\\\n\\\\n\\\\n\\\\n\\\\n\\\\n\\\\n\\\\n\\', lookup_str=\\'\\', metadata={\\'source\\': \\'https://python.langchain.com/en/stable/\\', \\'loc\\': \\'https://python.langchain.com/en/stable/\\', \\'lastmod\\': \\'2023-03-24T19:30:54.647430+00:00\\', \\'changefreq\\': \\'weekly\\', \\'priority\\': \\'1\\'}, lookup_index=0)Filtering sitemap URLs\\u200bSitemaps can be massive files, with thousands of URLs. Often you don\\'t need every single one of them. You can filter the URLs by passing a list of strings or regex patterns to the url_filter parameter. Only URLs that match one of the patterns will be loaded.loader = SitemapLoader( \"https://langchain.readthedocs.io/sitemap.xml\", filter_urls=[\"https://python.langchain.com/en/latest/\"],)documents = loader.load()documents[0] Document(page_content=\\'\\\\n\\\\n\\\\n\\\\n\\\\n\\\\nWelcome to LangChain β€” πŸ¦œπŸ”— LangChain 0.0.123\\\\n\\\\n\\\\n\\\\n\\\\n\\\\n\\\\n\\\\n\\\\n\\\\n\\\\n\\\\n\\\\n\\\\n\\\\n\\\\n\\\\n\\\\n\\\\n\\\\n\\\\n\\\\n\\\\n\\\\n\\\\n\\\\n\\\\n\\\\n\\\\n\\\\n\\\\n\\\\n\\\\n\\\\n\\\\n\\\\n\\\\n\\\\n\\\\n\\\\n\\\\n\\\\n\\\\n\\\\n\\\\n\\\\n\\\\nSkip to main content\\\\n\\\\n\\\\n\\\\n\\\\n\\\\n\\\\n\\\\n\\\\n\\\\n\\\\nCtrl+K\\\\n\\\\n\\\\n\\\\n\\\\n\\\\n\\\\n\\\\n\\\\n\\\\n\\\\n\\\\n\\\\nπŸ¦œπŸ”— LangChain 0.0.123\\\\n\\\\n\\\\n\\\\nGetting Started\\\\n\\\\nQuickstart Guide\\\\n\\\\nModules\\\\n\\\\nModels\\\\nLLMs\\\\nGetting Started\\\\nGeneric Functionality\\\\nHow to use the async API for LLMs\\\\nHow to write a custom LLM wrapper\\\\nHow (and why) to use the fake LLM\\\\nHow to cache LLM calls\\\\nHow to serialize LLM classes\\\\nHow to stream LLM responses\\\\nHow to track token usage\\\\n\\\\n\\\\nIntegrations\\\\nAI21\\\\nAleph Alpha\\\\nAnthropic\\\\nAzure OpenAI LLM Example\\\\nBanana\\\\nCerebriumAI LLM Example\\\\nCohere\\\\nDeepInfra LLM Example\\\\nForefrontAI LLM Example\\\\nGooseAI LLM Example\\\\nHugging Face Hub\\\\nManifest\\\\nModal\\\\nOpenAI\\\\nPetals LLM Example\\\\nPromptLayer OpenAI\\\\nSageMakerEndpoint\\\\nSelf-Hosted Models via Runhouse\\\\nStochasticAI\\\\nWriter\\\\n\\\\n\\\\nReference\\\\n\\\\n\\\\nChat Models\\\\nGetting Started\\\\nHow-To Guides\\\\nHow to use few shot examples\\\\nHow to stream responses\\\\n\\\\n\\\\nIntegrations\\\\nAzure\\\\nOpenAI\\\\nPromptLayer ChatOpenAI\\\\n\\\\n\\\\n\\\\n\\\\nText Embedding Models\\\\nAzureOpenAI\\\\nCohere\\\\nFake Embeddings\\\\nHugging Face Hub\\\\nInstructEmbeddings\\\\nOpenAI\\\\nSageMaker Endpoint Embeddings\\\\nSelf Hosted Embeddings\\\\nTensorflowHub\\\\n\\\\n\\\\n\\\\n\\\\nPrompts\\\\nPrompt Templates\\\\nGetting Started\\\\nHow-To Guides\\\\nHow to create a custom prompt template\\\\nHow to create a prompt template that uses few shot examples\\\\nHow to work with partial Prompt Templates\\\\nHow to serialize prompts\\\\n\\\\n\\\\nReference\\\\nPromptTemplates\\\\nExample Selector\\\\n\\\\n\\\\n\\\\n\\\\nChat Prompt Template\\\\nExample Selectors\\\\nHow to create a custom example selector\\\\nLengthBased ExampleSelector\\\\nMaximal Marginal Relevance ExampleSelector\\\\nNGram Overlap ExampleSelector\\\\nSimilarity ExampleSelector\\\\n\\\\n\\\\nOutput Parsers\\\\nOutput Parsers\\\\nCommaSeparatedListOutputParser\\\\nOutputFixingParser\\\\nPydanticOutputParser\\\\nRetryOutputParser\\\\nStructured Output Parser\\\\n\\\\n\\\\n\\\\n\\\\nIndexes\\\\nGetting Started\\\\nDocument Loaders\\\\nCoNLL-U\\\\nAirbyte JSON\\\\nAZLyrics\\\\nBlackboard\\\\nCollege Confidential\\\\nCopy Paste\\\\nCSV Loader\\\\nDirectory Loader\\\\nEmail\\\\nEverNote\\\\nFacebook Chat\\\\nFigma\\\\nGCS Directory\\\\nGCS File Storage\\\\nGitBook\\\\nGoogle Drive\\\\nGutenberg\\\\nHacker News\\\\nHTML\\\\niFixit\\\\nImages\\\\nIMSDb\\\\nMarkdown\\\\nNotebook\\\\nNotion\\\\nObsidian\\\\nPDF\\\\nPowerPoint\\\\nReadTheDocs Documentation\\\\nRoam\\\\ns3 Directory\\\\ns3 File\\\\nSubtitle Files\\\\nTelegram\\\\nUnstructured File Loader\\\\nURL\\\\nWeb Base\\\\nWord Documents\\\\nYouTube\\\\n\\\\n\\\\nText Splitters\\\\nGetting Started\\\\nCharacter Text Splitter\\\\nHuggingFace Length Function\\\\nLatex Text Splitter\\\\nMarkdown Text Splitter\\\\nNLTK Text Splitter\\\\nPython Code Text Splitter\\\\nRecursiveCharacterTextSplitter\\\\nSpacy Text Splitter\\\\ntiktoken (OpenAI) Length Function\\\\nTiktokenText Splitter\\\\n\\\\n\\\\nVectorstores\\\\nGetting Started\\\\nAtlasDB\\\\nChroma\\\\nDeep Lake\\\\nElasticSearch\\\\nFAISS\\\\nMilvus\\\\nOpenSearch\\\\nPGVector\\\\nPinecone\\\\nQdrant\\\\nRedis\\\\nWeaviate\\\\n\\\\n\\\\nRetrievers\\\\nChatGPT Plugin Retriever\\\\nVectorStore Retriever\\\\n\\\\n\\\\n\\\\n\\\\nMemory\\\\nGetting Started\\\\nHow-To Guides\\\\nConversationBufferMemory\\\\nConversationBufferWindowMemory\\\\nEntity Memory\\\\nConversation Knowledge Graph Memory\\\\nConversationSummaryMemory\\\\nConversationSummaryBufferMemory\\\\nConversationTokenBufferMemory\\\\nHow to add Memory to an LLMChain\\\\nHow to add memory to a Multi-Input Chain\\\\nHow to add Memory to an Agent\\\\nHow to customize conversational memory\\\\nHow to create a custom Memory class\\\\nHow to use multiple memroy classes in the same chain\\\\n\\\\n\\\\n\\\\n\\\\nChains\\\\nGetting Started\\\\nHow-To Guides\\\\nAsync API for Chain\\\\nLoading from LangChainHub\\\\nLLM Chain\\\\nSequential Chains\\\\nSerialization\\\\nTransformation Chain\\\\nAnalyze Document\\\\nChat Index\\\\nGraph QA\\\\nHypothetical Document Embeddings\\\\nQuestion Answering with Sources\\\\nQuestion Answering\\\\nSummarization\\\\nRetrieval Question/Answering\\\\nRetrieval Question Answering with Sources\\\\nVector DB Text Generation\\\\nAPI Chains\\\\nSelf-Critique Chain with Constitutional AI\\\\nBashChain\\\\nLLMCheckerChain\\\\nLLM Math\\\\nLLMRequestsChain\\\\nLLMSummarizationCheckerChain\\\\nModeration\\\\nPAL\\\\nSQLite example\\\\n\\\\n\\\\nReference\\\\n\\\\n\\\\nAgents\\\\nGetting Started\\\\nTools\\\\nGetting Started\\\\nDefining Custom Tools\\\\nMulti Input Tools\\\\nBash\\\\nBing Search\\\\nChatGPT Plugins\\\\nGoogle Search\\\\nGoogle Serper API\\\\nHuman as a tool\\\\nIFTTT WebHooks\\\\nPython REPL\\\\nRequests\\\\nSearch Tools\\\\nSearxNG Search API\\\\nSerpAPI\\\\nWolfram Alpha\\\\nZapier Natural Language Actions API\\\\n\\\\n\\\\nAgents\\\\nAgent Types\\\\nCustom Agent\\\\nConversation Agent (for Chat Models)\\\\nConversation Agent\\\\nMRKL\\\\nMRKL Chat\\\\nReAct\\\\nSelf Ask With Search\\\\n\\\\n\\\\nToolkits\\\\nCSV Agent\\\\nJSON Agent\\\\nOpenAPI Agent\\\\nPandas Dataframe Agent\\\\nPython Agent\\\\nSQL Database Agent\\\\nVectorstore Agent\\\\n\\\\n\\\\nAgent Executors\\\\nHow to combine agents and vectorstores\\\\nHow to use the async API for Agents\\\\nHow to create ChatGPT Clone\\\\nHow to access intermediate steps\\\\nHow to cap the max number of iterations\\\\nHow to add SharedMemory to an Agent and its Tools\\\\n\\\\n\\\\n\\\\n\\\\n\\\\nUse Cases\\\\n\\\\nPersonal Assistants\\\\nQuestion Answering over Docs\\\\nChatbots\\\\nQuerying Tabular Data\\\\nInteracting with APIs\\\\nSummarization\\\\nExtraction\\\\nEvaluation\\\\nAgent Benchmarking: Search + Calculator\\\\nAgent VectorDB Question Answering Benchmarking\\\\nBenchmarking Template\\\\nData Augmented Question Answering\\\\nUsing Hugging Face Datasets\\\\nLLM Math\\\\nQuestion Answering Benchmarking: Paul Graham Essay\\\\nQuestion Answering Benchmarking: State of the Union Address\\\\nQA Generation\\\\nQuestion Answering\\\\nSQL Question Answering Benchmarking: Chinook\\\\n\\\\n\\\\n\\\\nReference\\\\n\\\\nInstallation\\\\nIntegrations\\\\nAPI References\\\\nPrompts\\\\nPromptTemplates\\\\nExample Selector\\\\n\\\\n\\\\nUtilities\\\\nPython REPL\\\\nSerpAPI\\\\nSearxNG Search\\\\nDocstore\\\\nText Splitter\\\\nEmbeddings\\\\nVectorStores\\\\n\\\\n\\\\nChains\\\\nAgents\\\\n\\\\n\\\\n\\\\nEcosystem\\\\n\\\\nLangChain Ecosystem\\\\nAI21 Labs\\\\nAtlasDB\\\\nBanana\\\\nCerebriumAI\\\\nChroma\\\\nCohere\\\\nDeepInfra\\\\nDeep Lake\\\\nForefrontAI\\\\nGoogle Search Wrapper\\\\nGoogle Serper Wrapper\\\\nGooseAI\\\\nGraphsignal\\\\nHazy Research\\\\nHelicone\\\\nHugging Face\\\\nMilvus\\\\nModal\\\\nNLPCloud\\\\nOpenAI\\\\nOpenSearch\\\\nPetals\\\\nPGVector\\\\nPinecone\\\\nPromptLayer\\\\nQdrant\\\\nRunhouse\\\\nSearxNG Search API\\\\nSerpAPI\\\\nStochasticAI\\\\nUnstructured\\\\nWeights & Biases\\\\nWeaviate\\\\nWolfram Alpha Wrapper\\\\nWriter\\\\n\\\\n\\\\n\\\\nAdditional Resources\\\\n\\\\nLangChainHub\\\\nGlossary\\\\nLangChain Gallery\\\\nDeployments\\\\nTracing\\\\nDiscord\\\\nProduction Support\\\\n\\\\n\\\\n\\\\n\\\\n\\\\n\\\\n\\\\n\\\\n\\\\n\\\\n\\\\n\\\\n\\\\n\\\\n\\\\n\\\\n\\\\n\\\\n\\\\n\\\\n\\\\n\\\\n\\\\n\\\\n\\\\n\\\\n\\\\n\\\\n\\\\n\\\\n\\\\n\\\\n\\\\n\\\\n\\\\n\\\\n\\\\n\\\\n\\\\n\\\\n.rst\\\\n\\\\n\\\\n\\\\n\\\\n\\\\n\\\\n\\\\n.pdf\\\\n\\\\n\\\\n\\\\n\\\\n\\\\n\\\\n\\\\n\\\\n\\\\n\\\\n\\\\n\\\\n\\\\n\\\\n\\\\n\\\\n\\\\n\\\\n\\\\nWelcome to LangChain\\\\n\\\\n\\\\n\\\\n\\\\n Contents \\\\n\\\\n\\\\n\\\\nGetting Started\\\\nModules\\\\nUse Cases\\\\nReference Docs\\\\nLangChain Ecosystem\\\\nAdditional Resources\\\\n\\\\n\\\\n\\\\n\\\\n\\\\n\\\\n\\\\n\\\\nWelcome to LangChain#\\\\nLangChain is a framework for developing applications powered by language models. We believe that the most powerful and differentiated applications will not only call out to a language model via an API, but will also:\\\\n\\\\nBe data-aware: connect a language model to other sources of data\\\\nBe agentic: allow a language model to interact with its environment\\\\n\\\\nThe LangChain framework is designed with the above principles in mind.\\\\nThis is the Python specific portion of the documentation. For a purely conceptual guide to LangChain, see here. For the JavaScript documentation, see here.\\\\n\\\\nGetting Started#\\\\nCheckout the below guide for a walkthrough of how to get started using LangChain to create an Language Model application.\\\\n\\\\nGetting Started Documentation\\\\n\\\\n\\\\n\\\\n\\\\n\\\\nModules#\\\\nThere are several main modules that LangChain provides support for.\\\\nFor each module we provide some examples to get started, how-to guides, reference docs, and conceptual guides.\\\\nThese modules are, in increasing order of complexity:\\\\n\\\\nModels: The various model types and model integrations LangChain supports.\\\\nPrompts: This includes prompt management, prompt optimization, and prompt serialization.\\\\nMemory: Memory is the concept of persisting state between calls of a chain/agent. LangChain provides a standard interface for memory, a collection of memory implementations, and examples of chains/agents that use memory.\\\\nIndexes: Language models are often more powerful when combined with your own text data - this module covers best practices for doing exactly that.\\\\nChains: Chains go beyond just a single LLM call, and are sequences of calls (whether to an LLM or a different utility). LangChain provides a standard interface for chains, lots of integrations with other tools, and end-to-end chains for common applications.\\\\nAgents: Agents involve an LLM making decisions about which Actions to take, taking that Action, seeing an Observation, and repeating that until done. LangChain provides a standard interface for agents, a selection of agents to choose from, and examples of end to end agents.\\\\n\\\\n\\\\n\\\\n\\\\n\\\\nUse Cases#\\\\nThe above modules can be used in a variety of ways. LangChain also provides guidance and assistance in this. Below are some of the common use cases LangChain supports.\\\\n\\\\nPersonal Assistants: The main LangChain use case. Personal assistants need to take actions, remember interactions, and have knowledge about your data.\\\\nQuestion Answering: The second big LangChain use case. Answering questions over specific documents, only utilizing the information in those documents to construct an answer.\\\\nChatbots: Since language models are good at producing text, that makes them ideal for creating chatbots.\\\\nQuerying Tabular Data: If you want to understand how to use LLMs to query data that is stored in a tabular format (csvs, SQL, dataframes, etc) you should read this page.\\\\nInteracting with APIs: Enabling LLMs to interact with APIs is extremely powerful in order to give them more up-to-date information and allow them to take actions.\\\\nExtraction: Extract structured information from text.\\\\nSummarization: Summarizing longer documents into shorter, more condensed chunks of information. A type of Data Augmented Generation.\\\\nEvaluation: Generative models are notoriously hard to evaluate with traditional metrics. One new way of evaluating them is using language models themselves to do the evaluation. LangChain provides some prompts/chains for assisting in this.\\\\n\\\\n\\\\n\\\\n\\\\n\\\\nReference Docs#\\\\nAll of LangChain’s reference documentation, in one place. Full documentation on all methods, classes, installation methods, and integration setups for LangChain.\\\\n\\\\nReference Documentation\\\\n\\\\n\\\\n\\\\n\\\\n\\\\nLangChain Ecosystem#\\\\nGuides for how other companies/products can be used with LangChain\\\\n\\\\nLangChain Ecosystem\\\\n\\\\n\\\\n\\\\n\\\\n\\\\nAdditional Resources#\\\\nAdditional collection of resources we think may be useful as you develop your application!\\\\n\\\\nLangChainHub: The LangChainHub is a place to share and explore other prompts, chains, and agents.\\\\nGlossary: A glossary of all related terms, papers, methods, etc. Whether implemented in LangChain or not!\\\\nGallery: A collection of our favorite projects that use LangChain. Useful for finding inspiration or seeing how things were done in other applications.\\\\nDeployments: A collection of instructions, code snippets, and template repositories for deploying LangChain apps.\\\\nTracing: A guide on using tracing in LangChain to visualize the execution of chains and agents.\\\\nModel Laboratory: Experimenting with different prompts, models, and chains is a big part of developing the best possible application. The ModelLaboratory makes it easy to do so.\\\\nDiscord: Join us on our Discord to discuss all things LangChain!\\\\nProduction Support: As you move your LangChains into production, we’d love to offer more comprehensive support. Please fill out this form and we’ll set up a dedicated support Slack channel.\\\\n\\\\n\\\\n\\\\n\\\\n\\\\n\\\\n\\\\n\\\\n\\\\n\\\\n\\\\nnext\\\\nQuickstart Guide\\\\n\\\\n\\\\n\\\\n\\\\n\\\\n\\\\n\\\\n\\\\n\\\\n Contents\\\\n \\\\n\\\\n\\\\nGetting Started\\\\nModules\\\\nUse Cases\\\\nReference Docs\\\\nLangChain Ecosystem\\\\nAdditional Resources\\\\n\\\\n\\\\n\\\\n\\\\n\\\\n\\\\n\\\\n\\\\n\\\\nBy Harrison Chase\\\\n\\\\n\\\\n\\\\n\\\\n \\\\n Β© Copyright 2023, Harrison Chase.\\\\n \\\\n\\\\n\\\\n\\\\n\\\\n Last updated on Mar 27, 2023.\\\\n \\\\n\\\\n\\\\n\\\\n\\\\n\\\\n\\\\n\\\\n\\\\n\\\\n\\\\n\\\\n\\\\n\\\\n\\\\n\\\\n\\', lookup_str=\\'\\', metadata={\\'source\\': \\'https://python.langchain.com/en/latest/\\', \\'loc\\': \\'https://python.langchain.com/en/latest/\\', \\'lastmod\\': \\'2023-03-27T22:50:49.790324+00:00\\', \\'changefreq\\': \\'daily\\', \\'priority\\': \\'0.9\\'}, lookup_index=0)Add custom scraping rules\\u200bThe SitemapLoader uses beautifulsoup4 for the scraping process, and it scrapes every element on the page by default. The SitemapLoader constructor accepts a custom scraping function. This feature can be helpful to tailor the scraping process to your specific needs; for example, you might want to avoid scraping headers or navigation elements. The following example shows how to develop and use a custom function to avoid navigation and header elements.Import the beautifulsoup4 library and define the custom function.pip install beautifulsoup4from bs4 import BeautifulSoupdef remove_nav_and_header_elements(content: BeautifulSoup) -> str: # Find all \\'nav\\' and \\'header\\' elements in the BeautifulSoup object nav_elements = content.find_all(\"nav\") header_elements = content.find_all(\"header\") # Remove each \\'nav\\' and \\'header\\' element from the BeautifulSoup object for element in nav_elements + header_elements: element.decompose() return str(content.get_text())Add your custom function to the SitemapLoader object.loader = SitemapLoader( \"https://langchain.readthedocs.io/sitemap.xml\", filter_urls=[\"https://python.langchain.com/en/latest/\"], parsing_function=remove_nav_and_header_elements,)Local Sitemap\\u200bThe sitemap loader can also be used to load local files.sitemap_loader = SitemapLoader(web_path=\"example_data/sitemap.xml\", is_local=True)docs = sitemap_loader.load() Fetching pages: 100%|####################################################################################################################################| 3/3 [00:00<00:00, 3.91it/s]PreviousRSTNextSlackFiltering sitemap URLsAdd custom scraping rulesLocal SitemapCommunityDiscordTwitterGitHubPythonJS/TSMoreHomepageBlogCopyright Β© 2023 LangChain, Inc.\\n\\n\\n\\n', metadata={'source': 'https://python.langchain.com/docs/integrations/document_loaders/sitemap', 'loc': 'https://python.langchain.com/docs/integrations/document_loaders/sitemap', 'changefreq': 'weekly', 'priority': '0.5'})" + ] + }, + "execution_count": 16, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "documents[0]" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Add custom scraping rules\n", + "\n", + "By default, the parser **removes** all but the main content of the docusaurus page, which is normally the `
` tag. You also have the option to define an **inclusive** list HTML tags by providing them as a list utilizing the `custom_html_tags` parameter. For example:" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "loader = DocusaurusLoader(\n", + " \"https://python.langchain.com\",\n", + " filter_urls=[\"https://python.langchain.com/docs/integrations/document_loaders/sitemap\"],\n", + " # This will only include the content that matches these tags, otherwise they will be removed\n", + " custom_html_tags=[\"#content\", \".main\"]\n", + ")" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "You can also define an entirely custom parsing function if you need finer-grained control over the returned content for each page.\n", + "\n", + "The following example shows how to develop and use a custom function to avoid navigation and header elements." + ] + }, + { + "cell_type": "code", + "execution_count": 17, + "metadata": {}, + "outputs": [], + "source": [ + "from bs4 import BeautifulSoup\n", + "\n", + "\n", + "def remove_nav_and_header_elements(content: BeautifulSoup) -> str:\n", + " # Find all 'nav' and 'header' elements in the BeautifulSoup object\n", + " nav_elements = content.find_all(\"nav\")\n", + " header_elements = content.find_all(\"header\")\n", + "\n", + " # Remove each 'nav' and 'header' element from the BeautifulSoup object\n", + " for element in nav_elements + header_elements:\n", + " element.decompose()\n", + "\n", + " return str(content.get_text())" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Add your custom function to the `DocusaurusLoader` object." + ] + }, + { + "cell_type": "code", + "execution_count": 18, + "metadata": {}, + "outputs": [], + "source": [ + "loader = DocusaurusLoader(\n", + " \"https://python.langchain.com\",\n", + " filter_urls=[\"https://python.langchain.com/docs/integrations/document_loaders/sitemap\"],\n", + " parsing_function=remove_nav_and_header_elements,\n", + ")" + ] + } + ], + "metadata": { + "kernelspec": { + "display_name": "Python 3 (ipykernel)", + "language": "python", + "name": "python3" + }, + "language_info": { + "codemirror_mode": { + "name": "ipython", + "version": 3 + }, + "file_extension": ".py", + "mimetype": "text/x-python", + "name": "python", + "nbconvert_exporter": "python", + "pygments_lexer": "ipython3", + "version": "3.9.18" + } + }, + "nbformat": 4, + "nbformat_minor": 4 +} diff --git a/libs/langchain/langchain/document_loaders/__init__.py b/libs/langchain/langchain/document_loaders/__init__.py index 730e2400b67..96cfd9e1b54 100644 --- a/libs/langchain/langchain/document_loaders/__init__.py +++ b/libs/langchain/langchain/document_loaders/__init__.py @@ -67,6 +67,7 @@ from langchain.document_loaders.diffbot import DiffbotLoader from langchain.document_loaders.directory import DirectoryLoader from langchain.document_loaders.discord import DiscordChatLoader from langchain.document_loaders.docugami import DocugamiLoader +from langchain.document_loaders.docusaurus import DocusaurusLoader from langchain.document_loaders.dropbox import DropboxLoader from langchain.document_loaders.duckdb_loader import DuckDBLoader from langchain.document_loaders.email import ( @@ -250,6 +251,7 @@ __all__ = [ "DirectoryLoader", "DiscordChatLoader", "DocugamiLoader", + "DocusaurusLoader", "Docx2txtLoader", "DropboxLoader", "DuckDBLoader", diff --git a/libs/langchain/langchain/document_loaders/docusaurus.py b/libs/langchain/langchain/document_loaders/docusaurus.py new file mode 100644 index 00000000000..3d434156d83 --- /dev/null +++ b/libs/langchain/langchain/document_loaders/docusaurus.py @@ -0,0 +1,49 @@ +"""Load Documents from Docusarus Documentation""" +from typing import Any, List, Optional + +from langchain.document_loaders.sitemap import SitemapLoader + + +class DocusaurusLoader(SitemapLoader): + """ + Loader that leverages the SitemapLoader to loop through the generated pages of a + Docusaurus Documentation website and extracts the content by looking for specific + HTML tags. By default, the parser searches for the main content of the Docusaurus + page, which is normally the
. You also have the option to define your own + custom HTML tags by providing them as a list, for example: ["div", ".main", "a"]. + """ + + def __init__( + self, + url: str, + custom_html_tags: Optional[List[str]] = None, + **kwargs: Any, + ): + """ + Initialize DocusaurusLoader + Args: + url: The base URL of the Docusaurus website. + custom_html_tags: Optional custom html tags to extract content from pages. + kwargs: Additional args to extend the underlying SitemapLoader, for example: + filter_urls, blocksize, meta_function, is_local, continue_on_failure + """ + if not kwargs.get("is_local"): + url = f"{url}/sitemap.xml" + + self.custom_html_tags = custom_html_tags or ["main article"] + + super().__init__( + url, + parsing_function=kwargs.get("parsing_function") or self._parsing_function, + **kwargs, + ) + + def _parsing_function(self, content: Any) -> str: + """Parses specific elements from a Docusarus page.""" + relevant_elements = content.select(",".join(self.custom_html_tags)) + + for element in relevant_elements: + if element not in relevant_elements: + element.decompose() + + return str(content.get_text()) diff --git a/libs/langchain/tests/integration_tests/document_loaders/test_docusaurus.py b/libs/langchain/tests/integration_tests/document_loaders/test_docusaurus.py new file mode 100644 index 00000000000..53323ae9e4e --- /dev/null +++ b/libs/langchain/tests/integration_tests/document_loaders/test_docusaurus.py @@ -0,0 +1,43 @@ +from pathlib import Path + +from langchain.document_loaders import DocusaurusLoader + +DOCS_URL = str(Path(__file__).parent.parent / "examples/docusaurus-sitemap.xml") + + +def test_docusarus() -> None: + """Test sitemap loader.""" + loader = DocusaurusLoader(DOCS_URL, is_local=True) + documents = loader.load() + assert len(documents) > 1 + assert "πŸ¦œοΈπŸ”— Langchain" in documents[0].page_content + + +def test_filter_docusaurus_sitemap() -> None: + """Test sitemap loader.""" + loader = DocusaurusLoader( + DOCS_URL, + is_local=True, + filter_urls=[ + "https://python.langchain.com/docs/integrations/document_loaders/sitemap" + ], + ) + documents = loader.load() + assert len(documents) == 1 + assert "SitemapLoader" in documents[0].page_content + + +def test_docusarus_metadata() -> None: + def sitemap_metadata_one(meta: dict, _content: None) -> dict: + return {**meta, "mykey": "Super Important Metadata"} + + """Test sitemap loader.""" + loader = DocusaurusLoader( + DOCS_URL, + is_local=True, + meta_function=sitemap_metadata_one, + ) + documents = loader.load() + assert len(documents) > 1 + assert "mykey" in documents[0].metadata + assert "Super Important Metadata" in documents[0].metadata["mykey"] diff --git a/libs/langchain/tests/integration_tests/examples/docusaurus-sitemap.xml b/libs/langchain/tests/integration_tests/examples/docusaurus-sitemap.xml new file mode 100644 index 00000000000..eebae785b88 --- /dev/null +++ b/libs/langchain/tests/integration_tests/examples/docusaurus-sitemap.xml @@ -0,0 +1,42 @@ + + + + https://python.langchain.com/docs/integrations/document_loaders/sitemap + weekly + 0.5 + + + https://python.langchain.com/cookbook + weekly + 0.5 + + + https://python.langchain.com/docs/additional_resources + weekly + 0.5 + + + https://python.langchain.com/docs/modules/chains/how_to/ + weekly + 0.5 + + + https://python.langchain.com/docs/use_cases/question_answering/local_retrieval_qa + weekly + 0.5 + + + https://python.langchain.com/docs/use_cases/summarization + weekly + 0.5 + + + https://python.langchain.com/ + weekly + 0.5 + + \ No newline at end of file From 8fdf15c02381bb212e74d4b91ef13704fb49881c Mon Sep 17 00:00:00 2001 From: Erick Friis Date: Fri, 10 Nov 2023 14:52:01 -0800 Subject: [PATCH 10/14] Fix Document Loader Unit Test - Docusaurus (#13228) --- libs/langchain/tests/unit_tests/document_loaders/test_imports.py | 1 + 1 file changed, 1 insertion(+) diff --git a/libs/langchain/tests/unit_tests/document_loaders/test_imports.py b/libs/langchain/tests/unit_tests/document_loaders/test_imports.py index 18d3c31f537..9f35b895e46 100644 --- a/libs/langchain/tests/unit_tests/document_loaders/test_imports.py +++ b/libs/langchain/tests/unit_tests/document_loaders/test_imports.py @@ -47,6 +47,7 @@ EXPECTED_ALL = [ "DirectoryLoader", "DiscordChatLoader", "DocugamiLoader", + "DocusaurusLoader", "Docx2txtLoader", "DropboxLoader", "DuckDBLoader", From 1a1a1a883f0f76b6b9535eec87712735e6c77fae Mon Sep 17 00:00:00 2001 From: Andrew Zhou <44193474+adrwz@users.noreply.github.com> Date: Fri, 10 Nov 2023 17:53:57 -0500 Subject: [PATCH 11/14] fleet_context docs update (#13221) - **Description:** Changed the fleet_context documentation to use `context.download_embeddings()` from the latest release from our package. More details here: https://github.com/fleet-ai/context/tree/main#api - **Issue:** n/a - **Dependencies:** n/a - **Tag maintainer:** @baskaryan - **Twitter handle:** @andrewthezhou --- .../integrations/retrievers/fleet_context.ipynb | 17 ++++++++++------- 1 file changed, 10 insertions(+), 7 deletions(-) diff --git a/docs/docs/integrations/retrievers/fleet_context.ipynb b/docs/docs/integrations/retrievers/fleet_context.ipynb index 10f4145b7c1..4a57d3f7953 100644 --- a/docs/docs/integrations/retrievers/fleet_context.ipynb +++ b/docs/docs/integrations/retrievers/fleet_context.ipynb @@ -19,7 +19,7 @@ "metadata": {}, "outputs": [], "source": [ - "!pip install langchain openai pandas faiss-cpu # faiss-gpu for CUDA supported GPU" + "!pip install langchain fleet-context openai pandas faiss-cpu # faiss-gpu for CUDA supported GPU" ] }, { @@ -43,13 +43,12 @@ "\n", "\n", "def load_fleet_retriever(\n", - " url: str,\n", + " df: pd.DataFrame,\n", " *,\n", " vectorstore_cls: Type[VectorStore] = FAISS,\n", " docstore: Optional[BaseStore] = None,\n", " **kwargs: Any,\n", "):\n", - " df = pd.read_parquet(url)\n", " vectorstore = _populate_vectorstore(df, vectorstore_cls)\n", " if docstore is None:\n", " return vectorstore.as_retriever(**kwargs)\n", @@ -106,7 +105,10 @@ "source": [ "## Retriever chunks\n", "\n", - "As part of their embedding process, the Fleet AI team first chunked long documents before embedding them. This means the vectors correspond to sections of pages in the LangChain docs, not entire pages. By default, when we spin up a retriever from these embeddings, we'll be retrieving these embedded chunks:" + "As part of their embedding process, the Fleet AI team first chunked long documents before embedding them. This means the vectors correspond to sections of pages in the LangChain docs, not entire pages. By default, when we spin up a retriever from these embeddings, we'll be retrieving these embedded chunks.", + "\n", + "\n", + "We will be using Fleet Context's `download_embeddings()` to grab Langchain's documentation embeddings. You can view all supported libraries' documentation at https://fleet.so/context." ] }, { @@ -116,9 +118,10 @@ "metadata": {}, "outputs": [], "source": [ - "vecstore_retriever = load_fleet_retriever(\n", - " \"https://www.dropbox.com/scl/fi/4rescpkrg9970s3huz47l/libraries_langchain_release.parquet?rlkey=283knw4wamezfwiidgpgptkep&dl=1\",\n", - ")" + "from context import download_embeddings\n", + "\n", + "df = download_embeddings(\"langchain\")\n", + "vecstore_retriever = load_fleet_retriever(df)" ] }, { From 180657ca7ad9acc1c3e2771de1fb26a1cddd3e91 Mon Sep 17 00:00:00 2001 From: Matvey Arye Date: Fri, 10 Nov 2023 19:12:32 -0500 Subject: [PATCH 12/14] Add template for conversational rag with timescale vector (#13041) **Description:** This is like the rag-conversation template in many ways. What's different is: - support for a timescale vector store. - support for time-based filters. - support for metadata filters. --------- Co-authored-by: Erick Friis --- templates/rag-timescale-conversation/LICENSE | 21 + .../rag-timescale-conversation/README.md | 80 + .../rag-timescale-conversation/poetry.lock | 1930 +++++++++++++++++ .../rag-timescale-conversation/pyproject.toml | 31 + .../rag_conversation.ipynb | 238 ++ .../rag_timescale_conversation/__init__.py | 3 + .../rag_timescale_conversation/chain.py | 164 ++ .../load_sample_dataset.py | 84 + .../tests/__init__.py | 0 9 files changed, 2551 insertions(+) create mode 100644 templates/rag-timescale-conversation/LICENSE create mode 100644 templates/rag-timescale-conversation/README.md create mode 100644 templates/rag-timescale-conversation/poetry.lock create mode 100644 templates/rag-timescale-conversation/pyproject.toml create mode 100644 templates/rag-timescale-conversation/rag_conversation.ipynb create mode 100644 templates/rag-timescale-conversation/rag_timescale_conversation/__init__.py create mode 100644 templates/rag-timescale-conversation/rag_timescale_conversation/chain.py create mode 100644 templates/rag-timescale-conversation/rag_timescale_conversation/load_sample_dataset.py create mode 100644 templates/rag-timescale-conversation/tests/__init__.py diff --git a/templates/rag-timescale-conversation/LICENSE b/templates/rag-timescale-conversation/LICENSE new file mode 100644 index 00000000000..426b6509034 --- /dev/null +++ b/templates/rag-timescale-conversation/LICENSE @@ -0,0 +1,21 @@ +MIT License + +Copyright (c) 2023 LangChain, Inc. + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. diff --git a/templates/rag-timescale-conversation/README.md b/templates/rag-timescale-conversation/README.md new file mode 100644 index 00000000000..6a7fdebd68c --- /dev/null +++ b/templates/rag-timescale-conversation/README.md @@ -0,0 +1,80 @@ + +# rag-timescale-conversation + +This template is used for [conversational](https://python.langchain.com/docs/expression_language/cookbook/retrieval#conversational-retrieval-chain) [retrieval](https://python.langchain.com/docs/use_cases/question_answering/), which is one of the most popular LLM use-cases. + +It passes both a conversation history and retrieved documents into an LLM for synthesis. + +## Environment Setup + +This template uses Timescale Vector as a vectorstore and requires that `TIMESCALES_SERVICE_URL`. Signup for a 90-day trial [here](https://console.cloud.timescale.com/signup?utm_campaign=vectorlaunch&utm_source=langchain&utm_medium=referral) if you don't yet have an account. + +To load the sample dataset, set `LOAD_SAMPLE_DATA=1`. To load your own dataset see the section below. + +Set the `OPENAI_API_KEY` environment variable to access the OpenAI models. + +## Usage + +To use this package, you should first have the LangChain CLI installed: + +```shell +pip install -U "langchain-cli[serve]" +``` + +To create a new LangChain project and install this as the only package, you can do: + +```shell +langchain app new my-app --package rag-timescale-conversation +``` + +If you want to add this to an existing project, you can just run: + +```shell +langchain app add rag-timescale-conversation +``` + +And add the following code to your `server.py` file: +```python +from rag_timescale_conversation import chain as rag_timescale_conversation_chain + +add_routes(app, rag_timescale_conversation_chain, path="/rag-timescale_conversation") +``` + +(Optional) Let's now configure LangSmith. +LangSmith will help us trace, monitor and debug LangChain applications. +LangSmith is currently in private beta, you can sign up [here](https://smith.langchain.com/). +If you don't have access, you can skip this section + +```shell +export LANGCHAIN_TRACING_V2=true +export LANGCHAIN_API_KEY= +export LANGCHAIN_PROJECT= # if not specified, defaults to "default" +``` + +If you are inside this directory, then you can spin up a LangServe instance directly by: + +```shell +langchain serve +``` + +This will start the FastAPI app with a server is running locally at +[http://localhost:8000](http://localhost:8000) + +We can see all templates at [http://127.0.0.1:8000/docs](http://127.0.0.1:8000/docs) +We can access the playground at [http://127.0.0.1:8000/rag-timescale-conversation/playground](http://127.0.0.1:8000/rag-timescale-conversation/playground) + +We can access the template from code with: + +```python +from langserve.client import RemoteRunnable + +runnable = RemoteRunnable("http://localhost:8000/rag-timescale-conversation") +``` + +See the `rag_conversation.ipynb` notebook for example usage. + +## Loading your own dataset + +To load your own dataset you will have to create a `load_dataset` function. You can see an example, in the +`load_ts_git_dataset` function defined in the `load_sample_dataset.py` file. You can then run this as a +standalone function (e.g. in a bash script) or add it to chain.py (but then you should run it just once). \ No newline at end of file diff --git a/templates/rag-timescale-conversation/poetry.lock b/templates/rag-timescale-conversation/poetry.lock new file mode 100644 index 00000000000..269142981cb --- /dev/null +++ b/templates/rag-timescale-conversation/poetry.lock @@ -0,0 +1,1930 @@ +# This file is automatically @generated by Poetry 1.6.1 and should not be changed by hand. + +[[package]] +name = "aiohttp" +version = "3.8.6" +description = "Async http client/server framework (asyncio)" +optional = false +python-versions = ">=3.6" +files = [ + {file = "aiohttp-3.8.6-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:41d55fc043954cddbbd82503d9cc3f4814a40bcef30b3569bc7b5e34130718c1"}, + {file = "aiohttp-3.8.6-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:1d84166673694841d8953f0a8d0c90e1087739d24632fe86b1a08819168b4566"}, + {file = "aiohttp-3.8.6-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:253bf92b744b3170eb4c4ca2fa58f9c4b87aeb1df42f71d4e78815e6e8b73c9e"}, + {file = "aiohttp-3.8.6-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:3fd194939b1f764d6bb05490987bfe104287bbf51b8d862261ccf66f48fb4096"}, + {file = "aiohttp-3.8.6-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:6c5f938d199a6fdbdc10bbb9447496561c3a9a565b43be564648d81e1102ac22"}, + {file = "aiohttp-3.8.6-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:2817b2f66ca82ee699acd90e05c95e79bbf1dc986abb62b61ec8aaf851e81c93"}, + {file = "aiohttp-3.8.6-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:0fa375b3d34e71ccccf172cab401cd94a72de7a8cc01847a7b3386204093bb47"}, + {file = "aiohttp-3.8.6-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:9de50a199b7710fa2904be5a4a9b51af587ab24c8e540a7243ab737b45844543"}, + {file = "aiohttp-3.8.6-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:e1d8cb0b56b3587c5c01de3bf2f600f186da7e7b5f7353d1bf26a8ddca57f965"}, + {file = "aiohttp-3.8.6-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:8e31e9db1bee8b4f407b77fd2507337a0a80665ad7b6c749d08df595d88f1cf5"}, + {file = "aiohttp-3.8.6-cp310-cp310-musllinux_1_1_ppc64le.whl", hash = "sha256:7bc88fc494b1f0311d67f29fee6fd636606f4697e8cc793a2d912ac5b19aa38d"}, + {file = "aiohttp-3.8.6-cp310-cp310-musllinux_1_1_s390x.whl", hash = "sha256:ec00c3305788e04bf6d29d42e504560e159ccaf0be30c09203b468a6c1ccd3b2"}, + {file = "aiohttp-3.8.6-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:ad1407db8f2f49329729564f71685557157bfa42b48f4b93e53721a16eb813ed"}, + {file = "aiohttp-3.8.6-cp310-cp310-win32.whl", hash = "sha256:ccc360e87341ad47c777f5723f68adbb52b37ab450c8bc3ca9ca1f3e849e5fe2"}, + {file = "aiohttp-3.8.6-cp310-cp310-win_amd64.whl", hash = "sha256:93c15c8e48e5e7b89d5cb4613479d144fda8344e2d886cf694fd36db4cc86865"}, + {file = "aiohttp-3.8.6-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:6e2f9cc8e5328f829f6e1fb74a0a3a939b14e67e80832975e01929e320386b34"}, + {file = "aiohttp-3.8.6-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:e6a00ffcc173e765e200ceefb06399ba09c06db97f401f920513a10c803604ca"}, + {file = "aiohttp-3.8.6-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:41bdc2ba359032e36c0e9de5a3bd00d6fb7ea558a6ce6b70acedf0da86458321"}, + {file = "aiohttp-3.8.6-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:14cd52ccf40006c7a6cd34a0f8663734e5363fd981807173faf3a017e202fec9"}, + {file = "aiohttp-3.8.6-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:2d5b785c792802e7b275c420d84f3397668e9d49ab1cb52bd916b3b3ffcf09ad"}, + {file = "aiohttp-3.8.6-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:1bed815f3dc3d915c5c1e556c397c8667826fbc1b935d95b0ad680787896a358"}, + {file = "aiohttp-3.8.6-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:96603a562b546632441926cd1293cfcb5b69f0b4159e6077f7c7dbdfb686af4d"}, + {file = "aiohttp-3.8.6-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:d76e8b13161a202d14c9584590c4df4d068c9567c99506497bdd67eaedf36403"}, + {file = "aiohttp-3.8.6-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:e3f1e3f1a1751bb62b4a1b7f4e435afcdade6c17a4fd9b9d43607cebd242924a"}, + {file = "aiohttp-3.8.6-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:76b36b3124f0223903609944a3c8bf28a599b2cc0ce0be60b45211c8e9be97f8"}, + {file = "aiohttp-3.8.6-cp311-cp311-musllinux_1_1_ppc64le.whl", hash = "sha256:a2ece4af1f3c967a4390c284797ab595a9f1bc1130ef8b01828915a05a6ae684"}, + {file = "aiohttp-3.8.6-cp311-cp311-musllinux_1_1_s390x.whl", hash = "sha256:16d330b3b9db87c3883e565340d292638a878236418b23cc8b9b11a054aaa887"}, + {file = "aiohttp-3.8.6-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:42c89579f82e49db436b69c938ab3e1559e5a4409eb8639eb4143989bc390f2f"}, + {file = "aiohttp-3.8.6-cp311-cp311-win32.whl", hash = "sha256:efd2fcf7e7b9d7ab16e6b7d54205beded0a9c8566cb30f09c1abe42b4e22bdcb"}, + {file = "aiohttp-3.8.6-cp311-cp311-win_amd64.whl", hash = "sha256:3b2ab182fc28e7a81f6c70bfbd829045d9480063f5ab06f6e601a3eddbbd49a0"}, + {file = "aiohttp-3.8.6-cp36-cp36m-macosx_10_9_x86_64.whl", hash = "sha256:fdee8405931b0615220e5ddf8cd7edd8592c606a8e4ca2a00704883c396e4479"}, + {file = "aiohttp-3.8.6-cp36-cp36m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:d25036d161c4fe2225d1abff2bd52c34ed0b1099f02c208cd34d8c05729882f0"}, + {file = "aiohttp-3.8.6-cp36-cp36m-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:5d791245a894be071d5ab04bbb4850534261a7d4fd363b094a7b9963e8cdbd31"}, + {file = "aiohttp-3.8.6-cp36-cp36m-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:0cccd1de239afa866e4ce5c789b3032442f19c261c7d8a01183fd956b1935349"}, + {file = "aiohttp-3.8.6-cp36-cp36m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:1f13f60d78224f0dace220d8ab4ef1dbc37115eeeab8c06804fec11bec2bbd07"}, + {file = "aiohttp-3.8.6-cp36-cp36m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:8a9b5a0606faca4f6cc0d338359d6fa137104c337f489cd135bb7fbdbccb1e39"}, + {file = "aiohttp-3.8.6-cp36-cp36m-musllinux_1_1_aarch64.whl", hash = "sha256:13da35c9ceb847732bf5c6c5781dcf4780e14392e5d3b3c689f6d22f8e15ae31"}, + {file = "aiohttp-3.8.6-cp36-cp36m-musllinux_1_1_i686.whl", hash = "sha256:4d4cbe4ffa9d05f46a28252efc5941e0462792930caa370a6efaf491f412bc66"}, + {file = "aiohttp-3.8.6-cp36-cp36m-musllinux_1_1_ppc64le.whl", hash = "sha256:229852e147f44da0241954fc6cb910ba074e597f06789c867cb7fb0621e0ba7a"}, + {file = "aiohttp-3.8.6-cp36-cp36m-musllinux_1_1_s390x.whl", hash = "sha256:713103a8bdde61d13490adf47171a1039fd880113981e55401a0f7b42c37d071"}, + {file = "aiohttp-3.8.6-cp36-cp36m-musllinux_1_1_x86_64.whl", hash = "sha256:45ad816b2c8e3b60b510f30dbd37fe74fd4a772248a52bb021f6fd65dff809b6"}, + {file = "aiohttp-3.8.6-cp36-cp36m-win32.whl", hash = "sha256:2b8d4e166e600dcfbff51919c7a3789ff6ca8b3ecce16e1d9c96d95dd569eb4c"}, + {file = "aiohttp-3.8.6-cp36-cp36m-win_amd64.whl", hash = "sha256:0912ed87fee967940aacc5306d3aa8ba3a459fcd12add0b407081fbefc931e53"}, + {file = "aiohttp-3.8.6-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:e2a988a0c673c2e12084f5e6ba3392d76c75ddb8ebc6c7e9ead68248101cd446"}, + {file = "aiohttp-3.8.6-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:ebf3fd9f141700b510d4b190094db0ce37ac6361a6806c153c161dc6c041ccda"}, + {file = "aiohttp-3.8.6-cp37-cp37m-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:3161ce82ab85acd267c8f4b14aa226047a6bee1e4e6adb74b798bd42c6ae1f80"}, + {file = "aiohttp-3.8.6-cp37-cp37m-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:d95fc1bf33a9a81469aa760617b5971331cdd74370d1214f0b3109272c0e1e3c"}, + {file = "aiohttp-3.8.6-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:6c43ecfef7deaf0617cee936836518e7424ee12cb709883f2c9a1adda63cc460"}, + {file = "aiohttp-3.8.6-cp37-cp37m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:ca80e1b90a05a4f476547f904992ae81eda5c2c85c66ee4195bb8f9c5fb47f28"}, + {file = "aiohttp-3.8.6-cp37-cp37m-musllinux_1_1_aarch64.whl", hash = "sha256:90c72ebb7cb3a08a7f40061079817133f502a160561d0675b0a6adf231382c92"}, + {file = "aiohttp-3.8.6-cp37-cp37m-musllinux_1_1_i686.whl", hash = "sha256:bb54c54510e47a8c7c8e63454a6acc817519337b2b78606c4e840871a3e15349"}, + {file = "aiohttp-3.8.6-cp37-cp37m-musllinux_1_1_ppc64le.whl", hash = "sha256:de6a1c9f6803b90e20869e6b99c2c18cef5cc691363954c93cb9adeb26d9f3ae"}, + {file = "aiohttp-3.8.6-cp37-cp37m-musllinux_1_1_s390x.whl", hash = "sha256:a3628b6c7b880b181a3ae0a0683698513874df63783fd89de99b7b7539e3e8a8"}, + {file = "aiohttp-3.8.6-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:fc37e9aef10a696a5a4474802930079ccfc14d9f9c10b4662169671ff034b7df"}, + {file = "aiohttp-3.8.6-cp37-cp37m-win32.whl", hash = "sha256:f8ef51e459eb2ad8e7a66c1d6440c808485840ad55ecc3cafefadea47d1b1ba2"}, + {file = "aiohttp-3.8.6-cp37-cp37m-win_amd64.whl", hash = "sha256:b2fe42e523be344124c6c8ef32a011444e869dc5f883c591ed87f84339de5976"}, + {file = "aiohttp-3.8.6-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:9e2ee0ac5a1f5c7dd3197de309adfb99ac4617ff02b0603fd1e65b07dc772e4b"}, + {file = "aiohttp-3.8.6-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:01770d8c04bd8db568abb636c1fdd4f7140b284b8b3e0b4584f070180c1e5c62"}, + {file = "aiohttp-3.8.6-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:3c68330a59506254b556b99a91857428cab98b2f84061260a67865f7f52899f5"}, + {file = "aiohttp-3.8.6-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:89341b2c19fb5eac30c341133ae2cc3544d40d9b1892749cdd25892bbc6ac951"}, + {file = "aiohttp-3.8.6-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:71783b0b6455ac8f34b5ec99d83e686892c50498d5d00b8e56d47f41b38fbe04"}, + {file = "aiohttp-3.8.6-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:f628dbf3c91e12f4d6c8b3f092069567d8eb17814aebba3d7d60c149391aee3a"}, + {file = "aiohttp-3.8.6-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:b04691bc6601ef47c88f0255043df6f570ada1a9ebef99c34bd0b72866c217ae"}, + {file = "aiohttp-3.8.6-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:7ee912f7e78287516df155f69da575a0ba33b02dd7c1d6614dbc9463f43066e3"}, + {file = "aiohttp-3.8.6-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:9c19b26acdd08dd239e0d3669a3dddafd600902e37881f13fbd8a53943079dbc"}, + {file = "aiohttp-3.8.6-cp38-cp38-musllinux_1_1_i686.whl", hash = "sha256:99c5ac4ad492b4a19fc132306cd57075c28446ec2ed970973bbf036bcda1bcc6"}, + {file = "aiohttp-3.8.6-cp38-cp38-musllinux_1_1_ppc64le.whl", hash = "sha256:f0f03211fd14a6a0aed2997d4b1c013d49fb7b50eeb9ffdf5e51f23cfe2c77fa"}, + {file = "aiohttp-3.8.6-cp38-cp38-musllinux_1_1_s390x.whl", hash = "sha256:8d399dade330c53b4106160f75f55407e9ae7505263ea86f2ccca6bfcbdb4921"}, + {file = "aiohttp-3.8.6-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:ec4fd86658c6a8964d75426517dc01cbf840bbf32d055ce64a9e63a40fd7b771"}, + {file = "aiohttp-3.8.6-cp38-cp38-win32.whl", hash = "sha256:33164093be11fcef3ce2571a0dccd9041c9a93fa3bde86569d7b03120d276c6f"}, + {file = "aiohttp-3.8.6-cp38-cp38-win_amd64.whl", hash = "sha256:bdf70bfe5a1414ba9afb9d49f0c912dc524cf60141102f3a11143ba3d291870f"}, + {file = "aiohttp-3.8.6-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:d52d5dc7c6682b720280f9d9db41d36ebe4791622c842e258c9206232251ab2b"}, + {file = "aiohttp-3.8.6-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:4ac39027011414dbd3d87f7edb31680e1f430834c8cef029f11c66dad0670aa5"}, + {file = "aiohttp-3.8.6-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:3f5c7ce535a1d2429a634310e308fb7d718905487257060e5d4598e29dc17f0b"}, + {file = "aiohttp-3.8.6-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:b30e963f9e0d52c28f284d554a9469af073030030cef8693106d918b2ca92f54"}, + {file = "aiohttp-3.8.6-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:918810ef188f84152af6b938254911055a72e0f935b5fbc4c1a4ed0b0584aed1"}, + {file = "aiohttp-3.8.6-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:002f23e6ea8d3dd8d149e569fd580c999232b5fbc601c48d55398fbc2e582e8c"}, + {file = "aiohttp-3.8.6-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:4fcf3eabd3fd1a5e6092d1242295fa37d0354b2eb2077e6eb670accad78e40e1"}, + {file = "aiohttp-3.8.6-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:255ba9d6d5ff1a382bb9a578cd563605aa69bec845680e21c44afc2670607a95"}, + {file = "aiohttp-3.8.6-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:d67f8baed00870aa390ea2590798766256f31dc5ed3ecc737debb6e97e2ede78"}, + {file = "aiohttp-3.8.6-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:86f20cee0f0a317c76573b627b954c412ea766d6ada1a9fcf1b805763ae7feeb"}, + {file = "aiohttp-3.8.6-cp39-cp39-musllinux_1_1_ppc64le.whl", hash = "sha256:39a312d0e991690ccc1a61f1e9e42daa519dcc34ad03eb6f826d94c1190190dd"}, + {file = "aiohttp-3.8.6-cp39-cp39-musllinux_1_1_s390x.whl", hash = "sha256:e827d48cf802de06d9c935088c2924e3c7e7533377d66b6f31ed175c1620e05e"}, + {file = "aiohttp-3.8.6-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:bd111d7fc5591ddf377a408ed9067045259ff2770f37e2d94e6478d0f3fc0c17"}, + {file = "aiohttp-3.8.6-cp39-cp39-win32.whl", hash = "sha256:caf486ac1e689dda3502567eb89ffe02876546599bbf915ec94b1fa424eeffd4"}, + {file = "aiohttp-3.8.6-cp39-cp39-win_amd64.whl", hash = "sha256:3f0e27e5b733803333bb2371249f41cf42bae8884863e8e8965ec69bebe53132"}, + {file = "aiohttp-3.8.6.tar.gz", hash = "sha256:b0cf2a4501bff9330a8a5248b4ce951851e415bdcce9dc158e76cfd55e15085c"}, +] + +[package.dependencies] +aiosignal = ">=1.1.2" +async-timeout = ">=4.0.0a3,<5.0" +attrs = ">=17.3.0" +charset-normalizer = ">=2.0,<4.0" +frozenlist = ">=1.1.1" +multidict = ">=4.5,<7.0" +yarl = ">=1.0,<2.0" + +[package.extras] +speedups = ["Brotli", "aiodns", "cchardet"] + +[[package]] +name = "aiosignal" +version = "1.3.1" +description = "aiosignal: a list of registered asynchronous callbacks" +optional = false +python-versions = ">=3.7" +files = [ + {file = "aiosignal-1.3.1-py3-none-any.whl", hash = "sha256:f8376fb07dd1e86a584e4fcdec80b36b7f81aac666ebc724e2c090300dd83b17"}, + {file = "aiosignal-1.3.1.tar.gz", hash = "sha256:54cd96e15e1649b75d6c87526a6ff0b6c1b0dd3459f43d9ca11d48c339b68cfc"}, +] + +[package.dependencies] +frozenlist = ">=1.1.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.dependencies] +typing-extensions = {version = ">=4.0.0", markers = "python_version < \"3.9\""} + +[[package]] +name = "anyio" +version = "3.7.1" +description = "High level compatibility layer for multiple asynchronous event loop implementations" +optional = false +python-versions = ">=3.7" +files = [ + {file = "anyio-3.7.1-py3-none-any.whl", hash = "sha256:91dee416e570e92c64041bd18b900d1d6fa78dff7048769ce5ac5ddad004fbb5"}, + {file = "anyio-3.7.1.tar.gz", hash = "sha256:44a3c9aba0f5defa43261a8b3efb97891f2bd7d804e0e1f56419befa1adfc780"}, +] + +[package.dependencies] +exceptiongroup = {version = "*", markers = "python_version < \"3.11\""} +idna = ">=2.8" +sniffio = ">=1.1" + +[package.extras] +doc = ["Sphinx", "packaging", "sphinx-autodoc-typehints (>=1.2.0)", "sphinx-rtd-theme (>=1.2.2)", "sphinxcontrib-jquery"] +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 = "async-timeout" +version = "4.0.3" +description = "Timeout context manager for asyncio programs" +optional = false +python-versions = ">=3.7" +files = [ + {file = "async-timeout-4.0.3.tar.gz", hash = "sha256:4640d96be84d82d02ed59ea2b7105a0f7b33abe8703703cd0ab0bf87c427522f"}, + {file = "async_timeout-4.0.3-py3-none-any.whl", hash = "sha256:7405140ff1230c310e51dc27b3145b9092d659ce68ff733fb0cefe3ee42be028"}, +] + +[[package]] +name = "asyncpg" +version = "0.29.0" +description = "An asyncio PostgreSQL driver" +optional = false +python-versions = ">=3.8.0" +files = [ + {file = "asyncpg-0.29.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:72fd0ef9f00aeed37179c62282a3d14262dbbafb74ec0ba16e1b1864d8a12169"}, + {file = "asyncpg-0.29.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:52e8f8f9ff6e21f9b39ca9f8e3e33a5fcdceaf5667a8c5c32bee158e313be385"}, + {file = "asyncpg-0.29.0-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:a9e6823a7012be8b68301342ba33b4740e5a166f6bbda0aee32bc01638491a22"}, + {file = "asyncpg-0.29.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:746e80d83ad5d5464cfbf94315eb6744222ab00aa4e522b704322fb182b83610"}, + {file = "asyncpg-0.29.0-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:ff8e8109cd6a46ff852a5e6bab8b0a047d7ea42fcb7ca5ae6eaae97d8eacf397"}, + {file = "asyncpg-0.29.0-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:97eb024685b1d7e72b1972863de527c11ff87960837919dac6e34754768098eb"}, + {file = "asyncpg-0.29.0-cp310-cp310-win32.whl", hash = "sha256:5bbb7f2cafd8d1fa3e65431833de2642f4b2124be61a449fa064e1a08d27e449"}, + {file = "asyncpg-0.29.0-cp310-cp310-win_amd64.whl", hash = "sha256:76c3ac6530904838a4b650b2880f8e7af938ee049e769ec2fba7cd66469d7772"}, + {file = "asyncpg-0.29.0-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:d4900ee08e85af01adb207519bb4e14b1cae8fd21e0ccf80fac6aa60b6da37b4"}, + {file = "asyncpg-0.29.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:a65c1dcd820d5aea7c7d82a3fdcb70e096f8f70d1a8bf93eb458e49bfad036ac"}, + {file = "asyncpg-0.29.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:5b52e46f165585fd6af4863f268566668407c76b2c72d366bb8b522fa66f1870"}, + {file = "asyncpg-0.29.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:dc600ee8ef3dd38b8d67421359779f8ccec30b463e7aec7ed481c8346decf99f"}, + {file = "asyncpg-0.29.0-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:039a261af4f38f949095e1e780bae84a25ffe3e370175193174eb08d3cecab23"}, + {file = "asyncpg-0.29.0-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:6feaf2d8f9138d190e5ec4390c1715c3e87b37715cd69b2c3dfca616134efd2b"}, + {file = "asyncpg-0.29.0-cp311-cp311-win32.whl", hash = "sha256:1e186427c88225ef730555f5fdda6c1812daa884064bfe6bc462fd3a71c4b675"}, + {file = "asyncpg-0.29.0-cp311-cp311-win_amd64.whl", hash = "sha256:cfe73ffae35f518cfd6e4e5f5abb2618ceb5ef02a2365ce64f132601000587d3"}, + {file = "asyncpg-0.29.0-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:6011b0dc29886ab424dc042bf9eeb507670a3b40aece3439944006aafe023178"}, + {file = "asyncpg-0.29.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:b544ffc66b039d5ec5a7454667f855f7fec08e0dfaf5a5490dfafbb7abbd2cfb"}, + {file = "asyncpg-0.29.0-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:d84156d5fb530b06c493f9e7635aa18f518fa1d1395ef240d211cb563c4e2364"}, + {file = "asyncpg-0.29.0-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:54858bc25b49d1114178d65a88e48ad50cb2b6f3e475caa0f0c092d5f527c106"}, + {file = "asyncpg-0.29.0-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:bde17a1861cf10d5afce80a36fca736a86769ab3579532c03e45f83ba8a09c59"}, + {file = "asyncpg-0.29.0-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:37a2ec1b9ff88d8773d3eb6d3784dc7e3fee7756a5317b67f923172a4748a175"}, + {file = "asyncpg-0.29.0-cp312-cp312-win32.whl", hash = "sha256:bb1292d9fad43112a85e98ecdc2e051602bce97c199920586be83254d9dafc02"}, + {file = "asyncpg-0.29.0-cp312-cp312-win_amd64.whl", hash = "sha256:2245be8ec5047a605e0b454c894e54bf2ec787ac04b1cb7e0d3c67aa1e32f0fe"}, + {file = "asyncpg-0.29.0-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:0009a300cae37b8c525e5b449233d59cd9868fd35431abc470a3e364d2b85cb9"}, + {file = "asyncpg-0.29.0-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:5cad1324dbb33f3ca0cd2074d5114354ed3be2b94d48ddfd88af75ebda7c43cc"}, + {file = "asyncpg-0.29.0-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:012d01df61e009015944ac7543d6ee30c2dc1eb2f6b10b62a3f598beb6531548"}, + {file = "asyncpg-0.29.0-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:000c996c53c04770798053e1730d34e30cb645ad95a63265aec82da9093d88e7"}, + {file = "asyncpg-0.29.0-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:e0bfe9c4d3429706cf70d3249089de14d6a01192d617e9093a8e941fea8ee775"}, + {file = "asyncpg-0.29.0-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:642a36eb41b6313ffa328e8a5c5c2b5bea6ee138546c9c3cf1bffaad8ee36dd9"}, + {file = "asyncpg-0.29.0-cp38-cp38-win32.whl", hash = "sha256:a921372bbd0aa3a5822dd0409da61b4cd50df89ae85150149f8c119f23e8c408"}, + {file = "asyncpg-0.29.0-cp38-cp38-win_amd64.whl", hash = "sha256:103aad2b92d1506700cbf51cd8bb5441e7e72e87a7b3a2ca4e32c840f051a6a3"}, + {file = "asyncpg-0.29.0-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:5340dd515d7e52f4c11ada32171d87c05570479dc01dc66d03ee3e150fb695da"}, + {file = "asyncpg-0.29.0-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:e17b52c6cf83e170d3d865571ba574577ab8e533e7361a2b8ce6157d02c665d3"}, + {file = "asyncpg-0.29.0-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:f100d23f273555f4b19b74a96840aa27b85e99ba4b1f18d4ebff0734e78dc090"}, + {file = "asyncpg-0.29.0-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:48e7c58b516057126b363cec8ca02b804644fd012ef8e6c7e23386b7d5e6ce83"}, + {file = "asyncpg-0.29.0-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:f9ea3f24eb4c49a615573724d88a48bd1b7821c890c2effe04f05382ed9e8810"}, + {file = "asyncpg-0.29.0-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:8d36c7f14a22ec9e928f15f92a48207546ffe68bc412f3be718eedccdf10dc5c"}, + {file = "asyncpg-0.29.0-cp39-cp39-win32.whl", hash = "sha256:797ab8123ebaed304a1fad4d7576d5376c3a006a4100380fb9d517f0b59c1ab2"}, + {file = "asyncpg-0.29.0-cp39-cp39-win_amd64.whl", hash = "sha256:cce08a178858b426ae1aa8409b5cc171def45d4293626e7aa6510696d46decd8"}, + {file = "asyncpg-0.29.0.tar.gz", hash = "sha256:d1c49e1f44fffafd9a55e1a9b101590859d881d639ea2922516f5d9c512d354e"}, +] + +[package.dependencies] +async-timeout = {version = ">=4.0.3", markers = "python_version < \"3.12.0\""} + +[package.extras] +docs = ["Sphinx (>=5.3.0,<5.4.0)", "sphinx-rtd-theme (>=1.2.2)", "sphinxcontrib-asyncio (>=0.3.0,<0.4.0)"] +test = ["flake8 (>=6.1,<7.0)", "uvloop (>=0.15.3)"] + +[[package]] +name = "attrs" +version = "23.1.0" +description = "Classes Without Boilerplate" +optional = false +python-versions = ">=3.7" +files = [ + {file = "attrs-23.1.0-py3-none-any.whl", hash = "sha256:1f28b4522cdc2fb4256ac1a020c78acf9cba2c6b461ccd2c126f3aa8e8335d04"}, + {file = "attrs-23.1.0.tar.gz", hash = "sha256:6279836d581513a26f1bf235f9acd333bc9115683f14f7e8fae46c98fc50e015"}, +] + +[package.extras] +cov = ["attrs[tests]", "coverage[toml] (>=5.3)"] +dev = ["attrs[docs,tests]", "pre-commit"] +docs = ["furo", "myst-parser", "sphinx", "sphinx-notfound-page", "sphinxcontrib-towncrier", "towncrier", "zope-interface"] +tests = ["attrs[tests-no-zope]", "zope-interface"] +tests-no-zope = ["cloudpickle", "hypothesis", "mypy (>=1.1.1)", "pympler", "pytest (>=4.3.0)", "pytest-mypy-plugins", "pytest-xdist[psutil]"] + +[[package]] +name = "beautifulsoup4" +version = "4.12.2" +description = "Screen-scraping library" +optional = false +python-versions = ">=3.6.0" +files = [ + {file = "beautifulsoup4-4.12.2-py3-none-any.whl", hash = "sha256:bd2520ca0d9d7d12694a53d44ac482d181b4ec1888909b035a3dbf40d0f57d4a"}, + {file = "beautifulsoup4-4.12.2.tar.gz", hash = "sha256:492bbc69dca35d12daac71c4db1bfff0c876c00ef4a2ffacce226d4638eb72da"}, +] + +[package.dependencies] +soupsieve = ">1.2" + +[package.extras] +html5lib = ["html5lib"] +lxml = ["lxml"] + +[[package]] +name = "certifi" +version = "2023.7.22" +description = "Python package for providing Mozilla's CA Bundle." +optional = false +python-versions = ">=3.6" +files = [ + {file = "certifi-2023.7.22-py3-none-any.whl", hash = "sha256:92d6037539857d8206b8f6ae472e8b77db8058fec5937a1ef3f54304089edbb9"}, + {file = "certifi-2023.7.22.tar.gz", hash = "sha256:539cc1d13202e33ca466e88b2807e29f4c13049d6d87031a3c110744495cb082"}, +] + +[[package]] +name = "charset-normalizer" +version = "3.3.0" +description = "The Real First Universal Charset Detector. Open, modern and actively maintained alternative to Chardet." +optional = false +python-versions = ">=3.7.0" +files = [ + {file = "charset-normalizer-3.3.0.tar.gz", hash = "sha256:63563193aec44bce707e0c5ca64ff69fa72ed7cf34ce6e11d5127555756fd2f6"}, + {file = "charset_normalizer-3.3.0-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:effe5406c9bd748a871dbcaf3ac69167c38d72db8c9baf3ff954c344f31c4cbe"}, + {file = "charset_normalizer-3.3.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:4162918ef3098851fcd8a628bf9b6a98d10c380725df9e04caf5ca6dd48c847a"}, + {file = "charset_normalizer-3.3.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:0570d21da019941634a531444364f2482e8db0b3425fcd5ac0c36565a64142c8"}, + {file = "charset_normalizer-3.3.0-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:5707a746c6083a3a74b46b3a631d78d129edab06195a92a8ece755aac25a3f3d"}, + {file = "charset_normalizer-3.3.0-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:278c296c6f96fa686d74eb449ea1697f3c03dc28b75f873b65b5201806346a69"}, + {file = "charset_normalizer-3.3.0-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:a4b71f4d1765639372a3b32d2638197f5cd5221b19531f9245fcc9ee62d38f56"}, + {file = "charset_normalizer-3.3.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:f5969baeaea61c97efa706b9b107dcba02784b1601c74ac84f2a532ea079403e"}, + {file = "charset_normalizer-3.3.0-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:a3f93dab657839dfa61025056606600a11d0b696d79386f974e459a3fbc568ec"}, + {file = "charset_normalizer-3.3.0-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:db756e48f9c5c607b5e33dd36b1d5872d0422e960145b08ab0ec7fd420e9d649"}, + {file = "charset_normalizer-3.3.0-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:232ac332403e37e4a03d209a3f92ed9071f7d3dbda70e2a5e9cff1c4ba9f0678"}, + {file = "charset_normalizer-3.3.0-cp310-cp310-musllinux_1_1_ppc64le.whl", hash = "sha256:e5c1502d4ace69a179305abb3f0bb6141cbe4714bc9b31d427329a95acfc8bdd"}, + {file = "charset_normalizer-3.3.0-cp310-cp310-musllinux_1_1_s390x.whl", hash = "sha256:2502dd2a736c879c0f0d3e2161e74d9907231e25d35794584b1ca5284e43f596"}, + {file = "charset_normalizer-3.3.0-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:23e8565ab7ff33218530bc817922fae827420f143479b753104ab801145b1d5b"}, + {file = "charset_normalizer-3.3.0-cp310-cp310-win32.whl", hash = "sha256:1872d01ac8c618a8da634e232f24793883d6e456a66593135aeafe3784b0848d"}, + {file = "charset_normalizer-3.3.0-cp310-cp310-win_amd64.whl", hash = "sha256:557b21a44ceac6c6b9773bc65aa1b4cc3e248a5ad2f5b914b91579a32e22204d"}, + {file = "charset_normalizer-3.3.0-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:d7eff0f27edc5afa9e405f7165f85a6d782d308f3b6b9d96016c010597958e63"}, + {file = "charset_normalizer-3.3.0-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:6a685067d05e46641d5d1623d7c7fdf15a357546cbb2f71b0ebde91b175ffc3e"}, + {file = "charset_normalizer-3.3.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:0d3d5b7db9ed8a2b11a774db2bbea7ba1884430a205dbd54a32d61d7c2a190fa"}, + {file = "charset_normalizer-3.3.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:2935ffc78db9645cb2086c2f8f4cfd23d9b73cc0dc80334bc30aac6f03f68f8c"}, + {file = "charset_normalizer-3.3.0-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:9fe359b2e3a7729010060fbca442ca225280c16e923b37db0e955ac2a2b72a05"}, + {file = "charset_normalizer-3.3.0-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:380c4bde80bce25c6e4f77b19386f5ec9db230df9f2f2ac1e5ad7af2caa70459"}, + {file = "charset_normalizer-3.3.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:f0d1e3732768fecb052d90d62b220af62ead5748ac51ef61e7b32c266cac9293"}, + {file = "charset_normalizer-3.3.0-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:1b2919306936ac6efb3aed1fbf81039f7087ddadb3160882a57ee2ff74fd2382"}, + {file = "charset_normalizer-3.3.0-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:f8888e31e3a85943743f8fc15e71536bda1c81d5aa36d014a3c0c44481d7db6e"}, + {file = "charset_normalizer-3.3.0-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:82eb849f085624f6a607538ee7b83a6d8126df6d2f7d3b319cb837b289123078"}, + {file = "charset_normalizer-3.3.0-cp311-cp311-musllinux_1_1_ppc64le.whl", hash = "sha256:7b8b8bf1189b3ba9b8de5c8db4d541b406611a71a955bbbd7385bbc45fcb786c"}, + {file = "charset_normalizer-3.3.0-cp311-cp311-musllinux_1_1_s390x.whl", hash = "sha256:5adf257bd58c1b8632046bbe43ee38c04e1038e9d37de9c57a94d6bd6ce5da34"}, + {file = "charset_normalizer-3.3.0-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:c350354efb159b8767a6244c166f66e67506e06c8924ed74669b2c70bc8735b1"}, + {file = "charset_normalizer-3.3.0-cp311-cp311-win32.whl", hash = "sha256:02af06682e3590ab952599fbadac535ede5d60d78848e555aa58d0c0abbde786"}, + {file = "charset_normalizer-3.3.0-cp311-cp311-win_amd64.whl", hash = "sha256:86d1f65ac145e2c9ed71d8ffb1905e9bba3a91ae29ba55b4c46ae6fc31d7c0d4"}, + {file = "charset_normalizer-3.3.0-cp312-cp312-macosx_10_9_universal2.whl", hash = "sha256:3b447982ad46348c02cb90d230b75ac34e9886273df3a93eec0539308a6296d7"}, + {file = "charset_normalizer-3.3.0-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:abf0d9f45ea5fb95051c8bfe43cb40cda383772f7e5023a83cc481ca2604d74e"}, + {file = "charset_normalizer-3.3.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:b09719a17a2301178fac4470d54b1680b18a5048b481cb8890e1ef820cb80455"}, + {file = "charset_normalizer-3.3.0-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:b3d9b48ee6e3967b7901c052b670c7dda6deb812c309439adaffdec55c6d7b78"}, + {file = "charset_normalizer-3.3.0-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:edfe077ab09442d4ef3c52cb1f9dab89bff02f4524afc0acf2d46be17dc479f5"}, + {file = "charset_normalizer-3.3.0-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:3debd1150027933210c2fc321527c2299118aa929c2f5a0a80ab6953e3bd1908"}, + {file = "charset_normalizer-3.3.0-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:86f63face3a527284f7bb8a9d4f78988e3c06823f7bea2bd6f0e0e9298ca0403"}, + {file = "charset_normalizer-3.3.0-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:24817cb02cbef7cd499f7c9a2735286b4782bd47a5b3516a0e84c50eab44b98e"}, + {file = "charset_normalizer-3.3.0-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:c71f16da1ed8949774ef79f4a0260d28b83b3a50c6576f8f4f0288d109777989"}, + {file = "charset_normalizer-3.3.0-cp312-cp312-musllinux_1_1_i686.whl", hash = "sha256:9cf3126b85822c4e53aa28c7ec9869b924d6fcfb76e77a45c44b83d91afd74f9"}, + {file = "charset_normalizer-3.3.0-cp312-cp312-musllinux_1_1_ppc64le.whl", hash = "sha256:b3b2316b25644b23b54a6f6401074cebcecd1244c0b8e80111c9a3f1c8e83d65"}, + {file = "charset_normalizer-3.3.0-cp312-cp312-musllinux_1_1_s390x.whl", hash = "sha256:03680bb39035fbcffe828eae9c3f8afc0428c91d38e7d61aa992ef7a59fb120e"}, + {file = "charset_normalizer-3.3.0-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:4cc152c5dd831641e995764f9f0b6589519f6f5123258ccaca8c6d34572fefa8"}, + {file = "charset_normalizer-3.3.0-cp312-cp312-win32.whl", hash = "sha256:b8f3307af845803fb0b060ab76cf6dd3a13adc15b6b451f54281d25911eb92df"}, + {file = "charset_normalizer-3.3.0-cp312-cp312-win_amd64.whl", hash = "sha256:8eaf82f0eccd1505cf39a45a6bd0a8cf1c70dcfc30dba338207a969d91b965c0"}, + {file = "charset_normalizer-3.3.0-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:dc45229747b67ffc441b3de2f3ae5e62877a282ea828a5bdb67883c4ee4a8810"}, + {file = "charset_normalizer-3.3.0-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:2f4a0033ce9a76e391542c182f0d48d084855b5fcba5010f707c8e8c34663d77"}, + {file = "charset_normalizer-3.3.0-cp37-cp37m-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:ada214c6fa40f8d800e575de6b91a40d0548139e5dc457d2ebb61470abf50186"}, + {file = "charset_normalizer-3.3.0-cp37-cp37m-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:b1121de0e9d6e6ca08289583d7491e7fcb18a439305b34a30b20d8215922d43c"}, + {file = "charset_normalizer-3.3.0-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:1063da2c85b95f2d1a430f1c33b55c9c17ffaf5e612e10aeaad641c55a9e2b9d"}, + {file = "charset_normalizer-3.3.0-cp37-cp37m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:70f1d09c0d7748b73290b29219e854b3207aea922f839437870d8cc2168e31cc"}, + {file = "charset_normalizer-3.3.0-cp37-cp37m-musllinux_1_1_aarch64.whl", hash = "sha256:250c9eb0f4600361dd80d46112213dff2286231d92d3e52af1e5a6083d10cad9"}, + {file = "charset_normalizer-3.3.0-cp37-cp37m-musllinux_1_1_i686.whl", hash = "sha256:750b446b2ffce1739e8578576092179160f6d26bd5e23eb1789c4d64d5af7dc7"}, + {file = "charset_normalizer-3.3.0-cp37-cp37m-musllinux_1_1_ppc64le.whl", hash = "sha256:fc52b79d83a3fe3a360902d3f5d79073a993597d48114c29485e9431092905d8"}, + {file = "charset_normalizer-3.3.0-cp37-cp37m-musllinux_1_1_s390x.whl", hash = "sha256:588245972aca710b5b68802c8cad9edaa98589b1b42ad2b53accd6910dad3545"}, + {file = "charset_normalizer-3.3.0-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:e39c7eb31e3f5b1f88caff88bcff1b7f8334975b46f6ac6e9fc725d829bc35d4"}, + {file = "charset_normalizer-3.3.0-cp37-cp37m-win32.whl", hash = "sha256:abecce40dfebbfa6abf8e324e1860092eeca6f7375c8c4e655a8afb61af58f2c"}, + {file = "charset_normalizer-3.3.0-cp37-cp37m-win_amd64.whl", hash = "sha256:24a91a981f185721542a0b7c92e9054b7ab4fea0508a795846bc5b0abf8118d4"}, + {file = "charset_normalizer-3.3.0-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:67b8cc9574bb518ec76dc8e705d4c39ae78bb96237cb533edac149352c1f39fe"}, + {file = "charset_normalizer-3.3.0-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:ac71b2977fb90c35d41c9453116e283fac47bb9096ad917b8819ca8b943abecd"}, + {file = "charset_normalizer-3.3.0-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:3ae38d325b512f63f8da31f826e6cb6c367336f95e418137286ba362925c877e"}, + {file = "charset_normalizer-3.3.0-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:542da1178c1c6af8873e143910e2269add130a299c9106eef2594e15dae5e482"}, + {file = "charset_normalizer-3.3.0-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:30a85aed0b864ac88309b7d94be09f6046c834ef60762a8833b660139cfbad13"}, + {file = "charset_normalizer-3.3.0-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:aae32c93e0f64469f74ccc730a7cb21c7610af3a775157e50bbd38f816536b38"}, + {file = "charset_normalizer-3.3.0-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:15b26ddf78d57f1d143bdf32e820fd8935d36abe8a25eb9ec0b5a71c82eb3895"}, + {file = "charset_normalizer-3.3.0-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:7f5d10bae5d78e4551b7be7a9b29643a95aded9d0f602aa2ba584f0388e7a557"}, + {file = "charset_normalizer-3.3.0-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:249c6470a2b60935bafd1d1d13cd613f8cd8388d53461c67397ee6a0f5dce741"}, + {file = "charset_normalizer-3.3.0-cp38-cp38-musllinux_1_1_i686.whl", hash = "sha256:c5a74c359b2d47d26cdbbc7845e9662d6b08a1e915eb015d044729e92e7050b7"}, + {file = "charset_normalizer-3.3.0-cp38-cp38-musllinux_1_1_ppc64le.whl", hash = "sha256:b5bcf60a228acae568e9911f410f9d9e0d43197d030ae5799e20dca8df588287"}, + {file = "charset_normalizer-3.3.0-cp38-cp38-musllinux_1_1_s390x.whl", hash = "sha256:187d18082694a29005ba2944c882344b6748d5be69e3a89bf3cc9d878e548d5a"}, + {file = "charset_normalizer-3.3.0-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:81bf654678e575403736b85ba3a7867e31c2c30a69bc57fe88e3ace52fb17b89"}, + {file = "charset_normalizer-3.3.0-cp38-cp38-win32.whl", hash = "sha256:85a32721ddde63c9df9ebb0d2045b9691d9750cb139c161c80e500d210f5e26e"}, + {file = "charset_normalizer-3.3.0-cp38-cp38-win_amd64.whl", hash = "sha256:468d2a840567b13a590e67dd276c570f8de00ed767ecc611994c301d0f8c014f"}, + {file = "charset_normalizer-3.3.0-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:e0fc42822278451bc13a2e8626cf2218ba570f27856b536e00cfa53099724828"}, + {file = "charset_normalizer-3.3.0-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:09c77f964f351a7369cc343911e0df63e762e42bac24cd7d18525961c81754f4"}, + {file = "charset_normalizer-3.3.0-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:12ebea541c44fdc88ccb794a13fe861cc5e35d64ed689513a5c03d05b53b7c82"}, + {file = "charset_normalizer-3.3.0-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:805dfea4ca10411a5296bcc75638017215a93ffb584c9e344731eef0dcfb026a"}, + {file = "charset_normalizer-3.3.0-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:96c2b49eb6a72c0e4991d62406e365d87067ca14c1a729a870d22354e6f68115"}, + {file = "charset_normalizer-3.3.0-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:aaf7b34c5bc56b38c931a54f7952f1ff0ae77a2e82496583b247f7c969eb1479"}, + {file = "charset_normalizer-3.3.0-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:619d1c96099be5823db34fe89e2582b336b5b074a7f47f819d6b3a57ff7bdb86"}, + {file = "charset_normalizer-3.3.0-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:a0ac5e7015a5920cfce654c06618ec40c33e12801711da6b4258af59a8eff00a"}, + {file = "charset_normalizer-3.3.0-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:93aa7eef6ee71c629b51ef873991d6911b906d7312c6e8e99790c0f33c576f89"}, + {file = "charset_normalizer-3.3.0-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:7966951325782121e67c81299a031f4c115615e68046f79b85856b86ebffc4cd"}, + {file = "charset_normalizer-3.3.0-cp39-cp39-musllinux_1_1_ppc64le.whl", hash = "sha256:02673e456dc5ab13659f85196c534dc596d4ef260e4d86e856c3b2773ce09843"}, + {file = "charset_normalizer-3.3.0-cp39-cp39-musllinux_1_1_s390x.whl", hash = "sha256:c2af80fb58f0f24b3f3adcb9148e6203fa67dd3f61c4af146ecad033024dde43"}, + {file = "charset_normalizer-3.3.0-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:153e7b6e724761741e0974fc4dcd406d35ba70b92bfe3fedcb497226c93b9da7"}, + {file = "charset_normalizer-3.3.0-cp39-cp39-win32.whl", hash = "sha256:d47ecf253780c90ee181d4d871cd655a789da937454045b17b5798da9393901a"}, + {file = "charset_normalizer-3.3.0-cp39-cp39-win_amd64.whl", hash = "sha256:d97d85fa63f315a8bdaba2af9a6a686e0eceab77b3089af45133252618e70884"}, + {file = "charset_normalizer-3.3.0-py3-none-any.whl", hash = "sha256:e46cd37076971c1040fc8c41273a8b3e2c624ce4f2be3f5dfcb7a430c1d3acc2"}, +] + +[[package]] +name = "click" +version = "8.1.7" +description = "Composable command line interface toolkit" +optional = false +python-versions = ">=3.7" +files = [ + {file = "click-8.1.7-py3-none-any.whl", hash = "sha256:ae74fb96c20a0277a1d615f1e4d73c8414f5a98db8b799a7931d1582f3390c28"}, + {file = "click-8.1.7.tar.gz", hash = "sha256:ca9853ad459e787e2192211578cc907e7594e294c7ccc834310722b41b9ca6de"}, +] + +[package.dependencies] +colorama = {version = "*", markers = "platform_system == \"Windows\""} + +[[package]] +name = "colorama" +version = "0.4.6" +description = "Cross-platform colored terminal text." +optional = false +python-versions = "!=3.0.*,!=3.1.*,!=3.2.*,!=3.3.*,!=3.4.*,!=3.5.*,!=3.6.*,>=2.7" +files = [ + {file = "colorama-0.4.6-py2.py3-none-any.whl", hash = "sha256:4f1d9991f5acc0ca119f9d443620b77f9d6b33703e51011c16baf57afb285fc6"}, + {file = "colorama-0.4.6.tar.gz", hash = "sha256:08695f5cb7ed6e0531a20572697297273c47b8cae5a63ffc6d6ed5c201be6e44"}, +] + +[[package]] +name = "dataclasses-json" +version = "0.6.1" +description = "Easily serialize dataclasses to and from JSON." +optional = false +python-versions = ">=3.7,<4.0" +files = [ + {file = "dataclasses_json-0.6.1-py3-none-any.whl", hash = "sha256:1bd8418a61fe3d588bb0079214d7fb71d44937da40742b787256fd53b26b6c80"}, + {file = "dataclasses_json-0.6.1.tar.gz", hash = "sha256:a53c220c35134ce08211a1057fd0e5bf76dc5331627c6b241cacbc570a89faae"}, +] + +[package.dependencies] +marshmallow = ">=3.18.0,<4.0.0" +typing-inspect = ">=0.4.0,<1" + +[[package]] +name = "dnspython" +version = "2.4.2" +description = "DNS toolkit" +optional = false +python-versions = ">=3.8,<4.0" +files = [ + {file = "dnspython-2.4.2-py3-none-any.whl", hash = "sha256:57c6fbaaeaaf39c891292012060beb141791735dbb4004798328fc2c467402d8"}, + {file = "dnspython-2.4.2.tar.gz", hash = "sha256:8dcfae8c7460a2f84b4072e26f1c9f4101ca20c071649cb7c34e8b6a93d58984"}, +] + +[package.extras] +dnssec = ["cryptography (>=2.6,<42.0)"] +doh = ["h2 (>=4.1.0)", "httpcore (>=0.17.3)", "httpx (>=0.24.1)"] +doq = ["aioquic (>=0.9.20)"] +idna = ["idna (>=2.1,<4.0)"] +trio = ["trio (>=0.14,<0.23)"] +wmi = ["wmi (>=1.5.1,<2.0.0)"] + +[[package]] +name = "exceptiongroup" +version = "1.1.3" +description = "Backport of PEP 654 (exception groups)" +optional = false +python-versions = ">=3.7" +files = [ + {file = "exceptiongroup-1.1.3-py3-none-any.whl", hash = "sha256:343280667a4585d195ca1cf9cef84a4e178c4b6cf2274caef9859782b567d5e3"}, + {file = "exceptiongroup-1.1.3.tar.gz", hash = "sha256:097acd85d473d75af5bb98e41b61ff7fe35efe6675e4f9370ec6ec5126d160e9"}, +] + +[package.extras] +test = ["pytest (>=6)"] + +[[package]] +name = "fastapi" +version = "0.104.1" +description = "FastAPI framework, high performance, easy to learn, fast to code, ready for production" +optional = false +python-versions = ">=3.8" +files = [ + {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.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)"] + +[[package]] +name = "frozenlist" +version = "1.4.0" +description = "A list-like structure which implements collections.abc.MutableSequence" +optional = false +python-versions = ">=3.8" +files = [ + {file = "frozenlist-1.4.0-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:764226ceef3125e53ea2cb275000e309c0aa5464d43bd72abd661e27fffc26ab"}, + {file = "frozenlist-1.4.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:d6484756b12f40003c6128bfcc3fa9f0d49a687e171186c2d85ec82e3758c559"}, + {file = "frozenlist-1.4.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:9ac08e601308e41eb533f232dbf6b7e4cea762f9f84f6357136eed926c15d12c"}, + {file = "frozenlist-1.4.0-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:d081f13b095d74b67d550de04df1c756831f3b83dc9881c38985834387487f1b"}, + {file = "frozenlist-1.4.0-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:71932b597f9895f011f47f17d6428252fc728ba2ae6024e13c3398a087c2cdea"}, + {file = "frozenlist-1.4.0-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:981b9ab5a0a3178ff413bca62526bb784249421c24ad7381e39d67981be2c326"}, + {file = "frozenlist-1.4.0-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:e41f3de4df3e80de75845d3e743b3f1c4c8613c3997a912dbf0229fc61a8b963"}, + {file = "frozenlist-1.4.0-cp310-cp310-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:6918d49b1f90821e93069682c06ffde41829c346c66b721e65a5c62b4bab0300"}, + {file = "frozenlist-1.4.0-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:0e5c8764c7829343d919cc2dfc587a8db01c4f70a4ebbc49abde5d4b158b007b"}, + {file = "frozenlist-1.4.0-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:8d0edd6b1c7fb94922bf569c9b092ee187a83f03fb1a63076e7774b60f9481a8"}, + {file = "frozenlist-1.4.0-cp310-cp310-musllinux_1_1_ppc64le.whl", hash = "sha256:e29cda763f752553fa14c68fb2195150bfab22b352572cb36c43c47bedba70eb"}, + {file = "frozenlist-1.4.0-cp310-cp310-musllinux_1_1_s390x.whl", hash = "sha256:0c7c1b47859ee2cac3846fde1c1dc0f15da6cec5a0e5c72d101e0f83dcb67ff9"}, + {file = "frozenlist-1.4.0-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:901289d524fdd571be1c7be054f48b1f88ce8dddcbdf1ec698b27d4b8b9e5d62"}, + {file = "frozenlist-1.4.0-cp310-cp310-win32.whl", hash = "sha256:1a0848b52815006ea6596c395f87449f693dc419061cc21e970f139d466dc0a0"}, + {file = "frozenlist-1.4.0-cp310-cp310-win_amd64.whl", hash = "sha256:b206646d176a007466358aa21d85cd8600a415c67c9bd15403336c331a10d956"}, + {file = "frozenlist-1.4.0-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:de343e75f40e972bae1ef6090267f8260c1446a1695e77096db6cfa25e759a95"}, + {file = "frozenlist-1.4.0-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:ad2a9eb6d9839ae241701d0918f54c51365a51407fd80f6b8289e2dfca977cc3"}, + {file = "frozenlist-1.4.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:bd7bd3b3830247580de99c99ea2a01416dfc3c34471ca1298bccabf86d0ff4dc"}, + {file = "frozenlist-1.4.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:bdf1847068c362f16b353163391210269e4f0569a3c166bc6a9f74ccbfc7e839"}, + {file = "frozenlist-1.4.0-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:38461d02d66de17455072c9ba981d35f1d2a73024bee7790ac2f9e361ef1cd0c"}, + {file = "frozenlist-1.4.0-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:d5a32087d720c608f42caed0ef36d2b3ea61a9d09ee59a5142d6070da9041b8f"}, + {file = "frozenlist-1.4.0-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:dd65632acaf0d47608190a71bfe46b209719bf2beb59507db08ccdbe712f969b"}, + {file = "frozenlist-1.4.0-cp311-cp311-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:261b9f5d17cac914531331ff1b1d452125bf5daa05faf73b71d935485b0c510b"}, + {file = "frozenlist-1.4.0-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:b89ac9768b82205936771f8d2eb3ce88503b1556324c9f903e7156669f521472"}, + {file = "frozenlist-1.4.0-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:008eb8b31b3ea6896da16c38c1b136cb9fec9e249e77f6211d479db79a4eaf01"}, + {file = "frozenlist-1.4.0-cp311-cp311-musllinux_1_1_ppc64le.whl", hash = "sha256:e74b0506fa5aa5598ac6a975a12aa8928cbb58e1f5ac8360792ef15de1aa848f"}, + {file = "frozenlist-1.4.0-cp311-cp311-musllinux_1_1_s390x.whl", hash = "sha256:490132667476f6781b4c9458298b0c1cddf237488abd228b0b3650e5ecba7467"}, + {file = "frozenlist-1.4.0-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:76d4711f6f6d08551a7e9ef28c722f4a50dd0fc204c56b4bcd95c6cc05ce6fbb"}, + {file = "frozenlist-1.4.0-cp311-cp311-win32.whl", hash = "sha256:a02eb8ab2b8f200179b5f62b59757685ae9987996ae549ccf30f983f40602431"}, + {file = "frozenlist-1.4.0-cp311-cp311-win_amd64.whl", hash = "sha256:515e1abc578dd3b275d6a5114030b1330ba044ffba03f94091842852f806f1c1"}, + {file = "frozenlist-1.4.0-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:f0ed05f5079c708fe74bf9027e95125334b6978bf07fd5ab923e9e55e5fbb9d3"}, + {file = "frozenlist-1.4.0-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:ca265542ca427bf97aed183c1676e2a9c66942e822b14dc6e5f42e038f92a503"}, + {file = "frozenlist-1.4.0-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:491e014f5c43656da08958808588cc6c016847b4360e327a62cb308c791bd2d9"}, + {file = "frozenlist-1.4.0-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:17ae5cd0f333f94f2e03aaf140bb762c64783935cc764ff9c82dff626089bebf"}, + {file = "frozenlist-1.4.0-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:1e78fb68cf9c1a6aa4a9a12e960a5c9dfbdb89b3695197aa7064705662515de2"}, + {file = "frozenlist-1.4.0-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:d5655a942f5f5d2c9ed93d72148226d75369b4f6952680211972a33e59b1dfdc"}, + {file = "frozenlist-1.4.0-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:c11b0746f5d946fecf750428a95f3e9ebe792c1ee3b1e96eeba145dc631a9672"}, + {file = "frozenlist-1.4.0-cp38-cp38-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:e66d2a64d44d50d2543405fb183a21f76b3b5fd16f130f5c99187c3fb4e64919"}, + {file = "frozenlist-1.4.0-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:88f7bc0fcca81f985f78dd0fa68d2c75abf8272b1f5c323ea4a01a4d7a614efc"}, + {file = "frozenlist-1.4.0-cp38-cp38-musllinux_1_1_i686.whl", hash = "sha256:5833593c25ac59ede40ed4de6d67eb42928cca97f26feea219f21d0ed0959b79"}, + {file = "frozenlist-1.4.0-cp38-cp38-musllinux_1_1_ppc64le.whl", hash = "sha256:fec520865f42e5c7f050c2a79038897b1c7d1595e907a9e08e3353293ffc948e"}, + {file = "frozenlist-1.4.0-cp38-cp38-musllinux_1_1_s390x.whl", hash = "sha256:b826d97e4276750beca7c8f0f1a4938892697a6bcd8ec8217b3312dad6982781"}, + {file = "frozenlist-1.4.0-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:ceb6ec0a10c65540421e20ebd29083c50e6d1143278746a4ef6bcf6153171eb8"}, + {file = "frozenlist-1.4.0-cp38-cp38-win32.whl", hash = "sha256:2b8bcf994563466db019fab287ff390fffbfdb4f905fc77bc1c1d604b1c689cc"}, + {file = "frozenlist-1.4.0-cp38-cp38-win_amd64.whl", hash = "sha256:a6c8097e01886188e5be3e6b14e94ab365f384736aa1fca6a0b9e35bd4a30bc7"}, + {file = "frozenlist-1.4.0-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:6c38721585f285203e4b4132a352eb3daa19121a035f3182e08e437cface44bf"}, + {file = "frozenlist-1.4.0-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:a0c6da9aee33ff0b1a451e867da0c1f47408112b3391dd43133838339e410963"}, + {file = "frozenlist-1.4.0-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:93ea75c050c5bb3d98016b4ba2497851eadf0ac154d88a67d7a6816206f6fa7f"}, + {file = "frozenlist-1.4.0-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:f61e2dc5ad442c52b4887f1fdc112f97caeff4d9e6ebe78879364ac59f1663e1"}, + {file = "frozenlist-1.4.0-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:aa384489fefeb62321b238e64c07ef48398fe80f9e1e6afeff22e140e0850eef"}, + {file = "frozenlist-1.4.0-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:10ff5faaa22786315ef57097a279b833ecab1a0bfb07d604c9cbb1c4cdc2ed87"}, + {file = "frozenlist-1.4.0-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:007df07a6e3eb3e33e9a1fe6a9db7af152bbd8a185f9aaa6ece10a3529e3e1c6"}, + {file = "frozenlist-1.4.0-cp39-cp39-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:7f4f399d28478d1f604c2ff9119907af9726aed73680e5ed1ca634d377abb087"}, + {file = "frozenlist-1.4.0-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:c5374b80521d3d3f2ec5572e05adc94601985cc526fb276d0c8574a6d749f1b3"}, + {file = "frozenlist-1.4.0-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:ce31ae3e19f3c902de379cf1323d90c649425b86de7bbdf82871b8a2a0615f3d"}, + {file = "frozenlist-1.4.0-cp39-cp39-musllinux_1_1_ppc64le.whl", hash = "sha256:7211ef110a9194b6042449431e08c4d80c0481e5891e58d429df5899690511c2"}, + {file = "frozenlist-1.4.0-cp39-cp39-musllinux_1_1_s390x.whl", hash = "sha256:556de4430ce324c836789fa4560ca62d1591d2538b8ceb0b4f68fb7b2384a27a"}, + {file = "frozenlist-1.4.0-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:7645a8e814a3ee34a89c4a372011dcd817964ce8cb273c8ed6119d706e9613e3"}, + {file = "frozenlist-1.4.0-cp39-cp39-win32.whl", hash = "sha256:19488c57c12d4e8095a922f328df3f179c820c212940a498623ed39160bc3c2f"}, + {file = "frozenlist-1.4.0-cp39-cp39-win_amd64.whl", hash = "sha256:6221d84d463fb110bdd7619b69cb43878a11d51cbb9394ae3105d082d5199167"}, + {file = "frozenlist-1.4.0.tar.gz", hash = "sha256:09163bdf0b2907454042edb19f887c6d33806adc71fbd54afc14908bfdc22251"}, +] + +[[package]] +name = "gitdb" +version = "4.0.11" +description = "Git Object Database" +optional = false +python-versions = ">=3.7" +files = [ + {file = "gitdb-4.0.11-py3-none-any.whl", hash = "sha256:81a3407ddd2ee8df444cbacea00e2d038e40150acfa3001696fe0dcf1d3adfa4"}, + {file = "gitdb-4.0.11.tar.gz", hash = "sha256:bf5421126136d6d0af55bc1e7c1af1c397a34f5b7bd79e776cd3e89785c2b04b"}, +] + +[package.dependencies] +smmap = ">=3.0.1,<6" + +[[package]] +name = "gitpython" +version = "3.1.40" +description = "GitPython is a Python library used to interact with Git repositories" +optional = false +python-versions = ">=3.7" +files = [ + {file = "GitPython-3.1.40-py3-none-any.whl", hash = "sha256:cf14627d5a8049ffbf49915732e5eddbe8134c3bdb9d476e6182b676fc573f8a"}, + {file = "GitPython-3.1.40.tar.gz", hash = "sha256:22b126e9ffb671fdd0c129796343a02bf67bf2994b35449ffc9321aa755e18a4"}, +] + +[package.dependencies] +gitdb = ">=4.0.1,<5" + +[package.extras] +test = ["black", "coverage[toml]", "ddt (>=1.1.1,!=1.4.3)", "mock", "mypy", "pre-commit", "pytest", "pytest-cov", "pytest-instafail", "pytest-subtests", "pytest-sugar"] + +[[package]] +name = "greenlet" +version = "3.0.0" +description = "Lightweight in-process concurrent programming" +optional = false +python-versions = ">=3.7" +files = [ + {file = "greenlet-3.0.0-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:e09dea87cc91aea5500262993cbd484b41edf8af74f976719dd83fe724644cd6"}, + {file = "greenlet-3.0.0-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:f47932c434a3c8d3c86d865443fadc1fbf574e9b11d6650b656e602b1797908a"}, + {file = "greenlet-3.0.0-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:bdfaeecf8cc705d35d8e6de324bf58427d7eafb55f67050d8f28053a3d57118c"}, + {file = "greenlet-3.0.0-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:6a68d670c8f89ff65c82b936275369e532772eebc027c3be68c6b87ad05ca695"}, + {file = "greenlet-3.0.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:38ad562a104cd41e9d4644f46ea37167b93190c6d5e4048fcc4b80d34ecb278f"}, + {file = "greenlet-3.0.0-cp310-cp310-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:02a807b2a58d5cdebb07050efe3d7deaf915468d112dfcf5e426d0564aa3aa4a"}, + {file = "greenlet-3.0.0-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:b1660a15a446206c8545edc292ab5c48b91ff732f91b3d3b30d9a915d5ec4779"}, + {file = "greenlet-3.0.0-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:813720bd57e193391dfe26f4871186cf460848b83df7e23e6bef698a7624b4c9"}, + {file = "greenlet-3.0.0-cp310-cp310-win_amd64.whl", hash = "sha256:aa15a2ec737cb609ed48902b45c5e4ff6044feb5dcdfcf6fa8482379190330d7"}, + {file = "greenlet-3.0.0-cp310-universal2-macosx_11_0_x86_64.whl", hash = "sha256:7709fd7bb02b31908dc8fd35bfd0a29fc24681d5cc9ac1d64ad07f8d2b7db62f"}, + {file = "greenlet-3.0.0-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:211ef8d174601b80e01436f4e6905aca341b15a566f35a10dd8d1e93f5dbb3b7"}, + {file = "greenlet-3.0.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:6512592cc49b2c6d9b19fbaa0312124cd4c4c8a90d28473f86f92685cc5fef8e"}, + {file = "greenlet-3.0.0-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:871b0a8835f9e9d461b7fdaa1b57e3492dd45398e87324c047469ce2fc9f516c"}, + {file = "greenlet-3.0.0-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:b505fcfc26f4148551826a96f7317e02c400665fa0883fe505d4fcaab1dabfdd"}, + {file = "greenlet-3.0.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:123910c58234a8d40eaab595bc56a5ae49bdd90122dde5bdc012c20595a94c14"}, + {file = "greenlet-3.0.0-cp311-cp311-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:96d9ea57292f636ec851a9bb961a5cc0f9976900e16e5d5647f19aa36ba6366b"}, + {file = "greenlet-3.0.0-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:0b72b802496cccbd9b31acea72b6f87e7771ccfd7f7927437d592e5c92ed703c"}, + {file = "greenlet-3.0.0-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:527cd90ba3d8d7ae7dceb06fda619895768a46a1b4e423bdb24c1969823b8362"}, + {file = "greenlet-3.0.0-cp311-cp311-win_amd64.whl", hash = "sha256:37f60b3a42d8b5499be910d1267b24355c495064f271cfe74bf28b17b099133c"}, + {file = "greenlet-3.0.0-cp311-universal2-macosx_10_9_universal2.whl", hash = "sha256:c3692ecf3fe754c8c0f2c95ff19626584459eab110eaab66413b1e7425cd84e9"}, + {file = "greenlet-3.0.0-cp312-cp312-macosx_13_0_arm64.whl", hash = "sha256:be557119bf467d37a8099d91fbf11b2de5eb1fd5fc5b91598407574848dc910f"}, + {file = "greenlet-3.0.0-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:73b2f1922a39d5d59cc0e597987300df3396b148a9bd10b76a058a2f2772fc04"}, + {file = "greenlet-3.0.0-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:d1e22c22f7826096ad503e9bb681b05b8c1f5a8138469b255eb91f26a76634f2"}, + {file = "greenlet-3.0.0-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:1d363666acc21d2c204dd8705c0e0457d7b2ee7a76cb16ffc099d6799744ac99"}, + {file = "greenlet-3.0.0-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:334ef6ed8337bd0b58bb0ae4f7f2dcc84c9f116e474bb4ec250a8bb9bd797a66"}, + {file = "greenlet-3.0.0-cp312-cp312-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:6672fdde0fd1a60b44fb1751a7779c6db487e42b0cc65e7caa6aa686874e79fb"}, + {file = "greenlet-3.0.0-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:952256c2bc5b4ee8df8dfc54fc4de330970bf5d79253c863fb5e6761f00dda35"}, + {file = "greenlet-3.0.0-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:269d06fa0f9624455ce08ae0179430eea61085e3cf6457f05982b37fd2cefe17"}, + {file = "greenlet-3.0.0-cp312-cp312-win_amd64.whl", hash = "sha256:9adbd8ecf097e34ada8efde9b6fec4dd2a903b1e98037adf72d12993a1c80b51"}, + {file = "greenlet-3.0.0-cp312-universal2-macosx_10_9_universal2.whl", hash = "sha256:553d6fb2324e7f4f0899e5ad2c427a4579ed4873f42124beba763f16032959af"}, + {file = "greenlet-3.0.0-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:c6b5ce7f40f0e2f8b88c28e6691ca6806814157ff05e794cdd161be928550f4c"}, + {file = "greenlet-3.0.0-cp37-cp37m-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:ecf94aa539e97a8411b5ea52fc6ccd8371be9550c4041011a091eb8b3ca1d810"}, + {file = "greenlet-3.0.0-cp37-cp37m-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:80dcd3c938cbcac986c5c92779db8e8ce51a89a849c135172c88ecbdc8c056b7"}, + {file = "greenlet-3.0.0-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:e52a712c38e5fb4fd68e00dc3caf00b60cb65634d50e32281a9d6431b33b4af1"}, + {file = "greenlet-3.0.0-cp37-cp37m-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:d5539f6da3418c3dc002739cb2bb8d169056aa66e0c83f6bacae0cd3ac26b423"}, + {file = "greenlet-3.0.0-cp37-cp37m-musllinux_1_1_aarch64.whl", hash = "sha256:343675e0da2f3c69d3fb1e894ba0a1acf58f481f3b9372ce1eb465ef93cf6fed"}, + {file = "greenlet-3.0.0-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:abe1ef3d780de56defd0c77c5ba95e152f4e4c4e12d7e11dd8447d338b85a625"}, + {file = "greenlet-3.0.0-cp37-cp37m-win32.whl", hash = "sha256:e693e759e172fa1c2c90d35dea4acbdd1d609b6936115d3739148d5e4cd11947"}, + {file = "greenlet-3.0.0-cp37-cp37m-win_amd64.whl", hash = "sha256:bdd696947cd695924aecb3870660b7545a19851f93b9d327ef8236bfc49be705"}, + {file = "greenlet-3.0.0-cp37-universal2-macosx_11_0_x86_64.whl", hash = "sha256:cc3e2679ea13b4de79bdc44b25a0c4fcd5e94e21b8f290791744ac42d34a0353"}, + {file = "greenlet-3.0.0-cp38-cp38-macosx_11_0_universal2.whl", hash = "sha256:63acdc34c9cde42a6534518e32ce55c30f932b473c62c235a466469a710bfbf9"}, + {file = "greenlet-3.0.0-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:4a1a6244ff96343e9994e37e5b4839f09a0207d35ef6134dce5c20d260d0302c"}, + {file = "greenlet-3.0.0-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:b822fab253ac0f330ee807e7485769e3ac85d5eef827ca224feaaefa462dc0d0"}, + {file = "greenlet-3.0.0-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:8060b32d8586e912a7b7dac2d15b28dbbd63a174ab32f5bc6d107a1c4143f40b"}, + {file = "greenlet-3.0.0-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:621fcb346141ae08cb95424ebfc5b014361621b8132c48e538e34c3c93ac7365"}, + {file = "greenlet-3.0.0-cp38-cp38-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:6bb36985f606a7c49916eff74ab99399cdfd09241c375d5a820bb855dfb4af9f"}, + {file = "greenlet-3.0.0-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:10b5582744abd9858947d163843d323d0b67be9432db50f8bf83031032bc218d"}, + {file = "greenlet-3.0.0-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:f351479a6914fd81a55c8e68963609f792d9b067fb8a60a042c585a621e0de4f"}, + {file = "greenlet-3.0.0-cp38-cp38-win32.whl", hash = "sha256:9de687479faec7db5b198cc365bc34addd256b0028956501f4d4d5e9ca2e240a"}, + {file = "greenlet-3.0.0-cp38-cp38-win_amd64.whl", hash = "sha256:3fd2b18432e7298fcbec3d39e1a0aa91ae9ea1c93356ec089421fabc3651572b"}, + {file = "greenlet-3.0.0-cp38-universal2-macosx_11_0_x86_64.whl", hash = "sha256:3c0d36f5adc6e6100aedbc976d7428a9f7194ea79911aa4bf471f44ee13a9464"}, + {file = "greenlet-3.0.0-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:4cd83fb8d8e17633ad534d9ac93719ef8937568d730ef07ac3a98cb520fd93e4"}, + {file = "greenlet-3.0.0-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:6a5b2d4cdaf1c71057ff823a19d850ed5c6c2d3686cb71f73ae4d6382aaa7a06"}, + {file = "greenlet-3.0.0-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:2e7dcdfad252f2ca83c685b0fa9fba00e4d8f243b73839229d56ee3d9d219314"}, + {file = "greenlet-3.0.0-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:c94e4e924d09b5a3e37b853fe5924a95eac058cb6f6fb437ebb588b7eda79870"}, + {file = "greenlet-3.0.0-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:ad6fb737e46b8bd63156b8f59ba6cdef46fe2b7db0c5804388a2d0519b8ddb99"}, + {file = "greenlet-3.0.0-cp39-cp39-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:d55db1db455c59b46f794346efce896e754b8942817f46a1bada2d29446e305a"}, + {file = "greenlet-3.0.0-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:56867a3b3cf26dc8a0beecdb4459c59f4c47cdd5424618c08515f682e1d46692"}, + {file = "greenlet-3.0.0-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:9a812224a5fb17a538207e8cf8e86f517df2080c8ee0f8c1ed2bdaccd18f38f4"}, + {file = "greenlet-3.0.0-cp39-cp39-win32.whl", hash = "sha256:0d3f83ffb18dc57243e0151331e3c383b05e5b6c5029ac29f754745c800f8ed9"}, + {file = "greenlet-3.0.0-cp39-cp39-win_amd64.whl", hash = "sha256:831d6f35037cf18ca5e80a737a27d822d87cd922521d18ed3dbc8a6967be50ce"}, + {file = "greenlet-3.0.0-cp39-universal2-macosx_11_0_x86_64.whl", hash = "sha256:a048293392d4e058298710a54dfaefcefdf49d287cd33fb1f7d63d55426e4355"}, + {file = "greenlet-3.0.0.tar.gz", hash = "sha256:19834e3f91f485442adc1ee440171ec5d9a4840a1f7bd5ed97833544719ce10b"}, +] + +[package.extras] +docs = ["Sphinx"] +test = ["objgraph", "psutil"] + +[[package]] +name = "h11" +version = "0.14.0" +description = "A pure-Python, bring-your-own-I/O implementation of HTTP/1.1" +optional = false +python-versions = ">=3.7" +files = [ + {file = "h11-0.14.0-py3-none-any.whl", hash = "sha256:e3fe4ac4b851c468cc8363d500db52c2ead036020723024a109d37346efaa761"}, + {file = "h11-0.14.0.tar.gz", hash = "sha256:8f19fbbe99e72420ff35c00b27a34cb9937e902a8b810e2c88300c6f0a3b699d"}, +] + +[[package]] +name = "httpcore" +version = "1.0.2" +description = "A minimal low-level HTTP client." +optional = false +python-versions = ">=3.8" +files = [ + {file = "httpcore-1.0.2-py3-none-any.whl", hash = "sha256:096cc05bca73b8e459a1fc3dcf585148f63e534eae4339559c9b8a8d6399acc7"}, + {file = "httpcore-1.0.2.tar.gz", hash = "sha256:9fc092e4799b26174648e54b74ed5f683132a464e95643b226e00c2ed2fa6535"}, +] + +[package.dependencies] +certifi = "*" +h11 = ">=0.13,<0.15" + +[package.extras] +asyncio = ["anyio (>=4.0,<5.0)"] +http2 = ["h2 (>=3,<5)"] +socks = ["socksio (==1.*)"] +trio = ["trio (>=0.22.0,<0.23.0)"] + +[[package]] +name = "httpx" +version = "0.25.1" +description = "The next generation HTTP client." +optional = false +python-versions = ">=3.8" +files = [ + {file = "httpx-0.25.1-py3-none-any.whl", hash = "sha256:fec7d6cc5c27c578a391f7e87b9aa7d3d8fbcd034f6399f9f79b45bcc12a866a"}, + {file = "httpx-0.25.1.tar.gz", hash = "sha256:ffd96d5cf901e63863d9f1b4b6807861dbea4d301613415d9e6e57ead15fc5d0"}, +] + +[package.dependencies] +anyio = "*" +certifi = "*" +httpcore = "*" +idna = "*" +sniffio = "*" + +[package.extras] +brotli = ["brotli", "brotlicffi"] +cli = ["click (==8.*)", "pygments (==2.*)", "rich (>=10,<14)"] +http2 = ["h2 (>=3,<5)"] +socks = ["socksio (==1.*)"] + +[[package]] +name = "httpx-sse" +version = "0.3.1" +description = "Consume Server-Sent Event (SSE) messages with HTTPX." +optional = false +python-versions = ">=3.7" +files = [ + {file = "httpx-sse-0.3.1.tar.gz", hash = "sha256:3bb3289b2867f50cbdb2fee3eeeefecb1e86653122e164faac0023f1ffc88aea"}, + {file = "httpx_sse-0.3.1-py3-none-any.whl", hash = "sha256:7376dd88732892f9b6b549ac0ad05a8e2341172fe7dcf9f8f9c8050934297316"}, +] + +[[package]] +name = "idna" +version = "3.4" +description = "Internationalized Domain Names in Applications (IDNA)" +optional = false +python-versions = ">=3.5" +files = [ + {file = "idna-3.4-py3-none-any.whl", hash = "sha256:90b77e79eaa3eba6de819a0c442c0b4ceefc341a7a2ab77d7562bf49f425c5c2"}, + {file = "idna-3.4.tar.gz", hash = "sha256:814f528e8dead7d329833b91c5faa87d60bf71824cd12a7530b5526063d02cb4"}, +] + +[[package]] +name = "jsonpatch" +version = "1.33" +description = "Apply JSON-Patches (RFC 6902)" +optional = false +python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*, !=3.4.*, !=3.5.*, !=3.6.*" +files = [ + {file = "jsonpatch-1.33-py2.py3-none-any.whl", hash = "sha256:0ae28c0cd062bbd8b8ecc26d7d164fbbea9652a1a3693f3b956c1eae5145dade"}, + {file = "jsonpatch-1.33.tar.gz", hash = "sha256:9fcd4009c41e6d12348b4a0ff2563ba56a2923a7dfee731d004e212e1ee5030c"}, +] + +[package.dependencies] +jsonpointer = ">=1.9" + +[[package]] +name = "jsonpointer" +version = "2.4" +description = "Identify specific nodes in a JSON document (RFC 6901)" +optional = false +python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*, !=3.4.*, !=3.5.*, !=3.6.*" +files = [ + {file = "jsonpointer-2.4-py2.py3-none-any.whl", hash = "sha256:15d51bba20eea3165644553647711d150376234112651b4f1811022aecad7d7a"}, + {file = "jsonpointer-2.4.tar.gz", hash = "sha256:585cee82b70211fa9e6043b7bb89db6e1aa49524340dde8ad6b63206ea689d88"}, +] + +[[package]] +name = "langchain" +version = "0.0.327" +description = "Building applications with LLMs through composability" +optional = false +python-versions = ">=3.8.1,<4.0" +files = [ + {file = "langchain-0.0.327-py3-none-any.whl", hash = "sha256:21835600e1ab11e2a939d9e473c13ed51402a3b75418ca02689877a5764da398"}, + {file = "langchain-0.0.327.tar.gz", hash = "sha256:2710fba0c0735d1a63327cad83387571adc457fe75075c70335e8ea628f0a8a2"}, +] + +[package.dependencies] +aiohttp = ">=3.8.3,<4.0.0" +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.52,<0.1.0" +numpy = ">=1,<2" +pydantic = ">=1,<3" +PyYAML = ">=5.3" +requests = ">=2,<3" +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.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)", "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)"] +qdrant = ["qdrant-client (>=1.3.1,<2.0.0)"] +text-helpers = ["chardet (>=5.1.0,<6.0.0)"] + +[[package]] +name = "langchain-cli" +version = "0.0.16" +description = "CLI for interacting with LangChain" +optional = false +python-versions = ">=3.8.1,<4.0" +files = [ + {file = "langchain_cli-0.0.16-py3-none-any.whl", hash = "sha256:24fb537f29bde36daf69d59d8b8c5363b8fc6cf437380fc20a2cbe71a5dbc286"}, + {file = "langchain_cli-0.0.16.tar.gz", hash = "sha256:6f7ef032cf0b26f0563c4793189389955b396cbb2465cdf7519a7cd61d2dcb20"}, +] + +[package.dependencies] +gitpython = ">=3.1.40,<4.0.0" +langserve = {version = ">=0.0.16", extras = ["all"]} +tomlkit = ">=0.12.2,<0.13.0" +typer = {version = ">=0.9.0,<0.10.0", extras = ["all"]} +uvicorn = ">=0.23.2,<0.24.0" + +[[package]] +name = "langserve" +version = "0.0.24" +description = "" +optional = false +python-versions = ">=3.8.1,<4.0.0" +files = [ + {file = "langserve-0.0.24-py3-none-any.whl", hash = "sha256:7c3f65b2585f39e5ad0b4ae8609eac9b59079ed5a7cfd8ef96d20a3ee5c20309"}, + {file = "langserve-0.0.24.tar.gz", hash = "sha256:aba25983943b2408a8bdf2d7a324da58d3ab84ce4ea6b134bc5ccd969e522725"}, +] + +[package.dependencies] +fastapi = {version = ">=0.90.1", optional = true, markers = "extra == \"server\" or extra == \"all\""} +httpx = ">=0.23.0" +httpx-sse = {version = ">=0.3.1", optional = true, markers = "extra == \"client\" or extra == \"all\""} +langchain = ">=0.0.322" +pydantic = ">=1" +sse-starlette = {version = ">=1.3.0,<2.0.0", optional = true, markers = "extra == \"server\" or extra == \"all\""} + +[package.extras] +all = ["fastapi (>=0.90.1)", "httpx-sse (>=0.3.1)", "sse-starlette (>=1.3.0,<2.0.0)"] +client = ["httpx-sse (>=0.3.1)"] +server = ["fastapi (>=0.90.1)", "sse-starlette (>=1.3.0,<2.0.0)"] + +[[package]] +name = "langsmith" +version = "0.0.54" +description = "Client library to connect to the LangSmith LLM Tracing and Evaluation Platform." +optional = false +python-versions = ">=3.8.1,<4.0" +files = [ + {file = "langsmith-0.0.54-py3-none-any.whl", hash = "sha256:55eca5967cadb661a49ad32aecda48a824fadef202ca384575209a9d6f823b74"}, + {file = "langsmith-0.0.54.tar.gz", hash = "sha256:76c8e34b4d10ad93541107138089635829f9d60601a7f6bddf5ba582d178e521"}, +] + +[package.dependencies] +pydantic = ">=1,<3" +requests = ">=2,<3" + +[[package]] +name = "loguru" +version = "0.7.2" +description = "Python logging made (stupidly) simple" +optional = false +python-versions = ">=3.5" +files = [ + {file = "loguru-0.7.2-py3-none-any.whl", hash = "sha256:003d71e3d3ed35f0f8984898359d65b79e5b21943f78af86aa5491210429b8eb"}, + {file = "loguru-0.7.2.tar.gz", hash = "sha256:e671a53522515f34fd406340ee968cb9ecafbc4b36c679da03c18fd8d0bd51ac"}, +] + +[package.dependencies] +colorama = {version = ">=0.3.4", markers = "sys_platform == \"win32\""} +win32-setctime = {version = ">=1.0.0", markers = "sys_platform == \"win32\""} + +[package.extras] +dev = ["Sphinx (==7.2.5)", "colorama (==0.4.5)", "colorama (==0.4.6)", "exceptiongroup (==1.1.3)", "freezegun (==1.1.0)", "freezegun (==1.2.2)", "mypy (==v0.910)", "mypy (==v0.971)", "mypy (==v1.4.1)", "mypy (==v1.5.1)", "pre-commit (==3.4.0)", "pytest (==6.1.2)", "pytest (==7.4.0)", "pytest-cov (==2.12.1)", "pytest-cov (==4.1.0)", "pytest-mypy-plugins (==1.9.3)", "pytest-mypy-plugins (==3.0.0)", "sphinx-autobuild (==2021.3.14)", "sphinx-rtd-theme (==1.3.0)", "tox (==3.27.1)", "tox (==4.11.0)"] + +[[package]] +name = "markdown-it-py" +version = "3.0.0" +description = "Python port of markdown-it. Markdown parsing, done right!" +optional = false +python-versions = ">=3.8" +files = [ + {file = "markdown-it-py-3.0.0.tar.gz", hash = "sha256:e3f60a94fa066dc52ec76661e37c851cb232d92f9886b15cb560aaada2df8feb"}, + {file = "markdown_it_py-3.0.0-py3-none-any.whl", hash = "sha256:355216845c60bd96232cd8d8c40e8f9765cc86f46880e43a8fd22dc1a1a8cab1"}, +] + +[package.dependencies] +mdurl = ">=0.1,<1.0" + +[package.extras] +benchmarking = ["psutil", "pytest", "pytest-benchmark"] +code-style = ["pre-commit (>=3.0,<4.0)"] +compare = ["commonmark (>=0.9,<1.0)", "markdown (>=3.4,<4.0)", "mistletoe (>=1.0,<2.0)", "mistune (>=2.0,<3.0)", "panflute (>=2.3,<3.0)"] +linkify = ["linkify-it-py (>=1,<3)"] +plugins = ["mdit-py-plugins"] +profiling = ["gprof2dot"] +rtd = ["jupyter_sphinx", "mdit-py-plugins", "myst-parser", "pyyaml", "sphinx", "sphinx-copybutton", "sphinx-design", "sphinx_book_theme"] +testing = ["coverage", "pytest", "pytest-cov", "pytest-regressions"] + +[[package]] +name = "marshmallow" +version = "3.20.1" +description = "A lightweight library for converting complex datatypes to and from native Python datatypes." +optional = false +python-versions = ">=3.8" +files = [ + {file = "marshmallow-3.20.1-py3-none-any.whl", hash = "sha256:684939db93e80ad3561392f47be0230743131560a41c5110684c16e21ade0a5c"}, + {file = "marshmallow-3.20.1.tar.gz", hash = "sha256:5d2371bbe42000f2b3fb5eaa065224df7d8f8597bc19a1bbfa5bfe7fba8da889"}, +] + +[package.dependencies] +packaging = ">=17.0" + +[package.extras] +dev = ["flake8 (==6.0.0)", "flake8-bugbear (==23.7.10)", "mypy (==1.4.1)", "pre-commit (>=2.4,<4.0)", "pytest", "pytz", "simplejson", "tox"] +docs = ["alabaster (==0.7.13)", "autodocsumm (==0.2.11)", "sphinx (==7.0.1)", "sphinx-issues (==3.0.1)", "sphinx-version-warning (==1.1.2)"] +lint = ["flake8 (==6.0.0)", "flake8-bugbear (==23.7.10)", "mypy (==1.4.1)", "pre-commit (>=2.4,<4.0)"] +tests = ["pytest", "pytz", "simplejson"] + +[[package]] +name = "mdurl" +version = "0.1.2" +description = "Markdown URL utilities" +optional = false +python-versions = ">=3.7" +files = [ + {file = "mdurl-0.1.2-py3-none-any.whl", hash = "sha256:84008a41e51615a49fc9966191ff91509e3c40b939176e643fd50a5c2196b8f8"}, + {file = "mdurl-0.1.2.tar.gz", hash = "sha256:bb413d29f5eea38f31dd4754dd7377d4465116fb207585f97bf925588687c1ba"}, +] + +[[package]] +name = "multidict" +version = "6.0.4" +description = "multidict implementation" +optional = false +python-versions = ">=3.7" +files = [ + {file = "multidict-6.0.4-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:0b1a97283e0c85772d613878028fec909f003993e1007eafa715b24b377cb9b8"}, + {file = "multidict-6.0.4-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:eeb6dcc05e911516ae3d1f207d4b0520d07f54484c49dfc294d6e7d63b734171"}, + {file = "multidict-6.0.4-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:d6d635d5209b82a3492508cf5b365f3446afb65ae7ebd755e70e18f287b0adf7"}, + {file = "multidict-6.0.4-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:c048099e4c9e9d615545e2001d3d8a4380bd403e1a0578734e0d31703d1b0c0b"}, + {file = "multidict-6.0.4-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:ea20853c6dbbb53ed34cb4d080382169b6f4554d394015f1bef35e881bf83547"}, + {file = "multidict-6.0.4-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:16d232d4e5396c2efbbf4f6d4df89bfa905eb0d4dc5b3549d872ab898451f569"}, + {file = "multidict-6.0.4-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:36c63aaa167f6c6b04ef2c85704e93af16c11d20de1d133e39de6a0e84582a93"}, + {file = "multidict-6.0.4-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:64bdf1086b6043bf519869678f5f2757f473dee970d7abf6da91ec00acb9cb98"}, + {file = "multidict-6.0.4-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:43644e38f42e3af682690876cff722d301ac585c5b9e1eacc013b7a3f7b696a0"}, + {file = "multidict-6.0.4-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:7582a1d1030e15422262de9f58711774e02fa80df0d1578995c76214f6954988"}, + {file = "multidict-6.0.4-cp310-cp310-musllinux_1_1_ppc64le.whl", hash = "sha256:ddff9c4e225a63a5afab9dd15590432c22e8057e1a9a13d28ed128ecf047bbdc"}, + {file = "multidict-6.0.4-cp310-cp310-musllinux_1_1_s390x.whl", hash = "sha256:ee2a1ece51b9b9e7752e742cfb661d2a29e7bcdba2d27e66e28a99f1890e4fa0"}, + {file = "multidict-6.0.4-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:a2e4369eb3d47d2034032a26c7a80fcb21a2cb22e1173d761a162f11e562caa5"}, + {file = "multidict-6.0.4-cp310-cp310-win32.whl", hash = "sha256:574b7eae1ab267e5f8285f0fe881f17efe4b98c39a40858247720935b893bba8"}, + {file = "multidict-6.0.4-cp310-cp310-win_amd64.whl", hash = "sha256:4dcbb0906e38440fa3e325df2359ac6cb043df8e58c965bb45f4e406ecb162cc"}, + {file = "multidict-6.0.4-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:0dfad7a5a1e39c53ed00d2dd0c2e36aed4650936dc18fd9a1826a5ae1cad6f03"}, + {file = "multidict-6.0.4-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:64da238a09d6039e3bd39bb3aee9c21a5e34f28bfa5aa22518581f910ff94af3"}, + {file = "multidict-6.0.4-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:ff959bee35038c4624250473988b24f846cbeb2c6639de3602c073f10410ceba"}, + {file = "multidict-6.0.4-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:01a3a55bd90018c9c080fbb0b9f4891db37d148a0a18722b42f94694f8b6d4c9"}, + {file = "multidict-6.0.4-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:c5cb09abb18c1ea940fb99360ea0396f34d46566f157122c92dfa069d3e0e982"}, + {file = "multidict-6.0.4-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:666daae833559deb2d609afa4490b85830ab0dfca811a98b70a205621a6109fe"}, + {file = "multidict-6.0.4-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:11bdf3f5e1518b24530b8241529d2050014c884cf18b6fc69c0c2b30ca248710"}, + {file = "multidict-6.0.4-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:7d18748f2d30f94f498e852c67d61261c643b349b9d2a581131725595c45ec6c"}, + {file = "multidict-6.0.4-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:458f37be2d9e4c95e2d8866a851663cbc76e865b78395090786f6cd9b3bbf4f4"}, + {file = "multidict-6.0.4-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:b1a2eeedcead3a41694130495593a559a668f382eee0727352b9a41e1c45759a"}, + {file = "multidict-6.0.4-cp311-cp311-musllinux_1_1_ppc64le.whl", hash = "sha256:7d6ae9d593ef8641544d6263c7fa6408cc90370c8cb2bbb65f8d43e5b0351d9c"}, + {file = "multidict-6.0.4-cp311-cp311-musllinux_1_1_s390x.whl", hash = "sha256:5979b5632c3e3534e42ca6ff856bb24b2e3071b37861c2c727ce220d80eee9ed"}, + {file = "multidict-6.0.4-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:dcfe792765fab89c365123c81046ad4103fcabbc4f56d1c1997e6715e8015461"}, + {file = "multidict-6.0.4-cp311-cp311-win32.whl", hash = "sha256:3601a3cece3819534b11d4efc1eb76047488fddd0c85a3948099d5da4d504636"}, + {file = "multidict-6.0.4-cp311-cp311-win_amd64.whl", hash = "sha256:81a4f0b34bd92df3da93315c6a59034df95866014ac08535fc819f043bfd51f0"}, + {file = "multidict-6.0.4-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:67040058f37a2a51ed8ea8f6b0e6ee5bd78ca67f169ce6122f3e2ec80dfe9b78"}, + {file = "multidict-6.0.4-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:853888594621e6604c978ce2a0444a1e6e70c8d253ab65ba11657659dcc9100f"}, + {file = "multidict-6.0.4-cp37-cp37m-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:39ff62e7d0f26c248b15e364517a72932a611a9b75f35b45be078d81bdb86603"}, + {file = "multidict-6.0.4-cp37-cp37m-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:af048912e045a2dc732847d33821a9d84ba553f5c5f028adbd364dd4765092ac"}, + {file = "multidict-6.0.4-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:b1e8b901e607795ec06c9e42530788c45ac21ef3aaa11dbd0c69de543bfb79a9"}, + {file = "multidict-6.0.4-cp37-cp37m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:62501642008a8b9871ddfccbf83e4222cf8ac0d5aeedf73da36153ef2ec222d2"}, + {file = "multidict-6.0.4-cp37-cp37m-musllinux_1_1_aarch64.whl", hash = "sha256:99b76c052e9f1bc0721f7541e5e8c05db3941eb9ebe7b8553c625ef88d6eefde"}, + {file = "multidict-6.0.4-cp37-cp37m-musllinux_1_1_i686.whl", hash = "sha256:509eac6cf09c794aa27bcacfd4d62c885cce62bef7b2c3e8b2e49d365b5003fe"}, + {file = "multidict-6.0.4-cp37-cp37m-musllinux_1_1_ppc64le.whl", hash = "sha256:21a12c4eb6ddc9952c415f24eef97e3e55ba3af61f67c7bc388dcdec1404a067"}, + {file = "multidict-6.0.4-cp37-cp37m-musllinux_1_1_s390x.whl", hash = "sha256:5cad9430ab3e2e4fa4a2ef4450f548768400a2ac635841bc2a56a2052cdbeb87"}, + {file = "multidict-6.0.4-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:ab55edc2e84460694295f401215f4a58597f8f7c9466faec545093045476327d"}, + {file = "multidict-6.0.4-cp37-cp37m-win32.whl", hash = "sha256:5a4dcf02b908c3b8b17a45fb0f15b695bf117a67b76b7ad18b73cf8e92608775"}, + {file = "multidict-6.0.4-cp37-cp37m-win_amd64.whl", hash = "sha256:6ed5f161328b7df384d71b07317f4d8656434e34591f20552c7bcef27b0ab88e"}, + {file = "multidict-6.0.4-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:5fc1b16f586f049820c5c5b17bb4ee7583092fa0d1c4e28b5239181ff9532e0c"}, + {file = "multidict-6.0.4-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:1502e24330eb681bdaa3eb70d6358e818e8e8f908a22a1851dfd4e15bc2f8161"}, + {file = "multidict-6.0.4-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:b692f419760c0e65d060959df05f2a531945af31fda0c8a3b3195d4efd06de11"}, + {file = "multidict-6.0.4-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:45e1ecb0379bfaab5eef059f50115b54571acfbe422a14f668fc8c27ba410e7e"}, + {file = "multidict-6.0.4-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:ddd3915998d93fbcd2566ddf9cf62cdb35c9e093075f862935573d265cf8f65d"}, + {file = "multidict-6.0.4-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:59d43b61c59d82f2effb39a93c48b845efe23a3852d201ed2d24ba830d0b4cf2"}, + {file = "multidict-6.0.4-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:cc8e1d0c705233c5dd0c5e6460fbad7827d5d36f310a0fadfd45cc3029762258"}, + {file = "multidict-6.0.4-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:d6aa0418fcc838522256761b3415822626f866758ee0bc6632c9486b179d0b52"}, + {file = "multidict-6.0.4-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:6748717bb10339c4760c1e63da040f5f29f5ed6e59d76daee30305894069a660"}, + {file = "multidict-6.0.4-cp38-cp38-musllinux_1_1_i686.whl", hash = "sha256:4d1a3d7ef5e96b1c9e92f973e43aa5e5b96c659c9bc3124acbbd81b0b9c8a951"}, + {file = "multidict-6.0.4-cp38-cp38-musllinux_1_1_ppc64le.whl", hash = "sha256:4372381634485bec7e46718edc71528024fcdc6f835baefe517b34a33c731d60"}, + {file = "multidict-6.0.4-cp38-cp38-musllinux_1_1_s390x.whl", hash = "sha256:fc35cb4676846ef752816d5be2193a1e8367b4c1397b74a565a9d0389c433a1d"}, + {file = "multidict-6.0.4-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:4b9d9e4e2b37daddb5c23ea33a3417901fa7c7b3dee2d855f63ee67a0b21e5b1"}, + {file = "multidict-6.0.4-cp38-cp38-win32.whl", hash = "sha256:e41b7e2b59679edfa309e8db64fdf22399eec4b0b24694e1b2104fb789207779"}, + {file = "multidict-6.0.4-cp38-cp38-win_amd64.whl", hash = "sha256:d6c254ba6e45d8e72739281ebc46ea5eb5f101234f3ce171f0e9f5cc86991480"}, + {file = "multidict-6.0.4-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:16ab77bbeb596e14212e7bab8429f24c1579234a3a462105cda4a66904998664"}, + {file = "multidict-6.0.4-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:bc779e9e6f7fda81b3f9aa58e3a6091d49ad528b11ed19f6621408806204ad35"}, + {file = "multidict-6.0.4-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:4ceef517eca3e03c1cceb22030a3e39cb399ac86bff4e426d4fc6ae49052cc60"}, + {file = "multidict-6.0.4-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:281af09f488903fde97923c7744bb001a9b23b039a909460d0f14edc7bf59706"}, + {file = "multidict-6.0.4-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:52f2dffc8acaba9a2f27174c41c9e57f60b907bb9f096b36b1a1f3be71c6284d"}, + {file = "multidict-6.0.4-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:b41156839806aecb3641f3208c0dafd3ac7775b9c4c422d82ee2a45c34ba81ca"}, + {file = "multidict-6.0.4-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:d5e3fc56f88cc98ef8139255cf8cd63eb2c586531e43310ff859d6bb3a6b51f1"}, + {file = "multidict-6.0.4-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:8316a77808c501004802f9beebde51c9f857054a0c871bd6da8280e718444449"}, + {file = "multidict-6.0.4-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:f70b98cd94886b49d91170ef23ec5c0e8ebb6f242d734ed7ed677b24d50c82cf"}, + {file = "multidict-6.0.4-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:bf6774e60d67a9efe02b3616fee22441d86fab4c6d335f9d2051d19d90a40063"}, + {file = "multidict-6.0.4-cp39-cp39-musllinux_1_1_ppc64le.whl", hash = "sha256:e69924bfcdda39b722ef4d9aa762b2dd38e4632b3641b1d9a57ca9cd18f2f83a"}, + {file = "multidict-6.0.4-cp39-cp39-musllinux_1_1_s390x.whl", hash = "sha256:6b181d8c23da913d4ff585afd1155a0e1194c0b50c54fcfe286f70cdaf2b7176"}, + {file = "multidict-6.0.4-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:52509b5be062d9eafc8170e53026fbc54cf3b32759a23d07fd935fb04fc22d95"}, + {file = "multidict-6.0.4-cp39-cp39-win32.whl", hash = "sha256:27c523fbfbdfd19c6867af7346332b62b586eed663887392cff78d614f9ec313"}, + {file = "multidict-6.0.4-cp39-cp39-win_amd64.whl", hash = "sha256:33029f5734336aa0d4c0384525da0387ef89148dc7191aae00ca5fb23d7aafc2"}, + {file = "multidict-6.0.4.tar.gz", hash = "sha256:3666906492efb76453c0e7b97f2cf459b0682e7402c0489a95484965dbc1da49"}, +] + +[[package]] +name = "mypy-extensions" +version = "1.0.0" +description = "Type system extensions for programs checked with the mypy type checker." +optional = false +python-versions = ">=3.5" +files = [ + {file = "mypy_extensions-1.0.0-py3-none-any.whl", hash = "sha256:4392f6c0eb8a5668a69e23d168ffa70f0be9ccfd32b5cc2d26a34ae5b844552d"}, + {file = "mypy_extensions-1.0.0.tar.gz", hash = "sha256:75dbf8955dc00442a438fc4d0666508a9a97b6bd41aa2f0ffe9d2f2725af0782"}, +] + +[[package]] +name = "numpy" +version = "1.24.4" +description = "Fundamental package for array computing in Python" +optional = false +python-versions = ">=3.8" +files = [ + {file = "numpy-1.24.4-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:c0bfb52d2169d58c1cdb8cc1f16989101639b34c7d3ce60ed70b19c63eba0b64"}, + {file = "numpy-1.24.4-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:ed094d4f0c177b1b8e7aa9cba7d6ceed51c0e569a5318ac0ca9a090680a6a1b1"}, + {file = "numpy-1.24.4-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:79fc682a374c4a8ed08b331bef9c5f582585d1048fa6d80bc6c35bc384eee9b4"}, + {file = "numpy-1.24.4-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:7ffe43c74893dbf38c2b0a1f5428760a1a9c98285553c89e12d70a96a7f3a4d6"}, + {file = "numpy-1.24.4-cp310-cp310-win32.whl", hash = "sha256:4c21decb6ea94057331e111a5bed9a79d335658c27ce2adb580fb4d54f2ad9bc"}, + {file = "numpy-1.24.4-cp310-cp310-win_amd64.whl", hash = "sha256:b4bea75e47d9586d31e892a7401f76e909712a0fd510f58f5337bea9572c571e"}, + {file = "numpy-1.24.4-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:f136bab9c2cfd8da131132c2cf6cc27331dd6fae65f95f69dcd4ae3c3639c810"}, + {file = "numpy-1.24.4-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:e2926dac25b313635e4d6cf4dc4e51c8c0ebfed60b801c799ffc4c32bf3d1254"}, + {file = "numpy-1.24.4-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:222e40d0e2548690405b0b3c7b21d1169117391c2e82c378467ef9ab4c8f0da7"}, + {file = "numpy-1.24.4-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:7215847ce88a85ce39baf9e89070cb860c98fdddacbaa6c0da3ffb31b3350bd5"}, + {file = "numpy-1.24.4-cp311-cp311-win32.whl", hash = "sha256:4979217d7de511a8d57f4b4b5b2b965f707768440c17cb70fbf254c4b225238d"}, + {file = "numpy-1.24.4-cp311-cp311-win_amd64.whl", hash = "sha256:b7b1fc9864d7d39e28f41d089bfd6353cb5f27ecd9905348c24187a768c79694"}, + {file = "numpy-1.24.4-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:1452241c290f3e2a312c137a9999cdbf63f78864d63c79039bda65ee86943f61"}, + {file = "numpy-1.24.4-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:04640dab83f7c6c85abf9cd729c5b65f1ebd0ccf9de90b270cd61935eef0197f"}, + {file = "numpy-1.24.4-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:a5425b114831d1e77e4b5d812b69d11d962e104095a5b9c3b641a218abcc050e"}, + {file = "numpy-1.24.4-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:dd80e219fd4c71fc3699fc1dadac5dcf4fd882bfc6f7ec53d30fa197b8ee22dc"}, + {file = "numpy-1.24.4-cp38-cp38-win32.whl", hash = "sha256:4602244f345453db537be5314d3983dbf5834a9701b7723ec28923e2889e0bb2"}, + {file = "numpy-1.24.4-cp38-cp38-win_amd64.whl", hash = "sha256:692f2e0f55794943c5bfff12b3f56f99af76f902fc47487bdfe97856de51a706"}, + {file = "numpy-1.24.4-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:2541312fbf09977f3b3ad449c4e5f4bb55d0dbf79226d7724211acc905049400"}, + {file = "numpy-1.24.4-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:9667575fb6d13c95f1b36aca12c5ee3356bf001b714fc354eb5465ce1609e62f"}, + {file = "numpy-1.24.4-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:f3a86ed21e4f87050382c7bc96571755193c4c1392490744ac73d660e8f564a9"}, + {file = "numpy-1.24.4-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:d11efb4dbecbdf22508d55e48d9c8384db795e1b7b51ea735289ff96613ff74d"}, + {file = "numpy-1.24.4-cp39-cp39-win32.whl", hash = "sha256:6620c0acd41dbcb368610bb2f4d83145674040025e5536954782467100aa8835"}, + {file = "numpy-1.24.4-cp39-cp39-win_amd64.whl", hash = "sha256:befe2bf740fd8373cf56149a5c23a0f601e82869598d41f8e188a0e9869926f8"}, + {file = "numpy-1.24.4-pp38-pypy38_pp73-macosx_10_9_x86_64.whl", hash = "sha256:31f13e25b4e304632a4619d0e0777662c2ffea99fcae2029556b17d8ff958aef"}, + {file = "numpy-1.24.4-pp38-pypy38_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:95f7ac6540e95bc440ad77f56e520da5bf877f87dca58bd095288dce8940532a"}, + {file = "numpy-1.24.4-pp38-pypy38_pp73-win_amd64.whl", hash = "sha256:e98f220aa76ca2a977fe435f5b04d7b3470c0a2e6312907b37ba6068f26787f2"}, + {file = "numpy-1.24.4.tar.gz", hash = "sha256:80f5e3a4e498641401868df4208b74581206afbee7cf7b8329daae82676d9463"}, +] + +[[package]] +name = "openai" +version = "0.28.1" +description = "Python client library for the OpenAI API" +optional = false +python-versions = ">=3.7.1" +files = [ + {file = "openai-0.28.1-py3-none-any.whl", hash = "sha256:d18690f9e3d31eedb66b57b88c2165d760b24ea0a01f150dd3f068155088ce68"}, + {file = "openai-0.28.1.tar.gz", hash = "sha256:4be1dad329a65b4ce1a660fe6d5431b438f429b5855c883435f0f7fcb6d2dcc8"}, +] + +[package.dependencies] +aiohttp = "*" +requests = ">=2.20" +tqdm = "*" + +[package.extras] +datalib = ["numpy", "openpyxl (>=3.0.7)", "pandas (>=1.2.3)", "pandas-stubs (>=1.1.0.11)"] +dev = ["black (>=21.6b0,<22.0)", "pytest (==6.*)", "pytest-asyncio", "pytest-mock"] +embeddings = ["matplotlib", "numpy", "openpyxl (>=3.0.7)", "pandas (>=1.2.3)", "pandas-stubs (>=1.1.0.11)", "plotly", "scikit-learn (>=1.0.2)", "scipy", "tenacity (>=8.0.1)"] +wandb = ["numpy", "openpyxl (>=3.0.7)", "pandas (>=1.2.3)", "pandas-stubs (>=1.1.0.11)", "wandb"] + +[[package]] +name = "packaging" +version = "23.2" +description = "Core utilities for Python packages" +optional = false +python-versions = ">=3.7" +files = [ + {file = "packaging-23.2-py3-none-any.whl", hash = "sha256:8c491190033a9af7e1d931d0b5dacc2ef47509b34dd0de67ed209b5203fc88c7"}, + {file = "packaging-23.2.tar.gz", hash = "sha256:048fb0e9405036518eaaf48a55953c750c11e1a1b68e0dd1a9d62ed0c092cfc5"}, +] + +[[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 = "pinecone-client" +version = "2.2.4" +description = "Pinecone client and SDK" +optional = false +python-versions = ">=3.8" +files = [ + {file = "pinecone-client-2.2.4.tar.gz", hash = "sha256:2c1cc1d6648b2be66e944db2ffa59166a37b9164d1135ad525d9cd8b1e298168"}, + {file = "pinecone_client-2.2.4-py3-none-any.whl", hash = "sha256:5bf496c01c2f82f4e5c2dc977cc5062ecd7168b8ed90743b09afcc8c7eb242ec"}, +] + +[package.dependencies] +dnspython = ">=2.0.0" +loguru = ">=0.5.0" +numpy = ">=1.22.0" +python-dateutil = ">=2.5.3" +pyyaml = ">=5.4" +requests = ">=2.19.0" +tqdm = ">=4.64.1" +typing-extensions = ">=3.7.4" +urllib3 = ">=1.21.1" + +[package.extras] +grpc = ["googleapis-common-protos (>=1.53.0)", "grpc-gateway-protoc-gen-openapiv2 (==0.1.0)", "grpcio (>=1.44.0)", "lz4 (>=3.1.3)", "protobuf (>=3.20.0,<3.21.0)"] + +[[package]] +name = "psycopg2" +version = "2.9.9" +description = "psycopg2 - Python-PostgreSQL Database Adapter" +optional = false +python-versions = ">=3.7" +files = [ + {file = "psycopg2-2.9.9-cp310-cp310-win32.whl", hash = "sha256:38a8dcc6856f569068b47de286b472b7c473ac7977243593a288ebce0dc89516"}, + {file = "psycopg2-2.9.9-cp310-cp310-win_amd64.whl", hash = "sha256:426f9f29bde126913a20a96ff8ce7d73fd8a216cfb323b1f04da402d452853c3"}, + {file = "psycopg2-2.9.9-cp311-cp311-win32.whl", hash = "sha256:ade01303ccf7ae12c356a5e10911c9e1c51136003a9a1d92f7aa9d010fb98372"}, + {file = "psycopg2-2.9.9-cp311-cp311-win_amd64.whl", hash = "sha256:121081ea2e76729acfb0673ff33755e8703d45e926e416cb59bae3a86c6a4981"}, + {file = "psycopg2-2.9.9-cp312-cp312-win32.whl", hash = "sha256:d735786acc7dd25815e89cc4ad529a43af779db2e25aa7c626de864127e5a024"}, + {file = "psycopg2-2.9.9-cp312-cp312-win_amd64.whl", hash = "sha256:a7653d00b732afb6fc597e29c50ad28087dcb4fbfb28e86092277a559ae4e693"}, + {file = "psycopg2-2.9.9-cp37-cp37m-win32.whl", hash = "sha256:5e0d98cade4f0e0304d7d6f25bbfbc5bd186e07b38eac65379309c4ca3193efa"}, + {file = "psycopg2-2.9.9-cp37-cp37m-win_amd64.whl", hash = "sha256:7e2dacf8b009a1c1e843b5213a87f7c544b2b042476ed7755be813eaf4e8347a"}, + {file = "psycopg2-2.9.9-cp38-cp38-win32.whl", hash = "sha256:ff432630e510709564c01dafdbe996cb552e0b9f3f065eb89bdce5bd31fabf4c"}, + {file = "psycopg2-2.9.9-cp38-cp38-win_amd64.whl", hash = "sha256:bac58c024c9922c23550af2a581998624d6e02350f4ae9c5f0bc642c633a2d5e"}, + {file = "psycopg2-2.9.9-cp39-cp39-win32.whl", hash = "sha256:c92811b2d4c9b6ea0285942b2e7cac98a59e166d59c588fe5cfe1eda58e72d59"}, + {file = "psycopg2-2.9.9-cp39-cp39-win_amd64.whl", hash = "sha256:de80739447af31525feddeb8effd640782cf5998e1a4e9192ebdf829717e3913"}, + {file = "psycopg2-2.9.9.tar.gz", hash = "sha256:d1454bde93fb1e224166811694d600e746430c006fbb031ea06ecc2ea41bf156"}, +] + +[[package]] +name = "pydantic" +version = "2.4.2" +description = "Data validation using Python type hints" +optional = false +python-versions = ">=3.7" +files = [ + {file = "pydantic-2.4.2-py3-none-any.whl", hash = "sha256:bc3ddf669d234f4220e6e1c4d96b061abe0998185a8d7855c0126782b7abc8c1"}, + {file = "pydantic-2.4.2.tar.gz", hash = "sha256:94f336138093a5d7f426aac732dcfe7ab4eb4da243c88f891d65deb4a2556ee7"}, +] + +[package.dependencies] +annotated-types = ">=0.4.0" +pydantic-core = "2.10.1" +typing-extensions = ">=4.6.1" + +[package.extras] +email = ["email-validator (>=2.0.0)"] + +[[package]] +name = "pydantic-core" +version = "2.10.1" +description = "" +optional = false +python-versions = ">=3.7" +files = [ + {file = "pydantic_core-2.10.1-cp310-cp310-macosx_10_7_x86_64.whl", hash = "sha256:d64728ee14e667ba27c66314b7d880b8eeb050e58ffc5fec3b7a109f8cddbd63"}, + {file = "pydantic_core-2.10.1-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:48525933fea744a3e7464c19bfede85df4aba79ce90c60b94d8b6e1eddd67096"}, + {file = "pydantic_core-2.10.1-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:ef337945bbd76cce390d1b2496ccf9f90b1c1242a3a7bc242ca4a9fc5993427a"}, + {file = "pydantic_core-2.10.1-cp310-cp310-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:a1392e0638af203cee360495fd2cfdd6054711f2db5175b6e9c3c461b76f5175"}, + {file = "pydantic_core-2.10.1-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:0675ba5d22de54d07bccde38997e780044dcfa9a71aac9fd7d4d7a1d2e3e65f7"}, + {file = "pydantic_core-2.10.1-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:128552af70a64660f21cb0eb4876cbdadf1a1f9d5de820fed6421fa8de07c893"}, + {file = "pydantic_core-2.10.1-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:8f6e6aed5818c264412ac0598b581a002a9f050cb2637a84979859e70197aa9e"}, + {file = "pydantic_core-2.10.1-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:ecaac27da855b8d73f92123e5f03612b04c5632fd0a476e469dfc47cd37d6b2e"}, + {file = "pydantic_core-2.10.1-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:b3c01c2fb081fced3bbb3da78510693dc7121bb893a1f0f5f4b48013201f362e"}, + {file = "pydantic_core-2.10.1-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:92f675fefa977625105708492850bcbc1182bfc3e997f8eecb866d1927c98ae6"}, + {file = "pydantic_core-2.10.1-cp310-none-win32.whl", hash = "sha256:420a692b547736a8d8703c39ea935ab5d8f0d2573f8f123b0a294e49a73f214b"}, + {file = "pydantic_core-2.10.1-cp310-none-win_amd64.whl", hash = "sha256:0880e239827b4b5b3e2ce05e6b766a7414e5f5aedc4523be6b68cfbc7f61c5d0"}, + {file = "pydantic_core-2.10.1-cp311-cp311-macosx_10_7_x86_64.whl", hash = "sha256:073d4a470b195d2b2245d0343569aac7e979d3a0dcce6c7d2af6d8a920ad0bea"}, + {file = "pydantic_core-2.10.1-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:600d04a7b342363058b9190d4e929a8e2e715c5682a70cc37d5ded1e0dd370b4"}, + {file = "pydantic_core-2.10.1-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:39215d809470f4c8d1881758575b2abfb80174a9e8daf8f33b1d4379357e417c"}, + {file = "pydantic_core-2.10.1-cp311-cp311-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:eeb3d3d6b399ffe55f9a04e09e635554012f1980696d6b0aca3e6cf42a17a03b"}, + {file = "pydantic_core-2.10.1-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:a7a7902bf75779bc12ccfc508bfb7a4c47063f748ea3de87135d433a4cca7a2f"}, + {file = "pydantic_core-2.10.1-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:3625578b6010c65964d177626fde80cf60d7f2e297d56b925cb5cdeda6e9925a"}, + {file = "pydantic_core-2.10.1-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:caa48fc31fc7243e50188197b5f0c4228956f97b954f76da157aae7f67269ae8"}, + {file = "pydantic_core-2.10.1-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:07ec6d7d929ae9c68f716195ce15e745b3e8fa122fc67698ac6498d802ed0fa4"}, + {file = "pydantic_core-2.10.1-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:e6f31a17acede6a8cd1ae2d123ce04d8cca74056c9d456075f4f6f85de055607"}, + {file = "pydantic_core-2.10.1-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:d8f1ebca515a03e5654f88411420fea6380fc841d1bea08effb28184e3d4899f"}, + {file = "pydantic_core-2.10.1-cp311-none-win32.whl", hash = "sha256:6db2eb9654a85ada248afa5a6db5ff1cf0f7b16043a6b070adc4a5be68c716d6"}, + {file = "pydantic_core-2.10.1-cp311-none-win_amd64.whl", hash = "sha256:4a5be350f922430997f240d25f8219f93b0c81e15f7b30b868b2fddfc2d05f27"}, + {file = "pydantic_core-2.10.1-cp311-none-win_arm64.whl", hash = "sha256:5fdb39f67c779b183b0c853cd6b45f7db84b84e0571b3ef1c89cdb1dfc367325"}, + {file = "pydantic_core-2.10.1-cp312-cp312-macosx_10_7_x86_64.whl", hash = "sha256:b1f22a9ab44de5f082216270552aa54259db20189e68fc12484873d926426921"}, + {file = "pydantic_core-2.10.1-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:8572cadbf4cfa95fb4187775b5ade2eaa93511f07947b38f4cd67cf10783b118"}, + {file = "pydantic_core-2.10.1-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:db9a28c063c7c00844ae42a80203eb6d2d6bbb97070cfa00194dff40e6f545ab"}, + {file = "pydantic_core-2.10.1-cp312-cp312-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:0e2a35baa428181cb2270a15864ec6286822d3576f2ed0f4cd7f0c1708472aff"}, + {file = "pydantic_core-2.10.1-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:05560ab976012bf40f25d5225a58bfa649bb897b87192a36c6fef1ab132540d7"}, + {file = "pydantic_core-2.10.1-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:d6495008733c7521a89422d7a68efa0a0122c99a5861f06020ef5b1f51f9ba7c"}, + {file = "pydantic_core-2.10.1-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:14ac492c686defc8e6133e3a2d9eaf5261b3df26b8ae97450c1647286750b901"}, + {file = "pydantic_core-2.10.1-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:8282bab177a9a3081fd3d0a0175a07a1e2bfb7fcbbd949519ea0980f8a07144d"}, + {file = "pydantic_core-2.10.1-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:aafdb89fdeb5fe165043896817eccd6434aee124d5ee9b354f92cd574ba5e78f"}, + {file = "pydantic_core-2.10.1-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:f6defd966ca3b187ec6c366604e9296f585021d922e666b99c47e78738b5666c"}, + {file = "pydantic_core-2.10.1-cp312-none-win32.whl", hash = "sha256:7c4d1894fe112b0864c1fa75dffa045720a194b227bed12f4be7f6045b25209f"}, + {file = "pydantic_core-2.10.1-cp312-none-win_amd64.whl", hash = "sha256:5994985da903d0b8a08e4935c46ed8daf5be1cf217489e673910951dc533d430"}, + {file = "pydantic_core-2.10.1-cp312-none-win_arm64.whl", hash = "sha256:0d8a8adef23d86d8eceed3e32e9cca8879c7481c183f84ed1a8edc7df073af94"}, + {file = "pydantic_core-2.10.1-cp37-cp37m-macosx_10_7_x86_64.whl", hash = "sha256:9badf8d45171d92387410b04639d73811b785b5161ecadabf056ea14d62d4ede"}, + {file = "pydantic_core-2.10.1-cp37-cp37m-macosx_11_0_arm64.whl", hash = "sha256:ebedb45b9feb7258fac0a268a3f6bec0a2ea4d9558f3d6f813f02ff3a6dc6698"}, + {file = "pydantic_core-2.10.1-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:cfe1090245c078720d250d19cb05d67e21a9cd7c257698ef139bc41cf6c27b4f"}, + {file = "pydantic_core-2.10.1-cp37-cp37m-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:e357571bb0efd65fd55f18db0a2fb0ed89d0bb1d41d906b138f088933ae618bb"}, + {file = "pydantic_core-2.10.1-cp37-cp37m-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:b3dcd587b69bbf54fc04ca157c2323b8911033e827fffaecf0cafa5a892a0904"}, + {file = "pydantic_core-2.10.1-cp37-cp37m-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:9c120c9ce3b163b985a3b966bb701114beb1da4b0468b9b236fc754783d85aa3"}, + {file = "pydantic_core-2.10.1-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:15d6bca84ffc966cc9976b09a18cf9543ed4d4ecbd97e7086f9ce9327ea48891"}, + {file = "pydantic_core-2.10.1-cp37-cp37m-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:5cabb9710f09d5d2e9e2748c3e3e20d991a4c5f96ed8f1132518f54ab2967221"}, + {file = "pydantic_core-2.10.1-cp37-cp37m-musllinux_1_1_aarch64.whl", hash = "sha256:82f55187a5bebae7d81d35b1e9aaea5e169d44819789837cdd4720d768c55d15"}, + {file = "pydantic_core-2.10.1-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:1d40f55222b233e98e3921df7811c27567f0e1a4411b93d4c5c0f4ce131bc42f"}, + {file = "pydantic_core-2.10.1-cp37-none-win32.whl", hash = "sha256:14e09ff0b8fe6e46b93d36a878f6e4a3a98ba5303c76bb8e716f4878a3bee92c"}, + {file = "pydantic_core-2.10.1-cp37-none-win_amd64.whl", hash = "sha256:1396e81b83516b9d5c9e26a924fa69164156c148c717131f54f586485ac3c15e"}, + {file = "pydantic_core-2.10.1-cp38-cp38-macosx_10_7_x86_64.whl", hash = "sha256:6835451b57c1b467b95ffb03a38bb75b52fb4dc2762bb1d9dbed8de31ea7d0fc"}, + {file = "pydantic_core-2.10.1-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:b00bc4619f60c853556b35f83731bd817f989cba3e97dc792bb8c97941b8053a"}, + {file = "pydantic_core-2.10.1-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:0fa467fd300a6f046bdb248d40cd015b21b7576c168a6bb20aa22e595c8ffcdd"}, + {file = "pydantic_core-2.10.1-cp38-cp38-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:d99277877daf2efe074eae6338453a4ed54a2d93fb4678ddfe1209a0c93a2468"}, + {file = "pydantic_core-2.10.1-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:fa7db7558607afeccb33c0e4bf1c9a9a835e26599e76af6fe2fcea45904083a6"}, + {file = "pydantic_core-2.10.1-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:aad7bd686363d1ce4ee930ad39f14e1673248373f4a9d74d2b9554f06199fb58"}, + {file = "pydantic_core-2.10.1-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:443fed67d33aa85357464f297e3d26e570267d1af6fef1c21ca50921d2976302"}, + {file = "pydantic_core-2.10.1-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:042462d8d6ba707fd3ce9649e7bf268633a41018d6a998fb5fbacb7e928a183e"}, + {file = "pydantic_core-2.10.1-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:ecdbde46235f3d560b18be0cb706c8e8ad1b965e5c13bbba7450c86064e96561"}, + {file = "pydantic_core-2.10.1-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:ed550ed05540c03f0e69e6d74ad58d026de61b9eaebebbaaf8873e585cbb18de"}, + {file = "pydantic_core-2.10.1-cp38-none-win32.whl", hash = "sha256:8cdbbd92154db2fec4ec973d45c565e767ddc20aa6dbaf50142676484cbff8ee"}, + {file = "pydantic_core-2.10.1-cp38-none-win_amd64.whl", hash = "sha256:9f6f3e2598604956480f6c8aa24a3384dbf6509fe995d97f6ca6103bb8c2534e"}, + {file = "pydantic_core-2.10.1-cp39-cp39-macosx_10_7_x86_64.whl", hash = "sha256:655f8f4c8d6a5963c9a0687793da37b9b681d9ad06f29438a3b2326d4e6b7970"}, + {file = "pydantic_core-2.10.1-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:e570ffeb2170e116a5b17e83f19911020ac79d19c96f320cbfa1fa96b470185b"}, + {file = "pydantic_core-2.10.1-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:64322bfa13e44c6c30c518729ef08fda6026b96d5c0be724b3c4ae4da939f875"}, + {file = "pydantic_core-2.10.1-cp39-cp39-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:485a91abe3a07c3a8d1e082ba29254eea3e2bb13cbbd4351ea4e5a21912cc9b0"}, + {file = "pydantic_core-2.10.1-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:f7c2b8eb9fc872e68b46eeaf835e86bccc3a58ba57d0eedc109cbb14177be531"}, + {file = "pydantic_core-2.10.1-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:a5cb87bdc2e5f620693148b5f8f842d293cae46c5f15a1b1bf7ceeed324a740c"}, + {file = "pydantic_core-2.10.1-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:25bd966103890ccfa028841a8f30cebcf5875eeac8c4bde4fe221364c92f0c9a"}, + {file = "pydantic_core-2.10.1-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:f323306d0556351735b54acbf82904fe30a27b6a7147153cbe6e19aaaa2aa429"}, + {file = "pydantic_core-2.10.1-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:0c27f38dc4fbf07b358b2bc90edf35e82d1703e22ff2efa4af4ad5de1b3833e7"}, + {file = "pydantic_core-2.10.1-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:f1365e032a477c1430cfe0cf2856679529a2331426f8081172c4a74186f1d595"}, + {file = "pydantic_core-2.10.1-cp39-none-win32.whl", hash = "sha256:a1c311fd06ab3b10805abb72109f01a134019739bd3286b8ae1bc2fc4e50c07a"}, + {file = "pydantic_core-2.10.1-cp39-none-win_amd64.whl", hash = "sha256:ae8a8843b11dc0b03b57b52793e391f0122e740de3df1474814c700d2622950a"}, + {file = "pydantic_core-2.10.1-pp310-pypy310_pp73-macosx_10_7_x86_64.whl", hash = "sha256:d43002441932f9a9ea5d6f9efaa2e21458221a3a4b417a14027a1d530201ef1b"}, + {file = "pydantic_core-2.10.1-pp310-pypy310_pp73-macosx_11_0_arm64.whl", hash = "sha256:fcb83175cc4936a5425dde3356f079ae03c0802bbdf8ff82c035f8a54b333521"}, + {file = "pydantic_core-2.10.1-pp310-pypy310_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:962ed72424bf1f72334e2f1e61b68f16c0e596f024ca7ac5daf229f7c26e4208"}, + {file = "pydantic_core-2.10.1-pp310-pypy310_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:2cf5bb4dd67f20f3bbc1209ef572a259027c49e5ff694fa56bed62959b41e1f9"}, + {file = "pydantic_core-2.10.1-pp310-pypy310_pp73-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:e544246b859f17373bed915182ab841b80849ed9cf23f1f07b73b7c58baee5fb"}, + {file = "pydantic_core-2.10.1-pp310-pypy310_pp73-musllinux_1_1_aarch64.whl", hash = "sha256:c0877239307b7e69d025b73774e88e86ce82f6ba6adf98f41069d5b0b78bd1bf"}, + {file = "pydantic_core-2.10.1-pp310-pypy310_pp73-musllinux_1_1_x86_64.whl", hash = "sha256:53df009d1e1ba40f696f8995683e067e3967101d4bb4ea6f667931b7d4a01357"}, + {file = "pydantic_core-2.10.1-pp310-pypy310_pp73-win_amd64.whl", hash = "sha256:a1254357f7e4c82e77c348dabf2d55f1d14d19d91ff025004775e70a6ef40ada"}, + {file = "pydantic_core-2.10.1-pp37-pypy37_pp73-macosx_10_7_x86_64.whl", hash = "sha256:524ff0ca3baea164d6d93a32c58ac79eca9f6cf713586fdc0adb66a8cdeab96a"}, + {file = "pydantic_core-2.10.1-pp37-pypy37_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:3f0ac9fb8608dbc6eaf17956bf623c9119b4db7dbb511650910a82e261e6600f"}, + {file = "pydantic_core-2.10.1-pp37-pypy37_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:320f14bd4542a04ab23747ff2c8a778bde727158b606e2661349557f0770711e"}, + {file = "pydantic_core-2.10.1-pp37-pypy37_pp73-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:63974d168b6233b4ed6a0046296803cb13c56637a7b8106564ab575926572a55"}, + {file = "pydantic_core-2.10.1-pp37-pypy37_pp73-musllinux_1_1_aarch64.whl", hash = "sha256:417243bf599ba1f1fef2bb8c543ceb918676954734e2dcb82bf162ae9d7bd514"}, + {file = "pydantic_core-2.10.1-pp37-pypy37_pp73-musllinux_1_1_x86_64.whl", hash = "sha256:dda81e5ec82485155a19d9624cfcca9be88a405e2857354e5b089c2a982144b2"}, + {file = "pydantic_core-2.10.1-pp37-pypy37_pp73-win_amd64.whl", hash = "sha256:14cfbb00959259e15d684505263d5a21732b31248a5dd4941f73a3be233865b9"}, + {file = "pydantic_core-2.10.1-pp38-pypy38_pp73-macosx_10_7_x86_64.whl", hash = "sha256:631cb7415225954fdcc2a024119101946793e5923f6c4d73a5914d27eb3d3a05"}, + {file = "pydantic_core-2.10.1-pp38-pypy38_pp73-macosx_11_0_arm64.whl", hash = "sha256:bec7dd208a4182e99c5b6c501ce0b1f49de2802448d4056091f8e630b28e9a52"}, + {file = "pydantic_core-2.10.1-pp38-pypy38_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:149b8a07712f45b332faee1a2258d8ef1fb4a36f88c0c17cb687f205c5dc6e7d"}, + {file = "pydantic_core-2.10.1-pp38-pypy38_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:4d966c47f9dd73c2d32a809d2be529112d509321c5310ebf54076812e6ecd884"}, + {file = "pydantic_core-2.10.1-pp38-pypy38_pp73-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:7eb037106f5c6b3b0b864ad226b0b7ab58157124161d48e4b30c4a43fef8bc4b"}, + {file = "pydantic_core-2.10.1-pp38-pypy38_pp73-musllinux_1_1_aarch64.whl", hash = "sha256:154ea7c52e32dce13065dbb20a4a6f0cc012b4f667ac90d648d36b12007fa9f7"}, + {file = "pydantic_core-2.10.1-pp38-pypy38_pp73-musllinux_1_1_x86_64.whl", hash = "sha256:e562617a45b5a9da5be4abe72b971d4f00bf8555eb29bb91ec2ef2be348cd132"}, + {file = "pydantic_core-2.10.1-pp38-pypy38_pp73-win_amd64.whl", hash = "sha256:f23b55eb5464468f9e0e9a9935ce3ed2a870608d5f534025cd5536bca25b1402"}, + {file = "pydantic_core-2.10.1-pp39-pypy39_pp73-macosx_10_7_x86_64.whl", hash = "sha256:e9121b4009339b0f751955baf4543a0bfd6bc3f8188f8056b1a25a2d45099934"}, + {file = "pydantic_core-2.10.1-pp39-pypy39_pp73-macosx_11_0_arm64.whl", hash = "sha256:0523aeb76e03f753b58be33b26540880bac5aa54422e4462404c432230543f33"}, + {file = "pydantic_core-2.10.1-pp39-pypy39_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:2e0e2959ef5d5b8dc9ef21e1a305a21a36e254e6a34432d00c72a92fdc5ecda5"}, + {file = "pydantic_core-2.10.1-pp39-pypy39_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:da01bec0a26befab4898ed83b362993c844b9a607a86add78604186297eb047e"}, + {file = "pydantic_core-2.10.1-pp39-pypy39_pp73-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:f2e9072d71c1f6cfc79a36d4484c82823c560e6f5599c43c1ca6b5cdbd54f881"}, + {file = "pydantic_core-2.10.1-pp39-pypy39_pp73-musllinux_1_1_aarch64.whl", hash = "sha256:f36a3489d9e28fe4b67be9992a23029c3cec0babc3bd9afb39f49844a8c721c5"}, + {file = "pydantic_core-2.10.1-pp39-pypy39_pp73-musllinux_1_1_x86_64.whl", hash = "sha256:f64f82cc3443149292b32387086d02a6c7fb39b8781563e0ca7b8d7d9cf72bd7"}, + {file = "pydantic_core-2.10.1-pp39-pypy39_pp73-win_amd64.whl", hash = "sha256:b4a6db486ac8e99ae696e09efc8b2b9fea67b63c8f88ba7a1a16c24a057a0776"}, + {file = "pydantic_core-2.10.1.tar.gz", hash = "sha256:0f8682dbdd2f67f8e1edddcbffcc29f60a6182b4901c367fc8c1c40d30bb0a82"}, +] + +[package.dependencies] +typing-extensions = ">=4.6.0,<4.7.0 || >4.7.0" + +[[package]] +name = "pygments" +version = "2.16.1" +description = "Pygments is a syntax highlighting package written in Python." +optional = false +python-versions = ">=3.7" +files = [ + {file = "Pygments-2.16.1-py3-none-any.whl", hash = "sha256:13fc09fa63bc8d8671a6d247e1eb303c4b343eaee81d861f3404db2935653692"}, + {file = "Pygments-2.16.1.tar.gz", hash = "sha256:1daff0494820c69bc8941e407aa20f577374ee88364ee10a98fdbe0aece96e29"}, +] + +[package.extras] +plugins = ["importlib-metadata"] + +[[package]] +name = "python-dateutil" +version = "2.8.2" +description = "Extensions to the standard Python datetime module" +optional = false +python-versions = "!=3.0.*,!=3.1.*,!=3.2.*,>=2.7" +files = [ + {file = "python-dateutil-2.8.2.tar.gz", hash = "sha256:0123cacc1627ae19ddf3c27a5de5bd67ee4586fbdd6440d9748f8abb483d3e86"}, + {file = "python_dateutil-2.8.2-py2.py3-none-any.whl", hash = "sha256:961d03dc3453ebbc59dbdea9e4e11c5651520a876d0f4db161e8674aae935da9"}, +] + +[package.dependencies] +six = ">=1.5" + +[[package]] +name = "python-dotenv" +version = "1.0.0" +description = "Read key-value pairs from a .env file and set them as environment variables" +optional = false +python-versions = ">=3.8" +files = [ + {file = "python-dotenv-1.0.0.tar.gz", hash = "sha256:a8df96034aae6d2d50a4ebe8216326c61c3eb64836776504fcca410e5937a3ba"}, + {file = "python_dotenv-1.0.0-py3-none-any.whl", hash = "sha256:f5971a9226b701070a4bf2c38c89e5a3f0d64de8debda981d1db98583009122a"}, +] + +[package.extras] +cli = ["click (>=5.0)"] + +[[package]] +name = "pyyaml" +version = "6.0.1" +description = "YAML parser and emitter for Python" +optional = false +python-versions = ">=3.6" +files = [ + {file = "PyYAML-6.0.1-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:d858aa552c999bc8a8d57426ed01e40bef403cd8ccdd0fc5f6f04a00414cac2a"}, + {file = "PyYAML-6.0.1-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:fd66fc5d0da6d9815ba2cebeb4205f95818ff4b79c3ebe268e75d961704af52f"}, + {file = "PyYAML-6.0.1-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:69b023b2b4daa7548bcfbd4aa3da05b3a74b772db9e23b982788168117739938"}, + {file = "PyYAML-6.0.1-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:81e0b275a9ecc9c0c0c07b4b90ba548307583c125f54d5b6946cfee6360c733d"}, + {file = "PyYAML-6.0.1-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:ba336e390cd8e4d1739f42dfe9bb83a3cc2e80f567d8805e11b46f4a943f5515"}, + {file = "PyYAML-6.0.1-cp310-cp310-win32.whl", hash = "sha256:bd4af7373a854424dabd882decdc5579653d7868b8fb26dc7d0e99f823aa5924"}, + {file = "PyYAML-6.0.1-cp310-cp310-win_amd64.whl", hash = "sha256:fd1592b3fdf65fff2ad0004b5e363300ef59ced41c2e6b3a99d4089fa8c5435d"}, + {file = "PyYAML-6.0.1-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:6965a7bc3cf88e5a1c3bd2e0b5c22f8d677dc88a455344035f03399034eb3007"}, + {file = "PyYAML-6.0.1-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:f003ed9ad21d6a4713f0a9b5a7a0a79e08dd0f221aff4525a2be4c346ee60aab"}, + {file = "PyYAML-6.0.1-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:42f8152b8dbc4fe7d96729ec2b99c7097d656dc1213a3229ca5383f973a5ed6d"}, + {file = "PyYAML-6.0.1-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:062582fca9fabdd2c8b54a3ef1c978d786e0f6b3a1510e0ac93ef59e0ddae2bc"}, + {file = "PyYAML-6.0.1-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:d2b04aac4d386b172d5b9692e2d2da8de7bfb6c387fa4f801fbf6fb2e6ba4673"}, + {file = "PyYAML-6.0.1-cp311-cp311-win32.whl", hash = "sha256:1635fd110e8d85d55237ab316b5b011de701ea0f29d07611174a1b42f1444741"}, + {file = "PyYAML-6.0.1-cp311-cp311-win_amd64.whl", hash = "sha256:bf07ee2fef7014951eeb99f56f39c9bb4af143d8aa3c21b1677805985307da34"}, + {file = "PyYAML-6.0.1-cp36-cp36m-macosx_10_9_x86_64.whl", hash = "sha256:50550eb667afee136e9a77d6dc71ae76a44df8b3e51e41b77f6de2932bfe0f47"}, + {file = "PyYAML-6.0.1-cp36-cp36m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:1fe35611261b29bd1de0070f0b2f47cb6ff71fa6595c077e42bd0c419fa27b98"}, + {file = "PyYAML-6.0.1-cp36-cp36m-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:704219a11b772aea0d8ecd7058d0082713c3562b4e271b849ad7dc4a5c90c13c"}, + {file = "PyYAML-6.0.1-cp36-cp36m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:afd7e57eddb1a54f0f1a974bc4391af8bcce0b444685d936840f125cf046d5bd"}, + {file = "PyYAML-6.0.1-cp36-cp36m-win32.whl", hash = "sha256:fca0e3a251908a499833aa292323f32437106001d436eca0e6e7833256674585"}, + {file = "PyYAML-6.0.1-cp36-cp36m-win_amd64.whl", hash = "sha256:f22ac1c3cac4dbc50079e965eba2c1058622631e526bd9afd45fedd49ba781fa"}, + {file = "PyYAML-6.0.1-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:b1275ad35a5d18c62a7220633c913e1b42d44b46ee12554e5fd39c70a243d6a3"}, + {file = "PyYAML-6.0.1-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:18aeb1bf9a78867dc38b259769503436b7c72f7a1f1f4c93ff9a17de54319b27"}, + {file = "PyYAML-6.0.1-cp37-cp37m-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:596106435fa6ad000c2991a98fa58eeb8656ef2325d7e158344fb33864ed87e3"}, + {file = "PyYAML-6.0.1-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:baa90d3f661d43131ca170712d903e6295d1f7a0f595074f151c0aed377c9b9c"}, + {file = "PyYAML-6.0.1-cp37-cp37m-win32.whl", hash = "sha256:9046c58c4395dff28dd494285c82ba00b546adfc7ef001486fbf0324bc174fba"}, + {file = "PyYAML-6.0.1-cp37-cp37m-win_amd64.whl", hash = "sha256:4fb147e7a67ef577a588a0e2c17b6db51dda102c71de36f8549b6816a96e1867"}, + {file = "PyYAML-6.0.1-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:1d4c7e777c441b20e32f52bd377e0c409713e8bb1386e1099c2415f26e479595"}, + {file = "PyYAML-6.0.1-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:a0cd17c15d3bb3fa06978b4e8958dcdc6e0174ccea823003a106c7d4d7899ac5"}, + {file = "PyYAML-6.0.1-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:28c119d996beec18c05208a8bd78cbe4007878c6dd15091efb73a30e90539696"}, + {file = "PyYAML-6.0.1-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:7e07cbde391ba96ab58e532ff4803f79c4129397514e1413a7dc761ccd755735"}, + {file = "PyYAML-6.0.1-cp38-cp38-win32.whl", hash = "sha256:184c5108a2aca3c5b3d3bf9395d50893a7ab82a38004c8f61c258d4428e80206"}, + {file = "PyYAML-6.0.1-cp38-cp38-win_amd64.whl", hash = "sha256:1e2722cc9fbb45d9b87631ac70924c11d3a401b2d7f410cc0e3bbf249f2dca62"}, + {file = "PyYAML-6.0.1-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:9eb6caa9a297fc2c2fb8862bc5370d0303ddba53ba97e71f08023b6cd73d16a8"}, + {file = "PyYAML-6.0.1-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:c8098ddcc2a85b61647b2590f825f3db38891662cfc2fc776415143f599bb859"}, + {file = "PyYAML-6.0.1-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:5773183b6446b2c99bb77e77595dd486303b4faab2b086e7b17bc6bef28865f6"}, + {file = "PyYAML-6.0.1-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:b786eecbdf8499b9ca1d697215862083bd6d2a99965554781d0d8d1ad31e13a0"}, + {file = "PyYAML-6.0.1-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:bc1bf2925a1ecd43da378f4db9e4f799775d6367bdb94671027b73b393a7c42c"}, + {file = "PyYAML-6.0.1-cp39-cp39-win32.whl", hash = "sha256:faca3bdcf85b2fc05d06ff3fbc1f83e1391b3e724afa3feba7d13eeab355484c"}, + {file = "PyYAML-6.0.1-cp39-cp39-win_amd64.whl", hash = "sha256:510c9deebc5c0225e8c96813043e62b680ba2f9c50a08d3724c7f28a747d1486"}, + {file = "PyYAML-6.0.1.tar.gz", hash = "sha256:bfdf460b1736c775f2ba9f6a92bca30bc2095067b8a9d77876d1fad6cc3b4a43"}, +] + +[[package]] +name = "regex" +version = "2023.10.3" +description = "Alternative regular expression module, to replace re." +optional = false +python-versions = ">=3.7" +files = [ + {file = "regex-2023.10.3-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:4c34d4f73ea738223a094d8e0ffd6d2c1a1b4c175da34d6b0de3d8d69bee6bcc"}, + {file = "regex-2023.10.3-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:a8f4e49fc3ce020f65411432183e6775f24e02dff617281094ba6ab079ef0915"}, + {file = "regex-2023.10.3-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:4cd1bccf99d3ef1ab6ba835308ad85be040e6a11b0977ef7ea8c8005f01a3c29"}, + {file = "regex-2023.10.3-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:81dce2ddc9f6e8f543d94b05d56e70d03a0774d32f6cca53e978dc01e4fc75b8"}, + {file = "regex-2023.10.3-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:9c6b4d23c04831e3ab61717a707a5d763b300213db49ca680edf8bf13ab5d91b"}, + {file = "regex-2023.10.3-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:c15ad0aee158a15e17e0495e1e18741573d04eb6da06d8b84af726cfc1ed02ee"}, + {file = "regex-2023.10.3-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:6239d4e2e0b52c8bd38c51b760cd870069f0bdf99700a62cd509d7a031749a55"}, + {file = "regex-2023.10.3-cp310-cp310-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:4a8bf76e3182797c6b1afa5b822d1d5802ff30284abe4599e1247be4fd6b03be"}, + {file = "regex-2023.10.3-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:d9c727bbcf0065cbb20f39d2b4f932f8fa1631c3e01fcedc979bd4f51fe051c5"}, + {file = "regex-2023.10.3-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:3ccf2716add72f80714b9a63899b67fa711b654be3fcdd34fa391d2d274ce767"}, + {file = "regex-2023.10.3-cp310-cp310-musllinux_1_1_ppc64le.whl", hash = "sha256:107ac60d1bfdc3edb53be75e2a52aff7481b92817cfdddd9b4519ccf0e54a6ff"}, + {file = "regex-2023.10.3-cp310-cp310-musllinux_1_1_s390x.whl", hash = "sha256:00ba3c9818e33f1fa974693fb55d24cdc8ebafcb2e4207680669d8f8d7cca79a"}, + {file = "regex-2023.10.3-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:f0a47efb1dbef13af9c9a54a94a0b814902e547b7f21acb29434504d18f36e3a"}, + {file = "regex-2023.10.3-cp310-cp310-win32.whl", hash = "sha256:36362386b813fa6c9146da6149a001b7bd063dabc4d49522a1f7aa65b725c7ec"}, + {file = "regex-2023.10.3-cp310-cp310-win_amd64.whl", hash = "sha256:c65a3b5330b54103e7d21cac3f6bf3900d46f6d50138d73343d9e5b2900b2353"}, + {file = "regex-2023.10.3-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:90a79bce019c442604662d17bf69df99090e24cdc6ad95b18b6725c2988a490e"}, + {file = "regex-2023.10.3-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:c7964c2183c3e6cce3f497e3a9f49d182e969f2dc3aeeadfa18945ff7bdd7051"}, + {file = "regex-2023.10.3-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:4ef80829117a8061f974b2fda8ec799717242353bff55f8a29411794d635d964"}, + {file = "regex-2023.10.3-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:5addc9d0209a9afca5fc070f93b726bf7003bd63a427f65ef797a931782e7edc"}, + {file = "regex-2023.10.3-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:c148bec483cc4b421562b4bcedb8e28a3b84fcc8f0aa4418e10898f3c2c0eb9b"}, + {file = "regex-2023.10.3-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:8d1f21af4c1539051049796a0f50aa342f9a27cde57318f2fc41ed50b0dbc4ac"}, + {file = "regex-2023.10.3-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:0b9ac09853b2a3e0d0082104036579809679e7715671cfbf89d83c1cb2a30f58"}, + {file = "regex-2023.10.3-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:ebedc192abbc7fd13c5ee800e83a6df252bec691eb2c4bedc9f8b2e2903f5e2a"}, + {file = "regex-2023.10.3-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:d8a993c0a0ffd5f2d3bda23d0cd75e7086736f8f8268de8a82fbc4bd0ac6791e"}, + {file = "regex-2023.10.3-cp311-cp311-musllinux_1_1_ppc64le.whl", hash = "sha256:be6b7b8d42d3090b6c80793524fa66c57ad7ee3fe9722b258aec6d0672543fd0"}, + {file = "regex-2023.10.3-cp311-cp311-musllinux_1_1_s390x.whl", hash = "sha256:4023e2efc35a30e66e938de5aef42b520c20e7eda7bb5fb12c35e5d09a4c43f6"}, + {file = "regex-2023.10.3-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:0d47840dc05e0ba04fe2e26f15126de7c755496d5a8aae4a08bda4dd8d646c54"}, + {file = "regex-2023.10.3-cp311-cp311-win32.whl", hash = "sha256:9145f092b5d1977ec8c0ab46e7b3381b2fd069957b9862a43bd383e5c01d18c2"}, + {file = "regex-2023.10.3-cp311-cp311-win_amd64.whl", hash = "sha256:b6104f9a46bd8743e4f738afef69b153c4b8b592d35ae46db07fc28ae3d5fb7c"}, + {file = "regex-2023.10.3-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:bff507ae210371d4b1fe316d03433ac099f184d570a1a611e541923f78f05037"}, + {file = "regex-2023.10.3-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:be5e22bbb67924dea15039c3282fa4cc6cdfbe0cbbd1c0515f9223186fc2ec5f"}, + {file = "regex-2023.10.3-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:4a992f702c9be9c72fa46f01ca6e18d131906a7180950958f766c2aa294d4b41"}, + {file = "regex-2023.10.3-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:7434a61b158be563c1362d9071358f8ab91b8d928728cd2882af060481244c9e"}, + {file = "regex-2023.10.3-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:c2169b2dcabf4e608416f7f9468737583ce5f0a6e8677c4efbf795ce81109d7c"}, + {file = "regex-2023.10.3-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:a9e908ef5889cda4de038892b9accc36d33d72fb3e12c747e2799a0e806ec841"}, + {file = "regex-2023.10.3-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:12bd4bc2c632742c7ce20db48e0d99afdc05e03f0b4c1af90542e05b809a03d9"}, + {file = "regex-2023.10.3-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:bc72c231f5449d86d6c7d9cc7cd819b6eb30134bb770b8cfdc0765e48ef9c420"}, + {file = "regex-2023.10.3-cp312-cp312-musllinux_1_1_i686.whl", hash = "sha256:bce8814b076f0ce5766dc87d5a056b0e9437b8e0cd351b9a6c4e1134a7dfbda9"}, + {file = "regex-2023.10.3-cp312-cp312-musllinux_1_1_ppc64le.whl", hash = "sha256:ba7cd6dc4d585ea544c1412019921570ebd8a597fabf475acc4528210d7c4a6f"}, + {file = "regex-2023.10.3-cp312-cp312-musllinux_1_1_s390x.whl", hash = "sha256:b0c7d2f698e83f15228ba41c135501cfe7d5740181d5903e250e47f617eb4292"}, + {file = "regex-2023.10.3-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:5a8f91c64f390ecee09ff793319f30a0f32492e99f5dc1c72bc361f23ccd0a9a"}, + {file = "regex-2023.10.3-cp312-cp312-win32.whl", hash = "sha256:ad08a69728ff3c79866d729b095872afe1e0557251da4abb2c5faff15a91d19a"}, + {file = "regex-2023.10.3-cp312-cp312-win_amd64.whl", hash = "sha256:39cdf8d141d6d44e8d5a12a8569d5a227f645c87df4f92179bd06e2e2705e76b"}, + {file = "regex-2023.10.3-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:4a3ee019a9befe84fa3e917a2dd378807e423d013377a884c1970a3c2792d293"}, + {file = "regex-2023.10.3-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:76066d7ff61ba6bf3cb5efe2428fc82aac91802844c022d849a1f0f53820502d"}, + {file = "regex-2023.10.3-cp37-cp37m-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:bfe50b61bab1b1ec260fa7cd91106fa9fece57e6beba05630afe27c71259c59b"}, + {file = "regex-2023.10.3-cp37-cp37m-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:9fd88f373cb71e6b59b7fa597e47e518282455c2734fd4306a05ca219a1991b0"}, + {file = "regex-2023.10.3-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:b3ab05a182c7937fb374f7e946f04fb23a0c0699c0450e9fb02ef567412d2fa3"}, + {file = "regex-2023.10.3-cp37-cp37m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:dac37cf08fcf2094159922edc7a2784cfcc5c70f8354469f79ed085f0328ebdf"}, + {file = "regex-2023.10.3-cp37-cp37m-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:e54ddd0bb8fb626aa1f9ba7b36629564544954fff9669b15da3610c22b9a0991"}, + {file = "regex-2023.10.3-cp37-cp37m-musllinux_1_1_aarch64.whl", hash = "sha256:3367007ad1951fde612bf65b0dffc8fd681a4ab98ac86957d16491400d661302"}, + {file = "regex-2023.10.3-cp37-cp37m-musllinux_1_1_i686.whl", hash = "sha256:16f8740eb6dbacc7113e3097b0a36065a02e37b47c936b551805d40340fb9971"}, + {file = "regex-2023.10.3-cp37-cp37m-musllinux_1_1_ppc64le.whl", hash = "sha256:f4f2ca6df64cbdd27f27b34f35adb640b5d2d77264228554e68deda54456eb11"}, + {file = "regex-2023.10.3-cp37-cp37m-musllinux_1_1_s390x.whl", hash = "sha256:39807cbcbe406efca2a233884e169d056c35aa7e9f343d4e78665246a332f597"}, + {file = "regex-2023.10.3-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:7eece6fbd3eae4a92d7c748ae825cbc1ee41a89bb1c3db05b5578ed3cfcfd7cb"}, + {file = "regex-2023.10.3-cp37-cp37m-win32.whl", hash = "sha256:ce615c92d90df8373d9e13acddd154152645c0dc060871abf6bd43809673d20a"}, + {file = "regex-2023.10.3-cp37-cp37m-win_amd64.whl", hash = "sha256:0f649fa32fe734c4abdfd4edbb8381c74abf5f34bc0b3271ce687b23729299ed"}, + {file = "regex-2023.10.3-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:9b98b7681a9437262947f41c7fac567c7e1f6eddd94b0483596d320092004533"}, + {file = "regex-2023.10.3-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:91dc1d531f80c862441d7b66c4505cd6ea9d312f01fb2f4654f40c6fdf5cc37a"}, + {file = "regex-2023.10.3-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:82fcc1f1cc3ff1ab8a57ba619b149b907072e750815c5ba63e7aa2e1163384a4"}, + {file = "regex-2023.10.3-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:7979b834ec7a33aafae34a90aad9f914c41fd6eaa8474e66953f3f6f7cbd4368"}, + {file = "regex-2023.10.3-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:ef71561f82a89af6cfcbee47f0fabfdb6e63788a9258e913955d89fdd96902ab"}, + {file = "regex-2023.10.3-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:dd829712de97753367153ed84f2de752b86cd1f7a88b55a3a775eb52eafe8a94"}, + {file = "regex-2023.10.3-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:00e871d83a45eee2f8688d7e6849609c2ca2a04a6d48fba3dff4deef35d14f07"}, + {file = "regex-2023.10.3-cp38-cp38-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:706e7b739fdd17cb89e1fbf712d9dc21311fc2333f6d435eac2d4ee81985098c"}, + {file = "regex-2023.10.3-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:cc3f1c053b73f20c7ad88b0d1d23be7e7b3901229ce89f5000a8399746a6e039"}, + {file = "regex-2023.10.3-cp38-cp38-musllinux_1_1_i686.whl", hash = "sha256:6f85739e80d13644b981a88f529d79c5bdf646b460ba190bffcaf6d57b2a9863"}, + {file = "regex-2023.10.3-cp38-cp38-musllinux_1_1_ppc64le.whl", hash = "sha256:741ba2f511cc9626b7561a440f87d658aabb3d6b744a86a3c025f866b4d19e7f"}, + {file = "regex-2023.10.3-cp38-cp38-musllinux_1_1_s390x.whl", hash = "sha256:e77c90ab5997e85901da85131fd36acd0ed2221368199b65f0d11bca44549711"}, + {file = "regex-2023.10.3-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:979c24cbefaf2420c4e377ecd1f165ea08cc3d1fbb44bdc51bccbbf7c66a2cb4"}, + {file = "regex-2023.10.3-cp38-cp38-win32.whl", hash = "sha256:58837f9d221744d4c92d2cf7201c6acd19623b50c643b56992cbd2b745485d3d"}, + {file = "regex-2023.10.3-cp38-cp38-win_amd64.whl", hash = "sha256:c55853684fe08d4897c37dfc5faeff70607a5f1806c8be148f1695be4a63414b"}, + {file = "regex-2023.10.3-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:2c54e23836650bdf2c18222c87f6f840d4943944146ca479858404fedeb9f9af"}, + {file = "regex-2023.10.3-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:69c0771ca5653c7d4b65203cbfc5e66db9375f1078689459fe196fe08b7b4930"}, + {file = "regex-2023.10.3-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:6ac965a998e1388e6ff2e9781f499ad1eaa41e962a40d11c7823c9952c77123e"}, + {file = "regex-2023.10.3-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:1c0e8fae5b27caa34177bdfa5a960c46ff2f78ee2d45c6db15ae3f64ecadde14"}, + {file = "regex-2023.10.3-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:6c56c3d47da04f921b73ff9415fbaa939f684d47293f071aa9cbb13c94afc17d"}, + {file = "regex-2023.10.3-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:7ef1e014eed78ab650bef9a6a9cbe50b052c0aebe553fb2881e0453717573f52"}, + {file = "regex-2023.10.3-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:d29338556a59423d9ff7b6eb0cb89ead2b0875e08fe522f3e068b955c3e7b59b"}, + {file = "regex-2023.10.3-cp39-cp39-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:9c6d0ced3c06d0f183b73d3c5920727268d2201aa0fe6d55c60d68c792ff3588"}, + {file = "regex-2023.10.3-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:994645a46c6a740ee8ce8df7911d4aee458d9b1bc5639bc968226763d07f00fa"}, + {file = "regex-2023.10.3-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:66e2fe786ef28da2b28e222c89502b2af984858091675044d93cb50e6f46d7af"}, + {file = "regex-2023.10.3-cp39-cp39-musllinux_1_1_ppc64le.whl", hash = "sha256:11175910f62b2b8c055f2b089e0fedd694fe2be3941b3e2633653bc51064c528"}, + {file = "regex-2023.10.3-cp39-cp39-musllinux_1_1_s390x.whl", hash = "sha256:06e9abc0e4c9ab4779c74ad99c3fc10d3967d03114449acc2c2762ad4472b8ca"}, + {file = "regex-2023.10.3-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:fb02e4257376ae25c6dd95a5aec377f9b18c09be6ebdefa7ad209b9137b73d48"}, + {file = "regex-2023.10.3-cp39-cp39-win32.whl", hash = "sha256:3b2c3502603fab52d7619b882c25a6850b766ebd1b18de3df23b2f939360e1bd"}, + {file = "regex-2023.10.3-cp39-cp39-win_amd64.whl", hash = "sha256:adbccd17dcaff65704c856bd29951c58a1bd4b2b0f8ad6b826dbd543fe740988"}, + {file = "regex-2023.10.3.tar.gz", hash = "sha256:3fef4f844d2290ee0ba57addcec17eec9e3df73f10a2748485dfd6a3a188cc0f"}, +] + +[[package]] +name = "requests" +version = "2.31.0" +description = "Python HTTP for Humans." +optional = false +python-versions = ">=3.7" +files = [ + {file = "requests-2.31.0-py3-none-any.whl", hash = "sha256:58cd2187c01e70e6e26505bca751777aa9f2ee0b7f4300988b709f44e013003f"}, + {file = "requests-2.31.0.tar.gz", hash = "sha256:942c5a758f98d790eaed1a29cb6eefc7ffb0d1cf7af05c3d2791656dbd6ad1e1"}, +] + +[package.dependencies] +certifi = ">=2017.4.17" +charset-normalizer = ">=2,<4" +idna = ">=2.5,<4" +urllib3 = ">=1.21.1,<3" + +[package.extras] +socks = ["PySocks (>=1.5.6,!=1.5.7)"] +use-chardet-on-py3 = ["chardet (>=3.0.2,<6)"] + +[[package]] +name = "rich" +version = "13.6.0" +description = "Render rich text, tables, progress bars, syntax highlighting, markdown and more to the terminal" +optional = false +python-versions = ">=3.7.0" +files = [ + {file = "rich-13.6.0-py3-none-any.whl", hash = "sha256:2b38e2fe9ca72c9a00170a1a2d20c63c790d0e10ef1fe35eba76e1e7b1d7d245"}, + {file = "rich-13.6.0.tar.gz", hash = "sha256:5c14d22737e6d5084ef4771b62d5d4363165b403455a30a1c8ca39dc7b644bef"}, +] + +[package.dependencies] +markdown-it-py = ">=2.2.0" +pygments = ">=2.13.0,<3.0.0" +typing-extensions = {version = ">=4.0.0,<5.0", markers = "python_version < \"3.9\""} + +[package.extras] +jupyter = ["ipywidgets (>=7.5.1,<9)"] + +[[package]] +name = "shellingham" +version = "1.5.4" +description = "Tool to Detect Surrounding Shell" +optional = false +python-versions = ">=3.7" +files = [ + {file = "shellingham-1.5.4-py2.py3-none-any.whl", hash = "sha256:7ecfff8f2fd72616f7481040475a65b2bf8af90a56c89140852d1120324e8686"}, + {file = "shellingham-1.5.4.tar.gz", hash = "sha256:8dbca0739d487e5bd35ab3ca4b36e11c4078f3a234bfce294b0a0291363404de"}, +] + +[[package]] +name = "six" +version = "1.16.0" +description = "Python 2 and 3 compatibility utilities" +optional = false +python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*" +files = [ + {file = "six-1.16.0-py2.py3-none-any.whl", hash = "sha256:8abb2f1d86890a2dfb989f9a77cfcfd3e47c2a354b01111771326f8aa26e0254"}, + {file = "six-1.16.0.tar.gz", hash = "sha256:1e61c37477a1626458e36f7b1d82aa5c9b094fa4802892072e49de9c60c4c926"}, +] + +[[package]] +name = "smmap" +version = "5.0.1" +description = "A pure Python implementation of a sliding window memory map manager" +optional = false +python-versions = ">=3.7" +files = [ + {file = "smmap-5.0.1-py3-none-any.whl", hash = "sha256:e6d8668fa5f93e706934a62d7b4db19c8d9eb8cf2adbb75ef1b675aa332b69da"}, + {file = "smmap-5.0.1.tar.gz", hash = "sha256:dceeb6c0028fdb6734471eb07c0cd2aae706ccaecab45965ee83f11c8d3b1f62"}, +] + +[[package]] +name = "sniffio" +version = "1.3.0" +description = "Sniff out which async library your code is running under" +optional = false +python-versions = ">=3.7" +files = [ + {file = "sniffio-1.3.0-py3-none-any.whl", hash = "sha256:eecefdce1e5bbfb7ad2eeaabf7c1eeb404d7757c379bd1f7e5cce9d8bf425384"}, + {file = "sniffio-1.3.0.tar.gz", hash = "sha256:e60305c5e5d314f5389259b7f22aaa33d8f7dee49763119234af3755c55b9101"}, +] + +[[package]] +name = "soupsieve" +version = "2.5" +description = "A modern CSS selector implementation for Beautiful Soup." +optional = false +python-versions = ">=3.8" +files = [ + {file = "soupsieve-2.5-py3-none-any.whl", hash = "sha256:eaa337ff55a1579b6549dc679565eac1e3d000563bcb1c8ab0d0fefbc0c2cdc7"}, + {file = "soupsieve-2.5.tar.gz", hash = "sha256:5663d5a7b3bfaeee0bc4372e7fc48f9cff4940b3eec54a6451cc5299f1097690"}, +] + +[[package]] +name = "sqlalchemy" +version = "2.0.22" +description = "Database Abstraction Library" +optional = false +python-versions = ">=3.7" +files = [ + {file = "SQLAlchemy-2.0.22.tar.gz", hash = "sha256:5434cc601aa17570d79e5377f5fd45ff92f9379e2abed0be5e8c2fba8d353d2b"}, +] + +[package.dependencies] +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 (>=0.2.0)", "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,!=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)"] +mysql = ["mysqlclient (>=1.4.0)"] +mysql-connector = ["mysql-connector-python"] +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.29.1)"] +postgresql-psycopg = ["psycopg (>=3.0.7)"] +postgresql-psycopg2binary = ["psycopg2-binary"] +postgresql-psycopg2cffi = ["psycopg2cffi"] +postgresql-psycopgbinary = ["psycopg[binary] (>=3.0.7)"] +pymysql = ["pymysql"] +sqlcipher = ["sqlcipher3_binary"] + +[[package]] +name = "sse-starlette" +version = "1.6.5" +description = "\"SSE plugin for Starlette\"" +optional = false +python-versions = ">=3.8" +files = [ + {file = "sse-starlette-1.6.5.tar.gz", hash = "sha256:819f2c421fb37067380fe3dcaba246c476b02651b7bb7601099a378ad802a0ac"}, + {file = "sse_starlette-1.6.5-py3-none-any.whl", hash = "sha256:68b6b7eb49be0c72a2af80a055994c13afcaa4761b29226beb208f954c25a642"}, +] + +[package.dependencies] +starlette = "*" + +[[package]] +name = "starlette" +version = "0.27.0" +description = "The little ASGI library that shines." +optional = false +python-versions = ">=3.7" +files = [ + {file = "starlette-0.27.0-py3-none-any.whl", hash = "sha256:918416370e846586541235ccd38a474c08b80443ed31c578a418e2209b3eef91"}, + {file = "starlette-0.27.0.tar.gz", hash = "sha256:6a6b0d042acb8d469a01eba54e9cda6cbd24ac602c4cd016723117d6a7e73b75"}, +] + +[package.dependencies] +anyio = ">=3.4.0,<5" +typing-extensions = {version = ">=3.10.0", markers = "python_version < \"3.10\""} + +[package.extras] +full = ["httpx (>=0.22.0)", "itsdangerous", "jinja2", "python-multipart", "pyyaml"] + +[[package]] +name = "tenacity" +version = "8.2.3" +description = "Retry code until it succeeds" +optional = false +python-versions = ">=3.7" +files = [ + {file = "tenacity-8.2.3-py3-none-any.whl", hash = "sha256:ce510e327a630c9e1beaf17d42e6ffacc88185044ad85cf74c0a8887c6a0f88c"}, + {file = "tenacity-8.2.3.tar.gz", hash = "sha256:5398ef0d78e63f40007c1fb4c0bff96e1911394d2fa8d194f77619c05ff6cc8a"}, +] + +[package.extras] +doc = ["reno", "sphinx", "tornado (>=4.5)"] + +[[package]] +name = "tiktoken" +version = "0.5.1" +description = "tiktoken is a fast BPE tokeniser for use with OpenAI's models" +optional = false +python-versions = ">=3.8" +files = [ + {file = "tiktoken-0.5.1-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:2b0bae3fd56de1c0a5874fb6577667a3c75bf231a6cef599338820210c16e40a"}, + {file = "tiktoken-0.5.1-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:e529578d017045e2f0ed12d2e00e7e99f780f477234da4aae799ec4afca89f37"}, + {file = "tiktoken-0.5.1-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:edd2ffbb789712d83fee19ab009949f998a35c51ad9f9beb39109357416344ff"}, + {file = "tiktoken-0.5.1-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:e4c73d47bdc1a3f1f66ffa019af0386c48effdc6e8797e5e76875f6388ff72e9"}, + {file = "tiktoken-0.5.1-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:46b8554b9f351561b1989157c6bb54462056f3d44e43aa4e671367c5d62535fc"}, + {file = "tiktoken-0.5.1-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:92ed3bbf71a175a6a4e5fbfcdb2c422bdd72d9b20407e00f435cf22a68b4ea9b"}, + {file = "tiktoken-0.5.1-cp310-cp310-win_amd64.whl", hash = "sha256:714efb2f4a082635d9f5afe0bf7e62989b72b65ac52f004eb7ac939f506c03a4"}, + {file = "tiktoken-0.5.1-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:a10488d1d1a5f9c9d2b2052fdb4cf807bba545818cb1ef724a7f5d44d9f7c3d4"}, + {file = "tiktoken-0.5.1-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:8079ac065572fe0e7c696dbd63e1fdc12ce4cdca9933935d038689d4732451df"}, + {file = "tiktoken-0.5.1-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:7ef730db4097f5b13df8d960f7fdda2744fe21d203ea2bb80c120bb58661b155"}, + {file = "tiktoken-0.5.1-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:426e7def5f3f23645dada816be119fa61e587dfb4755de250e136b47a045c365"}, + {file = "tiktoken-0.5.1-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:323cec0031358bc09aa965c2c5c1f9f59baf76e5b17e62dcc06d1bb9bc3a3c7c"}, + {file = "tiktoken-0.5.1-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:5abd9436f02e2c8eda5cce2ff8015ce91f33e782a7423de2a1859f772928f714"}, + {file = "tiktoken-0.5.1-cp311-cp311-win_amd64.whl", hash = "sha256:1fe99953b63aabc0c9536fbc91c3c9000d78e4755edc28cc2e10825372046a2d"}, + {file = "tiktoken-0.5.1-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:dcdc630461927718b317e6f8be7707bd0fc768cee1fdc78ddaa1e93f4dc6b2b1"}, + {file = "tiktoken-0.5.1-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:1f2b3b253e22322b7f53a111e1f6d7ecfa199b4f08f3efdeb0480f4033b5cdc6"}, + {file = "tiktoken-0.5.1-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:43ce0199f315776dec3ea7bf86f35df86d24b6fcde1babd3e53c38f17352442f"}, + {file = "tiktoken-0.5.1-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:a84657c083d458593c0235926b5c993eec0b586a2508d6a2020556e5347c2f0d"}, + {file = "tiktoken-0.5.1-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:c008375c0f3d97c36e81725308699116cd5804fdac0f9b7afc732056329d2790"}, + {file = "tiktoken-0.5.1-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:779c4dea5edd1d3178734d144d32231e0b814976bec1ec09636d1003ffe4725f"}, + {file = "tiktoken-0.5.1-cp38-cp38-win_amd64.whl", hash = "sha256:b5dcfcf9bfb798e86fbce76d40a1d5d9e3f92131aecfa3d1e5c9ea1a20f1ef1a"}, + {file = "tiktoken-0.5.1-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:9b180a22db0bbcc447f691ffc3cf7a580e9e0587d87379e35e58b826ebf5bc7b"}, + {file = "tiktoken-0.5.1-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:2b756a65d98b7cf760617a6b68762a23ab8b6ef79922be5afdb00f5e8a9f4e76"}, + {file = "tiktoken-0.5.1-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:ba9873c253ca1f670e662192a0afcb72b41e0ba3e730f16c665099e12f4dac2d"}, + {file = "tiktoken-0.5.1-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:74c90d2be0b4c1a2b3f7dde95cd976757817d4df080d6af0ee8d461568c2e2ad"}, + {file = "tiktoken-0.5.1-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:709a5220891f2b56caad8327fab86281787704931ed484d9548f65598dea9ce4"}, + {file = "tiktoken-0.5.1-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:5d5a187ff9c786fae6aadd49f47f019ff19e99071dc5b0fe91bfecc94d37c686"}, + {file = "tiktoken-0.5.1-cp39-cp39-win_amd64.whl", hash = "sha256:e21840043dbe2e280e99ad41951c00eff8ee3b63daf57cd4c1508a3fd8583ea2"}, + {file = "tiktoken-0.5.1.tar.gz", hash = "sha256:27e773564232004f4f810fd1f85236673ec3a56ed7f1206fc9ed8670ebedb97a"}, +] + +[package.dependencies] +regex = ">=2022.1.18" +requests = ">=2.26.0" + +[package.extras] +blobfile = ["blobfile (>=2)"] + +[[package]] +name = "timescale-vector" +version = "0.0.3" +description = "Python library for storing vector data in Postgres" +optional = false +python-versions = ">=3.7" +files = [ + {file = "timescale-vector-0.0.3.tar.gz", hash = "sha256:f5e6d80a4fa72956e8c40648c36e30dd62be343de3d78c1aea6141768722ba91"}, + {file = "timescale_vector-0.0.3-py3-none-any.whl", hash = "sha256:6f3df88f406fa943ae96c01f0bcf54bf9e3dea836a2e2a8051676fbfa0e833ba"}, +] + +[package.dependencies] +asyncpg = "*" +pgvector = "*" +psycopg2 = "*" + +[package.extras] +dev = ["langchain", "python-dotenv"] + +[[package]] +name = "tomlkit" +version = "0.12.2" +description = "Style preserving TOML library" +optional = false +python-versions = ">=3.7" +files = [ + {file = "tomlkit-0.12.2-py3-none-any.whl", hash = "sha256:eeea7ac7563faeab0a1ed8fe12c2e5a51c61f933f2502f7e9db0241a65163ad0"}, + {file = "tomlkit-0.12.2.tar.gz", hash = "sha256:df32fab589a81f0d7dc525a4267b6d7a64ee99619cbd1eeb0fae32c1dd426977"}, +] + +[[package]] +name = "tqdm" +version = "4.66.1" +description = "Fast, Extensible Progress Meter" +optional = false +python-versions = ">=3.7" +files = [ + {file = "tqdm-4.66.1-py3-none-any.whl", hash = "sha256:d302b3c5b53d47bce91fea46679d9c3c6508cf6332229aa1e7d8653723793386"}, + {file = "tqdm-4.66.1.tar.gz", hash = "sha256:d88e651f9db8d8551a62556d3cff9e3034274ca5d66e93197cf2490e2dcb69c7"}, +] + +[package.dependencies] +colorama = {version = "*", markers = "platform_system == \"Windows\""} + +[package.extras] +dev = ["pytest (>=6)", "pytest-cov", "pytest-timeout", "pytest-xdist"] +notebook = ["ipywidgets (>=6)"] +slack = ["slack-sdk"] +telegram = ["requests"] + +[[package]] +name = "typer" +version = "0.9.0" +description = "Typer, build great CLIs. Easy to code. Based on Python type hints." +optional = false +python-versions = ">=3.6" +files = [ + {file = "typer-0.9.0-py3-none-any.whl", hash = "sha256:5d96d986a21493606a358cae4461bd8cdf83cbf33a5aa950ae629ca3b51467ee"}, + {file = "typer-0.9.0.tar.gz", hash = "sha256:50922fd79aea2f4751a8e0408ff10d2662bd0c8bbfa84755a699f3bada2978b2"}, +] + +[package.dependencies] +click = ">=7.1.1,<9.0.0" +colorama = {version = ">=0.4.3,<0.5.0", optional = true, markers = "extra == \"all\""} +rich = {version = ">=10.11.0,<14.0.0", optional = true, markers = "extra == \"all\""} +shellingham = {version = ">=1.3.0,<2.0.0", optional = true, markers = "extra == \"all\""} +typing-extensions = ">=3.7.4.3" + +[package.extras] +all = ["colorama (>=0.4.3,<0.5.0)", "rich (>=10.11.0,<14.0.0)", "shellingham (>=1.3.0,<2.0.0)"] +dev = ["autoflake (>=1.3.1,<2.0.0)", "flake8 (>=3.8.3,<4.0.0)", "pre-commit (>=2.17.0,<3.0.0)"] +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 = "typing-extensions" +version = "4.8.0" +description = "Backported and Experimental Type Hints for Python 3.8+" +optional = false +python-versions = ">=3.8" +files = [ + {file = "typing_extensions-4.8.0-py3-none-any.whl", hash = "sha256:8f92fc8806f9a6b641eaa5318da32b44d401efaac0f6678c9bc448ba3605faa0"}, + {file = "typing_extensions-4.8.0.tar.gz", hash = "sha256:df8e4339e9cb77357558cbdbceca33c303714cf861d1eef15e1070055ae8b7ef"}, +] + +[[package]] +name = "typing-inspect" +version = "0.9.0" +description = "Runtime inspection utilities for typing module." +optional = false +python-versions = "*" +files = [ + {file = "typing_inspect-0.9.0-py3-none-any.whl", hash = "sha256:9ee6fc59062311ef8547596ab6b955e1b8aa46242d854bfc78f4f6b0eff35f9f"}, + {file = "typing_inspect-0.9.0.tar.gz", hash = "sha256:b23fc42ff6f6ef6954e4852c1fb512cdd18dbea03134f91f856a95ccc9461f78"}, +] + +[package.dependencies] +mypy-extensions = ">=0.3.0" +typing-extensions = ">=3.7.4" + +[[package]] +name = "urllib3" +version = "2.0.6" +description = "HTTP library with thread-safe connection pooling, file post, and more." +optional = false +python-versions = ">=3.7" +files = [ + {file = "urllib3-2.0.6-py3-none-any.whl", hash = "sha256:7a7c7003b000adf9e7ca2a377c9688bbc54ed41b985789ed576570342a375cd2"}, + {file = "urllib3-2.0.6.tar.gz", hash = "sha256:b19e1a85d206b56d7df1d5e683df4a7725252a964e3993648dd0fb5a1c157564"}, +] + +[package.extras] +brotli = ["brotli (>=1.0.9)", "brotlicffi (>=0.8.0)"] +secure = ["certifi", "cryptography (>=1.9)", "idna (>=2.0.0)", "pyopenssl (>=17.1.0)", "urllib3-secure-extra"] +socks = ["pysocks (>=1.5.6,!=1.5.7,<2.0)"] +zstd = ["zstandard (>=0.18.0)"] + +[[package]] +name = "uvicorn" +version = "0.23.2" +description = "The lightning-fast ASGI server." +optional = false +python-versions = ">=3.8" +files = [ + {file = "uvicorn-0.23.2-py3-none-any.whl", hash = "sha256:1f9be6558f01239d4fdf22ef8126c39cb1ad0addf76c40e760549d2c2f43ab53"}, + {file = "uvicorn-0.23.2.tar.gz", hash = "sha256:4d3cc12d7727ba72b64d12d3cc7743124074c0a69f7b201512fc50c3e3f1569a"}, +] + +[package.dependencies] +click = ">=7.0" +h11 = ">=0.8" +typing-extensions = {version = ">=4.0", markers = "python_version < \"3.11\""} + +[package.extras] +standard = ["colorama (>=0.4)", "httptools (>=0.5.0)", "python-dotenv (>=0.13)", "pyyaml (>=5.1)", "uvloop (>=0.14.0,!=0.15.0,!=0.15.1)", "watchfiles (>=0.13)", "websockets (>=10.4)"] + +[[package]] +name = "win32-setctime" +version = "1.1.0" +description = "A small Python utility to set file creation time on Windows" +optional = false +python-versions = ">=3.5" +files = [ + {file = "win32_setctime-1.1.0-py3-none-any.whl", hash = "sha256:231db239e959c2fe7eb1d7dc129f11172354f98361c4fa2d6d2d7e278baa8aad"}, + {file = "win32_setctime-1.1.0.tar.gz", hash = "sha256:15cf5750465118d6929ae4de4eb46e8edae9a5634350c01ba582df868e932cb2"}, +] + +[package.extras] +dev = ["black (>=19.3b0)", "pytest (>=4.6.2)"] + +[[package]] +name = "yarl" +version = "1.9.2" +description = "Yet another URL library" +optional = false +python-versions = ">=3.7" +files = [ + {file = "yarl-1.9.2-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:8c2ad583743d16ddbdf6bb14b5cd76bf43b0d0006e918809d5d4ddf7bde8dd82"}, + {file = "yarl-1.9.2-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:82aa6264b36c50acfb2424ad5ca537a2060ab6de158a5bd2a72a032cc75b9eb8"}, + {file = "yarl-1.9.2-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:c0c77533b5ed4bcc38e943178ccae29b9bcf48ffd1063f5821192f23a1bd27b9"}, + {file = "yarl-1.9.2-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:ee4afac41415d52d53a9833ebae7e32b344be72835bbb589018c9e938045a560"}, + {file = "yarl-1.9.2-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:9bf345c3a4f5ba7f766430f97f9cc1320786f19584acc7086491f45524a551ac"}, + {file = "yarl-1.9.2-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:2a96c19c52ff442a808c105901d0bdfd2e28575b3d5f82e2f5fd67e20dc5f4ea"}, + {file = "yarl-1.9.2-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:891c0e3ec5ec881541f6c5113d8df0315ce5440e244a716b95f2525b7b9f3608"}, + {file = "yarl-1.9.2-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:c3a53ba34a636a256d767c086ceb111358876e1fb6b50dfc4d3f4951d40133d5"}, + {file = "yarl-1.9.2-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:566185e8ebc0898b11f8026447eacd02e46226716229cea8db37496c8cdd26e0"}, + {file = "yarl-1.9.2-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:2b0738fb871812722a0ac2154be1f049c6223b9f6f22eec352996b69775b36d4"}, + {file = "yarl-1.9.2-cp310-cp310-musllinux_1_1_ppc64le.whl", hash = "sha256:32f1d071b3f362c80f1a7d322bfd7b2d11e33d2adf395cc1dd4df36c9c243095"}, + {file = "yarl-1.9.2-cp310-cp310-musllinux_1_1_s390x.whl", hash = "sha256:e9fdc7ac0d42bc3ea78818557fab03af6181e076a2944f43c38684b4b6bed8e3"}, + {file = "yarl-1.9.2-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:56ff08ab5df8429901ebdc5d15941b59f6253393cb5da07b4170beefcf1b2528"}, + {file = "yarl-1.9.2-cp310-cp310-win32.whl", hash = "sha256:8ea48e0a2f931064469bdabca50c2f578b565fc446f302a79ba6cc0ee7f384d3"}, + {file = "yarl-1.9.2-cp310-cp310-win_amd64.whl", hash = "sha256:50f33040f3836e912ed16d212f6cc1efb3231a8a60526a407aeb66c1c1956dde"}, + {file = "yarl-1.9.2-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:646d663eb2232d7909e6601f1a9107e66f9791f290a1b3dc7057818fe44fc2b6"}, + {file = "yarl-1.9.2-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:aff634b15beff8902d1f918012fc2a42e0dbae6f469fce134c8a0dc51ca423bb"}, + {file = "yarl-1.9.2-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:a83503934c6273806aed765035716216cc9ab4e0364f7f066227e1aaea90b8d0"}, + {file = "yarl-1.9.2-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:b25322201585c69abc7b0e89e72790469f7dad90d26754717f3310bfe30331c2"}, + {file = "yarl-1.9.2-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:22a94666751778629f1ec4280b08eb11815783c63f52092a5953faf73be24191"}, + {file = "yarl-1.9.2-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:8ec53a0ea2a80c5cd1ab397925f94bff59222aa3cf9c6da938ce05c9ec20428d"}, + {file = "yarl-1.9.2-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:159d81f22d7a43e6eabc36d7194cb53f2f15f498dbbfa8edc8a3239350f59fe7"}, + {file = "yarl-1.9.2-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:832b7e711027c114d79dffb92576acd1bd2decc467dec60e1cac96912602d0e6"}, + {file = "yarl-1.9.2-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:95d2ecefbcf4e744ea952d073c6922e72ee650ffc79028eb1e320e732898d7e8"}, + {file = "yarl-1.9.2-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:d4e2c6d555e77b37288eaf45b8f60f0737c9efa3452c6c44626a5455aeb250b9"}, + {file = "yarl-1.9.2-cp311-cp311-musllinux_1_1_ppc64le.whl", hash = "sha256:783185c75c12a017cc345015ea359cc801c3b29a2966c2655cd12b233bf5a2be"}, + {file = "yarl-1.9.2-cp311-cp311-musllinux_1_1_s390x.whl", hash = "sha256:b8cc1863402472f16c600e3e93d542b7e7542a540f95c30afd472e8e549fc3f7"}, + {file = "yarl-1.9.2-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:822b30a0f22e588b32d3120f6d41e4ed021806418b4c9f0bc3048b8c8cb3f92a"}, + {file = "yarl-1.9.2-cp311-cp311-win32.whl", hash = "sha256:a60347f234c2212a9f0361955007fcf4033a75bf600a33c88a0a8e91af77c0e8"}, + {file = "yarl-1.9.2-cp311-cp311-win_amd64.whl", hash = "sha256:be6b3fdec5c62f2a67cb3f8c6dbf56bbf3f61c0f046f84645cd1ca73532ea051"}, + {file = "yarl-1.9.2-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:38a3928ae37558bc1b559f67410df446d1fbfa87318b124bf5032c31e3447b74"}, + {file = "yarl-1.9.2-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:ac9bb4c5ce3975aeac288cfcb5061ce60e0d14d92209e780c93954076c7c4367"}, + {file = "yarl-1.9.2-cp37-cp37m-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:3da8a678ca8b96c8606bbb8bfacd99a12ad5dd288bc6f7979baddd62f71c63ef"}, + {file = "yarl-1.9.2-cp37-cp37m-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:13414591ff516e04fcdee8dc051c13fd3db13b673c7a4cb1350e6b2ad9639ad3"}, + {file = "yarl-1.9.2-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:bf74d08542c3a9ea97bb8f343d4fcbd4d8f91bba5ec9d5d7f792dbe727f88938"}, + {file = "yarl-1.9.2-cp37-cp37m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:6e7221580dc1db478464cfeef9b03b95c5852cc22894e418562997df0d074ccc"}, + {file = "yarl-1.9.2-cp37-cp37m-musllinux_1_1_aarch64.whl", hash = "sha256:494053246b119b041960ddcd20fd76224149cfea8ed8777b687358727911dd33"}, + {file = "yarl-1.9.2-cp37-cp37m-musllinux_1_1_i686.whl", hash = "sha256:52a25809fcbecfc63ac9ba0c0fb586f90837f5425edfd1ec9f3372b119585e45"}, + {file = "yarl-1.9.2-cp37-cp37m-musllinux_1_1_ppc64le.whl", hash = "sha256:e65610c5792870d45d7b68c677681376fcf9cc1c289f23e8e8b39c1485384185"}, + {file = "yarl-1.9.2-cp37-cp37m-musllinux_1_1_s390x.whl", hash = "sha256:1b1bba902cba32cdec51fca038fd53f8beee88b77efc373968d1ed021024cc04"}, + {file = "yarl-1.9.2-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:662e6016409828ee910f5d9602a2729a8a57d74b163c89a837de3fea050c7582"}, + {file = "yarl-1.9.2-cp37-cp37m-win32.whl", hash = "sha256:f364d3480bffd3aa566e886587eaca7c8c04d74f6e8933f3f2c996b7f09bee1b"}, + {file = "yarl-1.9.2-cp37-cp37m-win_amd64.whl", hash = "sha256:6a5883464143ab3ae9ba68daae8e7c5c95b969462bbe42e2464d60e7e2698368"}, + {file = "yarl-1.9.2-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:5610f80cf43b6202e2c33ba3ec2ee0a2884f8f423c8f4f62906731d876ef4fac"}, + {file = "yarl-1.9.2-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:b9a4e67ad7b646cd6f0938c7ebfd60e481b7410f574c560e455e938d2da8e0f4"}, + {file = "yarl-1.9.2-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:83fcc480d7549ccebe9415d96d9263e2d4226798c37ebd18c930fce43dfb9574"}, + {file = "yarl-1.9.2-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:5fcd436ea16fee7d4207c045b1e340020e58a2597301cfbcfdbe5abd2356c2fb"}, + {file = "yarl-1.9.2-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:84e0b1599334b1e1478db01b756e55937d4614f8654311eb26012091be109d59"}, + {file = "yarl-1.9.2-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:3458a24e4ea3fd8930e934c129b676c27452e4ebda80fbe47b56d8c6c7a63a9e"}, + {file = "yarl-1.9.2-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:838162460b3a08987546e881a2bfa573960bb559dfa739e7800ceeec92e64417"}, + {file = "yarl-1.9.2-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:f4e2d08f07a3d7d3e12549052eb5ad3eab1c349c53ac51c209a0e5991bbada78"}, + {file = "yarl-1.9.2-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:de119f56f3c5f0e2fb4dee508531a32b069a5f2c6e827b272d1e0ff5ac040333"}, + {file = "yarl-1.9.2-cp38-cp38-musllinux_1_1_i686.whl", hash = "sha256:149ddea5abf329752ea5051b61bd6c1d979e13fbf122d3a1f9f0c8be6cb6f63c"}, + {file = "yarl-1.9.2-cp38-cp38-musllinux_1_1_ppc64le.whl", hash = "sha256:674ca19cbee4a82c9f54e0d1eee28116e63bc6fd1e96c43031d11cbab8b2afd5"}, + {file = "yarl-1.9.2-cp38-cp38-musllinux_1_1_s390x.whl", hash = "sha256:9b3152f2f5677b997ae6c804b73da05a39daa6a9e85a512e0e6823d81cdad7cc"}, + {file = "yarl-1.9.2-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:5415d5a4b080dc9612b1b63cba008db84e908b95848369aa1da3686ae27b6d2b"}, + {file = "yarl-1.9.2-cp38-cp38-win32.whl", hash = "sha256:f7a3d8146575e08c29ed1cd287068e6d02f1c7bdff8970db96683b9591b86ee7"}, + {file = "yarl-1.9.2-cp38-cp38-win_amd64.whl", hash = "sha256:63c48f6cef34e6319a74c727376e95626f84ea091f92c0250a98e53e62c77c72"}, + {file = "yarl-1.9.2-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:75df5ef94c3fdc393c6b19d80e6ef1ecc9ae2f4263c09cacb178d871c02a5ba9"}, + {file = "yarl-1.9.2-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:c027a6e96ef77d401d8d5a5c8d6bc478e8042f1e448272e8d9752cb0aff8b5c8"}, + {file = "yarl-1.9.2-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:f3b078dbe227f79be488ffcfc7a9edb3409d018e0952cf13f15fd6512847f3f7"}, + {file = "yarl-1.9.2-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:59723a029760079b7d991a401386390c4be5bfec1e7dd83e25a6a0881859e716"}, + {file = "yarl-1.9.2-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:b03917871bf859a81ccb180c9a2e6c1e04d2f6a51d953e6a5cdd70c93d4e5a2a"}, + {file = "yarl-1.9.2-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:c1012fa63eb6c032f3ce5d2171c267992ae0c00b9e164efe4d73db818465fac3"}, + {file = "yarl-1.9.2-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:a74dcbfe780e62f4b5a062714576f16c2f3493a0394e555ab141bf0d746bb955"}, + {file = "yarl-1.9.2-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:8c56986609b057b4839968ba901944af91b8e92f1725d1a2d77cbac6972b9ed1"}, + {file = "yarl-1.9.2-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:2c315df3293cd521033533d242d15eab26583360b58f7ee5d9565f15fee1bef4"}, + {file = "yarl-1.9.2-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:b7232f8dfbd225d57340e441d8caf8652a6acd06b389ea2d3222b8bc89cbfca6"}, + {file = "yarl-1.9.2-cp39-cp39-musllinux_1_1_ppc64le.whl", hash = "sha256:53338749febd28935d55b41bf0bcc79d634881195a39f6b2f767870b72514caf"}, + {file = "yarl-1.9.2-cp39-cp39-musllinux_1_1_s390x.whl", hash = "sha256:066c163aec9d3d073dc9ffe5dd3ad05069bcb03fcaab8d221290ba99f9f69ee3"}, + {file = "yarl-1.9.2-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:8288d7cd28f8119b07dd49b7230d6b4562f9b61ee9a4ab02221060d21136be80"}, + {file = "yarl-1.9.2-cp39-cp39-win32.whl", hash = "sha256:b124e2a6d223b65ba8768d5706d103280914d61f5cae3afbc50fc3dfcc016623"}, + {file = "yarl-1.9.2-cp39-cp39-win_amd64.whl", hash = "sha256:61016e7d582bc46a5378ffdd02cd0314fb8ba52f40f9cf4d9a5e7dbef88dee18"}, + {file = "yarl-1.9.2.tar.gz", hash = "sha256:04ab9d4b9f587c06d801c2abfe9317b77cdf996c65a90d5e84ecc45010823571"}, +] + +[package.dependencies] +idna = ">=2.0" +multidict = ">=4.0" + +[metadata] +lock-version = "2.0" +python-versions = ">=3.8.1,<4.0" +content-hash = "078747db3e381f1480af6917fb388512c05682d97bfe4c650cb94a9bd3db4dc1" diff --git a/templates/rag-timescale-conversation/pyproject.toml b/templates/rag-timescale-conversation/pyproject.toml new file mode 100644 index 00000000000..2b207ac771e --- /dev/null +++ b/templates/rag-timescale-conversation/pyproject.toml @@ -0,0 +1,31 @@ +[tool.poetry] +name = "rag-timescale-conversation" +version = "0.1.0" +description = "" +authors = [ + "Lance Martin ", +] +readme = "README.md" + +[tool.poetry.dependencies] +python = ">=3.8.1,<4.0" +langchain = ">=0.0.325" +openai = ">=0.28.1" +tiktoken = ">=0.5.1" +pinecone-client = ">=2.2.4" +beautifulsoup4 = "^4.12.2" +python-dotenv = "^1.0.0" +timescale-vector = "^0.0.3" + +[tool.poetry.group.dev.dependencies] +langchain-cli = ">=0.0.15" + +[tool.langserve] +export_module = "rag_timescale_conversation" +export_attr = "chain" + +[build-system] +requires = [ + "poetry-core", +] +build-backend = "poetry.core.masonry.api" diff --git a/templates/rag-timescale-conversation/rag_conversation.ipynb b/templates/rag-timescale-conversation/rag_conversation.ipynb new file mode 100644 index 00000000000..4203689a153 --- /dev/null +++ b/templates/rag-timescale-conversation/rag_conversation.ipynb @@ -0,0 +1,238 @@ +{ + "cells": [ + { + "attachments": {}, + "cell_type": "markdown", + "id": "424a9d8d", + "metadata": {}, + "source": [ + "## Run Template\n", + "\n", + "In `server.py`, set -\n", + "```\n", + "add_routes(app, chain_rag_timescale_conv, path=\"/rag_timescale_conversation\")\n", + "```" + ] + }, + { + "cell_type": "code", + "execution_count": 1, + "id": "5f521923", + "metadata": {}, + "outputs": [], + "source": [ + "from langserve.client import RemoteRunnable\n", + "\n", + "rag_app = RemoteRunnable(\"http://0.0.0.0:8000/rag_timescale_conversation\")" + ] + }, + { + "attachments": {}, + "cell_type": "markdown", + "id": "563a58dd", + "metadata": {}, + "source": [ + "First, setup the history" + ] + }, + { + "cell_type": "code", + "execution_count": 2, + "id": "14541994", + "metadata": {}, + "outputs": [], + "source": [ + "question = \"My name is Sven Klemm\"\n", + "answer = rag_app.invoke(\n", + " {\n", + " \"question\": question,\n", + " \"chat_history\": [],\n", + " }\n", + ")\n", + "chat_history = [(question, answer)]" + ] + }, + { + "attachments": {}, + "cell_type": "markdown", + "id": "63e76c4d", + "metadata": {}, + "source": [ + "Next, use the history for a question" + ] + }, + { + "cell_type": "code", + "execution_count": 3, + "id": "b2d8f735", + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "'The person named Sven Klemm made the following commits:\\n\\n1. Commit \"a31c9b9f8cdfe8643499b710dc983e5c5d6457e4\" on \"Mon May 22 11:34:06 2023 +0200\" with the change summary \"Increase number of sqlsmith loops in nightly CI\". The change details are \"To improve coverage with sqlsmith we run it for longer in the scheduled nightly run.\"\\n\\n2. Commit \"e4ba2bcf560568ae68f3775c058f0a8d7f7c0501\" on \"Wed Nov 9 09:29:36 2022 +0100\" with the change summary \"Remove debian 9 from packages tests.\" The change details are \"Debian 9 is EOL since July 2022 so we won\\'t build packages for it anymore and can remove it from CI.\"'" + ] + }, + "execution_count": 3, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "\n", + "answer = rag_app.invoke(\n", + " {\n", + " \"question\": \"What commits did the person with my name make?\",\n", + " \"chat_history\": chat_history,\n", + " }\n", + ")\n", + "answer" + ] + }, + { + "attachments": {}, + "cell_type": "markdown", + "id": "bd62df23", + "metadata": {}, + "source": [ + "## Filter by time\n", + "\n", + "You can also use timed filters. For example, the sample dataset doesn't include any commits before 2010, so this should return no matches." + ] + }, + { + "cell_type": "code", + "execution_count": 4, + "id": "b0a598b7", + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "'The context does not provide any information about any commits made by a person named Sven Klemm.'" + ] + }, + "execution_count": 4, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "answer = rag_app.invoke(\n", + " {\n", + " \"question\": \"What commits did the person with my name make?\",\n", + " \"chat_history\": chat_history,\n", + " \"end_date\": \"2016-01-01 00:00:00\",\n", + " }\n", + ")\n", + "answer\n" + ] + }, + { + "attachments": {}, + "cell_type": "markdown", + "id": "25851869", + "metadata": {}, + "source": [ + "However, there is data from 2022, which can be used" + ] + }, + { + "cell_type": "code", + "execution_count": 5, + "id": "4aef5219", + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "'The person named Sven Klemm made the following commits:\\n\\n1. \"e4ba2bcf560568ae68f3775c058f0a8d7f7c0501\" with the change summary \"Remove debian 9 from packages tests.\" The details of this change are that \"Debian 9 is EOL since July 2022 so we won\\'t build packages for it anymore and can remove it from CI.\"\\n\\n2. \"2f237e6e57e5ac66c126233d66969a1f674ffaa4\" with the change summary \"Add Enterprise Linux 9 packages to RPM package test\". The change details for this commit are not provided.'" + ] + }, + "execution_count": 5, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "answer = rag_app.invoke(\n", + " {\n", + " \"question\": \"What commits did the person with my name make?\",\n", + " \"chat_history\": chat_history,\n", + " \"start_date\": \"2020-01-01 00:00:00\",\n", + " \"end_date\": \"2023-01-01 00:00:00\",\n", + " }\n", + ")\n", + "answer" + ] + }, + { + "attachments": {}, + "cell_type": "markdown", + "id": "6ad86fbd", + "metadata": {}, + "source": [ + "## Filter by metadata\n", + "\n", + "You can also filter by metadata using this chain" + ] + }, + { + "cell_type": "code", + "execution_count": 6, + "id": "7ac9365f", + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "'The person named Sven Klemm made a commit with the ID \"5cd2c038796fb302190b080c90e5acddbef4b8d1\". The change summary for this commit is \"Simplify windows-build-and-test-ignored.yaml\" and the change details are \"Remove code not needed for the skip workflow of the windows test.\" The commit was made on \"Sat Mar 4 10:18:34 2023 +0100\".'" + ] + }, + "execution_count": 6, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "answer = rag_app.invoke(\n", + " {\n", + " \"question\": \"What commits did the person with my name make?\",\n", + " \"chat_history\": chat_history,\n", + " \"metadata_filter\": {\"commit_hash\": \" 5cd2c038796fb302190b080c90e5acddbef4b8d1\"},\n", + " }\n", + ")\n", + "answer" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "1cde5da5", + "metadata": {}, + "outputs": [], + "source": [] + } + ], + "metadata": { + "kernelspec": { + "display_name": "Python 3 (ipykernel)", + "language": "python", + "name": "python3" + }, + "language_info": { + "codemirror_mode": { + "name": "ipython", + "version": 3 + }, + "file_extension": ".py", + "mimetype": "text/x-python", + "name": "python", + "nbconvert_exporter": "python", + "pygments_lexer": "ipython3", + "version": "3.11.4" + } + }, + "nbformat": 4, + "nbformat_minor": 5 +} diff --git a/templates/rag-timescale-conversation/rag_timescale_conversation/__init__.py b/templates/rag-timescale-conversation/rag_timescale_conversation/__init__.py new file mode 100644 index 00000000000..1638a54ce2d --- /dev/null +++ b/templates/rag-timescale-conversation/rag_timescale_conversation/__init__.py @@ -0,0 +1,3 @@ +from rag_timescale_conversation.chain import chain + +__all__ = ["chain"] diff --git a/templates/rag-timescale-conversation/rag_timescale_conversation/chain.py b/templates/rag-timescale-conversation/rag_timescale_conversation/chain.py new file mode 100644 index 00000000000..6ff6c5b0427 --- /dev/null +++ b/templates/rag-timescale-conversation/rag_timescale_conversation/chain.py @@ -0,0 +1,164 @@ +import os +from datetime import datetime, timedelta +from operator import itemgetter +from typing import List, Optional, Tuple + +from dotenv import find_dotenv, load_dotenv +from langchain.chat_models import ChatOpenAI +from langchain.embeddings import OpenAIEmbeddings +from langchain.prompts import ChatPromptTemplate, MessagesPlaceholder +from langchain.prompts.prompt import PromptTemplate +from langchain.schema import AIMessage, HumanMessage, format_document +from langchain.schema.output_parser import StrOutputParser +from langchain.schema.runnable import ( + RunnableBranch, + RunnableLambda, + RunnableMap, + RunnablePassthrough, +) +from langchain.vectorstores.timescalevector import TimescaleVector +from pydantic import BaseModel, Field + +from .load_sample_dataset import load_ts_git_dataset + +load_dotenv(find_dotenv()) + +if os.environ.get("TIMESCALE_SERVICE_URL", None) is None: + raise Exception("Missing `TIMESCALE_SERVICE_URL` environment variable.") + +SERVICE_URL = os.environ["TIMESCALE_SERVICE_URL"] +LOAD_SAMPLE_DATA = os.environ.get("LOAD_SAMPLE_DATA", False) +COLLECTION_NAME = os.environ.get("COLLECTION_NAME", "timescale_commits") +OPENAI_MODEL = os.environ.get("OPENAI_MODEL", "gpt-4") + +partition_interval = timedelta(days=7) +if LOAD_SAMPLE_DATA: + load_ts_git_dataset( + SERVICE_URL, + collection_name=COLLECTION_NAME, + num_records=500, + partition_interval=partition_interval, + ) + +embeddings = OpenAIEmbeddings() +vectorstore = TimescaleVector( + embedding=embeddings, + collection_name=COLLECTION_NAME, + service_url=SERVICE_URL, + time_partition_interval=partition_interval, +) +retriever = vectorstore.as_retriever() + +# Condense a chat history and follow-up question into a standalone question +_template = """Given the following conversation and a follow up question, rephrase the follow up question to be a standalone question, in its original language. +Chat History: +{chat_history} +Follow Up Input: {question} +Standalone question:""" # noqa: E501 +CONDENSE_QUESTION_PROMPT = PromptTemplate.from_template(_template) + +# RAG answer synthesis prompt +template = """Answer the question based only on the following context: + +{context} +""" +ANSWER_PROMPT = ChatPromptTemplate.from_messages( + [ + ("system", template), + MessagesPlaceholder(variable_name="chat_history"), + ("user", "{question}"), + ] +) + +# Conversational Retrieval Chain +DEFAULT_DOCUMENT_PROMPT = PromptTemplate.from_template(template="{page_content}") + + +def _combine_documents( + docs, document_prompt=DEFAULT_DOCUMENT_PROMPT, document_separator="\n\n" +): + doc_strings = [format_document(doc, document_prompt) for doc in docs] + return document_separator.join(doc_strings) + + +def _format_chat_history(chat_history: List[Tuple[str, str]]) -> List: + buffer = [] + for human, ai in chat_history: + buffer.append(HumanMessage(content=human)) + buffer.append(AIMessage(content=ai)) + return buffer + + +# User input +class ChatHistory(BaseModel): + chat_history: List[Tuple[str, str]] = Field(..., extra={"widget": {"type": "chat"}}) + question: str + start_date: Optional[datetime] + end_date: Optional[datetime] + metadata_filter: Optional[dict] + + +_search_query = RunnableBranch( + # If input includes chat_history, we condense it with the follow-up question + ( + RunnableLambda(lambda x: bool(x.get("chat_history"))).with_config( + run_name="HasChatHistoryCheck" + ), # Condense follow-up question and chat into a standalone_question + RunnablePassthrough.assign( + retriever_query=RunnablePassthrough.assign( + chat_history=lambda x: _format_chat_history(x["chat_history"]) + ) + | CONDENSE_QUESTION_PROMPT + | ChatOpenAI(temperature=0, model=OPENAI_MODEL) + | StrOutputParser() + ), + ), + # Else, we have no chat history, so just pass through the question + RunnablePassthrough.assign(retriever_query=lambda x: x["question"]), +) + + +def get_retriever_with_metadata(x): + start_dt = x.get("start_date", None) + end_dt = x.get("end_date", None) + metadata_filter = x.get("metadata_filter", None) + opt = {} + + if start_dt is not None: + opt["start_date"] = start_dt + if end_dt is not None: + opt["end_date"] = end_dt + if metadata_filter is not None: + opt["filter"] = metadata_filter + v = vectorstore.as_retriever(search_kwargs=opt) + return RunnableLambda(itemgetter("retriever_query")) | v + + +_retriever = RunnableLambda(get_retriever_with_metadata) + +_inputs = RunnableMap( + { + "question": lambda x: x["question"], + "chat_history": lambda x: _format_chat_history(x["chat_history"]), + "start_date": lambda x: x.get("start_date", None), + "end_date": lambda x: x.get("end_date", None), + "context": _search_query | _retriever | _combine_documents, + } +) + +_datetime_to_string = RunnablePassthrough.assign( + start_date=lambda x: x.get("start_date", None).isoformat() + if x.get("start_date", None) is not None + else None, + end_date=lambda x: x.get("end_date", None).isoformat() + if x.get("end_date", None) is not None + else None, +).with_types(input_type=ChatHistory) + +chain = ( + _datetime_to_string + | _inputs + | ANSWER_PROMPT + | ChatOpenAI(model=OPENAI_MODEL) + | StrOutputParser() +) diff --git a/templates/rag-timescale-conversation/rag_timescale_conversation/load_sample_dataset.py b/templates/rag-timescale-conversation/rag_timescale_conversation/load_sample_dataset.py new file mode 100644 index 00000000000..7b200b12581 --- /dev/null +++ b/templates/rag-timescale-conversation/rag_timescale_conversation/load_sample_dataset.py @@ -0,0 +1,84 @@ +import os +import tempfile +from datetime import datetime, timedelta + +import requests +from langchain.document_loaders import JSONLoader +from langchain.embeddings.openai import OpenAIEmbeddings +from langchain.text_splitter import CharacterTextSplitter +from langchain.vectorstores.timescalevector import TimescaleVector +from timescale_vector import client + + +def parse_date(date_string: str) -> datetime: + if date_string is None: + return None + time_format = "%a %b %d %H:%M:%S %Y %z" + return datetime.strptime(date_string, time_format) + + +def extract_metadata(record: dict, metadata: dict) -> dict: + dt = parse_date(record["date"]) + metadata["id"] = str(client.uuid_from_time(dt)) + if dt is not None: + metadata["date"] = dt.isoformat() + else: + metadata["date"] = None + metadata["author"] = record["author"] + metadata["commit_hash"] = record["commit"] + return metadata + + +def load_ts_git_dataset( + service_url, + collection_name="timescale_commits", + num_records: int = 500, + partition_interval=timedelta(days=7), +): + json_url = "https://s3.amazonaws.com/assets.timescale.com/ai/ts_git_log.json" + tmp_file = "ts_git_log.json" + + temp_dir = tempfile.gettempdir() + json_file_path = os.path.join(temp_dir, tmp_file) + + if not os.path.exists(json_file_path): + response = requests.get(json_url) + if response.status_code == 200: + with open(json_file_path, "w") as json_file: + json_file.write(response.text) + else: + print(f"Failed to download JSON file. Status code: {response.status_code}") + + loader = JSONLoader( + file_path=json_file_path, + jq_schema=".commit_history[]", + text_content=False, + metadata_func=extract_metadata, + ) + + documents = loader.load() + + # Remove documents with None dates + documents = [doc for doc in documents if doc.metadata["date"] is not None] + + if num_records > 0: + documents = documents[:num_records] + + # Split the documents into chunks for embedding + text_splitter = CharacterTextSplitter( + chunk_size=1000, + chunk_overlap=200, + ) + docs = text_splitter.split_documents(documents) + + embeddings = OpenAIEmbeddings() + + # Create a Timescale Vector instance from the collection of documents + TimescaleVector.from_documents( + embedding=embeddings, + ids=[doc.metadata["id"] for doc in docs], + documents=docs, + collection_name=collection_name, + service_url=service_url, + time_partition_interval=partition_interval, + ) diff --git a/templates/rag-timescale-conversation/tests/__init__.py b/templates/rag-timescale-conversation/tests/__init__.py new file mode 100644 index 00000000000..e69de29bb2d From 9c7afa8adb9c88ef84d5cd8b0b1b8e26755d68db Mon Sep 17 00:00:00 2001 From: Erick Friis Date: Fri, 10 Nov 2023 16:25:58 -0800 Subject: [PATCH 13/14] Upgrade cohere embedding model to v3 (#13219) Just updates API docs, doesn't change default param from 2.0 (could be breaking change) --- libs/langchain/langchain/embeddings/clarifai.py | 2 +- libs/langchain/langchain/embeddings/cohere.py | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/libs/langchain/langchain/embeddings/clarifai.py b/libs/langchain/langchain/embeddings/clarifai.py index 8af1f6b749b..a33c267a57f 100644 --- a/libs/langchain/langchain/embeddings/clarifai.py +++ b/libs/langchain/langchain/embeddings/clarifai.py @@ -20,7 +20,7 @@ class ClarifaiEmbeddings(BaseModel, Embeddings): from langchain.embeddings import ClarifaiEmbeddings clarifai = ClarifaiEmbeddings( - model="embed-english-light-v2.0", clarifai_api_key="my-api-key" + model="embed-english-light-v3.0", clarifai_api_key="my-api-key" ) """ diff --git a/libs/langchain/langchain/embeddings/cohere.py b/libs/langchain/langchain/embeddings/cohere.py index 0531390ce2e..73435eaa932 100644 --- a/libs/langchain/langchain/embeddings/cohere.py +++ b/libs/langchain/langchain/embeddings/cohere.py @@ -17,7 +17,7 @@ class CohereEmbeddings(BaseModel, Embeddings): from langchain.embeddings import CohereEmbeddings cohere = CohereEmbeddings( - model="embed-english-light-v2.0", cohere_api_key="my-api-key" + model="embed-english-light-v3.0", cohere_api_key="my-api-key" ) """ From 937d7c41f37260c9ecd5b6a8826327d4d60dfcb0 Mon Sep 17 00:00:00 2001 From: Bagatur <22008038+baskaryan@users.noreply.github.com> Date: Fri, 10 Nov 2023 16:50:20 -0800 Subject: [PATCH 14/14] update stack diagram (#13213) --- docs/docs/get_started/introduction.mdx | 6 +++--- docs/docs/modules/model_io/chat/index.ipynb | 2 +- docs/docs/modules/model_io/llms/index.ipynb | 2 +- docs/static/img/langchain_stack.png | Bin 1639511 -> 4187194 bytes 4 files changed, 5 insertions(+), 5 deletions(-) diff --git a/docs/docs/get_started/introduction.mdx b/docs/docs/get_started/introduction.mdx index 4b5a49bf383..4b436f9a05a 100644 --- a/docs/docs/get_started/introduction.mdx +++ b/docs/docs/get_started/introduction.mdx @@ -10,9 +10,9 @@ sidebar_position: 0 This framework consists of several parts. - **LangChain Libraries**: The Python and JavaScript libraries. Contains interfaces and integrations for a myriad of components, a basic run time for combining these components into chains and agents, and off-the-shelf implementations of chains and agents. -- **[LangChain Templates](https://github.com/langchain-ai/langchain/tree/master/templates)**: A collection of easily deployable reference architectures for a wide variety of tasks. -- **[LangServe](https://github.com/langchain-ai/langserve)**: A library for deploying LangChain chains as a REST API. -- **[LangSmith](https://smith.langchain.com/)**: A developer platform that lets you debug, test, evaluate, and monitor chains built on any LLM framework and seamlessly integrates with LangChain. +- **[LangChain Templates](/docs/templates)**: A collection of easily deployable reference architectures for a wide variety of tasks. +- **[LangServe](/docs/langserve)**: A library for deploying LangChain chains as a REST API. +- **[LangSmith](/docs/langsmith)**: A developer platform that lets you debug, test, evaluate, and monitor chains built on any LLM framework and seamlessly integrates with LangChain. ![LangChain Diagram](/img/langchain_stack.png) diff --git a/docs/docs/modules/model_io/chat/index.ipynb b/docs/docs/modules/model_io/chat/index.ipynb index 56ec08a245c..b7b3fc658b4 100644 --- a/docs/docs/modules/model_io/chat/index.ipynb +++ b/docs/docs/modules/model_io/chat/index.ipynb @@ -593,7 +593,7 @@ "id": "a4a7d783-4ddf-42e7-b143-8050891663c2", "metadata": {}, "source": [ - "## [LangSmith](https://smith.langchain.com)\n", + "## [LangSmith](/docs/langsmith)\n", "\n", "All `ChatModel`s come with built-in LangSmith tracing. Just set the following environment variables:\n", "```bash\n", diff --git a/docs/docs/modules/model_io/llms/index.ipynb b/docs/docs/modules/model_io/llms/index.ipynb index 84072797d3d..64c9449e3e6 100644 --- a/docs/docs/modules/model_io/llms/index.ipynb +++ b/docs/docs/modules/model_io/llms/index.ipynb @@ -459,7 +459,7 @@ "id": "09108687-ed15-468b-9ac5-674e75785199", "metadata": {}, "source": [ - "## [LangSmith](https://smith.langchain.com)\n", + "## [LangSmith](/docs/langsmith)\n", "\n", "All `LLM`s come with built-in LangSmith tracing. Just set the following environment variables:\n", "```bash\n", diff --git a/docs/static/img/langchain_stack.png b/docs/static/img/langchain_stack.png index 0f74a7a00bdca5187ecebc5a4de36f8b3ea0fd3e..20777e333ebbf3a24b4ddd99be7114f213cd652e 100644 GIT binary patch literal 4187194 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

~-EGcBn3}1T#y2=qe{rC|Q^GB= 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