From e02dccf12a2416f36e375abf341cf22edc7af374 Mon Sep 17 00:00:00 2001 From: dorbaker Date: Mon, 13 May 2024 16:35:54 -0400 Subject: [PATCH 01/22] Updated to work with managed identities. --- graphrag/llm/openai/create_openai_client.py | 40 +++++++++++++++------ graphrag/vector_stores/azure_ai_search.py | 21 +++++++---- 2 files changed, 44 insertions(+), 17 deletions(-) diff --git a/graphrag/llm/openai/create_openai_client.py b/graphrag/llm/openai/create_openai_client.py index 0977a6e207..66cde44af0 100644 --- a/graphrag/llm/openai/create_openai_client.py +++ b/graphrag/llm/openai/create_openai_client.py @@ -6,6 +6,8 @@ import logging from functools import cache +from azure.identity import DefaultAzureCredential, get_bearer_token_provider + from openai import AsyncAzureOpenAI, AsyncOpenAI from .openai_configuration import OpenAIConfiguration @@ -31,17 +33,33 @@ def create_openai_client( api_base, configuration.deployment_name, ) - return AsyncAzureOpenAI( - api_key=configuration.api_key, - organization=configuration.organization, - # Azure-Specifics - api_version=configuration.api_version, - azure_endpoint=api_base, - azure_deployment=configuration.deployment_name, - # Timeout/Retry Configuration - Use Tenacity for Retries, so disable them here - timeout=configuration.request_timeout or 180.0, - max_retries=0, - ) + try: + token_provider = get_bearer_token_provider( + DefaultAzureCredential(), "https://cognitiveservices.azure.com/.default" + ) + return AsyncAzureOpenAI( + azure_ad_token_provider=token_provider, + organization=configuration.organization, + # Azure-Specifics + api_version=configuration.api_version, + azure_endpoint=api_base, + azure_deployment=configuration.deployment_name, + # Timeout/Retry Configuration - Use Tenacity for Retries, so disable them here + timeout=configuration.request_timeout or 180.0, + max_retries=0, + ) + except: + return AsyncAzureOpenAI( + api_key=configuration.api_key, + organization=configuration.organization, + # Azure-Specifics + api_version=configuration.api_version, + azure_endpoint=api_base, + azure_deployment=configuration.deployment_name, + # Timeout/Retry Configuration - Use Tenacity for Retries, so disable them here + timeout=configuration.request_timeout or 180.0, + max_retries=0, + ) log.info("Creating OpenAI client base_url=%s", configuration.api_base) return AsyncOpenAI( diff --git a/graphrag/vector_stores/azure_ai_search.py b/graphrag/vector_stores/azure_ai_search.py index c74a6d623c..b2137cf90d 100644 --- a/graphrag/vector_stores/azure_ai_search.py +++ b/graphrag/vector_stores/azure_ai_search.py @@ -7,6 +7,7 @@ from typing import Any from azure.core.credentials import AzureKeyCredential +from azure.identity import DefaultAzureCredential from azure.search.documents import SearchClient from azure.search.documents.indexes import SearchIndexClient from azure.search.documents.indexes.models import ( @@ -49,12 +50,20 @@ def connect(self, **kwargs: Any) -> Any: ) if url: - self.db_connection = SearchClient( - url, self.collection_name, AzureKeyCredential(api_key) - ) - self.index_client = SearchIndexClient( - endpoint=url, credential=AzureKeyCredential(api_key) - ) + if api_key: + self.db_connection = SearchClient( + url, self.collection_name, AzureKeyCredential(api_key) + ) + self.index_client = SearchIndexClient( + endpoint=url, credential=AzureKeyCredential(api_key) + ) + else: + self.db_connection = SearchClient( + url, self.collection_name, DefaultAzureCredential() + ) + self.index_client = SearchIndexClient( + endpoint=url, credential=DefaultAzureCredential() + ) else: not_supported_error = "AAISearchDBClient is not supported on local host." raise ValueError(not_supported_error) From 4bc205a00ec0408f096c36a175dcf9950d7c6fd6 Mon Sep 17 00:00:00 2001 From: dorbaker Date: Tue, 14 May 2024 13:26:35 -0400 Subject: [PATCH 02/22] Updated to work with both api keys and managed identity. --- .../index/storage/blob_pipeline_storage.py | 60 +++++++++++++------ graphrag/llm/openai/create_openai_client.py | 4 +- 2 files changed, 45 insertions(+), 19 deletions(-) diff --git a/graphrag/index/storage/blob_pipeline_storage.py b/graphrag/index/storage/blob_pipeline_storage.py index 04a0a72b2c..731f5eb2ce 100644 --- a/graphrag/index/storage/blob_pipeline_storage.py +++ b/graphrag/index/storage/blob_pipeline_storage.py @@ -9,6 +9,7 @@ from pathlib import Path from typing import Any +from azure.identity import DefaultAzureCredential from azure.storage.blob import BlobServiceClient from datashaper import Progress @@ -26,6 +27,7 @@ class BlobPipelineStorage(PipelineStorage): _container_name: str _path_prefix: str _encoding: str + _storage_account_name: str def __init__( self, @@ -33,15 +35,23 @@ def __init__( container_name: str, encoding: str | None = None, path_prefix: str | None = None, + storage_account_name: str | None = None, ): """Create a new BlobStorage instance.""" - self._blob_service_client = BlobServiceClient.from_connection_string( - connection_string - ) + if storage_account is None: + self._blob_service_client = BlobServiceClient.from_connection_string( + connection_string + ) + else: + self._blob_service_client = BlobServiceClient( + account_url=f"https://{storage_account}.blob.core.windows.net", + credential=DefaultAzureCredential(), + ) self._encoding = encoding or "utf-8" self._container_name = container_name self._connection_string = connection_string self._path_prefix = path_prefix or "" + self._storage_account_name = storage_account_name or "" log.info( "creating blob storage at container=%s, path=%s", self._container_name, @@ -187,23 +197,39 @@ async def set(self, key: str, value: Any, encoding: str | None = None) -> None: def set_df_json(self, key: str, dataframe: Any) -> None: """Set a json dataframe.""" - connection_string = self._connection_string - dataframe.to_json( - self._abfs_url(key), - storage_options={"connection_string": connection_string}, - orient="records", - lines=True, - force_ascii=False, - ) + if self._connection_string is None: + storage_account_name = self._storage_account_name + dataframe.to_json( + self._abfs_url(key), + storage_options={"account_name":storage_account_name, "credential": DefaultAzureCredential()}, + orient="records", + lines=True, + force_ascii=False, + ) + else: + connection_string = self._connection_string + dataframe.to_json( + self._abfs_url(key), + storage_options={"connection_string": connection_string}, + orient="records", + lines=True, + force_ascii=False, + ) def set_df_parquet(self, key: str, dataframe: Any) -> None: """Set a parquet dataframe.""" - connection_string = self._connection_string - - dataframe.to_parquet( - self._abfs_url(key), - storage_options={"connection_string": connection_string}, - ) + if self._connection_string is None: + storage_account_name = self._storage_account_name + dataframe.to_parquet( + self._abfs_url(key), + storage_options={"account_name": storage_account_name, "credential": DefaultAzureCredential()}, + ) + else: + connection_string = self._connection_string + dataframe.to_parquet( + self._abfs_url(key), + storage_options={"connection_string": connection_string}, + ) async def has(self, key: str) -> bool: """Check if a key exists in the cache.""" diff --git a/graphrag/llm/openai/create_openai_client.py b/graphrag/llm/openai/create_openai_client.py index 66cde44af0..153341778d 100644 --- a/graphrag/llm/openai/create_openai_client.py +++ b/graphrag/llm/openai/create_openai_client.py @@ -33,7 +33,7 @@ def create_openai_client( api_base, configuration.deployment_name, ) - try: + if configuration.api_key is None: token_provider = get_bearer_token_provider( DefaultAzureCredential(), "https://cognitiveservices.azure.com/.default" ) @@ -48,7 +48,7 @@ def create_openai_client( timeout=configuration.request_timeout or 180.0, max_retries=0, ) - except: + else: return AsyncAzureOpenAI( api_key=configuration.api_key, organization=configuration.organization, From 0373572879b709470251f0db6449ccc321e3db35 Mon Sep 17 00:00:00 2001 From: dorbaker Date: Tue, 14 May 2024 16:29:37 -0400 Subject: [PATCH 03/22] Updated to pass storage_account_name config parameter. --- graphrag/index/config/storage.py | 4 ++++ graphrag/index/input/load_input.py | 5 +++-- 2 files changed, 7 insertions(+), 2 deletions(-) diff --git a/graphrag/index/config/storage.py b/graphrag/index/config/storage.py index 2af0325635..fd8342b3bd 100644 --- a/graphrag/index/config/storage.py +++ b/graphrag/index/config/storage.py @@ -60,6 +60,10 @@ class PipelineBlobStorageConfig(PipelineStorageConfig[Literal[StorageType.blob]] ) """The base directory for the storage.""" + storage_account_name: str | None = pydantic_Field( + description="The blob storage account name.", default=None + ) + """The blob storage account name.""" PipelineStorageConfigTypes = ( PipelineFileStorageConfig | PipelineMemoryStorageConfig | PipelineBlobStorageConfig diff --git a/graphrag/index/input/load_input.py b/graphrag/index/input/load_input.py index f46a73be30..a632995f88 100644 --- a/graphrag/index/input/load_input.py +++ b/graphrag/index/input/load_input.py @@ -47,11 +47,12 @@ async def load_input( match config.storage_type: case StorageType.blob: log.info("using blob storage input") - if config.connection_string is None or config.container_name is None: - msg = "Connection string and container name required for blob storage" + if (config.connection_string is None and config.storage_account_name is None) or config.container_name is None: + msg = "Connection string or storage account name and container name required for blob storage" raise ValueError(msg) storage = BlobPipelineStorage( connection_string=config.connection_string, + storage_account_name=config.storage_account_name, container_name=config.container_name, path_prefix=config.base_dir, ) From 4bad8ea066f35ee13840feeb343ac3e5809bfe5c Mon Sep 17 00:00:00 2001 From: dorbaker Date: Tue, 14 May 2024 16:36:48 -0400 Subject: [PATCH 04/22] Updated to take optional cognitive services endpoint config parameter --- graphrag/llm/openai/create_openai_client.py | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/graphrag/llm/openai/create_openai_client.py b/graphrag/llm/openai/create_openai_client.py index 153341778d..553d2107a6 100644 --- a/graphrag/llm/openai/create_openai_client.py +++ b/graphrag/llm/openai/create_openai_client.py @@ -33,9 +33,13 @@ def create_openai_client( api_base, configuration.deployment_name, ) + if configuration.cognitive_services_endpoint is None: + cognitive_services_endpoint = "https://cognitiveservices.azure.com/.default" + else: + cognitive_services_endpoint = configuration.cognitive_services_endpoint if configuration.api_key is None: token_provider = get_bearer_token_provider( - DefaultAzureCredential(), "https://cognitiveservices.azure.com/.default" + DefaultAzureCredential(), cognitive_services_endpoint ) return AsyncAzureOpenAI( azure_ad_token_provider=token_provider, From 312718d1213721923d24b2ec6999c4c4286cdc3a Mon Sep 17 00:00:00 2001 From: Josh Bradley Date: Wed, 15 May 2024 01:29:50 -0400 Subject: [PATCH 05/22] make api_key optional --- graphrag/config/create_graphrag_config.py | 6 +++--- graphrag/config/models/llm_parameters.py | 2 +- graphrag/index/config/cache.py | 2 +- graphrag/index/config/input.py | 5 +++++ graphrag/index/config/reporting.py | 2 +- graphrag/index/config/storage.py | 2 +- graphrag/index/create_pipeline_config.py | 12 ++++++------ graphrag/index/input/load_input.py | 2 +- graphrag/index/storage/blob_pipeline_storage.py | 13 +++++-------- 9 files changed, 24 insertions(+), 22 deletions(-) diff --git a/graphrag/config/create_graphrag_config.py b/graphrag/config/create_graphrag_config.py index 72a26e8356..b0efa21773 100644 --- a/graphrag/config/create_graphrag_config.py +++ b/graphrag/config/create_graphrag_config.py @@ -86,7 +86,7 @@ def hydrate_llm_params( reader.str(Fragment.deployment_name) or base.deployment_name ) - if api_key is None: + if api_key is None and not _is_azure(llm_type): raise ApiKeyMissingError if _is_azure(llm_type): if api_base is None: @@ -137,7 +137,7 @@ def hydrate_embeddings_params( api_type = LLMType(api_type) if api_type else defs.LLM_TYPE deployment_name = reader.str(Fragment.deployment_name) - if api_key is None: + if api_key is None and not _is_azure(api_type): raise ApiKeyMissingError(embedding=True) if _is_azure(api_type): if api_base is None: @@ -211,7 +211,7 @@ def hydrate_parallelization_params( api_proxy = reader.str(Fragment.api_proxy) or fallback_oai_proxy deployment_name = reader.str(Fragment.deployment_name) - if api_key is None: + if api_key is None and not _is_azure(llm_type): raise ApiKeyMissingError if _is_azure(llm_type): if api_base is None: diff --git a/graphrag/config/models/llm_parameters.py b/graphrag/config/models/llm_parameters.py index ebd7af8d4a..4ffe96ca6a 100644 --- a/graphrag/config/models/llm_parameters.py +++ b/graphrag/config/models/llm_parameters.py @@ -13,7 +13,7 @@ class LLMParameters(BaseModel): """LLM Parameters model.""" model_config = ConfigDict(protected_namespaces=(), extra="allow") - api_key: str = Field( + api_key: str | None = Field( description="The API key to use for the LLM service.", default=None, ) diff --git a/graphrag/index/config/cache.py b/graphrag/index/config/cache.py index 12c116c95b..9d9b653fc8 100644 --- a/graphrag/index/config/cache.py +++ b/graphrag/index/config/cache.py @@ -57,7 +57,7 @@ class PipelineBlobCacheConfig(PipelineCacheConfig[Literal[CacheType.blob]]): ) """The base directory for the cache.""" - connection_string: str = pydantic_Field( + connection_string: str | None = pydantic_Field( description="The blob cache connection string for the cache.", default=None ) """The blob cache connection string for the cache.""" diff --git a/graphrag/index/config/input.py b/graphrag/index/config/input.py index 752fe1499b..ef826c749e 100644 --- a/graphrag/index/config/input.py +++ b/graphrag/index/config/input.py @@ -33,6 +33,11 @@ class PipelineInputConfig(BaseModel, Generic[T]): ) """The blob cache connection string for the cache.""" + storage_account_name: str | None = pydantic_Field( + description="The storage account name for the cache.", default=None + ) + """The storage account name for the cache.""" + container_name: str | None = pydantic_Field( description="The container name for cache", default=None ) diff --git a/graphrag/index/config/reporting.py b/graphrag/index/config/reporting.py index d3c6b46015..0061c5907f 100644 --- a/graphrag/index/config/reporting.py +++ b/graphrag/index/config/reporting.py @@ -48,7 +48,7 @@ class PipelineBlobReportingConfig(PipelineReportingConfig[Literal[ReportingType. type: Literal[ReportingType.blob] = ReportingType.blob """The type of reporting.""" - connection_string: str = pydantic_Field( + connection_string: str | None = pydantic_Field( description="The blob reporting connection string for the reporting.", default=None, ) diff --git a/graphrag/index/config/storage.py b/graphrag/index/config/storage.py index fd8342b3bd..40de184599 100644 --- a/graphrag/index/config/storage.py +++ b/graphrag/index/config/storage.py @@ -46,7 +46,7 @@ class PipelineBlobStorageConfig(PipelineStorageConfig[Literal[StorageType.blob]] type: Literal[StorageType.blob] = StorageType.blob """The type of storage.""" - connection_string: str = pydantic_Field( + connection_string: str | None = pydantic_Field( description="The blob storage connection string for the storage.", default=None ) """The blob storage connection string for the storage.""" diff --git a/graphrag/index/create_pipeline_config.py b/graphrag/index/create_pipeline_config.py index 6cdab61f6d..10d5094dc7 100644 --- a/graphrag/index/create_pipeline_config.py +++ b/graphrag/index/create_pipeline_config.py @@ -453,8 +453,8 @@ def _get_reporting_config( case ReportingType.blob: connection_string = settings.reporting.connection_string container_name = settings.reporting.container_name - if connection_string is None or container_name is None: - msg = "Connection string and container name must be provided for blob reporting." + if container_name is None: + msg = "Container name must be provided for blob reporting." raise ValueError(msg) return PipelineBlobReportingConfig( connection_string=connection_string, @@ -486,8 +486,8 @@ def _get_storage_config( case StorageType.blob: connection_string = settings.storage.connection_string container_name = settings.storage.container_name - if connection_string is None or container_name is None: - msg = "Connection string and container name must be provided for blob storage." + if container_name is None: + msg = "Container name must be provided for blob storage." raise ValueError(msg) return PipelineBlobStorageConfig( connection_string=connection_string, @@ -518,8 +518,8 @@ def _get_cache_config( case CacheType.blob: connection_string = settings.cache.connection_string container_name = settings.cache.container_name - if connection_string is None or container_name is None: - msg = "Connection string and container name must be provided for blob cache." + if container_name is None: + msg = "Container name must be provided for blob cache." raise ValueError(msg) return PipelineBlobCacheConfig( connection_string=connection_string, diff --git a/graphrag/index/input/load_input.py b/graphrag/index/input/load_input.py index a632995f88..6095f1c6a4 100644 --- a/graphrag/index/input/load_input.py +++ b/graphrag/index/input/load_input.py @@ -48,7 +48,7 @@ async def load_input( case StorageType.blob: log.info("using blob storage input") if (config.connection_string is None and config.storage_account_name is None) or config.container_name is None: - msg = "Connection string or storage account name and container name required for blob storage" + msg = "Connection string or (storage account name and container name) required for blob storage" raise ValueError(msg) storage = BlobPipelineStorage( connection_string=config.connection_string, diff --git a/graphrag/index/storage/blob_pipeline_storage.py b/graphrag/index/storage/blob_pipeline_storage.py index 731f5eb2ce..9824246493 100644 --- a/graphrag/index/storage/blob_pipeline_storage.py +++ b/graphrag/index/storage/blob_pipeline_storage.py @@ -23,7 +23,7 @@ class BlobPipelineStorage(PipelineStorage): """The Blob-Storage implementation.""" - _connection_string: str + _connection_string: str | None _container_name: str _path_prefix: str _encoding: str @@ -31,20 +31,20 @@ class BlobPipelineStorage(PipelineStorage): def __init__( self, - connection_string: str, + connection_string: str | None, container_name: str, encoding: str | None = None, path_prefix: str | None = None, storage_account_name: str | None = None, ): """Create a new BlobStorage instance.""" - if storage_account is None: + if connection_string: self._blob_service_client = BlobServiceClient.from_connection_string( connection_string ) else: self._blob_service_client = BlobServiceClient( - account_url=f"https://{storage_account}.blob.core.windows.net", + account_url=f"https://{storage_account_name}.blob.core.windows.net", credential=DefaultAzureCredential(), ) self._encoding = encoding or "utf-8" @@ -272,13 +272,10 @@ def _abfs_url(self, key: str) -> str: def create_blob_storage( - connection_string: str, container_name: str, base_dir: str | None + connection_string: str | None, container_name: str, base_dir: str | None ) -> PipelineStorage: """Create a blob based storage.""" log.info("Creating blob storage at %s", container_name) - if connection_string is None: - msg = "No connection string provided for blob storage." - raise ValueError(msg) if container_name is None: msg = "No container name provided for blob storage." raise ValueError(msg) From 04e8526c1f9dc4b7dbb18001d2aa007e3ed445ef Mon Sep 17 00:00:00 2001 From: Josh Bradley Date: Wed, 15 May 2024 01:37:07 -0400 Subject: [PATCH 06/22] fix formatting --- graphrag/index/config/pipeline.py | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/graphrag/index/config/pipeline.py b/graphrag/index/config/pipeline.py index 59478f65b2..03f5e3e054 100644 --- a/graphrag/index/config/pipeline.py +++ b/graphrag/index/config/pipeline.py @@ -31,22 +31,27 @@ def __str__(self): description="Extends another pipeline configuration", default=None ) """Extends another pipeline configuration""" + input: PipelineInputConfigTypes | None = pydantic_Field( default=None, discriminator="type" ) """The input configuration for the pipeline.""" + reporting: PipelineReportingConfigTypes | None = pydantic_Field( default=None, discriminator="type" ) """The reporting configuration for the pipeline.""" + storage: PipelineStorageConfigTypes | None = pydantic_Field( default=None, discriminator="type" ) """The storage configuration for the pipeline.""" + cache: PipelineCacheConfigTypes | None = pydantic_Field( default=None, discriminator="type" ) """The cache configuration for the pipeline.""" + root_dir: str | None = pydantic_Field( description="The root directory for the pipeline. All other paths will be based on this root_dir.", default=None, From 4556f6d9d79737e79da047cfd16c433a84d47f69 Mon Sep 17 00:00:00 2001 From: dorbaker Date: Wed, 15 May 2024 16:10:53 +0000 Subject: [PATCH 07/22] Bug fixes. --- graphrag/config/create_graphrag_config.py | 5 +++++ graphrag/config/models/cache_config.py | 3 +++ graphrag/config/models/input_config.py | 3 +++ graphrag/config/models/reporting_config.py | 3 +++ graphrag/config/models/storage_config.py | 3 +++ graphrag/index/cache/load_cache.py | 2 +- graphrag/index/config/cache.py | 4 ++++ graphrag/index/config/input.py | 12 +++++------ graphrag/index/config/reporting.py | 5 +++++ graphrag/index/config/storage.py | 4 ++-- graphrag/index/create_pipeline_config.py | 8 +++++++ graphrag/index/llm/load_llm.py | 5 +---- .../reporting/blob_workflow_callbacks.py | 21 +++++++++++++------ .../index/reporting/load_pipeline_reporter.py | 1 + .../index/storage/blob_pipeline_storage.py | 11 +++++----- graphrag/index/storage/load_storage.py | 2 +- graphrag/llm/openai/openai_configuration.py | 7 +++++++ 17 files changed, 74 insertions(+), 25 deletions(-) diff --git a/graphrag/config/create_graphrag_config.py b/graphrag/config/create_graphrag_config.py index b0efa21773..03b45790c4 100644 --- a/graphrag/config/create_graphrag_config.py +++ b/graphrag/config/create_graphrag_config.py @@ -314,6 +314,7 @@ def hydrate_parallelization_params( document_attribute_columns=reader.list("document_attribute_columns") or [], connection_string=reader.str(Fragment.conn_string), + storage_account_name=reader.str(Fragment.storage_account_name), container_name=reader.str(Fragment.container_name), ) with reader.envvar_prefix(Section.cache), reader.use(values.get("cache")): @@ -321,6 +322,7 @@ def hydrate_parallelization_params( cache_model = CacheConfig( type=CacheType(c_type) if c_type else defs.CACHE_TYPE, connection_string=reader.str(Fragment.conn_string), + storage_account_name=reader.str(Fragment.storage_account_name), container_name=reader.str(Fragment.container_name), base_dir=reader.str(Fragment.base_dir) or defs.CACHE_BASE_DIR, ) @@ -332,6 +334,7 @@ def hydrate_parallelization_params( reporting_model = ReportingConfig( type=ReportingType(r_type) if r_type else defs.REPORTING_TYPE, connection_string=reader.str(Fragment.conn_string), + storage_account_name=reader.str(Fragment.storage_account_name), container_name=reader.str(Fragment.container_name), base_dir=reader.str(Fragment.base_dir) or defs.REPORTING_BASE_DIR, ) @@ -340,6 +343,7 @@ def hydrate_parallelization_params( storage_model = StorageConfig( type=StorageType(s_type) if s_type else defs.STORAGE_TYPE, connection_string=reader.str(Fragment.conn_string), + storage_account_name=reader.str(Fragment.storage_account_name), container_name=reader.str(Fragment.container_name), base_dir=reader.str(Fragment.base_dir) or defs.STORAGE_BASE_DIR, ) @@ -536,6 +540,7 @@ class Fragment(str, Enum): request_timeout = "REQUEST_TIMEOUT" rpm = "RPM" sleep_recommendation = "SLEEP_ON_RATE_LIMIT_RECOMMENDATION" + storage_account_name = "STORAGE_ACCOUNT_NAME" thread_count = "THREAD_COUNT" thread_stagger = "THREAD_STAGGER" tpm = "TPM" diff --git a/graphrag/config/models/cache_config.py b/graphrag/config/models/cache_config.py index 5821bba08b..c907752edc 100644 --- a/graphrag/config/models/cache_config.py +++ b/graphrag/config/models/cache_config.py @@ -24,3 +24,6 @@ class CacheConfig(BaseModel): container_name: str | None = Field( description="The cache container name to use.", default=None ) + storage_account_name: str | None = Field( + description="The storage account name to use.", default=None + ) diff --git a/graphrag/config/models/input_config.py b/graphrag/config/models/input_config.py index 4a0c99c156..827875f821 100644 --- a/graphrag/config/models/input_config.py +++ b/graphrag/config/models/input_config.py @@ -24,6 +24,9 @@ class InputConfig(BaseModel): connection_string: str | None = Field( description="The azure blob storage connection string to use.", default=None ) + storage_account_name: str | None = Field( + description="The storage account name to use.", default=None + ) container_name: str | None = Field( description="The azure blob storage container name to use.", default=None ) diff --git a/graphrag/config/models/reporting_config.py b/graphrag/config/models/reporting_config.py index f9ed433531..0687c40615 100644 --- a/graphrag/config/models/reporting_config.py +++ b/graphrag/config/models/reporting_config.py @@ -25,3 +25,6 @@ class ReportingConfig(BaseModel): container_name: str | None = Field( description="The reporting container name to use.", default=None ) + storage_account_name: str | None = Field( + description="The storage account name to use.", default=None + ) diff --git a/graphrag/config/models/storage_config.py b/graphrag/config/models/storage_config.py index 51798ac01c..8db41f8e41 100644 --- a/graphrag/config/models/storage_config.py +++ b/graphrag/config/models/storage_config.py @@ -25,3 +25,6 @@ class StorageConfig(BaseModel): container_name: str | None = Field( description="The storage container name to use.", default=None ) + storage_account_name: str | None = Field( + description="The storage account name to use.", default=None + ) diff --git a/graphrag/index/cache/load_cache.py b/graphrag/index/cache/load_cache.py index c684fab5fb..e170121710 100644 --- a/graphrag/index/cache/load_cache.py +++ b/graphrag/index/cache/load_cache.py @@ -41,7 +41,7 @@ def load_cache(config: PipelineCacheConfig | None, root_dir: str | None): case CacheType.blob: config = cast(PipelineBlobCacheConfig, config) storage = BlobPipelineStorage( - config.connection_string, config.container_name + config.connection_string, config.container_name, storage_account_name=config.storage_account_name, ).child(config.base_dir) return JsonPipelineCache(storage) case _: diff --git a/graphrag/index/config/cache.py b/graphrag/index/config/cache.py index 9d9b653fc8..5d08f35827 100644 --- a/graphrag/index/config/cache.py +++ b/graphrag/index/config/cache.py @@ -67,6 +67,10 @@ class PipelineBlobCacheConfig(PipelineCacheConfig[Literal[CacheType.blob]]): ) """The container name for cache""" + storage_account_name: str = pydantic_Field( + description="The storage account name for cache", default=None + ) + """The storage account name for cache""" PipelineCacheConfigTypes = ( PipelineFileCacheConfig diff --git a/graphrag/index/config/input.py b/graphrag/index/config/input.py index ef826c749e..a1785eaaf6 100644 --- a/graphrag/index/config/input.py +++ b/graphrag/index/config/input.py @@ -29,19 +29,19 @@ class PipelineInputConfig(BaseModel, Generic[T]): """The storage type to use.""" connection_string: str | None = pydantic_Field( - description="The blob cache connection string for the cache.", default=None + description="The blob cache connection string for the input files.", default=None ) - """The blob cache connection string for the cache.""" + """The blob cache connection string for the input files.""" storage_account_name: str | None = pydantic_Field( - description="The storage account name for the cache.", default=None + description="The storage account name for the input files.", default=None ) - """The storage account name for the cache.""" + """The storage account name for the input files.""" container_name: str | None = pydantic_Field( - description="The container name for cache", default=None + description="The container name for input files.", default=None ) - """The container name for cache""" + """The container name for the input files.""" base_dir: str | None = pydantic_Field( description="The base directory for the input files.", default=None diff --git a/graphrag/index/config/reporting.py b/graphrag/index/config/reporting.py index 0061c5907f..49a094aefe 100644 --- a/graphrag/index/config/reporting.py +++ b/graphrag/index/config/reporting.py @@ -59,6 +59,11 @@ class PipelineBlobReportingConfig(PipelineReportingConfig[Literal[ReportingType. ) """The container name for reporting""" + storage_account_name: str = pydantic_Field( + description="The storage account name for reporting", default=None + ) + """The storage account name for reporting""" + base_dir: str | None = pydantic_Field( description="The base directory for the reporting.", default=None ) diff --git a/graphrag/index/config/storage.py b/graphrag/index/config/storage.py index 40de184599..ac34327e88 100644 --- a/graphrag/index/config/storage.py +++ b/graphrag/index/config/storage.py @@ -61,9 +61,9 @@ class PipelineBlobStorageConfig(PipelineStorageConfig[Literal[StorageType.blob]] """The base directory for the storage.""" storage_account_name: str | None = pydantic_Field( - description="The blob storage account name.", default=None + description="The storage account name.", default=None ) - """The blob storage account name.""" + """The storage account name.""" PipelineStorageConfigTypes = ( PipelineFileStorageConfig | PipelineMemoryStorageConfig | PipelineBlobStorageConfig diff --git a/graphrag/index/create_pipeline_config.py b/graphrag/index/create_pipeline_config.py index 10d5094dc7..502f948280 100644 --- a/graphrag/index/create_pipeline_config.py +++ b/graphrag/index/create_pipeline_config.py @@ -426,6 +426,7 @@ def _get_pipeline_input_config( title_column=settings.input.title_column, storage_type=settings.input.storage_type, connection_string=settings.input.connection_string, + storage_account_name=settings.input.storage_account_name, container_name=settings.input.container_name, ) case InputType.text: @@ -435,6 +436,7 @@ def _get_pipeline_input_config( encoding=settings.input.file_encoding, storage_type=settings.input.storage_type, connection_string=settings.input.connection_string, + storage_account_name=settings.input.storage_account_name, container_name=settings.input.container_name, ) case _: @@ -452,6 +454,7 @@ def _get_reporting_config( return PipelineFileReportingConfig(base_dir=settings.reporting.base_dir) case ReportingType.blob: connection_string = settings.reporting.connection_string + storage_account_name = settings.reporting.storage_account_name container_name = settings.reporting.container_name if container_name is None: msg = "Container name must be provided for blob reporting." @@ -460,6 +463,7 @@ def _get_reporting_config( connection_string=connection_string, container_name=container_name, base_dir=settings.reporting.base_dir, + storage_account_name=storage_account_name, ) case ReportingType.console: return PipelineConsoleReportingConfig() @@ -485,6 +489,7 @@ def _get_storage_config( return PipelineFileStorageConfig(base_dir=str(Path(root_dir) / base_dir)) case StorageType.blob: connection_string = settings.storage.connection_string + storage_account_name = settings.storage.storage_account_name container_name = settings.storage.container_name if container_name is None: msg = "Container name must be provided for blob storage." @@ -493,6 +498,7 @@ def _get_storage_config( connection_string=connection_string, container_name=container_name, base_dir=settings.storage.base_dir, + storage_account_name=storage_account_name, ) case _: # relative to the root_dir @@ -517,6 +523,7 @@ def _get_cache_config( return PipelineNoneCacheConfig() case CacheType.blob: connection_string = settings.cache.connection_string + storage_account_name = settings.cache.storage_account_name container_name = settings.cache.container_name if container_name is None: msg = "Container name must be provided for blob cache." @@ -525,6 +532,7 @@ def _get_cache_config( connection_string=connection_string, container_name=container_name, base_dir=settings.cache.base_dir, + storage_account_name=storage_account_name, ) case _: # relative to root dir diff --git a/graphrag/index/llm/load_llm.py b/graphrag/index/llm/load_llm.py index 0782c80b3f..1fb5fc0bf1 100644 --- a/graphrag/index/llm/load_llm.py +++ b/graphrag/index/llm/load_llm.py @@ -182,10 +182,7 @@ def _load_azure_openai_embeddings_llm( def _get_base_config(config: dict[str, Any]) -> dict[str, Any]: - api_key = config.get("api_key") or None - if api_key is None: - msg = 'OpenAI api key required for OpenAI LLM, use "api_key": ""' - raise ValueError(msg) + api_key = config.get("api_key", None) return { # Pass in all parameterized values diff --git a/graphrag/index/reporting/blob_workflow_callbacks.py b/graphrag/index/reporting/blob_workflow_callbacks.py index 200296ff03..dd68ed46e0 100644 --- a/graphrag/index/reporting/blob_workflow_callbacks.py +++ b/graphrag/index/reporting/blob_workflow_callbacks.py @@ -8,6 +8,7 @@ from pathlib import Path from typing import Any +from azure.identity import DefaultAzureCredential from azure.storage.blob import BlobServiceClient from datashaper import NoopWorkflowCallbacks @@ -25,18 +26,26 @@ def __init__( container_name: str, blob_name: str = "", base_dir: str | None = None, + storage_account_name: str | None = None, ): # type: ignore """Create a new instance of the BlobStorageReporter class.""" - if connection_string is None: - msg = "No connection string provided for blob storage." + if connection_string is None and storage_account_name is None: + msg = "No connection string or storage account name provided for blob storage." raise ValueError(msg) if container_name is None: msg = "No container name provided for blob storage." raise ValueError(msg) self._connection_string = connection_string - self._blob_service_client = BlobServiceClient.from_connection_string( - self._connection_string - ) + self._storage_account_name = storage_account_name + if self._connection_string is None: + self._blob_service_client = BlobServiceClient( + f"https://{storage_account_name}.blob.core.windows.net", + credential=DefaultAzureCredential(), + ) + else: + self._blob_service_client = BlobServiceClient( + self._connection_string + ) if blob_name == "": blob_name = f"report/{datetime.now(tz=timezone.utc).strftime('%Y-%m-%d-%H:%M:%S:%f')}.logs.json" @@ -56,7 +65,7 @@ def _write_log(self, log: dict[str, Any]): if ( self._num_blocks >= self._max_block_count ): # Check if block count exceeds 25k - self.__init__(self._connection_string, self._container_name) + self.__init__(self._connection_string, self._container_name, storage_account_name=self._storage_account_name) blob_client = self._blob_service_client.get_blob_client( self._container_name, self._blob_name diff --git a/graphrag/index/reporting/load_pipeline_reporter.py b/graphrag/index/reporting/load_pipeline_reporter.py index 4e17829cf0..19f79d507b 100644 --- a/graphrag/index/reporting/load_pipeline_reporter.py +++ b/graphrag/index/reporting/load_pipeline_reporter.py @@ -40,6 +40,7 @@ def load_pipeline_reporter( config.connection_string, config.container_name, base_dir=config.base_dir, + storage_account_name=config.storage_account_name ) case _: msg = f"Unknown reporting type: {config.type}" diff --git a/graphrag/index/storage/blob_pipeline_storage.py b/graphrag/index/storage/blob_pipeline_storage.py index 9824246493..30facef309 100644 --- a/graphrag/index/storage/blob_pipeline_storage.py +++ b/graphrag/index/storage/blob_pipeline_storage.py @@ -258,7 +258,7 @@ def child(self, name: str | None) -> "PipelineStorage": return self path = str(Path(self._path_prefix) / name) return BlobPipelineStorage( - self._connection_string, self._container_name, self._encoding, path + self._connection_string, self._container_name, self._encoding, path, self._storage_account_name ) def _keyname(self, key: str) -> str: @@ -272,14 +272,15 @@ def _abfs_url(self, key: str) -> str: def create_blob_storage( - connection_string: str | None, container_name: str, base_dir: str | None + connection_string: str | None, storage_account_name: str | None, container_name: str, base_dir: str | None ) -> PipelineStorage: """Create a blob based storage.""" log.info("Creating blob storage at %s", container_name) - if container_name is None: - msg = "No container name provided for blob storage." + if container_name is None and storage_account_name is None: + msg = "No container name or storage account name provided for blob storage." raise ValueError(msg) - return BlobPipelineStorage(connection_string, container_name, path_prefix=base_dir) + return BlobPipelineStorage(connection_string, container_name, path_prefix=base_dir, + storage_account_name=storage_account_name) def validate_blob_container_name(container_name: str): diff --git a/graphrag/index/storage/load_storage.py b/graphrag/index/storage/load_storage.py index 3b85fe4243..912998ac96 100644 --- a/graphrag/index/storage/load_storage.py +++ b/graphrag/index/storage/load_storage.py @@ -27,7 +27,7 @@ def load_storage(config: PipelineStorageConfig): case StorageType.blob: config = cast(PipelineBlobStorageConfig, config) return create_blob_storage( - config.connection_string, config.container_name, config.base_dir + config.connection_string, config.storage_account_name, config.container_name, config.base_dir ) case StorageType.file: config = cast(PipelineFileStorageConfig, config) diff --git a/graphrag/llm/openai/openai_configuration.py b/graphrag/llm/openai/openai_configuration.py index 3ecb3b9b02..796edf6488 100644 --- a/graphrag/llm/openai/openai_configuration.py +++ b/graphrag/llm/openai/openai_configuration.py @@ -26,6 +26,7 @@ class OpenAIConfiguration(Hashable, LLMConfig): _api_base: str | None _api_version: str | None + _cognitive_serivces_endpoint: str | None _deployment_name: str | None _organization: str | None _proxy: str | None @@ -102,6 +103,7 @@ def lookup_bool(key: str) -> bool | None: self._deployment_name = lookup_str("deployment_name") self._api_base = lookup_str("api_base") self._api_version = lookup_str("api_version") + self._cognitive_services_endpoint = lookup_str("cognitive_services_endpoint") self._organization = lookup_str("organization") self._proxy = lookup_str("proxy") self._n = lookup_int("n") @@ -153,6 +155,11 @@ def api_version(self) -> str | None: """API version property definition.""" return _non_blank(self._api_version) + @property + def cognitive_services_endpoint(self) -> str | None: + """API version property definition.""" + return _non_blank(self._cognitive_services_endpoint) + @property def organization(self) -> str | None: """Organization property definition.""" From ae09336cf4aa4241b682859db7a259cad023f502 Mon Sep 17 00:00:00 2001 From: Josh Bradley Date: Wed, 15 May 2024 12:21:40 -0400 Subject: [PATCH 08/22] set storage_account_name to None by default --- graphrag/index/storage/blob_pipeline_storage.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/graphrag/index/storage/blob_pipeline_storage.py b/graphrag/index/storage/blob_pipeline_storage.py index 9824246493..007338b4da 100644 --- a/graphrag/index/storage/blob_pipeline_storage.py +++ b/graphrag/index/storage/blob_pipeline_storage.py @@ -27,7 +27,7 @@ class BlobPipelineStorage(PipelineStorage): _container_name: str _path_prefix: str _encoding: str - _storage_account_name: str + _storage_account_name: str | None def __init__( self, @@ -51,7 +51,7 @@ def __init__( self._container_name = container_name self._connection_string = connection_string self._path_prefix = path_prefix or "" - self._storage_account_name = storage_account_name or "" + self._storage_account_name = storage_account_name log.info( "creating blob storage at container=%s, path=%s", self._container_name, From 0886bd29c9b4aeed63cda728862fa0b89a48acc6 Mon Sep 17 00:00:00 2001 From: Josh Bradley Date: Wed, 15 May 2024 14:43:51 -0400 Subject: [PATCH 09/22] ruff formatting fixes --- graphrag/index/cache/load_cache.py | 4 +- graphrag/index/config/cache.py | 1 + graphrag/index/config/input.py | 3 +- graphrag/index/config/storage.py | 1 + graphrag/index/create_pipeline_config.py | 6 +- graphrag/index/input/load_input.py | 4 +- graphrag/index/llm/load_llm.py | 62 ++++++++++--------- .../reporting/blob_workflow_callbacks.py | 26 ++++---- .../index/reporting/load_pipeline_reporter.py | 2 +- .../index/storage/blob_pipeline_storage.py | 29 +++++++-- graphrag/index/storage/load_storage.py | 5 +- graphrag/llm/openai/create_openai_client.py | 4 +- graphrag/vector_stores/azure_ai_search.py | 2 +- 13 files changed, 93 insertions(+), 56 deletions(-) diff --git a/graphrag/index/cache/load_cache.py b/graphrag/index/cache/load_cache.py index e170121710..d3a81cf835 100644 --- a/graphrag/index/cache/load_cache.py +++ b/graphrag/index/cache/load_cache.py @@ -41,7 +41,9 @@ def load_cache(config: PipelineCacheConfig | None, root_dir: str | None): case CacheType.blob: config = cast(PipelineBlobCacheConfig, config) storage = BlobPipelineStorage( - config.connection_string, config.container_name, storage_account_name=config.storage_account_name, + config.connection_string, + config.container_name, + storage_account_name=config.storage_account_name, ).child(config.base_dir) return JsonPipelineCache(storage) case _: diff --git a/graphrag/index/config/cache.py b/graphrag/index/config/cache.py index 5d08f35827..e911408479 100644 --- a/graphrag/index/config/cache.py +++ b/graphrag/index/config/cache.py @@ -72,6 +72,7 @@ class PipelineBlobCacheConfig(PipelineCacheConfig[Literal[CacheType.blob]]): ) """The storage account name for cache""" + PipelineCacheConfigTypes = ( PipelineFileCacheConfig | PipelineMemoryCacheConfig diff --git a/graphrag/index/config/input.py b/graphrag/index/config/input.py index a1785eaaf6..4beea02cbb 100644 --- a/graphrag/index/config/input.py +++ b/graphrag/index/config/input.py @@ -29,7 +29,8 @@ class PipelineInputConfig(BaseModel, Generic[T]): """The storage type to use.""" connection_string: str | None = pydantic_Field( - description="The blob cache connection string for the input files.", default=None + description="The blob cache connection string for the input files.", + default=None, ) """The blob cache connection string for the input files.""" diff --git a/graphrag/index/config/storage.py b/graphrag/index/config/storage.py index ac34327e88..f41ac8ae26 100644 --- a/graphrag/index/config/storage.py +++ b/graphrag/index/config/storage.py @@ -65,6 +65,7 @@ class PipelineBlobStorageConfig(PipelineStorageConfig[Literal[StorageType.blob]] ) """The storage account name.""" + PipelineStorageConfigTypes = ( PipelineFileStorageConfig | PipelineMemoryStorageConfig | PipelineBlobStorageConfig ) diff --git a/graphrag/index/create_pipeline_config.py b/graphrag/index/create_pipeline_config.py index 502f948280..55653c75d0 100644 --- a/graphrag/index/create_pipeline_config.py +++ b/graphrag/index/create_pipeline_config.py @@ -259,9 +259,9 @@ def _get_embedding_settings(settings: TextEmbeddingConfig, embedding_name: str) # settings.vector_store. contains the specific settings for this embedding # strategy = settings.resolved_strategy() # get the default strategy - strategy.update({ - "vector_store": vector_store_settings - }) # update the default strategy with the vector store settings + strategy.update( + {"vector_store": vector_store_settings} + ) # update the default strategy with the vector store settings # This ensures the vector store config is part of the strategy and not the global config return { "strategy": strategy, diff --git a/graphrag/index/input/load_input.py b/graphrag/index/input/load_input.py index 6095f1c6a4..67a14529be 100644 --- a/graphrag/index/input/load_input.py +++ b/graphrag/index/input/load_input.py @@ -47,7 +47,9 @@ async def load_input( match config.storage_type: case StorageType.blob: log.info("using blob storage input") - if (config.connection_string is None and config.storage_account_name is None) or config.container_name is None: + if ( + config.connection_string is None and config.storage_account_name is None + ) or config.container_name is None: msg = "Connection string or (storage account name and container name) required for blob storage" raise ValueError(msg) storage = BlobPipelineStorage( diff --git a/graphrag/index/llm/load_llm.py b/graphrag/index/llm/load_llm.py index 1fb5fc0bf1..b94d301fe7 100644 --- a/graphrag/index/llm/load_llm.py +++ b/graphrag/index/llm/load_llm.py @@ -102,16 +102,18 @@ def _load_openai_completion_llm( azure=False, ): return _create_openai_completion_llm( - OpenAIConfiguration({ - **_get_base_config(config), - "model": config.get("model", "gpt-4-turbo-preview"), - "deployment_name": config.get("deployment_name"), - "temperature": config.get("temperature", 0.0), - "frequency_penalty": config.get("frequency_penalty", 0), - "presence_penalty": config.get("presence_penalty", 0), - "top_p": config.get("top_p", 1), - "max_tokens": config.get("max_tokens"), - }), + OpenAIConfiguration( + { + **_get_base_config(config), + "model": config.get("model", "gpt-4-turbo-preview"), + "deployment_name": config.get("deployment_name"), + "temperature": config.get("temperature", 0.0), + "frequency_penalty": config.get("frequency_penalty", 0), + "presence_penalty": config.get("presence_penalty", 0), + "top_p": config.get("top_p", 1), + "max_tokens": config.get("max_tokens"), + } + ), on_error, cache, azure, @@ -125,17 +127,19 @@ def _load_openai_chat_llm( azure=False, ): return _create_openai_chat_llm( - OpenAIConfiguration({ - # Set default values - **_get_base_config(config), - "model": config.get("model", "gpt-4-turbo-preview"), - "deployment_name": config.get("deployment_name"), - "temperature": config.get("temperature", 0.0), - "frequency_penalty": config.get("frequency_penalty", 0), - "presence_penalty": config.get("presence_penalty", 0), - "top_p": config.get("top_p", 1), - "max_tokens": config.get("max_tokens"), - }), + OpenAIConfiguration( + { + # Set default values + **_get_base_config(config), + "model": config.get("model", "gpt-4-turbo-preview"), + "deployment_name": config.get("deployment_name"), + "temperature": config.get("temperature", 0.0), + "frequency_penalty": config.get("frequency_penalty", 0), + "presence_penalty": config.get("presence_penalty", 0), + "top_p": config.get("top_p", 1), + "max_tokens": config.get("max_tokens"), + } + ), on_error, cache, azure, @@ -150,13 +154,15 @@ def _load_openai_embeddings_llm( ): # TODO: Inject Cache return _create_openai_embeddings_llm( - OpenAIConfiguration({ - **_get_base_config(config), - "model": config.get( - "embeddings_model", config.get("model", "text-embedding-3-small") - ), - "deployment_name": config.get("deployment_name"), - }), + OpenAIConfiguration( + { + **_get_base_config(config), + "model": config.get( + "embeddings_model", config.get("model", "text-embedding-3-small") + ), + "deployment_name": config.get("deployment_name"), + } + ), on_error, cache, azure, diff --git a/graphrag/index/reporting/blob_workflow_callbacks.py b/graphrag/index/reporting/blob_workflow_callbacks.py index dd68ed46e0..1cb103de85 100644 --- a/graphrag/index/reporting/blob_workflow_callbacks.py +++ b/graphrag/index/reporting/blob_workflow_callbacks.py @@ -43,9 +43,7 @@ def __init__( credential=DefaultAzureCredential(), ) else: - self._blob_service_client = BlobServiceClient( - self._connection_string - ) + self._blob_service_client = BlobServiceClient(self._connection_string) if blob_name == "": blob_name = f"report/{datetime.now(tz=timezone.utc).strftime('%Y-%m-%d-%H:%M:%S:%f')}.logs.json" @@ -65,7 +63,11 @@ def _write_log(self, log: dict[str, Any]): if ( self._num_blocks >= self._max_block_count ): # Check if block count exceeds 25k - self.__init__(self._connection_string, self._container_name, storage_account_name=self._storage_account_name) + self.__init__( + self._connection_string, + self._container_name, + storage_account_name=self._storage_account_name, + ) blob_client = self._blob_service_client.get_blob_client( self._container_name, self._blob_name @@ -83,13 +85,15 @@ def on_error( details: dict | None = None, ): """Report an error.""" - self._write_log({ - "type": "error", - "data": message, - "cause": str(cause), - "stack": stack, - "details": details, - }) + self._write_log( + { + "type": "error", + "data": message, + "cause": str(cause), + "stack": stack, + "details": details, + } + ) def on_warning(self, message: str, details: dict | None = None): """Report a warning.""" diff --git a/graphrag/index/reporting/load_pipeline_reporter.py b/graphrag/index/reporting/load_pipeline_reporter.py index 19f79d507b..011db9b354 100644 --- a/graphrag/index/reporting/load_pipeline_reporter.py +++ b/graphrag/index/reporting/load_pipeline_reporter.py @@ -40,7 +40,7 @@ def load_pipeline_reporter( config.connection_string, config.container_name, base_dir=config.base_dir, - storage_account_name=config.storage_account_name + storage_account_name=config.storage_account_name, ) case _: msg = f"Unknown reporting type: {config.type}" diff --git a/graphrag/index/storage/blob_pipeline_storage.py b/graphrag/index/storage/blob_pipeline_storage.py index 43b23a32e1..db7c3c0a10 100644 --- a/graphrag/index/storage/blob_pipeline_storage.py +++ b/graphrag/index/storage/blob_pipeline_storage.py @@ -201,7 +201,10 @@ def set_df_json(self, key: str, dataframe: Any) -> None: storage_account_name = self._storage_account_name dataframe.to_json( self._abfs_url(key), - storage_options={"account_name":storage_account_name, "credential": DefaultAzureCredential()}, + storage_options={ + "account_name": storage_account_name, + "credential": DefaultAzureCredential(), + }, orient="records", lines=True, force_ascii=False, @@ -222,7 +225,10 @@ def set_df_parquet(self, key: str, dataframe: Any) -> None: storage_account_name = self._storage_account_name dataframe.to_parquet( self._abfs_url(key), - storage_options={"account_name": storage_account_name, "credential": DefaultAzureCredential()}, + storage_options={ + "account_name": storage_account_name, + "credential": DefaultAzureCredential(), + }, ) else: connection_string = self._connection_string @@ -258,7 +264,11 @@ def child(self, name: str | None) -> "PipelineStorage": return self path = str(Path(self._path_prefix) / name) return BlobPipelineStorage( - self._connection_string, self._container_name, self._encoding, path, self._storage_account_name + self._connection_string, + self._container_name, + self._encoding, + path, + self._storage_account_name, ) def _keyname(self, key: str) -> str: @@ -272,15 +282,22 @@ def _abfs_url(self, key: str) -> str: def create_blob_storage( - connection_string: str | None, storage_account_name: str | None, container_name: str, base_dir: str | None + connection_string: str | None, + storage_account_name: str | None, + container_name: str, + base_dir: str | None, ) -> PipelineStorage: """Create a blob based storage.""" log.info("Creating blob storage at %s", container_name) if container_name is None and storage_account_name is None: msg = "No container name or storage account name provided for blob storage." raise ValueError(msg) - return BlobPipelineStorage(connection_string, container_name, path_prefix=base_dir, - storage_account_name=storage_account_name) + return BlobPipelineStorage( + connection_string, + container_name, + path_prefix=base_dir, + storage_account_name=storage_account_name, + ) def validate_blob_container_name(container_name: str): diff --git a/graphrag/index/storage/load_storage.py b/graphrag/index/storage/load_storage.py index 912998ac96..0ad8356aa9 100644 --- a/graphrag/index/storage/load_storage.py +++ b/graphrag/index/storage/load_storage.py @@ -27,7 +27,10 @@ def load_storage(config: PipelineStorageConfig): case StorageType.blob: config = cast(PipelineBlobStorageConfig, config) return create_blob_storage( - config.connection_string, config.storage_account_name, config.container_name, config.base_dir + config.connection_string, + config.storage_account_name, + config.container_name, + config.base_dir, ) case StorageType.file: config = cast(PipelineFileStorageConfig, config) diff --git a/graphrag/llm/openai/create_openai_client.py b/graphrag/llm/openai/create_openai_client.py index 553d2107a6..e839ff5d41 100644 --- a/graphrag/llm/openai/create_openai_client.py +++ b/graphrag/llm/openai/create_openai_client.py @@ -39,8 +39,8 @@ def create_openai_client( cognitive_services_endpoint = configuration.cognitive_services_endpoint if configuration.api_key is None: token_provider = get_bearer_token_provider( - DefaultAzureCredential(), cognitive_services_endpoint - ) + DefaultAzureCredential(), cognitive_services_endpoint + ) return AsyncAzureOpenAI( azure_ad_token_provider=token_provider, organization=configuration.organization, diff --git a/graphrag/vector_stores/azure_ai_search.py b/graphrag/vector_stores/azure_ai_search.py index b2137cf90d..db6e30396c 100644 --- a/graphrag/vector_stores/azure_ai_search.py +++ b/graphrag/vector_stores/azure_ai_search.py @@ -50,7 +50,7 @@ def connect(self, **kwargs: Any) -> Any: ) if url: - if api_key: + if api_key: self.db_connection = SearchClient( url, self.collection_name, AzureKeyCredential(api_key) ) From 98995ad373720512bb47a2ef83100c1e67adab84 Mon Sep 17 00:00:00 2001 From: Josh Bradley Date: Wed, 15 May 2024 17:10:59 -0400 Subject: [PATCH 10/22] fix issue with using connection strings --- graphrag/index/config/cache.py | 2 +- graphrag/index/config/reporting.py | 2 +- graphrag/index/reporting/blob_workflow_callbacks.py | 8 ++++---- 3 files changed, 6 insertions(+), 6 deletions(-) diff --git a/graphrag/index/config/cache.py b/graphrag/index/config/cache.py index e911408479..6396af69ec 100644 --- a/graphrag/index/config/cache.py +++ b/graphrag/index/config/cache.py @@ -67,7 +67,7 @@ class PipelineBlobCacheConfig(PipelineCacheConfig[Literal[CacheType.blob]]): ) """The container name for cache""" - storage_account_name: str = pydantic_Field( + storage_account_name: str | None = pydantic_Field( description="The storage account name for cache", default=None ) """The storage account name for cache""" diff --git a/graphrag/index/config/reporting.py b/graphrag/index/config/reporting.py index 49a094aefe..4585ba1cb5 100644 --- a/graphrag/index/config/reporting.py +++ b/graphrag/index/config/reporting.py @@ -59,7 +59,7 @@ class PipelineBlobReportingConfig(PipelineReportingConfig[Literal[ReportingType. ) """The container name for reporting""" - storage_account_name: str = pydantic_Field( + storage_account_name: str | None = pydantic_Field( description="The storage account name for reporting", default=None ) """The storage account name for reporting""" diff --git a/graphrag/index/reporting/blob_workflow_callbacks.py b/graphrag/index/reporting/blob_workflow_callbacks.py index 1cb103de85..2182edd08d 100644 --- a/graphrag/index/reporting/blob_workflow_callbacks.py +++ b/graphrag/index/reporting/blob_workflow_callbacks.py @@ -22,7 +22,7 @@ class BlobWorkflowCallbacks(NoopWorkflowCallbacks): def __init__( self, - connection_string: str, + connection_string: str | None, container_name: str, blob_name: str = "", base_dir: str | None = None, @@ -37,13 +37,13 @@ def __init__( raise ValueError(msg) self._connection_string = connection_string self._storage_account_name = storage_account_name - if self._connection_string is None: + if self._connection_string: + self._blob_service_client = BlobServiceClient.from_connection_string(self._connection_string) + else: self._blob_service_client = BlobServiceClient( f"https://{storage_account_name}.blob.core.windows.net", credential=DefaultAzureCredential(), ) - else: - self._blob_service_client = BlobServiceClient(self._connection_string) if blob_name == "": blob_name = f"report/{datetime.now(tz=timezone.utc).strftime('%Y-%m-%d-%H:%M:%S:%f')}.logs.json" From 98169b01a463b793284ef91af8d6bb3280482476 Mon Sep 17 00:00:00 2001 From: dorbaker Date: Thu, 16 May 2024 17:57:49 +0000 Subject: [PATCH 11/22] Switched from storage account name to storage account blob url. --- graphrag/config/create_graphrag_config.py | 10 +++++----- graphrag/config/models/cache_config.py | 4 ++-- graphrag/config/models/input_config.py | 4 ++-- graphrag/config/models/reporting_config.py | 4 ++-- graphrag/config/models/storage_config.py | 4 ++-- graphrag/index/cache/load_cache.py | 2 +- graphrag/index/config/cache.py | 6 +++--- graphrag/index/config/input.py | 6 +++--- graphrag/index/config/reporting.py | 6 +++--- graphrag/index/config/storage.py | 6 +++--- graphrag/index/create_pipeline_config.py | 16 ++++++++-------- graphrag/index/input/load_input.py | 6 +++--- .../reporting/blob_workflow_callbacks.py | 12 ++++++------ .../index/reporting/load_pipeline_reporter.py | 2 +- .../index/storage/blob_pipeline_storage.py | 19 ++++++++++--------- graphrag/index/storage/load_storage.py | 2 +- 16 files changed, 55 insertions(+), 54 deletions(-) diff --git a/graphrag/config/create_graphrag_config.py b/graphrag/config/create_graphrag_config.py index 03b45790c4..452c2f3562 100644 --- a/graphrag/config/create_graphrag_config.py +++ b/graphrag/config/create_graphrag_config.py @@ -314,7 +314,7 @@ def hydrate_parallelization_params( document_attribute_columns=reader.list("document_attribute_columns") or [], connection_string=reader.str(Fragment.conn_string), - storage_account_name=reader.str(Fragment.storage_account_name), + storage_account_blob_url=reader.str(Fragment.storage_account_blob_url), container_name=reader.str(Fragment.container_name), ) with reader.envvar_prefix(Section.cache), reader.use(values.get("cache")): @@ -322,7 +322,7 @@ def hydrate_parallelization_params( cache_model = CacheConfig( type=CacheType(c_type) if c_type else defs.CACHE_TYPE, connection_string=reader.str(Fragment.conn_string), - storage_account_name=reader.str(Fragment.storage_account_name), + storage_account_blob_url=reader.str(Fragment.storage_account_blob_url), container_name=reader.str(Fragment.container_name), base_dir=reader.str(Fragment.base_dir) or defs.CACHE_BASE_DIR, ) @@ -334,7 +334,7 @@ def hydrate_parallelization_params( reporting_model = ReportingConfig( type=ReportingType(r_type) if r_type else defs.REPORTING_TYPE, connection_string=reader.str(Fragment.conn_string), - storage_account_name=reader.str(Fragment.storage_account_name), + storage_account_blob_url=reader.str(Fragment.storage_account_blob_url), container_name=reader.str(Fragment.container_name), base_dir=reader.str(Fragment.base_dir) or defs.REPORTING_BASE_DIR, ) @@ -343,7 +343,7 @@ def hydrate_parallelization_params( storage_model = StorageConfig( type=StorageType(s_type) if s_type else defs.STORAGE_TYPE, connection_string=reader.str(Fragment.conn_string), - storage_account_name=reader.str(Fragment.storage_account_name), + storage_account_blob_url=reader.str(Fragment.storage_account_blob_url), container_name=reader.str(Fragment.container_name), base_dir=reader.str(Fragment.base_dir) or defs.STORAGE_BASE_DIR, ) @@ -540,7 +540,7 @@ class Fragment(str, Enum): request_timeout = "REQUEST_TIMEOUT" rpm = "RPM" sleep_recommendation = "SLEEP_ON_RATE_LIMIT_RECOMMENDATION" - storage_account_name = "STORAGE_ACCOUNT_NAME" + storage_account_blob_url = "STORAGE_ACCOUNT_BLOB_URL" thread_count = "THREAD_COUNT" thread_stagger = "THREAD_STAGGER" tpm = "TPM" diff --git a/graphrag/config/models/cache_config.py b/graphrag/config/models/cache_config.py index c907752edc..4589edce0b 100644 --- a/graphrag/config/models/cache_config.py +++ b/graphrag/config/models/cache_config.py @@ -24,6 +24,6 @@ class CacheConfig(BaseModel): container_name: str | None = Field( description="The cache container name to use.", default=None ) - storage_account_name: str | None = Field( - description="The storage account name to use.", default=None + storage_account_blob_url: str | None = Field( + description="The storage account blob url to use.", default=None ) diff --git a/graphrag/config/models/input_config.py b/graphrag/config/models/input_config.py index 827875f821..0c2a29e95e 100644 --- a/graphrag/config/models/input_config.py +++ b/graphrag/config/models/input_config.py @@ -24,8 +24,8 @@ class InputConfig(BaseModel): connection_string: str | None = Field( description="The azure blob storage connection string to use.", default=None ) - storage_account_name: str | None = Field( - description="The storage account name to use.", default=None + storage_account_blob_url: str | None = Field( + description="The storage account blob url to use.", default=None ) container_name: str | None = Field( description="The azure blob storage container name to use.", default=None diff --git a/graphrag/config/models/reporting_config.py b/graphrag/config/models/reporting_config.py index 0687c40615..35e86cf5da 100644 --- a/graphrag/config/models/reporting_config.py +++ b/graphrag/config/models/reporting_config.py @@ -25,6 +25,6 @@ class ReportingConfig(BaseModel): container_name: str | None = Field( description="The reporting container name to use.", default=None ) - storage_account_name: str | None = Field( - description="The storage account name to use.", default=None + storage_account_blob_url: str | None = Field( + description="The storage account blob url to use.", default=None ) diff --git a/graphrag/config/models/storage_config.py b/graphrag/config/models/storage_config.py index 8db41f8e41..dcf41b9222 100644 --- a/graphrag/config/models/storage_config.py +++ b/graphrag/config/models/storage_config.py @@ -25,6 +25,6 @@ class StorageConfig(BaseModel): container_name: str | None = Field( description="The storage container name to use.", default=None ) - storage_account_name: str | None = Field( - description="The storage account name to use.", default=None + storage_account_blob_url: str | None = Field( + description="The storage account blob url to use.", default=None ) diff --git a/graphrag/index/cache/load_cache.py b/graphrag/index/cache/load_cache.py index d3a81cf835..4e0e6324fb 100644 --- a/graphrag/index/cache/load_cache.py +++ b/graphrag/index/cache/load_cache.py @@ -43,7 +43,7 @@ def load_cache(config: PipelineCacheConfig | None, root_dir: str | None): storage = BlobPipelineStorage( config.connection_string, config.container_name, - storage_account_name=config.storage_account_name, + storage_account_blob_url=config.storage_account_blob_url, ).child(config.base_dir) return JsonPipelineCache(storage) case _: diff --git a/graphrag/index/config/cache.py b/graphrag/index/config/cache.py index 6396af69ec..dfafaa91e1 100644 --- a/graphrag/index/config/cache.py +++ b/graphrag/index/config/cache.py @@ -67,10 +67,10 @@ class PipelineBlobCacheConfig(PipelineCacheConfig[Literal[CacheType.blob]]): ) """The container name for cache""" - storage_account_name: str | None = pydantic_Field( - description="The storage account name for cache", default=None + storage_account_blob_url: str | None = pydantic_Field( + description="The storage account blob url for cache", default=None ) - """The storage account name for cache""" + """The storage account blob url for cache""" PipelineCacheConfigTypes = ( diff --git a/graphrag/index/config/input.py b/graphrag/index/config/input.py index 4beea02cbb..7917995bc5 100644 --- a/graphrag/index/config/input.py +++ b/graphrag/index/config/input.py @@ -34,10 +34,10 @@ class PipelineInputConfig(BaseModel, Generic[T]): ) """The blob cache connection string for the input files.""" - storage_account_name: str | None = pydantic_Field( - description="The storage account name for the input files.", default=None + storage_account_blob_url: str | None = pydantic_Field( + description="The storage account blob url for the input files.", default=None ) - """The storage account name for the input files.""" + """The storage account blob url for the input files.""" container_name: str | None = pydantic_Field( description="The container name for input files.", default=None diff --git a/graphrag/index/config/reporting.py b/graphrag/index/config/reporting.py index 4585ba1cb5..921e24ae4e 100644 --- a/graphrag/index/config/reporting.py +++ b/graphrag/index/config/reporting.py @@ -59,10 +59,10 @@ class PipelineBlobReportingConfig(PipelineReportingConfig[Literal[ReportingType. ) """The container name for reporting""" - storage_account_name: str | None = pydantic_Field( - description="The storage account name for reporting", default=None + storage_account_blob_url: str | None = pydantic_Field( + description="The storage account blob url for reporting", default=None ) - """The storage account name for reporting""" + """The storage account blob url for reporting""" base_dir: str | None = pydantic_Field( description="The base directory for the reporting.", default=None diff --git a/graphrag/index/config/storage.py b/graphrag/index/config/storage.py index f41ac8ae26..94f36c85d6 100644 --- a/graphrag/index/config/storage.py +++ b/graphrag/index/config/storage.py @@ -60,10 +60,10 @@ class PipelineBlobStorageConfig(PipelineStorageConfig[Literal[StorageType.blob]] ) """The base directory for the storage.""" - storage_account_name: str | None = pydantic_Field( - description="The storage account name.", default=None + storage_account_blob_url: str | None = pydantic_Field( + description="The storage account blob url.", default=None ) - """The storage account name.""" + """The storage account blob url.""" PipelineStorageConfigTypes = ( diff --git a/graphrag/index/create_pipeline_config.py b/graphrag/index/create_pipeline_config.py index 55653c75d0..d413c3470e 100644 --- a/graphrag/index/create_pipeline_config.py +++ b/graphrag/index/create_pipeline_config.py @@ -426,7 +426,7 @@ def _get_pipeline_input_config( title_column=settings.input.title_column, storage_type=settings.input.storage_type, connection_string=settings.input.connection_string, - storage_account_name=settings.input.storage_account_name, + storage_account_blob_url=settings.input.storage_account_blob_url, container_name=settings.input.container_name, ) case InputType.text: @@ -436,7 +436,7 @@ def _get_pipeline_input_config( encoding=settings.input.file_encoding, storage_type=settings.input.storage_type, connection_string=settings.input.connection_string, - storage_account_name=settings.input.storage_account_name, + storage_account_blob_url=settings.input.storage_account_blob_url, container_name=settings.input.container_name, ) case _: @@ -454,7 +454,7 @@ def _get_reporting_config( return PipelineFileReportingConfig(base_dir=settings.reporting.base_dir) case ReportingType.blob: connection_string = settings.reporting.connection_string - storage_account_name = settings.reporting.storage_account_name + storage_account_blob_url = settings.reporting.storage_account_blob_url container_name = settings.reporting.container_name if container_name is None: msg = "Container name must be provided for blob reporting." @@ -463,7 +463,7 @@ def _get_reporting_config( connection_string=connection_string, container_name=container_name, base_dir=settings.reporting.base_dir, - storage_account_name=storage_account_name, + storage_account_blob_url=storage_account_blob_url, ) case ReportingType.console: return PipelineConsoleReportingConfig() @@ -489,7 +489,7 @@ def _get_storage_config( return PipelineFileStorageConfig(base_dir=str(Path(root_dir) / base_dir)) case StorageType.blob: connection_string = settings.storage.connection_string - storage_account_name = settings.storage.storage_account_name + storage_account_blob_url = settings.storage.storage_account_blob_url container_name = settings.storage.container_name if container_name is None: msg = "Container name must be provided for blob storage." @@ -498,7 +498,7 @@ def _get_storage_config( connection_string=connection_string, container_name=container_name, base_dir=settings.storage.base_dir, - storage_account_name=storage_account_name, + storage_account_blob_url=storage_account_blob_url, ) case _: # relative to the root_dir @@ -523,7 +523,7 @@ def _get_cache_config( return PipelineNoneCacheConfig() case CacheType.blob: connection_string = settings.cache.connection_string - storage_account_name = settings.cache.storage_account_name + storage_account_blob_url = settings.cache.storage_account_blob_url container_name = settings.cache.container_name if container_name is None: msg = "Container name must be provided for blob cache." @@ -532,7 +532,7 @@ def _get_cache_config( connection_string=connection_string, container_name=container_name, base_dir=settings.cache.base_dir, - storage_account_name=storage_account_name, + storage_account_blob_url=storage_account_blob_url, ) case _: # relative to root dir diff --git a/graphrag/index/input/load_input.py b/graphrag/index/input/load_input.py index 67a14529be..9b800bce3a 100644 --- a/graphrag/index/input/load_input.py +++ b/graphrag/index/input/load_input.py @@ -48,13 +48,13 @@ async def load_input( case StorageType.blob: log.info("using blob storage input") if ( - config.connection_string is None and config.storage_account_name is None + config.connection_string is None and config.storage_account_blob_url is None ) or config.container_name is None: - msg = "Connection string or (storage account name and container name) required for blob storage" + msg = "(Connection string or storage account blob url) and container name required for blob storage" raise ValueError(msg) storage = BlobPipelineStorage( connection_string=config.connection_string, - storage_account_name=config.storage_account_name, + storage_account_blob_url=config.storage_account_blob_url, container_name=config.container_name, path_prefix=config.base_dir, ) diff --git a/graphrag/index/reporting/blob_workflow_callbacks.py b/graphrag/index/reporting/blob_workflow_callbacks.py index 2182edd08d..3d39bd2970 100644 --- a/graphrag/index/reporting/blob_workflow_callbacks.py +++ b/graphrag/index/reporting/blob_workflow_callbacks.py @@ -26,22 +26,22 @@ def __init__( container_name: str, blob_name: str = "", base_dir: str | None = None, - storage_account_name: str | None = None, + storage_account_blob_url: str | None = None, ): # type: ignore """Create a new instance of the BlobStorageReporter class.""" - if connection_string is None and storage_account_name is None: - msg = "No connection string or storage account name provided for blob storage." + if connection_string is None and storage_account_blob_url is None: + msg = "No connection string or storage account blob url provided for blob storage." raise ValueError(msg) if container_name is None: msg = "No container name provided for blob storage." raise ValueError(msg) self._connection_string = connection_string - self._storage_account_name = storage_account_name + self._storage_account_blob_url = storage_account_blob_url if self._connection_string: self._blob_service_client = BlobServiceClient.from_connection_string(self._connection_string) else: self._blob_service_client = BlobServiceClient( - f"https://{storage_account_name}.blob.core.windows.net", + storage_account_blob_url, credential=DefaultAzureCredential(), ) @@ -66,7 +66,7 @@ def _write_log(self, log: dict[str, Any]): self.__init__( self._connection_string, self._container_name, - storage_account_name=self._storage_account_name, + storage_account_blob_url=self._storage_account_blob_url, ) blob_client = self._blob_service_client.get_blob_client( diff --git a/graphrag/index/reporting/load_pipeline_reporter.py b/graphrag/index/reporting/load_pipeline_reporter.py index 011db9b354..0386ea03d1 100644 --- a/graphrag/index/reporting/load_pipeline_reporter.py +++ b/graphrag/index/reporting/load_pipeline_reporter.py @@ -40,7 +40,7 @@ def load_pipeline_reporter( config.connection_string, config.container_name, base_dir=config.base_dir, - storage_account_name=config.storage_account_name, + storage_account_blob_url=config.storage_account_blob_url, ) case _: msg = f"Unknown reporting type: {config.type}" diff --git a/graphrag/index/storage/blob_pipeline_storage.py b/graphrag/index/storage/blob_pipeline_storage.py index db7c3c0a10..178fd77a48 100644 --- a/graphrag/index/storage/blob_pipeline_storage.py +++ b/graphrag/index/storage/blob_pipeline_storage.py @@ -27,7 +27,7 @@ class BlobPipelineStorage(PipelineStorage): _container_name: str _path_prefix: str _encoding: str - _storage_account_name: str | None + _storage_account_blob_url: str | None def __init__( self, @@ -35,7 +35,7 @@ def __init__( container_name: str, encoding: str | None = None, path_prefix: str | None = None, - storage_account_name: str | None = None, + storage_account_blob_url: str | None = None, ): """Create a new BlobStorage instance.""" if connection_string: @@ -44,14 +44,15 @@ def __init__( ) else: self._blob_service_client = BlobServiceClient( - account_url=f"https://{storage_account_name}.blob.core.windows.net", + account_url=storage_account_blob_url, credential=DefaultAzureCredential(), ) self._encoding = encoding or "utf-8" self._container_name = container_name self._connection_string = connection_string self._path_prefix = path_prefix or "" - self._storage_account_name = storage_account_name + self._storage_account_blob_url = storage_account_blob_url + self._storage_account_name = storage_account_blob_url.split("//")[1].split(".")[0] log.info( "creating blob storage at container=%s, path=%s", self._container_name, @@ -268,7 +269,7 @@ def child(self, name: str | None) -> "PipelineStorage": self._container_name, self._encoding, path, - self._storage_account_name, + self._storage_account_blob_url, ) def _keyname(self, key: str) -> str: @@ -283,20 +284,20 @@ def _abfs_url(self, key: str) -> str: def create_blob_storage( connection_string: str | None, - storage_account_name: str | None, + storage_account_blob_url: str | None, container_name: str, base_dir: str | None, ) -> PipelineStorage: """Create a blob based storage.""" log.info("Creating blob storage at %s", container_name) - if container_name is None and storage_account_name is None: - msg = "No container name or storage account name provided for blob storage." + if container_name is None and storage_account_blob_url is None: + msg = "No container name or storage account blob url provided for blob storage." raise ValueError(msg) return BlobPipelineStorage( connection_string, container_name, path_prefix=base_dir, - storage_account_name=storage_account_name, + storage_account_blob_url=storage_account_blob_url, ) diff --git a/graphrag/index/storage/load_storage.py b/graphrag/index/storage/load_storage.py index 0ad8356aa9..33d61ee97f 100644 --- a/graphrag/index/storage/load_storage.py +++ b/graphrag/index/storage/load_storage.py @@ -28,7 +28,7 @@ def load_storage(config: PipelineStorageConfig): config = cast(PipelineBlobStorageConfig, config) return create_blob_storage( config.connection_string, - config.storage_account_name, + config.storage_account_blob_url, config.container_name, config.base_dir, ) From d42eb572b9bd9f822b885b2e523acbf98bcc9ad3 Mon Sep 17 00:00:00 2001 From: dorbaker Date: Tue, 21 May 2024 16:35:38 +0000 Subject: [PATCH 12/22] Updates for configuration of cognitives services endpoint. --- graphrag/config/create_graphrag_config.py | 14 +++++++++++++- .../config/input_models/llm_parameters_input.py | 1 + graphrag/config/models/llm_parameters.py | 3 +++ graphrag/index/llm/load_llm.py | 2 +- graphrag/llm/openai/openai_configuration.py | 2 +- 5 files changed, 19 insertions(+), 3 deletions(-) diff --git a/graphrag/config/create_graphrag_config.py b/graphrag/config/create_graphrag_config.py index 452c2f3562..e415579d74 100644 --- a/graphrag/config/create_graphrag_config.py +++ b/graphrag/config/create_graphrag_config.py @@ -82,10 +82,13 @@ def hydrate_llm_params( llm_type = LLMType(llm_type) if llm_type else base.type api_key = reader.str(Fragment.api_key) or base.api_key api_base = reader.str(Fragment.api_base) or base.api_base + cognitive_services_endpoint = ( + reader.str(Fragment.cognitive_services_endpoint) or + base.cognitive_services_endpoint + ) deployment_name = ( reader.str(Fragment.deployment_name) or base.deployment_name ) - if api_key is None and not _is_azure(llm_type): raise ApiKeyMissingError if _is_azure(llm_type): @@ -111,6 +114,7 @@ def hydrate_llm_params( or base.model_supports_json, request_timeout=reader.float(Fragment.request_timeout) or base.request_timeout, + cognitive_services_endpoint=cognitive_services_endpoint, deployment_name=deployment_name, tokens_per_minute=reader.int("tokens_per_minute", Fragment.tpm) or base.tokens_per_minute, @@ -135,6 +139,10 @@ def hydrate_embeddings_params( api_proxy = reader.str("proxy") or base.proxy api_type = reader.str(Fragment.type) or defs.EMBEDDING_TYPE api_type = LLMType(api_type) if api_type else defs.LLM_TYPE + cognitive_services_endpoint = ( + reader.str(Fragment.cognitive_services_endpoint) or + base.cognitive_services_endpoint + ) deployment_name = reader.str(Fragment.deployment_name) if api_key is None and not _is_azure(api_type): @@ -159,6 +167,7 @@ def hydrate_embeddings_params( model=reader.str(Fragment.model) or defs.EMBEDDING_MODEL, request_timeout=reader.float(Fragment.request_timeout) or defs.LLM_REQUEST_TIMEOUT, + cognitive_services_endpoint=cognitive_services_endpoint, deployment_name=deployment_name, tokens_per_minute=reader.int("tokens_per_minute", Fragment.tpm) or defs.LLM_TOKENS_PER_MINUTE, @@ -209,6 +218,7 @@ def hydrate_parallelization_params( api_base = reader.str(Fragment.api_base) or fallback_oai_base api_version = reader.str(Fragment.api_version) or fallback_oai_version api_proxy = reader.str(Fragment.api_proxy) or fallback_oai_proxy + cognitive_services_endpoint = reader.str(Fragment.cognitive_services_endpoint) deployment_name = reader.str(Fragment.deployment_name) if api_key is None and not _is_azure(llm_type): @@ -235,6 +245,7 @@ def hydrate_parallelization_params( model_supports_json=reader.bool(Fragment.model_supports_json), request_timeout=reader.float(Fragment.request_timeout) or defs.LLM_REQUEST_TIMEOUT, + cognitive_services_endpoint=cognitive_services_endpoint, deployment_name=deployment_name, tokens_per_minute=reader.int(Fragment.tpm) or defs.LLM_TOKENS_PER_MINUTE, @@ -521,6 +532,7 @@ class Fragment(str, Enum): api_organization = "API_ORGANIZATION" api_proxy = "API_PROXY" async_mode = "ASYNC_MODE" + cognitive_services_endpoint = "COGNITIVE_SERVICES_ENDPOINT" concurrent_requests = "CONCURRENT_REQUESTS" conn_string = "CONNECTION_STRING" container_name = "CONTAINER_NAME" diff --git a/graphrag/config/input_models/llm_parameters_input.py b/graphrag/config/input_models/llm_parameters_input.py index 5c8bdcd7de..c89c6c0922 100644 --- a/graphrag/config/input_models/llm_parameters_input.py +++ b/graphrag/config/input_models/llm_parameters_input.py @@ -20,6 +20,7 @@ class LLMParametersInput(TypedDict): api_version: NotRequired[str | None] organization: NotRequired[str | None] proxy: NotRequired[str | None] + cognitive_services_endpoint: NotRequired[str | None] deployment_name: NotRequired[str | None] model_supports_json: NotRequired[bool | str | None] tokens_per_minute: NotRequired[int | str | None] diff --git a/graphrag/config/models/llm_parameters.py b/graphrag/config/models/llm_parameters.py index 4ffe96ca6a..4743e0105b 100644 --- a/graphrag/config/models/llm_parameters.py +++ b/graphrag/config/models/llm_parameters.py @@ -40,6 +40,9 @@ class LLMParameters(BaseModel): proxy: str | None = Field( description="The proxy to use for the LLM service.", default=None ) + cognitive_services_endpoint: str | None = Field( + description="The endpoint to reach cognitives services.", default=None + ) deployment_name: str | None = Field( description="The deployment name to use for the LLM service.", default=None ) diff --git a/graphrag/index/llm/load_llm.py b/graphrag/index/llm/load_llm.py index b94d301fe7..6ee6f08381 100644 --- a/graphrag/index/llm/load_llm.py +++ b/graphrag/index/llm/load_llm.py @@ -189,7 +189,6 @@ def _load_azure_openai_embeddings_llm( def _get_base_config(config: dict[str, Any]) -> dict[str, Any]: api_key = config.get("api_key", None) - return { # Pass in all parameterized values **config, @@ -204,6 +203,7 @@ def _get_base_config(config: dict[str, Any]) -> dict[str, Any]: "model_supports_json": config.get("model_supports_json"), "concurrent_requests": config.get("concurrent_requests", 4), "encoding_model": config.get("encoding_model", "cl100k_base"), + "cognitive_services_endpoint": config.get("cognitive_services_endpoint", None), } diff --git a/graphrag/llm/openai/openai_configuration.py b/graphrag/llm/openai/openai_configuration.py index 796edf6488..1bcd5694d6 100644 --- a/graphrag/llm/openai/openai_configuration.py +++ b/graphrag/llm/openai/openai_configuration.py @@ -26,7 +26,7 @@ class OpenAIConfiguration(Hashable, LLMConfig): _api_base: str | None _api_version: str | None - _cognitive_serivces_endpoint: str | None + _cognitive_services_endpoint: str | None _deployment_name: str | None _organization: str | None _proxy: str | None From 97571df59b89299e90c8b22fab251556fe898bf1 Mon Sep 17 00:00:00 2001 From: Alonso Guevara Date: Thu, 16 May 2024 17:53:38 -0600 Subject: [PATCH 13/22] Add missing env vars for smoke tests (#233) Add missing env vars --- tests/smoke/test_fixtures.py | 2 ++ 1 file changed, 2 insertions(+) diff --git a/tests/smoke/test_fixtures.py b/tests/smoke/test_fixtures.py index 71b72dd8d9..327425a982 100644 --- a/tests/smoke/test_fixtures.py +++ b/tests/smoke/test_fixtures.py @@ -253,6 +253,8 @@ def __run_query(self, root: Path, query_config: dict[str, str]): "LOCAL_BLOB_STORAGE_CONNECTION_STRING": WELL_KNOWN_AZURITE_CONNECTION_STRING, "GRAPHRAG_CHUNK_SIZE": "1200", "GRAPHRAG_CHUNK_OVERLAP": "0", + "AZURE_AI_SEARCH_URL_ENDPOINT": os.getenv("AZURE_AI_SEARCH_URL_ENDPOINT"), + "AZURE_AI_SEARCH_API_KEY": os.getenv("AZURE_AI_SEARCH_API_KEY"), }, clear=True, ) From 637e6caf142b04126fc0c2c5d847ec2cc4f26893 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Mon, 20 May 2024 09:05:22 -0700 Subject: [PATCH 14/22] Bump JamesIves/github-pages-deploy-action from 4.6.0 to 4.6.1 (#234) Bumps [JamesIves/github-pages-deploy-action](https://github.com/jamesives/github-pages-deploy-action) from 4.6.0 to 4.6.1. - [Release notes](https://github.com/jamesives/github-pages-deploy-action/releases) - [Commits](https://github.com/jamesives/github-pages-deploy-action/compare/v4.6.0...v4.6.1) --- updated-dependencies: - dependency-name: JamesIves/github-pages-deploy-action dependency-type: direct:production update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- .github/workflows/gh-pages.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/gh-pages.yml b/.github/workflows/gh-pages.yml index 7c9a76d457..e98121f17d 100644 --- a/.github/workflows/gh-pages.yml +++ b/.github/workflows/gh-pages.yml @@ -88,7 +88,7 @@ jobs: run: find docsite/_site - name: Deploy to GitHub Pages - uses: JamesIves/github-pages-deploy-action@v4.6.0 + uses: JamesIves/github-pages-deploy-action@v4.6.1 with: branch: gh-pages folder: docsite/_site From eec7fdbb25269201b233eb209c346b66bd22508c Mon Sep 17 00:00:00 2001 From: orbaker <107270698+dorbaker@users.noreply.github.com> Date: Mon, 20 May 2024 14:50:39 -0400 Subject: [PATCH 15/22] feature/add-azure-managed-identity (#231) * Updated to work with managed identities. * Updated to work with both api keys and managed identity. * Updated to pass storage_account_name config parameter. * Updated to take optional cognitive services endpoint config parameter * make api_key optional * fix formatting * Bug fixes. * set storage_account_name to None by default * ruff formatting fixes * fix issue with using connection strings * Switched from storage account name to storage account blob url. * code cleanup and cleaner logic * revert formatting changes * Updated so that query works with AAD. * code cleanup * ruff formatting * ruff lint fixes * more ruff lint fixes * spellcheck * add documentation of new storage_account_blob_url variable * add documentation of new storage_account_blob_url variable * add semversioner doc * typecheck updates * minor doc update * Fix env-var names, update docs, fix tests --------- Co-authored-by: Josh Bradley Co-authored-by: Chris Trevino Co-authored-by: Chris Trevino Co-authored-by: Alonso Guevara --- .../minor-20240517184310739150.json | 4 + docsite/posts/config/env_vars.md | 156 ++++++----- docsite/posts/config/json_yaml.md | 4 + graphrag/config/create_graphrag_config.py | 1 + .../config/input_models/cache_config_input.py | 1 + .../config/input_models/input_config_input.py | 1 + .../input_models/reporting_config_input.py | 1 + .../input_models/storage_config_input.py | 1 + graphrag/index/config/cache.py | 1 + graphrag/index/config/storage.py | 1 + graphrag/index/create_pipeline_config.py | 18 ++ graphrag/index/input/load_input.py | 10 +- graphrag/index/llm/load_llm.py | 3 +- .../reporting/blob_workflow_callbacks.py | 13 +- .../index/storage/blob_pipeline_storage.py | 33 ++- graphrag/llm/openai/create_openai_client.py | 41 +-- graphrag/query/factories.py | 6 +- graphrag/query/llm/oai/base.py | 7 +- graphrag/query/llm/oai/chat_openai.py | 19 +- graphrag/query/llm/oai/embedding.py | 5 +- graphrag/vector_stores/azure_ai_search.py | 27 +- poetry.lock | 257 +++++++++--------- tests/unit/config/test_default_config.py | 22 ++ 23 files changed, 359 insertions(+), 273 deletions(-) create mode 100644 .semversioner/next-release/minor-20240517184310739150.json diff --git a/.semversioner/next-release/minor-20240517184310739150.json b/.semversioner/next-release/minor-20240517184310739150.json new file mode 100644 index 0000000000..35ea5ec103 --- /dev/null +++ b/.semversioner/next-release/minor-20240517184310739150.json @@ -0,0 +1,4 @@ +{ + "type": "minor", + "description": "add Azure managed identity support" +} diff --git a/docsite/posts/config/env_vars.md b/docsite/posts/config/env_vars.md index 06ac3d162d..70e888f05a 100644 --- a/docsite/posts/config/env_vars.md +++ b/docsite/posts/config/env_vars.md @@ -30,13 +30,13 @@ Our pipeline can ingest .csv or .txt data from an input folder. These files can These are the primary settings for configuring LLM connectivity. -| Parameter | Required? | Description | Type | Default Value | -| --------------------------- | ------------ | -------------------------------------------------------------------------------------- | ------- | ------------- | -| `GRAPHRAG_API_KEY` | **Yes** | The API key. (Note: `OPENAI_API_KEY is also used as a fallback) | `str` | `None` | -| `GRAPHRAG_API_BASE` | **For AOAI** | The API Base URL | `str` | `None` | -| `GRAPHRAG_API_VERSION` | **For AOAI** | The AOAI API version. | `str` | `None` | -| `GRAPHRAG_API_ORGANIZATION` | | The AOAI organization. | `str` | `None` | -| `GRAPHRAG_API_PROXY` | | The AOAI proxy. | `str` | `None` | +| Parameter | Required? | Description | Type | Default Value | +| --------------------------- | ------------------------------------- | ------------------------------------------------------------------------------------------------------------------------------- | ------- | ------------- | +| `GRAPHRAG_API_KEY` | **Yes for OpenAI. Optional for AOAI** | The API key. (Note: `OPENAI_API_KEY is also used as a fallback). If not defined when using AOAI, managed identity will be used. | `str` | `None` | +| `GRAPHRAG_API_BASE` | **For AOAI** | The API Base URL | `str` | `None` | +| `GRAPHRAG_API_VERSION` | **For AOAI** | The AOAI API version. | `str` | `None` | +| `GRAPHRAG_API_ORGANIZATION` | | The AOAI organization. | `str` | `None` | +| `GRAPHRAG_API_PROXY` | | The AOAI proxy. | `str` | `None` | @@ -48,7 +48,7 @@ These settings control the text generation model used by the pipeline. Any setti | ---------------------------------- | ------------------------ | -------------------------------------------------------------------------------------- | ------- | ------------- | | `GRAPHRAG_LLM_TYPE` | **For AOAI** | The LLM operation type. Either `openai_chat` or `azure_openai_chat` | `str` | `openai_chat` | | `GRAPHRAG_LLM_DEPLOYMENT_NAME` | **For AOAI** | The AOAI model deployment name. | `str` | `None` | -| `GRAPHRAG_LLM_API_KEY` | Yes (uses fallback) | The API key. | `str` | `None` | +| `GRAPHRAG_LLM_API_KEY` | Yes (uses fallback) | The API key. If not defined when using AOAI, managed identity will be used. | `str` | `None` | | `GRAPHRAG_LLM_API_BASE` | For AOAI (uses fallback) | The API Base URL | `str` | `None` | | `GRAPHRAG_LLM_API_VERSION` | For AOAI (uses fallback) | The AOAI API version. | `str` | `None` | | `GRAPHRAG_LLM_API_ORGANIZATION` | For AOAI (uses fallback) | The AOAI organization. | `str` | `None` | @@ -71,31 +71,33 @@ These settings control the text generation model used by the pipeline. Any setti These settings control the text embedding model used by the pipeline. Any settings with a fallback will use the base LLM settings, if available. -| Parameter | Required ? | Description | Type | Default | -| ----------------------------------------- | ------------------------ | --------------------------------------------------------------------------------------------| ------- | -------------------- | -| `GRAPHRAG_EMBEDDING_TYPE` | **For AOAI** | The embedding client to use. Either `openai_embedding` or `azure_openai_embedding` | `str` | `openai_embedding` | -| `GRAPHRAG_EMBEDDING_DEPLOYMENT_NAME` | **For AOAI** | The AOAI deployment name. | `str` | `None` | -| `GRAPHRAG_EMBEDDING_API_KEY` | Yes (uses fallback) | The API key to use for the embedding client. | `str` | `None` | -| `GRAPHRAG_EMBEDDING_API_BASE` | For AOAI (uses fallback) | The API base URL. | `str` | `None` | -| `GRAPHRAG_EMBEDDING_API_VERSION` | For AOAI (uses fallback) | The AOAI API version to use for the embedding client. | `str` | `None` | -| `GRAPHRAG_EMBEDDING_API_ORGANIZATION` | For AOAI (uses fallback) | The AOAI organization to use for the embedding client. | `str` | `None` | -| `GRAPHRAG_EMBEDDING_API_PROXY` | | The AOAI proxy to use for the embedding client. | `str` | `None` | -| `GRAPHRAG_EMBEDDING_MODEL` | | The model to use for the embedding client. | `str` | `text-embedding-3-small` | +| Parameter | Required ? | Description | Type | Default | +| ----------------------------------------- | ------------------------ | ----------------------------------------------------------------------------------------------------------- | ------- | -------------------- | +| `GRAPHRAG_EMBEDDING_TYPE` | **For AOAI** | The embedding client to use. Either `openai_embedding` or `azure_openai_embedding` | `str` | `openai_embedding` | +| `GRAPHRAG_EMBEDDING_DEPLOYMENT_NAME` | **For AOAI** | The AOAI deployment name. | `str` | `None` | +| `GRAPHRAG_EMBEDDING_API_KEY` | Yes (uses fallback) | The API key to use for the embedding client. If not defined when using AOAI, managed identity will be used. | `str` | `None` | +| `GRAPHRAG_EMBEDDING_API_BASE` | For AOAI (uses fallback) | The API base URL. | `str` | `None` | +| `GRAPHRAG_EMBEDDING_API_VERSION` | For AOAI (uses fallback) | The AOAI API version to use for the embedding client. | `str` | `None` | +| `GRAPHRAG_EMBEDDING_API_ORGANIZATION` | For AOAI (uses fallback) | The AOAI organization to use for the embedding client. | `str` | `None` | +| `GRAPHRAG_EMBEDDING_API_PROXY` | | The AOAI proxy to use for the embedding client. | `str` | `None` | +| `GRAPHRAG_EMBEDDING_MODEL` | | The model to use for the embedding client. | `str` | `text-embedding-3-small` | | `GRAPHRAG_EMBEDDING_BATCH_SIZE` | | The number of texts to embed at once. [(Azure limit is 16)]( https://learn.microsoft.com/en-us/azure/ai-ce) | `int` | 16 | | `GRAPHRAG_EMBEDDING_BATCH_MAX_TOKENS` | | The maximum tokens per batch [(Azure limit is 8191)]( https://learn.microsoft.com/en-us/azure/ai-services/openai/reference) | `int` | 8191 | -| `GRAPHRAG_EMBEDDING_TARGET` | | The target fields to embed. Either `required` or `all`. | `str` | `required` | -| `GRAPHRAG_EMBEDDING_SKIP` | | A comma-separated list of fields to skip embeddings for . (e.g. 'relationship.description') | `str` | `None` | -| `GRAPHRAG_EMBEDDING_THREAD_COUNT` | | The number of threads to use for parallelization for embeddings. | `int` | | -| `GRAPHRAG_EMBEDDING_THREAD_STAGGER` | | The time to wait (in seconds) between starting each thread for embeddings. | `float` | 50 | -| `GRAPHRAG_EMBEDDING_CONCURRENT_REQUESTS` | | The number of concurrent requests to allow for the embedding client. | `int` | 25 | -| `GRAPHRAG_EMBEDDING_TPM` | | The number of tokens per minute to allow for the embedding client. 0 = Bypass | `int` | 0 | -| `GRAPHRAG_EMBEDDING_RPM` | | The number of requests per minute to allow for the embedding client. 0 = Bypass | `int` | 0 | -| `GRAPHRAG_EMBEDDING_MAX_RETRIES` | | The maximum number of retries to attempt when a request fails. | `int` | 10 | -| `GRAPHRAG_EMBEDDING_MAX_RETRY_WAIT` | | The maximum number of seconds to wait between retries. | `int` | 10 | -| `GRAPHRAG_EMBEDDING_TARGET` | | The target fields to embed. Either `required` or `all`. | `str` | `required` | -| `GRAPHRAG_EMBEDDING_SLEEP_ON_RATE_LIMIT_RECOMMENDATION` | | Whether to sleep on rate limit recommendation. (Azure Only) | `bool` | `True` | - - +| `GRAPHRAG_EMBEDDING_TARGET` | | The target fields to embed. Either `required` or `all`. | `str` | `required` | +| `GRAPHRAG_EMBEDDING_SKIP` | | A comma-separated list of fields to skip embeddings for . (e.g. 'relationship.description') | `str` | `None` | +| `GRAPHRAG_EMBEDDING_THREAD_COUNT` | | The number of threads to use for parallelization for embeddings. | `int` | | +| `GRAPHRAG_EMBEDDING_THREAD_STAGGER` | | The time to wait (in seconds) between starting each thread for embeddings. | `float` | 50 | +| `GRAPHRAG_EMBEDDING_CONCURRENT_REQUESTS` | | The number of concurrent requests to allow for the embedding client. | `int` | 25 | +| `GRAPHRAG_EMBEDDING_TPM` | | The number of tokens per minute to allow for the embedding client. 0 = Bypass | `int` | 0 | +| `GRAPHRAG_EMBEDDING_RPM` | | The number of requests per minute to allow for the embedding client. 0 = Bypass | `int` | 0 | +| `GRAPHRAG_EMBEDDING_MAX_RETRIES` | | The maximum number of retries to attempt when a request fails. | `int` | 10 | +| `GRAPHRAG_EMBEDDING_MAX_RETRY_WAIT` | | The maximum number of seconds to wait between retries. | `int` | 10 | +| `GRAPHRAG_EMBEDDING_TARGET` | | The target fields to embed. Either `required` or `all`. | `str` | `required` | +| `GRAPHRAG_EMBEDDING_SLEEP_ON_RATE_LIMIT_RECOMMENDATION` | | Whether to sleep on rate limit recommendation. (Azure Only) | `bool` | `True` | + + +## Input Settings +These settings control the data input used by the pipeline. Any settings with a fallback will use the base LLM settings, if available. ### Plaintext Input Data (`GRAPHRAG_INPUT_TYPE`=text) @@ -106,19 +108,20 @@ These settings control the text embedding model used by the pipeline. Any settin ### CSV Input Data (`GRAPHRAG_INPUT_TYPE`=csv) -| Parameter | Description | Type | Required or Optional | Default | -| ---------------------------------- | --------------------------------------------------------------------------------- | ----- | -------------------- | --------- | -| `GRAPHRAG_INPUT_FILE_PATTERN` | The file pattern regexp to use when reading input files from the input directory. | `str` | optional | `.*\.csv$` | -| `GRAPHRAG_INPUT_SOURCE_COLUMN` | The 'source' column to use when reading CSV input files. | `str` | optional | `source` | -| `GRAPHRAG_INPUT_TIMESTAMP_COLUMN` | The 'timestamp' column to use when reading CSV input files. | `str` | optional | `None` | -| `GRAPHRAG_INPUT_TIMESTAMP_FORMAT` | The timestamp format to use when parsing timestamps in the timestamp column | `str` | optional | `None` | -| `GRAPHRAG_INPUT_TEXT_COLUMN` | The 'text' column to use when reading CSV input files. | `str` | optional | `text` | -| `GRAPHRAG_INPUT_DOCUMENT_ATTRIBUTE_COLUMNS` | A list of CSV columns, comma-separated, to incorporate as document fields. | `str` | optional | `id` | -| `GRAPHRAG_INPUT_TITLE_COLUMN` | The 'title' column to use when reading CSV input files. | `str` | optional | `title` | -| `GRAPHRAG_INPUT_STORAGE_TYPE` | The storage type to use when reading CSV input files. (`file` or `blob`) | `str` | optional | `file` | -| `GRAPHRAG_INPUT_CONNECTION_STRING` | The connection string to use when reading CSV input files from Azure Blob Storage. | `str` | optional | `None` | -| `GRAPHRAG_INPUT_CONTAINER_NAME` | The container name to use when reading CSV input files from Azure Blob Storage. | `str` | optional | `None` | -| `GRAPHRAG_INPUT_BASE_DIR` | The base directory to read input files from. | `str` | optional | `None` | +| Parameter | Description | Type | Required or Optional | Default | +| ------------------------------------------- | -------------------------------------------------------------------------------------------------------------------------------------------------------------------- | ----- | -------------------- | ---------- | +| `GRAPHRAG_INPUT_FILE_PATTERN` | The file pattern regexp to use when reading input files from the input directory. | `str` | optional | `.*\.csv$` | +| `GRAPHRAG_INPUT_SOURCE_COLUMN` | The 'source' column to use when reading CSV input files. | `str` | optional | `source` | +| `GRAPHRAG_INPUT_TIMESTAMP_COLUMN` | The 'timestamp' column to use when reading CSV input files. | `str` | optional | `None` | +| `GRAPHRAG_INPUT_TIMESTAMP_FORMAT` | The timestamp format to use when parsing timestamps in the timestamp column. | `str` | optional | `None` | +| `GRAPHRAG_INPUT_TEXT_COLUMN` | The 'text' column to use when reading CSV input files. | `str` | optional | `text` | +| `GRAPHRAG_INPUT_DOCUMENT_ATTRIBUTE_COLUMNS` | A list of CSV columns, comma-separated, to incorporate as document fields. | `str` | optional | `id` | +| `GRAPHRAG_INPUT_TITLE_COLUMN` | The 'title' column to use when reading CSV input files. | `str` | optional | `title` | +| `GRAPHRAG_INPUT_STORAGE_TYPE` | The storage type to use when reading CSV input files. (`file` or `blob`) | `str` | optional | `file` | +| `GRAPHRAG_INPUT_STORAGE_ACCOUNT_BLOB_URL` | The Azure Storage blob endpoint to use when in `blob` mode and using managed identity. Will have the format `https://.blob.core.windows.net` | `str` | optional | `None` | +| `GRAPHRAG_INPUT_CONNECTION_STRING` | The connection string to use when reading CSV input files from Azure Blob Storage. | `str` | optional | `None` | +| `GRAPHRAG_INPUT_CONTAINER_NAME` | The container name to use when reading CSV input files from Azure Blob Storage. | `str` | optional | `None` | +| `GRAPHRAG_INPUT_BASE_DIR` | The base directory to read input files from. | `str` | optional | `None` | ## Data Mapping Settings @@ -137,53 +140,56 @@ These settings control the text embedding model used by the pipeline. Any settin ## Prompting Overrides -| Parameter | Description | Type | Required or Optional | Default | -| -------------------------------------------------- | ------------------------------------------------------------------------------------------------ | -------- | -------------------- | ---------------------------------------------------------------- | -| `GRAPHRAG_ENTITY_EXTRACTION_PROMPT_FILE` | The path (relative to the root) of an entity extraction prompt template text file. | `str` | optional | `None` | -| `GRAPHRAG_ENTITY_EXTRACTION_MAX_GLEANINGS` | The maximum number of redrives (gleanings) to invoke when extracting entities in a loop. | `int` | optional | 0 | -| `GRAPHRAG_ENTITY_EXTRACTION_ENTITY_TYPES` | A comma-separated list of entity types to extract. | `str` | optional | `organization,person,event,geo` | -| `GRAPHRAG_SUMMARIZE_DESCRIPTIONS_PROMPT_FILE` | The path (relative to the root) of an description summarization prompt template text file. | `str` | optional | `None` | -| `GRAPHRAG_SUMMARIZE_DESCRIPTIONS_MAX_LENGTH` | The maximum number of tokens to generate per description summarization. | `int` | optional | 500 | -| `GRAPHRAG_CLAIM_EXTRACTION_ENABLED` | Whether claim extraction is enabled for this pipeline. | `bool` | optional | `False` -| `GRAPHRAG_CLAIM_EXTRACTION_DESCRIPTION` | The claim_description prompting argument to utilize. | `string` | optional | "Any claims or facts that could be relevant to threat analysis." | -| `GRAPHRAG_CLAIM_EXTRACTION_PROMPT_FILE` | The claim extraction prompt to utilize. | `string` | optional | `None` | -| `GRAPHRAG_CLAIM_EXTRACTION_MAX_GLEANINGS` | The maximum number of redrives (gleanings) to invoke when extracting claims in a loop. | `int` | optional | 0 | -| `GRAPHRAG_COMMUNITY_REPORT_PROMPT_FILE` | The community report extraction prompt to utilize. | `string` | optional | `None` | -| `GRAPHRAG_COMMUNITY_REPORT_MAX_LENGTH` | The maximum number of tokens to generate per community report. | `int` | optional | 1500 | +| Parameter | Description | Type | Required or Optional | Default | +| -------------------------------------------------- | ------------------------------------------------------------------------------------------ | -------- | -------------------- | ---------------------------------------------------------------- | +| `GRAPHRAG_ENTITY_EXTRACTION_PROMPT_FILE` | The path (relative to the root) of an entity extraction prompt template text file. | `str` | optional | `None` | +| `GRAPHRAG_ENTITY_EXTRACTION_MAX_GLEANINGS` | The maximum number of redrives (gleanings) to invoke when extracting entities in a loop. | `int` | optional | 0 | +| `GRAPHRAG_ENTITY_EXTRACTION_ENTITY_TYPES` | A comma-separated list of entity types to extract. | `str` | optional | `organization,person,event,geo` | +| `GRAPHRAG_SUMMARIZE_DESCRIPTIONS_PROMPT_FILE` | The path (relative to the root) of an description summarization prompt template text file. | `str` | optional | `None` | +| `GRAPHRAG_SUMMARIZE_DESCRIPTIONS_MAX_LENGTH` | The maximum number of tokens to generate per description summarization. | `int` | optional | 500 | +| `GRAPHRAG_CLAIM_EXTRACTION_ENABLED` | Whether claim extraction is enabled for this pipeline. | `bool` | optional | `False` | +| `GRAPHRAG_CLAIM_EXTRACTION_DESCRIPTION` | The claim_description prompting argument to utilize. | `string` | optional | "Any claims or facts that could be relevant to threat analysis." | +| `GRAPHRAG_CLAIM_EXTRACTION_PROMPT_FILE` | The claim extraction prompt to utilize. | `string` | optional | `None` | +| `GRAPHRAG_CLAIM_EXTRACTION_MAX_GLEANINGS` | The maximum number of redrives (gleanings) to invoke when extracting claims in a loop. | `int` | optional | 0 | +| `GRAPHRAG_COMMUNITY_REPORT_PROMPT_FILE` | The community report extraction prompt to utilize. | `string` | optional | `None` | +| `GRAPHRAG_COMMUNITY_REPORT_MAX_LENGTH` | The maximum number of tokens to generate per community report. | `int` | optional | 1500 | ## Storage This section controls the storage mechanism used by the pipeline used for emitting output tables. -| Parameter | Description | Type | Required or Optional | Default | -| ------------------------------------ | --------------------------------------------------------------------- | ----- | -------------------- | ------- | -| `GRAPHRAG_STORAGE_TYPE` | The type of reporter to use. Options are `file`, `memory`, or `blob` | `str` | optional | `file` | -| `GRAPHRAG_STORAGE_CONNECTION_STRING` | The Azure Storage connection string to use when in `blob` mode. | `str` | optional | None | -| `GRAPHRAG_STORAGE_CONTAINER_NAME` | The Azure Storage container name to use when in `blob` mode. | `str` | optional | None | -| `GRAPHRAG_STORAGE_BASE_DIR` | The base path to data outputs outputs. | `str` | optional | None | +| Parameter | Description | Type | Required or Optional | Default | +| ------------------------------------ | -------------------------------------------------------------------------------------------------------------------------------------------------------------------- | ----- | -------------------- | ------- | +| `GRAPHRAG_STORAGE_TYPE` | The type of reporter to use. Options are `file`, `memory`, or `blob` | `str` | optional | `file` | +| `GRAPHRAG_STORAGE_STORAGE_ACCOUNT_BLOB_URL` | The Azure Storage blob endpoint to use when in `blob` mode and using managed identity. Will have the format `https://.blob.core.windows.net` | `str` | optional | None | +| `GRAPHRAG_STORAGE_CONNECTION_STRING` | The Azure Storage connection string to use when in `blob` mode. | `str` | optional | None | +| `GRAPHRAG_STORAGE_CONTAINER_NAME` | The Azure Storage container name to use when in `blob` mode. | `str` | optional | None | +| `GRAPHRAG_STORAGE_BASE_DIR` | The base path to data outputs outputs. | `str` | optional | None | ## Cache This section controls the cache mechanism used by the pipeline. This is used to cache LLM invocation results. -| Parameter | Description | Type | Required or Optional | Default | -| -------------------------------------- | --------------------------------------------------------------------- | ----- | -------------------- | ------- | -| `GRAPHRAG_CACHE_TYPE` | The type of cache to use. Options are `file`, `memory`, `none` or `blob` | `str` | optional | `file` | -| `GRAPHRAG_CACHE_CONNECTION_STRING` | The Azure Storage connection string to use when in `blob` mode. | `str` | optional | None | -| `GRAPHRAG_CACHE_CONTAINER_NAME` | The Azure Storage container name to use when in `blob` mode. | `str` | optional | None | -| `GRAPHRAG_CACHE_BASE_DIR` | The base path to the reporting outputs. | `str` | optional | None | +| Parameter | Description | Type | Required or Optional | Default | +| ---------------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------ | ----- | -------------------- | ------- | +| `GRAPHRAG_CACHE_TYPE` | The type of cache to use. Options are `file`, `memory`, `none` or `blob` | `str` | optional | `file` | +| `GRAPHRAG_CACHE_STORAGE_ACCOUNT_BLOB_URL` | The Azure Storage blob endpoint to use when in `blob` mode and using managed identity. Will have the format `https://.blob.core.windows.net` | `str` | optional | None | +| `GRAPHRAG_CACHE_CONNECTION_STRING` | The Azure Storage connection string to use when in `blob` mode. | `str` | optional | None | +| `GRAPHRAG_CACHE_CONTAINER_NAME` | The Azure Storage container name to use when in `blob` mode. | `str` | optional | None | +| `GRAPHRAG_CACHE_BASE_DIR` | The base path to the reporting outputs. | `str` | optional | None | ## Reporting This section controls the reporting mechanism used by the pipeline, for common events and error messages. The default is to write reports to a file in the output directory. However, you can also choose to write reports to the console or to an Azure Blob Storage container. -| Parameter | Description | Type | Required or Optional | Default | -| -------------------------------------- | --------------------------------------------------------------------- | ----- | -------------------- | ------- | -| `GRAPHRAG_REPORTING_TYPE` | The type of reporter to use. Options are `file`, `console`, or `blob` | `str` | optional | `file` | -| `GRAPHRAG_REPORTING_CONNECTION_STRING` | The Azure Storage connection string to use when in `blob` mode. | `str` | optional | None | -| `GRAPHRAG_REPORTING_CONTAINER_NAME` | The Azure Storage container name to use when in `blob` mode. | `str` | optional | None | -| `GRAPHRAG_REPORTING_BASE_DIR` | The base path to the reporting outputs. | `str` | optional | None | +| Parameter | Description | Type | Required or Optional | Default | +| -------------------------------------- | -------------------------------------------------------------------------------------------------------------------------------------------------------------------- | ----- | -------------------- | ------- | +| `GRAPHRAG_REPORTING_TYPE` | The type of reporter to use. Options are `file`, `console`, or `blob` | `str` | optional | `file` | +| `GRAPHRAG_REPORTING_STORAGE_ACCOUNT_BLOB_URL` | The Azure Storage blob endpoint to use when in `blob` mode and using managed identity. Will have the format `https://.blob.core.windows.net` | `str` | optional | None | +| `GRAPHRAG_REPORTING_CONNECTION_STRING` | The Azure Storage connection string to use when in `blob` mode. | `str` | optional | None | +| `GRAPHRAG_REPORTING_CONTAINER_NAME` | The Azure Storage container name to use when in `blob` mode. | `str` | optional | None | +| `GRAPHRAG_REPORTING_BASE_DIR` | The base path to the reporting outputs. | `str` | optional | None | ## Node2Vec Parameters diff --git a/docsite/posts/config/json_yaml.md b/docsite/posts/config/json_yaml.md index b16e910683..9d2b862f00 100644 --- a/docsite/posts/config/json_yaml.md +++ b/docsite/posts/config/json_yaml.md @@ -40,6 +40,7 @@ API_KEY=some_api_key * `connection_string` **str** - (blob only) The Azure Storage connection string. * `container_name` **str** - (blob only) The Azure Storage container name. * `base_dir` **str** - The base directory to read input from, relative to the root. +* `storage_account_blob_url` **str** - The storage account blob URL to use. ## llm @@ -98,6 +99,7 @@ This is the base LLM configuration section. Other steps may override this config * `connection_string` **str** - (blob only) The Azure Storage connection string. * `container_name` **str** - (blob only) The Azure Storage container name. * `base_dir` **str** - The base directory to write cache to, relative to the root. +* `storage_account_blob_url` **str** - The storage account blob URL to use. ## storage ### Fields @@ -105,6 +107,7 @@ This is the base LLM configuration section. Other steps may override this config * `connection_string` **str** - (blob only) The Azure Storage connection string. * `container_name` **str** - (blob only) The Azure Storage container name. * `base_dir` **str** - The base directory to write reports to, relative to the root. +* `storage_account_blob_url` **str** - The storage account blob URL to use. ## reporting ### Fields @@ -112,6 +115,7 @@ This is the base LLM configuration section. Other steps may override this config * `connection_string` **str** - (blob only) The Azure Storage connection string. * `container_name` **str** - (blob only) The Azure Storage container name. * `base_dir` **str** - The base directory to write reports to, relative to the root. +* `storage_account_blob_url` **str** - The storage account blob URL to use. ## entity_extraction ### Fields diff --git a/graphrag/config/create_graphrag_config.py b/graphrag/config/create_graphrag_config.py index e415579d74..0dc99afea7 100644 --- a/graphrag/config/create_graphrag_config.py +++ b/graphrag/config/create_graphrag_config.py @@ -89,6 +89,7 @@ def hydrate_llm_params( deployment_name = ( reader.str(Fragment.deployment_name) or base.deployment_name ) + if api_key is None and not _is_azure(llm_type): raise ApiKeyMissingError if _is_azure(llm_type): diff --git a/graphrag/config/input_models/cache_config_input.py b/graphrag/config/input_models/cache_config_input.py index 1f691c0296..fe88d35b44 100644 --- a/graphrag/config/input_models/cache_config_input.py +++ b/graphrag/config/input_models/cache_config_input.py @@ -15,3 +15,4 @@ class CacheConfigInput(TypedDict): base_dir: NotRequired[str | None] connection_string: NotRequired[str | None] container_name: NotRequired[str | None] + storage_account_blob_url: NotRequired[str | None] diff --git a/graphrag/config/input_models/input_config_input.py b/graphrag/config/input_models/input_config_input.py index 297b00a164..ec97206ce2 100644 --- a/graphrag/config/input_models/input_config_input.py +++ b/graphrag/config/input_models/input_config_input.py @@ -24,3 +24,4 @@ class InputConfigInput(TypedDict): text_column: NotRequired[str | None] title_column: NotRequired[str | None] document_attribute_columns: NotRequired[list[str] | str | None] + storage_account_blob_url: NotRequired[str | None] diff --git a/graphrag/config/input_models/reporting_config_input.py b/graphrag/config/input_models/reporting_config_input.py index e2e41d363a..a224f0b440 100644 --- a/graphrag/config/input_models/reporting_config_input.py +++ b/graphrag/config/input_models/reporting_config_input.py @@ -15,3 +15,4 @@ class ReportingConfigInput(TypedDict): base_dir: NotRequired[str | None] connection_string: NotRequired[str | None] container_name: NotRequired[str | None] + storage_account_blob_url: NotRequired[str | None] diff --git a/graphrag/config/input_models/storage_config_input.py b/graphrag/config/input_models/storage_config_input.py index 55a0979f60..cc5caf7952 100644 --- a/graphrag/config/input_models/storage_config_input.py +++ b/graphrag/config/input_models/storage_config_input.py @@ -15,3 +15,4 @@ class StorageConfigInput(TypedDict): base_dir: NotRequired[str | None] connection_string: NotRequired[str | None] container_name: NotRequired[str | None] + storage_account_blob_url: NotRequired[str | None] diff --git a/graphrag/index/config/cache.py b/graphrag/index/config/cache.py index dfafaa91e1..be1053de2e 100644 --- a/graphrag/index/config/cache.py +++ b/graphrag/index/config/cache.py @@ -26,6 +26,7 @@ class PipelineFileCacheConfig(PipelineCacheConfig[Literal[CacheType.file]]): type: Literal[CacheType.file] = CacheType.file """The type of cache.""" + base_dir: str | None = pydantic_Field( description="The base directory for the cache.", default=None ) diff --git a/graphrag/index/config/storage.py b/graphrag/index/config/storage.py index 94f36c85d6..023d50e249 100644 --- a/graphrag/index/config/storage.py +++ b/graphrag/index/config/storage.py @@ -50,6 +50,7 @@ class PipelineBlobStorageConfig(PipelineStorageConfig[Literal[StorageType.blob]] description="The blob storage connection string for the storage.", default=None ) """The blob storage connection string for the storage.""" + container_name: str = pydantic_Field( description="The container name for storage", default=None ) diff --git a/graphrag/index/create_pipeline_config.py b/graphrag/index/create_pipeline_config.py index d413c3470e..5ea2ca6285 100644 --- a/graphrag/index/create_pipeline_config.py +++ b/graphrag/index/create_pipeline_config.py @@ -458,6 +458,12 @@ def _get_reporting_config( container_name = settings.reporting.container_name if container_name is None: msg = "Container name must be provided for blob reporting." +<<<<<<< HEAD +======= + raise ValueError(msg) + if connection_string is None and storage_account_blob_url is None: + msg = "Connection string or storage account blob url must be provided for blob reporting." +>>>>>>> 7aecfc5 (feature/add-azure-managed-identity (#231)) raise ValueError(msg) return PipelineBlobReportingConfig( connection_string=connection_string, @@ -493,6 +499,12 @@ def _get_storage_config( container_name = settings.storage.container_name if container_name is None: msg = "Container name must be provided for blob storage." +<<<<<<< HEAD +======= + raise ValueError(msg) + if connection_string is None and storage_account_blob_url is None: + msg = "Connection string or storage account blob url must be provided for blob storage." +>>>>>>> 7aecfc5 (feature/add-azure-managed-identity (#231)) raise ValueError(msg) return PipelineBlobStorageConfig( connection_string=connection_string, @@ -527,6 +539,12 @@ def _get_cache_config( container_name = settings.cache.container_name if container_name is None: msg = "Container name must be provided for blob cache." +<<<<<<< HEAD +======= + raise ValueError(msg) + if connection_string is None and storage_account_blob_url is None: + msg = "Connection string or storage account blob url must be provided for blob cache." +>>>>>>> 7aecfc5 (feature/add-azure-managed-identity (#231)) raise ValueError(msg) return PipelineBlobCacheConfig( connection_string=connection_string, diff --git a/graphrag/index/input/load_input.py b/graphrag/index/input/load_input.py index 9b800bce3a..fecd46243f 100644 --- a/graphrag/index/input/load_input.py +++ b/graphrag/index/input/load_input.py @@ -47,10 +47,14 @@ async def load_input( match config.storage_type: case StorageType.blob: log.info("using blob storage input") + if config.container_name is None: + msg = "Container name required for blob storage" + raise ValueError(msg) if ( - config.connection_string is None and config.storage_account_blob_url is None - ) or config.container_name is None: - msg = "(Connection string or storage account blob url) and container name required for blob storage" + config.connection_string is None + and config.storage_account_blob_url is None + ): + msg = "Connection string or storage account blob url required for blob storage" raise ValueError(msg) storage = BlobPipelineStorage( connection_string=config.connection_string, diff --git a/graphrag/index/llm/load_llm.py b/graphrag/index/llm/load_llm.py index 6ee6f08381..7a2420367b 100644 --- a/graphrag/index/llm/load_llm.py +++ b/graphrag/index/llm/load_llm.py @@ -188,7 +188,8 @@ def _load_azure_openai_embeddings_llm( def _get_base_config(config: dict[str, Any]) -> dict[str, Any]: - api_key = config.get("api_key", None) + api_key = config.get("api_key") + return { # Pass in all parameterized values **config, diff --git a/graphrag/index/reporting/blob_workflow_callbacks.py b/graphrag/index/reporting/blob_workflow_callbacks.py index 3d39bd2970..5c272ca293 100644 --- a/graphrag/index/reporting/blob_workflow_callbacks.py +++ b/graphrag/index/reporting/blob_workflow_callbacks.py @@ -29,17 +29,22 @@ def __init__( storage_account_blob_url: str | None = None, ): # type: ignore """Create a new instance of the BlobStorageReporter class.""" - if connection_string is None and storage_account_blob_url is None: - msg = "No connection string or storage account blob url provided for blob storage." - raise ValueError(msg) if container_name is None: msg = "No container name provided for blob storage." raise ValueError(msg) + if connection_string is None and storage_account_blob_url is None: + msg = "No storage account blob url provided for blob storage." + raise ValueError(msg) self._connection_string = connection_string self._storage_account_blob_url = storage_account_blob_url if self._connection_string: - self._blob_service_client = BlobServiceClient.from_connection_string(self._connection_string) + self._blob_service_client = BlobServiceClient.from_connection_string( + self._connection_string + ) else: + if storage_account_blob_url is None: + msg = "Either connection_string or storage_account_blob_url must be provided." + raise ValueError(msg) self._blob_service_client = BlobServiceClient( storage_account_blob_url, credential=DefaultAzureCredential(), diff --git a/graphrag/index/storage/blob_pipeline_storage.py b/graphrag/index/storage/blob_pipeline_storage.py index 178fd77a48..7e60df9697 100644 --- a/graphrag/index/storage/blob_pipeline_storage.py +++ b/graphrag/index/storage/blob_pipeline_storage.py @@ -43,6 +43,10 @@ def __init__( connection_string ) else: + if storage_account_blob_url is None: + msg = "Either connection_string or storage_account_blob_url must be provided." + raise ValueError(msg) + self._blob_service_client = BlobServiceClient( account_url=storage_account_blob_url, credential=DefaultAzureCredential(), @@ -52,7 +56,11 @@ def __init__( self._connection_string = connection_string self._path_prefix = path_prefix or "" self._storage_account_blob_url = storage_account_blob_url - self._storage_account_name = storage_account_blob_url.split("//")[1].split(".")[0] + self._storage_account_name = ( + storage_account_blob_url.split("//")[1].split(".")[0] + if storage_account_blob_url + else None + ) log.info( "creating blob storage at container=%s, path=%s", self._container_name, @@ -198,12 +206,11 @@ async def set(self, key: str, value: Any, encoding: str | None = None) -> None: def set_df_json(self, key: str, dataframe: Any) -> None: """Set a json dataframe.""" - if self._connection_string is None: - storage_account_name = self._storage_account_name + if self._connection_string is None and self._storage_account_name: dataframe.to_json( self._abfs_url(key), storage_options={ - "account_name": storage_account_name, + "account_name": self._storage_account_name, "credential": DefaultAzureCredential(), }, orient="records", @@ -211,10 +218,9 @@ def set_df_json(self, key: str, dataframe: Any) -> None: force_ascii=False, ) else: - connection_string = self._connection_string dataframe.to_json( self._abfs_url(key), - storage_options={"connection_string": connection_string}, + storage_options={"connection_string": self._connection_string}, orient="records", lines=True, force_ascii=False, @@ -222,20 +228,18 @@ def set_df_json(self, key: str, dataframe: Any) -> None: def set_df_parquet(self, key: str, dataframe: Any) -> None: """Set a parquet dataframe.""" - if self._connection_string is None: - storage_account_name = self._storage_account_name + if self._connection_string is None and self._storage_account_name: dataframe.to_parquet( self._abfs_url(key), storage_options={ - "account_name": storage_account_name, + "account_name": self._storage_account_name, "credential": DefaultAzureCredential(), }, ) else: - connection_string = self._connection_string dataframe.to_parquet( self._abfs_url(key), - storage_options={"connection_string": connection_string}, + storage_options={"connection_string": self._connection_string}, ) async def has(self, key: str) -> bool: @@ -290,8 +294,11 @@ def create_blob_storage( ) -> PipelineStorage: """Create a blob based storage.""" log.info("Creating blob storage at %s", container_name) - if container_name is None and storage_account_blob_url is None: - msg = "No container name or storage account blob url provided for blob storage." + if container_name is None: + msg = "No container name provided for blob storage." + raise ValueError(msg) + if connection_string is None and storage_account_blob_url is None: + msg = "No storage account blob url provided for blob storage." raise ValueError(msg) return BlobPipelineStorage( connection_string, diff --git a/graphrag/llm/openai/create_openai_client.py b/graphrag/llm/openai/create_openai_client.py index e839ff5d41..40d7d649d7 100644 --- a/graphrag/llm/openai/create_openai_client.py +++ b/graphrag/llm/openai/create_openai_client.py @@ -7,7 +7,6 @@ from functools import cache from azure.identity import DefaultAzureCredential, get_bearer_token_provider - from openai import AsyncAzureOpenAI, AsyncOpenAI from .openai_configuration import OpenAIConfiguration @@ -37,33 +36,23 @@ def create_openai_client( cognitive_services_endpoint = "https://cognitiveservices.azure.com/.default" else: cognitive_services_endpoint = configuration.cognitive_services_endpoint - if configuration.api_key is None: - token_provider = get_bearer_token_provider( + + return AsyncAzureOpenAI( + api_key=configuration.api_key if configuration.api_key else None, + azure_ad_token_provider=get_bearer_token_provider( DefaultAzureCredential(), cognitive_services_endpoint ) - return AsyncAzureOpenAI( - azure_ad_token_provider=token_provider, - organization=configuration.organization, - # Azure-Specifics - api_version=configuration.api_version, - azure_endpoint=api_base, - azure_deployment=configuration.deployment_name, - # Timeout/Retry Configuration - Use Tenacity for Retries, so disable them here - timeout=configuration.request_timeout or 180.0, - max_retries=0, - ) - else: - return AsyncAzureOpenAI( - api_key=configuration.api_key, - organization=configuration.organization, - # Azure-Specifics - api_version=configuration.api_version, - azure_endpoint=api_base, - azure_deployment=configuration.deployment_name, - # Timeout/Retry Configuration - Use Tenacity for Retries, so disable them here - timeout=configuration.request_timeout or 180.0, - max_retries=0, - ) + if not configuration.api_key + else None, + organization=configuration.organization, + # Azure-Specifics + api_version=configuration.api_version, + azure_endpoint=api_base, + azure_deployment=configuration.deployment_name, + # Timeout/Retry Configuration - Use Tenacity for Retries, so disable them here + timeout=configuration.request_timeout or 180.0, + max_retries=0, + ) log.info("Creating OpenAI client base_url=%s", configuration.api_base) return AsyncOpenAI( diff --git a/graphrag/query/factories.py b/graphrag/query/factories.py index cf68eace58..d319299cc5 100644 --- a/graphrag/query/factories.py +++ b/graphrag/query/factories.py @@ -37,9 +37,10 @@ def get_llm(config: GraphRagConfig) -> ChatOpenAI: config.llm.type == LLMType.AzureOpenAIChat or config.llm.type == LLMType.AzureOpenAI ) + debug_llm_key = config.llm.api_key or "" llm_debug_info = { **config.llm.model_dump(), - "api_key": f"REDACTED,len={len(config.llm.api_key)}", + "api_key": f"REDACTED,len={len(debug_llm_key)}", } print(f"creating llm client with {llm_debug_info}") # noqa T201 return ChatOpenAI( @@ -56,9 +57,10 @@ def get_llm(config: GraphRagConfig) -> ChatOpenAI: def get_text_embedder(config: GraphRagConfig) -> OpenAIEmbedding: """Get the LLM client for embeddings.""" is_azure_client = config.embeddings.llm.type == LLMType.AzureOpenAIEmbedding + debug_embedding_api_key = config.embeddings.llm.api_key or "" llm_debug_info = { **config.embeddings.llm.model_dump(), - "api_key": f"REDACTED,len={len(config.embeddings.llm.api_key)}", + "api_key": f"REDACTED,len={len(debug_embedding_api_key)}", } print(f"creating embedding llm client with {llm_debug_info}") # noqa T201 return OpenAIEmbedding( diff --git a/graphrag/query/llm/oai/base.py b/graphrag/query/llm/oai/base.py index 569a61aa29..6181c0b2a5 100644 --- a/graphrag/query/llm/oai/base.py +++ b/graphrag/query/llm/oai/base.py @@ -4,6 +4,7 @@ """Base classes for LLM and Embedding models.""" from abc import ABC, abstractmethod +from collections.abc import Callable from openai import AsyncAzureOpenAI, AsyncOpenAI, AzureOpenAI, OpenAI @@ -90,7 +91,8 @@ class OpenAILLMImpl(BaseOpenAILLM): def __init__( self, - api_key: str, + api_key: str | None = None, + azure_ad_token_provider: Callable | None = None, deployment_name: str | None = None, api_base: str | None = None, api_version: str | None = None, @@ -101,6 +103,7 @@ def __init__( reporter: StatusReporter | None = None, ): self.api_key = api_key + self.azure_ad_token_provider = azure_ad_token_provider self.deployment_name = deployment_name self.api_base = api_base self.api_version = api_version @@ -129,6 +132,7 @@ def _create_openai_client(self): sync_client = AzureOpenAI( api_key=self.api_key, + azure_ad_token_provider=self.azure_ad_token_provider, organization=self.organization, # Azure-Specifics api_version=self.api_version, @@ -141,6 +145,7 @@ def _create_openai_client(self): async_client = AsyncAzureOpenAI( api_key=self.api_key, + azure_ad_token_provider=self.azure_ad_token_provider, organization=self.organization, # Azure-Specifics api_version=self.api_version, diff --git a/graphrag/query/llm/oai/chat_openai.py b/graphrag/query/llm/oai/chat_openai.py index 30bf5de68e..8314f3a2c2 100644 --- a/graphrag/query/llm/oai/chat_openai.py +++ b/graphrag/query/llm/oai/chat_openai.py @@ -3,6 +3,7 @@ """Chat-based OpenAI LLM implementation.""" +from collections.abc import Callable from typing import Any from tenacity import ( @@ -22,14 +23,17 @@ ) from graphrag.query.progress import StatusReporter +_MODEL_REQUIRED_MSG = "model is required" + class ChatOpenAI(BaseLLM, OpenAILLMImpl): """Wrapper for OpenAI ChatCompletion models.""" def __init__( self, - api_key: str, - model: str, + api_key: str | None = None, + model: str | None = None, + azure_ad_token_provider: Callable | None = None, deployment_name: str | None = None, api_base: str | None = None, api_version: str | None = None, @@ -43,6 +47,7 @@ def __init__( OpenAILLMImpl.__init__( self=self, api_key=api_key, + azure_ad_token_provider=azure_ad_token_provider, deployment_name=deployment_name, api_base=api_base, api_version=api_version, @@ -124,8 +129,11 @@ def _generate( callbacks: list[BaseLLMCallback] | None = None, **kwargs: Any, ) -> str: + model = self.model + if not model: + raise ValueError(_MODEL_REQUIRED_MSG) response = self.sync_client.chat.completions.create( # type: ignore - model=self.model, + model=model, messages=messages, # type: ignore stream=streaming, **kwargs, @@ -157,8 +165,11 @@ async def _agenerate( callbacks: list[BaseLLMCallback] | None = None, **kwargs: Any, ) -> str: + model = self.model + if not model: + raise ValueError(_MODEL_REQUIRED_MSG) response = await self.async_client.chat.completions.create( # type: ignore - model=self.model, + model=model, messages=messages, # type: ignore stream=streaming, **kwargs, diff --git a/graphrag/query/llm/oai/embedding.py b/graphrag/query/llm/oai/embedding.py index 07d466a848..f40372dbce 100644 --- a/graphrag/query/llm/oai/embedding.py +++ b/graphrag/query/llm/oai/embedding.py @@ -4,6 +4,7 @@ """OpenAI Embedding model implementation.""" import asyncio +from collections.abc import Callable from typing import Any import numpy as np @@ -32,7 +33,8 @@ class OpenAIEmbedding(BaseTextEmbedding, OpenAILLMImpl): def __init__( self, - api_key: str, + api_key: str | None = None, + azure_ad_token_provider: Callable | None = None, model: str = "text-embedding-3-small", deployment_name: str | None = None, api_base: str | None = None, @@ -49,6 +51,7 @@ def __init__( OpenAILLMImpl.__init__( self=self, api_key=api_key, + azure_ad_token_provider=azure_ad_token_provider, deployment_name=deployment_name, api_base=api_base, api_version=api_version, diff --git a/graphrag/vector_stores/azure_ai_search.py b/graphrag/vector_stores/azure_ai_search.py index db6e30396c..2197052abf 100644 --- a/graphrag/vector_stores/azure_ai_search.py +++ b/graphrag/vector_stores/azure_ai_search.py @@ -50,20 +50,19 @@ def connect(self, **kwargs: Any) -> Any: ) if url: - if api_key: - self.db_connection = SearchClient( - url, self.collection_name, AzureKeyCredential(api_key) - ) - self.index_client = SearchIndexClient( - endpoint=url, credential=AzureKeyCredential(api_key) - ) - else: - self.db_connection = SearchClient( - url, self.collection_name, DefaultAzureCredential() - ) - self.index_client = SearchIndexClient( - endpoint=url, credential=DefaultAzureCredential() - ) + self.db_connection = SearchClient( + endpoint=url, + index_name=self.collection_name, + credential=AzureKeyCredential(api_key) + if api_key + else DefaultAzureCredential(), + ) + self.index_client = SearchIndexClient( + endpoint=url, + credential=AzureKeyCredential(api_key) + if api_key + else DefaultAzureCredential(), + ) else: not_supported_error = "AAISearchDBClient is not supported on local host." raise ValueError(not_supported_error) diff --git a/poetry.lock b/poetry.lock index 51d4ab9d4b..88fb763269 100644 --- a/poetry.lock +++ b/poetry.lock @@ -1,4 +1,4 @@ -# This file is automatically @generated by Poetry 1.6.1 and should not be changed by hand. +# This file is automatically @generated by Poetry 1.8.2 and should not be changed by hand. [[package]] name = "aiofiles" @@ -287,23 +287,23 @@ isodate = ">=0.6.0" [[package]] name = "azure-storage-blob" -version = "12.19.1" +version = "12.20.0" description = "Microsoft Azure Blob Storage Client Library for Python" optional = false -python-versions = ">=3.7" +python-versions = ">=3.8" files = [ - {file = "azure-storage-blob-12.19.1.tar.gz", hash = "sha256:13e16ba42fc54ac2c7e8f976062173a5c82b9ec0594728e134aac372965a11b0"}, - {file = "azure_storage_blob-12.19.1-py3-none-any.whl", hash = "sha256:c5530dc51c21c9564e4eb706cd499befca8819b10dd89716d3fc90d747556243"}, + {file = "azure-storage-blob-12.20.0.tar.gz", hash = "sha256:eeb91256e41d4b5b9bad6a87fd0a8ade07dd58aa52344e2c8d2746e27a017d3b"}, + {file = "azure_storage_blob-12.20.0-py3-none-any.whl", hash = "sha256:de6b3bf3a90e9341a6bcb96a2ebe981dffff993e9045818f6549afea827a52a9"}, ] [package.dependencies] -azure-core = ">=1.28.0,<2.0.0" +azure-core = ">=1.28.0" cryptography = ">=2.1.4" isodate = ">=0.6.1" -typing-extensions = ">=4.3.0" +typing-extensions = ">=4.6.0" [package.extras] -aio = ["azure-core[aio] (>=1.28.0,<2.0.0)"] +aio = ["azure-core[aio] (>=1.28.0)"] [[package]] name = "babel" @@ -2140,17 +2140,17 @@ files = [ [[package]] name = "lancedb" -version = "0.6.11" +version = "0.6.13" description = "lancedb" optional = false python-versions = ">=3.8" files = [ - {file = "lancedb-0.6.11-cp38-abi3-macosx_10_15_x86_64.whl", hash = "sha256:79dbc2a79dac7b843e328a3b7eecb1b42f38ad524742111a38efbeaa1f58ddfe"}, - {file = "lancedb-0.6.11-cp38-abi3-macosx_11_0_arm64.whl", hash = "sha256:bfc6661e1fe5dd75346b4a1980243b4ccecd2b0ad991f8becc6e506a608c2d8a"}, - {file = "lancedb-0.6.11-cp38-abi3-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:0998c2dae676c24b95d492358f80ef6e5100b86335b96bf402af3f28f7ec4f3b"}, - {file = "lancedb-0.6.11-cp38-abi3-manylinux_2_24_aarch64.whl", hash = "sha256:b6b289599c4c6a61a70da89d4c3201abec7483d0e03573506014af2dcddfe0c4"}, - {file = "lancedb-0.6.11-cp38-abi3-manylinux_2_28_x86_64.whl", hash = "sha256:d789d5a181c4bc42650567cb63ce2772ed902046b08e8e401970df284a4df1c1"}, - {file = "lancedb-0.6.11-cp38-abi3-win_amd64.whl", hash = "sha256:ea12fc94545afb03933d080cce593491e593ab95cbfddf05ab7183bce2bc8d62"}, + {file = "lancedb-0.6.13-cp38-abi3-macosx_10_15_x86_64.whl", hash = "sha256:4667353ca7fa187e94cb0ca4c5f9577d65eb5160f6f3fe9e57902d86312c3869"}, + {file = "lancedb-0.6.13-cp38-abi3-macosx_11_0_arm64.whl", hash = "sha256:2e22533fe6f6b2d7037dcdbbb4019a62402bbad4ce18395be68f4aa007bf8bc0"}, + {file = "lancedb-0.6.13-cp38-abi3-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:837eaceafb87e3ae4c261eef45c4f73715f892a36165572c3da621dbdb45afcf"}, + {file = "lancedb-0.6.13-cp38-abi3-manylinux_2_24_aarch64.whl", hash = "sha256:61af2d72b2a2f0ea419874c3f32760fe5e51530da3be2d65251a0e6ded74419b"}, + {file = "lancedb-0.6.13-cp38-abi3-manylinux_2_28_x86_64.whl", hash = "sha256:31b24e57ee313f4ce6255e45d42e8bee19b90ddcd13a9e07030ac04f76e7dfde"}, + {file = "lancedb-0.6.13-cp38-abi3-win_amd64.whl", hash = "sha256:b851182d8492b1e5b57a441af64c95da65ca30b045d6618dc7d203c6d60d70fa"}, ] [package.dependencies] @@ -2163,7 +2163,7 @@ pylance = "0.10.12" ratelimiter = ">=1.0,<2.0" requests = ">=2.31.0" retry = ">=0.9.2" -semver = ">=3.0" +semver = "*" tqdm = ">=4.27.0" [package.extras] @@ -2413,13 +2413,13 @@ traitlets = "*" [[package]] name = "mdit-py-plugins" -version = "0.4.0" +version = "0.4.1" description = "Collection of plugins for markdown-it-py" optional = false python-versions = ">=3.8" files = [ - {file = "mdit_py_plugins-0.4.0-py3-none-any.whl", hash = "sha256:b51b3bb70691f57f974e257e367107857a93b36f322a9e6d44ca5bf28ec2def9"}, - {file = "mdit_py_plugins-0.4.0.tar.gz", hash = "sha256:d8ab27e9aed6c38aa716819fedfde15ca275715955f8a185a8e1cf90fb1d2c1b"}, + {file = "mdit_py_plugins-0.4.1-py3-none-any.whl", hash = "sha256:1020dfe4e6bfc2c79fb49ae4e3f5b297f5ccd20f010187acc52af2921e27dc6a"}, + {file = "mdit_py_plugins-0.4.1.tar.gz", hash = "sha256:834b8ac23d1cd60cec703646ffd22ae97b7955a6d596eb1d304be1e251ae499c"}, ] [package.dependencies] @@ -2759,13 +2759,13 @@ files = [ [[package]] name = "openai" -version = "1.26.0" +version = "1.30.1" description = "The official Python library for the openai API" optional = false python-versions = ">=3.7.1" files = [ - {file = "openai-1.26.0-py3-none-any.whl", hash = "sha256:884ced523fb0225780f8b0e0ed6f7e014049c32d049a41ad0ac962869f1055d1"}, - {file = "openai-1.26.0.tar.gz", hash = "sha256:642e857b60855702ee6ff665e8fa80946164f77b92e58fd24e01b545685b8405"}, + {file = "openai-1.30.1-py3-none-any.whl", hash = "sha256:c9fb3c3545c118bbce8deb824397b9433a66d0d0ede6a96f7009c95b76de4a46"}, + {file = "openai-1.30.1.tar.gz", hash = "sha256:4f85190e577cba0b066e1950b8eb9b11d25bc7ebcc43a86b326ce1bfa564ec74"}, ] [package.dependencies] @@ -2810,7 +2810,6 @@ optional = false python-versions = ">=3.9" files = [ {file = "pandas-2.2.2-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:90c6fca2acf139569e74e8781709dccb6fe25940488755716d1d354d6bc58bce"}, - {file = "pandas-2.2.2-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:c7adfc142dac335d8c1e0dcbd37eb8617eac386596eb9e1a1b77791cf2498238"}, {file = "pandas-2.2.2-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:4abfe0be0d7221be4f12552995e58723c7422c80a659da13ca382697de830c08"}, {file = "pandas-2.2.2-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:8635c16bf3d99040fdf3ca3db669a7250ddf49c55dc4aa8fe0ae0fa8d6dcc1f0"}, {file = "pandas-2.2.2-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:40ae1dffb3967a52203105a077415a86044a2bea011b5f321c6aa64b379a3f51"}, @@ -2831,7 +2830,6 @@ files = [ {file = "pandas-2.2.2-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:43498c0bdb43d55cb162cdc8c06fac328ccb5d2eabe3cadeb3529ae6f0517c32"}, {file = "pandas-2.2.2-cp312-cp312-win_amd64.whl", hash = "sha256:d187d355ecec3629624fccb01d104da7d7f391db0311145817525281e2804d23"}, {file = "pandas-2.2.2-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:0ca6377b8fca51815f382bd0b697a0814c8bda55115678cbc94c30aacbb6eff2"}, - {file = "pandas-2.2.2-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:9057e6aa78a584bc93a13f0a9bf7e753a5e9770a30b4d758b8d5f2a62a9433cd"}, {file = "pandas-2.2.2-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:001910ad31abc7bf06f49dcc903755d2f7f3a9186c0c040b827e522e9cef0863"}, {file = "pandas-2.2.2-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:66b479b0bd07204e37583c191535505410daa8df638fd8e75ae1b383851fe921"}, {file = "pandas-2.2.2-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:a77e9d1c386196879aa5eb712e77461aaee433e54c68cf253053a73b7e49c33a"}, @@ -3541,13 +3539,13 @@ diagrams = ["jinja2", "railroad-diagrams"] [[package]] name = "pyright" -version = "1.1.361" +version = "1.1.362" description = "Command line wrapper for pyright" optional = false python-versions = ">=3.7" files = [ - {file = "pyright-1.1.361-py3-none-any.whl", hash = "sha256:c50fc94ce92b5c958cfccbbe34142e7411d474da43d6c14a958667e35b9df7ea"}, - {file = "pyright-1.1.361.tar.gz", hash = "sha256:1d67933315666b05d230c85ea8fb97aaa2056e4092a13df87b7765bb9e8f1a8d"}, + {file = "pyright-1.1.362-py3-none-any.whl", hash = "sha256:969957cff45154d8a45a4ab1dae5bdc8223d8bd3c64654fa608ab3194dfff319"}, + {file = "pyright-1.1.362.tar.gz", hash = "sha256:6a477e448d4a07a6a0eab58b2a15a1bbed031eb3169fa809edee79cca168d83a"}, ] [package.dependencies] @@ -3724,6 +3722,7 @@ files = [ {file = "PyYAML-6.0.1-cp311-cp311-win_amd64.whl", hash = "sha256:bf07ee2fef7014951eeb99f56f39c9bb4af143d8aa3c21b1677805985307da34"}, {file = "PyYAML-6.0.1-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:855fb52b0dc35af121542a76b9a84f8d1cd886ea97c84703eaa6d88e37a2ad28"}, {file = "PyYAML-6.0.1-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:40df9b996c2b73138957fe23a16a4f0ba614f4c0efce1e9406a184b6d07fa3a9"}, + {file = "PyYAML-6.0.1-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:a08c6f0fe150303c1c6b71ebcd7213c2858041a7e01975da3a99aed1e7a378ef"}, {file = "PyYAML-6.0.1-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:6c22bec3fbe2524cde73d7ada88f6566758a8f7227bfbf93a408a9d86bcc12a0"}, {file = "PyYAML-6.0.1-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:8d4e9c88387b0f5c7d5f281e55304de64cf7f9c0021a3525bd3b1c542da3b0e4"}, {file = "PyYAML-6.0.1-cp312-cp312-win32.whl", hash = "sha256:d483d2cdf104e7c9fa60c544d92981f12ad66a457afae824d146093b8c294c54"}, @@ -3931,90 +3930,90 @@ rpds-py = ">=0.7.0" [[package]] name = "regex" -version = "2024.4.28" +version = "2024.5.10" description = "Alternative regular expression module, to replace re." optional = false python-versions = ">=3.8" files = [ - {file = "regex-2024.4.28-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:cd196d056b40af073d95a2879678585f0b74ad35190fac04ca67954c582c6b61"}, - {file = "regex-2024.4.28-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:8bb381f777351bd534462f63e1c6afb10a7caa9fa2a421ae22c26e796fe31b1f"}, - {file = "regex-2024.4.28-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:47af45b6153522733aa6e92543938e97a70ce0900649ba626cf5aad290b737b6"}, - {file = "regex-2024.4.28-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:99d6a550425cc51c656331af0e2b1651e90eaaa23fb4acde577cf15068e2e20f"}, - {file = "regex-2024.4.28-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:bf29304a8011feb58913c382902fde3395957a47645bf848eea695839aa101b7"}, - {file = "regex-2024.4.28-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:92da587eee39a52c91aebea8b850e4e4f095fe5928d415cb7ed656b3460ae79a"}, - {file = "regex-2024.4.28-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:6277d426e2f31bdbacb377d17a7475e32b2d7d1f02faaecc48d8e370c6a3ff31"}, - {file = "regex-2024.4.28-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:28e1f28d07220c0f3da0e8fcd5a115bbb53f8b55cecf9bec0c946eb9a059a94c"}, - {file = "regex-2024.4.28-cp310-cp310-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:aaa179975a64790c1f2701ac562b5eeb733946eeb036b5bcca05c8d928a62f10"}, - {file = "regex-2024.4.28-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:6f435946b7bf7a1b438b4e6b149b947c837cb23c704e780c19ba3e6855dbbdd3"}, - {file = "regex-2024.4.28-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:19d6c11bf35a6ad077eb23852827f91c804eeb71ecb85db4ee1386825b9dc4db"}, - {file = "regex-2024.4.28-cp310-cp310-musllinux_1_1_ppc64le.whl", hash = "sha256:fdae0120cddc839eb8e3c15faa8ad541cc6d906d3eb24d82fb041cfe2807bc1e"}, - {file = "regex-2024.4.28-cp310-cp310-musllinux_1_1_s390x.whl", hash = "sha256:e672cf9caaf669053121f1766d659a8813bd547edef6e009205378faf45c67b8"}, - {file = "regex-2024.4.28-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:f57515750d07e14743db55d59759893fdb21d2668f39e549a7d6cad5d70f9fea"}, - {file = "regex-2024.4.28-cp310-cp310-win32.whl", hash = "sha256:a1409c4eccb6981c7baabc8888d3550df518add6e06fe74fa1d9312c1838652d"}, - {file = "regex-2024.4.28-cp310-cp310-win_amd64.whl", hash = "sha256:1f687a28640f763f23f8a9801fe9e1b37338bb1ca5d564ddd41619458f1f22d1"}, - {file = "regex-2024.4.28-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:84077821c85f222362b72fdc44f7a3a13587a013a45cf14534df1cbbdc9a6796"}, - {file = "regex-2024.4.28-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:b45d4503de8f4f3dc02f1d28a9b039e5504a02cc18906cfe744c11def942e9eb"}, - {file = "regex-2024.4.28-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:457c2cd5a646dd4ed536c92b535d73548fb8e216ebee602aa9f48e068fc393f3"}, - {file = "regex-2024.4.28-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:2b51739ddfd013c6f657b55a508de8b9ea78b56d22b236052c3a85a675102dc6"}, - {file = "regex-2024.4.28-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:459226445c7d7454981c4c0ce0ad1a72e1e751c3e417f305722bbcee6697e06a"}, - {file = "regex-2024.4.28-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:670fa596984b08a4a769491cbdf22350431970d0112e03d7e4eeaecaafcd0fec"}, - {file = "regex-2024.4.28-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:fe00f4fe11c8a521b173e6324d862ee7ee3412bf7107570c9b564fe1119b56fb"}, - {file = "regex-2024.4.28-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:36f392dc7763fe7924575475736bddf9ab9f7a66b920932d0ea50c2ded2f5636"}, - {file = "regex-2024.4.28-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:23a412b7b1a7063f81a742463f38821097b6a37ce1e5b89dd8e871d14dbfd86b"}, - {file = "regex-2024.4.28-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:f1d6e4b7b2ae3a6a9df53efbf199e4bfcff0959dbdb5fd9ced34d4407348e39a"}, - {file = "regex-2024.4.28-cp311-cp311-musllinux_1_1_ppc64le.whl", hash = "sha256:499334ad139557de97cbc4347ee921c0e2b5e9c0f009859e74f3f77918339257"}, - {file = "regex-2024.4.28-cp311-cp311-musllinux_1_1_s390x.whl", hash = "sha256:0940038bec2fe9e26b203d636c44d31dd8766abc1fe66262da6484bd82461ccf"}, - {file = "regex-2024.4.28-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:66372c2a01782c5fe8e04bff4a2a0121a9897e19223d9eab30c54c50b2ebeb7f"}, - {file = "regex-2024.4.28-cp311-cp311-win32.whl", hash = "sha256:c77d10ec3c1cf328b2f501ca32583625987ea0f23a0c2a49b37a39ee5c4c4630"}, - {file = "regex-2024.4.28-cp311-cp311-win_amd64.whl", hash = "sha256:fc0916c4295c64d6890a46e02d4482bb5ccf33bf1a824c0eaa9e83b148291f90"}, - {file = "regex-2024.4.28-cp312-cp312-macosx_10_9_universal2.whl", hash = "sha256:08a1749f04fee2811c7617fdd46d2e46d09106fa8f475c884b65c01326eb15c5"}, - {file = "regex-2024.4.28-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:b8eb28995771c087a73338f695a08c9abfdf723d185e57b97f6175c5051ff1ae"}, - {file = "regex-2024.4.28-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:dd7ef715ccb8040954d44cfeff17e6b8e9f79c8019daae2fd30a8806ef5435c0"}, - {file = "regex-2024.4.28-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:fb0315a2b26fde4005a7c401707c5352df274460f2f85b209cf6024271373013"}, - {file = "regex-2024.4.28-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:f2fc053228a6bd3a17a9b0a3f15c3ab3cf95727b00557e92e1cfe094b88cc662"}, - {file = "regex-2024.4.28-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:7fe9739a686dc44733d52d6e4f7b9c77b285e49edf8570754b322bca6b85b4cc"}, - {file = "regex-2024.4.28-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:a74fcf77d979364f9b69fcf8200849ca29a374973dc193a7317698aa37d8b01c"}, - {file = "regex-2024.4.28-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:965fd0cf4694d76f6564896b422724ec7b959ef927a7cb187fc6b3f4e4f59833"}, - {file = "regex-2024.4.28-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:2fef0b38c34ae675fcbb1b5db760d40c3fc3612cfa186e9e50df5782cac02bcd"}, - {file = "regex-2024.4.28-cp312-cp312-musllinux_1_1_i686.whl", hash = "sha256:bc365ce25f6c7c5ed70e4bc674f9137f52b7dd6a125037f9132a7be52b8a252f"}, - {file = "regex-2024.4.28-cp312-cp312-musllinux_1_1_ppc64le.whl", hash = "sha256:ac69b394764bb857429b031d29d9604842bc4cbfd964d764b1af1868eeebc4f0"}, - {file = "regex-2024.4.28-cp312-cp312-musllinux_1_1_s390x.whl", hash = "sha256:144a1fc54765f5c5c36d6d4b073299832aa1ec6a746a6452c3ee7b46b3d3b11d"}, - {file = "regex-2024.4.28-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:2630ca4e152c221072fd4a56d4622b5ada876f668ecd24d5ab62544ae6793ed6"}, - {file = "regex-2024.4.28-cp312-cp312-win32.whl", hash = "sha256:7f3502f03b4da52bbe8ba962621daa846f38489cae5c4a7b5d738f15f6443d17"}, - {file = "regex-2024.4.28-cp312-cp312-win_amd64.whl", hash = "sha256:0dd3f69098511e71880fb00f5815db9ed0ef62c05775395968299cb400aeab82"}, - {file = "regex-2024.4.28-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:374f690e1dd0dbdcddea4a5c9bdd97632cf656c69113f7cd6a361f2a67221cb6"}, - {file = "regex-2024.4.28-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:25f87ae6b96374db20f180eab083aafe419b194e96e4f282c40191e71980c666"}, - {file = "regex-2024.4.28-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:5dbc1bcc7413eebe5f18196e22804a3be1bfdfc7e2afd415e12c068624d48247"}, - {file = "regex-2024.4.28-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:f85151ec5a232335f1be022b09fbbe459042ea1951d8a48fef251223fc67eee1"}, - {file = "regex-2024.4.28-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:57ba112e5530530fd175ed550373eb263db4ca98b5f00694d73b18b9a02e7185"}, - {file = "regex-2024.4.28-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:224803b74aab56aa7be313f92a8d9911dcade37e5f167db62a738d0c85fdac4b"}, - {file = "regex-2024.4.28-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:0a54a047b607fd2d2d52a05e6ad294602f1e0dec2291152b745870afc47c1397"}, - {file = "regex-2024.4.28-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:0a2a512d623f1f2d01d881513af9fc6a7c46e5cfffb7dc50c38ce959f9246c94"}, - {file = "regex-2024.4.28-cp38-cp38-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:c06bf3f38f0707592898428636cbb75d0a846651b053a1cf748763e3063a6925"}, - {file = "regex-2024.4.28-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:1031a5e7b048ee371ab3653aad3030ecfad6ee9ecdc85f0242c57751a05b0ac4"}, - {file = "regex-2024.4.28-cp38-cp38-musllinux_1_1_i686.whl", hash = "sha256:d7a353ebfa7154c871a35caca7bfd8f9e18666829a1dc187115b80e35a29393e"}, - {file = "regex-2024.4.28-cp38-cp38-musllinux_1_1_ppc64le.whl", hash = "sha256:7e76b9cfbf5ced1aca15a0e5b6f229344d9b3123439ffce552b11faab0114a02"}, - {file = "regex-2024.4.28-cp38-cp38-musllinux_1_1_s390x.whl", hash = "sha256:5ce479ecc068bc2a74cb98dd8dba99e070d1b2f4a8371a7dfe631f85db70fe6e"}, - {file = "regex-2024.4.28-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:7d77b6f63f806578c604dca209280e4c54f0fa9a8128bb8d2cc5fb6f99da4150"}, - {file = "regex-2024.4.28-cp38-cp38-win32.whl", hash = "sha256:d84308f097d7a513359757c69707ad339da799e53b7393819ec2ea36bc4beb58"}, - {file = "regex-2024.4.28-cp38-cp38-win_amd64.whl", hash = "sha256:2cc1b87bba1dd1a898e664a31012725e48af826bf3971e786c53e32e02adae6c"}, - {file = "regex-2024.4.28-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:7413167c507a768eafb5424413c5b2f515c606be5bb4ef8c5dee43925aa5718b"}, - {file = "regex-2024.4.28-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:108e2dcf0b53a7c4ab8986842a8edcb8ab2e59919a74ff51c296772e8e74d0ae"}, - {file = "regex-2024.4.28-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:f1c5742c31ba7d72f2dedf7968998730664b45e38827637e0f04a2ac7de2f5f1"}, - {file = "regex-2024.4.28-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:ecc6148228c9ae25ce403eade13a0961de1cb016bdb35c6eafd8e7b87ad028b1"}, - {file = "regex-2024.4.28-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:b7d893c8cf0e2429b823ef1a1d360a25950ed11f0e2a9df2b5198821832e1947"}, - {file = "regex-2024.4.28-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:4290035b169578ffbbfa50d904d26bec16a94526071ebec3dadbebf67a26b25e"}, - {file = "regex-2024.4.28-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:44a22ae1cfd82e4ffa2066eb3390777dc79468f866f0625261a93e44cdf6482b"}, - {file = "regex-2024.4.28-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:fd24fd140b69f0b0bcc9165c397e9b2e89ecbeda83303abf2a072609f60239e2"}, - {file = "regex-2024.4.28-cp39-cp39-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:39fb166d2196413bead229cd64a2ffd6ec78ebab83fff7d2701103cf9f4dfd26"}, - {file = "regex-2024.4.28-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:9301cc6db4d83d2c0719f7fcda37229691745168bf6ae849bea2e85fc769175d"}, - {file = "regex-2024.4.28-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:7c3d389e8d76a49923683123730c33e9553063d9041658f23897f0b396b2386f"}, - {file = "regex-2024.4.28-cp39-cp39-musllinux_1_1_ppc64le.whl", hash = "sha256:99ef6289b62042500d581170d06e17f5353b111a15aa6b25b05b91c6886df8fc"}, - {file = "regex-2024.4.28-cp39-cp39-musllinux_1_1_s390x.whl", hash = "sha256:b91d529b47798c016d4b4c1d06cc826ac40d196da54f0de3c519f5a297c5076a"}, - {file = "regex-2024.4.28-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:43548ad74ea50456e1c68d3c67fff3de64c6edb85bcd511d1136f9b5376fc9d1"}, - {file = "regex-2024.4.28-cp39-cp39-win32.whl", hash = "sha256:05d9b6578a22db7dedb4df81451f360395828b04f4513980b6bd7a1412c679cc"}, - {file = "regex-2024.4.28-cp39-cp39-win_amd64.whl", hash = "sha256:3986217ec830c2109875be740531feb8ddafe0dfa49767cdcd072ed7e8927962"}, - {file = "regex-2024.4.28.tar.gz", hash = "sha256:83ab366777ea45d58f72593adf35d36ca911ea8bd838483c1823b883a121b0e4"}, + {file = "regex-2024.5.10-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:eda3dd46df535da787ffb9036b5140f941ecb91701717df91c9daf64cabef953"}, + {file = "regex-2024.5.10-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:1d5bd666466c8f00a06886ce1397ba8b12371c1f1c6d1bef11013e9e0a1464a8"}, + {file = "regex-2024.5.10-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:32e5f3b8e32918bfbdd12eca62e49ab3031125c454b507127ad6ecbd86e62fca"}, + {file = "regex-2024.5.10-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:534efd2653ebc4f26fc0e47234e53bf0cb4715bb61f98c64d2774a278b58c846"}, + {file = "regex-2024.5.10-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:193b7c6834a06f722f0ce1ba685efe80881de7c3de31415513862f601097648c"}, + {file = "regex-2024.5.10-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:160ba087232c5c6e2a1e7ad08bd3a3f49b58c815be0504d8c8aacfb064491cd8"}, + {file = "regex-2024.5.10-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:951be1eae7b47660412dc4938777a975ebc41936d64e28081bf2e584b47ec246"}, + {file = "regex-2024.5.10-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:d8a0f0ab5453e409586b11ebe91c672040bc804ca98d03a656825f7890cbdf88"}, + {file = "regex-2024.5.10-cp310-cp310-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:9e6d4d6ae1827b2f8c7200aaf7501c37cf3f3896c86a6aaf2566448397c823dd"}, + {file = "regex-2024.5.10-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:161a206c8f3511e2f5fafc9142a2cc25d7fe9a1ec5ad9b4ad2496a7c33e1c5d2"}, + {file = "regex-2024.5.10-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:44b3267cea873684af022822195298501568ed44d542f9a2d9bebc0212e99069"}, + {file = "regex-2024.5.10-cp310-cp310-musllinux_1_1_ppc64le.whl", hash = "sha256:560278c9975694e1f0bc50da187abf2cdc1e4890739ea33df2bc4a85eeef143e"}, + {file = "regex-2024.5.10-cp310-cp310-musllinux_1_1_s390x.whl", hash = "sha256:70364a097437dd0a90b31cd77f09f7387ad9ac60ef57590971f43b7fca3082a5"}, + {file = "regex-2024.5.10-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:42be5de7cc8c1edac55db92d82b68dc8e683b204d6f5414c5a51997a323d7081"}, + {file = "regex-2024.5.10-cp310-cp310-win32.whl", hash = "sha256:9a8625849387b9d558d528e263ecc9c0fbde86cfa5c2f0eef43fff480ae24d71"}, + {file = "regex-2024.5.10-cp310-cp310-win_amd64.whl", hash = "sha256:903350bf44d7e4116b4d5898b30b15755d61dcd3161e3413a49c7db76f0bee5a"}, + {file = "regex-2024.5.10-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:bf9596cba92ce7b1fd32c7b07c6e3212c7eed0edc271757e48bfcd2b54646452"}, + {file = "regex-2024.5.10-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:45cc13d398b6359a7708986386f72bd156ae781c3e83a68a6d4cee5af04b1ce9"}, + {file = "regex-2024.5.10-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:ad45f3bccfcb00868f2871dce02a755529838d2b86163ab8a246115e80cfb7d6"}, + {file = "regex-2024.5.10-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:33d19f0cde6838c81acffff25c7708e4adc7dd02896c9ec25c3939b1500a1778"}, + {file = "regex-2024.5.10-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:0a9f89d7db5ef6bdf53e5cc8e6199a493d0f1374b3171796b464a74ebe8e508a"}, + {file = "regex-2024.5.10-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:8c6c71cf92b09e5faa72ea2c68aa1f61c9ce11cb66fdc5069d712f4392ddfd00"}, + {file = "regex-2024.5.10-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:7467ad8b0eac0b28e52679e972b9b234b3de0ea5cee12eb50091d2b68145fe36"}, + {file = "regex-2024.5.10-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:bc0db93ad039fc2fe32ccd3dd0e0e70c4f3d6e37ae83f0a487e1aba939bd2fbd"}, + {file = "regex-2024.5.10-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:fa9335674d7c819674467c7b46154196c51efbaf5f5715187fd366814ba3fa39"}, + {file = "regex-2024.5.10-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:7dda3091838206969c2b286f9832dff41e2da545b99d1cfaea9ebd8584d02708"}, + {file = "regex-2024.5.10-cp311-cp311-musllinux_1_1_ppc64le.whl", hash = "sha256:504b5116e2bd1821efd815941edff7535e93372a098e156bb9dffde30264e798"}, + {file = "regex-2024.5.10-cp311-cp311-musllinux_1_1_s390x.whl", hash = "sha256:91b53dea84415e8115506cc62e441a2b54537359c63d856d73cb1abe05af4c9a"}, + {file = "regex-2024.5.10-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:1a3903128f9e17a500618e80c68165c78c741ebb17dd1a0b44575f92c3c68b02"}, + {file = "regex-2024.5.10-cp311-cp311-win32.whl", hash = "sha256:236cace6c1903effd647ed46ce6dd5d76d54985fc36dafc5256032886736c85d"}, + {file = "regex-2024.5.10-cp311-cp311-win_amd64.whl", hash = "sha256:12446827f43c7881decf2c126762e11425de5eb93b3b0d8b581344c16db7047a"}, + {file = "regex-2024.5.10-cp312-cp312-macosx_10_9_universal2.whl", hash = "sha256:14905ed75c7a6edf423eb46c213ed3f4507c38115f1ed3c00f4ec9eafba50e58"}, + {file = "regex-2024.5.10-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:4fad420b14ae1970a1f322e8ae84a1d9d89375eb71e1b504060ab2d1bfe68f3c"}, + {file = "regex-2024.5.10-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:c46a76a599fcbf95f98755275c5527304cc4f1bb69919434c1e15544d7052910"}, + {file = "regex-2024.5.10-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:0faecb6d5779753a6066a3c7a0471a8d29fe25d9981ca9e552d6d1b8f8b6a594"}, + {file = "regex-2024.5.10-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:aab65121229c2ecdf4a31b793d99a6a0501225bd39b616e653c87b219ed34a49"}, + {file = "regex-2024.5.10-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:50e7e96a527488334379e05755b210b7da4a60fc5d6481938c1fa053e0c92184"}, + {file = "regex-2024.5.10-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:ba034c8db4b264ef1601eb33cd23d87c5013b8fb48b8161debe2e5d3bd9156b0"}, + {file = "regex-2024.5.10-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:031219782d97550c2098d9a68ce9e9eaefe67d2d81d8ff84c8354f9c009e720c"}, + {file = "regex-2024.5.10-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:62b5f7910b639f3c1d122d408421317c351e213ca39c964ad4121f27916631c6"}, + {file = "regex-2024.5.10-cp312-cp312-musllinux_1_1_i686.whl", hash = "sha256:cd832bd9b6120d6074f39bdfbb3c80e416848b07ac72910f1c7f03131a6debc3"}, + {file = "regex-2024.5.10-cp312-cp312-musllinux_1_1_ppc64le.whl", hash = "sha256:e91b1976358e17197157b405cab408a5f4e33310cda211c49fc6da7cffd0b2f0"}, + {file = "regex-2024.5.10-cp312-cp312-musllinux_1_1_s390x.whl", hash = "sha256:571452362d552de508c37191b6abbbb660028b8b418e2d68c20779e0bc8eaaa8"}, + {file = "regex-2024.5.10-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:5253dcb0bfda7214523de58b002eb0090cb530d7c55993ce5f6d17faf953ece7"}, + {file = "regex-2024.5.10-cp312-cp312-win32.whl", hash = "sha256:2f30a5ab8902f93930dc6f627c4dd5da2703333287081c85cace0fc6e21c25af"}, + {file = "regex-2024.5.10-cp312-cp312-win_amd64.whl", hash = "sha256:3799e36d60a35162bb35b2246d8bb012192b7437dff807ef79c14e7352706306"}, + {file = "regex-2024.5.10-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:bbdc5db2c98ac2bf1971ffa1410c87ca7a15800415f788971e8ba8520fc0fda9"}, + {file = "regex-2024.5.10-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:6ccdeef4584450b6f0bddd5135354908dacad95425fcb629fe36d13e48b60f32"}, + {file = "regex-2024.5.10-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:29d839829209f3c53f004e1de8c3113efce6d98029f044fa5cfee666253ee7e6"}, + {file = "regex-2024.5.10-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:0709ba544cf50bd5cb843df4b8bb6701bae2b70a8e88da9add8386cbca5c1385"}, + {file = "regex-2024.5.10-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:972b49f2fe1047b9249c958ec4fa1bdd2cf8ce305dc19d27546d5a38e57732d8"}, + {file = "regex-2024.5.10-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:9cdbb1998da94607d5eec02566b9586f0e70d6438abf1b690261aac0edda7ab6"}, + {file = "regex-2024.5.10-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:bf7c8ee4861d9ef5b1120abb75846828c811f932d63311596ad25fa168053e00"}, + {file = "regex-2024.5.10-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:7d35d4cc9270944e95f9c88af757b0c9fc43f396917e143a5756608462c5223b"}, + {file = "regex-2024.5.10-cp38-cp38-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:8722f72068b3e1156a4b2e1afde6810f1fc67155a9fa30a4b9d5b4bc46f18fb0"}, + {file = "regex-2024.5.10-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:696639a73ca78a380acfaa0a1f6dd8220616a99074c05bba9ba8bb916914b224"}, + {file = "regex-2024.5.10-cp38-cp38-musllinux_1_1_i686.whl", hash = "sha256:ea057306ab469130167014b662643cfaed84651c792948891d003cf0039223a5"}, + {file = "regex-2024.5.10-cp38-cp38-musllinux_1_1_ppc64le.whl", hash = "sha256:b43b78f9386d3d932a6ce5af4b45f393d2e93693ee18dc4800d30a8909df700e"}, + {file = "regex-2024.5.10-cp38-cp38-musllinux_1_1_s390x.whl", hash = "sha256:c43395a3b7cc9862801a65c6994678484f186ce13c929abab44fb8a9e473a55a"}, + {file = "regex-2024.5.10-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:0bc94873ba11e34837bffd7e5006703abeffc4514e2f482022f46ce05bd25e67"}, + {file = "regex-2024.5.10-cp38-cp38-win32.whl", hash = "sha256:1118ba9def608250250f4b3e3f48c62f4562ba16ca58ede491b6e7554bfa09ff"}, + {file = "regex-2024.5.10-cp38-cp38-win_amd64.whl", hash = "sha256:458d68d34fb74b906709735c927c029e62f7d06437a98af1b5b6258025223210"}, + {file = "regex-2024.5.10-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:15e593386ec6331e0ab4ac0795b7593f02ab2f4b30a698beb89fbdc34f92386a"}, + {file = "regex-2024.5.10-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:ca23b41355ba95929e9505ee04e55495726aa2282003ed9b012d86f857d3e49b"}, + {file = "regex-2024.5.10-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:2c8982ee19ccecabbaeac1ba687bfef085a6352a8c64f821ce2f43e6d76a9298"}, + {file = "regex-2024.5.10-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:7117cb7d6ac7f2e985f3d18aa8a1728864097da1a677ffa69e970ca215baebf1"}, + {file = "regex-2024.5.10-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:b66421f8878a0c82fc0c272a43e2121c8d4c67cb37429b764f0d5ad70b82993b"}, + {file = "regex-2024.5.10-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:224a9269f133564109ce668213ef3cb32bc72ccf040b0b51c72a50e569e9dc9e"}, + {file = "regex-2024.5.10-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:ab98016541543692a37905871a5ffca59b16e08aacc3d7d10a27297b443f572d"}, + {file = "regex-2024.5.10-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:51d27844763c273a122e08a3e86e7aefa54ee09fb672d96a645ece0454d8425e"}, + {file = "regex-2024.5.10-cp39-cp39-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:853cc36e756ff673bf984e9044ccc8fad60b95a748915dddeab9488aea974c73"}, + {file = "regex-2024.5.10-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:4e7eaf9df15423d07b6050fb91f86c66307171b95ea53e2d87a7993b6d02c7f7"}, + {file = "regex-2024.5.10-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:169fd0acd7a259f58f417e492e93d0e15fc87592cd1e971c8c533ad5703b5830"}, + {file = "regex-2024.5.10-cp39-cp39-musllinux_1_1_ppc64le.whl", hash = "sha256:334b79ce9c08f26b4659a53f42892793948a613c46f1b583e985fd5a6bf1c149"}, + {file = "regex-2024.5.10-cp39-cp39-musllinux_1_1_s390x.whl", hash = "sha256:f03b1dbd4d9596dd84955bb40f7d885204d6aac0d56a919bb1e0ff2fb7e1735a"}, + {file = "regex-2024.5.10-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:cfa6d61a76c77610ba9274c1a90a453062bdf6887858afbe214d18ad41cf6bde"}, + {file = "regex-2024.5.10-cp39-cp39-win32.whl", hash = "sha256:249fbcee0a277c32a3ce36d8e36d50c27c968fdf969e0fbe342658d4e010fbc8"}, + {file = "regex-2024.5.10-cp39-cp39-win_amd64.whl", hash = "sha256:0ce56a923f4c01d7568811bfdffe156268c0a7aae8a94c902b92fe34c4bde785"}, + {file = "regex-2024.5.10.tar.gz", hash = "sha256:304e7e2418146ae4d0ef0e9ffa28f881f7874b45b4994cc2279b21b6e7ae50c8"}, ] [[package]] @@ -4206,28 +4205,28 @@ files = [ [[package]] name = "ruff" -version = "0.4.3" +version = "0.4.4" description = "An extremely fast Python linter and code formatter, written in Rust." optional = false python-versions = ">=3.7" files = [ - {file = "ruff-0.4.3-py3-none-macosx_10_12_x86_64.whl", hash = "sha256:b70800c290f14ae6fcbb41bbe201cf62dfca024d124a1f373e76371a007454ce"}, - {file = "ruff-0.4.3-py3-none-macosx_11_0_arm64.whl", hash = "sha256:08a0d6a22918ab2552ace96adeaca308833873a4d7d1d587bb1d37bae8728eb3"}, - {file = "ruff-0.4.3-py3-none-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:eba1f14df3c758dd7de5b55fbae7e1c8af238597961e5fb628f3de446c3c40c5"}, - {file = "ruff-0.4.3-py3-none-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:819fb06d535cc76dfddbfe8d3068ff602ddeb40e3eacbc90e0d1272bb8d97113"}, - {file = "ruff-0.4.3-py3-none-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:0bfc9e955e6dc6359eb6f82ea150c4f4e82b660e5b58d9a20a0e42ec3bb6342b"}, - {file = "ruff-0.4.3-py3-none-manylinux_2_17_ppc64.manylinux2014_ppc64.whl", hash = "sha256:510a67d232d2ebe983fddea324dbf9d69b71c4d2dfeb8a862f4a127536dd4cfb"}, - {file = "ruff-0.4.3-py3-none-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:dc9ff11cd9a092ee7680a56d21f302bdda14327772cd870d806610a3503d001f"}, - {file = "ruff-0.4.3-py3-none-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:29efff25bf9ee685c2c8390563a5b5c006a3fee5230d28ea39f4f75f9d0b6f2f"}, - {file = "ruff-0.4.3-py3-none-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:18b00e0bcccf0fc8d7186ed21e311dffd19761cb632241a6e4fe4477cc80ef6e"}, - {file = "ruff-0.4.3-py3-none-musllinux_1_2_aarch64.whl", hash = "sha256:262f5635e2c74d80b7507fbc2fac28fe0d4fef26373bbc62039526f7722bca1b"}, - {file = "ruff-0.4.3-py3-none-musllinux_1_2_armv7l.whl", hash = "sha256:7363691198719c26459e08cc17c6a3dac6f592e9ea3d2fa772f4e561b5fe82a3"}, - {file = "ruff-0.4.3-py3-none-musllinux_1_2_i686.whl", hash = "sha256:eeb039f8428fcb6725bb63cbae92ad67b0559e68b5d80f840f11914afd8ddf7f"}, - {file = "ruff-0.4.3-py3-none-musllinux_1_2_x86_64.whl", hash = "sha256:927b11c1e4d0727ce1a729eace61cee88a334623ec424c0b1c8fe3e5f9d3c865"}, - {file = "ruff-0.4.3-py3-none-win32.whl", hash = "sha256:25cacda2155778beb0d064e0ec5a3944dcca9c12715f7c4634fd9d93ac33fd30"}, - {file = "ruff-0.4.3-py3-none-win_amd64.whl", hash = "sha256:7a1c3a450bc6539ef00da6c819fb1b76b6b065dec585f91456e7c0d6a0bbc725"}, - {file = "ruff-0.4.3-py3-none-win_arm64.whl", hash = "sha256:71ca5f8ccf1121b95a59649482470c5601c60a416bf189d553955b0338e34614"}, - {file = "ruff-0.4.3.tar.gz", hash = "sha256:ff0a3ef2e3c4b6d133fbedcf9586abfbe38d076041f2dc18ffb2c7e0485d5a07"}, + {file = "ruff-0.4.4-py3-none-macosx_10_12_x86_64.whl", hash = "sha256:29d44ef5bb6a08e235c8249294fa8d431adc1426bfda99ed493119e6f9ea1bf6"}, + {file = "ruff-0.4.4-py3-none-macosx_11_0_arm64.whl", hash = "sha256:c4efe62b5bbb24178c950732ddd40712b878a9b96b1d02b0ff0b08a090cbd891"}, + {file = "ruff-0.4.4-py3-none-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:4c8e2f1e8fc12d07ab521a9005d68a969e167b589cbcaee354cb61e9d9de9c15"}, + {file = "ruff-0.4.4-py3-none-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:60ed88b636a463214905c002fa3eaab19795679ed55529f91e488db3fe8976ab"}, + {file = "ruff-0.4.4-py3-none-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:b90fc5e170fc71c712cc4d9ab0e24ea505c6a9e4ebf346787a67e691dfb72e85"}, + {file = "ruff-0.4.4-py3-none-manylinux_2_17_ppc64.manylinux2014_ppc64.whl", hash = "sha256:8e7e6ebc10ef16dcdc77fd5557ee60647512b400e4a60bdc4849468f076f6eef"}, + {file = "ruff-0.4.4-py3-none-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:b9ddb2c494fb79fc208cd15ffe08f32b7682519e067413dbaf5f4b01a6087bcd"}, + {file = "ruff-0.4.4-py3-none-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:c51c928a14f9f0a871082603e25a1588059b7e08a920f2f9fa7157b5bf08cfe9"}, + {file = "ruff-0.4.4-py3-none-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:b5eb0a4bfd6400b7d07c09a7725e1a98c3b838be557fee229ac0f84d9aa49c36"}, + {file = "ruff-0.4.4-py3-none-musllinux_1_2_aarch64.whl", hash = "sha256:b1867ee9bf3acc21778dcb293db504692eda5f7a11a6e6cc40890182a9f9e595"}, + {file = "ruff-0.4.4-py3-none-musllinux_1_2_armv7l.whl", hash = "sha256:1aecced1269481ef2894cc495647392a34b0bf3e28ff53ed95a385b13aa45768"}, + {file = "ruff-0.4.4-py3-none-musllinux_1_2_i686.whl", hash = "sha256:9da73eb616b3241a307b837f32756dc20a0b07e2bcb694fec73699c93d04a69e"}, + {file = "ruff-0.4.4-py3-none-musllinux_1_2_x86_64.whl", hash = "sha256:958b4ea5589706a81065e2a776237de2ecc3e763342e5cc8e02a4a4d8a5e6f95"}, + {file = "ruff-0.4.4-py3-none-win32.whl", hash = "sha256:cb53473849f011bca6e754f2cdf47cafc9c4f4ff4570003a0dad0b9b6890e876"}, + {file = "ruff-0.4.4-py3-none-win_amd64.whl", hash = "sha256:424e5b72597482543b684c11def82669cc6b395aa8cc69acc1858b5ef3e5daae"}, + {file = "ruff-0.4.4-py3-none-win_arm64.whl", hash = "sha256:39df0537b47d3b597293edbb95baf54ff5b49589eb7ff41926d8243caa995ea6"}, + {file = "ruff-0.4.4.tar.gz", hash = "sha256:f87ea42d5cdebdc6a69761a9d0bc83ae9b3b30d0ad78952005ba6568d6c022af"}, ] [[package]] @@ -4685,13 +4684,13 @@ files = [ [[package]] name = "tomlkit" -version = "0.12.4" +version = "0.12.5" description = "Style preserving TOML library" optional = false python-versions = ">=3.7" files = [ - {file = "tomlkit-0.12.4-py3-none-any.whl", hash = "sha256:5cd82d48a3dd89dee1f9d64420aa20ae65cfbd00668d6f094d7578a78efbb77b"}, - {file = "tomlkit-0.12.4.tar.gz", hash = "sha256:7ca1cfc12232806517a8515047ba66a19369e71edf2439d0f5824f91032b6cc3"}, + {file = "tomlkit-0.12.5-py3-none-any.whl", hash = "sha256:af914f5a9c59ed9d0762c7b64d3b5d5df007448eb9cd2edc8a46b1eafead172f"}, + {file = "tomlkit-0.12.5.tar.gz", hash = "sha256:eef34fba39834d4d6b73c9ba7f3e4d1c417a4e56f89a7e96e090dd0d24b8fb3c"}, ] [[package]] @@ -5083,4 +5082,4 @@ testing = ["big-O", "jaraco.functools", "jaraco.itertools", "more-itertools", "p [metadata] lock-version = "2.0" python-versions = ">=3.10,<3.12" -content-hash = "69c1a771f47dc88b185d628ab5ba5e64064c39e590762708ee344c25568e9646" +content-hash = "14df33ce314f2ef5c1f9baafb13ffe1d2e8f49761a83aebc27f2c70ce47cd5fe" diff --git a/tests/unit/config/test_default_config.py b/tests/unit/config/test_default_config.py index 270eb01e10..a9cac74da6 100644 --- a/tests/unit/config/test_default_config.py +++ b/tests/unit/config/test_default_config.py @@ -79,6 +79,7 @@ "GRAPHRAG_API_PROXY": "http://some/proxy", "GRAPHRAG_API_VERSION": "v1234", "GRAPHRAG_ASYNC_MODE": "asyncio", + "GRAPHRAG_CACHE_STORAGE_ACCOUNT_BLOB_URL": "cache_account_blob_url", "GRAPHRAG_CACHE_BASE_DIR": "/some/cache/dir", "GRAPHRAG_CACHE_CONNECTION_STRING": "test_cs1", "GRAPHRAG_CACHE_CONTAINER_NAME": "test_cn1", @@ -108,6 +109,7 @@ "GRAPHRAG_EMBEDDING_TPM": "7000", "GRAPHRAG_EMBEDDING_TYPE": "azure_openai_embedding", "GRAPHRAG_ENCODING_MODEL": "test123", + "GRAPHRAG_INPUT_STORAGE_ACCOUNT_BLOB_URL": "input_account_blob_url", "GRAPHRAG_ENTITY_EXTRACTION_ENTITY_TYPES": "cat,dog,elephant", "GRAPHRAG_ENTITY_EXTRACTION_MAX_GLEANINGS": "112", "GRAPHRAG_ENTITY_EXTRACTION_PROMPT_FILE": "tests/unit/config/prompt-c.txt", @@ -145,6 +147,7 @@ "GRAPHRAG_NODE2VEC_RANDOM_SEED": "010101", "GRAPHRAG_NODE2VEC_WALK_LENGTH": "555111", "GRAPHRAG_NODE2VEC_WINDOW_SIZE": "12345", + "GRAPHRAG_REPORTING_STORAGE_ACCOUNT_BLOB_URL": "reporting_account_blob_url", "GRAPHRAG_REPORTING_BASE_DIR": "/some/reporting/dir", "GRAPHRAG_REPORTING_CONNECTION_STRING": "test_cs2", "GRAPHRAG_REPORTING_CONTAINER_NAME": "test_cn2", @@ -153,6 +156,7 @@ "GRAPHRAG_SNAPSHOT_GRAPHML": "true", "GRAPHRAG_SNAPSHOT_RAW_ENTITIES": "true", "GRAPHRAG_SNAPSHOT_TOP_LEVEL_NODES": "true", + "GRAPHRAG_STORAGE_STORAGE_ACCOUNT_BLOB_URL": "storage_account_blob_url", "GRAPHRAG_STORAGE_BASE_DIR": "/some/storage/dir", "GRAPHRAG_STORAGE_CONNECTION_STRING": "test_cs", "GRAPHRAG_STORAGE_CONTAINER_NAME": "test_cn", @@ -488,6 +492,7 @@ def test_malformed_input_dict_throws(self): def test_create_parameters_from_env_vars(self) -> None: parameters = create_graphrag_config() assert parameters.async_mode == "asyncio" + assert parameters.cache.storage_account_blob_url == "cache_account_blob_url" assert parameters.cache.base_dir == "/some/cache/dir" assert parameters.cache.connection_string == "test_cs1" assert parameters.cache.container_name == "test_cn1" @@ -528,6 +533,7 @@ def test_create_parameters_from_env_vars(self) -> None: assert parameters.entity_extraction.llm.api_base == "http://some/base" assert parameters.entity_extraction.max_gleanings == 112 assert parameters.entity_extraction.prompt == "tests/unit/config/prompt-c.txt" + assert parameters.input.storage_account_blob_url == "input_account_blob_url" assert parameters.input.base_dir == "/some/input/dir" assert parameters.input.connection_string == "input_cs" assert parameters.input.container_name == "input_cn" @@ -560,6 +566,10 @@ def test_create_parameters_from_env_vars(self) -> None: assert parameters.llm.type == "azure_openai_chat" assert parameters.parallelization.num_threads == 987 assert parameters.parallelization.stagger == 0.123 + assert ( + parameters.reporting.storage_account_blob_url + == "reporting_account_blob_url" + ) assert parameters.reporting.base_dir == "/some/reporting/dir" assert parameters.reporting.connection_string == "test_cs2" assert parameters.reporting.container_name == "test_cn2" @@ -568,6 +578,7 @@ def test_create_parameters_from_env_vars(self) -> None: assert parameters.snapshots.graphml assert parameters.snapshots.raw_entities assert parameters.snapshots.top_level_nodes + assert parameters.storage.storage_account_blob_url == "storage_account_blob_url" assert parameters.storage.base_dir == "/some/storage/dir" assert parameters.storage.connection_string == "test_cs" assert parameters.storage.container_name == "test_cn" @@ -600,18 +611,21 @@ def test_create_parameters(self) -> None: connection_string="test_cs", container_name="test_cn", base_dir="/some/storage/dir", + storage_account_blob_url="storage_account_blob_url", ), cache=CacheConfigInput( type=CacheType.blob, connection_string="test_cs1", container_name="test_cn1", base_dir="/some/cache/dir", + storage_account_blob_url="cache_account_blob_url", ), reporting=ReportingConfigInput( type=ReportingType.blob, connection_string="test_cs2", container_name="test_cn2", base_dir="/some/reporting/dir", + storage_account_blob_url="reporting_account_blob_url", ), input=InputConfigInput( type=InputType.text, @@ -627,6 +641,7 @@ def test_create_parameters(self) -> None: timestamp_format="test_format", title_column="test_title", storage_type="blob", + storage_account_blob_url="input_account_blob_url", ), embed_graph=EmbedGraphConfigInput( enabled=True, @@ -681,6 +696,7 @@ def test_create_parameters(self) -> None: assert parameters.cache.connection_string == "test_cs1" assert parameters.cache.container_name == "test_cn1" assert parameters.cache.type == CacheType.blob + assert parameters.cache.storage_account_blob_url == "cache_account_blob_url" assert parameters.chunks.group_by_columns == ["a", "b"] assert parameters.chunks.overlap == 12 assert parameters.chunks.size == 500 @@ -719,12 +735,17 @@ def test_create_parameters(self) -> None: assert parameters.input.timestamp_format == "test_format" assert parameters.input.title_column == "test_title" assert parameters.input.type == InputType.text + assert parameters.input.storage_account_blob_url == "input_account_blob_url" assert parameters.llm.api_key == "test" assert parameters.llm.model == "test-llm" assert parameters.reporting.base_dir == "/some/reporting/dir" assert parameters.reporting.connection_string == "test_cs2" assert parameters.reporting.container_name == "test_cn2" assert parameters.reporting.type == ReportingType.blob + assert ( + parameters.reporting.storage_account_blob_url + == "reporting_account_blob_url" + ) assert parameters.skip_workflows == ["a", "b", "c"] assert parameters.snapshots.graphml assert parameters.snapshots.raw_entities @@ -733,6 +754,7 @@ def test_create_parameters(self) -> None: assert parameters.storage.connection_string == "test_cs" assert parameters.storage.container_name == "test_cn" assert parameters.storage.type == StorageType.blob + assert parameters.storage.storage_account_blob_url == "storage_account_blob_url" assert parameters.summarize_descriptions.max_length == 12345 assert parameters.summarize_descriptions.prompt == "summarize_prompt_file.txt" assert parameters.umap.enabled From 4b4ea89be1450f361c727df69fec09113a73f80d Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Mon, 20 May 2024 17:21:19 -0600 Subject: [PATCH 16/22] Bump textual from 0.58.1 to 0.62.0 (#238) --- updated-dependencies: - dependency-name: textual dependency-type: direct:production update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- poetry.lock | 10 ++++++---- pyproject.toml | 2 +- 2 files changed, 7 insertions(+), 5 deletions(-) diff --git a/poetry.lock b/poetry.lock index 88fb763269..6c8e1a4a6f 100644 --- a/poetry.lock +++ b/poetry.lock @@ -2810,6 +2810,7 @@ optional = false python-versions = ">=3.9" files = [ {file = "pandas-2.2.2-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:90c6fca2acf139569e74e8781709dccb6fe25940488755716d1d354d6bc58bce"}, + {file = "pandas-2.2.2-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:c7adfc142dac335d8c1e0dcbd37eb8617eac386596eb9e1a1b77791cf2498238"}, {file = "pandas-2.2.2-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:4abfe0be0d7221be4f12552995e58723c7422c80a659da13ca382697de830c08"}, {file = "pandas-2.2.2-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:8635c16bf3d99040fdf3ca3db669a7250ddf49c55dc4aa8fe0ae0fa8d6dcc1f0"}, {file = "pandas-2.2.2-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:40ae1dffb3967a52203105a077415a86044a2bea011b5f321c6aa64b379a3f51"}, @@ -2830,6 +2831,7 @@ files = [ {file = "pandas-2.2.2-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:43498c0bdb43d55cb162cdc8c06fac328ccb5d2eabe3cadeb3529ae6f0517c32"}, {file = "pandas-2.2.2-cp312-cp312-win_amd64.whl", hash = "sha256:d187d355ecec3629624fccb01d104da7d7f391db0311145817525281e2804d23"}, {file = "pandas-2.2.2-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:0ca6377b8fca51815f382bd0b697a0814c8bda55115678cbc94c30aacbb6eff2"}, + {file = "pandas-2.2.2-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:9057e6aa78a584bc93a13f0a9bf7e753a5e9770a30b4d758b8d5f2a62a9433cd"}, {file = "pandas-2.2.2-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:001910ad31abc7bf06f49dcc903755d2f7f3a9186c0c040b827e522e9cef0863"}, {file = "pandas-2.2.2-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:66b479b0bd07204e37583c191535505410daa8df638fd8e75ae1b383851fe921"}, {file = "pandas-2.2.2-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:a77e9d1c386196879aa5eb712e77461aaee433e54c68cf253053a73b7e49c33a"}, @@ -4573,13 +4575,13 @@ typing = ["mypy (>=1.6,<2.0)", "traitlets (>=5.11.1)"] [[package]] name = "textual" -version = "0.58.1" +version = "0.62.0" description = "Modern Text User Interface framework" optional = false python-versions = "<4.0,>=3.8" files = [ - {file = "textual-0.58.1-py3-none-any.whl", hash = "sha256:9902ebb4b00481f6fdb0e7db821c007afa45797d81e1d0651735a07de25ece87"}, - {file = "textual-0.58.1.tar.gz", hash = "sha256:3a01be0b583f2bce38b8e9786b75ed33dddc816bba502d8e7a9ca3ca2ead3957"}, + {file = "textual-0.62.0-py3-none-any.whl", hash = "sha256:5208c1df961848889ff0a0c7628f203a2bc773fc2a45d6e842b27a8e34c15499"}, + {file = "textual-0.62.0.tar.gz", hash = "sha256:563c1c13a087c8f4fef8a47aae43e1274139e85d00e0b0898b8eb89c5e494997"}, ] [package.dependencies] @@ -5082,4 +5084,4 @@ testing = ["big-O", "jaraco.functools", "jaraco.itertools", "more-itertools", "p [metadata] lock-version = "2.0" python-versions = ">=3.10,<3.12" -content-hash = "14df33ce314f2ef5c1f9baafb13ffe1d2e8f49761a83aebc27f2c70ce47cd5fe" +content-hash = "b849bcd95fd0fc98290633f85a64cbcd44af5b5239ffd22654e45b8b80294fde" diff --git a/pyproject.toml b/pyproject.toml index 9e4b88c6e5..1730e75e68 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -70,7 +70,7 @@ tenacity = "^8.2.3" swifter = "^1.4.0" pydantic = "^2" rich = "^13.6.0" -textual = "^0.58.1" +textual = "^0.62.0" devtools = "^0.12.2" #Azure From f61474a8153c5265a93b92a3ce1f88eebf89bd01 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Mon, 20 May 2024 22:04:17 -0700 Subject: [PATCH 17/22] Bump requests from 2.31.0 to 2.32.0 (#240) --- updated-dependencies: - dependency-name: requests dependency-type: indirect ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- poetry.lock | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/poetry.lock b/poetry.lock index 6c8e1a4a6f..fd8bd79b80 100644 --- a/poetry.lock +++ b/poetry.lock @@ -4020,13 +4020,13 @@ files = [ [[package]] name = "requests" -version = "2.31.0" +version = "2.32.0" description = "Python HTTP for Humans." optional = false -python-versions = ">=3.7" +python-versions = ">=3.8" files = [ - {file = "requests-2.31.0-py3-none-any.whl", hash = "sha256:58cd2187c01e70e6e26505bca751777aa9f2ee0b7f4300988b709f44e013003f"}, - {file = "requests-2.31.0.tar.gz", hash = "sha256:942c5a758f98d790eaed1a29cb6eefc7ffb0d1cf7af05c3d2791656dbd6ad1e1"}, + {file = "requests-2.32.0-py3-none-any.whl", hash = "sha256:f2c3881dddb70d056c5bd7600a4fae312b2a300e39be6a118d30b90bd27262b5"}, + {file = "requests-2.32.0.tar.gz", hash = "sha256:fa5490319474c82ef1d2c9bc459d3652e3ae4ef4c4ebdd18a21145a47ca4b6b8"}, ] [package.dependencies] From 87a515798979e8f953357b5516422a2c4bc2332c Mon Sep 17 00:00:00 2001 From: Chris Trevino Date: Mon, 20 May 2024 22:08:35 -0700 Subject: [PATCH 18/22] Upgrade Pyright (#239) * upgrade pyright * add fetch-depth, fetch-tags * update prerelease format for pypi compliance --- .github/workflows/gh-pages.yml | 2 +- .github/workflows/python-ci.yml | 2 +- .github/workflows/python-publish.yml | 5 +- docsite/index.md | 2 +- poetry.lock | 1001 ++++++++++++++++++++++---- pyproject.toml | 12 +- 6 files changed, 858 insertions(+), 166 deletions(-) diff --git a/.github/workflows/gh-pages.yml b/.github/workflows/gh-pages.yml index e98121f17d..5212840c03 100644 --- a/.github/workflows/gh-pages.yml +++ b/.github/workflows/gh-pages.yml @@ -12,7 +12,7 @@ jobs: strategy: matrix: python-version: ["3.11"] - poetry-version: ["1.6.1"] + poetry-version: ["1.8.3"] node-version: ["18.x"] env: diff --git a/.github/workflows/python-ci.yml b/.github/workflows/python-ci.yml index f59e749776..a830f89906 100644 --- a/.github/workflows/python-ci.yml +++ b/.github/workflows/python-ci.yml @@ -19,7 +19,7 @@ jobs: strategy: matrix: python-version: ["3.10", "3.11"] - poetry-version: ["1.6.1"] + poetry-version: ["1.8.3"] os: [ubuntu-latest, windows-latest] env: DEBUG: 1 diff --git a/.github/workflows/python-publish.yml b/.github/workflows/python-publish.yml index 2d383cac8f..203c7b5cb1 100644 --- a/.github/workflows/python-publish.yml +++ b/.github/workflows/python-publish.yml @@ -10,7 +10,7 @@ jobs: strategy: matrix: python-version: ['3.10'] - poetry-version: ['1.8.2'] + poetry-version: ['1.8.3'] name: Upload release to PyPI if: github.ref == 'refs/heads/main' runs-on: ubuntu-latest @@ -22,6 +22,9 @@ jobs: steps: - uses: actions/checkout@v4 + with: + fetch-depth: 0 + fetch-tags: true - name: Set up Python ${{ matrix.python-version }} uses: actions/setup-python@v5 diff --git a/docsite/index.md b/docsite/index.md index e0d34cb2e4..bf60db217f 100644 --- a/docsite/index.md +++ b/docsite/index.md @@ -34,7 +34,7 @@ To address this, the tech community is working to develop methods that extend an ## The GraphRAG Process 🤖 -GraphRAG builds upon our prior [research](https://www.microsoft.com/en-us/worklab/patterns-hidden-inside-the-org-chart) and [tooling](https://github.com/microsoft/graspologic) using graph machine learning. The basic steps of the GraphRAG process are as follows: +GraphRAG builds upon our prior [research](https://www.microsoft.com/en-us/worklab/patterns-hidden-inside-the-org-chart) and [tooling](https://github.com/graspologic-org/graspologic) using graph machine learning. The basic steps of the GraphRAG process are as follows: ### Index diff --git a/poetry.lock b/poetry.lock index fd8bd79b80..4975f5bab6 100644 --- a/poetry.lock +++ b/poetry.lock @@ -1,4 +1,4 @@ -# This file is automatically @generated by Poetry 1.8.2 and should not be changed by hand. +# This file is automatically @generated by Poetry 1.8.3 and should not be changed by hand. [[package]] name = "aiofiles" @@ -24,13 +24,13 @@ files = [ [[package]] name = "annotated-types" -version = "0.6.0" +version = "0.7.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"}, + {file = "annotated_types-0.7.0-py3-none-any.whl", hash = "sha256:1f02e8b43a8fbbc3f3e0d4f0f4bfc8131bcb4eebe8849b8e5c773f3a1c582a53"}, + {file = "annotated_types-0.7.0.tar.gz", hash = "sha256:aff07c09a53a08bc8cfccb9c85b05f1aa9a2a6f23728d790723543408344ce89"}, ] [[package]] @@ -376,6 +376,52 @@ webencodings = "*" [package.extras] css = ["tinycss2 (>=1.1.0,<1.3)"] +[[package]] +name = "build" +version = "1.2.1" +description = "A simple, correct Python build frontend" +optional = false +python-versions = ">=3.8" +files = [ + {file = "build-1.2.1-py3-none-any.whl", hash = "sha256:75e10f767a433d9a86e50d83f418e83efc18ede923ee5ff7df93b6cb0306c5d4"}, + {file = "build-1.2.1.tar.gz", hash = "sha256:526263f4870c26f26c433545579475377b2b7588b6f1eac76a001e873ae3e19d"}, +] + +[package.dependencies] +colorama = {version = "*", markers = "os_name == \"nt\""} +importlib-metadata = {version = ">=4.6", markers = "python_full_version < \"3.10.2\""} +packaging = ">=19.1" +pyproject_hooks = "*" +tomli = {version = ">=1.1.0", markers = "python_version < \"3.11\""} + +[package.extras] +docs = ["furo (>=2023.08.17)", "sphinx (>=7.0,<8.0)", "sphinx-argparse-cli (>=1.5)", "sphinx-autodoc-typehints (>=1.10)", "sphinx-issues (>=3.0.0)"] +test = ["build[uv,virtualenv]", "filelock (>=3)", "pytest (>=6.2.4)", "pytest-cov (>=2.12)", "pytest-mock (>=2)", "pytest-rerunfailures (>=9.1)", "pytest-xdist (>=1.34)", "setuptools (>=42.0.0)", "setuptools (>=56.0.0)", "setuptools (>=56.0.0)", "setuptools (>=67.8.0)", "wheel (>=0.36.0)"] +typing = ["build[uv]", "importlib-metadata (>=5.1)", "mypy (>=1.9.0,<1.10.0)", "tomli", "typing-extensions (>=3.7.4.3)"] +uv = ["uv (>=0.1.18)"] +virtualenv = ["virtualenv (>=20.0.35)"] + +[[package]] +name = "cachecontrol" +version = "0.14.0" +description = "httplib2 caching for requests" +optional = false +python-versions = ">=3.7" +files = [ + {file = "cachecontrol-0.14.0-py3-none-any.whl", hash = "sha256:f5bf3f0620c38db2e5122c0726bdebb0d16869de966ea6a2befe92470b740ea0"}, + {file = "cachecontrol-0.14.0.tar.gz", hash = "sha256:7db1195b41c81f8274a7bbd97c956f44e8348265a1bc7641c37dfebc39f0c938"}, +] + +[package.dependencies] +filelock = {version = ">=3.8.0", optional = true, markers = "extra == \"filecache\""} +msgpack = ">=0.5.2,<2.0.0" +requests = ">=2.16.0" + +[package.extras] +dev = ["CacheControl[filecache,redis]", "black", "build", "cherrypy", "furo", "mypy", "pytest", "pytest-cov", "sphinx", "sphinx-copybutton", "tox", "types-redis", "types-requests"] +filecache = ["filelock (>=3.8.0)"] +redis = ["redis (>=2.10.5)"] + [[package]] name = "cachetools" version = "5.3.3" @@ -561,6 +607,21 @@ files = [ {file = "charset_normalizer-3.3.2-py3-none-any.whl", hash = "sha256:3e4d1f6587322d2788836a99c69062fbb091331ec940e02d12d179c1d53e25fc"}, ] +[[package]] +name = "cleo" +version = "2.1.0" +description = "Cleo allows you to create beautiful and testable command-line interfaces." +optional = false +python-versions = ">=3.7,<4.0" +files = [ + {file = "cleo-2.1.0-py3-none-any.whl", hash = "sha256:4a31bd4dd45695a64ee3c4758f583f134267c2bc518d8ae9a29cf237d009b07e"}, + {file = "cleo-2.1.0.tar.gz", hash = "sha256:0b2c880b5d13660a7ea651001fb4acb527696c01f15c9ee650f377aa543fd523"}, +] + +[package.dependencies] +crashtest = ">=0.4.1,<0.5.0" +rapidfuzz = ">=3.0.0,<4.0.0" + [[package]] name = "click" version = "8.1.7" @@ -853,6 +914,17 @@ files = [ [package.extras] dev = ["black (==22.3.0)", "hypothesis", "numpy", "pytest (>=5.30)", "pytest-xdist"] +[[package]] +name = "crashtest" +version = "0.4.1" +description = "Manage Python errors with ease" +optional = false +python-versions = ">=3.7,<4.0" +files = [ + {file = "crashtest-0.4.1-py3-none-any.whl", hash = "sha256:8d23eac5fa660409f57472e3851dab7ac18aba459a8d19cbbba86d3d5aecd2a5"}, + {file = "crashtest-0.4.1.tar.gz", hash = "sha256:80d7b1f316ebfbd429f648076d6275c877ba30ba48979de4191714a75266f0ce"}, +] + [[package]] name = "cryptography" version = "42.0.7" @@ -924,13 +996,13 @@ tests = ["pytest", "pytest-cov", "pytest-xdist"] [[package]] name = "dask" -version = "2024.5.0" +version = "2024.5.1" description = "Parallel PyData with Task Scheduling" optional = false python-versions = ">=3.9" files = [ - {file = "dask-2024.5.0-py3-none-any.whl", hash = "sha256:a9f8535c832cc5dc25c7ca4768eb47e6e3e49e152c50c28749ae103535787422"}, - {file = "dask-2024.5.0.tar.gz", hash = "sha256:324f94cdcd93831d24579021b063a2821099c4d51ec094dbc17e0d3ad1d3d351"}, + {file = "dask-2024.5.1-py3-none-any.whl", hash = "sha256:af1cadd1fd1d1d44600ff5de43dd029e5668fdf87422131f4e3e3aa2a6a63555"}, + {file = "dask-2024.5.1.tar.gz", hash = "sha256:e071fda67031c314569e37ca70b3e88bb30f1d91ff8ee4122b541845847cc264"}, ] [package.dependencies] @@ -951,22 +1023,22 @@ array = ["numpy (>=1.21)"] complete = ["dask[array,dataframe,diagnostics,distributed]", "lz4 (>=4.3.2)", "pyarrow (>=7.0)", "pyarrow-hotfix"] dataframe = ["dask-expr (>=1.1,<1.2)", "dask[array]", "pandas (>=1.3)"] diagnostics = ["bokeh (>=2.4.2)", "jinja2 (>=2.10.3)"] -distributed = ["distributed (==2024.5.0)"] +distributed = ["distributed (==2024.5.1)"] test = ["pandas[test]", "pre-commit", "pytest", "pytest-cov", "pytest-rerunfailures", "pytest-timeout", "pytest-xdist"] [[package]] name = "dask-expr" -version = "1.1.0" +version = "1.1.1" description = "High Level Expressions for Dask" optional = false python-versions = ">=3.9" files = [ - {file = "dask_expr-1.1.0-py3-none-any.whl", hash = "sha256:15c30460fd8493417f00b9c00e070d7037d20848b51d69b3347d0ebc6859e81f"}, - {file = "dask_expr-1.1.0.tar.gz", hash = "sha256:cd0e0ad4d65229a4fd22a231fa9c7e632cef09c5b6ab7259bdaaaadd20179cdb"}, + {file = "dask_expr-1.1.1-py3-none-any.whl", hash = "sha256:455842bff0795309f75f78f98d9be235210e01ad93da9b5a74f8cdaa594ab958"}, + {file = "dask_expr-1.1.1.tar.gz", hash = "sha256:30acb27c19ef3f44681cddd46597395b2da976d426e050e684e2044ebe033f3a"}, ] [package.dependencies] -dask = "2024.5.0" +dask = "2024.5.1" pandas = ">=2" pyarrow = ">=7.0.0" @@ -1081,6 +1153,17 @@ files = [ {file = "diskcache-5.6.3.tar.gz", hash = "sha256:2c3a3fa2743d8535d832ec61c2054a1641f41775aa7c556758a109941e33e4fc"}, ] +[[package]] +name = "distlib" +version = "0.3.8" +description = "Distribution utilities" +optional = false +python-versions = "*" +files = [ + {file = "distlib-0.3.8-py2.py3-none-any.whl", hash = "sha256:034db59a0b96f8ca18035f36290806a9a6e6bd9d1ff91e45a7f172eb17e51784"}, + {file = "distlib-0.3.8.tar.gz", hash = "sha256:1530ea13e350031b6312d8580ddb6b27a104275a31106523b8f123787f494f64"}, +] + [[package]] name = "distro" version = "1.9.0" @@ -1092,6 +1175,93 @@ files = [ {file = "distro-1.9.0.tar.gz", hash = "sha256:2fa77c6fd8940f116ee1d6b94a2f90b13b5ea8d019b98bc8bafdcabcdd9bdbed"}, ] +[[package]] +name = "dulwich" +version = "0.21.7" +description = "Python Git Library" +optional = false +python-versions = ">=3.7" +files = [ + {file = "dulwich-0.21.7-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:d4c0110798099bb7d36a110090f2688050703065448895c4f53ade808d889dd3"}, + {file = "dulwich-0.21.7-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:2bc12697f0918bee324c18836053644035362bb3983dc1b210318f2fed1d7132"}, + {file = "dulwich-0.21.7-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:471305af74790827fcbafe330fc2e8bdcee4fb56ca1177c8c481b1c8f806c4a4"}, + {file = "dulwich-0.21.7-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:d54c9d0e845be26f65f954dff13a1cd3f2b9739820c19064257b8fd7435ab263"}, + {file = "dulwich-0.21.7-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:12d61334a575474e707614f2e93d6ed4cdae9eb47214f9277076d9e5615171d3"}, + {file = "dulwich-0.21.7-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:e274cebaf345f0b1e3b70197f2651de92b652386b68020cfd3bf61bc30f6eaaa"}, + {file = "dulwich-0.21.7-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:817822f970e196e757ae01281ecbf21369383285b9f4a83496312204cf889b8c"}, + {file = "dulwich-0.21.7-cp310-cp310-win32.whl", hash = "sha256:7836da3f4110ce684dcd53489015fb7fa94ed33c5276e3318b8b1cbcb5b71e08"}, + {file = "dulwich-0.21.7-cp310-cp310-win_amd64.whl", hash = "sha256:4a043b90958cec866b4edc6aef5fe3c2c96a664d0b357e1682a46f6c477273c4"}, + {file = "dulwich-0.21.7-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:ce8db196e79c1f381469410d26fb1d8b89c6b87a4e7f00ff418c22a35121405c"}, + {file = "dulwich-0.21.7-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:62bfb26bdce869cd40be443dfd93143caea7089b165d2dcc33de40f6ac9d812a"}, + {file = "dulwich-0.21.7-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:c01a735b9a171dcb634a97a3cec1b174cfbfa8e840156870384b633da0460f18"}, + {file = "dulwich-0.21.7-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:fa4d14767cf7a49c9231c2e52cb2a3e90d0c83f843eb6a2ca2b5d81d254cf6b9"}, + {file = "dulwich-0.21.7-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:7bca4b86e96d6ef18c5bc39828ea349efb5be2f9b1f6ac9863f90589bac1084d"}, + {file = "dulwich-0.21.7-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:a7b5624b02ef808cdc62dabd47eb10cd4ac15e8ac6df9e2e88b6ac6b40133673"}, + {file = "dulwich-0.21.7-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:c3a539b4696a42fbdb7412cb7b66a4d4d332761299d3613d90a642923c7560e1"}, + {file = "dulwich-0.21.7-cp311-cp311-win32.whl", hash = "sha256:675a612ce913081beb0f37b286891e795d905691dfccfb9bf73721dca6757cde"}, + {file = "dulwich-0.21.7-cp311-cp311-win_amd64.whl", hash = "sha256:460ba74bdb19f8d498786ae7776745875059b1178066208c0fd509792d7f7bfc"}, + {file = "dulwich-0.21.7-cp312-cp312-macosx_10_9_universal2.whl", hash = "sha256:4c51058ec4c0b45dc5189225b9e0c671b96ca9713c1daf71d622c13b0ab07681"}, + {file = "dulwich-0.21.7-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:4bc4c5366eaf26dda3fdffe160a3b515666ed27c2419f1d483da285ac1411de0"}, + {file = "dulwich-0.21.7-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:a0650ec77d89cb947e3e4bbd4841c96f74e52b4650830112c3057a8ca891dc2f"}, + {file = "dulwich-0.21.7-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:4f18f0a311fb7734b033a3101292b932158cade54b74d1c44db519e42825e5a2"}, + {file = "dulwich-0.21.7-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:6c589468e5c0cd84e97eb7ec209ab005a2cb69399e8c5861c3edfe38989ac3a8"}, + {file = "dulwich-0.21.7-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:d62446797163317a397a10080c6397ffaaca51a7804c0120b334f8165736c56a"}, + {file = "dulwich-0.21.7-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:e84cc606b1f581733df4350ca4070e6a8b30be3662bbb81a590b177d0c996c91"}, + {file = "dulwich-0.21.7-cp312-cp312-win32.whl", hash = "sha256:c3d1685f320907a52c40fd5890627945c51f3a5fa4bcfe10edb24fec79caadec"}, + {file = "dulwich-0.21.7-cp312-cp312-win_amd64.whl", hash = "sha256:6bd69921fdd813b7469a3c77bc75c1783cc1d8d72ab15a406598e5a3ba1a1503"}, + {file = "dulwich-0.21.7-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:7d8ab29c660125db52106775caa1f8f7f77a69ed1fe8bc4b42bdf115731a25bf"}, + {file = "dulwich-0.21.7-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:b0d2e4485b98695bf95350ce9d38b1bb0aaac2c34ad00a0df789aa33c934469b"}, + {file = "dulwich-0.21.7-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:e138d516baa6b5bafbe8f030eccc544d0d486d6819b82387fc0e285e62ef5261"}, + {file = "dulwich-0.21.7-cp37-cp37m-musllinux_1_1_aarch64.whl", hash = "sha256:f34bf9b9fa9308376263fd9ac43143c7c09da9bc75037bb75c6c2423a151b92c"}, + {file = "dulwich-0.21.7-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:2e2c66888207b71cd1daa2acb06d3984a6bc13787b837397a64117aa9fc5936a"}, + {file = "dulwich-0.21.7-cp37-cp37m-win32.whl", hash = "sha256:10893105c6566fc95bc2a67b61df7cc1e8f9126d02a1df6a8b2b82eb59db8ab9"}, + {file = "dulwich-0.21.7-cp37-cp37m-win_amd64.whl", hash = "sha256:460b3849d5c3d3818a80743b4f7a0094c893c559f678e56a02fff570b49a644a"}, + {file = "dulwich-0.21.7-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:74700e4c7d532877355743336c36f51b414d01e92ba7d304c4f8d9a5946dbc81"}, + {file = "dulwich-0.21.7-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:c92e72c43c9e9e936b01a57167e0ea77d3fd2d82416edf9489faa87278a1cdf7"}, + {file = "dulwich-0.21.7-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:d097e963eb6b9fa53266146471531ad9c6765bf390849230311514546ed64db2"}, + {file = "dulwich-0.21.7-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:808e8b9cc0aa9ac74870b49db4f9f39a52fb61694573f84b9c0613c928d4caf8"}, + {file = "dulwich-0.21.7-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:e1957b65f96e36c301e419d7adaadcff47647c30eb072468901bb683b1000bc5"}, + {file = "dulwich-0.21.7-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:4b09bc3a64fb70132ec14326ecbe6e0555381108caff3496898962c4136a48c6"}, + {file = "dulwich-0.21.7-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:d5882e70b74ac3c736a42d3fdd4f5f2e6570637f59ad5d3e684760290b58f041"}, + {file = "dulwich-0.21.7-cp38-cp38-win32.whl", hash = "sha256:29bb5c1d70eba155ded41ed8a62be2f72edbb3c77b08f65b89c03976292f6d1b"}, + {file = "dulwich-0.21.7-cp38-cp38-win_amd64.whl", hash = "sha256:25c3ab8fb2e201ad2031ddd32e4c68b7c03cb34b24a5ff477b7a7dcef86372f5"}, + {file = "dulwich-0.21.7-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:8929c37986c83deb4eb500c766ee28b6670285b512402647ee02a857320e377c"}, + {file = "dulwich-0.21.7-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:cc1e11be527ac06316539b57a7688bcb1b6a3e53933bc2f844397bc50734e9ae"}, + {file = "dulwich-0.21.7-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:0fc3078a1ba04c588fabb0969d3530efd5cd1ce2cf248eefb6baf7cbc15fc285"}, + {file = "dulwich-0.21.7-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:40dcbd29ba30ba2c5bfbab07a61a5f20095541d5ac66d813056c122244df4ac0"}, + {file = "dulwich-0.21.7-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:8869fc8ec3dda743e03d06d698ad489b3705775fe62825e00fa95aa158097fc0"}, + {file = "dulwich-0.21.7-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:d96ca5e0dde49376fbcb44f10eddb6c30284a87bd03bb577c59bb0a1f63903fa"}, + {file = "dulwich-0.21.7-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:e0064363bd5e814359657ae32517fa8001e8573d9d040bd997908d488ab886ed"}, + {file = "dulwich-0.21.7-cp39-cp39-win32.whl", hash = "sha256:869eb7be48243e695673b07905d18b73d1054a85e1f6e298fe63ba2843bb2ca1"}, + {file = "dulwich-0.21.7-cp39-cp39-win_amd64.whl", hash = "sha256:404b8edeb3c3a86c47c0a498699fc064c93fa1f8bab2ffe919e8ab03eafaaad3"}, + {file = "dulwich-0.21.7-pp310-pypy310_pp73-macosx_10_9_x86_64.whl", hash = "sha256:e598d743c6c0548ebcd2baf94aa9c8bfacb787ea671eeeb5828cfbd7d56b552f"}, + {file = "dulwich-0.21.7-pp310-pypy310_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:d4a2d76c96426e791556836ef43542b639def81be4f1d6d4322cd886c115eae1"}, + {file = "dulwich-0.21.7-pp310-pypy310_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:f6c88acb60a1f4d31bd6d13bfba465853b3df940ee4a0f2a3d6c7a0778c705b7"}, + {file = "dulwich-0.21.7-pp310-pypy310_pp73-win_amd64.whl", hash = "sha256:ecd315847dea406a4decfa39d388a2521e4e31acde3bd9c2609c989e817c6d62"}, + {file = "dulwich-0.21.7-pp37-pypy37_pp73-macosx_10_9_x86_64.whl", hash = "sha256:d05d3c781bc74e2c2a2a8f4e4e2ed693540fbe88e6ac36df81deac574a6dad99"}, + {file = "dulwich-0.21.7-pp37-pypy37_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:6de6f8de4a453fdbae8062a6faa652255d22a3d8bce0cd6d2d6701305c75f2b3"}, + {file = "dulwich-0.21.7-pp37-pypy37_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:e25953c7acbbe4e19650d0225af1c0c0e6882f8bddd2056f75c1cc2b109b88ad"}, + {file = "dulwich-0.21.7-pp37-pypy37_pp73-win_amd64.whl", hash = "sha256:4637cbd8ed1012f67e1068aaed19fcc8b649bcf3e9e26649826a303298c89b9d"}, + {file = "dulwich-0.21.7-pp38-pypy38_pp73-macosx_10_9_x86_64.whl", hash = "sha256:858842b30ad6486aacaa607d60bab9c9a29e7c59dc2d9cb77ae5a94053878c08"}, + {file = "dulwich-0.21.7-pp38-pypy38_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:739b191f61e1c4ce18ac7d520e7a7cbda00e182c3489552408237200ce8411ad"}, + {file = "dulwich-0.21.7-pp38-pypy38_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:274c18ec3599a92a9b67abaf110e4f181a4f779ee1aaab9e23a72e89d71b2bd9"}, + {file = "dulwich-0.21.7-pp38-pypy38_pp73-win_amd64.whl", hash = "sha256:2590e9b431efa94fc356ae33b38f5e64f1834ec3a94a6ac3a64283b206d07aa3"}, + {file = "dulwich-0.21.7-pp39-pypy39_pp73-macosx_10_9_x86_64.whl", hash = "sha256:ed60d1f610ef6437586f7768254c2a93820ccbd4cfdac7d182cf2d6e615969bb"}, + {file = "dulwich-0.21.7-pp39-pypy39_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:8278835e168dd097089f9e53088c7a69c6ca0841aef580d9603eafe9aea8c358"}, + {file = "dulwich-0.21.7-pp39-pypy39_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:ffc27fb063f740712e02b4d2f826aee8bbed737ed799962fef625e2ce56e2d29"}, + {file = "dulwich-0.21.7-pp39-pypy39_pp73-win_amd64.whl", hash = "sha256:61e3451bd3d3844f2dca53f131982553be4d1b1e1ebd9db701843dd76c4dba31"}, + {file = "dulwich-0.21.7.tar.gz", hash = "sha256:a9e9c66833cea580c3ac12927e4b9711985d76afca98da971405d414de60e968"}, +] + +[package.dependencies] +urllib3 = ">=1.25" + +[package.extras] +fastimport = ["fastimport"] +https = ["urllib3 (>=1.24.1)"] +paramiko = ["paramiko"] +pgp = ["gpg"] + [[package]] name = "environs" version = "11.0.0" @@ -1212,6 +1382,22 @@ pandas = ">=1.5.0" [package.extras] lzo = ["python-lzo"] +[[package]] +name = "filelock" +version = "3.14.0" +description = "A platform independent file lock." +optional = false +python-versions = ">=3.8" +files = [ + {file = "filelock-3.14.0-py3-none-any.whl", hash = "sha256:43339835842f110ca7ae60f1e1c160714c5a6afd15a2873419ab185334975c0f"}, + {file = "filelock-3.14.0.tar.gz", hash = "sha256:6ea72da3be9b8c82afd3edcf99f2fffbb5076335a5ae4d03248bb5b6c3eae78a"}, +] + +[package.extras] +docs = ["furo (>=2023.9.10)", "sphinx (>=7.2.6)", "sphinx-autodoc-typehints (>=1.25.2)"] +testing = ["covdefaults (>=2.3)", "coverage (>=7.3.2)", "diff-cover (>=8.0.1)", "pytest (>=7.4.3)", "pytest-cov (>=4.1)", "pytest-mock (>=3.12)", "pytest-timeout (>=2.2)"] +typing = ["typing-extensions (>=4.8)"] + [[package]] name = "fonttools" version = "4.51.0" @@ -1290,13 +1476,13 @@ files = [ [[package]] name = "fsspec" -version = "2024.3.1" +version = "2024.5.0" description = "File-system specification" optional = false python-versions = ">=3.8" files = [ - {file = "fsspec-2024.3.1-py3-none-any.whl", hash = "sha256:918d18d41bf73f0e2b261824baeb1b124bcf771767e3a26425cd7dec3332f512"}, - {file = "fsspec-2024.3.1.tar.gz", hash = "sha256:f39780e282d7d117ffb42bb96992f8a90795e4d0fb0f661a70ca39fe9c43ded9"}, + {file = "fsspec-2024.5.0-py3-none-any.whl", hash = "sha256:e0fdbc446d67e182f49a70b82cf7889028a63588fde6b222521f10937b2b670c"}, + {file = "fsspec-2024.5.0.tar.gz", hash = "sha256:1d021b0b0f933e3b3029ed808eb400c08ba101ca2de4b3483fbc9ca23fcee94a"}, ] [package.extras] @@ -1304,7 +1490,7 @@ abfs = ["adlfs"] adl = ["adlfs"] arrow = ["pyarrow (>=1)"] dask = ["dask", "distributed"] -devel = ["pytest", "pytest-cov"] +dev = ["pre-commit", "ruff"] dropbox = ["dropbox", "dropboxdrivefs", "requests"] full = ["adlfs", "aiohttp (!=4.0.0a0,!=4.0.0a1)", "dask", "distributed", "dropbox", "dropboxdrivefs", "fusepy", "gcsfs", "libarchive-c", "ocifs", "panel", "paramiko", "pyarrow (>=1)", "pygit2", "requests", "s3fs", "smbprotocol", "tqdm"] fuse = ["fusepy"] @@ -1321,6 +1507,9 @@ s3 = ["s3fs"] sftp = ["paramiko"] smb = ["smbprotocol"] ssh = ["paramiko"] +test = ["aiohttp (!=4.0.0a0,!=4.0.0a1)", "numpy", "pytest", "pytest-asyncio (!=0.22.0)", "pytest-benchmark", "pytest-cov", "pytest-mock", "pytest-recording", "pytest-rerunfailures", "requests"] +test-downstream = ["aiobotocore (>=2.5.4,<3.0.0)", "dask-expr", "dask[dataframe,test]", "moto[server] (>4,<5)", "pytest-timeout", "xarray"] +test-full = ["adlfs", "aiohttp (!=4.0.0a0,!=4.0.0a1)", "cloudpickle", "dask", "distributed", "dropbox", "dropboxdrivefs", "fastparquet", "fusepy", "gcsfs", "jinja2", "kerchunk", "libarchive-c", "lz4", "notebook", "numpy", "ocifs", "pandas", "panel", "paramiko", "pyarrow", "pyarrow (>=1)", "pyftpdlib", "pygit2", "pytest", "pytest-asyncio (!=0.22.0)", "pytest-benchmark", "pytest-cov", "pytest-mock", "pytest-recording", "pytest-rerunfailures", "python-snappy", "requests", "smbprotocol", "tqdm", "urllib3", "zarr", "zstandard"] tqdm = ["tqdm"] [[package]] @@ -1533,6 +1722,17 @@ files = [ {file = "iniconfig-2.0.0.tar.gz", hash = "sha256:2d91e135bf72d31a410b17c16da610a82cb55f6b0477d1a902134b24a455b8b3"}, ] +[[package]] +name = "installer" +version = "0.7.0" +description = "A library for installing Python wheels." +optional = false +python-versions = ">=3.7" +files = [ + {file = "installer-0.7.0-py3-none-any.whl", hash = "sha256:05d1933f0a5ba7d8d6296bb6d5018e7c94fa473ceb10cf198a92ccea19c27b53"}, + {file = "installer-0.7.0.tar.gz", hash = "sha256:a26d3e3116289bb08216e0d0f7d925fcef0b0194eedfa0c944bcaaa106c4b631"}, +] + [[package]] name = "ipykernel" version = "6.29.4" @@ -1653,6 +1853,24 @@ files = [ [package.dependencies] arrow = ">=0.15.0" +[[package]] +name = "jaraco-classes" +version = "3.4.0" +description = "Utility functions for Python class constructs" +optional = false +python-versions = ">=3.8" +files = [ + {file = "jaraco.classes-3.4.0-py3-none-any.whl", hash = "sha256:f662826b6bed8cace05e7ff873ce0f9283b5c924470fe664fff1c2f00f581790"}, + {file = "jaraco.classes-3.4.0.tar.gz", hash = "sha256:47a024b51d0239c0dd8c8540c6c7f484be3b8fcf0b2d85c13825780d3b3f3acd"}, +] + +[package.dependencies] +more-itertools = "*" + +[package.extras] +docs = ["furo", "jaraco.packaging (>=9.3)", "jaraco.tidelift (>=1.4)", "rst.linker (>=1.9)", "sphinx (>=3.5)", "sphinx-lint"] +testing = ["pytest (>=6)", "pytest-checkdocs (>=2.4)", "pytest-cov", "pytest-enabler (>=2.2)", "pytest-mypy", "pytest-ruff (>=0.2.1)"] + [[package]] name = "jedi" version = "0.19.1" @@ -1672,6 +1890,21 @@ docs = ["Jinja2 (==2.11.3)", "MarkupSafe (==1.1.1)", "Pygments (==2.8.1)", "alab qa = ["flake8 (==5.0.4)", "mypy (==0.971)", "types-setuptools (==67.2.0.1)"] testing = ["Django", "attrs", "colorama", "docopt", "pytest (<7.0.0)"] +[[package]] +name = "jeepney" +version = "0.8.0" +description = "Low-level, pure Python DBus protocol wrapper." +optional = false +python-versions = ">=3.7" +files = [ + {file = "jeepney-0.8.0-py3-none-any.whl", hash = "sha256:c0a454ad016ca575060802ee4d590dd912e35c122fa04e70306de3d076cce755"}, + {file = "jeepney-0.8.0.tar.gz", hash = "sha256:5efe48d255973902f6badc3ce55e2aa6c5c3b3bc642059ef3a91247bcfcc5806"}, +] + +[package.extras] +test = ["async-timeout", "pytest", "pytest-asyncio (>=0.17)", "pytest-trio", "testpath", "trio"] +trio = ["async_generator", "trio"] + [[package]] name = "jinja2" version = "3.1.4" @@ -1947,13 +2180,13 @@ test = ["jupyter-server (>=2.0.0)", "pytest (>=7.0)", "pytest-jupyter[server] (> [[package]] name = "jupyterlab" -version = "4.1.8" +version = "4.2.0" description = "JupyterLab computational environment" optional = false python-versions = ">=3.8" files = [ - {file = "jupyterlab-4.1.8-py3-none-any.whl", hash = "sha256:c3baf3a2f91f89d110ed5786cd18672b9a357129d4e389d2a0dead15e11a4d2c"}, - {file = "jupyterlab-4.1.8.tar.gz", hash = "sha256:3384aded8680e7ce504fd63b8bb89a39df21c9c7694d9e7dc4a68742cdb30f9b"}, + {file = "jupyterlab-4.2.0-py3-none-any.whl", hash = "sha256:0dfe9278e25a145362289c555d9beb505697d269c10e99909766af7c440ad3cc"}, + {file = "jupyterlab-4.2.0.tar.gz", hash = "sha256:356e9205a6a2ab689c47c8fe4919dba6c076e376d03f26baadc05748c2435dd5"}, ] [package.dependencies] @@ -1972,11 +2205,11 @@ tornado = ">=6.2.0" traitlets = "*" [package.extras] -dev = ["build", "bump2version", "coverage", "hatch", "pre-commit", "pytest-cov", "ruff (==0.2.0)"] +dev = ["build", "bump2version", "coverage", "hatch", "pre-commit", "pytest-cov", "ruff (==0.3.5)"] docs = ["jsx-lexer", "myst-parser", "pydata-sphinx-theme (>=0.13.0)", "pytest", "pytest-check-links", "pytest-jupyter", "sphinx (>=1.8,<7.3.0)", "sphinx-copybutton"] -docs-screenshots = ["altair (==5.2.0)", "ipython (==8.16.1)", "ipywidgets (==8.1.1)", "jupyterlab-geojson (==3.4.0)", "jupyterlab-language-pack-zh-cn (==4.0.post6)", "matplotlib (==3.8.2)", "nbconvert (>=7.0.0)", "pandas (==2.2.0)", "scipy (==1.12.0)", "vega-datasets (==0.9.0)"] +docs-screenshots = ["altair (==5.3.0)", "ipython (==8.16.1)", "ipywidgets (==8.1.2)", "jupyterlab-geojson (==3.4.0)", "jupyterlab-language-pack-zh-cn (==4.1.post2)", "matplotlib (==3.8.3)", "nbconvert (>=7.0.0)", "pandas (==2.2.1)", "scipy (==1.12.0)", "vega-datasets (==0.9.0)"] test = ["coverage", "pytest (>=7.0)", "pytest-check-links (>=0.7)", "pytest-console-scripts", "pytest-cov", "pytest-jupyter (>=0.5.3)", "pytest-timeout", "pytest-tornasync", "requests", "requests-cache", "virtualenv"] -upgrade-extension = ["copier (>=8.0,<9.0)", "jinja2-time (<0.3)", "pydantic (<2.0)", "pyyaml-include (<2.0)", "tomli-w (<2.0)"] +upgrade-extension = ["copier (>=8,<10)", "jinja2-time (<0.3)", "pydantic (<2.0)", "pyyaml-include (<2.0)", "tomli-w (<2.0)"] [[package]] name = "jupyterlab-pygments" @@ -2025,6 +2258,29 @@ files = [ {file = "jupyterlab_widgets-3.0.10.tar.gz", hash = "sha256:04f2ac04976727e4f9d0fa91cdc2f1ab860f965e504c29dbd6a65c882c9d04c0"}, ] +[[package]] +name = "keyring" +version = "24.3.1" +description = "Store and access your passwords safely." +optional = false +python-versions = ">=3.8" +files = [ + {file = "keyring-24.3.1-py3-none-any.whl", hash = "sha256:df38a4d7419a6a60fea5cef1e45a948a3e8430dd12ad88b0f423c5c143906218"}, + {file = "keyring-24.3.1.tar.gz", hash = "sha256:c3327b6ffafc0e8befbdb597cacdb4928ffe5c1212f7645f186e6d9957a898db"}, +] + +[package.dependencies] +importlib-metadata = {version = ">=4.11.4", markers = "python_version < \"3.12\""} +"jaraco.classes" = "*" +jeepney = {version = ">=0.4.2", markers = "sys_platform == \"linux\""} +pywin32-ctypes = {version = ">=0.2.0", markers = "sys_platform == \"win32\""} +SecretStorage = {version = ">=3.2", markers = "sys_platform == \"linux\""} + +[package.extras] +completion = ["shtab (>=1.1.0)"] +docs = ["furo", "jaraco.packaging (>=9.3)", "jaraco.tidelift (>=1.4)", "rst.linker (>=1.9)", "sphinx (<7.2.5)", "sphinx (>=3.5)", "sphinx-lint"] +testing = ["pytest (>=6)", "pytest-checkdocs (>=2.4)", "pytest-cov", "pytest-enabler (>=2.2)", "pytest-mypy", "pytest-ruff (>=0.2.1)"] + [[package]] name = "kiwisolver" version = "1.4.5" @@ -2351,39 +2607,40 @@ tests = ["pytest", "pytz", "simplejson"] [[package]] name = "matplotlib" -version = "3.8.4" +version = "3.9.0" description = "Python plotting package" optional = false python-versions = ">=3.9" files = [ - {file = "matplotlib-3.8.4-cp310-cp310-macosx_10_12_x86_64.whl", hash = "sha256:abc9d838f93583650c35eca41cfcec65b2e7cb50fd486da6f0c49b5e1ed23014"}, - {file = "matplotlib-3.8.4-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:8f65c9f002d281a6e904976007b2d46a1ee2bcea3a68a8c12dda24709ddc9106"}, - {file = "matplotlib-3.8.4-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:ce1edd9f5383b504dbc26eeea404ed0a00656c526638129028b758fd43fc5f10"}, - {file = "matplotlib-3.8.4-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:ecd79298550cba13a43c340581a3ec9c707bd895a6a061a78fa2524660482fc0"}, - {file = "matplotlib-3.8.4-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:90df07db7b599fe7035d2f74ab7e438b656528c68ba6bb59b7dc46af39ee48ef"}, - {file = "matplotlib-3.8.4-cp310-cp310-win_amd64.whl", hash = "sha256:ac24233e8f2939ac4fd2919eed1e9c0871eac8057666070e94cbf0b33dd9c338"}, - {file = "matplotlib-3.8.4-cp311-cp311-macosx_10_12_x86_64.whl", hash = "sha256:72f9322712e4562e792b2961971891b9fbbb0e525011e09ea0d1f416c4645661"}, - {file = "matplotlib-3.8.4-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:232ce322bfd020a434caaffbd9a95333f7c2491e59cfc014041d95e38ab90d1c"}, - {file = "matplotlib-3.8.4-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:6addbd5b488aedb7f9bc19f91cd87ea476206f45d7116fcfe3d31416702a82fa"}, - {file = "matplotlib-3.8.4-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:cc4ccdc64e3039fc303defd119658148f2349239871db72cd74e2eeaa9b80b71"}, - {file = "matplotlib-3.8.4-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:b7a2a253d3b36d90c8993b4620183b55665a429da8357a4f621e78cd48b2b30b"}, - {file = "matplotlib-3.8.4-cp311-cp311-win_amd64.whl", hash = "sha256:8080d5081a86e690d7688ffa542532e87f224c38a6ed71f8fbed34dd1d9fedae"}, - {file = "matplotlib-3.8.4-cp312-cp312-macosx_10_12_x86_64.whl", hash = "sha256:6485ac1f2e84676cff22e693eaa4fbed50ef5dc37173ce1f023daef4687df616"}, - {file = "matplotlib-3.8.4-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:c89ee9314ef48c72fe92ce55c4e95f2f39d70208f9f1d9db4e64079420d8d732"}, - {file = "matplotlib-3.8.4-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:50bac6e4d77e4262c4340d7a985c30912054745ec99756ce213bfbc3cb3808eb"}, - {file = "matplotlib-3.8.4-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:f51c4c869d4b60d769f7b4406eec39596648d9d70246428745a681c327a8ad30"}, - {file = "matplotlib-3.8.4-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:b12ba985837e4899b762b81f5b2845bd1a28f4fdd1a126d9ace64e9c4eb2fb25"}, - {file = "matplotlib-3.8.4-cp312-cp312-win_amd64.whl", hash = "sha256:7a6769f58ce51791b4cb8b4d7642489df347697cd3e23d88266aaaee93b41d9a"}, - {file = "matplotlib-3.8.4-cp39-cp39-macosx_10_12_x86_64.whl", hash = "sha256:843cbde2f0946dadd8c5c11c6d91847abd18ec76859dc319362a0964493f0ba6"}, - {file = "matplotlib-3.8.4-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:1c13f041a7178f9780fb61cc3a2b10423d5e125480e4be51beaf62b172413b67"}, - {file = "matplotlib-3.8.4-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:fb44f53af0a62dc80bba4443d9b27f2fde6acfdac281d95bc872dc148a6509cc"}, - {file = "matplotlib-3.8.4-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:606e3b90897554c989b1e38a258c626d46c873523de432b1462f295db13de6f9"}, - {file = "matplotlib-3.8.4-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:9bb0189011785ea794ee827b68777db3ca3f93f3e339ea4d920315a0e5a78d54"}, - {file = "matplotlib-3.8.4-cp39-cp39-win_amd64.whl", hash = "sha256:6209e5c9aaccc056e63b547a8152661324404dd92340a6e479b3a7f24b42a5d0"}, - {file = "matplotlib-3.8.4-pp39-pypy39_pp73-macosx_10_12_x86_64.whl", hash = "sha256:c7064120a59ce6f64103c9cefba8ffe6fba87f2c61d67c401186423c9a20fd35"}, - {file = "matplotlib-3.8.4-pp39-pypy39_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:a0e47eda4eb2614300fc7bb4657fced3e83d6334d03da2173b09e447418d499f"}, - {file = "matplotlib-3.8.4-pp39-pypy39_pp73-win_amd64.whl", hash = "sha256:493e9f6aa5819156b58fce42b296ea31969f2aab71c5b680b4ea7a3cb5c07d94"}, - {file = "matplotlib-3.8.4.tar.gz", hash = "sha256:8aac397d5e9ec158960e31c381c5ffc52ddd52bd9a47717e2a694038167dffea"}, + {file = "matplotlib-3.9.0-cp310-cp310-macosx_10_12_x86_64.whl", hash = "sha256:2bcee1dffaf60fe7656183ac2190bd630842ff87b3153afb3e384d966b57fe56"}, + {file = "matplotlib-3.9.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:3f988bafb0fa39d1074ddd5bacd958c853e11def40800c5824556eb630f94d3b"}, + {file = "matplotlib-3.9.0-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:fe428e191ea016bb278758c8ee82a8129c51d81d8c4bc0846c09e7e8e9057241"}, + {file = "matplotlib-3.9.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:eaf3978060a106fab40c328778b148f590e27f6fa3cd15a19d6892575bce387d"}, + {file = "matplotlib-3.9.0-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:2e7f03e5cbbfacdd48c8ea394d365d91ee8f3cae7e6ec611409927b5ed997ee4"}, + {file = "matplotlib-3.9.0-cp310-cp310-win_amd64.whl", hash = "sha256:13beb4840317d45ffd4183a778685e215939be7b08616f431c7795276e067463"}, + {file = "matplotlib-3.9.0-cp311-cp311-macosx_10_12_x86_64.whl", hash = "sha256:063af8587fceeac13b0936c42a2b6c732c2ab1c98d38abc3337e430e1ff75e38"}, + {file = "matplotlib-3.9.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:9a2fa6d899e17ddca6d6526cf6e7ba677738bf2a6a9590d702c277204a7c6152"}, + {file = "matplotlib-3.9.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:550cdda3adbd596078cca7d13ed50b77879104e2e46392dcd7c75259d8f00e85"}, + {file = "matplotlib-3.9.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:76cce0f31b351e3551d1f3779420cf8f6ec0d4a8cf9c0237a3b549fd28eb4abb"}, + {file = "matplotlib-3.9.0-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:c53aeb514ccbbcbab55a27f912d79ea30ab21ee0531ee2c09f13800efb272674"}, + {file = "matplotlib-3.9.0-cp311-cp311-win_amd64.whl", hash = "sha256:a5be985db2596d761cdf0c2eaf52396f26e6a64ab46bd8cd810c48972349d1be"}, + {file = "matplotlib-3.9.0-cp312-cp312-macosx_10_12_x86_64.whl", hash = "sha256:c79f3a585f1368da6049318bdf1f85568d8d04b2e89fc24b7e02cc9b62017382"}, + {file = "matplotlib-3.9.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:bdd1ecbe268eb3e7653e04f451635f0fb0f77f07fd070242b44c076c9106da84"}, + {file = "matplotlib-3.9.0-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:d38e85a1a6d732f645f1403ce5e6727fd9418cd4574521d5803d3d94911038e5"}, + {file = "matplotlib-3.9.0-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:0a490715b3b9984fa609116481b22178348c1a220a4499cda79132000a79b4db"}, + {file = "matplotlib-3.9.0-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:8146ce83cbc5dc71c223a74a1996d446cd35cfb6a04b683e1446b7e6c73603b7"}, + {file = "matplotlib-3.9.0-cp312-cp312-win_amd64.whl", hash = "sha256:d91a4ffc587bacf5c4ce4ecfe4bcd23a4b675e76315f2866e588686cc97fccdf"}, + {file = "matplotlib-3.9.0-cp39-cp39-macosx_10_12_x86_64.whl", hash = "sha256:616fabf4981a3b3c5a15cd95eba359c8489c4e20e03717aea42866d8d0465956"}, + {file = "matplotlib-3.9.0-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:cd53c79fd02f1c1808d2cfc87dd3cf4dbc63c5244a58ee7944497107469c8d8a"}, + {file = "matplotlib-3.9.0-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:06a478f0d67636554fa78558cfbcd7b9dba85b51f5c3b5a0c9be49010cf5f321"}, + {file = "matplotlib-3.9.0-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:81c40af649d19c85f8073e25e5806926986806fa6d54be506fbf02aef47d5a89"}, + {file = "matplotlib-3.9.0-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:52146fc3bd7813cc784562cb93a15788be0b2875c4655e2cc6ea646bfa30344b"}, + {file = "matplotlib-3.9.0-cp39-cp39-win_amd64.whl", hash = "sha256:0fc51eaa5262553868461c083d9adadb11a6017315f3a757fc45ec6ec5f02888"}, + {file = "matplotlib-3.9.0-pp39-pypy39_pp73-macosx_10_12_x86_64.whl", hash = "sha256:bd4f2831168afac55b881db82a7730992aa41c4f007f1913465fb182d6fb20c0"}, + {file = "matplotlib-3.9.0-pp39-pypy39_pp73-macosx_11_0_arm64.whl", hash = "sha256:290d304e59be2b33ef5c2d768d0237f5bd132986bdcc66f80bc9bcc300066a03"}, + {file = "matplotlib-3.9.0-pp39-pypy39_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:7ff2e239c26be4f24bfa45860c20ffccd118d270c5b5d081fa4ea409b5469fcd"}, + {file = "matplotlib-3.9.0-pp39-pypy39_pp73-win_amd64.whl", hash = "sha256:af4001b7cae70f7eaacfb063db605280058246de590fa7874f00f62259f2df7e"}, + {file = "matplotlib-3.9.0.tar.gz", hash = "sha256:e6d29ea6c19e34b30fb7d88b7081f869a03014f66fe06d62cc77d5a6ea88ed7a"}, ] [package.dependencies] @@ -2391,12 +2648,15 @@ contourpy = ">=1.0.1" cycler = ">=0.10" fonttools = ">=4.22.0" kiwisolver = ">=1.3.1" -numpy = ">=1.21" +numpy = ">=1.23" packaging = ">=20.0" pillow = ">=8" pyparsing = ">=2.3.1" python-dateutil = ">=2.7" +[package.extras] +dev = ["meson-python (>=0.13.1)", "numpy (>=1.25)", "pybind11 (>=2.6)", "setuptools (>=64)", "setuptools_scm (>=7)"] + [[package]] name = "matplotlib-inline" version = "0.1.7" @@ -2452,6 +2712,17 @@ files = [ {file = "mistune-3.0.2.tar.gz", hash = "sha256:fc7f93ded930c92394ef2cb6f04a8aabab4117a91449e72dcc8dfa646a508be8"}, ] +[[package]] +name = "more-itertools" +version = "10.2.0" +description = "More routines for operating on iterables, beyond itertools" +optional = false +python-versions = ">=3.8" +files = [ + {file = "more-itertools-10.2.0.tar.gz", hash = "sha256:8fccb480c43d3e99a00087634c06dd02b0d50fbf088b380de5a41a015ec239e1"}, + {file = "more_itertools-10.2.0-py3-none-any.whl", hash = "sha256:686b06abe565edfab151cb8fd385a05651e1fdf8f0a14191e4439283421f8684"}, +] + [[package]] name = "msal" version = "1.28.0" @@ -2490,6 +2761,71 @@ portalocker = [ {version = ">=1.6,<3", markers = "platform_system == \"Windows\""}, ] +[[package]] +name = "msgpack" +version = "1.0.8" +description = "MessagePack serializer" +optional = false +python-versions = ">=3.8" +files = [ + {file = "msgpack-1.0.8-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:505fe3d03856ac7d215dbe005414bc28505d26f0c128906037e66d98c4e95868"}, + {file = "msgpack-1.0.8-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:e6b7842518a63a9f17107eb176320960ec095a8ee3b4420b5f688e24bf50c53c"}, + {file = "msgpack-1.0.8-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:376081f471a2ef24828b83a641a02c575d6103a3ad7fd7dade5486cad10ea659"}, + {file = "msgpack-1.0.8-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:5e390971d082dba073c05dbd56322427d3280b7cc8b53484c9377adfbae67dc2"}, + {file = "msgpack-1.0.8-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:00e073efcba9ea99db5acef3959efa45b52bc67b61b00823d2a1a6944bf45982"}, + {file = "msgpack-1.0.8-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:82d92c773fbc6942a7a8b520d22c11cfc8fd83bba86116bfcf962c2f5c2ecdaa"}, + {file = "msgpack-1.0.8-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:9ee32dcb8e531adae1f1ca568822e9b3a738369b3b686d1477cbc643c4a9c128"}, + {file = "msgpack-1.0.8-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:e3aa7e51d738e0ec0afbed661261513b38b3014754c9459508399baf14ae0c9d"}, + {file = "msgpack-1.0.8-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:69284049d07fce531c17404fcba2bb1df472bc2dcdac642ae71a2d079d950653"}, + {file = "msgpack-1.0.8-cp310-cp310-win32.whl", hash = "sha256:13577ec9e247f8741c84d06b9ece5f654920d8365a4b636ce0e44f15e07ec693"}, + {file = "msgpack-1.0.8-cp310-cp310-win_amd64.whl", hash = "sha256:e532dbd6ddfe13946de050d7474e3f5fb6ec774fbb1a188aaf469b08cf04189a"}, + {file = "msgpack-1.0.8-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:9517004e21664f2b5a5fd6333b0731b9cf0817403a941b393d89a2f1dc2bd836"}, + {file = "msgpack-1.0.8-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:d16a786905034e7e34098634b184a7d81f91d4c3d246edc6bd7aefb2fd8ea6ad"}, + {file = "msgpack-1.0.8-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:e2872993e209f7ed04d963e4b4fbae72d034844ec66bc4ca403329db2074377b"}, + {file = "msgpack-1.0.8-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:5c330eace3dd100bdb54b5653b966de7f51c26ec4a7d4e87132d9b4f738220ba"}, + {file = "msgpack-1.0.8-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:83b5c044f3eff2a6534768ccfd50425939e7a8b5cf9a7261c385de1e20dcfc85"}, + {file = "msgpack-1.0.8-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:1876b0b653a808fcd50123b953af170c535027bf1d053b59790eebb0aeb38950"}, + {file = "msgpack-1.0.8-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:dfe1f0f0ed5785c187144c46a292b8c34c1295c01da12e10ccddfc16def4448a"}, + {file = "msgpack-1.0.8-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:3528807cbbb7f315bb81959d5961855e7ba52aa60a3097151cb21956fbc7502b"}, + {file = "msgpack-1.0.8-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:e2f879ab92ce502a1e65fce390eab619774dda6a6ff719718069ac94084098ce"}, + {file = "msgpack-1.0.8-cp311-cp311-win32.whl", hash = "sha256:26ee97a8261e6e35885c2ecd2fd4a6d38252246f94a2aec23665a4e66d066305"}, + {file = "msgpack-1.0.8-cp311-cp311-win_amd64.whl", hash = "sha256:eadb9f826c138e6cf3c49d6f8de88225a3c0ab181a9b4ba792e006e5292d150e"}, + {file = "msgpack-1.0.8-cp312-cp312-macosx_10_9_universal2.whl", hash = "sha256:114be227f5213ef8b215c22dde19532f5da9652e56e8ce969bf0a26d7c419fee"}, + {file = "msgpack-1.0.8-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:d661dc4785affa9d0edfdd1e59ec056a58b3dbb9f196fa43587f3ddac654ac7b"}, + {file = "msgpack-1.0.8-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:d56fd9f1f1cdc8227d7b7918f55091349741904d9520c65f0139a9755952c9e8"}, + {file = "msgpack-1.0.8-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:0726c282d188e204281ebd8de31724b7d749adebc086873a59efb8cf7ae27df3"}, + {file = "msgpack-1.0.8-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:8db8e423192303ed77cff4dce3a4b88dbfaf43979d280181558af5e2c3c71afc"}, + {file = "msgpack-1.0.8-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:99881222f4a8c2f641f25703963a5cefb076adffd959e0558dc9f803a52d6a58"}, + {file = "msgpack-1.0.8-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:b5505774ea2a73a86ea176e8a9a4a7c8bf5d521050f0f6f8426afe798689243f"}, + {file = "msgpack-1.0.8-cp312-cp312-musllinux_1_1_i686.whl", hash = "sha256:ef254a06bcea461e65ff0373d8a0dd1ed3aa004af48839f002a0c994a6f72d04"}, + {file = "msgpack-1.0.8-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:e1dd7839443592d00e96db831eddb4111a2a81a46b028f0facd60a09ebbdd543"}, + {file = "msgpack-1.0.8-cp312-cp312-win32.whl", hash = "sha256:64d0fcd436c5683fdd7c907eeae5e2cbb5eb872fafbc03a43609d7941840995c"}, + {file = "msgpack-1.0.8-cp312-cp312-win_amd64.whl", hash = "sha256:74398a4cf19de42e1498368c36eed45d9528f5fd0155241e82c4082b7e16cffd"}, + {file = "msgpack-1.0.8-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:0ceea77719d45c839fd73abcb190b8390412a890df2f83fb8cf49b2a4b5c2f40"}, + {file = "msgpack-1.0.8-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:1ab0bbcd4d1f7b6991ee7c753655b481c50084294218de69365f8f1970d4c151"}, + {file = "msgpack-1.0.8-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:1cce488457370ffd1f953846f82323cb6b2ad2190987cd4d70b2713e17268d24"}, + {file = "msgpack-1.0.8-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:3923a1778f7e5ef31865893fdca12a8d7dc03a44b33e2a5f3295416314c09f5d"}, + {file = "msgpack-1.0.8-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:a22e47578b30a3e199ab067a4d43d790249b3c0587d9a771921f86250c8435db"}, + {file = "msgpack-1.0.8-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:bd739c9251d01e0279ce729e37b39d49a08c0420d3fee7f2a4968c0576678f77"}, + {file = "msgpack-1.0.8-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:d3420522057ebab1728b21ad473aa950026d07cb09da41103f8e597dfbfaeb13"}, + {file = "msgpack-1.0.8-cp38-cp38-musllinux_1_1_i686.whl", hash = "sha256:5845fdf5e5d5b78a49b826fcdc0eb2e2aa7191980e3d2cfd2a30303a74f212e2"}, + {file = "msgpack-1.0.8-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:6a0e76621f6e1f908ae52860bdcb58e1ca85231a9b0545e64509c931dd34275a"}, + {file = "msgpack-1.0.8-cp38-cp38-win32.whl", hash = "sha256:374a8e88ddab84b9ada695d255679fb99c53513c0a51778796fcf0944d6c789c"}, + {file = "msgpack-1.0.8-cp38-cp38-win_amd64.whl", hash = "sha256:f3709997b228685fe53e8c433e2df9f0cdb5f4542bd5114ed17ac3c0129b0480"}, + {file = "msgpack-1.0.8-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:f51bab98d52739c50c56658cc303f190785f9a2cd97b823357e7aeae54c8f68a"}, + {file = "msgpack-1.0.8-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:73ee792784d48aa338bba28063e19a27e8d989344f34aad14ea6e1b9bd83f596"}, + {file = "msgpack-1.0.8-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:f9904e24646570539a8950400602d66d2b2c492b9010ea7e965025cb71d0c86d"}, + {file = "msgpack-1.0.8-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:e75753aeda0ddc4c28dce4c32ba2f6ec30b1b02f6c0b14e547841ba5b24f753f"}, + {file = "msgpack-1.0.8-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:5dbf059fb4b7c240c873c1245ee112505be27497e90f7c6591261c7d3c3a8228"}, + {file = "msgpack-1.0.8-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:4916727e31c28be8beaf11cf117d6f6f188dcc36daae4e851fee88646f5b6b18"}, + {file = "msgpack-1.0.8-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:7938111ed1358f536daf311be244f34df7bf3cdedb3ed883787aca97778b28d8"}, + {file = "msgpack-1.0.8-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:493c5c5e44b06d6c9268ce21b302c9ca055c1fd3484c25ba41d34476c76ee746"}, + {file = "msgpack-1.0.8-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:5fbb160554e319f7b22ecf530a80a3ff496d38e8e07ae763b9e82fadfe96f273"}, + {file = "msgpack-1.0.8-cp39-cp39-win32.whl", hash = "sha256:f9af38a89b6a5c04b7d18c492c8ccf2aee7048aff1ce8437c4683bb5a1df893d"}, + {file = "msgpack-1.0.8-cp39-cp39-win_amd64.whl", hash = "sha256:ed59dd52075f8fc91da6053b12e8c89e37aa043f8986efd89e61fae69dc1b011"}, + {file = "msgpack-1.0.8.tar.gz", hash = "sha256:95c02b0e27e706e48d0e5426d1710ca78e0f0628d6e89d5b5a5b91a5f12274f3"}, +] + [[package]] name = "nbclient" version = "0.10.0" @@ -2640,26 +2976,26 @@ setuptools = "*" [[package]] name = "notebook" -version = "7.1.3" +version = "7.2.0" description = "Jupyter Notebook - A web-based notebook environment for interactive computing" optional = false python-versions = ">=3.8" files = [ - {file = "notebook-7.1.3-py3-none-any.whl", hash = "sha256:919b911e59f41f6e3857ce93c9d93535ba66bb090059712770e5968c07e1004d"}, - {file = "notebook-7.1.3.tar.gz", hash = "sha256:41fcebff44cf7bb9377180808bcbae066629b55d8c7722f1ebbe75ca44f9cfc1"}, + {file = "notebook-7.2.0-py3-none-any.whl", hash = "sha256:b4752d7407d6c8872fc505df0f00d3cae46e8efb033b822adacbaa3f1f3ce8f5"}, + {file = "notebook-7.2.0.tar.gz", hash = "sha256:34a2ba4b08ad5d19ec930db7484fb79746a1784be9e1a5f8218f9af8656a141f"}, ] [package.dependencies] jupyter-server = ">=2.4.0,<3" -jupyterlab = ">=4.1.1,<4.2" -jupyterlab-server = ">=2.22.1,<3" +jupyterlab = ">=4.2.0,<4.3" +jupyterlab-server = ">=2.27.1,<3" notebook-shim = ">=0.2,<0.3" tornado = ">=6.2.0" [package.extras] dev = ["hatch", "pre-commit"] docs = ["myst-parser", "nbsphinx", "pydata-sphinx-theme", "sphinx (>=1.3.6)", "sphinxcontrib-github-alt", "sphinxcontrib-spelling"] -test = ["importlib-resources (>=5.0)", "ipykernel", "jupyter-server[test] (>=2.4.0,<3)", "jupyterlab-server[test] (>=2.22.1,<3)", "nbval", "pytest (>=7.0)", "pytest-console-scripts", "pytest-timeout", "pytest-tornasync", "requests"] +test = ["importlib-resources (>=5.0)", "ipykernel", "jupyter-server[test] (>=2.4.0,<3)", "jupyterlab-server[test] (>=2.27.1,<3)", "nbval", "pytest (>=7.0)", "pytest-console-scripts", "pytest-timeout", "pytest-tornasync", "requests"] [[package]] name = "notebook-shim" @@ -2810,7 +3146,6 @@ optional = false python-versions = ">=3.9" files = [ {file = "pandas-2.2.2-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:90c6fca2acf139569e74e8781709dccb6fe25940488755716d1d354d6bc58bce"}, - {file = "pandas-2.2.2-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:c7adfc142dac335d8c1e0dcbd37eb8617eac386596eb9e1a1b77791cf2498238"}, {file = "pandas-2.2.2-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:4abfe0be0d7221be4f12552995e58723c7422c80a659da13ca382697de830c08"}, {file = "pandas-2.2.2-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:8635c16bf3d99040fdf3ca3db669a7250ddf49c55dc4aa8fe0ae0fa8d6dcc1f0"}, {file = "pandas-2.2.2-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:40ae1dffb3967a52203105a077415a86044a2bea011b5f321c6aa64b379a3f51"}, @@ -2831,7 +3166,6 @@ files = [ {file = "pandas-2.2.2-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:43498c0bdb43d55cb162cdc8c06fac328ccb5d2eabe3cadeb3529ae6f0517c32"}, {file = "pandas-2.2.2-cp312-cp312-win_amd64.whl", hash = "sha256:d187d355ecec3629624fccb01d104da7d7f391db0311145817525281e2804d23"}, {file = "pandas-2.2.2-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:0ca6377b8fca51815f382bd0b697a0814c8bda55115678cbc94c30aacbb6eff2"}, - {file = "pandas-2.2.2-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:9057e6aa78a584bc93a13f0a9bf7e753a5e9770a30b4d758b8d5f2a62a9433cd"}, {file = "pandas-2.2.2-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:001910ad31abc7bf06f49dcc903755d2f7f3a9186c0c040b827e522e9cef0863"}, {file = "pandas-2.2.2-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:66b479b0bd07204e37583c191535505410daa8df638fd8e75ae1b383851fe921"}, {file = "pandas-2.2.2-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:a77e9d1c386196879aa5eb712e77461aaee433e54c68cf253053a73b7e49c33a"}, @@ -3047,15 +3381,29 @@ tests = ["check-manifest", "coverage", "defusedxml", "markdown2", "olefile", "pa typing = ["typing-extensions"] xmp = ["defusedxml"] +[[package]] +name = "pkginfo" +version = "1.10.0" +description = "Query metadata from sdists / bdists / installed packages." +optional = false +python-versions = ">=3.6" +files = [ + {file = "pkginfo-1.10.0-py3-none-any.whl", hash = "sha256:889a6da2ed7ffc58ab5b900d888ddce90bce912f2d2de1dc1c26f4cb9fe65097"}, + {file = "pkginfo-1.10.0.tar.gz", hash = "sha256:5df73835398d10db79f8eecd5cd86b1f6d29317589ea70796994d49399af6297"}, +] + +[package.extras] +testing = ["pytest", "pytest-cov", "wheel"] + [[package]] name = "platformdirs" -version = "4.2.1" +version = "4.2.2" description = "A small Python package for determining appropriate platform-specific dirs, e.g. a `user data dir`." optional = false python-versions = ">=3.8" files = [ - {file = "platformdirs-4.2.1-py3-none-any.whl", hash = "sha256:17d5a1161b3fd67b390023cb2d3b026bbd40abde6fdb052dfbd3a29c3ba22ee1"}, - {file = "platformdirs-4.2.1.tar.gz", hash = "sha256:031cd18d4ec63ec53e82dceaac0417d218a6863f7745dfcc9efe7793b7039bdf"}, + {file = "platformdirs-4.2.2-py3-none-any.whl", hash = "sha256:2d7a1657e36a80ea911db832a8a6ece5ee53d8de21edd5cc5879af6530b1bfee"}, + {file = "platformdirs-4.2.2.tar.gz", hash = "sha256:38b7b51f512eed9e84a22788b4bce1de17c0adb134d6becb09836e37d8654cd3"}, ] [package.extras] @@ -3096,6 +3444,68 @@ tomli = ">=1.2.2" [package.extras] poetry-plugin = ["poetry (>=1.0,<2.0)"] +[[package]] +name = "poetry" +version = "1.8.3" +description = "Python dependency management and packaging made easy." +optional = false +python-versions = "<4.0,>=3.8" +files = [ + {file = "poetry-1.8.3-py3-none-any.whl", hash = "sha256:88191c69b08d06f9db671b793d68f40048e8904c0718404b63dcc2b5aec62d13"}, + {file = "poetry-1.8.3.tar.gz", hash = "sha256:67f4eb68288eab41e841cc71a00d26cf6bdda9533022d0189a145a34d0a35f48"}, +] + +[package.dependencies] +build = ">=1.0.3,<2.0.0" +cachecontrol = {version = ">=0.14.0,<0.15.0", extras = ["filecache"]} +cleo = ">=2.1.0,<3.0.0" +crashtest = ">=0.4.1,<0.5.0" +dulwich = ">=0.21.2,<0.22.0" +fastjsonschema = ">=2.18.0,<3.0.0" +installer = ">=0.7.0,<0.8.0" +keyring = ">=24.0.0,<25.0.0" +packaging = ">=23.1" +pexpect = ">=4.7.0,<5.0.0" +pkginfo = ">=1.10,<2.0" +platformdirs = ">=3.0.0,<5" +poetry-core = "1.9.0" +poetry-plugin-export = ">=1.6.0,<2.0.0" +pyproject-hooks = ">=1.0.0,<2.0.0" +requests = ">=2.26,<3.0" +requests-toolbelt = ">=1.0.0,<2.0.0" +shellingham = ">=1.5,<2.0" +tomli = {version = ">=2.0.1,<3.0.0", markers = "python_version < \"3.11\""} +tomlkit = ">=0.11.4,<1.0.0" +trove-classifiers = ">=2022.5.19" +virtualenv = ">=20.23.0,<21.0.0" +xattr = {version = ">=1.0.0,<2.0.0", markers = "sys_platform == \"darwin\""} + +[[package]] +name = "poetry-core" +version = "1.9.0" +description = "Poetry PEP 517 Build Backend" +optional = false +python-versions = ">=3.8,<4.0" +files = [ + {file = "poetry_core-1.9.0-py3-none-any.whl", hash = "sha256:4e0c9c6ad8cf89956f03b308736d84ea6ddb44089d16f2adc94050108ec1f5a1"}, + {file = "poetry_core-1.9.0.tar.gz", hash = "sha256:fa7a4001eae8aa572ee84f35feb510b321bd652e5cf9293249d62853e1f935a2"}, +] + +[[package]] +name = "poetry-plugin-export" +version = "1.8.0" +description = "Poetry plugin to export the dependencies to various formats" +optional = false +python-versions = "<4.0,>=3.8" +files = [ + {file = "poetry_plugin_export-1.8.0-py3-none-any.whl", hash = "sha256:adbe232cfa0cc04991ea3680c865cf748bff27593b9abcb1f35fb50ed7ba2c22"}, + {file = "poetry_plugin_export-1.8.0.tar.gz", hash = "sha256:1fa6168a85d59395d835ca564bc19862a7c76061e60c3e7dfaec70d50937fc61"}, +] + +[package.dependencies] +poetry = ">=1.8.0,<3.0.0" +poetry-core = ">=1.7.0,<3.0.0" + [[package]] name = "portalocker" version = "2.8.2" @@ -3539,15 +3949,26 @@ files = [ [package.extras] diagrams = ["jinja2", "railroad-diagrams"] +[[package]] +name = "pyproject-hooks" +version = "1.1.0" +description = "Wrappers to call pyproject.toml-based build backend hooks." +optional = false +python-versions = ">=3.7" +files = [ + {file = "pyproject_hooks-1.1.0-py3-none-any.whl", hash = "sha256:7ceeefe9aec63a1064c18d939bdc3adf2d8aa1988a510afec15151578b232aa2"}, + {file = "pyproject_hooks-1.1.0.tar.gz", hash = "sha256:4b37730834edbd6bd37f26ece6b44802fb1c1ee2ece0e54ddff8bfc06db86965"}, +] + [[package]] name = "pyright" -version = "1.1.362" +version = "1.1.363" description = "Command line wrapper for pyright" optional = false python-versions = ">=3.7" files = [ - {file = "pyright-1.1.362-py3-none-any.whl", hash = "sha256:969957cff45154d8a45a4ab1dae5bdc8223d8bd3c64654fa608ab3194dfff319"}, - {file = "pyright-1.1.362.tar.gz", hash = "sha256:6a477e448d4a07a6a0eab58b2a15a1bbed031eb3169fa809edee79cca168d83a"}, + {file = "pyright-1.1.363-py3-none-any.whl", hash = "sha256:d3b8d73c8d230e26cc3523862f3398032a0c39a00d7bb69dc0f595f8e888fd01"}, + {file = "pyright-1.1.363.tar.gz", hash = "sha256:00a8f0ae0e339473bb0488f8a2a2dcdf574e94a16cd7b4390d49d144714d8db2"}, ] [package.dependencies] @@ -3559,13 +3980,13 @@ dev = ["twine (>=3.4.1)"] [[package]] name = "pytest" -version = "8.2.0" +version = "8.2.1" description = "pytest: simple powerful testing with Python" optional = false python-versions = ">=3.8" files = [ - {file = "pytest-8.2.0-py3-none-any.whl", hash = "sha256:1733f0620f6cda4095bbf0d9ff8022486e91892245bb9e7d5542c018f612f233"}, - {file = "pytest-8.2.0.tar.gz", hash = "sha256:d507d4482197eac0ba2bae2e9babf0672eb333017bcedaa5fb1a3d42c1174b3f"}, + {file = "pytest-8.2.1-py3-none-any.whl", hash = "sha256:faccc5d332b8c3719f40283d0d44aa5cf101cec36f88cde9ed8f2bc0538612b1"}, + {file = "pytest-8.2.1.tar.gz", hash = "sha256:5046e5b46d8e4cac199c373041f26be56fdb81eb4e67dc11d4e10811fc3408fd"}, ] [package.dependencies] @@ -3581,13 +4002,13 @@ dev = ["argcomplete", "attrs (>=19.2)", "hypothesis (>=3.56)", "mock", "pygments [[package]] name = "pytest-asyncio" -version = "0.23.6" +version = "0.23.7" description = "Pytest support for asyncio" optional = false python-versions = ">=3.8" files = [ - {file = "pytest-asyncio-0.23.6.tar.gz", hash = "sha256:ffe523a89c1c222598c76856e76852b787504ddb72dd5d9b6617ffa8aa2cde5f"}, - {file = "pytest_asyncio-0.23.6-py3-none-any.whl", hash = "sha256:68516fdd1018ac57b846c9846b954f0393b26f094764a28c955eabb0536a4e8a"}, + {file = "pytest_asyncio-0.23.7-py3-none-any.whl", hash = "sha256:009b48127fbe44518a547bddd25611551b0e43ccdbf1e67d12479f569832c20b"}, + {file = "pytest_asyncio-0.23.7.tar.gz", hash = "sha256:5f5c72948f4c49e7db4f29f2521d4031f1c27f86e57b046126654083d4770268"}, ] [package.dependencies] @@ -3684,6 +4105,17 @@ files = [ {file = "pywin32-306-cp39-cp39-win_amd64.whl", hash = "sha256:39b61c15272833b5c329a2989999dcae836b1eed650252ab1b7bfbe1d59f30f4"}, ] +[[package]] +name = "pywin32-ctypes" +version = "0.2.2" +description = "A (partial) reimplementation of pywin32 using ctypes/cffi" +optional = false +python-versions = ">=3.6" +files = [ + {file = "pywin32-ctypes-0.2.2.tar.gz", hash = "sha256:3426e063bdd5fd4df74a14fa3cf80a0b42845a87e1d1e81f6549f9daec593a60"}, + {file = "pywin32_ctypes-0.2.2-py3-none-any.whl", hash = "sha256:bf490a1a709baf35d688fe0ecf980ed4de11d2b3e37b51e5442587a75d9957e7"}, +] + [[package]] name = "pywinpty" version = "2.0.13" @@ -3901,6 +4333,111 @@ packaging = "*" [package.extras] test = ["pytest (>=6,!=7.0.0,!=7.0.1)", "pytest-cov (>=3.0.0)", "pytest-qt"] +[[package]] +name = "rapidfuzz" +version = "3.9.1" +description = "rapid fuzzy string matching" +optional = false +python-versions = ">=3.8" +files = [ + {file = "rapidfuzz-3.9.1-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:5f897a9bff517d5c6af6a90131796b4298b547b9a9a4df3cf285006be33aae5b"}, + {file = "rapidfuzz-3.9.1-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:83c570ce23b447625929c0e7c4f2eab6d90f5a576db2b26a5aa0594a53d560ea"}, + {file = "rapidfuzz-3.9.1-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:e4c6b6455ee8404a663e15477a8bfe98b1afb329ff224bcf6d15f623a3761b95"}, + {file = "rapidfuzz-3.9.1-cp310-cp310-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:aa44aef769e5834fef4fde091fd646cc1c52a2813b3aa241ae54b3028960abaa"}, + {file = "rapidfuzz-3.9.1-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:25ea055ae40fb60f503f02b44b3ac35a39a9108be33f89e05b81bc4e3c849ec8"}, + {file = "rapidfuzz-3.9.1-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:fb592bad9d58b47c6681f0c180767d2c98775a35f7267131d33723139c3d6c2e"}, + {file = "rapidfuzz-3.9.1-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:eb023adfefa62410fff877f7cc70cd4758cbfbad963e87d146cf71b022dce197"}, + {file = "rapidfuzz-3.9.1-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:c883d2d2e31c759af1f3fdeb67ec151cf94e307f745b3d02ab3a2ef6595485f2"}, + {file = "rapidfuzz-3.9.1-cp310-cp310-musllinux_1_2_i686.whl", hash = "sha256:8e11405d81e8baea4999a5757a982009566cff8f6a121d5ccf042aab81ae0230"}, + {file = "rapidfuzz-3.9.1-cp310-cp310-musllinux_1_2_ppc64le.whl", hash = "sha256:02ed579f35ddd3552c7f74bc0c10800b432d9b09a4cebb19fd7a10b3b4759cc0"}, + {file = "rapidfuzz-3.9.1-cp310-cp310-musllinux_1_2_s390x.whl", hash = "sha256:9f8615a2a67a1f80b3aa7a3d7fbe6a2ed062a54c98988e3f9b664b49a3bc115e"}, + {file = "rapidfuzz-3.9.1-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:64058f4a3698c6c8464df47a3b7da303db2477b2447142da3e67fc091f4c366a"}, + {file = "rapidfuzz-3.9.1-cp310-cp310-win32.whl", hash = "sha256:2ef42c43c94139c890aeec40bc442c4bf8d48e15b456a88ce0f4cc5cfcad1896"}, + {file = "rapidfuzz-3.9.1-cp310-cp310-win_amd64.whl", hash = "sha256:c99d001c45c31c2cd2f7361bc2036d3062b21db5f43beea8bc5109d43fe9f283"}, + {file = "rapidfuzz-3.9.1-cp310-cp310-win_arm64.whl", hash = "sha256:da3f495cf4f7a443b34a6d3c6805265595fcd13641b3253a8e2034289d828dd9"}, + {file = "rapidfuzz-3.9.1-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:f8869dcf072227a40a6f9e87b3fc4eb020055a08ad12b63d751c354e3a973ccb"}, + {file = "rapidfuzz-3.9.1-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:9f66f9d5f14141b4b017e76118ec4bda29266f6b281989026e3a9ba1a2aaf032"}, + {file = "rapidfuzz-3.9.1-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:07decc6b058f935d2219423a50aac426027928cc734809f793bc250de4a3756e"}, + {file = "rapidfuzz-3.9.1-cp311-cp311-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:c125095d1828fa10ac79077594dd2d8829167d9e184e20baa97620fc52ebdcc9"}, + {file = "rapidfuzz-3.9.1-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:76a55bcc3abc9f8e38a1218cb5a09719126cfc4cba23ebd8caa27dfdc69cedd8"}, + {file = "rapidfuzz-3.9.1-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:50c2f7ad132dfeb6247c90b41431662af939a820f761cf930708d55912377ed8"}, + {file = "rapidfuzz-3.9.1-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:177bddf50577db59bcb00b6f7a5c2b70f2ec5a2aba40c8add7a6f7fd8609224e"}, + {file = "rapidfuzz-3.9.1-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:dec2792f864be731c8339cad99001caa6540aa909e6fd8bc688bb0419c501f44"}, + {file = "rapidfuzz-3.9.1-cp311-cp311-musllinux_1_2_i686.whl", hash = "sha256:c6437cba4b9460d5ee0bafd796e13ef9307091b81685bbe745b0f1619fb887ca"}, + {file = "rapidfuzz-3.9.1-cp311-cp311-musllinux_1_2_ppc64le.whl", hash = "sha256:874317057a58a9c6ddf59fe1491e478217daa9fdb043a00358a15de4f62f9a2d"}, + {file = "rapidfuzz-3.9.1-cp311-cp311-musllinux_1_2_s390x.whl", hash = "sha256:5d8eb7fe39e81dc1530a3ec81a35e69770839c76607c461eb9d0902427fab3e1"}, + {file = "rapidfuzz-3.9.1-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:08f85d6674d804a493c3e9ec10a807f9bd8f482781487eda064913b537f99d7f"}, + {file = "rapidfuzz-3.9.1-cp311-cp311-win32.whl", hash = "sha256:eadf8c4b24b63aef8810ed585c24ac1fc022ee771211772a6e9f78c63aa949ff"}, + {file = "rapidfuzz-3.9.1-cp311-cp311-win_amd64.whl", hash = "sha256:0e931539edeb9158ef83537cd571051f8a9608737642c20b088a37bd5d76c5c9"}, + {file = "rapidfuzz-3.9.1-cp311-cp311-win_arm64.whl", hash = "sha256:bcc0ffcaeb1e499e708f32ec30177ed690b3f25455c91ad8c2240986c69f9ebe"}, + {file = "rapidfuzz-3.9.1-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:8781e45c56f7f3a64940f4d594a4ffd69360147925a706569b2b0c57347b2225"}, + {file = "rapidfuzz-3.9.1-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:0edc950c6a04c19db10670cd04e33403b3eb0f175deb620f9668595d378b1005"}, + {file = "rapidfuzz-3.9.1-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:0ceb0d7bdec910d93793d32633ba0cb644356cf6778f9d91b727da0075beaec1"}, + {file = "rapidfuzz-3.9.1-cp312-cp312-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:4a231e8f3bae82f10e7188965b37c91d8bfb80136595c860c8a08eb0dd07764d"}, + {file = "rapidfuzz-3.9.1-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:9bfa8c0a8ce09b4bcd36322f8f375750dca160fbdbeb2e763a695cef3ae9133e"}, + {file = "rapidfuzz-3.9.1-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:1e872627d5359c840f3e431b0beb263518048917c3e076f624870552d84e7dc6"}, + {file = "rapidfuzz-3.9.1-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:7f006c3af82c478df09a790fb4846b5acd00a187d75715674d71f5dc0ac982ce"}, + {file = "rapidfuzz-3.9.1-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:32718fa69306df969bf4fca1719f8900b83df315a2a8153942d5b8906f4fd1d6"}, + {file = "rapidfuzz-3.9.1-cp312-cp312-musllinux_1_2_i686.whl", hash = "sha256:a89b219c1a7933a0673b2dbb1ffe701057d82e5cb843552be4f55b61b557031e"}, + {file = "rapidfuzz-3.9.1-cp312-cp312-musllinux_1_2_ppc64le.whl", hash = "sha256:b26cc9459e096959fab3a4a8a17b96a6c7c961f9db5c37c1c3c7a06789316cf7"}, + {file = "rapidfuzz-3.9.1-cp312-cp312-musllinux_1_2_s390x.whl", hash = "sha256:2f9044a4470343087cde10beaa36266519d5da110a9a4597b43e6aa35fa928d3"}, + {file = "rapidfuzz-3.9.1-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:a3a48fc6dc274b803a366a4baec99e212792ae1b1e73d42235b2042cd3ade7c1"}, + {file = "rapidfuzz-3.9.1-cp312-cp312-win32.whl", hash = "sha256:b71e7f99ed048a338e4a1ac34f56b3b3933a3ba2dfbb04450c786a8ddd97f4db"}, + {file = "rapidfuzz-3.9.1-cp312-cp312-win_amd64.whl", hash = "sha256:e58489934d0147f1edda693cb983bea40f2b45ae6756fd47c1005b538f817a2f"}, + {file = "rapidfuzz-3.9.1-cp312-cp312-win_arm64.whl", hash = "sha256:829fbad93266fffa0f9d722a94cbb1b95b53e3c04be4e872193496a0cfbd66f0"}, + {file = "rapidfuzz-3.9.1-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:bca2b93c75f87cd85832cdd5bb06b4b5642e2a05c8e3550841ddf5d564ce4abb"}, + {file = "rapidfuzz-3.9.1-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:d3397630f22e6c60dda8be3e9dbcf6a341695d487df8a6c92f4a2f7ebcdaecf7"}, + {file = "rapidfuzz-3.9.1-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:df7bba8d4a8fb8e7559a9e83dfc5385dc6fe89efd73e32d253667242faf1883c"}, + {file = "rapidfuzz-3.9.1-cp38-cp38-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:8e70605350cb6ec5091e06de62d3dcb058f694b059b4e1a9d85bfbf892f70030"}, + {file = "rapidfuzz-3.9.1-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:678fcaa5117ddb6263160a7c5f33cc9ea3df335465f5d53715707fad103e1d09"}, + {file = "rapidfuzz-3.9.1-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:08dcd347d408912b6da778a73a0d7a2adad7fe238a44263e5e3789f2a8d84669"}, + {file = "rapidfuzz-3.9.1-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:7149afaf0294882b6b15bb6fa9fc38ff1d761e50117460ee3561181c1c4e2230"}, + {file = "rapidfuzz-3.9.1-cp38-cp38-musllinux_1_2_aarch64.whl", hash = "sha256:0c568b89a5016e76f0b3f85e9379036da99c5e7ec26b33935453d353a1938b74"}, + {file = "rapidfuzz-3.9.1-cp38-cp38-musllinux_1_2_i686.whl", hash = "sha256:a079164675d24eb715230bf9dd252683ae3c9c0c0a236f0b8098630268b899e9"}, + {file = "rapidfuzz-3.9.1-cp38-cp38-musllinux_1_2_ppc64le.whl", hash = "sha256:f6f4e8235d0acf1972f5eb4091c4a0473e5670a754f166c0c718ce21e945f879"}, + {file = "rapidfuzz-3.9.1-cp38-cp38-musllinux_1_2_s390x.whl", hash = "sha256:ea62c82eb2c65bd49651e95f4f46874483ae4da1c3b57997e58f1b4fb2de6c05"}, + {file = "rapidfuzz-3.9.1-cp38-cp38-musllinux_1_2_x86_64.whl", hash = "sha256:3ab6ad7e70469aed24e24378b19a9e47fc757c847399b22c612a0fccacc795cb"}, + {file = "rapidfuzz-3.9.1-cp38-cp38-win32.whl", hash = "sha256:bf5184b17e26a82b00c7ee05d9ec5d826113df55830bbc447bf6d6e7469c70fb"}, + {file = "rapidfuzz-3.9.1-cp38-cp38-win_amd64.whl", hash = "sha256:493354f50b9855271ac846b213e394e08446e70cef5cc033e5302a2220f3ae7b"}, + {file = "rapidfuzz-3.9.1-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:c8b0e6640421e55d69e186ce7fb9e6c723cfd3b6f91beaeb28705c2a46c8a194"}, + {file = "rapidfuzz-3.9.1-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:bc68fb8f2a8b5b3a4526b7a65e7d5c7f821882f56d9dcbcce4c6859a9e5bdcd7"}, + {file = "rapidfuzz-3.9.1-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:77767b119ac05662d216a8cc4092ac28dbc015d9caabebdbefe371b0dd82a38e"}, + {file = "rapidfuzz-3.9.1-cp39-cp39-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:5dbcc4add07bd60ea73b94392fed28f83dba0fe796097da47627fd539bd6daca"}, + {file = "rapidfuzz-3.9.1-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:c0899de4fc1a7a36f14be556a0dacf40ea5c0fe22c6b45b2ea2674e1ac47e269"}, + {file = "rapidfuzz-3.9.1-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:e9f075366cee63a6b06bd7f9285eb9f1785382a6493afcb7054202e20508bf94"}, + {file = "rapidfuzz-3.9.1-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:349e9c15092d20a1f6ff1795e068f39a9ee5e84c54b3addbc66d0ac469c4ef43"}, + {file = "rapidfuzz-3.9.1-cp39-cp39-musllinux_1_2_aarch64.whl", hash = "sha256:a645f362dafc103dbe7f43a2ad34f76284773cd7d1b00514d1c591848a1c817f"}, + {file = "rapidfuzz-3.9.1-cp39-cp39-musllinux_1_2_i686.whl", hash = "sha256:03a0a4bc8d4bd3e6f882b4c2ac183825a9b6dabe7e5a97bb6a1075e4635c944d"}, + {file = "rapidfuzz-3.9.1-cp39-cp39-musllinux_1_2_ppc64le.whl", hash = "sha256:fbce66cb2e331b0888c79b594eab76e2c609c2637050085daadff5325d471dc2"}, + {file = "rapidfuzz-3.9.1-cp39-cp39-musllinux_1_2_s390x.whl", hash = "sha256:e5d7b3154f6df9e05c2016de5e95f8cba4fe636a4e5520ebcd89bc6c54b8e4ed"}, + {file = "rapidfuzz-3.9.1-cp39-cp39-musllinux_1_2_x86_64.whl", hash = "sha256:aaba665f92c011c6f284e933ab02b5dc129a6d3f48fce913ec4a214bd530135e"}, + {file = "rapidfuzz-3.9.1-cp39-cp39-win32.whl", hash = "sha256:61b343c581f4926260248069d8fdbbbf293c19c12ef440ad5ced15bcff277a84"}, + {file = "rapidfuzz-3.9.1-cp39-cp39-win_amd64.whl", hash = "sha256:ce3335324198e1388a1c4e50d40f45107367010afe9fa09fd46278160f0ab591"}, + {file = "rapidfuzz-3.9.1-cp39-cp39-win_arm64.whl", hash = "sha256:998977df2ae01ff8b7bc3b29a860b4a863005e0533e323df3fd555a31ef33f0e"}, + {file = "rapidfuzz-3.9.1-pp310-pypy310_pp73-macosx_10_9_x86_64.whl", hash = "sha256:dc4b5de5d6f9347d836d849b56bca630169353cbe5c10fa7fe93bb1677b49770"}, + {file = "rapidfuzz-3.9.1-pp310-pypy310_pp73-macosx_11_0_arm64.whl", hash = "sha256:9f74d93148081049ccc86f276d54cd7c8c0692250245660b4fcd904ed1db1e01"}, + {file = "rapidfuzz-3.9.1-pp310-pypy310_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:9f9dfdcd75e16e5874efee233b28aec1322623b0f1f20641452d06ea2d8ba5ef"}, + {file = "rapidfuzz-3.9.1-pp310-pypy310_pp73-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:97ab8f153984a5d827ebb5a5b80ee59563efcf2fa3e569dcd46ea7e7c9845e93"}, + {file = "rapidfuzz-3.9.1-pp310-pypy310_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:b8a6d5a8edc452920efdf1b499a2a47bb8a28440f7ab3fe28bb7d6636ccf71c3"}, + {file = "rapidfuzz-3.9.1-pp310-pypy310_pp73-win_amd64.whl", hash = "sha256:06879b598e798a4d33a283c2b4fa0d555d7706b6531e3321b161d62e986f7f57"}, + {file = "rapidfuzz-3.9.1-pp38-pypy38_pp73-macosx_10_9_x86_64.whl", hash = "sha256:0f906ab6220778404498e0ce255c4cc89f98ea5e656e54cc59c5813c877eb86b"}, + {file = "rapidfuzz-3.9.1-pp38-pypy38_pp73-macosx_11_0_arm64.whl", hash = "sha256:d3da444890c9559fd15717d97f8373b1cd14007f68c9b037aa93ef7ca969b559"}, + {file = "rapidfuzz-3.9.1-pp38-pypy38_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:bc4503841cd3cbe22b5ac44f15bc834ec97d811a3c3943f73f5643266c8674e1"}, + {file = "rapidfuzz-3.9.1-pp38-pypy38_pp73-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:5713c56b30ed75ada3a8f008cf8e8e6323386ce48fac2bf2d07285fe6c91f5a4"}, + {file = "rapidfuzz-3.9.1-pp38-pypy38_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:eb3f1af099cd1d98001691fbdadd422f088f21eadcacf5698b393b7569e24dc4"}, + {file = "rapidfuzz-3.9.1-pp38-pypy38_pp73-win_amd64.whl", hash = "sha256:53477e1e6d85d603c9a319cfd00ab9f0a57b6d68bcdb268d6b15a79e64d693d0"}, + {file = "rapidfuzz-3.9.1-pp39-pypy39_pp73-macosx_10_9_x86_64.whl", hash = "sha256:a47550eabf235e5d50e7d448c18f77f6e8082aa3571e9df511c8388525ea9372"}, + {file = "rapidfuzz-3.9.1-pp39-pypy39_pp73-macosx_11_0_arm64.whl", hash = "sha256:c6b11a38b61cc2462a113b123f5e932cda0e525f816d6fe4b68516f97d7f9d49"}, + {file = "rapidfuzz-3.9.1-pp39-pypy39_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:414644a2fc8a3e5fafda95b430214ed892faa4d0a07401d33892bc9ca5c84974"}, + {file = "rapidfuzz-3.9.1-pp39-pypy39_pp73-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:1539e7439b68013c5d2ab7ed9d3d221480a15595207764145ae177077d28016d"}, + {file = "rapidfuzz-3.9.1-pp39-pypy39_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:e18f0e9351f7e5d5387774ff4d5cabd824341e16b866eb1c8d3f557111b447ef"}, + {file = "rapidfuzz-3.9.1-pp39-pypy39_pp73-win_amd64.whl", hash = "sha256:d2ff268a8bf57a76512804d5ca2097afaf98e64e8947d514cde7e2e8446aa5f7"}, + {file = "rapidfuzz-3.9.1.tar.gz", hash = "sha256:a42eb645241f39a59c45a7fc15e3faf61886bff3a4a22263fd0f7cfb90e91b7f"}, +] + +[package.extras] +full = ["numpy"] + [[package]] name = "ratelimiter" version = "1.2.0.post0" @@ -3932,101 +4469,101 @@ rpds-py = ">=0.7.0" [[package]] name = "regex" -version = "2024.5.10" +version = "2024.5.15" description = "Alternative regular expression module, to replace re." optional = false python-versions = ">=3.8" files = [ - {file = "regex-2024.5.10-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:eda3dd46df535da787ffb9036b5140f941ecb91701717df91c9daf64cabef953"}, - {file = "regex-2024.5.10-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:1d5bd666466c8f00a06886ce1397ba8b12371c1f1c6d1bef11013e9e0a1464a8"}, - {file = "regex-2024.5.10-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:32e5f3b8e32918bfbdd12eca62e49ab3031125c454b507127ad6ecbd86e62fca"}, - {file = "regex-2024.5.10-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:534efd2653ebc4f26fc0e47234e53bf0cb4715bb61f98c64d2774a278b58c846"}, - {file = "regex-2024.5.10-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:193b7c6834a06f722f0ce1ba685efe80881de7c3de31415513862f601097648c"}, - {file = "regex-2024.5.10-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:160ba087232c5c6e2a1e7ad08bd3a3f49b58c815be0504d8c8aacfb064491cd8"}, - {file = "regex-2024.5.10-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:951be1eae7b47660412dc4938777a975ebc41936d64e28081bf2e584b47ec246"}, - {file = "regex-2024.5.10-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:d8a0f0ab5453e409586b11ebe91c672040bc804ca98d03a656825f7890cbdf88"}, - {file = "regex-2024.5.10-cp310-cp310-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:9e6d4d6ae1827b2f8c7200aaf7501c37cf3f3896c86a6aaf2566448397c823dd"}, - {file = "regex-2024.5.10-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:161a206c8f3511e2f5fafc9142a2cc25d7fe9a1ec5ad9b4ad2496a7c33e1c5d2"}, - {file = "regex-2024.5.10-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:44b3267cea873684af022822195298501568ed44d542f9a2d9bebc0212e99069"}, - {file = "regex-2024.5.10-cp310-cp310-musllinux_1_1_ppc64le.whl", hash = "sha256:560278c9975694e1f0bc50da187abf2cdc1e4890739ea33df2bc4a85eeef143e"}, - {file = "regex-2024.5.10-cp310-cp310-musllinux_1_1_s390x.whl", hash = "sha256:70364a097437dd0a90b31cd77f09f7387ad9ac60ef57590971f43b7fca3082a5"}, - {file = "regex-2024.5.10-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:42be5de7cc8c1edac55db92d82b68dc8e683b204d6f5414c5a51997a323d7081"}, - {file = "regex-2024.5.10-cp310-cp310-win32.whl", hash = "sha256:9a8625849387b9d558d528e263ecc9c0fbde86cfa5c2f0eef43fff480ae24d71"}, - {file = "regex-2024.5.10-cp310-cp310-win_amd64.whl", hash = "sha256:903350bf44d7e4116b4d5898b30b15755d61dcd3161e3413a49c7db76f0bee5a"}, - {file = "regex-2024.5.10-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:bf9596cba92ce7b1fd32c7b07c6e3212c7eed0edc271757e48bfcd2b54646452"}, - {file = "regex-2024.5.10-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:45cc13d398b6359a7708986386f72bd156ae781c3e83a68a6d4cee5af04b1ce9"}, - {file = "regex-2024.5.10-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:ad45f3bccfcb00868f2871dce02a755529838d2b86163ab8a246115e80cfb7d6"}, - {file = "regex-2024.5.10-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:33d19f0cde6838c81acffff25c7708e4adc7dd02896c9ec25c3939b1500a1778"}, - {file = "regex-2024.5.10-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:0a9f89d7db5ef6bdf53e5cc8e6199a493d0f1374b3171796b464a74ebe8e508a"}, - {file = "regex-2024.5.10-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:8c6c71cf92b09e5faa72ea2c68aa1f61c9ce11cb66fdc5069d712f4392ddfd00"}, - {file = "regex-2024.5.10-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:7467ad8b0eac0b28e52679e972b9b234b3de0ea5cee12eb50091d2b68145fe36"}, - {file = "regex-2024.5.10-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:bc0db93ad039fc2fe32ccd3dd0e0e70c4f3d6e37ae83f0a487e1aba939bd2fbd"}, - {file = "regex-2024.5.10-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:fa9335674d7c819674467c7b46154196c51efbaf5f5715187fd366814ba3fa39"}, - {file = "regex-2024.5.10-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:7dda3091838206969c2b286f9832dff41e2da545b99d1cfaea9ebd8584d02708"}, - {file = "regex-2024.5.10-cp311-cp311-musllinux_1_1_ppc64le.whl", hash = "sha256:504b5116e2bd1821efd815941edff7535e93372a098e156bb9dffde30264e798"}, - {file = "regex-2024.5.10-cp311-cp311-musllinux_1_1_s390x.whl", hash = "sha256:91b53dea84415e8115506cc62e441a2b54537359c63d856d73cb1abe05af4c9a"}, - {file = "regex-2024.5.10-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:1a3903128f9e17a500618e80c68165c78c741ebb17dd1a0b44575f92c3c68b02"}, - {file = "regex-2024.5.10-cp311-cp311-win32.whl", hash = "sha256:236cace6c1903effd647ed46ce6dd5d76d54985fc36dafc5256032886736c85d"}, - {file = "regex-2024.5.10-cp311-cp311-win_amd64.whl", hash = "sha256:12446827f43c7881decf2c126762e11425de5eb93b3b0d8b581344c16db7047a"}, - {file = "regex-2024.5.10-cp312-cp312-macosx_10_9_universal2.whl", hash = "sha256:14905ed75c7a6edf423eb46c213ed3f4507c38115f1ed3c00f4ec9eafba50e58"}, - {file = "regex-2024.5.10-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:4fad420b14ae1970a1f322e8ae84a1d9d89375eb71e1b504060ab2d1bfe68f3c"}, - {file = "regex-2024.5.10-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:c46a76a599fcbf95f98755275c5527304cc4f1bb69919434c1e15544d7052910"}, - {file = "regex-2024.5.10-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:0faecb6d5779753a6066a3c7a0471a8d29fe25d9981ca9e552d6d1b8f8b6a594"}, - {file = "regex-2024.5.10-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:aab65121229c2ecdf4a31b793d99a6a0501225bd39b616e653c87b219ed34a49"}, - {file = "regex-2024.5.10-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:50e7e96a527488334379e05755b210b7da4a60fc5d6481938c1fa053e0c92184"}, - {file = "regex-2024.5.10-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:ba034c8db4b264ef1601eb33cd23d87c5013b8fb48b8161debe2e5d3bd9156b0"}, - {file = "regex-2024.5.10-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:031219782d97550c2098d9a68ce9e9eaefe67d2d81d8ff84c8354f9c009e720c"}, - {file = "regex-2024.5.10-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:62b5f7910b639f3c1d122d408421317c351e213ca39c964ad4121f27916631c6"}, - {file = "regex-2024.5.10-cp312-cp312-musllinux_1_1_i686.whl", hash = "sha256:cd832bd9b6120d6074f39bdfbb3c80e416848b07ac72910f1c7f03131a6debc3"}, - {file = "regex-2024.5.10-cp312-cp312-musllinux_1_1_ppc64le.whl", hash = "sha256:e91b1976358e17197157b405cab408a5f4e33310cda211c49fc6da7cffd0b2f0"}, - {file = "regex-2024.5.10-cp312-cp312-musllinux_1_1_s390x.whl", hash = "sha256:571452362d552de508c37191b6abbbb660028b8b418e2d68c20779e0bc8eaaa8"}, - {file = "regex-2024.5.10-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:5253dcb0bfda7214523de58b002eb0090cb530d7c55993ce5f6d17faf953ece7"}, - {file = "regex-2024.5.10-cp312-cp312-win32.whl", hash = "sha256:2f30a5ab8902f93930dc6f627c4dd5da2703333287081c85cace0fc6e21c25af"}, - {file = "regex-2024.5.10-cp312-cp312-win_amd64.whl", hash = "sha256:3799e36d60a35162bb35b2246d8bb012192b7437dff807ef79c14e7352706306"}, - {file = "regex-2024.5.10-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:bbdc5db2c98ac2bf1971ffa1410c87ca7a15800415f788971e8ba8520fc0fda9"}, - {file = "regex-2024.5.10-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:6ccdeef4584450b6f0bddd5135354908dacad95425fcb629fe36d13e48b60f32"}, - {file = "regex-2024.5.10-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:29d839829209f3c53f004e1de8c3113efce6d98029f044fa5cfee666253ee7e6"}, - {file = "regex-2024.5.10-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:0709ba544cf50bd5cb843df4b8bb6701bae2b70a8e88da9add8386cbca5c1385"}, - {file = "regex-2024.5.10-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:972b49f2fe1047b9249c958ec4fa1bdd2cf8ce305dc19d27546d5a38e57732d8"}, - {file = "regex-2024.5.10-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:9cdbb1998da94607d5eec02566b9586f0e70d6438abf1b690261aac0edda7ab6"}, - {file = "regex-2024.5.10-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:bf7c8ee4861d9ef5b1120abb75846828c811f932d63311596ad25fa168053e00"}, - {file = "regex-2024.5.10-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:7d35d4cc9270944e95f9c88af757b0c9fc43f396917e143a5756608462c5223b"}, - {file = "regex-2024.5.10-cp38-cp38-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:8722f72068b3e1156a4b2e1afde6810f1fc67155a9fa30a4b9d5b4bc46f18fb0"}, - {file = "regex-2024.5.10-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:696639a73ca78a380acfaa0a1f6dd8220616a99074c05bba9ba8bb916914b224"}, - {file = "regex-2024.5.10-cp38-cp38-musllinux_1_1_i686.whl", hash = "sha256:ea057306ab469130167014b662643cfaed84651c792948891d003cf0039223a5"}, - {file = "regex-2024.5.10-cp38-cp38-musllinux_1_1_ppc64le.whl", hash = "sha256:b43b78f9386d3d932a6ce5af4b45f393d2e93693ee18dc4800d30a8909df700e"}, - {file = "regex-2024.5.10-cp38-cp38-musllinux_1_1_s390x.whl", hash = "sha256:c43395a3b7cc9862801a65c6994678484f186ce13c929abab44fb8a9e473a55a"}, - {file = "regex-2024.5.10-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:0bc94873ba11e34837bffd7e5006703abeffc4514e2f482022f46ce05bd25e67"}, - {file = "regex-2024.5.10-cp38-cp38-win32.whl", hash = "sha256:1118ba9def608250250f4b3e3f48c62f4562ba16ca58ede491b6e7554bfa09ff"}, - {file = "regex-2024.5.10-cp38-cp38-win_amd64.whl", hash = "sha256:458d68d34fb74b906709735c927c029e62f7d06437a98af1b5b6258025223210"}, - {file = "regex-2024.5.10-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:15e593386ec6331e0ab4ac0795b7593f02ab2f4b30a698beb89fbdc34f92386a"}, - {file = "regex-2024.5.10-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:ca23b41355ba95929e9505ee04e55495726aa2282003ed9b012d86f857d3e49b"}, - {file = "regex-2024.5.10-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:2c8982ee19ccecabbaeac1ba687bfef085a6352a8c64f821ce2f43e6d76a9298"}, - {file = "regex-2024.5.10-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:7117cb7d6ac7f2e985f3d18aa8a1728864097da1a677ffa69e970ca215baebf1"}, - {file = "regex-2024.5.10-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:b66421f8878a0c82fc0c272a43e2121c8d4c67cb37429b764f0d5ad70b82993b"}, - {file = "regex-2024.5.10-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:224a9269f133564109ce668213ef3cb32bc72ccf040b0b51c72a50e569e9dc9e"}, - {file = "regex-2024.5.10-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:ab98016541543692a37905871a5ffca59b16e08aacc3d7d10a27297b443f572d"}, - {file = "regex-2024.5.10-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:51d27844763c273a122e08a3e86e7aefa54ee09fb672d96a645ece0454d8425e"}, - {file = "regex-2024.5.10-cp39-cp39-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:853cc36e756ff673bf984e9044ccc8fad60b95a748915dddeab9488aea974c73"}, - {file = "regex-2024.5.10-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:4e7eaf9df15423d07b6050fb91f86c66307171b95ea53e2d87a7993b6d02c7f7"}, - {file = "regex-2024.5.10-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:169fd0acd7a259f58f417e492e93d0e15fc87592cd1e971c8c533ad5703b5830"}, - {file = "regex-2024.5.10-cp39-cp39-musllinux_1_1_ppc64le.whl", hash = "sha256:334b79ce9c08f26b4659a53f42892793948a613c46f1b583e985fd5a6bf1c149"}, - {file = "regex-2024.5.10-cp39-cp39-musllinux_1_1_s390x.whl", hash = "sha256:f03b1dbd4d9596dd84955bb40f7d885204d6aac0d56a919bb1e0ff2fb7e1735a"}, - {file = "regex-2024.5.10-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:cfa6d61a76c77610ba9274c1a90a453062bdf6887858afbe214d18ad41cf6bde"}, - {file = "regex-2024.5.10-cp39-cp39-win32.whl", hash = "sha256:249fbcee0a277c32a3ce36d8e36d50c27c968fdf969e0fbe342658d4e010fbc8"}, - {file = "regex-2024.5.10-cp39-cp39-win_amd64.whl", hash = "sha256:0ce56a923f4c01d7568811bfdffe156268c0a7aae8a94c902b92fe34c4bde785"}, - {file = "regex-2024.5.10.tar.gz", hash = "sha256:304e7e2418146ae4d0ef0e9ffa28f881f7874b45b4994cc2279b21b6e7ae50c8"}, + {file = "regex-2024.5.15-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:a81e3cfbae20378d75185171587cbf756015ccb14840702944f014e0d93ea09f"}, + {file = "regex-2024.5.15-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:7b59138b219ffa8979013be7bc85bb60c6f7b7575df3d56dc1e403a438c7a3f6"}, + {file = "regex-2024.5.15-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:a0bd000c6e266927cb7a1bc39d55be95c4b4f65c5be53e659537537e019232b1"}, + {file = "regex-2024.5.15-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:5eaa7ddaf517aa095fa8da0b5015c44d03da83f5bd49c87961e3c997daed0de7"}, + {file = "regex-2024.5.15-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:ba68168daedb2c0bab7fd7e00ced5ba90aebf91024dea3c88ad5063c2a562cca"}, + {file = "regex-2024.5.15-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:6e8d717bca3a6e2064fc3a08df5cbe366369f4b052dcd21b7416e6d71620dca1"}, + {file = "regex-2024.5.15-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:1337b7dbef9b2f71121cdbf1e97e40de33ff114801263b275aafd75303bd62b5"}, + {file = "regex-2024.5.15-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:f9ebd0a36102fcad2f03696e8af4ae682793a5d30b46c647eaf280d6cfb32796"}, + {file = "regex-2024.5.15-cp310-cp310-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:9efa1a32ad3a3ea112224897cdaeb6aa00381627f567179c0314f7b65d354c62"}, + {file = "regex-2024.5.15-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:1595f2d10dff3d805e054ebdc41c124753631b6a471b976963c7b28543cf13b0"}, + {file = "regex-2024.5.15-cp310-cp310-musllinux_1_2_i686.whl", hash = "sha256:b802512f3e1f480f41ab5f2cfc0e2f761f08a1f41092d6718868082fc0d27143"}, + {file = "regex-2024.5.15-cp310-cp310-musllinux_1_2_ppc64le.whl", hash = "sha256:a0981022dccabca811e8171f913de05720590c915b033b7e601f35ce4ea7019f"}, + {file = "regex-2024.5.15-cp310-cp310-musllinux_1_2_s390x.whl", hash = "sha256:19068a6a79cf99a19ccefa44610491e9ca02c2be3305c7760d3831d38a467a6f"}, + {file = "regex-2024.5.15-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:1b5269484f6126eee5e687785e83c6b60aad7663dafe842b34691157e5083e53"}, + {file = "regex-2024.5.15-cp310-cp310-win32.whl", hash = "sha256:ada150c5adfa8fbcbf321c30c751dc67d2f12f15bd183ffe4ec7cde351d945b3"}, + {file = "regex-2024.5.15-cp310-cp310-win_amd64.whl", hash = "sha256:ac394ff680fc46b97487941f5e6ae49a9f30ea41c6c6804832063f14b2a5a145"}, + {file = "regex-2024.5.15-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:f5b1dff3ad008dccf18e652283f5e5339d70bf8ba7c98bf848ac33db10f7bc7a"}, + {file = "regex-2024.5.15-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:c6a2b494a76983df8e3d3feea9b9ffdd558b247e60b92f877f93a1ff43d26656"}, + {file = "regex-2024.5.15-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:a32b96f15c8ab2e7d27655969a23895eb799de3665fa94349f3b2fbfd547236f"}, + {file = "regex-2024.5.15-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:10002e86e6068d9e1c91eae8295ef690f02f913c57db120b58fdd35a6bb1af35"}, + {file = "regex-2024.5.15-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:ec54d5afa89c19c6dd8541a133be51ee1017a38b412b1321ccb8d6ddbeb4cf7d"}, + {file = "regex-2024.5.15-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:10e4ce0dca9ae7a66e6089bb29355d4432caed736acae36fef0fdd7879f0b0cb"}, + {file = "regex-2024.5.15-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:3e507ff1e74373c4d3038195fdd2af30d297b4f0950eeda6f515ae3d84a1770f"}, + {file = "regex-2024.5.15-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:d1f059a4d795e646e1c37665b9d06062c62d0e8cc3c511fe01315973a6542e40"}, + {file = "regex-2024.5.15-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:0721931ad5fe0dda45d07f9820b90b2148ccdd8e45bb9e9b42a146cb4f695649"}, + {file = "regex-2024.5.15-cp311-cp311-musllinux_1_2_i686.whl", hash = "sha256:833616ddc75ad595dee848ad984d067f2f31be645d603e4d158bba656bbf516c"}, + {file = "regex-2024.5.15-cp311-cp311-musllinux_1_2_ppc64le.whl", hash = "sha256:287eb7f54fc81546346207c533ad3c2c51a8d61075127d7f6d79aaf96cdee890"}, + {file = "regex-2024.5.15-cp311-cp311-musllinux_1_2_s390x.whl", hash = "sha256:19dfb1c504781a136a80ecd1fff9f16dddf5bb43cec6871778c8a907a085bb3d"}, + {file = "regex-2024.5.15-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:119af6e56dce35e8dfb5222573b50c89e5508d94d55713c75126b753f834de68"}, + {file = "regex-2024.5.15-cp311-cp311-win32.whl", hash = "sha256:1c1c174d6ec38d6c8a7504087358ce9213d4332f6293a94fbf5249992ba54efa"}, + {file = "regex-2024.5.15-cp311-cp311-win_amd64.whl", hash = "sha256:9e717956dcfd656f5055cc70996ee2cc82ac5149517fc8e1b60261b907740201"}, + {file = "regex-2024.5.15-cp312-cp312-macosx_10_9_universal2.whl", hash = "sha256:632b01153e5248c134007209b5c6348a544ce96c46005d8456de1d552455b014"}, + {file = "regex-2024.5.15-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:e64198f6b856d48192bf921421fdd8ad8eb35e179086e99e99f711957ffedd6e"}, + {file = "regex-2024.5.15-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:68811ab14087b2f6e0fc0c2bae9ad689ea3584cad6917fc57be6a48bbd012c49"}, + {file = "regex-2024.5.15-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:f8ec0c2fea1e886a19c3bee0cd19d862b3aa75dcdfb42ebe8ed30708df64687a"}, + {file = "regex-2024.5.15-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:d0c0c0003c10f54a591d220997dd27d953cd9ccc1a7294b40a4be5312be8797b"}, + {file = "regex-2024.5.15-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:2431b9e263af1953c55abbd3e2efca67ca80a3de8a0437cb58e2421f8184717a"}, + {file = "regex-2024.5.15-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:4a605586358893b483976cffc1723fb0f83e526e8f14c6e6614e75919d9862cf"}, + {file = "regex-2024.5.15-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:391d7f7f1e409d192dba8bcd42d3e4cf9e598f3979cdaed6ab11288da88cb9f2"}, + {file = "regex-2024.5.15-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:9ff11639a8d98969c863d4617595eb5425fd12f7c5ef6621a4b74b71ed8726d5"}, + {file = "regex-2024.5.15-cp312-cp312-musllinux_1_2_i686.whl", hash = "sha256:4eee78a04e6c67e8391edd4dad3279828dd66ac4b79570ec998e2155d2e59fd5"}, + {file = "regex-2024.5.15-cp312-cp312-musllinux_1_2_ppc64le.whl", hash = "sha256:8fe45aa3f4aa57faabbc9cb46a93363edd6197cbc43523daea044e9ff2fea83e"}, + {file = "regex-2024.5.15-cp312-cp312-musllinux_1_2_s390x.whl", hash = "sha256:d0a3d8d6acf0c78a1fff0e210d224b821081330b8524e3e2bc5a68ef6ab5803d"}, + {file = "regex-2024.5.15-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:c486b4106066d502495b3025a0a7251bf37ea9540433940a23419461ab9f2a80"}, + {file = "regex-2024.5.15-cp312-cp312-win32.whl", hash = "sha256:c49e15eac7c149f3670b3e27f1f28a2c1ddeccd3a2812cba953e01be2ab9b5fe"}, + {file = "regex-2024.5.15-cp312-cp312-win_amd64.whl", hash = "sha256:673b5a6da4557b975c6c90198588181029c60793835ce02f497ea817ff647cb2"}, + {file = "regex-2024.5.15-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:87e2a9c29e672fc65523fb47a90d429b70ef72b901b4e4b1bd42387caf0d6835"}, + {file = "regex-2024.5.15-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:c3bea0ba8b73b71b37ac833a7f3fd53825924165da6a924aec78c13032f20850"}, + {file = "regex-2024.5.15-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:bfc4f82cabe54f1e7f206fd3d30fda143f84a63fe7d64a81558d6e5f2e5aaba9"}, + {file = "regex-2024.5.15-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:e5bb9425fe881d578aeca0b2b4b3d314ec88738706f66f219c194d67179337cb"}, + {file = "regex-2024.5.15-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:64c65783e96e563103d641760664125e91bd85d8e49566ee560ded4da0d3e704"}, + {file = "regex-2024.5.15-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:cf2430df4148b08fb4324b848672514b1385ae3807651f3567871f130a728cc3"}, + {file = "regex-2024.5.15-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:5397de3219a8b08ae9540c48f602996aa6b0b65d5a61683e233af8605c42b0f2"}, + {file = "regex-2024.5.15-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:455705d34b4154a80ead722f4f185b04c4237e8e8e33f265cd0798d0e44825fa"}, + {file = "regex-2024.5.15-cp38-cp38-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:b2b6f1b3bb6f640c1a92be3bbfbcb18657b125b99ecf141fb3310b5282c7d4ed"}, + {file = "regex-2024.5.15-cp38-cp38-musllinux_1_2_aarch64.whl", hash = "sha256:3ad070b823ca5890cab606c940522d05d3d22395d432f4aaaf9d5b1653e47ced"}, + {file = "regex-2024.5.15-cp38-cp38-musllinux_1_2_i686.whl", hash = "sha256:5b5467acbfc153847d5adb21e21e29847bcb5870e65c94c9206d20eb4e99a384"}, + {file = "regex-2024.5.15-cp38-cp38-musllinux_1_2_ppc64le.whl", hash = "sha256:e6662686aeb633ad65be2a42b4cb00178b3fbf7b91878f9446075c404ada552f"}, + {file = "regex-2024.5.15-cp38-cp38-musllinux_1_2_s390x.whl", hash = "sha256:2b4c884767504c0e2401babe8b5b7aea9148680d2e157fa28f01529d1f7fcf67"}, + {file = "regex-2024.5.15-cp38-cp38-musllinux_1_2_x86_64.whl", hash = "sha256:3cd7874d57f13bf70078f1ff02b8b0aa48d5b9ed25fc48547516c6aba36f5741"}, + {file = "regex-2024.5.15-cp38-cp38-win32.whl", hash = "sha256:e4682f5ba31f475d58884045c1a97a860a007d44938c4c0895f41d64481edbc9"}, + {file = "regex-2024.5.15-cp38-cp38-win_amd64.whl", hash = "sha256:d99ceffa25ac45d150e30bd9ed14ec6039f2aad0ffa6bb87a5936f5782fc1569"}, + {file = "regex-2024.5.15-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:13cdaf31bed30a1e1c2453ef6015aa0983e1366fad2667657dbcac7b02f67133"}, + {file = "regex-2024.5.15-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:cac27dcaa821ca271855a32188aa61d12decb6fe45ffe3e722401fe61e323cd1"}, + {file = "regex-2024.5.15-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:7dbe2467273b875ea2de38ded4eba86cbcbc9a1a6d0aa11dcf7bd2e67859c435"}, + {file = "regex-2024.5.15-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:64f18a9a3513a99c4bef0e3efd4c4a5b11228b48aa80743be822b71e132ae4f5"}, + {file = "regex-2024.5.15-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:d347a741ea871c2e278fde6c48f85136c96b8659b632fb57a7d1ce1872547600"}, + {file = "regex-2024.5.15-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:1878b8301ed011704aea4c806a3cadbd76f84dece1ec09cc9e4dc934cfa5d4da"}, + {file = "regex-2024.5.15-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:4babf07ad476aaf7830d77000874d7611704a7fcf68c9c2ad151f5d94ae4bfc4"}, + {file = "regex-2024.5.15-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:35cb514e137cb3488bce23352af3e12fb0dbedd1ee6e60da053c69fb1b29cc6c"}, + {file = "regex-2024.5.15-cp39-cp39-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:cdd09d47c0b2efee9378679f8510ee6955d329424c659ab3c5e3a6edea696294"}, + {file = "regex-2024.5.15-cp39-cp39-musllinux_1_2_aarch64.whl", hash = "sha256:72d7a99cd6b8f958e85fc6ca5b37c4303294954eac1376535b03c2a43eb72629"}, + {file = "regex-2024.5.15-cp39-cp39-musllinux_1_2_i686.whl", hash = "sha256:a094801d379ab20c2135529948cb84d417a2169b9bdceda2a36f5f10977ebc16"}, + {file = "regex-2024.5.15-cp39-cp39-musllinux_1_2_ppc64le.whl", hash = "sha256:c0c18345010870e58238790a6779a1219b4d97bd2e77e1140e8ee5d14df071aa"}, + {file = "regex-2024.5.15-cp39-cp39-musllinux_1_2_s390x.whl", hash = "sha256:16093f563098448ff6b1fa68170e4acbef94e6b6a4e25e10eae8598bb1694b5d"}, + {file = "regex-2024.5.15-cp39-cp39-musllinux_1_2_x86_64.whl", hash = "sha256:e38a7d4e8f633a33b4c7350fbd8bad3b70bf81439ac67ac38916c4a86b465456"}, + {file = "regex-2024.5.15-cp39-cp39-win32.whl", hash = "sha256:71a455a3c584a88f654b64feccc1e25876066c4f5ef26cd6dd711308aa538694"}, + {file = "regex-2024.5.15-cp39-cp39-win_amd64.whl", hash = "sha256:cab12877a9bdafde5500206d1020a584355a97884dfd388af3699e9137bf7388"}, + {file = "regex-2024.5.15.tar.gz", hash = "sha256:d3ee02d9e5f482cc8309134a91eeaacbdd2261ba111b0fef3748eeb4913e6a2c"}, ] [[package]] name = "requests" -version = "2.32.0" +version = "2.32.1" description = "Python HTTP for Humans." optional = false python-versions = ">=3.8" files = [ - {file = "requests-2.32.0-py3-none-any.whl", hash = "sha256:f2c3881dddb70d056c5bd7600a4fae312b2a300e39be6a118d30b90bd27262b5"}, - {file = "requests-2.32.0.tar.gz", hash = "sha256:fa5490319474c82ef1d2c9bc459d3652e3ae4ef4c4ebdd18a21145a47ca4b6b8"}, + {file = "requests-2.32.1-py3-none-any.whl", hash = "sha256:21ac9465cdf8c1650fe1ecde8a71669a93d4e6f147550483a2967d08396a56a5"}, + {file = "requests-2.32.1.tar.gz", hash = "sha256:eb97e87e64c79e64e5b8ac75cee9dd1f97f49e289b083ee6be96268930725685"}, ] [package.dependencies] @@ -4039,6 +4576,20 @@ urllib3 = ">=1.21.1,<3" socks = ["PySocks (>=1.5.6,!=1.5.7)"] use-chardet-on-py3 = ["chardet (>=3.0.2,<6)"] +[[package]] +name = "requests-toolbelt" +version = "1.0.0" +description = "A utility belt for advanced users of python-requests" +optional = false +python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*" +files = [ + {file = "requests-toolbelt-1.0.0.tar.gz", hash = "sha256:7681a0a3d047012b5bdc0ee37d7f8f07ebe76ab08caeccfc3921ce23c88d5bc6"}, + {file = "requests_toolbelt-1.0.0-py2.py3-none-any.whl", hash = "sha256:cccfdd665f0a24fcf4726e690f65639d272bb0637b9b92dfd91a5568ccf6bd06"}, +] + +[package.dependencies] +requests = ">=2.0.1,<3.0.0" + [[package]] name = "retry" version = "0.9.2" @@ -4336,6 +4887,21 @@ dev = ["flake8", "flit", "mypy", "pandas-stubs", "pre-commit", "pytest", "pytest docs = ["ipykernel", "nbconvert", "numpydoc", "pydata_sphinx_theme (==0.10.0rc2)", "pyyaml", "sphinx (<6.0.0)", "sphinx-copybutton", "sphinx-design", "sphinx-issues"] stats = ["scipy (>=1.7)", "statsmodels (>=0.12)"] +[[package]] +name = "secretstorage" +version = "3.3.3" +description = "Python bindings to FreeDesktop.org Secret Service API" +optional = false +python-versions = ">=3.6" +files = [ + {file = "SecretStorage-3.3.3-py3-none-any.whl", hash = "sha256:f356e6628222568e3af06f2eba8df495efa13b3b63081dafd4f7d9a7b7bc9f99"}, + {file = "SecretStorage-3.3.3.tar.gz", hash = "sha256:2403533ef369eca6d2ba81718576c5e0f564d5cca1b58f73a8b23e7d4eeebd77"}, +] + +[package.dependencies] +cryptography = ">=2.0" +jeepney = ">=0.6" + [[package]] name = "semver" version = "3.0.2" @@ -4395,6 +4961,17 @@ docs = ["furo", "jaraco.packaging (>=9.3)", "jaraco.tidelift (>=1.4)", "pygments testing = ["build[virtualenv]", "filelock (>=3.4.0)", "importlib-metadata", "ini2toml[lite] (>=0.9)", "jaraco.develop (>=7.21)", "jaraco.envs (>=2.2)", "jaraco.path (>=3.2.0)", "mypy (==1.9)", "packaging (>=23.2)", "pip (>=19.1)", "pytest (>=6,!=8.1.1)", "pytest-checkdocs (>=2.4)", "pytest-cov", "pytest-enabler (>=2.2)", "pytest-home (>=0.5)", "pytest-mypy", "pytest-perf", "pytest-ruff (>=0.2.1)", "pytest-timeout", "pytest-xdist (>=3)", "tomli", "tomli-w (>=1.0.0)", "virtualenv (>=13.0.0)", "wheel"] testing-integration = ["build[virtualenv] (>=1.0.3)", "filelock (>=3.4.0)", "jaraco.envs (>=2.2)", "jaraco.path (>=3.2.0)", "packaging (>=23.2)", "pytest", "pytest-enabler", "pytest-xdist", "tomli", "virtualenv (>=13.0.0)", "wheel"] +[[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" @@ -4761,6 +5338,17 @@ files = [ docs = ["myst-parser", "pydata-sphinx-theme", "sphinx"] test = ["argcomplete (>=3.0.3)", "mypy (>=1.7.0)", "pre-commit", "pytest (>=7.0,<8.2)", "pytest-mock", "pytest-mypy-testing"] +[[package]] +name = "trove-classifiers" +version = "2024.5.17" +description = "Canonical source for classifiers on PyPI (pypi.org)." +optional = false +python-versions = "*" +files = [ + {file = "trove_classifiers-2024.5.17-py3-none-any.whl", hash = "sha256:2ebdddebd43e749ac6b6e9b9aa158ab489603dff147cba8714787729cdb9ea37"}, + {file = "trove_classifiers-2024.5.17.tar.gz", hash = "sha256:d47a6f1c48803091c3fc81f535fecfeef65b558f2b9e4e83df7a79d17bce8bbf"}, +] + [[package]] name = "types-python-dateutil" version = "2.9.0.20240316" @@ -4923,6 +5511,26 @@ files = [ docs = ["Sphinx (>=4.1.2,<4.2.0)", "sphinx-rtd-theme (>=0.5.2,<0.6.0)", "sphinxcontrib-asyncio (>=0.3.0,<0.4.0)"] test = ["Cython (>=0.29.36,<0.30.0)", "aiohttp (==3.9.0b0)", "aiohttp (>=3.8.1)", "flake8 (>=5.0,<6.0)", "mypy (>=0.800)", "psutil", "pyOpenSSL (>=23.0.0,<23.1.0)", "pycodestyle (>=2.9.0,<2.10.0)"] +[[package]] +name = "virtualenv" +version = "20.26.2" +description = "Virtual Python Environment builder" +optional = false +python-versions = ">=3.7" +files = [ + {file = "virtualenv-20.26.2-py3-none-any.whl", hash = "sha256:a624db5e94f01ad993d476b9ee5346fdf7b9de43ccaee0e0197012dc838a0e9b"}, + {file = "virtualenv-20.26.2.tar.gz", hash = "sha256:82bf0f4eebbb78d36ddaee0283d43fe5736b53880b8a8cdcd37390a07ac3741c"}, +] + +[package.dependencies] +distlib = ">=0.3.7,<1" +filelock = ">=3.12.2,<4" +platformdirs = ">=3.9.1,<5" + +[package.extras] +docs = ["furo (>=2023.7.26)", "proselint (>=0.13)", "sphinx (>=7.1.2,!=7.3)", "sphinx-argparse (>=0.4)", "sphinxcontrib-towncrier (>=0.2.1a0)", "towncrier (>=23.6)"] +test = ["covdefaults (>=2.3)", "coverage (>=7.2.7)", "coverage-enable-subprocess (>=1)", "flaky (>=3.7)", "packaging (>=23.1)", "pytest (>=7.4)", "pytest-env (>=0.8.2)", "pytest-freezer (>=0.4.8)", "pytest-mock (>=3.11.1)", "pytest-randomly (>=3.12)", "pytest-timeout (>=2.1)", "setuptools (>=68)", "time-machine (>=2.10)"] + [[package]] name = "wcwidth" version = "0.2.13" @@ -5066,22 +5674,95 @@ files = [ {file = "wrapt-1.16.0.tar.gz", hash = "sha256:5f370f952971e7d17c7d1ead40e49f32345a7f7a5373571ef44d800d06b1899d"}, ] +[[package]] +name = "xattr" +version = "1.1.0" +description = "Python wrapper for extended filesystem attributes" +optional = false +python-versions = ">=3.8" +files = [ + {file = "xattr-1.1.0-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:ef2fa0f85458736178fd3dcfeb09c3cf423f0843313e25391db2cfd1acec8888"}, + {file = "xattr-1.1.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:ccab735d0632fe71f7d72e72adf886f45c18b7787430467ce0070207882cfe25"}, + {file = "xattr-1.1.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:9013f290387f1ac90bccbb1926555ca9aef75651271098d99217284d9e010f7c"}, + {file = "xattr-1.1.0-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:9dcd5dfbcee73c7be057676ecb900cabb46c691aff4397bf48c579ffb30bb963"}, + {file = "xattr-1.1.0-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:6480589c1dac7785d1f851347a32c4a97305937bf7b488b857fe8b28a25de9e9"}, + {file = "xattr-1.1.0-cp310-cp310-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:08f61cbed52dc6f7c181455826a9ff1e375ad86f67dd9d5eb7663574abb32451"}, + {file = "xattr-1.1.0-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:918e1f83f2e8a072da2671eac710871ee5af337e9bf8554b5ce7f20cdb113186"}, + {file = "xattr-1.1.0-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:0f06e0c1e4d06b4e0e49aaa1184b6f0e81c3758c2e8365597918054890763b53"}, + {file = "xattr-1.1.0-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:46a641ac038a9f53d2f696716147ca4dbd6a01998dc9cd4bc628801bc0df7f4d"}, + {file = "xattr-1.1.0-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:7e4ca0956fd11679bb2e0c0d6b9cdc0f25470cc00d8da173bb7656cc9a9cf104"}, + {file = "xattr-1.1.0-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:6881b120f9a4b36ccd8a28d933bc0f6e1de67218b6ce6e66874e0280fc006844"}, + {file = "xattr-1.1.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:dab29d9288aa28e68a6f355ddfc3f0a7342b40c9012798829f3e7bd765e85c2c"}, + {file = "xattr-1.1.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:e0c80bbf55339c93770fc294b4b6586b5bf8e85ec00a4c2d585c33dbd84b5006"}, + {file = "xattr-1.1.0-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:d1418705f253b6b6a7224b69773842cac83fcbcd12870354b6e11dd1cd54630f"}, + {file = "xattr-1.1.0-cp311-cp311-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:687e7d18611ef8d84a6ecd8f4d1ab6757500c1302f4c2046ce0aa3585e13da3f"}, + {file = "xattr-1.1.0-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:b6ceb9efe0657a982ccb8b8a2efe96b690891779584c901d2f920784e5d20ae3"}, + {file = "xattr-1.1.0-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:b489b7916f239100956ea0b39c504f3c3a00258ba65677e4c8ba1bd0b5513446"}, + {file = "xattr-1.1.0-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:0a9c431b0e66516a078125e9a273251d4b8e5ba84fe644b619f2725050d688a0"}, + {file = "xattr-1.1.0-cp312-cp312-macosx_10_9_universal2.whl", hash = "sha256:1a5921ea3313cc1c57f2f53b63ea8ca9a91e48f4cc7ebec057d2447ec82c7efe"}, + {file = "xattr-1.1.0-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:f6ad2a7bd5e6cf71d4a862413234a067cf158ca0ae94a40d4b87b98b62808498"}, + {file = "xattr-1.1.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:0683dae7609f7280b0c89774d00b5957e6ffcb181c6019c46632b389706b77e6"}, + {file = "xattr-1.1.0-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:54cb15cd94e5ef8a0ef02309f1bf973ba0e13c11e87686e983f371948cfee6af"}, + {file = "xattr-1.1.0-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:ff6223a854229055e803c2ad0c0ea9a6da50c6be30d92c198cf5f9f28819a921"}, + {file = "xattr-1.1.0-cp312-cp312-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:d44e8f955218638c9ab222eed21e9bd9ab430d296caf2176fb37abe69a714e5c"}, + {file = "xattr-1.1.0-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:caab2c2986c30f92301f12e9c50415d324412e8e6a739a52a603c3e6a54b3610"}, + {file = "xattr-1.1.0-cp312-cp312-musllinux_1_1_i686.whl", hash = "sha256:d6eb7d5f281014cd44e2d847a9107491af1bf3087f5afeded75ed3e37ec87239"}, + {file = "xattr-1.1.0-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:47a3bdfe034b4fdb70e5941d97037405e3904accc28e10dbef6d1c9061fb6fd7"}, + {file = "xattr-1.1.0-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:00d2b415cf9d6a24112d019e721aa2a85652f7bbc9f3b9574b2d1cd8668eb491"}, + {file = "xattr-1.1.0-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:78b377832dd0ee408f9f121a354082c6346960f7b6b1480483ed0618b1912120"}, + {file = "xattr-1.1.0-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:6461a43b585e5f2e049b39bcbfcb6391bfef3c5118231f1b15d10bdb89ef17fe"}, + {file = "xattr-1.1.0-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:24d97f0d28f63695e3344ffdabca9fcc30c33e5c8ccc198c7524361a98d526f2"}, + {file = "xattr-1.1.0-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:6ad47d89968c9097900607457a0c89160b4771601d813e769f68263755516065"}, + {file = "xattr-1.1.0-cp38-cp38-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:dc53cab265f6e8449bd683d5ee3bc5a191e6dd940736f3de1a188e6da66b0653"}, + {file = "xattr-1.1.0-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:cd11e917f5b89f2a0ad639d9875943806c6c9309a3dd02da5a3e8ef92db7bed9"}, + {file = "xattr-1.1.0-cp38-cp38-musllinux_1_1_i686.whl", hash = "sha256:9c5a78c7558989492c4cb7242e490ffb03482437bf782967dfff114e44242343"}, + {file = "xattr-1.1.0-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:cebcf8a303a44fbc439b68321408af7267507c0d8643229dbb107f6c132d389c"}, + {file = "xattr-1.1.0-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:b0d73150f2f9655b4da01c2369eb33a294b7f9d56eccb089819eafdbeb99f896"}, + {file = "xattr-1.1.0-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:793c01deaadac50926c0e1481702133260c7cb5e62116762f6fe1543d07b826f"}, + {file = "xattr-1.1.0-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:e189e440bcd04ccaad0474720abee6ee64890823ec0db361fb0a4fb5e843a1bf"}, + {file = "xattr-1.1.0-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:afacebbc1fa519f41728f8746a92da891c7755e6745164bd0d5739face318e86"}, + {file = "xattr-1.1.0-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:9b1664edf003153ac8d1911e83a0fc60db1b1b374ee8ac943f215f93754a1102"}, + {file = "xattr-1.1.0-cp39-cp39-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:dda2684228798e937a7c29b0e1c7ef3d70e2b85390a69b42a1c61b2039ba81de"}, + {file = "xattr-1.1.0-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:b735ac2625a4fc2c9343b19f806793db6494336338537d2911c8ee4c390dda46"}, + {file = "xattr-1.1.0-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:fa6a7af7a4ada43f15ccc58b6f9adcdbff4c36ba040013d2681e589e07ae280a"}, + {file = "xattr-1.1.0-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:d1059b2f726e2702c8bbf9bbf369acfc042202a4cc576c2dec6791234ad5e948"}, + {file = "xattr-1.1.0-pp310-pypy310_pp73-macosx_10_9_x86_64.whl", hash = "sha256:e2255f36ebf2cb2dbf772a7437ad870836b7396e60517211834cf66ce678b595"}, + {file = "xattr-1.1.0-pp310-pypy310_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:dba4f80b9855cc98513ddf22b7ad8551bc448c70d3147799ea4f6c0b758fb466"}, + {file = "xattr-1.1.0-pp310-pypy310_pp73-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:4cb70c16e7c3ae6ba0ab6c6835c8448c61d8caf43ea63b813af1f4dbe83dd156"}, + {file = "xattr-1.1.0-pp310-pypy310_pp73-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:83652910ef6a368b77b00825ad67815e5c92bfab551a848ca66e9981d14a7519"}, + {file = "xattr-1.1.0-pp38-pypy38_pp73-macosx_10_9_x86_64.whl", hash = "sha256:7a92aff66c43fa3e44cbeab7cbeee66266c91178a0f595e044bf3ce51485743b"}, + {file = "xattr-1.1.0-pp38-pypy38_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:9d4f71b673339aeaae1f6ea9ef8ea6c9643c8cd0df5003b9a0eaa75403e2e06c"}, + {file = "xattr-1.1.0-pp38-pypy38_pp73-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:a20de1c47b5cd7b47da61799a3b34e11e5815d716299351f82a88627a43f9a96"}, + {file = "xattr-1.1.0-pp38-pypy38_pp73-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:23705c7079b05761ff2fa778ad17396e7599c8759401abc05b312dfb3bc99f69"}, + {file = "xattr-1.1.0-pp39-pypy39_pp73-macosx_10_9_x86_64.whl", hash = "sha256:27272afeba8422f2a9d27e1080a9a7b807394e88cce73db9ed8d2dde3afcfb87"}, + {file = "xattr-1.1.0-pp39-pypy39_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:dd43978966de3baf4aea367c99ffa102b289d6c2ea5f3d9ce34a203dc2f2ab73"}, + {file = "xattr-1.1.0-pp39-pypy39_pp73-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:ded771eaf27bb4eb3c64c0d09866460ee8801d81dc21097269cf495b3cac8657"}, + {file = "xattr-1.1.0-pp39-pypy39_pp73-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:96ca300c0acca4f0cddd2332bb860ef58e1465d376364f0e72a1823fdd58e90d"}, + {file = "xattr-1.1.0.tar.gz", hash = "sha256:fecbf3b05043ed3487a28190dec3e4c4d879b2fcec0e30bafd8ec5d4b6043630"}, +] + +[package.dependencies] +cffi = ">=1.16.0" + +[package.extras] +test = ["pytest"] + [[package]] name = "zipp" -version = "3.18.1" +version = "3.18.2" description = "Backport of pathlib-compatible object wrapper for zip files" optional = false python-versions = ">=3.8" files = [ - {file = "zipp-3.18.1-py3-none-any.whl", hash = "sha256:206f5a15f2af3dbaee80769fb7dc6f249695e940acca08dfb2a4769fe61e538b"}, - {file = "zipp-3.18.1.tar.gz", hash = "sha256:2884ed22e7d8961de1c9a05142eb69a247f120291bc0206a00a7642f09b5b715"}, + {file = "zipp-3.18.2-py3-none-any.whl", hash = "sha256:dce197b859eb796242b0622af1b8beb0a722d52aa2f57133ead08edd5bf5374e"}, + {file = "zipp-3.18.2.tar.gz", hash = "sha256:6278d9ddbcfb1f1089a88fde84481528b07b0e10474e09dcfe53dad4069fa059"}, ] [package.extras] docs = ["furo", "jaraco.packaging (>=9.3)", "jaraco.tidelift (>=1.4)", "rst.linker (>=1.9)", "sphinx (>=3.5)", "sphinx-lint"] -testing = ["big-O", "jaraco.functools", "jaraco.itertools", "more-itertools", "pytest (>=6)", "pytest-checkdocs (>=2.4)", "pytest-cov", "pytest-enabler (>=2.2)", "pytest-ignore-flaky", "pytest-mypy", "pytest-ruff (>=0.2.1)"] +testing = ["big-O", "jaraco.functools", "jaraco.itertools", "jaraco.test", "more-itertools", "pytest (>=6,!=8.1.*)", "pytest-checkdocs (>=2.4)", "pytest-cov", "pytest-enabler (>=2.2)", "pytest-ignore-flaky", "pytest-mypy", "pytest-ruff (>=0.2.1)"] [metadata] lock-version = "2.0" python-versions = ">=3.10,<3.12" -content-hash = "b849bcd95fd0fc98290633f85a64cbcd44af5b5239ffd22654e45b8b80294fde" +content-hash = "e91b62543b07761fd9b9c0a2e9c0a7c75521c6729e1676b5de4b0f541d928c21" diff --git a/pyproject.toml b/pyproject.toml index 1730e75e68..2134708b38 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -24,9 +24,16 @@ packages = [{ include = "graphrag" }] [tool.poetry-dynamic-versioning] enable = true +style = "pep440" vcs = "git" -style = "semver" bump = true +format-jinja = """ + {%- if distance == 0 -%} + {{ serialize_pep440(base, stage, revision) }} + {%- else -%} + {{ serialize_pep440(base, stage, revision, dev=distance) }} + {%- endif -%} +""" [tool.poetry.dependencies] python = ">=3.10,<3.12" @@ -76,6 +83,7 @@ devtools = "^0.12.2" #Azure azure-storage-blob = "^12.19.0" azure-identity = "^1.16.0" +poetry = "^1.8.3" [tool.poetry.group.dev.dependencies] coverage = "^7.3.2" @@ -83,7 +91,7 @@ ipykernel = "^6.29.4" jupyter = "^1.0.0" nbconvert = "^7.16.3" poethepoet = "^0.26.0" -pyright = "^1.1.361" +pyright = "^1.1.363" pytest = "^8.2.0" pytest-asyncio = "^0.23.4" pytest-timeout = "^2.3.1" From d328e3821747137b76c4a72bb8019c899f91d359 Mon Sep 17 00:00:00 2001 From: dorbaker Date: Tue, 21 May 2024 17:20:18 +0000 Subject: [PATCH 19/22] Updates for cog services endpoint. --- graphrag/config/create_graphrag_config.py | 4 +- graphrag/index/create_pipeline_config.py | 15 +---- graphrag/index/llm/load_llm.py | 62 +++++++++---------- .../reporting/blob_workflow_callbacks.py | 17 +++-- graphrag/vector_stores/azure_ai_search.py | 2 +- 5 files changed, 42 insertions(+), 58 deletions(-) diff --git a/graphrag/config/create_graphrag_config.py b/graphrag/config/create_graphrag_config.py index 0dc99afea7..f4037436b7 100644 --- a/graphrag/config/create_graphrag_config.py +++ b/graphrag/config/create_graphrag_config.py @@ -89,7 +89,7 @@ def hydrate_llm_params( deployment_name = ( reader.str(Fragment.deployment_name) or base.deployment_name ) - + if api_key is None and not _is_azure(llm_type): raise ApiKeyMissingError if _is_azure(llm_type): @@ -141,7 +141,7 @@ def hydrate_embeddings_params( api_type = reader.str(Fragment.type) or defs.EMBEDDING_TYPE api_type = LLMType(api_type) if api_type else defs.LLM_TYPE cognitive_services_endpoint = ( - reader.str(Fragment.cognitive_services_endpoint) or + reader.str(Fragment.cognitive_services_endpoint) or base.cognitive_services_endpoint ) deployment_name = reader.str(Fragment.deployment_name) diff --git a/graphrag/index/create_pipeline_config.py b/graphrag/index/create_pipeline_config.py index 5ea2ca6285..c06d97f64c 100644 --- a/graphrag/index/create_pipeline_config.py +++ b/graphrag/index/create_pipeline_config.py @@ -259,9 +259,9 @@ def _get_embedding_settings(settings: TextEmbeddingConfig, embedding_name: str) # settings.vector_store. contains the specific settings for this embedding # strategy = settings.resolved_strategy() # get the default strategy - strategy.update( - {"vector_store": vector_store_settings} - ) # update the default strategy with the vector store settings + strategy.update({ + "vector_store": vector_store_settings + }) # update the default strategy with the vector store settings # This ensures the vector store config is part of the strategy and not the global config return { "strategy": strategy, @@ -458,12 +458,9 @@ def _get_reporting_config( container_name = settings.reporting.container_name if container_name is None: msg = "Container name must be provided for blob reporting." -<<<<<<< HEAD -======= raise ValueError(msg) if connection_string is None and storage_account_blob_url is None: msg = "Connection string or storage account blob url must be provided for blob reporting." ->>>>>>> 7aecfc5 (feature/add-azure-managed-identity (#231)) raise ValueError(msg) return PipelineBlobReportingConfig( connection_string=connection_string, @@ -499,12 +496,9 @@ def _get_storage_config( container_name = settings.storage.container_name if container_name is None: msg = "Container name must be provided for blob storage." -<<<<<<< HEAD -======= raise ValueError(msg) if connection_string is None and storage_account_blob_url is None: msg = "Connection string or storage account blob url must be provided for blob storage." ->>>>>>> 7aecfc5 (feature/add-azure-managed-identity (#231)) raise ValueError(msg) return PipelineBlobStorageConfig( connection_string=connection_string, @@ -539,12 +533,9 @@ def _get_cache_config( container_name = settings.cache.container_name if container_name is None: msg = "Container name must be provided for blob cache." -<<<<<<< HEAD -======= raise ValueError(msg) if connection_string is None and storage_account_blob_url is None: msg = "Connection string or storage account blob url must be provided for blob cache." ->>>>>>> 7aecfc5 (feature/add-azure-managed-identity (#231)) raise ValueError(msg) return PipelineBlobCacheConfig( connection_string=connection_string, diff --git a/graphrag/index/llm/load_llm.py b/graphrag/index/llm/load_llm.py index 7a2420367b..62288c77fd 100644 --- a/graphrag/index/llm/load_llm.py +++ b/graphrag/index/llm/load_llm.py @@ -102,18 +102,16 @@ def _load_openai_completion_llm( azure=False, ): return _create_openai_completion_llm( - OpenAIConfiguration( - { - **_get_base_config(config), - "model": config.get("model", "gpt-4-turbo-preview"), - "deployment_name": config.get("deployment_name"), - "temperature": config.get("temperature", 0.0), - "frequency_penalty": config.get("frequency_penalty", 0), - "presence_penalty": config.get("presence_penalty", 0), - "top_p": config.get("top_p", 1), - "max_tokens": config.get("max_tokens"), - } - ), + OpenAIConfiguration({ + **_get_base_config(config), + "model": config.get("model", "gpt-4-turbo-preview"), + "deployment_name": config.get("deployment_name"), + "temperature": config.get("temperature", 0.0), + "frequency_penalty": config.get("frequency_penalty", 0), + "presence_penalty": config.get("presence_penalty", 0), + "top_p": config.get("top_p", 1), + "max_tokens": config.get("max_tokens"), + }), on_error, cache, azure, @@ -127,19 +125,17 @@ def _load_openai_chat_llm( azure=False, ): return _create_openai_chat_llm( - OpenAIConfiguration( - { - # Set default values - **_get_base_config(config), - "model": config.get("model", "gpt-4-turbo-preview"), - "deployment_name": config.get("deployment_name"), - "temperature": config.get("temperature", 0.0), - "frequency_penalty": config.get("frequency_penalty", 0), - "presence_penalty": config.get("presence_penalty", 0), - "top_p": config.get("top_p", 1), - "max_tokens": config.get("max_tokens"), - } - ), + OpenAIConfiguration({ + # Set default values + **_get_base_config(config), + "model": config.get("model", "gpt-4-turbo-preview"), + "deployment_name": config.get("deployment_name"), + "temperature": config.get("temperature", 0.0), + "frequency_penalty": config.get("frequency_penalty", 0), + "presence_penalty": config.get("presence_penalty", 0), + "top_p": config.get("top_p", 1), + "max_tokens": config.get("max_tokens"), + }), on_error, cache, azure, @@ -154,15 +150,13 @@ def _load_openai_embeddings_llm( ): # TODO: Inject Cache return _create_openai_embeddings_llm( - OpenAIConfiguration( - { - **_get_base_config(config), - "model": config.get( - "embeddings_model", config.get("model", "text-embedding-3-small") - ), - "deployment_name": config.get("deployment_name"), - } - ), + OpenAIConfiguration({ + **_get_base_config(config), + "model": config.get( + "embeddings_model", config.get("model", "text-embedding-3-small") + ), + "deployment_name": config.get("deployment_name"), + }), on_error, cache, azure, diff --git a/graphrag/index/reporting/blob_workflow_callbacks.py b/graphrag/index/reporting/blob_workflow_callbacks.py index 5c272ca293..28f0b6d991 100644 --- a/graphrag/index/reporting/blob_workflow_callbacks.py +++ b/graphrag/index/reporting/blob_workflow_callbacks.py @@ -45,6 +45,7 @@ def __init__( if storage_account_blob_url is None: msg = "Either connection_string or storage_account_blob_url must be provided." raise ValueError(msg) + self._blob_service_client = BlobServiceClient( storage_account_blob_url, credential=DefaultAzureCredential(), @@ -90,15 +91,13 @@ def on_error( details: dict | None = None, ): """Report an error.""" - self._write_log( - { - "type": "error", - "data": message, - "cause": str(cause), - "stack": stack, - "details": details, - } - ) + self._write_log({ + "type": "error", + "data": message, + "cause": str(cause), + "stack": stack, + "details": details, + }) def on_warning(self, message: str, details: dict | None = None): """Report a warning.""" diff --git a/graphrag/vector_stores/azure_ai_search.py b/graphrag/vector_stores/azure_ai_search.py index 2197052abf..5cf96ba766 100644 --- a/graphrag/vector_stores/azure_ai_search.py +++ b/graphrag/vector_stores/azure_ai_search.py @@ -62,7 +62,7 @@ def connect(self, **kwargs: Any) -> Any: credential=AzureKeyCredential(api_key) if api_key else DefaultAzureCredential(), - ) + ) else: not_supported_error = "AAISearchDBClient is not supported on local host." raise ValueError(not_supported_error) From c055858db272c48626d46350c7ec78158554428c Mon Sep 17 00:00:00 2001 From: dorbaker Date: Tue, 21 May 2024 17:30:45 +0000 Subject: [PATCH 20/22] Updated documentation. --- docsite/posts/config/json_yaml.md | 1 + 1 file changed, 1 insertion(+) diff --git a/docsite/posts/config/json_yaml.md b/docsite/posts/config/json_yaml.md index 9d2b862f00..5c2dc305c5 100644 --- a/docsite/posts/config/json_yaml.md +++ b/docsite/posts/config/json_yaml.md @@ -57,6 +57,7 @@ This is the base LLM configuration section. Other steps may override this config * `api_version` **str** - The API version * `organization` **str** - The client organization. * `proxy` **str** - The proxy URL to use. +* `cognitive_services_endpoint` **str** - The url endpoint for cognitive services. * `deployment_name` **str** - The deployment name to use (Azure). * `model_supports_json` **bool** - Whether the model supports JSON-mode output. * `tokens_per_minute` **int** - Set a leaky-bucket throttle on tokens-per-minute. From e29a9c3f4486b12f6fea063d241daf58dbf1e657 Mon Sep 17 00:00:00 2001 From: orbaker <107270698+dorbaker@users.noreply.github.com> Date: Wed, 22 May 2024 08:24:44 -0400 Subject: [PATCH 21/22] Update load_llm.py Removed redundant "None." --- graphrag/index/llm/load_llm.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/graphrag/index/llm/load_llm.py b/graphrag/index/llm/load_llm.py index 62288c77fd..31f82aba6f 100644 --- a/graphrag/index/llm/load_llm.py +++ b/graphrag/index/llm/load_llm.py @@ -198,7 +198,7 @@ def _get_base_config(config: dict[str, Any]) -> dict[str, Any]: "model_supports_json": config.get("model_supports_json"), "concurrent_requests": config.get("concurrent_requests", 4), "encoding_model": config.get("encoding_model", "cl100k_base"), - "cognitive_services_endpoint": config.get("cognitive_services_endpoint", None), + "cognitive_services_endpoint": config.get("cognitive_services_endpoint"), } From 24b13ee37d5b03389e7086ba8f6f6d567599f6b0 Mon Sep 17 00:00:00 2001 From: dorbaker Date: Wed, 29 May 2024 15:14:55 -0400 Subject: [PATCH 22/22] Updated with release and formatting chagnes. --- .../next-release/minor-20240529191314161734.json | 4 ++++ graphrag/config/create_graphrag_config.py | 12 +++++++----- 2 files changed, 11 insertions(+), 5 deletions(-) create mode 100644 .semversioner/next-release/minor-20240529191314161734.json diff --git a/.semversioner/next-release/minor-20240529191314161734.json b/.semversioner/next-release/minor-20240529191314161734.json new file mode 100644 index 0000000000..4c96bf4291 --- /dev/null +++ b/.semversioner/next-release/minor-20240529191314161734.json @@ -0,0 +1,4 @@ +{ + "type": "minor", + "description": "Add config parameter for cognitive services endpoint." +} diff --git a/graphrag/config/create_graphrag_config.py b/graphrag/config/create_graphrag_config.py index f4037436b7..f477a5c295 100644 --- a/graphrag/config/create_graphrag_config.py +++ b/graphrag/config/create_graphrag_config.py @@ -83,8 +83,8 @@ def hydrate_llm_params( api_key = reader.str(Fragment.api_key) or base.api_key api_base = reader.str(Fragment.api_base) or base.api_base cognitive_services_endpoint = ( - reader.str(Fragment.cognitive_services_endpoint) or - base.cognitive_services_endpoint + reader.str(Fragment.cognitive_services_endpoint) + or base.cognitive_services_endpoint ) deployment_name = ( reader.str(Fragment.deployment_name) or base.deployment_name @@ -141,8 +141,8 @@ def hydrate_embeddings_params( api_type = reader.str(Fragment.type) or defs.EMBEDDING_TYPE api_type = LLMType(api_type) if api_type else defs.LLM_TYPE cognitive_services_endpoint = ( - reader.str(Fragment.cognitive_services_endpoint) or - base.cognitive_services_endpoint + reader.str(Fragment.cognitive_services_endpoint) + or base.cognitive_services_endpoint ) deployment_name = reader.str(Fragment.deployment_name) @@ -219,7 +219,9 @@ def hydrate_parallelization_params( api_base = reader.str(Fragment.api_base) or fallback_oai_base api_version = reader.str(Fragment.api_version) or fallback_oai_version api_proxy = reader.str(Fragment.api_proxy) or fallback_oai_proxy - cognitive_services_endpoint = reader.str(Fragment.cognitive_services_endpoint) + cognitive_services_endpoint = reader.str( + Fragment.cognitive_services_endpoint + ) deployment_name = reader.str(Fragment.deployment_name) if api_key is None and not _is_azure(llm_type):