convert app to proper python package

This commit is contained in:
Josh Bradley 2025-01-25 04:07:53 -05:00
parent 755448343b
commit 9a73ef2df4
42 changed files with 195 additions and 193 deletions

View File

@ -13,13 +13,13 @@ from fastapi import (
UploadFile, UploadFile,
) )
from src.logger.load_logger import load_pipeline_logger from graphrag_app.logger.load_logger import load_pipeline_logger
from src.typing.models import ( from graphrag_app.typing.models import (
BaseResponse, BaseResponse,
StorageNameList, StorageNameList,
) )
from src.utils.azure_clients import AzureClientManager from graphrag_app.utils.azure_clients import AzureClientManager
from src.utils.common import ( from graphrag_app.utils.common import (
delete_blob_container, delete_blob_container,
delete_cosmos_container_item, delete_cosmos_container_item,
sanitize_name, sanitize_name,

View File

@ -7,9 +7,9 @@ from fastapi import (
) )
from fastapi.responses import StreamingResponse from fastapi.responses import StreamingResponse
from src.logger.load_logger import load_pipeline_logger from graphrag_app.logger.load_logger import load_pipeline_logger
from src.utils.azure_clients import AzureClientManager from graphrag_app.utils.azure_clients import AzureClientManager
from src.utils.common import ( from graphrag_app.utils.common import (
sanitize_name, sanitize_name,
validate_index_file_exist, validate_index_file_exist,
) )

View File

@ -18,20 +18,20 @@ from kubernetes import (
config as kubernetes_config, config as kubernetes_config,
) )
from src.logger.load_logger import load_pipeline_logger from graphrag_app.logger.load_logger import load_pipeline_logger
from src.typing.models import ( from graphrag_app.typing.models import (
BaseResponse, BaseResponse,
IndexNameList, IndexNameList,
IndexStatusResponse, IndexStatusResponse,
) )
from src.typing.pipeline import PipelineJobState from graphrag_app.typing.pipeline import PipelineJobState
from src.utils.azure_clients import AzureClientManager from graphrag_app.utils.azure_clients import AzureClientManager
from src.utils.common import ( from graphrag_app.utils.common import (
delete_blob_container, delete_blob_container,
sanitize_name, sanitize_name,
validate_blob_container_name, validate_blob_container_name,
) )
from src.utils.pipeline import PipelineJob from graphrag_app.utils.pipeline import PipelineJob
index_route = APIRouter( index_route = APIRouter(
prefix="/index", prefix="/index",

View File

@ -13,9 +13,9 @@ from fastapi import (
) )
from graphrag.config.create_graphrag_config import create_graphrag_config from graphrag.config.create_graphrag_config import create_graphrag_config
from src.logger.load_logger import load_pipeline_logger from graphrag_app.logger.load_logger import load_pipeline_logger
from src.utils.azure_clients import AzureClientManager from graphrag_app.utils.azure_clients import AzureClientManager
from src.utils.common import sanitize_name from graphrag_app.utils.common import sanitize_name
prompt_tuning_route = APIRouter(prefix="/index/config", tags=["Index Configuration"]) prompt_tuning_route = APIRouter(prefix="/index/config", tags=["Index Configuration"])

View File

@ -25,19 +25,19 @@ from graphrag.vector_stores.base import (
VectorStoreSearchResult, VectorStoreSearchResult,
) )
from src.logger.load_logger import load_pipeline_logger from graphrag_app.logger.load_logger import load_pipeline_logger
from src.typing.models import ( from graphrag_app.typing.models import (
GraphRequest, GraphRequest,
GraphResponse, GraphResponse,
) )
from src.typing.pipeline import PipelineJobState from graphrag_app.typing.pipeline import PipelineJobState
from src.utils.azure_clients import AzureClientManager from graphrag_app.utils.azure_clients import AzureClientManager
from src.utils.common import ( from graphrag_app.utils.common import (
get_df, get_df,
sanitize_name, sanitize_name,
validate_index_file_exist, validate_index_file_exist,
) )
from src.utils.pipeline import PipelineJob from graphrag_app.utils.pipeline import PipelineJob
query_route = APIRouter( query_route = APIRouter(
prefix="/query", prefix="/query",

View File

@ -21,11 +21,11 @@ from graphrag.api.query import (
) )
from graphrag.config import create_graphrag_config from graphrag.config import create_graphrag_config
from src.api.query import _is_index_complete from graphrag_app.api.query import _is_index_complete
from src.logger.load_logger import load_pipeline_logger from graphrag_app.logger.load_logger import load_pipeline_logger
from src.typing.models import GraphRequest from graphrag_app.typing.models import GraphRequest
from src.utils.azure_clients import AzureClientManager from graphrag_app.utils.azure_clients import AzureClientManager
from src.utils.common import ( from graphrag_app.utils.common import (
get_df, get_df,
sanitize_name, sanitize_name,
validate_index_file_exist, validate_index_file_exist,
@ -45,7 +45,7 @@ query_streaming_route = APIRouter(
description="The global query method generates answers by searching over all AI-generated community reports in a map-reduce fashion. This is a resource-intensive method, but often gives good responses for questions that require an understanding of the dataset as a whole.", description="The global query method generates answers by searching over all AI-generated community reports in a map-reduce fashion. This is a resource-intensive method, but often gives good responses for questions that require an understanding of the dataset as a whole.",
) )
async def global_search_streaming(request: GraphRequest): async def global_search_streaming(request: GraphRequest):
# this is a slightly modified version of src.api.query.global_query() method # this is a slightly modified version of graphrag_app.api.query.global_query() method
if isinstance(request.index_name, str): if isinstance(request.index_name, str):
index_names = [request.index_name] index_names = [request.index_name]
else: else:
@ -202,7 +202,7 @@ async def global_search_streaming(request: GraphRequest):
description="The local query method generates answers by combining relevant data from the AI-extracted knowledge-graph with text chunks of the raw documents. This method is suitable for questions that require an understanding of specific entities mentioned in the documents (e.g. What are the healing properties of chamomile?).", description="The local query method generates answers by combining relevant data from the AI-extracted knowledge-graph with text chunks of the raw documents. This method is suitable for questions that require an understanding of specific entities mentioned in the documents (e.g. What are the healing properties of chamomile?).",
) )
async def local_search_streaming(request: GraphRequest): async def local_search_streaming(request: GraphRequest):
# this is a slightly modified version of src.api.query.local_query() method # this is a slightly modified version of graphrag_app.api.query.local_query() method
if isinstance(request.index_name, str): if isinstance(request.index_name, str):
index_names = [request.index_name] index_names = [request.index_name]
else: else:

View File

@ -5,15 +5,15 @@
import pandas as pd import pandas as pd
from fastapi import APIRouter, HTTPException from fastapi import APIRouter, HTTPException
from src.logger.load_logger import load_pipeline_logger from graphrag_app.logger.load_logger import load_pipeline_logger
from src.typing.models import ( from graphrag_app.typing.models import (
ClaimResponse, ClaimResponse,
EntityResponse, EntityResponse,
RelationshipResponse, RelationshipResponse,
ReportResponse, ReportResponse,
TextUnitResponse, TextUnitResponse,
) )
from src.utils.common import ( from graphrag_app.utils.common import (
pandas_storage_options, pandas_storage_options,
sanitize_name, sanitize_name,
validate_index_file_exist, validate_index_file_exist,

View File

@ -22,6 +22,7 @@ spec:
containers: containers:
- name: index-job-manager - name: index-job-manager
image: PLACEHOLDER image: PLACEHOLDER
workingDir: /backend/graphrag_app/config
imagePullPolicy: Always imagePullPolicy: Always
resources: resources:
requests: requests:

View File

@ -9,6 +9,7 @@ to schedule graphrag indexing jobs on a first-come-first-serve basis (based on e
""" """
import os import os
from pathlib import Path
import pandas as pd import pandas as pd
import yaml import yaml
@ -17,11 +18,11 @@ from kubernetes import (
config, config,
) )
from src.logger.load_logger import load_pipeline_logger from graphrag_app.logger.load_logger import load_pipeline_logger
from src.typing.pipeline import PipelineJobState from graphrag_app.typing.pipeline import PipelineJobState
from src.utils.azure_clients import AzureClientManager from graphrag_app.utils.azure_clients import AzureClientManager
from src.utils.common import sanitize_name from graphrag_app.utils.common import sanitize_name
from src.utils.pipeline import PipelineJob from graphrag_app.utils.pipeline import PipelineJob
def schedule_indexing_job(index_name: str): def schedule_indexing_job(index_name: str):
@ -68,14 +69,15 @@ def _generate_aks_job_manifest(
The manifest must be valid YAML with certain values replaced by the provided arguments. The manifest must be valid YAML with certain values replaced by the provided arguments.
""" """
# NOTE: this file location is relative to the WORKDIR set in Dockerfile-backend # NOTE: this file location is relative to the WORKDIR set in Dockerfile-backend
with open("index-job.yaml", "r") as f: SCRIPT_DIR = Path(__file__).resolve().parent
with (SCRIPT_DIR / "config/index-job.yaml").open("r") as f:
manifest = yaml.safe_load(f) manifest = yaml.safe_load(f)
manifest["metadata"]["name"] = f"indexing-job-{sanitize_name(index_name)}" manifest["metadata"]["name"] = f"indexing-job-{sanitize_name(index_name)}"
manifest["spec"]["template"]["spec"]["serviceAccountName"] = service_account_name manifest["spec"]["template"]["spec"]["serviceAccountName"] = service_account_name
manifest["spec"]["template"]["spec"]["containers"][0]["image"] = docker_image_name manifest["spec"]["template"]["spec"]["containers"][0]["image"] = docker_image_name
manifest["spec"]["template"]["spec"]["containers"][0]["command"] = [ manifest["spec"]["template"]["spec"]["containers"][0]["command"] = [
"python", "python",
"src/indexer/indexer.py", "tools/indexer.py",
f"-i={index_name}", f"-i={index_name}",
] ]
return manifest return manifest

View File

@ -1,13 +1,13 @@
# Copyright (c) Microsoft Corporation. # Copyright (c) Microsoft Corporation.
# Licensed under the MIT License. # Licensed under the MIT License.
from src.logger.application_insights_workflow_callbacks import ( from graphrag_app.logger.application_insights_workflow_callbacks import (
ApplicationInsightsWorkflowCallbacks, ApplicationInsightsWorkflowCallbacks,
) )
from src.logger.console_workflow_callbacks import ConsoleWorkflowCallbacks from graphrag_app.logger.console_workflow_callbacks import ConsoleWorkflowCallbacks
from src.logger.load_logger import load_pipeline_logger from graphrag_app.logger.load_logger import load_pipeline_logger
from src.logger.pipeline_job_updater import PipelineJobUpdater from graphrag_app.logger.pipeline_job_updater import PipelineJobUpdater
from src.logger.typing import ( from graphrag_app.logger.typing import (
Logger, Logger,
PipelineAppInsightsReportingConfig, PipelineAppInsightsReportingConfig,
PipelineReportingConfigTypes, PipelineReportingConfigTypes,

View File

@ -9,13 +9,13 @@ from graphrag.callbacks.file_workflow_callbacks import FileWorkflowCallbacks
from graphrag.callbacks.workflow_callbacks import WorkflowCallbacks from graphrag.callbacks.workflow_callbacks import WorkflowCallbacks
from graphrag.callbacks.workflow_callbacks_manager import WorkflowCallbacksManager from graphrag.callbacks.workflow_callbacks_manager import WorkflowCallbacksManager
from src.logger.application_insights_workflow_callbacks import ( from graphrag_app.logger.application_insights_workflow_callbacks import (
ApplicationInsightsWorkflowCallbacks, ApplicationInsightsWorkflowCallbacks,
) )
from src.logger.blob_workflow_callbacks import BlobWorkflowCallbacks from graphrag_app.logger.blob_workflow_callbacks import BlobWorkflowCallbacks
from src.logger.console_workflow_callbacks import ConsoleWorkflowCallbacks from graphrag_app.logger.console_workflow_callbacks import ConsoleWorkflowCallbacks
from src.logger.typing import Logger from graphrag_app.logger.typing import Logger
from src.utils.azure_clients import AzureClientManager from graphrag_app.utils.azure_clients import AzureClientManager
def load_pipeline_logger( def load_pipeline_logger(

View File

@ -3,8 +3,8 @@
from graphrag.callbacks.noop_workflow_callbacks import NoopWorkflowCallbacks from graphrag.callbacks.noop_workflow_callbacks import NoopWorkflowCallbacks
from src.typing.pipeline import PipelineJobState from graphrag_app.typing.pipeline import PipelineJobState
from src.utils.pipeline import PipelineJob from graphrag_app.utils.pipeline import PipelineJob
class PipelineJobUpdater(NoopWorkflowCallbacks): class PipelineJobUpdater(NoopWorkflowCallbacks):

View File

@ -4,6 +4,7 @@
import os import os
import traceback import traceback
from contextlib import asynccontextmanager from contextlib import asynccontextmanager
from pathlib import Path
import yaml import yaml
from azure.cosmos import PartitionKey, ThroughputProperties from azure.cosmos import PartitionKey, ThroughputProperties
@ -20,15 +21,15 @@ from kubernetes import (
config, config,
) )
from src.api.data import data_route from graphrag_app.api.data import data_route
from src.api.graph import graph_route from graphrag_app.api.graph import graph_route
from src.api.index import index_route from graphrag_app.api.index import index_route
from src.api.prompt_tuning import prompt_tuning_route from graphrag_app.api.prompt_tuning import prompt_tuning_route
from src.api.query import query_route from graphrag_app.api.query import query_route
from src.api.query_streaming import query_streaming_route from graphrag_app.api.query_streaming import query_streaming_route
from src.api.source import source_route from graphrag_app.api.source import source_route
from src.logger.load_logger import load_pipeline_logger from graphrag_app.logger.load_logger import load_pipeline_logger
from src.utils.azure_clients import AzureClientManager from graphrag_app.utils.azure_clients import AzureClientManager
async def catch_all_exceptions_middleware(request: Request, call_next): async def catch_all_exceptions_middleware(request: Request, call_next):
@ -91,7 +92,8 @@ async def lifespan(app: FastAPI):
name=pod_name, namespace=os.environ["AKS_NAMESPACE"] name=pod_name, namespace=os.environ["AKS_NAMESPACE"]
) )
# load the cronjob manifest template and update PLACEHOLDER values with correct values using the pod spec # load the cronjob manifest template and update PLACEHOLDER values with correct values using the pod spec
with open("index-job-manager.yaml", "r") as f: SCRIPT_DIR = Path(__file__).resolve().parent
with (SCRIPT_DIR / "config/index-cronjob-manager.yaml").open("r") as f:
manifest = yaml.safe_load(f) manifest = yaml.safe_load(f)
manifest["spec"]["jobTemplate"]["spec"]["template"]["spec"]["containers"][0][ manifest["spec"]["jobTemplate"]["spec"]["template"]["spec"]["containers"][0][
"image" "image"

View File

@ -10,7 +10,7 @@ from azure.cosmos import exceptions
from azure.identity import DefaultAzureCredential from azure.identity import DefaultAzureCredential
from fastapi import HTTPException from fastapi import HTTPException
from src.utils.azure_clients import AzureClientManager from graphrag_app.utils.azure_clients import AzureClientManager
def get_df( def get_df(

View File

@ -8,9 +8,9 @@ from typing import (
from azure.cosmos.exceptions import CosmosHttpResponseError from azure.cosmos.exceptions import CosmosHttpResponseError
from src.typing.pipeline import PipelineJobState from graphrag_app.typing.pipeline import PipelineJobState
from src.utils.azure_clients import AzureClientManager from graphrag_app.utils.azure_clients import AzureClientManager
from src.utils.common import sanitize_name from graphrag_app.utils.common import sanitize_name
@dataclass @dataclass

184
backend/poetry.lock generated
View File

@ -1276,20 +1276,20 @@ files = [
[[package]] [[package]]
name = "deprecated" name = "deprecated"
version = "1.2.15" version = "1.2.17"
description = "Python @deprecated decorator to deprecate old python classes, functions or methods." description = "Python @deprecated decorator to deprecate old python classes, functions or methods."
optional = false optional = false
python-versions = "!=3.0.*,!=3.1.*,!=3.2.*,!=3.3.*,>=2.7" python-versions = "!=3.0.*,!=3.1.*,!=3.2.*,!=3.3.*,>=2.7"
files = [ files = [
{file = "Deprecated-1.2.15-py2.py3-none-any.whl", hash = "sha256:353bc4a8ac4bfc96800ddab349d89c25dec1079f65fd53acdcc1e0b975b21320"}, {file = "Deprecated-1.2.17-py2.py3-none-any.whl", hash = "sha256:69cdc0a751671183f569495e2efb14baee4344b0236342eec29f1fde25d61818"},
{file = "deprecated-1.2.15.tar.gz", hash = "sha256:683e561a90de76239796e6b6feac66b99030d2dd3fcf61ef996330f14bbb9b0d"}, {file = "deprecated-1.2.17.tar.gz", hash = "sha256:0114a10f0bbb750b90b2c2296c90cf7e9eaeb0abb5cf06c80de2c60138de0a82"},
] ]
[package.dependencies] [package.dependencies]
wrapt = ">=1.10,<2" wrapt = ">=1.10,<2"
[package.extras] [package.extras]
dev = ["PyTest", "PyTest-Cov", "bump2version (<1)", "jinja2 (>=3.0.3,<3.1.0)", "setuptools", "sphinx (<2)", "tox"] dev = ["PyTest", "PyTest-Cov", "bump2version (<1)", "setuptools", "tox"]
[[package]] [[package]]
name = "deprecation" name = "deprecation"
@ -1613,61 +1613,61 @@ openai = ["openai (>=1.35.12)", "tiktoken (>=0.7.0)"]
[[package]] [[package]]
name = "fonttools" name = "fonttools"
version = "4.55.4" version = "4.55.6"
description = "Tools to manipulate font files" description = "Tools to manipulate font files"
optional = false optional = false
python-versions = ">=3.8" python-versions = ">=3.8"
files = [ files = [
{file = "fonttools-4.55.4-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:3b332ea7b7f5f3d99f9bc5a28a23c3824ae72711abf7c4e1d62fa21699fdebe7"}, {file = "fonttools-4.55.6-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:57d55fc965e5dd20c8a60d880e0f43bafb506be87af0b650bdc42591e41e0d0d"},
{file = "fonttools-4.55.4-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:5d8f925909256e62152e7c3e192655dbca3ab8c3cdef7d7b436732727e80feb6"}, {file = "fonttools-4.55.6-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:127999618afe3a2490fad54bab0650c5fbeab1f8109bdc0205f6ad34306deb8b"},
{file = "fonttools-4.55.4-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:1a58af9b98e39bcd773aa352b4512be79b472830b799cb1d3cafb2b4796b71cd"}, {file = "fonttools-4.55.6-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:d3226d40cb92787e09dcc3730f54b3779dfe56bdfea624e263685ba17a6faac4"},
{file = "fonttools-4.55.4-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:736d750d2ab4523067d8058e5294b40b01f2eee521e0fd401bec0d5e21e80b12"}, {file = "fonttools-4.55.6-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:e82772f70b84e17aa36e9f236feb2a4f73cb686ec1e162557a36cf759d1acd58"},
{file = "fonttools-4.55.4-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:1a9a2e7e8a9d3bfa9589db3e6c4e4c127fec252493924b2f87a67a25f9430057"}, {file = "fonttools-4.55.6-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:a632f85bd73e002b771bcbcdc512038fa5d2e09bb18c03a22fb8d400ea492ddf"},
{file = "fonttools-4.55.4-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:87824368e994af34a95cb4279a8c711e51974b3c28d052d39d768531cc9e8e59"}, {file = "fonttools-4.55.6-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:791e0cf862cdd3a252df395f1bb5f65e3a760f1da3c7ce184d0f7998c266614d"},
{file = "fonttools-4.55.4-cp310-cp310-win32.whl", hash = "sha256:6c36dcbfe64bce38c4d4f1d436cdc6445e969eee96eb98d98be603b5abf8c3f2"}, {file = "fonttools-4.55.6-cp310-cp310-win32.whl", hash = "sha256:94f7f2c5c5f3a6422e954ecb6d37cc363e27d6f94050a7ed3f79f12157af6bb2"},
{file = "fonttools-4.55.4-cp310-cp310-win_amd64.whl", hash = "sha256:3c53a467e5cf629acdbefc98b0f554859539fb6447bbeae4117b9ab51464ccc5"}, {file = "fonttools-4.55.6-cp310-cp310-win_amd64.whl", hash = "sha256:2d15e02b93a46982a8513a208e8f89148bca8297640527365625be56151687d0"},
{file = "fonttools-4.55.4-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:1605b28165c785bf26c2cbd205dc0822463e3f9f56f187049eb214dc5f4a59cb"}, {file = "fonttools-4.55.6-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:0879f99eabbf2171dfadd9c8c75cec2b7b3aa9cd1f3955dd799c69d60a5189ef"},
{file = "fonttools-4.55.4-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:d851d8b2fdb676507365d1430c3285d62c4039d0d7760d8cf2f2e5ea3aa19d73"}, {file = "fonttools-4.55.6-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:d77d83ca77a4c3156a2f4cbc7f09f5a8503795da658fa255b987ad433a191266"},
{file = "fonttools-4.55.4-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:3fb3cf1cddf08cec0338f238f950cb76fabab23a324a579e3e1f9b2ef2578329"}, {file = "fonttools-4.55.6-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:07478132407736ee5e54f9f534e73923ae28e9bb6dba17764a35e3caf7d7fea3"},
{file = "fonttools-4.55.4-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:ddd3208b06186ca00fbd329c0d0fed5ba209c99017cc46e2c4ea42233c2fbd00"}, {file = "fonttools-4.55.6-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:e1c06fbc2fd76b9bab03eddfd8aa9fb7c0981d314d780e763c80aa76be1c9982"},
{file = "fonttools-4.55.4-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:9bd98819cb585a894dda9dcb337afeb2601abf17da17de7bfbfc1bc2e4a062c7"}, {file = "fonttools-4.55.6-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:09ed667c4753e1270994e5398cce8703e6423c41702a55b08f843b2907b1be65"},
{file = "fonttools-4.55.4-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:4877376c10541e8dccf14876c8476d5082338fa5d21103894894382cc245144b"}, {file = "fonttools-4.55.6-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:0ee6ed68af8d57764d69da099db163aaf37d62ba246cfd42f27590e3e6724b55"},
{file = "fonttools-4.55.4-cp311-cp311-win32.whl", hash = "sha256:3a5e466894ec6d8a009b0eb8e02a6eb26959a318d5b7a906280c26bdadce6423"}, {file = "fonttools-4.55.6-cp311-cp311-win32.whl", hash = "sha256:9f99e7876518b2d059a9cc67c506168aebf9c71ac8d81006d75e684222f291d2"},
{file = "fonttools-4.55.4-cp311-cp311-win_amd64.whl", hash = "sha256:f595129e6f9c6402965d6295fe8c18c1945d27af0f90bdb52ff426226e647afc"}, {file = "fonttools-4.55.6-cp311-cp311-win_amd64.whl", hash = "sha256:3aa6c684007723895aade9b2fe76d07008c9dc90fd1ef6c310b3ca9c8566729f"},
{file = "fonttools-4.55.4-cp312-cp312-macosx_10_13_universal2.whl", hash = "sha256:b3db72ad2d26a0e9ec694cbfb4485a8da9c095d29f66561cf935dbd19f3efcea"}, {file = "fonttools-4.55.6-cp312-cp312-macosx_10_13_universal2.whl", hash = "sha256:51120695ee13001533e50abd40eec32c01b9c6f44c5567db38a7acd3eedcd19d"},
{file = "fonttools-4.55.4-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:87717808fd5953588c3ffaf512e8cab0e43c09c1da04e42ba87fa4c07d8170c7"}, {file = "fonttools-4.55.6-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:76ac5a595f86892b49ba86ba2e46185adc76328ce6eff0583b30e5c3ab02a914"},
{file = "fonttools-4.55.4-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:f49dac626ad5bc1a0147b88e6157e3211fd440d00007f0da6c9e5f91dd5cb88e"}, {file = "fonttools-4.55.6-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:5b7535a5ac386e549e2b00b34c59b53f805e2423000676723b6867df3c10df04"},
{file = "fonttools-4.55.4-cp312-cp312-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:a2d0ac8656ada8b604ae5da15d9aa075232f2181b95b51a3a2a55195222df7e7"}, {file = "fonttools-4.55.6-cp312-cp312-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:c42009177d3690894288082d5e3dac6bdc9f5d38e25054535e341a19cf5183a4"},
{file = "fonttools-4.55.4-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:013c8b45873fa77a4ff6d25e43fecf1046cb7e8c6b32f1843117f98f3f8eac60"}, {file = "fonttools-4.55.6-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:88f74bc19dbab3dee6a00ca67ca54bb4793e44ff0c4dcf1fa61d68651ae3fa0a"},
{file = "fonttools-4.55.4-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:94caad375d254a0332926512f06791f5e66c24a913ebecd6178b14f61d27c62f"}, {file = "fonttools-4.55.6-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:bc6f58976ffc19fe1630119a2736153b66151d023c6f30065f31c9e8baed1303"},
{file = "fonttools-4.55.4-cp312-cp312-win32.whl", hash = "sha256:cb3eb4bf3a0c4e431e1ccab7a33ef4f1bb32657133fff4a61dc4fcbd54b94d29"}, {file = "fonttools-4.55.6-cp312-cp312-win32.whl", hash = "sha256:4259159715142c10b0f4d121ef14da3fa6eafc719289d9efa4b20c15e57fef82"},
{file = "fonttools-4.55.4-cp312-cp312-win_amd64.whl", hash = "sha256:6914269f6ff6b20c6b5a9b19d0b752880bd8ee218d9a7d6afe9960bbf1922d98"}, {file = "fonttools-4.55.6-cp312-cp312-win_amd64.whl", hash = "sha256:d91fce2e9a87cc0db9f8042281b6458f99854df810cfefab2baf6ab2acc0f4b4"},
{file = "fonttools-4.55.4-cp313-cp313-macosx_10_13_universal2.whl", hash = "sha256:699dd32da7258a89939567a3d71b3f8decf84da54488a2526693f0d981a76479"}, {file = "fonttools-4.55.6-cp313-cp313-macosx_10_13_universal2.whl", hash = "sha256:9394813cc73fa22c5413ec1c5745c0a16f68dd2b890f7c55eaba5cb40187ed55"},
{file = "fonttools-4.55.4-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:0f374b18ac04fbf78f20940418aee7882be3cdcb328ded80e16c3356499f64cf"}, {file = "fonttools-4.55.6-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:ac817559a7d245454231374e194b4e457dca6fefa5b52af466ab0516e9a09c6e"},
{file = "fonttools-4.55.4-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:b18792529ca3c24259090b6faa60bd0bdfcc4a06312e8f06d6fccab007f07193"}, {file = "fonttools-4.55.6-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:34405f1314f1e88b1877a9f9e497fe45190e8c4b29a6c7cd85ed7f666a57d702"},
{file = "fonttools-4.55.4-cp313-cp313-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:8e91d25261ebc9ff2143b95e6272f46b9f28e260b8f40feda07c80b66ff7e61d"}, {file = "fonttools-4.55.6-cp313-cp313-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:af5469bbf555047efd8752d85faeb2a3510916ddc6c50dd6fb168edf1677408f"},
{file = "fonttools-4.55.4-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:2695781a897395d03504fd24b60c944726b5e7b7af9ea3d922f7319d70c6fc37"}, {file = "fonttools-4.55.6-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:8a8004a19195eb8a8a13de69e26ec9ed60a5bc1fde336d0021b47995b368fac9"},
{file = "fonttools-4.55.4-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:21de3ef5b8e5361fd01d6aef2c09dda4ede139d6b3a1f5cf621d6bea48840dfd"}, {file = "fonttools-4.55.6-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:73a4aaf672e7b2265c6354a69cbbadf71b7f3133ecb74e98fec4c67c366698a3"},
{file = "fonttools-4.55.4-cp313-cp313-win32.whl", hash = "sha256:0ef33fda14e39aabb892a18ed16805b0b5b4e8a801fd1815a694be9dc7f30024"}, {file = "fonttools-4.55.6-cp313-cp313-win32.whl", hash = "sha256:73bdff9c44d36c57ea84766afc20517eda0c9bb1571b4a09876646264bd5ff3b"},
{file = "fonttools-4.55.4-cp313-cp313-win_amd64.whl", hash = "sha256:e953b1614e32b6da828ae7659c8f330a593b6c4b7a4a31f8f63c01b12f0d3680"}, {file = "fonttools-4.55.6-cp313-cp313-win_amd64.whl", hash = "sha256:132fa22be8a99784de8cb171b30425a581f04a40ec1c05183777fb2b1fe3bac9"},
{file = "fonttools-4.55.4-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:e2d1bbcaf8ca8c60fbb029982197fbaa487559d5380f1c3098882c5ceb4311c7"}, {file = "fonttools-4.55.6-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:8398928acb8a57073606feb9a310682d4a7e2d7536f2c61719261f4c0974504c"},
{file = "fonttools-4.55.4-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:a885593dbcbfc250ff17831f7dc9316e95c3d046e6cd7ff7ab52ebf673bbf978"}, {file = "fonttools-4.55.6-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:c2f78ebfdef578d4db7c44bc207ac5f9a5c1f22c9db606460dcc8ad48e183338"},
{file = "fonttools-4.55.4-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:02cd4ad9b3ab9f9c5b233b3bb6a96a036c9c0ef17487805b5e73cedf6439d188"}, {file = "fonttools-4.55.6-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:9fb545f3a4ebada908fa717ec732277de18dd10161f03ee3b3144d34477804de"},
{file = "fonttools-4.55.4-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:822d46676f794bb6cac055b43f5636792e2a360e18cf0f3a0333c21d79ec0f2d"}, {file = "fonttools-4.55.6-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:1062daa0390b32bfd062ded2b450db9e9cf10e5a9919561c13f535e818b1952b"},
{file = "fonttools-4.55.4-cp38-cp38-musllinux_1_2_aarch64.whl", hash = "sha256:7b195440fe14d8601053a51e06e13c94f725bf9f964611be99dc3cb65497ce8e"}, {file = "fonttools-4.55.6-cp38-cp38-musllinux_1_2_aarch64.whl", hash = "sha256:860ab9ed3f9e088d3bdb77b9074e656635f173b039e77d550b603cba052a0dca"},
{file = "fonttools-4.55.4-cp38-cp38-musllinux_1_2_x86_64.whl", hash = "sha256:a0e0a0ec8cc4b8f82f9cf4efa26774dbd93433ba51b8f9bd2b214bf36c5638f6"}, {file = "fonttools-4.55.6-cp38-cp38-musllinux_1_2_x86_64.whl", hash = "sha256:03701e7de70c71eb5965cb200986b0c11dfa3cf8e843e4f517ee30a0f43f0a25"},
{file = "fonttools-4.55.4-cp38-cp38-win32.whl", hash = "sha256:ca7e6047fbc995500e0b7459a04d5b92cafd7730b636d5f83334cd7eefdf95c7"}, {file = "fonttools-4.55.6-cp38-cp38-win32.whl", hash = "sha256:f66561fbfb75785d06513b8025a50be37bf970c3c413e87581cc6eff10bc78f1"},
{file = "fonttools-4.55.4-cp38-cp38-win_amd64.whl", hash = "sha256:0185983fcf49ae7a826cedc6f64d68b0434a5b7905d89e75bc95fced7fe118c1"}, {file = "fonttools-4.55.6-cp38-cp38-win_amd64.whl", hash = "sha256:edf159a8f1e48dc4683a715b36da76dd2f82954b16bfe11a215d58e963d31cfc"},
{file = "fonttools-4.55.4-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:dcc08dcb2be554073a72f3a8cecbc4226602ccdd0187b8f37a03a731cb931864"}, {file = "fonttools-4.55.6-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:61aa1997c520bee4cde14ffabe81efc4708c500c8c81dce37831551627a2be56"},
{file = "fonttools-4.55.4-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:7b9b414ce50f09cb692e97ff82b041ea1a21076ed9c1923206560c15ce9ad03a"}, {file = "fonttools-4.55.6-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:7954ea66a8d835f279c17d8474597a001ddd65a2c1ca97e223041bfbbe11f65e"},
{file = "fonttools-4.55.4-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:8807a1357d434ef1f4aed9bdfee7077f52dbc040b18ac98f6e417f69a48afbb5"}, {file = "fonttools-4.55.6-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:3f4e88f15f5ed4d2e4bdfcc98540bb3987ae25904f9be304be9a604e7a7050a1"},
{file = "fonttools-4.55.4-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:93a3ec7cba2e71edbc999ce3d48d34ef87cc30a36af6ff90dfc0dbc131f705fc"}, {file = "fonttools-4.55.6-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:2d419483a6295e83cabddb56f1c7b7bfdc8169de2fcb5c68d622bd11140355f9"},
{file = "fonttools-4.55.4-cp39-cp39-musllinux_1_2_aarch64.whl", hash = "sha256:2964b9fe6b4a892a41a8a517bac232072a821cf2288fad1d19c6c1d19c34b0dd"}, {file = "fonttools-4.55.6-cp39-cp39-musllinux_1_2_aarch64.whl", hash = "sha256:acc74884afddc2656bffc50100945ff407574538c152931c402fccddc46f0abc"},
{file = "fonttools-4.55.4-cp39-cp39-musllinux_1_2_x86_64.whl", hash = "sha256:0b9f4f032295adeb39a8c0eefb08a7b1e90f4b7571506e5d84bb923a7afa8247"}, {file = "fonttools-4.55.6-cp39-cp39-musllinux_1_2_x86_64.whl", hash = "sha256:a55489c7e9d5ea69690a2afad06723c3d0c48c6d276a25391ea97cb31a16b37c"},
{file = "fonttools-4.55.4-cp39-cp39-win32.whl", hash = "sha256:ee4e86280dc637a17e926cbdd32c2de148c013c3468777ae6e94c8b4449c8e93"}, {file = "fonttools-4.55.6-cp39-cp39-win32.whl", hash = "sha256:8c9de8d16d02ecc8b65e3f3d2d1e3002be2c4a3f094d580faf76d7f768bd45fe"},
{file = "fonttools-4.55.4-cp39-cp39-win_amd64.whl", hash = "sha256:82a03920f0f524abab375dcfac8926d9596986503ee00ae435bdd71b1498f214"}, {file = "fonttools-4.55.6-cp39-cp39-win_amd64.whl", hash = "sha256:471961af7a4b8461fac0c8ee044b4986e6fe3746d4c83a1aacbdd85b4eb53f93"},
{file = "fonttools-4.55.4-py3-none-any.whl", hash = "sha256:d07ad8f31038c6394a0945752458313367a0ef8125d284ee59f99e68393a3c2d"}, {file = "fonttools-4.55.6-py3-none-any.whl", hash = "sha256:d20ab5a78d0536c26628eaadba661e7ae2427b1e5c748a0a510a44d914e1b155"},
{file = "fonttools-4.55.4.tar.gz", hash = "sha256:9598af0af85073659facbe9612fcc56b071ef2f26e3819ebf9bd8c5d35f958c5"}, {file = "fonttools-4.55.6.tar.gz", hash = "sha256:1beb4647a0df5ceaea48015656525eb8081af226fe96554089fd3b274d239ef0"},
] ]
[package.extras] [package.extras]
@ -1989,15 +1989,15 @@ umap-learn = ">=0.5.6,<0.6.0"
[[package]] [[package]]
name = "graspologic-native" name = "graspologic-native"
version = "1.2.1" version = "1.2.3"
description = "Python native companion module to the graspologic library" description = "Python native companion module to the graspologic library"
optional = false optional = false
python-versions = ">=3.6, <3.13" python-versions = "<3.14,>=3.8"
files = [ files = [
{file = "graspologic_native-1.2.1-cp36-abi3-macosx_10_12_x86_64.macosx_11_0_arm64.macosx_10_12_universal2.whl", hash = "sha256:eccb2fa475b604375e34b4ae1d5497a428c34ed65f27888495239f8e120acea1"}, {file = "graspologic_native-1.2.3-cp38-abi3-macosx_10_12_x86_64.macosx_11_0_arm64.macosx_10_12_universal2.whl", hash = "sha256:b2fe41f24fa826dc0c134c7e3c8781090c3056a0000e74ac927b34caca8b3c6b"},
{file = "graspologic_native-1.2.1-cp36-abi3-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:a44cfdee11718c01c0f6c544750b3ae64e28cc03432a620fe0295704bd0d618d"}, {file = "graspologic_native-1.2.3-cp38-abi3-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:2b25c75c31f7650905b75a7fe01f89bf8e89667bf6fcb1c733b0260599df2d00"},
{file = "graspologic_native-1.2.1-cp36-abi3-win_amd64.whl", hash = "sha256:56b5e66ba003fd38efc0919ce90fa22d379456e177dca65e26626498d2b9b96b"}, {file = "graspologic_native-1.2.3-cp38-abi3-win_amd64.whl", hash = "sha256:57ded2c8532878ff662888c0397f4909d70fdf0e98d808de707238c67857ab5c"},
{file = "graspologic_native-1.2.1.tar.gz", hash = "sha256:72b7586028a91e9fef9af0ef314d368f0240c18dca99e6e6c546334359a8610a"}, {file = "graspologic_native-1.2.3.tar.gz", hash = "sha256:7c059f7b580248abc3fee8828b9e97ac48ac9a9554fdeafaa35862871ac5113a"},
] ]
[[package]] [[package]]
@ -2814,13 +2814,13 @@ files = [
[[package]] [[package]]
name = "kubernetes" name = "kubernetes"
version = "31.0.0" version = "32.0.0"
description = "Kubernetes python client" description = "Kubernetes python client"
optional = false optional = false
python-versions = ">=3.6" python-versions = ">=3.6"
files = [ files = [
{file = "kubernetes-31.0.0-py2.py3-none-any.whl", hash = "sha256:bf141e2d380c8520eada8b351f4e319ffee9636328c137aa432bc486ca1200e1"}, {file = "kubernetes-32.0.0-py2.py3-none-any.whl", hash = "sha256:60fd8c29e8e43d9c553ca4811895a687426717deba9c0a66fb2dcc3f5ef96692"},
{file = "kubernetes-31.0.0.tar.gz", hash = "sha256:28945de906c8c259c1ebe62703b56a03b714049372196f854105afe4e6d014c0"}, {file = "kubernetes-32.0.0.tar.gz", hash = "sha256:319fa840345a482001ac5d6062222daeb66ec4d1bcb3087402aed685adf0aecb"},
] ]
[package.dependencies] [package.dependencies]
@ -3561,13 +3561,13 @@ signedtoken = ["cryptography (>=3.0.0)", "pyjwt (>=2.0.0,<3)"]
[[package]] [[package]]
name = "openai" name = "openai"
version = "1.60.0" version = "1.60.1"
description = "The official Python library for the openai API" description = "The official Python library for the openai API"
optional = false optional = false
python-versions = ">=3.8" python-versions = ">=3.8"
files = [ files = [
{file = "openai-1.60.0-py3-none-any.whl", hash = "sha256:df06c43be8018274980ac363da07d4b417bd835ead1c66e14396f6f15a0d5dda"}, {file = "openai-1.60.1-py3-none-any.whl", hash = "sha256:714181ec1c452353d456f143c22db892de7b373e3165063d02a2b798ed575ba1"},
{file = "openai-1.60.0.tar.gz", hash = "sha256:7fa536cd4b644718645b874d2706e36dbbef38b327e42ca0623275da347ee1a9"}, {file = "openai-1.60.1.tar.gz", hash = "sha256:beb1541dfc38b002bd629ab68b0d6fe35b870c5f4311d9bc4404d85af3214d5e"},
] ]
[package.dependencies] [package.dependencies]
@ -4536,13 +4536,13 @@ files = [
[[package]] [[package]]
name = "pydantic" name = "pydantic"
version = "2.10.5" version = "2.10.6"
description = "Data validation using Python type hints" description = "Data validation using Python type hints"
optional = false optional = false
python-versions = ">=3.8" python-versions = ">=3.8"
files = [ files = [
{file = "pydantic-2.10.5-py3-none-any.whl", hash = "sha256:4dd4e322dbe55472cb7ca7e73f4b63574eecccf2835ffa2af9021ce113c83c53"}, {file = "pydantic-2.10.6-py3-none-any.whl", hash = "sha256:427d664bf0b8a2b34ff5dd0f5a18df00591adcee7198fbd71981054cef37b584"},
{file = "pydantic-2.10.5.tar.gz", hash = "sha256:278b38dbbaec562011d659ee05f63346951b3a248a6f3642e1bc68894ea2b4ff"}, {file = "pydantic-2.10.6.tar.gz", hash = "sha256:ca5daa827cce33de7a42be142548b0096bf05a7e7b365aebfa5f8eeec7128236"},
] ]
[package.dependencies] [package.dependencies]
@ -5486,29 +5486,29 @@ pyasn1 = ">=0.1.3"
[[package]] [[package]]
name = "ruff" name = "ruff"
version = "0.9.2" version = "0.9.3"
description = "An extremely fast Python linter and code formatter, written in Rust." description = "An extremely fast Python linter and code formatter, written in Rust."
optional = false optional = false
python-versions = ">=3.7" python-versions = ">=3.7"
files = [ files = [
{file = "ruff-0.9.2-py3-none-linux_armv6l.whl", hash = "sha256:80605a039ba1454d002b32139e4970becf84b5fee3a3c3bf1c2af6f61a784347"}, {file = "ruff-0.9.3-py3-none-linux_armv6l.whl", hash = "sha256:7f39b879064c7d9670197d91124a75d118d00b0990586549949aae80cdc16624"},
{file = "ruff-0.9.2-py3-none-macosx_10_12_x86_64.whl", hash = "sha256:b9aab82bb20afd5f596527045c01e6ae25a718ff1784cb92947bff1f83068b00"}, {file = "ruff-0.9.3-py3-none-macosx_10_12_x86_64.whl", hash = "sha256:a187171e7c09efa4b4cc30ee5d0d55a8d6c5311b3e1b74ac5cb96cc89bafc43c"},
{file = "ruff-0.9.2-py3-none-macosx_11_0_arm64.whl", hash = "sha256:fbd337bac1cfa96be615f6efcd4bc4d077edbc127ef30e2b8ba2a27e18c054d4"}, {file = "ruff-0.9.3-py3-none-macosx_11_0_arm64.whl", hash = "sha256:c59ab92f8e92d6725b7ded9d4a31be3ef42688a115c6d3da9457a5bda140e2b4"},
{file = "ruff-0.9.2-py3-none-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:82b35259b0cbf8daa22a498018e300b9bb0174c2bbb7bcba593935158a78054d"}, {file = "ruff-0.9.3-py3-none-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:2dc153c25e715be41bb228bc651c1e9b1a88d5c6e5ed0194fa0dfea02b026439"},
{file = "ruff-0.9.2-py3-none-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:8b6a9701d1e371bf41dca22015c3f89769da7576884d2add7317ec1ec8cb9c3c"}, {file = "ruff-0.9.3-py3-none-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:646909a1e25e0dc28fbc529eab8eb7bb583079628e8cbe738192853dbbe43af5"},
{file = "ruff-0.9.2-py3-none-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:9cc53e68b3c5ae41e8faf83a3b89f4a5d7b2cb666dff4b366bb86ed2a85b481f"}, {file = "ruff-0.9.3-py3-none-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:5a5a46e09355695fbdbb30ed9889d6cf1c61b77b700a9fafc21b41f097bfbba4"},
{file = "ruff-0.9.2-py3-none-manylinux_2_17_ppc64.manylinux2014_ppc64.whl", hash = "sha256:8efd9da7a1ee314b910da155ca7e8953094a7c10d0c0a39bfde3fcfd2a015684"}, {file = "ruff-0.9.3-py3-none-manylinux_2_17_ppc64.manylinux2014_ppc64.whl", hash = "sha256:c4bb09d2bbb394e3730d0918c00276e79b2de70ec2a5231cd4ebb51a57df9ba1"},
{file = "ruff-0.9.2-py3-none-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:3292c5a22ea9a5f9a185e2d131dc7f98f8534a32fb6d2ee7b9944569239c648d"}, {file = "ruff-0.9.3-py3-none-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:96a87ec31dc1044d8c2da2ebbed1c456d9b561e7d087734336518181b26b3aa5"},
{file = "ruff-0.9.2-py3-none-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:1a605fdcf6e8b2d39f9436d343d1f0ff70c365a1e681546de0104bef81ce88df"}, {file = "ruff-0.9.3-py3-none-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:9bb7554aca6f842645022fe2d301c264e6925baa708b392867b7a62645304df4"},
{file = "ruff-0.9.2-py3-none-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:c547f7f256aa366834829a08375c297fa63386cbe5f1459efaf174086b564247"}, {file = "ruff-0.9.3-py3-none-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:cabc332b7075a914ecea912cd1f3d4370489c8018f2c945a30bcc934e3bc06a6"},
{file = "ruff-0.9.2-py3-none-musllinux_1_2_aarch64.whl", hash = "sha256:d18bba3d3353ed916e882521bc3e0af403949dbada344c20c16ea78f47af965e"}, {file = "ruff-0.9.3-py3-none-musllinux_1_2_aarch64.whl", hash = "sha256:33866c3cc2a575cbd546f2cd02bdd466fed65118e4365ee538a3deffd6fcb730"},
{file = "ruff-0.9.2-py3-none-musllinux_1_2_armv7l.whl", hash = "sha256:b338edc4610142355ccf6b87bd356729b62bf1bc152a2fad5b0c7dc04af77bfe"}, {file = "ruff-0.9.3-py3-none-musllinux_1_2_armv7l.whl", hash = "sha256:006e5de2621304c8810bcd2ee101587712fa93b4f955ed0985907a36c427e0c2"},
{file = "ruff-0.9.2-py3-none-musllinux_1_2_i686.whl", hash = "sha256:492a5e44ad9b22a0ea98cf72e40305cbdaf27fac0d927f8bc9e1df316dcc96eb"}, {file = "ruff-0.9.3-py3-none-musllinux_1_2_i686.whl", hash = "sha256:ba6eea4459dbd6b1be4e6bfc766079fb9b8dd2e5a35aff6baee4d9b1514ea519"},
{file = "ruff-0.9.2-py3-none-musllinux_1_2_x86_64.whl", hash = "sha256:af1e9e9fe7b1f767264d26b1075ac4ad831c7db976911fa362d09b2d0356426a"}, {file = "ruff-0.9.3-py3-none-musllinux_1_2_x86_64.whl", hash = "sha256:90230a6b8055ad47d3325e9ee8f8a9ae7e273078a66401ac66df68943ced029b"},
{file = "ruff-0.9.2-py3-none-win32.whl", hash = "sha256:71cbe22e178c5da20e1514e1e01029c73dc09288a8028a5d3446e6bba87a5145"}, {file = "ruff-0.9.3-py3-none-win32.whl", hash = "sha256:eabe5eb2c19a42f4808c03b82bd313fc84d4e395133fb3fc1b1516170a31213c"},
{file = "ruff-0.9.2-py3-none-win_amd64.whl", hash = "sha256:c5e1d6abc798419cf46eed03f54f2e0c3adb1ad4b801119dedf23fcaf69b55b5"}, {file = "ruff-0.9.3-py3-none-win_amd64.whl", hash = "sha256:040ceb7f20791dfa0e78b4230ee9dce23da3b64dd5848e40e3bf3ab76468dcf4"},
{file = "ruff-0.9.2-py3-none-win_arm64.whl", hash = "sha256:a1b63fa24149918f8b37cef2ee6fff81f24f0d74b6f0bdc37bc3e1f2143e41c6"}, {file = "ruff-0.9.3-py3-none-win_arm64.whl", hash = "sha256:800d773f6d4d33b0a3c60e2c6ae8f4c202ea2de056365acfa519aa48acf28e0b"},
{file = "ruff-0.9.2.tar.gz", hash = "sha256:b5eceb334d55fae5f316f783437392642ae18e16dcf4f1858d55d3c2a0f8f5d0"}, {file = "ruff-0.9.3.tar.gz", hash = "sha256:8293f89985a090ebc3ed1064df31f3b4b56320cdfcec8b60d3295bddb955c22a"},
] ]
[[package]] [[package]]
@ -5754,13 +5754,13 @@ tests = ["cython", "littleutils", "pygments", "pytest", "typeguard"]
[[package]] [[package]]
name = "starlette" name = "starlette"
version = "0.45.2" version = "0.45.3"
description = "The little ASGI library that shines." description = "The little ASGI library that shines."
optional = false optional = false
python-versions = ">=3.9" python-versions = ">=3.9"
files = [ files = [
{file = "starlette-0.45.2-py3-none-any.whl", hash = "sha256:4daec3356fb0cb1e723a5235e5beaf375d2259af27532958e2d79df549dad9da"}, {file = "starlette-0.45.3-py3-none-any.whl", hash = "sha256:dfb6d332576f136ec740296c7e8bb8c8a7125044e7c6da30744718880cdd059d"},
{file = "starlette-0.45.2.tar.gz", hash = "sha256:bba1831d15ae5212b22feab2f218bab6ed3cd0fc2dc1d4442443bb1ee52260e0"}, {file = "starlette-0.45.3.tar.gz", hash = "sha256:2cbcba2a75806f8a41c722141486f37c28e30a0921c5f6fe4346cb0dcee1302f"},
] ]
[package.dependencies] [package.dependencies]

View File

@ -9,11 +9,10 @@ authors = [
"Shane Solomon <shane.solomon@microsoft.com>", "Shane Solomon <shane.solomon@microsoft.com>",
"Kenny Zhang <zhangken@microsoft.com>", "Kenny Zhang <zhangken@microsoft.com>",
] ]
description = "" description = "A web API wrapper around the official GraphRAG library."
license = "MIT" license = "MIT"
name = "graphrag-solution-accelerator" name = "graphrag-app"
package-mode = false version = "1.2.0"
version = "1.0.1"
[tool.poetry.dependencies] [tool.poetry.dependencies]
python = "~3.10" python = "~3.10"

View File

@ -10,8 +10,8 @@ from azure.cosmos import CosmosClient, PartitionKey
from azure.storage.blob import BlobServiceClient from azure.storage.blob import BlobServiceClient
from fastapi.testclient import TestClient from fastapi.testclient import TestClient
from src.main import app from graphrag_app.main import app
from src.utils.common import sanitize_name from graphrag_app.utils.common import sanitize_name
@pytest.fixture(scope="session") @pytest.fixture(scope="session")

View File

@ -8,7 +8,7 @@ from fastapi.testclient import TestClient
def test_get_report(container_with_index_files: str, client: TestClient): def test_get_report(container_with_index_files: str, client: TestClient):
"""Test retrieving a report via the src.api.source.get_report_info() function.""" """Test retrieving a report via the graphrag_app.api.source.get_report_info() function."""
# retrieve a report that exists # retrieve a report that exists
response = client.get(f"/source/report/{container_with_index_files}/1") response = client.get(f"/source/report/{container_with_index_files}/1")
assert response.status_code == 200 assert response.status_code == 200

View File

@ -8,8 +8,8 @@ from typing import Generator
import pytest import pytest
from src.typing.pipeline import PipelineJobState from graphrag_app.typing.pipeline import PipelineJobState
from src.utils.pipeline import PipelineJob from graphrag_app.utils.pipeline import PipelineJob
@pytest.fixture() @pytest.fixture()
@ -42,7 +42,7 @@ def cosmos_index_job_entry(cosmos_client) -> Generator[str, None, None]:
def test_pipeline_job_interface(cosmos_index_job_entry): def test_pipeline_job_interface(cosmos_index_job_entry):
"""Test the src.utils.pipeline.PipelineJob class interface.""" """Test the graphrag_app.utils.pipeline.PipelineJob class interface."""
pipeline_job = PipelineJob() pipeline_job = PipelineJob()
# test creating a new entry # test creating a new entry

View File

@ -5,7 +5,7 @@ from azure.cosmos import CosmosClient
from azure.storage.blob import BlobServiceClient from azure.storage.blob import BlobServiceClient
from azure.storage.blob.aio import BlobServiceClient as BlobServiceClientAsync from azure.storage.blob.aio import BlobServiceClient as BlobServiceClientAsync
from src.utils.azure_clients import ( from graphrag_app.utils.azure_clients import (
AzureClientManager, AzureClientManager,
_BlobServiceClientSingleton, _BlobServiceClientSingleton,
_BlobServiceClientSingletonAsync, _BlobServiceClientSingletonAsync,

View File

@ -3,7 +3,7 @@
import pytest import pytest
from src.utils.common import ( from graphrag_app.utils.common import (
retrieve_original_blob_container_name, retrieve_original_blob_container_name,
sanitize_name, sanitize_name,
validate_blob_container_name, validate_blob_container_name,
@ -12,7 +12,7 @@ from src.utils.common import (
def test_validate_blob_container_name(): def test_validate_blob_container_name():
"""Test the src.utils.common.validate_blob_container_name function.""" """Test the graphrag_app.utils.common.validate_blob_container_name function."""
# test valid container name # test valid container name
assert validate_blob_container_name("validcontainername") is None assert validate_blob_container_name("validcontainername") is None
# test invalid container name # test invalid container name
@ -33,7 +33,7 @@ def test_validate_blob_container_name():
def test_retrieve_original_blob_container_name(container_with_graphml_file): def test_retrieve_original_blob_container_name(container_with_graphml_file):
"""Test the src.utils.common.retrieve_original_blob_container_name function.""" """Test the graphrag_app.utils.common.retrieve_original_blob_container_name function."""
# test retrieving a valid container name # test retrieving a valid container name
original_name = container_with_graphml_file original_name = container_with_graphml_file
sanitized_name = sanitize_name(original_name) sanitized_name = sanitize_name(original_name)
@ -43,7 +43,7 @@ def test_retrieve_original_blob_container_name(container_with_graphml_file):
def test_validate_index_file_exist(container_with_graphml_file): def test_validate_index_file_exist(container_with_graphml_file):
"""Test the src.utils.common.validate_index_file_exist function.""" """Test the graphrag_app.utils.common.validate_index_file_exist function."""
original_name = container_with_graphml_file original_name = container_with_graphml_file
sanitized_name = sanitize_name(original_name) sanitized_name = sanitize_name(original_name)
# test with a valid index and valid file # test with a valid index and valid file

View File

@ -2,13 +2,13 @@ from unittest.mock import patch
import pytest import pytest
from src.logger.load_logger import load_pipeline_logger from graphrag_app.logger.load_logger import load_pipeline_logger
@pytest.fixture @pytest.fixture
def mock_app_insights_workflow_callbacks(): def mock_app_insights_workflow_callbacks():
with patch( with patch(
"src.logger.application_insights_workflow_callbacks.ApplicationInsightsWorkflowCallbacks" "graphrag_app.logger.application_insights_workflow_callbacks.ApplicationInsightsWorkflowCallbacks"
) as mock_app_insights_workflow_callbacks: ) as mock_app_insights_workflow_callbacks:
yield mock_app_insights_workflow_callbacks yield mock_app_insights_workflow_callbacks
@ -24,7 +24,7 @@ def mock_file_workflow_callbacks():
@pytest.fixture @pytest.fixture
def mock_blob_workflow_callbacks(): def mock_blob_workflow_callbacks():
with patch( with patch(
"src.logger.blob_workflow_callbacks.BlobWorkflowCallbacks" "graphrag_app.logger.blob_workflow_callbacks.BlobWorkflowCallbacks"
) as mock_blob_workflow_callbacks: ) as mock_blob_workflow_callbacks:
yield mock_blob_workflow_callbacks yield mock_blob_workflow_callbacks
@ -32,7 +32,7 @@ def mock_blob_workflow_callbacks():
@pytest.fixture @pytest.fixture
def mock_console_workflow_callbacks(): def mock_console_workflow_callbacks():
with patch( with patch(
"src.logger.console_workflow_callbacks.ConsoleWorkflowCallbacks" "graphrag_app.logger.console_workflow_callbacks.ConsoleWorkflowCallbacks"
) as mock_console_workflow_callbacks: ) as mock_console_workflow_callbacks:
yield mock_console_workflow_callbacks yield mock_console_workflow_callbacks

View File

@ -6,7 +6,7 @@ from unittest.mock import MagicMock, patch
import pytest import pytest
from src.logger.application_insights_workflow_callbacks import ( from graphrag_app.logger.application_insights_workflow_callbacks import (
ApplicationInsightsWorkflowCallbacks, ApplicationInsightsWorkflowCallbacks,
) )
@ -14,7 +14,7 @@ from src.logger.application_insights_workflow_callbacks import (
@pytest.fixture @pytest.fixture
def mock_logger(): def mock_logger():
with patch( with patch(
"src.logger.application_insights_workflow_callbacks.logging.getLogger" "graphrag_app.logger.application_insights_workflow_callbacks.logging.getLogger"
) as mock_get_logger: ) as mock_get_logger:
mock_logger_instance = MagicMock(spec=logging.Logger) mock_logger_instance = MagicMock(spec=logging.Logger)
mock_get_logger.return_value = mock_logger_instance mock_get_logger.return_value = mock_logger_instance
@ -24,7 +24,7 @@ def mock_logger():
@pytest.fixture @pytest.fixture
def workflow_callbacks(mock_logger): def workflow_callbacks(mock_logger):
with patch( with patch(
"src.logger.application_insights_workflow_callbacks.ApplicationInsightsWorkflowCallbacks.__init__", "graphrag_app.logger.application_insights_workflow_callbacks.ApplicationInsightsWorkflowCallbacks.__init__",
return_value=None, return_value=None,
): ):
instance = ApplicationInsightsWorkflowCallbacks() instance = ApplicationInsightsWorkflowCallbacks()

View File

@ -5,13 +5,13 @@ from unittest.mock import patch
import pytest import pytest
from src.logger.blob_workflow_callbacks import BlobWorkflowCallbacks from graphrag_app.logger.blob_workflow_callbacks import BlobWorkflowCallbacks
@pytest.fixture @pytest.fixture
def mock_blob_service_client(): def mock_blob_service_client():
with patch( with patch(
"src.logger.blob_workflow_callbacks.BlobServiceClient" "graphrag_app.logger.blob_workflow_callbacks.BlobServiceClient"
) as mock_blob_service_client: ) as mock_blob_service_client:
yield mock_blob_service_client yield mock_blob_service_client
@ -19,7 +19,7 @@ def mock_blob_service_client():
@pytest.fixture @pytest.fixture
def workflow_callbacks(mock_blob_service_client): def workflow_callbacks(mock_blob_service_client):
with patch( with patch(
"src.logger.blob_workflow_callbacks.BlobWorkflowCallbacks.__init__", "graphrag_app.logger.blob_workflow_callbacks.BlobWorkflowCallbacks.__init__",
return_value=None, return_value=None,
): ):
instance = BlobWorkflowCallbacks() instance = BlobWorkflowCallbacks()

View File

@ -6,13 +6,13 @@ from unittest.mock import MagicMock, patch
import pytest import pytest
from src.logger.console_workflow_callbacks import ConsoleWorkflowCallbacks from graphrag_app.logger.console_workflow_callbacks import ConsoleWorkflowCallbacks
@pytest.fixture @pytest.fixture
def mock_logger(): def mock_logger():
with patch( with patch(
"src.logger.console_workflow_callbacks.logging.getLogger" "graphrag_app.logger.console_workflow_callbacks.logging.getLogger"
) as mock_get_logger: ) as mock_get_logger:
mock_logger_instance = MagicMock(spec=logging.Logger) mock_logger_instance = MagicMock(spec=logging.Logger)
mock_get_logger.return_value = mock_logger_instance mock_get_logger.return_value = mock_logger_instance
@ -22,7 +22,7 @@ def mock_logger():
@pytest.fixture @pytest.fixture
def workflow_callbacks(mock_logger): def workflow_callbacks(mock_logger):
with patch( with patch(
"src.logger.console_workflow_callbacks.ConsoleWorkflowCallbacks.__init__", "graphrag_app.logger.console_workflow_callbacks.ConsoleWorkflowCallbacks.__init__",
return_value=None, return_value=None,
): ):
instance = ConsoleWorkflowCallbacks() instance = ConsoleWorkflowCallbacks()

View File

@ -14,18 +14,17 @@ from graphrag.config.create_graphrag_config import create_graphrag_config
from graphrag.index.create_pipeline_config import create_pipeline_config from graphrag.index.create_pipeline_config import create_pipeline_config
from graphrag.index.typing import PipelineRunResult from graphrag.index.typing import PipelineRunResult
from ...src.logger import ( from graphrag_app.logger import (
PipelineJobUpdater, PipelineJobUpdater,
load_pipeline_logger, load_pipeline_logger,
) )
from ...src.typing.pipeline import PipelineJobState from graphrag_app.typing.pipeline import PipelineJobState
from ...src.utils.azure_clients import AzureClientManager from graphrag_app.utils.azure_clients import AzureClientManager
from ...src.utils.common import sanitize_name from graphrag_app.utils.common import sanitize_name
from ...src.utils.pipeline import PipelineJob from graphrag_app.utils.pipeline import PipelineJob
def start_indexing_job(index_name: str): def start_indexing_job(index_name: str):
return 0
print("Start indexing job...") print("Start indexing job...")
# get sanitized name # get sanitized name
sanitized_index_name = sanitize_name(index_name) sanitized_index_name = sanitize_name(index_name)

View File

@ -10,7 +10,6 @@ ENV GRAPHRAG_VERSION=v${GRAPHRAG_VERSION}
ENV PIP_ROOT_USER_ACTION=ignore ENV PIP_ROOT_USER_ACTION=ignore
ENV PIP_DISABLE_PIP_VERSION_CHECK=1 ENV PIP_DISABLE_PIP_VERSION_CHECK=1
ENV SETUPTOOLS_USE_DISTUTILS=stdlib ENV SETUPTOOLS_USE_DISTUTILS=stdlib
ENV PYTHONPATH=/backend
ENV TIKTOKEN_CACHE_DIR=/opt/tiktoken_cache/ ENV TIKTOKEN_CACHE_DIR=/opt/tiktoken_cache/
COPY backend /backend COPY backend /backend
@ -26,4 +25,4 @@ RUN python -c "import tiktoken; tiktoken.encoding_for_model('gpt-3.5-turbo'); ti
WORKDIR /backend WORKDIR /backend
EXPOSE 80 EXPOSE 80
CMD ["uvicorn", "src.main:app", "--host", "0.0.0.0", "--port", "80"] CMD ["uvicorn", "graphrag_app.main:app", "--host", "0.0.0.0", "--port", "80"]